From b500d6d7243d2e0807a39a09c52fbe668b59b2c1 Mon Sep 17 00:00:00 2001 From: jianchunfu Date: Tue, 29 Mar 2022 10:49:54 +0800 Subject: [PATCH 001/515] unicode: Handle memory allocation failures in mkutf8data Adding and using a helper function "xmalloc()" to handle memory allocation failures. Signed-off-by: jianchunfu Signed-off-by: Gabriel Krisman Bertazi --- fs/unicode/mkutf8data.c | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/fs/unicode/mkutf8data.c b/fs/unicode/mkutf8data.c index bc1a7c8b5c8dfc..baf1d7eda0a5ca 100644 --- a/fs/unicode/mkutf8data.c +++ b/fs/unicode/mkutf8data.c @@ -486,6 +486,16 @@ static void tree_walk(struct tree *tree) nodes, leaves, singletons); } +static void *xmalloc(size_t size) +{ + void *p = malloc(size); + + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + /* * Allocate an initialize a new internal node. */ @@ -494,7 +504,7 @@ static struct node *alloc_node(struct node *parent) struct node *node; int bitnum; - node = malloc(sizeof(*node)); + node = xmalloc(sizeof(*node)); node->left = node->right = NULL; node->parent = parent; node->leftnode = NODE; @@ -2159,7 +2169,7 @@ static void nfdi_init(void) } mapping[i++] = 0; - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); unicode_data[unichar].utf32nfdi = um; @@ -2215,7 +2225,7 @@ static void nfdicf_init(void) } mapping[i++] = 0; - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); unicode_data[unichar].utf32nfdicf = um; @@ -2256,11 +2266,11 @@ static void ignore_init(void) line_fail(prop_name, line); for (unichar = first; unichar <= last; unichar++) { free(unicode_data[unichar].utf32nfdi); - um = malloc(sizeof(unsigned int)); + um = xmalloc(sizeof(unsigned int)); *um = 0; unicode_data[unichar].utf32nfdi = um; free(unicode_data[unichar].utf32nfdicf); - um = malloc(sizeof(unsigned int)); + um = xmalloc(sizeof(unsigned int)); *um = 0; unicode_data[unichar].utf32nfdicf = um; count++; @@ -2277,11 +2287,11 @@ static void ignore_init(void) if (!utf32valid(unichar)) line_fail(prop_name, line); free(unicode_data[unichar].utf32nfdi); - um = malloc(sizeof(unsigned int)); + um = xmalloc(sizeof(unsigned int)); *um = 0; unicode_data[unichar].utf32nfdi = um; free(unicode_data[unichar].utf32nfdicf); - um = malloc(sizeof(unsigned int)); + um = xmalloc(sizeof(unsigned int)); *um = 0; unicode_data[unichar].utf32nfdicf = um; if (verbose > 1) @@ -2359,7 +2369,7 @@ static void corrections_init(void) } mapping[i++] = 0; - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); corrections[count].utf32nfdi = um; @@ -2459,12 +2469,12 @@ static void hangul_decompose(void) mapping[i++] = 0; assert(!unicode_data[unichar].utf32nfdi); - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); unicode_data[unichar].utf32nfdi = um; assert(!unicode_data[unichar].utf32nfdicf); - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); unicode_data[unichar].utf32nfdicf = um; @@ -2473,7 +2483,7 @@ static void hangul_decompose(void) * decompositions must not be stored in the generated * trie. */ - unicode_data[unichar].utf8nfdi = malloc(2); + unicode_data[unichar].utf8nfdi = xmalloc(2); unicode_data[unichar].utf8nfdi[0] = HANGUL; unicode_data[unichar].utf8nfdi[1] = '\0'; @@ -2523,13 +2533,13 @@ static void nfdi_decompose(void) if (ret) break; free(unicode_data[unichar].utf32nfdi); - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); unicode_data[unichar].utf32nfdi = um; } /* Add this decomposition to nfdicf if there is no entry. */ if (!unicode_data[unichar].utf32nfdicf) { - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); unicode_data[unichar].utf32nfdicf = um; } @@ -2577,7 +2587,7 @@ static void nfdicf_decompose(void) if (ret) break; free(unicode_data[unichar].utf32nfdicf); - um = malloc(i * sizeof(unsigned int)); + um = xmalloc(i * sizeof(unsigned int)); memcpy(um, mapping, i * sizeof(unsigned int)); unicode_data[unichar].utf32nfdicf = um; } From 031a0300f2c94e81598bcc08a9e6de7f10a18d7b Mon Sep 17 00:00:00 2001 From: "Fabio M. De Francesco" Date: Thu, 1 Sep 2022 18:07:04 +0200 Subject: [PATCH 002/515] ecryptfs: Replace kmap() with kmap_local_page() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The use of kmap() is being deprecated in favor of kmap_local_page(). There are two main problems with kmap(): (1) It comes with an overhead as the mapping space is restricted and protected by a global lock for synchronization and (2) it also requires global TLB invalidation when the kmap’s pool wraps and it might block when the mapping space is fully utilized until a slot becomes available. With kmap_local_page() the mappings are per thread, CPU local, can take page faults, and can be called from any context (including interrupts). It is faster than kmap() in kernels with HIGHMEM enabled. Furthermore, the tasks can be preempted and, when they are scheduled to run again, the kernel virtual addresses are restored and still valid. Since its use in fs/ecryptfs is safe everywhere, it should be preferred. Therefore, replace kmap() with kmap_local_page() in fs/ecryptfs. Cc: "Venkataramanan, Anirudh" Suggested-by: Ira Weiny Reviewed-by: Ira Weiny Signed-off-by: Fabio M. De Francesco Signed-off-by: Tyler Hicks Link: https://lore.kernel.org/r/20220901160704.25701-1-fmdefrancesco@gmail.com --- fs/ecryptfs/crypto.c | 8 ++++---- fs/ecryptfs/read_write.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index e3f5d7f3c8a0ad..03263ebcccc6bd 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -465,10 +465,10 @@ int ecryptfs_encrypt_page(struct page *page) } lower_offset = lower_offset_for_page(crypt_stat, page); - enc_extent_virt = kmap(enc_extent_page); + enc_extent_virt = kmap_local_page(enc_extent_page); rc = ecryptfs_write_lower(ecryptfs_inode, enc_extent_virt, lower_offset, PAGE_SIZE); - kunmap(enc_extent_page); + kunmap_local(enc_extent_virt); if (rc < 0) { ecryptfs_printk(KERN_ERR, "Error attempting to write lower page; rc = [%d]\n", @@ -514,10 +514,10 @@ int ecryptfs_decrypt_page(struct page *page) BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)); lower_offset = lower_offset_for_page(crypt_stat, page); - page_virt = kmap(page); + page_virt = kmap_local_page(page); rc = ecryptfs_read_lower(page_virt, lower_offset, PAGE_SIZE, ecryptfs_inode); - kunmap(page); + kunmap_local(page_virt); if (rc < 0) { ecryptfs_printk(KERN_ERR, "Error attempting to read lower page; rc = [%d]\n", diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 60bdcaddcbe57e..5edf027c835906 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c @@ -64,11 +64,11 @@ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, offset = ((((loff_t)page_for_lower->index) << PAGE_SHIFT) + offset_in_page); - virt = kmap(page_for_lower); + virt = kmap_local_page(page_for_lower); rc = ecryptfs_write_lower(ecryptfs_inode, virt, offset, size); if (rc > 0) rc = 0; - kunmap(page_for_lower); + kunmap_local(virt); return rc; } @@ -253,11 +253,11 @@ int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, int rc; offset = ((((loff_t)page_index) << PAGE_SHIFT) + offset_in_page); - virt = kmap(page_for_ecryptfs); + virt = kmap_local_page(page_for_ecryptfs); rc = ecryptfs_read_lower(virt, offset, size, ecryptfs_inode); if (rc > 0) rc = 0; - kunmap(page_for_ecryptfs); + kunmap_local(virt); flush_dcache_page(page_for_ecryptfs); return rc; } From c1cc2db216078f9b1e29c991b1b9177c26757162 Mon Sep 17 00:00:00 2001 From: Slark Xiao Date: Fri, 22 Jul 2022 18:02:12 +0800 Subject: [PATCH 003/515] ecryptfs: keystore: Fix typo 'the the' in comment Replace 'the the' with 'the' in the comment. Signed-off-by: Slark Xiao Signed-off-by: Tyler Hicks Link: https://lore.kernel.org/r/20220722100212.79490-1-slark_xiao@163.com --- fs/ecryptfs/keystore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 3fe41964c0d8d9..2452d6fd7062d7 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c @@ -878,7 +878,7 @@ struct ecryptfs_parse_tag_70_packet_silly_stack { * @filename: This function kmalloc's the memory for the filename * @filename_size: This function sets this to the amount of memory * kmalloc'd for the filename - * @packet_size: This function sets this to the the number of octets + * @packet_size: This function sets this to the number of octets * in the packet parsed * @mount_crypt_stat: The mount-wide cryptographic context * @data: The memory location containing the start of the tag 70 From 54e1011bd95a49d8e68feb3aa4d29cc8a6d9a4a3 Mon Sep 17 00:00:00 2001 From: Alexey Gladkov Date: Wed, 21 Sep 2022 12:41:47 +0200 Subject: [PATCH 004/515] sysctl: Allow change system v ipc sysctls inside ipc namespace Rootless containers are not allowed to modify kernel IPC parameters. All default limits are set to such high values that in fact there are no limits at all. All limits are not inherited and are initialized to default values when a new ipc_namespace is created. For new ipc_namespace: size_t ipc_ns.shm_ctlmax = SHMMAX; // (ULONG_MAX - (1UL << 24)) size_t ipc_ns.shm_ctlall = SHMALL; // (ULONG_MAX - (1UL << 24)) int ipc_ns.shm_ctlmni = IPCMNI; // (1 << 15) int ipc_ns.shm_rmid_forced = 0; unsigned int ipc_ns.msg_ctlmax = MSGMAX; // 8192 unsigned int ipc_ns.msg_ctlmni = MSGMNI; // 32000 unsigned int ipc_ns.msg_ctlmnb = MSGMNB; // 16384 The shm_tot (total amount of shared pages) has also ceased to be global, it is located in ipc_namespace and is not inherited from anywhere. In such conditions, it cannot be said that these limits limit anything. The real limiter for them is cgroups. If we allow rootless containers to change these parameters, then it can only be reduced. Signed-off-by: Alexey Gladkov Link: https://lkml.kernel.org/r/e2d84d3ec0172cfff759e6065da84ce0cc2736f8.1663756794.git.legion@kernel.org Signed-off-by: Eric W. Biederman --- ipc/ipc_sysctl.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/ipc/ipc_sysctl.c b/ipc/ipc_sysctl.c index ef313ecfb53a12..31282e0a630d06 100644 --- a/ipc/ipc_sysctl.c +++ b/ipc/ipc_sysctl.c @@ -190,25 +190,57 @@ static int set_is_seen(struct ctl_table_set *set) return ¤t->nsproxy->ipc_ns->ipc_set == set; } +static void ipc_set_ownership(struct ctl_table_header *head, + struct ctl_table *table, + kuid_t *uid, kgid_t *gid) +{ + struct ipc_namespace *ns = + container_of(head->set, struct ipc_namespace, ipc_set); + + kuid_t ns_root_uid = make_kuid(ns->user_ns, 0); + kgid_t ns_root_gid = make_kgid(ns->user_ns, 0); + + *uid = uid_valid(ns_root_uid) ? ns_root_uid : GLOBAL_ROOT_UID; + *gid = gid_valid(ns_root_gid) ? ns_root_gid : GLOBAL_ROOT_GID; +} + static int ipc_permissions(struct ctl_table_header *head, struct ctl_table *table) { int mode = table->mode; #ifdef CONFIG_CHECKPOINT_RESTORE - struct ipc_namespace *ns = current->nsproxy->ipc_ns; + struct ipc_namespace *ns = + container_of(head->set, struct ipc_namespace, ipc_set); if (((table->data == &ns->ids[IPC_SEM_IDS].next_id) || (table->data == &ns->ids[IPC_MSG_IDS].next_id) || (table->data == &ns->ids[IPC_SHM_IDS].next_id)) && checkpoint_restore_ns_capable(ns->user_ns)) mode = 0666; + else #endif - return mode; + { + kuid_t ns_root_uid; + kgid_t ns_root_gid; + + ipc_set_ownership(head, table, &ns_root_uid, &ns_root_gid); + + if (uid_eq(current_euid(), ns_root_uid)) + mode >>= 6; + + else if (in_egroup_p(ns_root_gid)) + mode >>= 3; + } + + mode &= 7; + + return (mode << 6) | (mode << 3) | mode; } static struct ctl_table_root set_root = { .lookup = set_lookup, .permissions = ipc_permissions, + .set_ownership = ipc_set_ownership, }; bool setup_ipc_sysctls(struct ipc_namespace *ns) From f9b90c2062b28fc408139627e667bfad3cf16490 Mon Sep 17 00:00:00 2001 From: Alexey Gladkov Date: Wed, 21 Sep 2022 12:41:49 +0200 Subject: [PATCH 005/515] docs: Add information about ipc sysctls limitations After 25b21cb2f6d6 ("[PATCH] IPC namespace core") and 4e9823111bdc ("[PATCH] IPC namespace - shm") the shared memory page count stopped being global and started counting per ipc namespace. The documentation and shmget(2) still says that shmall is a global option. shmget(2): SHMALL System-wide limit on the total amount of shared memory, measured in units of the system page size. On Linux, this limit can be read and modified via /proc/sys/kernel/shmall. I think the changes made in 2006 should be documented. Signed-off-by: Alexey Gladkov Acked-by: "Eric W. Biederman" Link: https://lkml.kernel.org/r/ede20ddf7be48b93e8084c3be2e920841ee1a641.1663756794.git.legion@kernel.org Signed-off-by: Eric W. Biederman --- Documentation/admin-guide/sysctl/kernel.rst | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Documentation/admin-guide/sysctl/kernel.rst b/Documentation/admin-guide/sysctl/kernel.rst index ee6572b1edadaf..c8b89bd8f00459 100644 --- a/Documentation/admin-guide/sysctl/kernel.rst +++ b/Documentation/admin-guide/sysctl/kernel.rst @@ -541,6 +541,9 @@ default (``MSGMNB``). ``msgmni`` is the maximum number of IPC queues. 32000 by default (``MSGMNI``). +All of these parameters are set per ipc namespace. The maximum number of bytes +in POSIX message queues is limited by ``RLIMIT_MSGQUEUE``. This limit is +respected hierarchically in the each user namespace. msg_next_id, sem_next_id, and shm_next_id (System V IPC) ======================================================== @@ -1181,15 +1184,20 @@ are doing anyway :) shmall ====== -This parameter sets the total amount of shared memory pages that -can be used system wide. Hence, ``shmall`` should always be at least -``ceil(shmmax/PAGE_SIZE)``. +This parameter sets the total amount of shared memory pages that can be used +inside ipc namespace. The shared memory pages counting occurs for each ipc +namespace separately and is not inherited. Hence, ``shmall`` should always be at +least ``ceil(shmmax/PAGE_SIZE)``. If you are not sure what the default ``PAGE_SIZE`` is on your Linux system, you can run the following command:: # getconf PAGE_SIZE +To reduce or disable the ability to allocate shared memory, you must create a +new ipc namespace, set this parameter to the required value and prohibit the +creation of a new ipc namespace in the current user namespace or cgroups can +be used. shmmax ====== From 7608b6a72ed04607cc832248cbd52fb5e68bd42c Mon Sep 17 00:00:00 2001 From: Alexey Gladkov Date: Wed, 21 Sep 2022 12:41:48 +0200 Subject: [PATCH 006/515] sysctl: Allow to change limits for posix messages queues All parameters of posix messages queues (queues_max/msg_max/msgsize_max) end up being limited by RLIMIT_MSGQUEUE. The code in mqueue_get_inode is where that limiting happens. The RLIMIT_MSGQUEUE is bound to the user namespace and is counted hierarchically. We can allow root in the user namespace to modify the posix messages queues parameters. Signed-off-by: Alexey Gladkov Link: https://lkml.kernel.org/r/7eb21211c8622e91d226e63416b1b93c079f60ee.1663756794.git.legion@kernel.org Signed-off-by: Eric W. Biederman --- ipc/mq_sysctl.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c index fbf6a8b93a2651..ff1054fbbacc44 100644 --- a/ipc/mq_sysctl.c +++ b/ipc/mq_sysctl.c @@ -12,6 +12,7 @@ #include #include #include +#include static int msg_max_limit_min = MIN_MSGMAX; static int msg_max_limit_max = HARD_MSGMAX; @@ -76,8 +77,43 @@ static int set_is_seen(struct ctl_table_set *set) return ¤t->nsproxy->ipc_ns->mq_set == set; } +static void mq_set_ownership(struct ctl_table_header *head, + struct ctl_table *table, + kuid_t *uid, kgid_t *gid) +{ + struct ipc_namespace *ns = + container_of(head->set, struct ipc_namespace, mq_set); + + kuid_t ns_root_uid = make_kuid(ns->user_ns, 0); + kgid_t ns_root_gid = make_kgid(ns->user_ns, 0); + + *uid = uid_valid(ns_root_uid) ? ns_root_uid : GLOBAL_ROOT_UID; + *gid = gid_valid(ns_root_gid) ? ns_root_gid : GLOBAL_ROOT_GID; +} + +static int mq_permissions(struct ctl_table_header *head, struct ctl_table *table) +{ + int mode = table->mode; + kuid_t ns_root_uid; + kgid_t ns_root_gid; + + mq_set_ownership(head, table, &ns_root_uid, &ns_root_gid); + + if (uid_eq(current_euid(), ns_root_uid)) + mode >>= 6; + + if (in_egroup_p(ns_root_gid)) + mode >>= 3; + + mode &= 7; + + return (mode << 6) | (mode << 3) | mode; +} + static struct ctl_table_root set_root = { .lookup = set_lookup, + .permissions = mq_permissions, + .set_ownership = mq_set_ownership, }; bool setup_mq_sysctls(struct ipc_namespace *ns) From 2d2b17d08bfc3d98cf93622e8c6543eaaf02dabe Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 30 Aug 2022 13:58:42 -0700 Subject: [PATCH 007/515] sparc: Unbreak the build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the following build errors: arch/sparc/mm/srmmu.c: In function ‘smp_flush_page_for_dma’: arch/sparc/mm/srmmu.c:1639:13: error: cast between incompatible function types from ‘void (*)(long unsigned int)’ to ‘void (*)(long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int)’ [-Werror=cast-function-type] 1639 | xc1((smpfunc_t) local_ops->page_for_dma, page); | ^ arch/sparc/mm/srmmu.c: In function ‘smp_flush_cache_mm’: arch/sparc/mm/srmmu.c:1662:29: error: cast between incompatible function types from ‘void (*)(struct mm_struct *)’ to ‘void (*)(long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int)’ [-Werror=cast-function-type] 1662 | xc1((smpfunc_t) local_ops->cache_mm, (unsigned long) mm); | [ ... ] Compile-tested only. Fixes: 552a23a0e5d0 ("Makefile: Enable -Wcast-function-type") Signed-off-by: Bart Van Assche Signed-off-by: David S. Miller --- arch/sparc/include/asm/smp_32.h | 15 ++++++--------- arch/sparc/kernel/leon_smp.c | 12 +++++++----- arch/sparc/kernel/sun4d_smp.c | 12 +++++++----- arch/sparc/kernel/sun4m_smp.c | 10 ++++++---- arch/sparc/mm/srmmu.c | 6 +++--- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/arch/sparc/include/asm/smp_32.h b/arch/sparc/include/asm/smp_32.h index 856081761b0fc3..2cf7971d7f6c9e 100644 --- a/arch/sparc/include/asm/smp_32.h +++ b/arch/sparc/include/asm/smp_32.h @@ -33,9 +33,6 @@ extern volatile unsigned long cpu_callin_map[NR_CPUS]; extern cpumask_t smp_commenced_mask; extern struct linux_prom_registers smp_penguin_ctable; -typedef void (*smpfunc_t)(unsigned long, unsigned long, unsigned long, - unsigned long, unsigned long); - void cpu_panic(void); /* @@ -57,7 +54,7 @@ void smp_bogo(struct seq_file *); void smp_info(struct seq_file *); struct sparc32_ipi_ops { - void (*cross_call)(smpfunc_t func, cpumask_t mask, unsigned long arg1, + void (*cross_call)(void *func, cpumask_t mask, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4); void (*resched)(int cpu); @@ -66,28 +63,28 @@ struct sparc32_ipi_ops { }; extern const struct sparc32_ipi_ops *sparc32_ipi_ops; -static inline void xc0(smpfunc_t func) +static inline void xc0(void *func) { sparc32_ipi_ops->cross_call(func, *cpu_online_mask, 0, 0, 0, 0); } -static inline void xc1(smpfunc_t func, unsigned long arg1) +static inline void xc1(void *func, unsigned long arg1) { sparc32_ipi_ops->cross_call(func, *cpu_online_mask, arg1, 0, 0, 0); } -static inline void xc2(smpfunc_t func, unsigned long arg1, unsigned long arg2) +static inline void xc2(void *func, unsigned long arg1, unsigned long arg2) { sparc32_ipi_ops->cross_call(func, *cpu_online_mask, arg1, arg2, 0, 0); } -static inline void xc3(smpfunc_t func, unsigned long arg1, unsigned long arg2, +static inline void xc3(void *func, unsigned long arg1, unsigned long arg2, unsigned long arg3) { sparc32_ipi_ops->cross_call(func, *cpu_online_mask, arg1, arg2, arg3, 0); } -static inline void xc4(smpfunc_t func, unsigned long arg1, unsigned long arg2, +static inline void xc4(void *func, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4) { sparc32_ipi_ops->cross_call(func, *cpu_online_mask, diff --git a/arch/sparc/kernel/leon_smp.c b/arch/sparc/kernel/leon_smp.c index 1eed26d423fb2d..991e9ad3d3e8f9 100644 --- a/arch/sparc/kernel/leon_smp.c +++ b/arch/sparc/kernel/leon_smp.c @@ -359,7 +359,7 @@ void leonsmp_ipi_interrupt(void) } static struct smp_funcall { - smpfunc_t func; + void *func; unsigned long arg1; unsigned long arg2; unsigned long arg3; @@ -372,7 +372,7 @@ static struct smp_funcall { static DEFINE_SPINLOCK(cross_call_lock); /* Cross calls must be serialized, at least currently. */ -static void leon_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, +static void leon_cross_call(void *func, cpumask_t mask, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4) { @@ -384,7 +384,7 @@ static void leon_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, { /* If you make changes here, make sure gcc generates proper code... */ - register smpfunc_t f asm("i0") = func; + register void *f asm("i0") = func; register unsigned long a1 asm("i1") = arg1; register unsigned long a2 asm("i2") = arg2; register unsigned long a3 asm("i3") = arg3; @@ -444,11 +444,13 @@ static void leon_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, /* Running cross calls. */ void leon_cross_call_irq(void) { + void (*func)(unsigned long, unsigned long, unsigned long, unsigned long, + unsigned long) = ccall_info.func; int i = smp_processor_id(); ccall_info.processors_in[i] = 1; - ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, - ccall_info.arg4, ccall_info.arg5); + func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4, + ccall_info.arg5); ccall_info.processors_out[i] = 1; } diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index ff30f03beb7c78..9a62a5cf33370e 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c @@ -268,7 +268,7 @@ static void sun4d_ipi_resched(int cpu) } static struct smp_funcall { - smpfunc_t func; + void *func; unsigned long arg1; unsigned long arg2; unsigned long arg3; @@ -281,7 +281,7 @@ static struct smp_funcall { static DEFINE_SPINLOCK(cross_call_lock); /* Cross calls must be serialized, at least currently. */ -static void sun4d_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, +static void sun4d_cross_call(void *func, cpumask_t mask, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4) { @@ -296,7 +296,7 @@ static void sun4d_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, * If you make changes here, make sure * gcc generates proper code... */ - register smpfunc_t f asm("i0") = func; + register void *f asm("i0") = func; register unsigned long a1 asm("i1") = arg1; register unsigned long a2 asm("i2") = arg2; register unsigned long a3 asm("i3") = arg3; @@ -353,11 +353,13 @@ static void sun4d_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, /* Running cross calls. */ void smp4d_cross_call_irq(void) { + void (*func)(unsigned long, unsigned long, unsigned long, unsigned long, + unsigned long) = ccall_info.func; int i = hard_smp_processor_id(); ccall_info.processors_in[i] = 1; - ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, - ccall_info.arg4, ccall_info.arg5); + func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4, + ccall_info.arg5); ccall_info.processors_out[i] = 1; } diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 228a6527082dc2..056df034e79eeb 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c @@ -157,7 +157,7 @@ static void sun4m_ipi_mask_one(int cpu) } static struct smp_funcall { - smpfunc_t func; + void *func; unsigned long arg1; unsigned long arg2; unsigned long arg3; @@ -170,7 +170,7 @@ static struct smp_funcall { static DEFINE_SPINLOCK(cross_call_lock); /* Cross calls must be serialized, at least currently. */ -static void sun4m_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, +static void sun4m_cross_call(void *func, cpumask_t mask, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4) { @@ -230,11 +230,13 @@ static void sun4m_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, /* Running cross calls. */ void smp4m_cross_call_irq(void) { + void (*func)(unsigned long, unsigned long, unsigned long, unsigned long, + unsigned long) = ccall_info.func; int i = smp_processor_id(); ccall_info.processors_in[i] = 1; - ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, - ccall_info.arg4, ccall_info.arg5); + func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4, + ccall_info.arg5); ccall_info.processors_out[i] = 1; } diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index a9aa6a92c7fee2..d2d8d4e5cec4ae 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -1636,19 +1636,19 @@ static void __init get_srmmu_type(void) /* Local cross-calls. */ static void smp_flush_page_for_dma(unsigned long page) { - xc1((smpfunc_t) local_ops->page_for_dma, page); + xc1(local_ops->page_for_dma, page); local_ops->page_for_dma(page); } static void smp_flush_cache_all(void) { - xc0((smpfunc_t) local_ops->cache_all); + xc0(local_ops->cache_all); local_ops->cache_all(); } static void smp_flush_tlb_all(void) { - xc0((smpfunc_t) local_ops->tlb_all); + xc0(local_ops->tlb_all); local_ops->tlb_all(); } From a799be9bafe3ab638660bd3122469bddbc18fc38 Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Fri, 30 Sep 2022 11:47:15 -0500 Subject: [PATCH 008/515] ipc/ipc_sysctl: Add missing include of linux/cred.h The kernel test robot recently reported[1][2] that in configurations without CONFIG_COMPAT set the recent changes to ipc_permissions would result in code that would not compile, as definitions present in linux/cred.h were missing. Include linux/cred.h explicitly in ipc/ipc_sysctl.c so that it builds in all kernel configurations. [1] https://lkml.kernel.org/r/202209301555.UK7B8MPo-lkp@intel.com [2] https://lkml.kernel.org/r/202209301537.wYdDBROB-lkp@intel.com Reported-by: kernel test robot Fixes: 54e1011bd95a ("sysctl: Allow change system v ipc sysctls inside ipc namespace") Signed-off-by: "Eric W. Biederman" --- ipc/ipc_sysctl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ipc/ipc_sysctl.c b/ipc/ipc_sysctl.c index 31282e0a630d06..29c1d3ae2a5c83 100644 --- a/ipc/ipc_sysctl.c +++ b/ipc/ipc_sysctl.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "util.h" static int proc_ipc_dointvec_minmax_orphans(struct ctl_table *table, int write, From b895e6689ebf57f9d00956d1a9eb2e75d8ab25ad Mon Sep 17 00:00:00 2001 From: Alexey Gladkov Date: Wed, 5 Oct 2022 19:07:30 +0200 Subject: [PATCH 009/515] sysctl: Fix mq permission check The kernel test robot found a typo that causes mq_permissions() to return a useless value. Reported-by: kernel test robot Link: https://lore.kernel.org/r/202210052100.86dbb00a-yujie.liu@intel.com Fixes: 7608b6a72ed0 ("sysctl: Allow to change limits for posix messages queues") Signed-off-by: Alexey Gladkov Link: https://lkml.kernel.org/r/20221005170730.835761-1-legion@kernel.org Signed-off-by: Eric W. Biederman --- ipc/mq_sysctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c index ff1054fbbacc44..ce03930aced55b 100644 --- a/ipc/mq_sysctl.c +++ b/ipc/mq_sysctl.c @@ -102,7 +102,7 @@ static int mq_permissions(struct ctl_table_header *head, struct ctl_table *table if (uid_eq(current_euid(), ns_root_uid)) mode >>= 6; - if (in_egroup_p(ns_root_gid)) + else if (in_egroup_p(ns_root_gid)) mode >>= 3; mode &= 7; From 295227b101925be9a407820b9be9e08c1b87df3d Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 17 Oct 2022 16:40:48 +0200 Subject: [PATCH 010/515] ucount: Fix atomic_long_inc_below argument type The type of u argument of atomic_long_inc_below should be long to avoid unwanted truncation to int. Fixes: f9c82a4ea89c ("Increase size of ucounts to atomic_long_t") Signed-off-by: Uros Bizjak Link: https://lkml.kernel.org/r/20221017144049.3404-2-ubizjak@gmail.com Signed-off-by: Eric W. Biederman --- kernel/ucount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/ucount.c b/kernel/ucount.c index ee8e57fd6f9078..74f5b4959febaf 100644 --- a/kernel/ucount.c +++ b/kernel/ucount.c @@ -212,7 +212,7 @@ void put_ucounts(struct ucounts *ucounts) } } -static inline bool atomic_long_inc_below(atomic_long_t *v, int u) +static inline bool atomic_long_inc_below(atomic_long_t *v, long u) { long c, old; c = atomic_long_read(v); From b4b11b58cd022df173f2df65633c9c583ade8a65 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 17 Oct 2022 16:40:49 +0200 Subject: [PATCH 011/515] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Use atomic_long_try_cmpxchg instead of atomic_long_cmpxchg (*ptr, old, new) == old in atomic_long_inc_below. x86 CMPXCHG instruction returns success in ZF flag, so this change saves a compare after cmpxchg (and related move instruction in front of cmpxchg). Also, atomic_long_try_cmpxchg implicitly assigns old *ptr value to "old" when cmpxchg fails, enabling further code simplifications. No functional change intended. Signed-off-by: Uros Bizjak Reviewed-by: Alexey Gladkov Link: https://lkml.kernel.org/r/20221017144049.3404-3-ubizjak@gmail.com Signed-off-by: Eric W. Biederman --- kernel/ucount.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/kernel/ucount.c b/kernel/ucount.c index 74f5b4959febaf..2c04589a61ff79 100644 --- a/kernel/ucount.c +++ b/kernel/ucount.c @@ -214,16 +214,14 @@ void put_ucounts(struct ucounts *ucounts) static inline bool atomic_long_inc_below(atomic_long_t *v, long u) { - long c, old; - c = atomic_long_read(v); - for (;;) { + long c = atomic_long_read(v); + + do { if (unlikely(c >= u)) return false; - old = atomic_long_cmpxchg(v, c, c+1); - if (likely(old == c)) - return true; - c = old; - } + } while (!atomic_long_try_cmpxchg(v, &c, c+1)); + + return true; } struct ucounts *inc_ucount(struct user_namespace *ns, kuid_t uid, From f3746255764696a1f24af0d302ea7710085b0423 Mon Sep 17 00:00:00 2001 From: David Howells Date: Thu, 23 Feb 2023 15:11:42 +0000 Subject: [PATCH 012/515] afs: Remove whitespace before most ')' from the trace header checkpatch objects to whitespace before ')', so remove most of it from the afs trace header. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/afs.h | 242 ++++++++++++++++++------------------- 1 file changed, 121 insertions(+), 121 deletions(-) diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h index e9d412d19dbbbc..cfcd6452c15664 100644 --- a/include/trace/events/afs.h +++ b/include/trace/events/afs.h @@ -654,12 +654,12 @@ TRACE_EVENT(afs_receive_data, TP_ARGS(call, iter, want_more, ret), TP_STRUCT__entry( - __field(loff_t, remain ) - __field(unsigned int, call ) - __field(enum afs_call_state, state ) - __field(unsigned short, unmarshall ) - __field(bool, want_more ) - __field(int, ret ) + __field(loff_t, remain) + __field(unsigned int, call) + __field(enum afs_call_state, state) + __field(unsigned short, unmarshall) + __field(bool, want_more) + __field(int, ret) ), TP_fast_assign( @@ -686,9 +686,9 @@ TRACE_EVENT(afs_notify_call, TP_ARGS(rxcall, call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum afs_call_state, state ) - __field(unsigned short, unmarshall ) + __field(unsigned int, call) + __field(enum afs_call_state, state) + __field(unsigned short, unmarshall) ), TP_fast_assign( @@ -708,9 +708,9 @@ TRACE_EVENT(afs_cb_call, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(u32, op ) - __field(u16, service_id ) + __field(unsigned int, call) + __field(u32, op) + __field(u16, service_id) ), TP_fast_assign( @@ -733,11 +733,11 @@ TRACE_EVENT(afs_call, TP_ARGS(call_debug_id, op, ref, outstanding, where), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(int, op ) - __field(int, ref ) - __field(int, outstanding ) - __field(const void *, where ) + __field(unsigned int, call) + __field(int, op) + __field(int, ref) + __field(int, outstanding) + __field(const void *, where) ), TP_fast_assign( @@ -762,9 +762,9 @@ TRACE_EVENT(afs_make_fs_call, TP_ARGS(call, fid), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum afs_fs_operation, op ) - __field_struct(struct afs_fid, fid ) + __field(unsigned int, call) + __field(enum afs_fs_operation, op) + __field_struct(struct afs_fid, fid) ), TP_fast_assign( @@ -794,10 +794,10 @@ TRACE_EVENT(afs_make_fs_calli, TP_ARGS(call, fid, i), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(unsigned int, i ) - __field(enum afs_fs_operation, op ) - __field_struct(struct afs_fid, fid ) + __field(unsigned int, call) + __field(unsigned int, i) + __field(enum afs_fs_operation, op) + __field_struct(struct afs_fid, fid) ), TP_fast_assign( @@ -829,10 +829,10 @@ TRACE_EVENT(afs_make_fs_call1, TP_ARGS(call, fid, name), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum afs_fs_operation, op ) - __field_struct(struct afs_fid, fid ) - __array(char, name, 24 ) + __field(unsigned int, call) + __field(enum afs_fs_operation, op) + __field_struct(struct afs_fid, fid) + __array(char, name, 24) ), TP_fast_assign( @@ -866,11 +866,11 @@ TRACE_EVENT(afs_make_fs_call2, TP_ARGS(call, fid, name, name2), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum afs_fs_operation, op ) - __field_struct(struct afs_fid, fid ) - __array(char, name, 24 ) - __array(char, name2, 24 ) + __field(unsigned int, call) + __field(enum afs_fs_operation, op) + __field_struct(struct afs_fid, fid) + __array(char, name, 24) + __array(char, name2, 24) ), TP_fast_assign( @@ -907,8 +907,8 @@ TRACE_EVENT(afs_make_vl_call, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum afs_vl_operation, op ) + __field(unsigned int, call) + __field(enum afs_vl_operation, op) ), TP_fast_assign( @@ -927,10 +927,10 @@ TRACE_EVENT(afs_call_done, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(struct rxrpc_call *, rx_call ) - __field(int, ret ) - __field(u32, abort_code ) + __field(unsigned int, call) + __field(struct rxrpc_call *, rx_call) + __field(int, ret) + __field(u32, abort_code) ), TP_fast_assign( @@ -953,10 +953,10 @@ TRACE_EVENT(afs_send_data, TP_ARGS(call, msg), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(unsigned int, flags ) - __field(loff_t, offset ) - __field(loff_t, count ) + __field(unsigned int, call) + __field(unsigned int, flags) + __field(loff_t, offset) + __field(loff_t, count) ), TP_fast_assign( @@ -977,10 +977,10 @@ TRACE_EVENT(afs_sent_data, TP_ARGS(call, msg, ret), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(int, ret ) - __field(loff_t, offset ) - __field(loff_t, count ) + __field(unsigned int, call) + __field(int, ret) + __field(loff_t, offset) + __field(loff_t, count) ), TP_fast_assign( @@ -1001,9 +1001,9 @@ TRACE_EVENT(afs_dir_check_failed, TP_ARGS(vnode, off, i_size), TP_STRUCT__entry( - __field(struct afs_vnode *, vnode ) - __field(loff_t, off ) - __field(loff_t, i_size ) + __field(struct afs_vnode *, vnode) + __field(loff_t, off) + __field(loff_t, i_size) ), TP_fast_assign( @@ -1022,11 +1022,11 @@ TRACE_EVENT(afs_folio_dirty, TP_ARGS(vnode, where, folio), TP_STRUCT__entry( - __field(struct afs_vnode *, vnode ) - __field(const char *, where ) - __field(pgoff_t, index ) - __field(unsigned long, from ) - __field(unsigned long, to ) + __field(struct afs_vnode *, vnode) + __field(const char *, where) + __field(pgoff_t, index) + __field(unsigned long, from) + __field(unsigned long, to) ), TP_fast_assign( @@ -1056,11 +1056,11 @@ TRACE_EVENT(afs_call_state, TP_ARGS(call, from, to, ret, remote_abort), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum afs_call_state, from ) - __field(enum afs_call_state, to ) - __field(int, ret ) - __field(u32, abort ) + __field(unsigned int, call) + __field(enum afs_call_state, from) + __field(enum afs_call_state, to) + __field(int, ret) + __field(u32, abort) ), TP_fast_assign( @@ -1084,9 +1084,9 @@ TRACE_EVENT(afs_lookup, TP_ARGS(dvnode, name, fid), TP_STRUCT__entry( - __field_struct(struct afs_fid, dfid ) - __field_struct(struct afs_fid, fid ) - __array(char, name, 24 ) + __field_struct(struct afs_fid, dfid) + __field_struct(struct afs_fid, fid) + __array(char, name, 24) ), TP_fast_assign( @@ -1116,15 +1116,15 @@ TRACE_EVENT(afs_edit_dir, TP_ARGS(dvnode, why, op, block, slot, f_vnode, f_unique, name), TP_STRUCT__entry( - __field(unsigned int, vnode ) - __field(unsigned int, unique ) - __field(enum afs_edit_dir_reason, why ) - __field(enum afs_edit_dir_op, op ) - __field(unsigned int, block ) - __field(unsigned short, slot ) - __field(unsigned int, f_vnode ) - __field(unsigned int, f_unique ) - __array(char, name, 24 ) + __field(unsigned int, vnode) + __field(unsigned int, unique) + __field(enum afs_edit_dir_reason, why) + __field(enum afs_edit_dir_op, op) + __field(unsigned int, block) + __field(unsigned short, slot) + __field(unsigned int, f_vnode) + __field(unsigned int, f_unique) + __array(char, name, 24) ), TP_fast_assign( @@ -1157,8 +1157,8 @@ TRACE_EVENT(afs_protocol_error, TP_ARGS(call, cause), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum afs_eproto_cause, cause ) + __field(unsigned int, call) + __field(enum afs_eproto_cause, cause) ), TP_fast_assign( @@ -1177,9 +1177,9 @@ TRACE_EVENT(afs_io_error, TP_ARGS(call, error, where), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(int, error ) - __field(enum afs_io_error, where ) + __field(unsigned int, call) + __field(int, error) + __field(enum afs_io_error, where) ), TP_fast_assign( @@ -1199,9 +1199,9 @@ TRACE_EVENT(afs_file_error, TP_ARGS(vnode, error, where), TP_STRUCT__entry( - __field_struct(struct afs_fid, fid ) - __field(int, error ) - __field(enum afs_file_error, where ) + __field_struct(struct afs_fid, fid) + __field(int, error) + __field(enum afs_file_error, where) ), TP_fast_assign( @@ -1222,9 +1222,9 @@ TRACE_EVENT(afs_cm_no_server, TP_ARGS(call, srx), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(unsigned int, op_id ) - __field_struct(struct sockaddr_rxrpc, srx ) + __field(unsigned int, call) + __field(unsigned int, op_id) + __field_struct(struct sockaddr_rxrpc, srx) ), TP_fast_assign( @@ -1243,9 +1243,9 @@ TRACE_EVENT(afs_cm_no_server_u, TP_ARGS(call, uuid), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(unsigned int, op_id ) - __field_struct(uuid_t, uuid ) + __field(unsigned int, call) + __field(unsigned int, op_id) + __field_struct(uuid_t, uuid) ), TP_fast_assign( @@ -1265,11 +1265,11 @@ TRACE_EVENT(afs_flock_ev, TP_ARGS(vnode, fl, event, error), TP_STRUCT__entry( - __field_struct(struct afs_fid, fid ) - __field(enum afs_flock_event, event ) - __field(enum afs_lock_state, state ) - __field(int, error ) - __field(unsigned int, debug_id ) + __field_struct(struct afs_fid, fid) + __field(enum afs_flock_event, event) + __field(enum afs_lock_state, state) + __field(int, error) + __field(unsigned int, debug_id) ), TP_fast_assign( @@ -1295,13 +1295,13 @@ TRACE_EVENT(afs_flock_op, TP_ARGS(vnode, fl, op), TP_STRUCT__entry( - __field_struct(struct afs_fid, fid ) - __field(loff_t, from ) - __field(loff_t, len ) - __field(enum afs_flock_operation, op ) - __field(unsigned char, type ) - __field(unsigned int, flags ) - __field(unsigned int, debug_id ) + __field_struct(struct afs_fid, fid) + __field(loff_t, from) + __field(loff_t, len) + __field(enum afs_flock_operation, op) + __field(unsigned char, type) + __field(unsigned int, flags) + __field(unsigned int, debug_id) ), TP_fast_assign( @@ -1328,7 +1328,7 @@ TRACE_EVENT(afs_reload_dir, TP_ARGS(vnode), TP_STRUCT__entry( - __field_struct(struct afs_fid, fid ) + __field_struct(struct afs_fid, fid) ), TP_fast_assign( @@ -1345,8 +1345,8 @@ TRACE_EVENT(afs_silly_rename, TP_ARGS(vnode, done), TP_STRUCT__entry( - __field_struct(struct afs_fid, fid ) - __field(bool, done ) + __field_struct(struct afs_fid, fid) + __field(bool, done) ), TP_fast_assign( @@ -1365,9 +1365,9 @@ TRACE_EVENT(afs_get_tree, TP_ARGS(cell, volume), TP_STRUCT__entry( - __field(u64, vid ) - __array(char, cell, 24 ) - __array(char, volume, 24 ) + __field(u64, vid) + __array(char, cell, 24) + __array(char, volume, 24) ), TP_fast_assign( @@ -1392,10 +1392,10 @@ TRACE_EVENT(afs_cb_break, TP_ARGS(fid, cb_break, reason, skipped), TP_STRUCT__entry( - __field_struct(struct afs_fid, fid ) - __field(unsigned int, cb_break ) - __field(enum afs_cb_break_reason, reason ) - __field(bool, skipped ) + __field_struct(struct afs_fid, fid) + __field(unsigned int, cb_break) + __field(enum afs_cb_break_reason, reason) + __field(bool, skipped) ), TP_fast_assign( @@ -1418,8 +1418,8 @@ TRACE_EVENT(afs_cb_miss, TP_ARGS(fid, reason), TP_STRUCT__entry( - __field_struct(struct afs_fid, fid ) - __field(enum afs_cb_break_reason, reason ) + __field_struct(struct afs_fid, fid) + __field(enum afs_cb_break_reason, reason) ), TP_fast_assign( @@ -1439,10 +1439,10 @@ TRACE_EVENT(afs_server, TP_ARGS(server_debug_id, ref, active, reason), TP_STRUCT__entry( - __field(unsigned int, server ) - __field(int, ref ) - __field(int, active ) - __field(int, reason ) + __field(unsigned int, server) + __field(int, ref) + __field(int, active) + __field(int, reason) ), TP_fast_assign( @@ -1465,9 +1465,9 @@ TRACE_EVENT(afs_volume, TP_ARGS(vid, ref, reason), TP_STRUCT__entry( - __field(afs_volid_t, vid ) - __field(int, ref ) - __field(enum afs_volume_trace, reason ) + __field(afs_volid_t, vid) + __field(int, ref) + __field(enum afs_volume_trace, reason) ), TP_fast_assign( @@ -1489,10 +1489,10 @@ TRACE_EVENT(afs_cell, TP_ARGS(cell_debug_id, ref, active, reason), TP_STRUCT__entry( - __field(unsigned int, cell ) - __field(int, ref ) - __field(int, active ) - __field(int, reason ) + __field(unsigned int, cell) + __field(int, ref) + __field(int, active) + __field(int, reason) ), TP_fast_assign( From 0a278bc196e784b4849c1581266421adbca1989f Mon Sep 17 00:00:00 2001 From: David Howells Date: Thu, 23 Feb 2023 15:24:24 +0000 Subject: [PATCH 013/515] afs: Automatically generate trace tag enums Automatically generate trace tag enums from the symbol -> string mapping tables rather than having the enums as well, thereby reducing duplicated data. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/afs.h | 233 +++++-------------------------------- 1 file changed, 27 insertions(+), 206 deletions(-) diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h index cfcd6452c15664..597677acc6b176 100644 --- a/include/trace/events/afs.h +++ b/include/trace/events/afs.h @@ -18,97 +18,6 @@ #ifndef __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY #define __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY -enum afs_call_trace { - afs_call_trace_alloc, - afs_call_trace_free, - afs_call_trace_get, - afs_call_trace_put, - afs_call_trace_wake, - afs_call_trace_work, -}; - -enum afs_server_trace { - afs_server_trace_alloc, - afs_server_trace_callback, - afs_server_trace_destroy, - afs_server_trace_free, - afs_server_trace_gc, - afs_server_trace_get_by_addr, - afs_server_trace_get_by_uuid, - afs_server_trace_get_caps, - afs_server_trace_get_install, - afs_server_trace_get_new_cbi, - afs_server_trace_get_probe, - afs_server_trace_give_up_cb, - afs_server_trace_purging, - afs_server_trace_put_call, - afs_server_trace_put_cbi, - afs_server_trace_put_find_rsq, - afs_server_trace_put_probe, - afs_server_trace_put_slist, - afs_server_trace_put_slist_isort, - afs_server_trace_put_uuid_rsq, - afs_server_trace_update, -}; - - -enum afs_volume_trace { - afs_volume_trace_alloc, - afs_volume_trace_free, - afs_volume_trace_get_alloc_sbi, - afs_volume_trace_get_cell_insert, - afs_volume_trace_get_new_op, - afs_volume_trace_get_query_alias, - afs_volume_trace_put_cell_dup, - afs_volume_trace_put_cell_root, - afs_volume_trace_put_destroy_sbi, - afs_volume_trace_put_free_fc, - afs_volume_trace_put_put_op, - afs_volume_trace_put_query_alias, - afs_volume_trace_put_validate_fc, - afs_volume_trace_remove, -}; - -enum afs_cell_trace { - afs_cell_trace_alloc, - afs_cell_trace_free, - afs_cell_trace_get_queue_dns, - afs_cell_trace_get_queue_manage, - afs_cell_trace_get_queue_new, - afs_cell_trace_get_vol, - afs_cell_trace_insert, - afs_cell_trace_manage, - afs_cell_trace_put_candidate, - afs_cell_trace_put_destroy, - afs_cell_trace_put_queue_fail, - afs_cell_trace_put_queue_work, - afs_cell_trace_put_vol, - afs_cell_trace_see_source, - afs_cell_trace_see_ws, - afs_cell_trace_unuse_alias, - afs_cell_trace_unuse_check_alias, - afs_cell_trace_unuse_delete, - afs_cell_trace_unuse_fc, - afs_cell_trace_unuse_lookup, - afs_cell_trace_unuse_mntpt, - afs_cell_trace_unuse_no_pin, - afs_cell_trace_unuse_parse, - afs_cell_trace_unuse_pin, - afs_cell_trace_unuse_probe, - afs_cell_trace_unuse_sbi, - afs_cell_trace_unuse_ws, - afs_cell_trace_use_alias, - afs_cell_trace_use_check_alias, - afs_cell_trace_use_fc, - afs_cell_trace_use_fc_alias, - afs_cell_trace_use_lookup, - afs_cell_trace_use_mntpt, - afs_cell_trace_use_pin, - afs_cell_trace_use_probe, - afs_cell_trace_use_sbi, - afs_cell_trace_wait, -}; - enum afs_fs_operation { afs_FS_FetchData = 130, /* AFS Fetch file data */ afs_FS_FetchACL = 131, /* AFS Fetch file ACL */ @@ -202,121 +111,6 @@ enum yfs_cm_operation { yfs_CB_CallBack = 64204, }; -enum afs_edit_dir_op { - afs_edit_dir_create, - afs_edit_dir_create_error, - afs_edit_dir_create_inval, - afs_edit_dir_create_nospc, - afs_edit_dir_delete, - afs_edit_dir_delete_error, - afs_edit_dir_delete_inval, - afs_edit_dir_delete_noent, -}; - -enum afs_edit_dir_reason { - afs_edit_dir_for_create, - afs_edit_dir_for_link, - afs_edit_dir_for_mkdir, - afs_edit_dir_for_rename_0, - afs_edit_dir_for_rename_1, - afs_edit_dir_for_rename_2, - afs_edit_dir_for_rmdir, - afs_edit_dir_for_silly_0, - afs_edit_dir_for_silly_1, - afs_edit_dir_for_symlink, - afs_edit_dir_for_unlink, -}; - -enum afs_eproto_cause { - afs_eproto_bad_status, - afs_eproto_cb_count, - afs_eproto_cb_fid_count, - afs_eproto_cellname_len, - afs_eproto_file_type, - afs_eproto_ibulkst_cb_count, - afs_eproto_ibulkst_count, - afs_eproto_motd_len, - afs_eproto_offline_msg_len, - afs_eproto_volname_len, - afs_eproto_yvl_fsendpt4_len, - afs_eproto_yvl_fsendpt6_len, - afs_eproto_yvl_fsendpt_num, - afs_eproto_yvl_fsendpt_type, - afs_eproto_yvl_vlendpt4_len, - afs_eproto_yvl_vlendpt6_len, - afs_eproto_yvl_vlendpt_type, -}; - -enum afs_io_error { - afs_io_error_cm_reply, - afs_io_error_extract, - afs_io_error_fs_probe_fail, - afs_io_error_vl_lookup_fail, - afs_io_error_vl_probe_fail, -}; - -enum afs_file_error { - afs_file_error_dir_bad_magic, - afs_file_error_dir_big, - afs_file_error_dir_missing_page, - afs_file_error_dir_name_too_long, - afs_file_error_dir_over_end, - afs_file_error_dir_small, - afs_file_error_dir_unmarked_ext, - afs_file_error_mntpt, - afs_file_error_writeback_fail, -}; - -enum afs_flock_event { - afs_flock_acquired, - afs_flock_callback_break, - afs_flock_defer_unlock, - afs_flock_extend_fail, - afs_flock_fail_other, - afs_flock_fail_perm, - afs_flock_no_lockers, - afs_flock_release_fail, - afs_flock_silly_delete, - afs_flock_timestamp, - afs_flock_try_to_lock, - afs_flock_vfs_lock, - afs_flock_vfs_locking, - afs_flock_waited, - afs_flock_waiting, - afs_flock_work_extending, - afs_flock_work_retry, - afs_flock_work_unlocking, - afs_flock_would_block, -}; - -enum afs_flock_operation { - afs_flock_op_copy_lock, - afs_flock_op_flock, - afs_flock_op_grant, - afs_flock_op_lock, - afs_flock_op_release_lock, - afs_flock_op_return_ok, - afs_flock_op_return_eagain, - afs_flock_op_return_edeadlk, - afs_flock_op_return_error, - afs_flock_op_set_lock, - afs_flock_op_unlock, - afs_flock_op_wake, -}; - -enum afs_cb_break_reason { - afs_cb_break_no_break, - afs_cb_break_no_promise, - afs_cb_break_for_callback, - afs_cb_break_for_deleted, - afs_cb_break_for_lapsed, - afs_cb_break_for_s_reinit, - afs_cb_break_for_unlink, - afs_cb_break_for_v_break, - afs_cb_break_for_volume_callback, - afs_cb_break_for_zap, -}; - #endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */ /* @@ -391,6 +185,7 @@ enum afs_cb_break_reason { EM(afs_cell_trace_unuse_fc, "UNU fc ") \ EM(afs_cell_trace_unuse_lookup, "UNU lookup") \ EM(afs_cell_trace_unuse_mntpt, "UNU mntpt ") \ + EM(afs_cell_trace_unuse_no_pin, "UNU no-pin") \ EM(afs_cell_trace_unuse_parse, "UNU parse ") \ EM(afs_cell_trace_unuse_pin, "UNU pin ") \ EM(afs_cell_trace_unuse_probe, "UNU probe ") \ @@ -614,6 +409,32 @@ enum afs_cb_break_reason { EM(afs_cb_break_for_volume_callback, "break-v-cb") \ E_(afs_cb_break_for_zap, "break-zap") +/* + * Generate enums for tracing information. + */ +#ifndef __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY +#define __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY + +#undef EM +#undef E_ +#define EM(a, b) a, +#define E_(a, b) a + +enum afs_call_trace { afs_call_traces } __mode(byte); +enum afs_cb_break_reason { afs_cb_break_reasons } __mode(byte); +enum afs_cell_trace { afs_cell_traces } __mode(byte); +enum afs_edit_dir_op { afs_edit_dir_ops } __mode(byte); +enum afs_edit_dir_reason { afs_edit_dir_reasons } __mode(byte); +enum afs_eproto_cause { afs_eproto_causes } __mode(byte); +enum afs_file_error { afs_file_errors } __mode(byte); +enum afs_flock_event { afs_flock_events } __mode(byte); +enum afs_flock_operation { afs_flock_operations } __mode(byte); +enum afs_io_error { afs_io_errors } __mode(byte); +enum afs_server_trace { afs_server_traces } __mode(byte); +enum afs_volume_trace { afs_volume_traces } __mode(byte); + +#endif /* end __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY */ + /* * Export enum symbols via userspace. */ From a3d78fe3e1ae8c6a1901635c54a1a799656f72c8 Mon Sep 17 00:00:00 2001 From: Zipeng Zhang Date: Mon, 20 Mar 2023 10:04:28 +0800 Subject: [PATCH 014/515] fs: ecryptfs: comment typo fix Comment typo fix "vitual" -> "virtual". Signed-off-by: Zipeng Zhang Signed-off-by: Tyler Hicks --- fs/ecryptfs/crypto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 03263ebcccc6bd..c64985bf8c9e34 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -1313,7 +1313,7 @@ static int ecryptfs_read_headers_virt(char *page_virt, /** * ecryptfs_read_xattr_region - * @page_virt: The vitual address into which to read the xattr data + * @page_virt: The virtual address into which to read the xattr data * @ecryptfs_inode: The eCryptfs inode * * Attempts to read the crypto metadata from the extended attribute From df814db8de9decfbfd413c1ea864e23b93942d4e Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Thu, 5 May 2022 01:25:16 +0900 Subject: [PATCH 015/515] soc: apple: rtkit: Get rid of apple_rtkit_send_message_wait It is fundamentally broken and has no users. Just remove it. Acked-by: Eric Curtin Acked-by: Neal Gompa Acked-by: Alyssa Rosenzweig Signed-off-by: Hector Martin --- drivers/soc/apple/rtkit.c | 32 -------------------------------- include/linux/soc/apple/rtkit.h | 18 ------------------ 2 files changed, 50 deletions(-) diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c index d9f19dc99da5e8..7c9b9f25bbc198 100644 --- a/drivers/soc/apple/rtkit.c +++ b/drivers/soc/apple/rtkit.c @@ -641,38 +641,6 @@ int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, } EXPORT_SYMBOL_GPL(apple_rtkit_send_message); -int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message, - unsigned long timeout, bool atomic) -{ - DECLARE_COMPLETION_ONSTACK(completion); - int ret; - long t; - - ret = apple_rtkit_send_message(rtk, ep, message, &completion, atomic); - if (ret < 0) - return ret; - - if (atomic) { - ret = mbox_flush(rtk->mbox_chan, timeout); - if (ret < 0) - return ret; - - if (try_wait_for_completion(&completion)) - return 0; - - return -ETIME; - } else { - t = wait_for_completion_interruptible_timeout( - &completion, msecs_to_jiffies(timeout)); - if (t < 0) - return t; - else if (t == 0) - return -ETIME; - return 0; - } -} -EXPORT_SYMBOL_GPL(apple_rtkit_send_message_wait); - int apple_rtkit_poll(struct apple_rtkit *rtk) { return mbox_client_peek_data(rtk->mbox_chan); diff --git a/include/linux/soc/apple/rtkit.h b/include/linux/soc/apple/rtkit.h index fc456f75c13192..8c9ca857ccf6a3 100644 --- a/include/linux/soc/apple/rtkit.h +++ b/include/linux/soc/apple/rtkit.h @@ -160,24 +160,6 @@ int apple_rtkit_start_ep(struct apple_rtkit *rtk, u8 endpoint); int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, struct completion *completion, bool atomic); -/* - * Send a message to the given endpoint and wait until it has been submitted - * to the hardware FIFO. - * Will return zero on success and a negative error code on failure - * (e.g. -ETIME when the message couldn't be written within the given - * timeout) - * - * @rtk: RTKit reference - * @ep: target endpoint - * @message: message to be sent - * @timeout: timeout in milliseconds to allow the message transmission - * to be completed - * @atomic: if set to true this function can be called from atomic - * context. - */ -int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message, - unsigned long timeout, bool atomic); - /* * Process incoming messages in atomic context. * This only guarantees that messages arrive as far as the recv_message_early From 6fca0adc61cf25bd87d900b5e72491e854843de7 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 14 Mar 2023 19:45:45 +0900 Subject: [PATCH 016/515] soc: apple: mailbox: Add ASC/M3 mailbox driver This new driver is based on the existing apple-mailbox driver, but replaces the usage of the mailbox subsystem with directly exported symbols. As part of this refactor, this adds support for using the hardware FIFOs (not supported in mailbox) and implicitly fixes a bunch of bugs caused by bad interactions with the mailbox subsystem. It also adds runtime-PM support. The new config symbol is APPLE_MBOX, while the module name remains identical ("apple-mailbox"). The configs are mutually exclusive in Kconfig, to avoid conflicts. Acked-by: Eric Curtin Acked-by: Neal Gompa Acked-by: Alyssa Rosenzweig Signed-off-by: Hector Martin --- drivers/soc/apple/Kconfig | 14 ++ drivers/soc/apple/Makefile | 3 + drivers/soc/apple/mailbox.c | 436 ++++++++++++++++++++++++++++++++++++ drivers/soc/apple/mailbox.h | 48 ++++ 4 files changed, 501 insertions(+) create mode 100644 drivers/soc/apple/mailbox.c create mode 100644 drivers/soc/apple/mailbox.h diff --git a/drivers/soc/apple/Kconfig b/drivers/soc/apple/Kconfig index a1596fefacffe1..caa2cf09ff7a7b 100644 --- a/drivers/soc/apple/Kconfig +++ b/drivers/soc/apple/Kconfig @@ -17,6 +17,20 @@ config APPLE_PMGR_PWRSTATE controls for SoC devices. This driver manages them through the generic power domain framework, and also provides reset support. +config APPLE_MBOX + tristate "Apple SoC mailboxes" + depends on PM + depends on ARCH_APPLE || (64BIT && COMPILE_TEST) + depends on !APPLE_MAILBOX + default ARCH_APPLE + help + Apple SoCs have various co-processors required for certain + peripherals to work (NVMe, display controller, etc.). This + driver adds support for the mailbox controller used to + communicate with those. + + Say Y here if you have an Apple SoC. + config APPLE_RTKIT tristate "Apple RTKit co-processor IPC protocol" depends on MAILBOX diff --git a/drivers/soc/apple/Makefile b/drivers/soc/apple/Makefile index e293770cf66d73..e52edf6a73dafd 100644 --- a/drivers/soc/apple/Makefile +++ b/drivers/soc/apple/Makefile @@ -1,6 +1,9 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_APPLE_PMGR_PWRSTATE) += apple-pmgr-pwrstate.o +obj-$(CONFIG_APPLE_MBOX) += apple-mailbox.o +apple-mailbox-y = mailbox.o + obj-$(CONFIG_APPLE_RTKIT) += apple-rtkit.o apple-rtkit-y = rtkit.o rtkit-crashlog.o diff --git a/drivers/soc/apple/mailbox.c b/drivers/soc/apple/mailbox.c new file mode 100644 index 00000000000000..0cbd172f435ed9 --- /dev/null +++ b/drivers/soc/apple/mailbox.c @@ -0,0 +1,436 @@ +// SPDX-License-Identifier: GPL-2.0-only OR MIT +/* + * Apple mailbox driver + * + * Copyright The Asahi Linux Contributors + * + * This driver adds support for two mailbox variants (called ASC and M3 by + * Apple) found in Apple SoCs such as the M1. It consists of two FIFOs used to + * exchange 64+32 bit messages between the main CPU and a co-processor. + * Various coprocessors implement different IPC protocols based on these simple + * messages and shared memory buffers. + * + * Both the main CPU and the co-processor see the same set of registers but + * the first FIFO (A2I) is always used to transfer messages from the application + * processor (us) to the I/O processor and the second one (I2A) for the + * other direction. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mailbox.h" + +#define APPLE_ASC_MBOX_CONTROL_FULL BIT(16) +#define APPLE_ASC_MBOX_CONTROL_EMPTY BIT(17) + +#define APPLE_ASC_MBOX_A2I_CONTROL 0x110 +#define APPLE_ASC_MBOX_A2I_SEND0 0x800 +#define APPLE_ASC_MBOX_A2I_SEND1 0x808 +#define APPLE_ASC_MBOX_A2I_RECV0 0x810 +#define APPLE_ASC_MBOX_A2I_RECV1 0x818 + +#define APPLE_ASC_MBOX_I2A_CONTROL 0x114 +#define APPLE_ASC_MBOX_I2A_SEND0 0x820 +#define APPLE_ASC_MBOX_I2A_SEND1 0x828 +#define APPLE_ASC_MBOX_I2A_RECV0 0x830 +#define APPLE_ASC_MBOX_I2A_RECV1 0x838 + +#define APPLE_M3_MBOX_CONTROL_FULL BIT(16) +#define APPLE_M3_MBOX_CONTROL_EMPTY BIT(17) + +#define APPLE_M3_MBOX_A2I_CONTROL 0x50 +#define APPLE_M3_MBOX_A2I_SEND0 0x60 +#define APPLE_M3_MBOX_A2I_SEND1 0x68 +#define APPLE_M3_MBOX_A2I_RECV0 0x70 +#define APPLE_M3_MBOX_A2I_RECV1 0x78 + +#define APPLE_M3_MBOX_I2A_CONTROL 0x80 +#define APPLE_M3_MBOX_I2A_SEND0 0x90 +#define APPLE_M3_MBOX_I2A_SEND1 0x98 +#define APPLE_M3_MBOX_I2A_RECV0 0xa0 +#define APPLE_M3_MBOX_I2A_RECV1 0xa8 + +#define APPLE_M3_MBOX_IRQ_ENABLE 0x48 +#define APPLE_M3_MBOX_IRQ_ACK 0x4c +#define APPLE_M3_MBOX_IRQ_A2I_EMPTY BIT(0) +#define APPLE_M3_MBOX_IRQ_A2I_NOT_EMPTY BIT(1) +#define APPLE_M3_MBOX_IRQ_I2A_EMPTY BIT(2) +#define APPLE_M3_MBOX_IRQ_I2A_NOT_EMPTY BIT(3) + +#define APPLE_MBOX_MSG1_OUTCNT GENMASK(56, 52) +#define APPLE_MBOX_MSG1_INCNT GENMASK(51, 48) +#define APPLE_MBOX_MSG1_OUTPTR GENMASK(47, 44) +#define APPLE_MBOX_MSG1_INPTR GENMASK(43, 40) +#define APPLE_MBOX_MSG1_MSG GENMASK(31, 0) + +#define APPLE_MBOX_TX_TIMEOUT 500 + +struct apple_mbox_hw { + unsigned int control_full; + unsigned int control_empty; + + unsigned int a2i_control; + unsigned int a2i_send0; + unsigned int a2i_send1; + + unsigned int i2a_control; + unsigned int i2a_recv0; + unsigned int i2a_recv1; + + bool has_irq_controls; + unsigned int irq_enable; + unsigned int irq_ack; + unsigned int irq_bit_recv_not_empty; + unsigned int irq_bit_send_empty; +}; + +int apple_mbox_send(struct apple_mbox *mbox, const struct apple_mbox_msg msg, + bool atomic) +{ + unsigned long flags; + int ret; + u32 mbox_ctrl; + long t; + + spin_lock_irqsave(&mbox->tx_lock, flags); + mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->a2i_control); + + while (mbox_ctrl & mbox->hw->control_full) { + if (atomic) { + ret = readl_poll_timeout_atomic( + mbox->regs + mbox->hw->a2i_control, mbox_ctrl, + !(mbox_ctrl & mbox->hw->control_full), 100, + APPLE_MBOX_TX_TIMEOUT * 1000); + + if (ret) { + spin_unlock_irqrestore(&mbox->tx_lock, flags); + return ret; + } + + break; + } + /* + * The interrupt is level triggered and will keep firing as long as the + * FIFO is empty. It will also keep firing if the FIFO was empty + * at any point in the past until it has been acknowledged at the + * mailbox level. By acknowledging it here we can ensure that we will + * only get the interrupt once the FIFO has been cleared again. + * If the FIFO is already empty before the ack it will fire again + * immediately after the ack. + */ + if (mbox->hw->has_irq_controls) { + writel_relaxed(mbox->hw->irq_bit_send_empty, + mbox->regs + mbox->hw->irq_ack); + } + enable_irq(mbox->irq_send_empty); + reinit_completion(&mbox->tx_empty); + spin_unlock_irqrestore(&mbox->tx_lock, flags); + + t = wait_for_completion_interruptible_timeout( + &mbox->tx_empty, + msecs_to_jiffies(APPLE_MBOX_TX_TIMEOUT)); + if (t < 0) + return t; + else if (t == 0) + return -ETIMEDOUT; + + spin_lock_irqsave(&mbox->tx_lock, flags); + mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->a2i_control); + } + + writeq_relaxed(msg.msg0, mbox->regs + mbox->hw->a2i_send0); + writeq_relaxed(FIELD_PREP(APPLE_MBOX_MSG1_MSG, msg.msg1), + mbox->regs + mbox->hw->a2i_send1); + + spin_unlock_irqrestore(&mbox->tx_lock, flags); + + return 0; +} +EXPORT_SYMBOL(apple_mbox_send); + +static irqreturn_t apple_mbox_send_empty_irq(int irq, void *data) +{ + struct apple_mbox *mbox = data; + + /* + * We don't need to acknowledge the interrupt at the mailbox level + * here even if supported by the hardware. It will keep firing but that + * doesn't matter since it's disabled at the main interrupt controller. + * apple_mbox_send will acknowledge it before enabling + * it at the main controller again. + */ + spin_lock(&mbox->tx_lock); + disable_irq_nosync(mbox->irq_send_empty); + complete(&mbox->tx_empty); + spin_unlock(&mbox->tx_lock); + + return IRQ_HANDLED; +} + +static int apple_mbox_poll_locked(struct apple_mbox *mbox) +{ + struct apple_mbox_msg msg; + int ret = 0; + + u32 mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->i2a_control); + + while (!(mbox_ctrl & mbox->hw->control_empty)) { + msg.msg0 = readq_relaxed(mbox->regs + mbox->hw->i2a_recv0); + msg.msg1 = FIELD_GET( + APPLE_MBOX_MSG1_MSG, + readq_relaxed(mbox->regs + mbox->hw->i2a_recv1)); + + mbox->rx(mbox, msg, mbox->cookie); + ret++; + mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->i2a_control); + } + + /* + * The interrupt will keep firing even if there are no more messages + * unless we also acknowledge it at the mailbox level here. + * There's no race if a message comes in between the check in the while + * loop above and the ack below: If a new messages arrives inbetween + * those two the interrupt will just fire again immediately after the + * ack since it's level triggered. + */ + if (mbox->hw->has_irq_controls) { + writel_relaxed(mbox->hw->irq_bit_recv_not_empty, + mbox->regs + mbox->hw->irq_ack); + } + + return ret; +} + +static irqreturn_t apple_mbox_recv_irq(int irq, void *data) +{ + struct apple_mbox *mbox = data; + + spin_lock(&mbox->rx_lock); + apple_mbox_poll_locked(mbox); + spin_unlock(&mbox->rx_lock); + + return IRQ_HANDLED; +} + +int apple_mbox_poll(struct apple_mbox *mbox) +{ + unsigned long flags; + int ret; + + spin_lock_irqsave(&mbox->rx_lock, flags); + ret = apple_mbox_poll_locked(mbox); + spin_unlock_irqrestore(&mbox->rx_lock, flags); + + return ret; +} +EXPORT_SYMBOL(apple_mbox_poll); + +int apple_mbox_start(struct apple_mbox *mbox) +{ + int ret; + + if (mbox->active) + return 0; + + ret = pm_runtime_resume_and_get(mbox->dev); + if (ret) + return ret; + + /* + * Only some variants of this mailbox HW provide interrupt control + * at the mailbox level. We therefore need to handle enabling/disabling + * interrupts at the main interrupt controller anyway for hardware that + * doesn't. Just always keep the interrupts we care about enabled at + * the mailbox level so that both hardware revisions behave almost + * the same. + */ + if (mbox->hw->has_irq_controls) { + writel_relaxed(mbox->hw->irq_bit_recv_not_empty | + mbox->hw->irq_bit_send_empty, + mbox->regs + mbox->hw->irq_enable); + } + + enable_irq(mbox->irq_recv_not_empty); + mbox->active = true; + return 0; +} +EXPORT_SYMBOL(apple_mbox_start); + +void apple_mbox_stop(struct apple_mbox *mbox) +{ + if (!mbox->active) + return; + + mbox->active = false; + disable_irq(mbox->irq_recv_not_empty); + pm_runtime_mark_last_busy(mbox->dev); + pm_runtime_put_autosuspend(mbox->dev); +} +EXPORT_SYMBOL(apple_mbox_stop); + +struct apple_mbox *apple_mbox_get(struct device *dev, int index) +{ + struct of_phandle_args args; + struct platform_device *pdev; + struct apple_mbox *mbox; + int ret; + + ret = of_parse_phandle_with_args(dev->of_node, "mboxes", "#mbox-cells", + index, &args); + if (ret || !args.np) + return ERR_PTR(ret); + + pdev = of_find_device_by_node(args.np); + of_node_put(args.np); + + if (!pdev) + return ERR_PTR(EPROBE_DEFER); + + mbox = platform_get_drvdata(pdev); + if (!mbox) + return ERR_PTR(EPROBE_DEFER); + + if (!device_link_add(dev, &pdev->dev, DL_FLAG_AUTOREMOVE_CONSUMER)) + return ERR_PTR(ENODEV); + + return mbox; +} +EXPORT_SYMBOL(apple_mbox_get); + +struct apple_mbox *apple_mbox_get_byname(struct device *dev, const char *name) +{ + int index; + + index = of_property_match_string(dev->of_node, "mbox-names", name); + if (index < 0) + return ERR_PTR(index); + + return apple_mbox_get(dev, index); +} +EXPORT_SYMBOL(apple_mbox_get_byname); + +static int apple_mbox_probe(struct platform_device *pdev) +{ + int ret; + char *irqname; + struct apple_mbox *mbox; + struct device *dev = &pdev->dev; + + mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_KERNEL); + if (!mbox) + return -ENOMEM; + + mbox->dev = &pdev->dev; + mbox->hw = of_device_get_match_data(dev); + if (!mbox->hw) + return -EINVAL; + + mbox->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(mbox->regs)) + return PTR_ERR(mbox->regs); + + mbox->irq_recv_not_empty = + platform_get_irq_byname(pdev, "recv-not-empty"); + if (mbox->irq_recv_not_empty < 0) + return -ENODEV; + + mbox->irq_send_empty = platform_get_irq_byname(pdev, "send-empty"); + if (mbox->irq_send_empty < 0) + return -ENODEV; + + spin_lock_init(&mbox->rx_lock); + spin_lock_init(&mbox->tx_lock); + init_completion(&mbox->tx_empty); + + irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-recv", dev_name(dev)); + if (!irqname) + return -ENOMEM; + + ret = devm_request_irq(dev, mbox->irq_recv_not_empty, + apple_mbox_recv_irq, + IRQF_NO_AUTOEN | IRQF_NO_SUSPEND, irqname, mbox); + if (ret) + return ret; + + irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-send", dev_name(dev)); + if (!irqname) + return -ENOMEM; + + ret = devm_request_irq(dev, mbox->irq_send_empty, + apple_mbox_send_empty_irq, + IRQF_NO_AUTOEN | IRQF_NO_SUSPEND, irqname, mbox); + if (ret) + return ret; + + ret = devm_pm_runtime_enable(dev); + if (ret) + return ret; + + platform_set_drvdata(pdev, mbox); + return 0; +} + +static const struct apple_mbox_hw apple_mbox_asc_hw = { + .control_full = APPLE_ASC_MBOX_CONTROL_FULL, + .control_empty = APPLE_ASC_MBOX_CONTROL_EMPTY, + + .a2i_control = APPLE_ASC_MBOX_A2I_CONTROL, + .a2i_send0 = APPLE_ASC_MBOX_A2I_SEND0, + .a2i_send1 = APPLE_ASC_MBOX_A2I_SEND1, + + .i2a_control = APPLE_ASC_MBOX_I2A_CONTROL, + .i2a_recv0 = APPLE_ASC_MBOX_I2A_RECV0, + .i2a_recv1 = APPLE_ASC_MBOX_I2A_RECV1, + + .has_irq_controls = false, +}; + +static const struct apple_mbox_hw apple_mbox_m3_hw = { + .control_full = APPLE_M3_MBOX_CONTROL_FULL, + .control_empty = APPLE_M3_MBOX_CONTROL_EMPTY, + + .a2i_control = APPLE_M3_MBOX_A2I_CONTROL, + .a2i_send0 = APPLE_M3_MBOX_A2I_SEND0, + .a2i_send1 = APPLE_M3_MBOX_A2I_SEND1, + + .i2a_control = APPLE_M3_MBOX_I2A_CONTROL, + .i2a_recv0 = APPLE_M3_MBOX_I2A_RECV0, + .i2a_recv1 = APPLE_M3_MBOX_I2A_RECV1, + + .has_irq_controls = true, + .irq_enable = APPLE_M3_MBOX_IRQ_ENABLE, + .irq_ack = APPLE_M3_MBOX_IRQ_ACK, + .irq_bit_recv_not_empty = APPLE_M3_MBOX_IRQ_I2A_NOT_EMPTY, + .irq_bit_send_empty = APPLE_M3_MBOX_IRQ_A2I_EMPTY, +}; + +static const struct of_device_id apple_mbox_of_match[] = { + { .compatible = "apple,asc-mailbox-v4", .data = &apple_mbox_asc_hw }, + { .compatible = "apple,m3-mailbox-v2", .data = &apple_mbox_m3_hw }, + {} +}; +MODULE_DEVICE_TABLE(of, apple_mbox_of_match); + +static struct platform_driver apple_mbox_driver = { + .driver = { + .name = "apple-mailbox", + .of_match_table = apple_mbox_of_match, + }, + .probe = apple_mbox_probe, +}; +module_platform_driver(apple_mbox_driver); + +MODULE_LICENSE("Dual MIT/GPL"); +MODULE_AUTHOR("Sven Peter "); +MODULE_DESCRIPTION("Apple Mailbox driver"); diff --git a/drivers/soc/apple/mailbox.h b/drivers/soc/apple/mailbox.h new file mode 100644 index 00000000000000..f73a8913da9510 --- /dev/null +++ b/drivers/soc/apple/mailbox.h @@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: GPL-2.0-only OR MIT */ +/* + * Apple mailbox message format + * + * Copyright The Asahi Linux Contributors + */ + +#ifndef _APPLE_MAILBOX_H_ +#define _APPLE_MAILBOX_H_ + +#include +#include + +/* encodes a single 96bit message sent over the single channel */ +struct apple_mbox_msg { + u64 msg0; + u32 msg1; +}; + +struct apple_mbox { + struct device *dev; + void __iomem *regs; + const struct apple_mbox_hw *hw; + bool active; + + int irq_recv_not_empty; + int irq_send_empty; + + spinlock_t rx_lock; + spinlock_t tx_lock; + + struct completion tx_empty; + + /** Receive callback for incoming messages */ + void (*rx)(struct apple_mbox *mbox, struct apple_mbox_msg msg, void *cookie); + void *cookie; +}; + +struct apple_mbox *apple_mbox_get(struct device *dev, int index); +struct apple_mbox *apple_mbox_get_byname(struct device *dev, const char *name); + +int apple_mbox_start(struct apple_mbox *mbox); +void apple_mbox_stop(struct apple_mbox *mbox); +int apple_mbox_poll(struct apple_mbox *mbox); +int apple_mbox_send(struct apple_mbox *mbox, struct apple_mbox_msg msg, + bool atomic); + +#endif From 84333db8cd8a47ada863ab4187c001a7878c47da Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 14 Mar 2023 19:46:47 +0900 Subject: [PATCH 017/515] soc: apple: rtkit: Port to the internal mailbox driver Now that we have a mailbox driver in drivers/soc/apple, port the RTKit code to it. This mostly just entails replacing calls through the mailbox subsystem with direct calls into the driver. Acked-by: Eric Curtin Acked-by: Neal Gompa Acked-by: Alyssa Rosenzweig Signed-off-by: Hector Martin --- drivers/soc/apple/Kconfig | 2 +- drivers/soc/apple/rtkit-internal.h | 8 +-- drivers/soc/apple/rtkit.c | 101 ++++++++--------------------- 3 files changed, 31 insertions(+), 80 deletions(-) diff --git a/drivers/soc/apple/Kconfig b/drivers/soc/apple/Kconfig index caa2cf09ff7a7b..d0e29bbd8c6fdb 100644 --- a/drivers/soc/apple/Kconfig +++ b/drivers/soc/apple/Kconfig @@ -33,7 +33,7 @@ config APPLE_MBOX config APPLE_RTKIT tristate "Apple RTKit co-processor IPC protocol" - depends on MAILBOX + depends on APPLE_MBOX depends on ARCH_APPLE || COMPILE_TEST default ARCH_APPLE help diff --git a/drivers/soc/apple/rtkit-internal.h b/drivers/soc/apple/rtkit-internal.h index 24bd619ec5e487..27c9fa745fd528 100644 --- a/drivers/soc/apple/rtkit-internal.h +++ b/drivers/soc/apple/rtkit-internal.h @@ -7,18 +7,17 @@ #ifndef _APPLE_RTKIT_INTERAL_H #define _APPLE_RTKIT_INTERAL_H -#include #include #include #include #include #include #include -#include #include #include #include #include +#include "mailbox.h" #define APPLE_RTKIT_APP_ENDPOINT_START 0x20 #define APPLE_RTKIT_MAX_ENDPOINTS 0x100 @@ -28,10 +27,7 @@ struct apple_rtkit { const struct apple_rtkit_ops *ops; struct device *dev; - const char *mbox_name; - int mbox_idx; - struct mbox_client mbox_cl; - struct mbox_chan *mbox_chan; + struct apple_mbox *mbox; struct completion epmap_completion; struct completion iop_pwr_ack_completion; diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c index 7c9b9f25bbc198..e6d940292c9fbd 100644 --- a/drivers/soc/apple/rtkit.c +++ b/drivers/soc/apple/rtkit.c @@ -72,11 +72,6 @@ enum { #define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11 #define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12 -struct apple_rtkit_msg { - struct completion *completion; - struct apple_mbox_msg mbox_msg; -}; - struct apple_rtkit_rx_work { struct apple_rtkit *rtk; u8 ep; @@ -550,12 +545,12 @@ static void apple_rtkit_rx_work(struct work_struct *work) kfree(rtk_work); } -static void apple_rtkit_rx(struct mbox_client *cl, void *mssg) +static void apple_rtkit_rx(struct apple_mbox *mbox, struct apple_mbox_msg msg, + void *cookie) { - struct apple_rtkit *rtk = container_of(cl, struct apple_rtkit, mbox_cl); - struct apple_mbox_msg *msg = mssg; + struct apple_rtkit *rtk = cookie; struct apple_rtkit_rx_work *work; - u8 ep = msg->msg1; + u8 ep = msg.msg1; /* * The message was read from a MMIO FIFO and we have to make @@ -571,7 +566,7 @@ static void apple_rtkit_rx(struct mbox_client *cl, void *mssg) if (ep >= APPLE_RTKIT_APP_ENDPOINT_START && rtk->ops->recv_message_early && - rtk->ops->recv_message_early(rtk->cookie, ep, msg->msg0)) + rtk->ops->recv_message_early(rtk->cookie, ep, msg.msg0)) return; work = kzalloc(sizeof(*work), GFP_ATOMIC); @@ -580,30 +575,18 @@ static void apple_rtkit_rx(struct mbox_client *cl, void *mssg) work->rtk = rtk; work->ep = ep; - work->msg = msg->msg0; + work->msg = msg.msg0; INIT_WORK(&work->work, apple_rtkit_rx_work); queue_work(rtk->wq, &work->work); } -static void apple_rtkit_tx_done(struct mbox_client *cl, void *mssg, int r) -{ - struct apple_rtkit_msg *msg = - container_of(mssg, struct apple_rtkit_msg, mbox_msg); - - if (r == -ETIME) - return; - - if (msg->completion) - complete(msg->completion); - kfree(msg); -} - int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, struct completion *completion, bool atomic) { - struct apple_rtkit_msg *msg; - int ret; - gfp_t flags; + struct apple_mbox_msg msg = { + .msg0 = message, + .msg1 = ep, + }; if (rtk->crashed) return -EINVAL; @@ -611,19 +594,6 @@ int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, !apple_rtkit_is_running(rtk)) return -EINVAL; - if (atomic) - flags = GFP_ATOMIC; - else - flags = GFP_KERNEL; - - msg = kzalloc(sizeof(*msg), flags); - if (!msg) - return -ENOMEM; - - msg->mbox_msg.msg0 = message; - msg->mbox_msg.msg1 = ep; - msg->completion = completion; - /* * The message will be sent with a MMIO write. We need the barrier * here to ensure any previous writes to buffers are visible to the @@ -631,19 +601,13 @@ int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, */ dma_wmb(); - ret = mbox_send_message(rtk->mbox_chan, &msg->mbox_msg); - if (ret < 0) { - kfree(msg); - return ret; - } - - return 0; + return apple_mbox_send(rtk->mbox, msg, atomic); } EXPORT_SYMBOL_GPL(apple_rtkit_send_message); int apple_rtkit_poll(struct apple_rtkit *rtk) { - return mbox_client_peek_data(rtk->mbox_chan); + return apple_mbox_poll(rtk->mbox); } EXPORT_SYMBOL_GPL(apple_rtkit_poll); @@ -665,20 +629,6 @@ int apple_rtkit_start_ep(struct apple_rtkit *rtk, u8 endpoint) } EXPORT_SYMBOL_GPL(apple_rtkit_start_ep); -static int apple_rtkit_request_mbox_chan(struct apple_rtkit *rtk) -{ - if (rtk->mbox_name) - rtk->mbox_chan = mbox_request_channel_byname(&rtk->mbox_cl, - rtk->mbox_name); - else - rtk->mbox_chan = - mbox_request_channel(&rtk->mbox_cl, rtk->mbox_idx); - - if (IS_ERR(rtk->mbox_chan)) - return PTR_ERR(rtk->mbox_chan); - return 0; -} - struct apple_rtkit *apple_rtkit_init(struct device *dev, void *cookie, const char *mbox_name, int mbox_idx, const struct apple_rtkit_ops *ops) @@ -704,13 +654,18 @@ struct apple_rtkit *apple_rtkit_init(struct device *dev, void *cookie, bitmap_zero(rtk->endpoints, APPLE_RTKIT_MAX_ENDPOINTS); set_bit(APPLE_RTKIT_EP_MGMT, rtk->endpoints); - rtk->mbox_name = mbox_name; - rtk->mbox_idx = mbox_idx; - rtk->mbox_cl.dev = dev; - rtk->mbox_cl.tx_block = false; - rtk->mbox_cl.knows_txdone = false; - rtk->mbox_cl.rx_callback = &apple_rtkit_rx; - rtk->mbox_cl.tx_done = &apple_rtkit_tx_done; + if (mbox_name) + rtk->mbox = apple_mbox_get_byname(dev, mbox_name); + else + rtk->mbox = apple_mbox_get(dev, mbox_idx); + + if (IS_ERR(rtk->mbox)) { + ret = PTR_ERR(rtk->mbox); + goto free_rtk; + } + + rtk->mbox->rx = apple_rtkit_rx; + rtk->mbox->cookie = rtk; rtk->wq = alloc_ordered_workqueue("rtkit-%s", WQ_MEM_RECLAIM, dev_name(rtk->dev)); @@ -719,7 +674,7 @@ struct apple_rtkit *apple_rtkit_init(struct device *dev, void *cookie, goto free_rtk; } - ret = apple_rtkit_request_mbox_chan(rtk); + ret = apple_mbox_start(rtk->mbox); if (ret) goto destroy_wq; @@ -750,7 +705,7 @@ static int apple_rtkit_wait_for_completion(struct completion *c) int apple_rtkit_reinit(struct apple_rtkit *rtk) { /* make sure we don't handle any messages while reinitializing */ - mbox_free_channel(rtk->mbox_chan); + apple_mbox_stop(rtk->mbox); flush_workqueue(rtk->wq); apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); @@ -774,7 +729,7 @@ int apple_rtkit_reinit(struct apple_rtkit *rtk) rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_OFF; rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_OFF; - return apple_rtkit_request_mbox_chan(rtk); + return apple_mbox_start(rtk->mbox); } EXPORT_SYMBOL_GPL(apple_rtkit_reinit); @@ -930,7 +885,7 @@ EXPORT_SYMBOL_GPL(apple_rtkit_wake); void apple_rtkit_free(struct apple_rtkit *rtk) { - mbox_free_channel(rtk->mbox_chan); + apple_mbox_stop(rtk->mbox); destroy_workqueue(rtk->wq); apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); From 5887221a68b983d5574534c44f849d2b516497a4 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 14 Mar 2023 19:47:32 +0900 Subject: [PATCH 018/515] mailbox: apple: Delete driver This driver is now orphaned and superseded by drivers/soc/apple/mailbox.c. Acked-by: Eric Curtin Acked-by: Neal Gompa Acked-by: Alyssa Rosenzweig Signed-off-by: Hector Martin --- MAINTAINERS | 2 - drivers/mailbox/Kconfig | 12 - drivers/mailbox/Makefile | 2 - drivers/mailbox/apple-mailbox.c | 441 -------------------------------- include/linux/apple-mailbox.h | 19 -- 5 files changed, 476 deletions(-) delete mode 100644 drivers/mailbox/apple-mailbox.c delete mode 100644 include/linux/apple-mailbox.h diff --git a/MAINTAINERS b/MAINTAINERS index 7e0b87d5aa2e57..a2d881ec7d7e9d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1973,7 +1973,6 @@ F: drivers/i2c/busses/i2c-pasemi-platform.c F: drivers/iommu/apple-dart.c F: drivers/iommu/io-pgtable-dart.c F: drivers/irqchip/irq-apple-aic.c -F: drivers/mailbox/apple-mailbox.c F: drivers/nvme/host/apple.c F: drivers/nvmem/apple-efuses.c F: drivers/pinctrl/pinctrl-apple-gpio.c @@ -1982,7 +1981,6 @@ F: drivers/soc/apple/* F: drivers/watchdog/apple_wdt.c F: include/dt-bindings/interrupt-controller/apple-aic.h F: include/dt-bindings/pinctrl/apple.h -F: include/linux/apple-mailbox.h F: include/linux/soc/apple/* ARM/APPLE MACHINE SOUND DRIVERS diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig index bc2e265cb02d2a..42940108a18745 100644 --- a/drivers/mailbox/Kconfig +++ b/drivers/mailbox/Kconfig @@ -8,18 +8,6 @@ menuconfig MAILBOX if MAILBOX -config APPLE_MAILBOX - tristate "Apple Mailbox driver" - depends on ARCH_APPLE || (ARM64 && COMPILE_TEST) - default ARCH_APPLE - help - Apple SoCs have various co-processors required for certain - peripherals to work (NVMe, display controller, etc.). This - driver adds support for the mailbox controller used to - communicate with those. - - Say Y here if you have a Apple SoC. - config ARM_MHU tristate "ARM MHU Mailbox" depends on ARM_AMBA diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile index fc93761171113e..18793e6caa2f1c 100644 --- a/drivers/mailbox/Makefile +++ b/drivers/mailbox/Makefile @@ -60,5 +60,3 @@ obj-$(CONFIG_SUN6I_MSGBOX) += sun6i-msgbox.o obj-$(CONFIG_SPRD_MBOX) += sprd-mailbox.o obj-$(CONFIG_QCOM_IPCC) += qcom-ipcc.o - -obj-$(CONFIG_APPLE_MAILBOX) += apple-mailbox.o diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c deleted file mode 100644 index 2a3e8d8ff8b5e6..00000000000000 --- a/drivers/mailbox/apple-mailbox.c +++ /dev/null @@ -1,441 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only OR MIT -/* - * Apple mailbox driver - * - * Copyright (C) 2021 The Asahi Linux Contributors - * - * This driver adds support for two mailbox variants (called ASC and M3 by - * Apple) found in Apple SoCs such as the M1. It consists of two FIFOs used to - * exchange 64+32 bit messages between the main CPU and a co-processor. - * Various coprocessors implement different IPC protocols based on these simple - * messages and shared memory buffers. - * - * Both the main CPU and the co-processor see the same set of registers but - * the first FIFO (A2I) is always used to transfer messages from the application - * processor (us) to the I/O processor and the second one (I2A) for the - * other direction. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define APPLE_ASC_MBOX_CONTROL_FULL BIT(16) -#define APPLE_ASC_MBOX_CONTROL_EMPTY BIT(17) - -#define APPLE_ASC_MBOX_A2I_CONTROL 0x110 -#define APPLE_ASC_MBOX_A2I_SEND0 0x800 -#define APPLE_ASC_MBOX_A2I_SEND1 0x808 -#define APPLE_ASC_MBOX_A2I_RECV0 0x810 -#define APPLE_ASC_MBOX_A2I_RECV1 0x818 - -#define APPLE_ASC_MBOX_I2A_CONTROL 0x114 -#define APPLE_ASC_MBOX_I2A_SEND0 0x820 -#define APPLE_ASC_MBOX_I2A_SEND1 0x828 -#define APPLE_ASC_MBOX_I2A_RECV0 0x830 -#define APPLE_ASC_MBOX_I2A_RECV1 0x838 - -#define APPLE_M3_MBOX_CONTROL_FULL BIT(16) -#define APPLE_M3_MBOX_CONTROL_EMPTY BIT(17) - -#define APPLE_M3_MBOX_A2I_CONTROL 0x50 -#define APPLE_M3_MBOX_A2I_SEND0 0x60 -#define APPLE_M3_MBOX_A2I_SEND1 0x68 -#define APPLE_M3_MBOX_A2I_RECV0 0x70 -#define APPLE_M3_MBOX_A2I_RECV1 0x78 - -#define APPLE_M3_MBOX_I2A_CONTROL 0x80 -#define APPLE_M3_MBOX_I2A_SEND0 0x90 -#define APPLE_M3_MBOX_I2A_SEND1 0x98 -#define APPLE_M3_MBOX_I2A_RECV0 0xa0 -#define APPLE_M3_MBOX_I2A_RECV1 0xa8 - -#define APPLE_M3_MBOX_IRQ_ENABLE 0x48 -#define APPLE_M3_MBOX_IRQ_ACK 0x4c -#define APPLE_M3_MBOX_IRQ_A2I_EMPTY BIT(0) -#define APPLE_M3_MBOX_IRQ_A2I_NOT_EMPTY BIT(1) -#define APPLE_M3_MBOX_IRQ_I2A_EMPTY BIT(2) -#define APPLE_M3_MBOX_IRQ_I2A_NOT_EMPTY BIT(3) - -#define APPLE_MBOX_MSG1_OUTCNT GENMASK(56, 52) -#define APPLE_MBOX_MSG1_INCNT GENMASK(51, 48) -#define APPLE_MBOX_MSG1_OUTPTR GENMASK(47, 44) -#define APPLE_MBOX_MSG1_INPTR GENMASK(43, 40) -#define APPLE_MBOX_MSG1_MSG GENMASK(31, 0) - -struct apple_mbox_hw { - unsigned int control_full; - unsigned int control_empty; - - unsigned int a2i_control; - unsigned int a2i_send0; - unsigned int a2i_send1; - - unsigned int i2a_control; - unsigned int i2a_recv0; - unsigned int i2a_recv1; - - bool has_irq_controls; - unsigned int irq_enable; - unsigned int irq_ack; - unsigned int irq_bit_recv_not_empty; - unsigned int irq_bit_send_empty; -}; - -struct apple_mbox { - void __iomem *regs; - const struct apple_mbox_hw *hw; - - int irq_recv_not_empty; - int irq_send_empty; - - struct mbox_chan chan; - - struct device *dev; - struct mbox_controller controller; - spinlock_t rx_lock; -}; - -static const struct of_device_id apple_mbox_of_match[]; - -static bool apple_mbox_hw_can_send(struct apple_mbox *apple_mbox) -{ - u32 mbox_ctrl = - readl_relaxed(apple_mbox->regs + apple_mbox->hw->a2i_control); - - return !(mbox_ctrl & apple_mbox->hw->control_full); -} - -static bool apple_mbox_hw_send_empty(struct apple_mbox *apple_mbox) -{ - u32 mbox_ctrl = - readl_relaxed(apple_mbox->regs + apple_mbox->hw->a2i_control); - - return mbox_ctrl & apple_mbox->hw->control_empty; -} - -static int apple_mbox_hw_send(struct apple_mbox *apple_mbox, - struct apple_mbox_msg *msg) -{ - if (!apple_mbox_hw_can_send(apple_mbox)) - return -EBUSY; - - dev_dbg(apple_mbox->dev, "> TX %016llx %08x\n", msg->msg0, msg->msg1); - - writeq_relaxed(msg->msg0, apple_mbox->regs + apple_mbox->hw->a2i_send0); - writeq_relaxed(FIELD_PREP(APPLE_MBOX_MSG1_MSG, msg->msg1), - apple_mbox->regs + apple_mbox->hw->a2i_send1); - - return 0; -} - -static bool apple_mbox_hw_can_recv(struct apple_mbox *apple_mbox) -{ - u32 mbox_ctrl = - readl_relaxed(apple_mbox->regs + apple_mbox->hw->i2a_control); - - return !(mbox_ctrl & apple_mbox->hw->control_empty); -} - -static int apple_mbox_hw_recv(struct apple_mbox *apple_mbox, - struct apple_mbox_msg *msg) -{ - if (!apple_mbox_hw_can_recv(apple_mbox)) - return -ENOMSG; - - msg->msg0 = readq_relaxed(apple_mbox->regs + apple_mbox->hw->i2a_recv0); - msg->msg1 = FIELD_GET( - APPLE_MBOX_MSG1_MSG, - readq_relaxed(apple_mbox->regs + apple_mbox->hw->i2a_recv1)); - - dev_dbg(apple_mbox->dev, "< RX %016llx %08x\n", msg->msg0, msg->msg1); - - return 0; -} - -static int apple_mbox_chan_send_data(struct mbox_chan *chan, void *data) -{ - struct apple_mbox *apple_mbox = chan->con_priv; - struct apple_mbox_msg *msg = data; - int ret; - - ret = apple_mbox_hw_send(apple_mbox, msg); - if (ret) - return ret; - - /* - * The interrupt is level triggered and will keep firing as long as the - * FIFO is empty. It will also keep firing if the FIFO was empty - * at any point in the past until it has been acknowledged at the - * mailbox level. By acknowledging it here we can ensure that we will - * only get the interrupt once the FIFO has been cleared again. - * If the FIFO is already empty before the ack it will fire again - * immediately after the ack. - */ - if (apple_mbox->hw->has_irq_controls) { - writel_relaxed(apple_mbox->hw->irq_bit_send_empty, - apple_mbox->regs + apple_mbox->hw->irq_ack); - } - enable_irq(apple_mbox->irq_send_empty); - - return 0; -} - -static irqreturn_t apple_mbox_send_empty_irq(int irq, void *data) -{ - struct apple_mbox *apple_mbox = data; - - /* - * We don't need to acknowledge the interrupt at the mailbox level - * here even if supported by the hardware. It will keep firing but that - * doesn't matter since it's disabled at the main interrupt controller. - * apple_mbox_chan_send_data will acknowledge it before enabling - * it at the main controller again. - */ - disable_irq_nosync(apple_mbox->irq_send_empty); - mbox_chan_txdone(&apple_mbox->chan, 0); - return IRQ_HANDLED; -} - -static int apple_mbox_poll(struct apple_mbox *apple_mbox) -{ - struct apple_mbox_msg msg; - int ret = 0; - - while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) { - mbox_chan_received_data(&apple_mbox->chan, (void *)&msg); - ret++; - } - - /* - * The interrupt will keep firing even if there are no more messages - * unless we also acknowledge it at the mailbox level here. - * There's no race if a message comes in between the check in the while - * loop above and the ack below: If a new messages arrives inbetween - * those two the interrupt will just fire again immediately after the - * ack since it's level triggered. - */ - if (apple_mbox->hw->has_irq_controls) { - writel_relaxed(apple_mbox->hw->irq_bit_recv_not_empty, - apple_mbox->regs + apple_mbox->hw->irq_ack); - } - - return ret; -} - -static irqreturn_t apple_mbox_recv_irq(int irq, void *data) -{ - struct apple_mbox *apple_mbox = data; - - spin_lock(&apple_mbox->rx_lock); - apple_mbox_poll(apple_mbox); - spin_unlock(&apple_mbox->rx_lock); - - return IRQ_HANDLED; -} - -static bool apple_mbox_chan_peek_data(struct mbox_chan *chan) -{ - struct apple_mbox *apple_mbox = chan->con_priv; - unsigned long flags; - int ret; - - spin_lock_irqsave(&apple_mbox->rx_lock, flags); - ret = apple_mbox_poll(apple_mbox); - spin_unlock_irqrestore(&apple_mbox->rx_lock, flags); - - return ret > 0; -} - -static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout) -{ - struct apple_mbox *apple_mbox = chan->con_priv; - unsigned long deadline = jiffies + msecs_to_jiffies(timeout); - - while (time_before(jiffies, deadline)) { - if (apple_mbox_hw_send_empty(apple_mbox)) { - mbox_chan_txdone(&apple_mbox->chan, 0); - return 0; - } - - udelay(1); - } - - return -ETIME; -} - -static int apple_mbox_chan_startup(struct mbox_chan *chan) -{ - struct apple_mbox *apple_mbox = chan->con_priv; - - /* - * Only some variants of this mailbox HW provide interrupt control - * at the mailbox level. We therefore need to handle enabling/disabling - * interrupts at the main interrupt controller anyway for hardware that - * doesn't. Just always keep the interrupts we care about enabled at - * the mailbox level so that both hardware revisions behave almost - * the same. - */ - if (apple_mbox->hw->has_irq_controls) { - writel_relaxed(apple_mbox->hw->irq_bit_recv_not_empty | - apple_mbox->hw->irq_bit_send_empty, - apple_mbox->regs + apple_mbox->hw->irq_enable); - } - - enable_irq(apple_mbox->irq_recv_not_empty); - return 0; -} - -static void apple_mbox_chan_shutdown(struct mbox_chan *chan) -{ - struct apple_mbox *apple_mbox = chan->con_priv; - - disable_irq(apple_mbox->irq_recv_not_empty); -} - -static const struct mbox_chan_ops apple_mbox_ops = { - .send_data = apple_mbox_chan_send_data, - .peek_data = apple_mbox_chan_peek_data, - .flush = apple_mbox_chan_flush, - .startup = apple_mbox_chan_startup, - .shutdown = apple_mbox_chan_shutdown, -}; - -static struct mbox_chan *apple_mbox_of_xlate(struct mbox_controller *mbox, - const struct of_phandle_args *args) -{ - if (args->args_count != 0) - return ERR_PTR(-EINVAL); - - return &mbox->chans[0]; -} - -static int apple_mbox_probe(struct platform_device *pdev) -{ - int ret; - const struct of_device_id *match; - char *irqname; - struct apple_mbox *mbox; - struct device *dev = &pdev->dev; - - match = of_match_node(apple_mbox_of_match, pdev->dev.of_node); - if (!match) - return -EINVAL; - if (!match->data) - return -EINVAL; - - mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_KERNEL); - if (!mbox) - return -ENOMEM; - platform_set_drvdata(pdev, mbox); - - mbox->dev = dev; - mbox->regs = devm_platform_ioremap_resource(pdev, 0); - if (IS_ERR(mbox->regs)) - return PTR_ERR(mbox->regs); - - mbox->hw = match->data; - mbox->irq_recv_not_empty = - platform_get_irq_byname(pdev, "recv-not-empty"); - if (mbox->irq_recv_not_empty < 0) - return -ENODEV; - - mbox->irq_send_empty = platform_get_irq_byname(pdev, "send-empty"); - if (mbox->irq_send_empty < 0) - return -ENODEV; - - mbox->controller.dev = mbox->dev; - mbox->controller.num_chans = 1; - mbox->controller.chans = &mbox->chan; - mbox->controller.ops = &apple_mbox_ops; - mbox->controller.txdone_irq = true; - mbox->controller.of_xlate = apple_mbox_of_xlate; - mbox->chan.con_priv = mbox; - spin_lock_init(&mbox->rx_lock); - - irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-recv", dev_name(dev)); - if (!irqname) - return -ENOMEM; - - ret = devm_request_threaded_irq(dev, mbox->irq_recv_not_empty, NULL, - apple_mbox_recv_irq, - IRQF_NO_AUTOEN | IRQF_ONESHOT, irqname, - mbox); - if (ret) - return ret; - - irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-send", dev_name(dev)); - if (!irqname) - return -ENOMEM; - - ret = devm_request_irq(dev, mbox->irq_send_empty, - apple_mbox_send_empty_irq, IRQF_NO_AUTOEN, - irqname, mbox); - if (ret) - return ret; - - return devm_mbox_controller_register(dev, &mbox->controller); -} - -static const struct apple_mbox_hw apple_mbox_asc_hw = { - .control_full = APPLE_ASC_MBOX_CONTROL_FULL, - .control_empty = APPLE_ASC_MBOX_CONTROL_EMPTY, - - .a2i_control = APPLE_ASC_MBOX_A2I_CONTROL, - .a2i_send0 = APPLE_ASC_MBOX_A2I_SEND0, - .a2i_send1 = APPLE_ASC_MBOX_A2I_SEND1, - - .i2a_control = APPLE_ASC_MBOX_I2A_CONTROL, - .i2a_recv0 = APPLE_ASC_MBOX_I2A_RECV0, - .i2a_recv1 = APPLE_ASC_MBOX_I2A_RECV1, - - .has_irq_controls = false, -}; - -static const struct apple_mbox_hw apple_mbox_m3_hw = { - .control_full = APPLE_M3_MBOX_CONTROL_FULL, - .control_empty = APPLE_M3_MBOX_CONTROL_EMPTY, - - .a2i_control = APPLE_M3_MBOX_A2I_CONTROL, - .a2i_send0 = APPLE_M3_MBOX_A2I_SEND0, - .a2i_send1 = APPLE_M3_MBOX_A2I_SEND1, - - .i2a_control = APPLE_M3_MBOX_I2A_CONTROL, - .i2a_recv0 = APPLE_M3_MBOX_I2A_RECV0, - .i2a_recv1 = APPLE_M3_MBOX_I2A_RECV1, - - .has_irq_controls = true, - .irq_enable = APPLE_M3_MBOX_IRQ_ENABLE, - .irq_ack = APPLE_M3_MBOX_IRQ_ACK, - .irq_bit_recv_not_empty = APPLE_M3_MBOX_IRQ_I2A_NOT_EMPTY, - .irq_bit_send_empty = APPLE_M3_MBOX_IRQ_A2I_EMPTY, -}; - -static const struct of_device_id apple_mbox_of_match[] = { - { .compatible = "apple,asc-mailbox-v4", .data = &apple_mbox_asc_hw }, - { .compatible = "apple,m3-mailbox-v2", .data = &apple_mbox_m3_hw }, - {} -}; -MODULE_DEVICE_TABLE(of, apple_mbox_of_match); - -static struct platform_driver apple_mbox_driver = { - .driver = { - .name = "apple-mailbox", - .of_match_table = apple_mbox_of_match, - }, - .probe = apple_mbox_probe, -}; -module_platform_driver(apple_mbox_driver); - -MODULE_LICENSE("Dual MIT/GPL"); -MODULE_AUTHOR("Sven Peter "); -MODULE_DESCRIPTION("Apple Mailbox driver"); diff --git a/include/linux/apple-mailbox.h b/include/linux/apple-mailbox.h deleted file mode 100644 index 720fbb70294aa7..00000000000000 --- a/include/linux/apple-mailbox.h +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only OR MIT */ -/* - * Apple mailbox message format - * - * Copyright (C) 2021 The Asahi Linux Contributors - */ - -#ifndef _LINUX_APPLE_MAILBOX_H_ -#define _LINUX_APPLE_MAILBOX_H_ - -#include - -/* encodes a single 96bit message sent over the single channel */ -struct apple_mbox_msg { - u64 msg0; - u32 msg1; -}; - -#endif From eaf935fa48ec826f7c564c269a607cb4fba082b3 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 28 Mar 2023 20:38:26 +0900 Subject: [PATCH 019/515] soc: apple: mailbox: Rename config symbol to APPLE_MAILBOX With the original owner of APPLE_MAILBOX removed, let's rename the new APPLE_MBOX to the old name. This avoids .config churn for downstream users, and leaves us with an identical config symbol and module name as before. Acked-by: Eric Curtin Acked-by: Neal Gompa Acked-by: Alyssa Rosenzweig Signed-off-by: Hector Martin --- drivers/soc/apple/Kconfig | 5 ++--- drivers/soc/apple/Makefile | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/soc/apple/Kconfig b/drivers/soc/apple/Kconfig index d0e29bbd8c6fdb..c5203c388bf444 100644 --- a/drivers/soc/apple/Kconfig +++ b/drivers/soc/apple/Kconfig @@ -17,11 +17,10 @@ config APPLE_PMGR_PWRSTATE controls for SoC devices. This driver manages them through the generic power domain framework, and also provides reset support. -config APPLE_MBOX +config APPLE_MAILBOX tristate "Apple SoC mailboxes" depends on PM depends on ARCH_APPLE || (64BIT && COMPILE_TEST) - depends on !APPLE_MAILBOX default ARCH_APPLE help Apple SoCs have various co-processors required for certain @@ -33,7 +32,7 @@ config APPLE_MBOX config APPLE_RTKIT tristate "Apple RTKit co-processor IPC protocol" - depends on APPLE_MBOX + depends on APPLE_MAILBOX depends on ARCH_APPLE || COMPILE_TEST default ARCH_APPLE help diff --git a/drivers/soc/apple/Makefile b/drivers/soc/apple/Makefile index e52edf6a73dafd..20feee6f394303 100644 --- a/drivers/soc/apple/Makefile +++ b/drivers/soc/apple/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_APPLE_PMGR_PWRSTATE) += apple-pmgr-pwrstate.o -obj-$(CONFIG_APPLE_MBOX) += apple-mailbox.o +obj-$(CONFIG_APPLE_MAILBOX) += apple-mailbox.o apple-mailbox-y = mailbox.o obj-$(CONFIG_APPLE_RTKIT) += apple-rtkit.o From 0f5e4adb608c79bedd8ced30f9ffdcfa01c37459 Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Sat, 24 Jun 2023 11:26:07 +0800 Subject: [PATCH 020/515] memblock: report failures when memblock_can_resize is not set The callers of memblock_reserve() do not check the return value presuming that memblock_reserve() always succeeds, but there are cases where it may fail. Having numerous memblock reservations at early boot where memblock_can_resize is unset may exhaust the INIT_MEMBLOCK_REGIONS sized memblock.reserved regions array and an attempt to double this array via memblock_double_array() will fail and will return -1 to the caller. When this happens the system crashes anyway, but it's hard to identify the reason for the crash. Add a panic message to memblock_double_array() to aid debugging of the cases when too many regions are reserved before memblock can resize memblock.reserved array. Link: https://lore.kernel.org/linux-kernel/20230614131746.3670303-1-songshuaishuai@tinylab.org/ Signed-off-by: Song Shuai Link: https://lore.kernel.org/r/20230624032607.921173-1-songshuaishuai@tinylab.org Signed-off-by: Mike Rapoport (IBM) --- mm/memblock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/memblock.c b/mm/memblock.c index f9e61e565a5343..4fd6372756bf0b 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -419,7 +419,7 @@ static int __init_memblock memblock_double_array(struct memblock_type *type, * of memory that aren't suitable for allocation */ if (!memblock_can_resize) - return -1; + panic("memblock: cannot resize %s array\n", type->name); /* Calculate new doubled size */ old_size = type->max * sizeof(struct memblock_region); From bfbfd5df297eabc39bfa96d3c528bfb565ad92ca Mon Sep 17 00:00:00 2001 From: Jan Cincera Date: Sun, 27 Aug 2023 12:42:07 +0200 Subject: [PATCH 021/515] exfat: add ioctls for accessing attributes Add GET and SET attributes ioctls to enable attribute modification. We already do this in FAT and a few userspace utils made for it would benefit from this also working on exFAT, namely fatattr. Signed-off-by: Jan Cincera Signed-off-by: Namjae Jeon --- fs/exfat/exfat_fs.h | 6 +++ fs/exfat/file.c | 93 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/fs/exfat/exfat_fs.h b/fs/exfat/exfat_fs.h index f55498e5c23d46..5527bc5b25913f 100644 --- a/fs/exfat/exfat_fs.h +++ b/fs/exfat/exfat_fs.h @@ -149,6 +149,12 @@ enum { #define DIR_CACHE_SIZE \ (DIV_ROUND_UP(EXFAT_DEN_TO_B(ES_MAX_ENTRY_NUM), SECTOR_SIZE) + 1) +/* + * attribute ioctls, same as their FAT equivalents. + */ +#define EXFAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, __u32) +#define EXFAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, __u32) + struct exfat_dentry_namebuf { char *lfn; int lfnbuf_len; /* usually MAX_UNINAME_BUF_SIZE */ diff --git a/fs/exfat/file.c b/fs/exfat/file.c index 32395ef686a271..f47620eef71b6e 100644 --- a/fs/exfat/file.c +++ b/fs/exfat/file.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include "exfat_raw.h" #include "exfat_fs.h" @@ -316,6 +318,92 @@ int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry, return error; } +/* + * modified ioctls from fat/file.c by Welmer Almesberger + */ +static int exfat_ioctl_get_attributes(struct inode *inode, u32 __user *user_attr) +{ + u32 attr; + + inode_lock_shared(inode); + attr = exfat_make_attr(inode); + inode_unlock_shared(inode); + + return put_user(attr, user_attr); +} + +static int exfat_ioctl_set_attributes(struct file *file, u32 __user *user_attr) +{ + struct inode *inode = file_inode(file); + struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); + int is_dir = S_ISDIR(inode->i_mode); + u32 attr, oldattr; + struct iattr ia; + int err; + + err = get_user(attr, user_attr); + if (err) + goto out; + + err = mnt_want_write_file(file); + if (err) + goto out; + inode_lock(inode); + + oldattr = exfat_make_attr(inode); + + /* + * Mask attributes so we don't set reserved fields. + */ + attr &= (ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE); + attr |= (is_dir ? ATTR_SUBDIR : 0); + + /* Equivalent to a chmod() */ + ia.ia_valid = ATTR_MODE | ATTR_CTIME; + ia.ia_ctime = current_time(inode); + if (is_dir) + ia.ia_mode = exfat_make_mode(sbi, attr, 0777); + else + ia.ia_mode = exfat_make_mode(sbi, attr, 0666 | (inode->i_mode & 0111)); + + /* The root directory has no attributes */ + if (inode->i_ino == EXFAT_ROOT_INO && attr != ATTR_SUBDIR) { + err = -EINVAL; + goto out_unlock_inode; + } + + if (((attr | oldattr) & ATTR_SYSTEM) && + !capable(CAP_LINUX_IMMUTABLE)) { + err = -EPERM; + goto out_unlock_inode; + } + + /* + * The security check is questionable... We single + * out the RO attribute for checking by the security + * module, just because it maps to a file mode. + */ + err = security_inode_setattr(file_mnt_idmap(file), + file->f_path.dentry, &ia); + if (err) + goto out_unlock_inode; + + /* This MUST be done before doing anything irreversible... */ + err = exfat_setattr(file_mnt_idmap(file), file->f_path.dentry, &ia); + if (err) + goto out_unlock_inode; + + fsnotify_change(file->f_path.dentry, ia.ia_valid); + + exfat_save_attr(inode, attr); + mark_inode_dirty(inode); +out_unlock_inode: + inode_unlock(inode); + mnt_drop_write_file(file); +out: + return err; +} + static int exfat_ioctl_fitrim(struct inode *inode, unsigned long arg) { struct fstrim_range range; @@ -346,8 +434,13 @@ static int exfat_ioctl_fitrim(struct inode *inode, unsigned long arg) long exfat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct inode *inode = file_inode(filp); + u32 __user *user_attr = (u32 __user *)arg; switch (cmd) { + case EXFAT_IOCTL_GET_ATTRIBUTES: + return exfat_ioctl_get_attributes(inode, user_attr); + case EXFAT_IOCTL_SET_ATTRIBUTES: + return exfat_ioctl_set_attributes(filp, user_attr); case FITRIM: return exfat_ioctl_fitrim(inode, arg); default: From c48c235336c8a53227041fa00ea8183e4260d8a8 Mon Sep 17 00:00:00 2001 From: Yuezhang Mo Date: Thu, 20 Jul 2023 14:23:08 +0800 Subject: [PATCH 022/515] exfat: support handle zero-size directory After repairing a corrupted file system with exfatprogs' fsck.exfat, zero-size directories may result. It is also possible to create zero-size directories in other exFAT implementation, such as Paragon ufsd dirver. As described in the specification, the lower directory size limits is 0 bytes. Without this commit, sub-directories and files cannot be created under a zero-size directory, and it cannot be removed. Signed-off-by: Yuezhang Mo Reviewed-by: Andy Wu Reviewed-by: Aoyama Wataru Signed-off-by: Namjae Jeon --- fs/exfat/namei.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/fs/exfat/namei.c b/fs/exfat/namei.c index 1b9f587f6cca5f..95c51b025b9176 100644 --- a/fs/exfat/namei.c +++ b/fs/exfat/namei.c @@ -351,14 +351,20 @@ static int exfat_find_empty_entry(struct inode *inode, if (exfat_check_max_dentries(inode)) return -ENOSPC; - /* we trust p_dir->size regardless of FAT type */ - if (exfat_find_last_cluster(sb, p_dir, &last_clu)) - return -EIO; - /* * Allocate new cluster to this directory */ - exfat_chain_set(&clu, last_clu + 1, 0, p_dir->flags); + if (ei->start_clu != EXFAT_EOF_CLUSTER) { + /* we trust p_dir->size regardless of FAT type */ + if (exfat_find_last_cluster(sb, p_dir, &last_clu)) + return -EIO; + + exfat_chain_set(&clu, last_clu + 1, 0, p_dir->flags); + } else { + /* This directory is empty */ + exfat_chain_set(&clu, EXFAT_EOF_CLUSTER, 0, + ALLOC_NO_FAT_CHAIN); + } /* allocate a cluster */ ret = exfat_alloc_cluster(inode, 1, &clu, IS_DIRSYNC(inode)); @@ -368,6 +374,11 @@ static int exfat_find_empty_entry(struct inode *inode, if (exfat_zeroed_cluster(inode, clu.dir)) return -EIO; + if (ei->start_clu == EXFAT_EOF_CLUSTER) { + ei->start_clu = clu.dir; + p_dir->dir = clu.dir; + } + /* append to the FAT chain */ if (clu.flags != p_dir->flags) { /* no-fat-chain bit is disabled, @@ -645,7 +656,7 @@ static int exfat_find(struct inode *dir, struct qstr *qname, info->type = exfat_get_entry_type(ep); info->attr = le16_to_cpu(ep->dentry.file.attr); info->size = le64_to_cpu(ep2->dentry.stream.valid_size); - if ((info->type == TYPE_FILE) && (info->size == 0)) { + if (info->size == 0) { info->flags = ALLOC_NO_FAT_CHAIN; info->start_clu = EXFAT_EOF_CLUSTER; } else { @@ -888,6 +899,9 @@ static int exfat_check_dir_empty(struct super_block *sb, dentries_per_clu = sbi->dentries_per_clu; + if (p_dir->dir == EXFAT_EOF_CLUSTER) + return 0; + exfat_chain_dup(&clu, p_dir); while (clu.dir != EXFAT_EOF_CLUSTER) { @@ -1255,7 +1269,8 @@ static int __exfat_rename(struct inode *old_parent_inode, } /* Free the clusters if new_inode is a dir(as if exfat_rmdir) */ - if (new_entry_type == TYPE_DIR) { + if (new_entry_type == TYPE_DIR && + new_ei->start_clu != EXFAT_EOF_CLUSTER) { /* new_ei, new_clu_to_free */ struct exfat_chain new_clu_to_free; From b3a62a9886007ce5e2b69e2b14fe41c50c6843d6 Mon Sep 17 00:00:00 2001 From: Yuezhang Mo Date: Thu, 20 Jul 2023 14:40:08 +0800 Subject: [PATCH 023/515] exfat: support create zero-size directory This commit adds mount option 'zero_size_dir'. If this option enabled, don't allocate a cluster to directory when creating it, and set the directory size to 0. On Windows, a cluster is allocated for a directory when it is created, so the mount option is disabled by default. Signed-off-by: Yuezhang Mo Reviewed-by: Andy Wu Reviewed-by: Aoyama Wataru Signed-off-by: Namjae Jeon --- fs/exfat/dir.c | 12 ++++++------ fs/exfat/exfat_fs.h | 2 ++ fs/exfat/namei.c | 7 +++++-- fs/exfat/super.c | 7 +++++++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c index e1586bba6d8623..2affd70c8fc5b4 100644 --- a/fs/exfat/dir.c +++ b/fs/exfat/dir.c @@ -418,11 +418,13 @@ static void exfat_set_entry_type(struct exfat_dentry *ep, unsigned int type) } static void exfat_init_stream_entry(struct exfat_dentry *ep, - unsigned char flags, unsigned int start_clu, - unsigned long long size) + unsigned int start_clu, unsigned long long size) { exfat_set_entry_type(ep, TYPE_STREAM); - ep->dentry.stream.flags = flags; + if (size == 0) + ep->dentry.stream.flags = ALLOC_FAT_CHAIN; + else + ep->dentry.stream.flags = ALLOC_NO_FAT_CHAIN; ep->dentry.stream.start_clu = cpu_to_le32(start_clu); ep->dentry.stream.valid_size = cpu_to_le64(size); ep->dentry.stream.size = cpu_to_le64(size); @@ -488,9 +490,7 @@ int exfat_init_dir_entry(struct inode *inode, struct exfat_chain *p_dir, if (!ep) return -EIO; - exfat_init_stream_entry(ep, - (type == TYPE_FILE) ? ALLOC_FAT_CHAIN : ALLOC_NO_FAT_CHAIN, - start_clu, size); + exfat_init_stream_entry(ep, start_clu, size); exfat_update_bh(bh, IS_DIRSYNC(inode)); brelse(bh); diff --git a/fs/exfat/exfat_fs.h b/fs/exfat/exfat_fs.h index 5527bc5b25913f..219b1cf9d041b3 100644 --- a/fs/exfat/exfat_fs.h +++ b/fs/exfat/exfat_fs.h @@ -240,6 +240,8 @@ struct exfat_mount_options { discard:1, /* Issue discard requests on deletions */ keep_last_dots:1; /* Keep trailing periods in paths */ int time_offset; /* Offset of timestamps from UTC (in minutes) */ + /* Support creating zero-size directory, default: false */ + bool zero_size_dir; }; /* diff --git a/fs/exfat/namei.c b/fs/exfat/namei.c index 95c51b025b9176..1e1ffda279cf34 100644 --- a/fs/exfat/namei.c +++ b/fs/exfat/namei.c @@ -518,7 +518,7 @@ static int exfat_add_entry(struct inode *inode, const char *path, goto out; } - if (type == TYPE_DIR) { + if (type == TYPE_DIR && !sbi->options.zero_size_dir) { ret = exfat_alloc_new_dir(inode, &clu); if (ret) goto out; @@ -551,7 +551,10 @@ static int exfat_add_entry(struct inode *inode, const char *path, info->num_subdirs = 0; } else { info->attr = ATTR_SUBDIR; - info->start_clu = start_clu; + if (sbi->options.zero_size_dir) + info->start_clu = EXFAT_EOF_CLUSTER; + else + info->start_clu = start_clu; info->size = clu_size; info->num_subdirs = EXFAT_MIN_SUBDIR; } diff --git a/fs/exfat/super.c b/fs/exfat/super.c index 2778bd9b631e72..17100b13dcdc10 100644 --- a/fs/exfat/super.c +++ b/fs/exfat/super.c @@ -165,6 +165,8 @@ static int exfat_show_options(struct seq_file *m, struct dentry *root) seq_puts(m, ",sys_tz"); else if (opts->time_offset) seq_printf(m, ",time_offset=%d", opts->time_offset); + if (opts->zero_size_dir) + seq_puts(m, ",zero_size_dir"); return 0; } @@ -209,6 +211,7 @@ enum { Opt_keep_last_dots, Opt_sys_tz, Opt_time_offset, + Opt_zero_size_dir, /* Deprecated options */ Opt_utf8, @@ -237,6 +240,7 @@ static const struct fs_parameter_spec exfat_parameters[] = { fsparam_flag("keep_last_dots", Opt_keep_last_dots), fsparam_flag("sys_tz", Opt_sys_tz), fsparam_s32("time_offset", Opt_time_offset), + fsparam_flag("zero_size_dir", Opt_zero_size_dir), __fsparam(NULL, "utf8", Opt_utf8, fs_param_deprecated, NULL), __fsparam(NULL, "debug", Opt_debug, fs_param_deprecated, @@ -305,6 +309,9 @@ static int exfat_parse_param(struct fs_context *fc, struct fs_parameter *param) return -EINVAL; opts->time_offset = result.int_32; break; + case Opt_zero_size_dir: + opts->zero_size_dir = true; + break; case Opt_utf8: case Opt_debug: case Opt_namecase: From 3b6174a132e51ccad4ec92af73a66812fe8aead1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Fri, 1 Sep 2023 14:43:11 +0200 Subject: [PATCH 024/515] ARM: dts: BCM5301X: Set MAC addresss for Asus RT-AC87U MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Specify NVRAM access and use its "et1macaddr" NVMEM cell. Signed-off-by: Rafał Miłecki Link: https://lore.kernel.org/r/20230901124311.31156-1-zajec5@gmail.com Signed-off-by: Florian Fainelli --- arch/arm/boot/dts/broadcom/bcm4709-asus-rt-ac87u.dts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/arm/boot/dts/broadcom/bcm4709-asus-rt-ac87u.dts b/arch/arm/boot/dts/broadcom/bcm4709-asus-rt-ac87u.dts index 4f44cb4df70491..59400217f8c31b 100644 --- a/arch/arm/boot/dts/broadcom/bcm4709-asus-rt-ac87u.dts +++ b/arch/arm/boot/dts/broadcom/bcm4709-asus-rt-ac87u.dts @@ -25,6 +25,12 @@ <0x88000000 0x08000000>; }; + nvram@1c080000 { + et1macaddr: et1macaddr { + #nvmem-cell-cells = <1>; + }; + }; + leds { compatible = "gpio-leds"; @@ -62,6 +68,11 @@ }; }; +&gmac0 { + nvmem-cells = <&et1macaddr 0>; + nvmem-cell-names = "mac-address"; +}; + &usb3_phy { status = "okay"; }; From 5392534a19540b9fa362dcc6a4c478a1fc1eb513 Mon Sep 17 00:00:00 2001 From: Jia Jie Ho Date: Thu, 25 May 2023 14:18:36 +0800 Subject: [PATCH 025/515] riscv: Kconfig: Add select ARM_AMBA to SOC_STARFIVE Selects ARM_AMBA platform support for StarFive SoCs required by spi and crypto dma engine. Signed-off-by: Jia Jie Ho Acked-by: Palmer Dabbelt Link: https://lore.kernel.org/r/20230525061836.79223-1-jiajie.ho@starfivetech.com Signed-off-by: Palmer Dabbelt --- arch/riscv/Kconfig.socs | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs index 6833d01e2e707b..30fd6a51282853 100644 --- a/arch/riscv/Kconfig.socs +++ b/arch/riscv/Kconfig.socs @@ -29,6 +29,7 @@ config SOC_STARFIVE bool "StarFive SoCs" select PINCTRL select RESET_CONTROLLER + select ARM_AMBA help This enables support for StarFive SoC platform hardware. From 68d0db38a90f1ff2e976a57d8387de8513e72a6c Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Mon, 11 Sep 2023 16:47:47 -0500 Subject: [PATCH 026/515] arm64: dts: xilinx: Apply overlays to base dtbs DT overlays in tree need to be applied to a base DTB to validate they apply, to run schema checks on them, and to catch any errors at compile time. Defining the "-dtbs" variable is not enough as the combined DT must be added to dtbs-y. zynqmp-sck-kr-g-revA.dtso and zynqmp-sck-kr-g-revB.dtso don't exist, so drop them. Signed-off-by: Rob Herring Link: https://lore.kernel.org/r/20230911214751.2202913-1-robh@kernel.org Signed-off-by: Michal Simek --- arch/arm64/boot/dts/xilinx/Makefile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/arch/arm64/boot/dts/xilinx/Makefile b/arch/arm64/boot/dts/xilinx/Makefile index 5e40c0b4fa0a90..1068b0fa8e9847 100644 --- a/arch/arm64/boot/dts/xilinx/Makefile +++ b/arch/arm64/boot/dts/xilinx/Makefile @@ -22,11 +22,10 @@ dtb-$(CONFIG_ARCH_ZYNQMP) += zynqmp-sm-k26-revA.dtb dtb-$(CONFIG_ARCH_ZYNQMP) += zynqmp-smk-k26-revA.dtb zynqmp-sm-k26-revA-sck-kv-g-revA-dtbs := zynqmp-sm-k26-revA.dtb zynqmp-sck-kv-g-revA.dtbo +dtb-$(CONFIG_ARCH_ZYNQMP) += zynqmp-sm-k26-revA-sck-kv-g-revA.dtb zynqmp-sm-k26-revA-sck-kv-g-revB-dtbs := zynqmp-sm-k26-revA.dtb zynqmp-sck-kv-g-revB.dtbo +dtb-$(CONFIG_ARCH_ZYNQMP) += zynqmp-sm-k26-revA-sck-kv-g-revB.dtb zynqmp-smk-k26-revA-sck-kv-g-revA-dtbs := zynqmp-smk-k26-revA.dtb zynqmp-sck-kv-g-revA.dtbo +dtb-$(CONFIG_ARCH_ZYNQMP) += zynqmp-smk-k26-revA-sck-kv-g-revA.dtb zynqmp-smk-k26-revA-sck-kv-g-revB-dtbs := zynqmp-smk-k26-revA.dtb zynqmp-sck-kv-g-revB.dtbo - -zynqmp-sm-k26-revA-sck-kr-g-revA-dtbs := zynqmp-sm-k26-revA.dtb zynqmp-sck-kr-g-revA.dtbo -zynqmp-sm-k26-revA-sck-kr-g-revB-dtbs := zynqmp-sm-k26-revA.dtb zynqmp-sck-kr-g-revB.dtbo -zynqmp-smk-k26-revA-sck-kr-g-revA-dtbs := zynqmp-smk-k26-revA.dtb zynqmp-sck-kr-g-revA.dtbo -zynqmp-smk-k26-revA-sck-kr-g-revB-dtbs := zynqmp-smk-k26-revA.dtb zynqmp-sck-kr-g-revB.dtbo +dtb-$(CONFIG_ARCH_ZYNQMP) += zynqmp-smk-k26-revA-sck-kv-g-revB.dtb From 0e2e05099162c089a9b4dac563ae71b4c01a5f8b Mon Sep 17 00:00:00 2001 From: Justin Stitt Date: Wed, 16 Aug 2023 19:37:52 +0000 Subject: [PATCH 027/515] leds: pca955x: Fix -Wvoid-pointer-to-enum-cast warning When building with clang 18 I see the following warning: | drivers/leds/leds-pca955x.c:487:15: warning: cast to smaller integer | type 'enum pca955x_type' from 'const void *' [-Wvoid-pointer-to-enum-cast] | 487 | chip_type = (enum pca955x_type)md; This is due to the fact that `md` is a void* while `enum pca995x_type` has the size of an int. Add uintptr_t cast to silence clang warning while also keeping enum cast for readability and consistency with other `chip_type` assignment just a few lines below: | chip_type = (enum pca955x_type)id->driver_data; Reported-by: Nathan Chancellor Closes: https://github.com/ClangBuiltLinux/linux/issues/1910 Signed-off-by: Justin Stitt Reviewed-by: Nathan Chancellor Link: https://lore.kernel.org/r/20230816-void-drivers-leds-leds-pca955x-v1-1-2967e4c1bdcc@google.com Signed-off-by: Lee Jones --- drivers/leds/leds-pca955x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c index b10e1ef38db0b5..1d7fa0cd97bf88 100644 --- a/drivers/leds/leds-pca955x.c +++ b/drivers/leds/leds-pca955x.c @@ -484,7 +484,7 @@ static int pca955x_probe(struct i2c_client *client) const void *md = device_get_match_data(&client->dev); if (md) { - chip_type = (enum pca955x_type)md; + chip_type = (enum pca955x_type)(uintptr_t)md; } else { const struct i2c_device_id *id = i2c_match_id(pca955x_id, client); From eec152967faf6befb34ce4828798d699aadab6c5 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 22 Aug 2023 02:25:32 +0300 Subject: [PATCH 028/515] dt-bindings: mfd: qcom-spmi-pmic: Add pm8450 entry Add bindings for the PM8450 PMIC (qcom,pm8450). No driver changes are necessary, since the PMIC is handled by the generic qcom,spmi-pmic entry. Signed-off-by: Dmitry Baryshkov Acked-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20230821232532.3110607-1-dmitry.baryshkov@linaro.org Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml index 9f03436b1cdcd8..debed393fa8c69 100644 --- a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml +++ b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml @@ -58,6 +58,7 @@ properties: - qcom,pm8350 - qcom,pm8350b - qcom,pm8350c + - qcom,pm8450 - qcom,pm8550 - qcom,pm8550b - qcom,pm8550ve From 2c09766cb133ee4d57d19f56c6a0035b0d9eb034 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Sun, 27 Aug 2023 16:24:50 +0300 Subject: [PATCH 029/515] dt-bindings: mfd: qcom-pm8xxx: Add missing child nodes Add gpio, keypad, led, mpps, pwrkey, vibrator and xoadc as possible child nodes of qcom,pm8xxx, referencing existint schema files. Signed-off-by: Dmitry Baryshkov Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20230827132525.951475-3-dmitry.baryshkov@linaro.org Signed-off-by: Lee Jones --- .../devicetree/bindings/mfd/qcom-pm8xxx.yaml | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/mfd/qcom-pm8xxx.yaml b/Documentation/devicetree/bindings/mfd/qcom-pm8xxx.yaml index 9c51c1b1906760..7fe3875a5996ca 100644 --- a/Documentation/devicetree/bindings/mfd/qcom-pm8xxx.yaml +++ b/Documentation/devicetree/bindings/mfd/qcom-pm8xxx.yaml @@ -43,13 +43,37 @@ properties: interrupt-controller: true patternProperties: + "gpio@[0-9a-f]+$": + type: object + $ref: /schemas/pinctrl/qcom,pmic-gpio.yaml# + + "keypad@[0-9a-f]+$": + type: object + $ref: /schemas/input/qcom,pm8921-keypad.yaml# + "led@[0-9a-f]+$": type: object $ref: /schemas/leds/qcom,pm8058-led.yaml# + "mpps@[0-9a-f]+$": + type: object + $ref: /schemas/pinctrl/qcom,pmic-mpp.yaml# + + "pwrkey@[0-9a-f]+$": + type: object + $ref: /schemas/input/qcom,pm8921-pwrkey.yaml# + "rtc@[0-9a-f]+$": type: object - $ref: ../rtc/qcom-pm8xxx-rtc.yaml + $ref: /schemas/rtc/qcom-pm8xxx-rtc.yaml# + + "vibrator@[0-9a-f]+$": + type: object + $ref: /schemas/input/qcom,pm8xxx-vib.yaml# + + "xoadc@[0-9a-f]+$": + type: object + $ref: /schemas/iio/adc/qcom,pm8018-adc.yaml# required: - compatible From ae20c605ad35baa3247a6e5d9c108fa9522155bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= Date: Mon, 28 Aug 2023 22:16:11 +0200 Subject: [PATCH 030/515] mfd: core: Un-constify mfd_cell.of_reg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable dynamically filling in the whole mfd_cell structure. All other fields already allow that. Fixes: 466a62d7642f ("mfd: core: Make a best effort attempt to match devices with the correct of_nodes") Signed-off-by: Michał Mirosław Link: https://lore.kernel.org/r/b73fe4bc4bd6ba1af90940a640ed65fe254c0408.1693253717.git.mirq-linux@rere.qmqm.pl Signed-off-by: Lee Jones --- include/linux/mfd/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h index 47e7a3a61ce694..e8bcad641d8c20 100644 --- a/include/linux/mfd/core.h +++ b/include/linux/mfd/core.h @@ -92,7 +92,7 @@ struct mfd_cell { * (above) when matching OF nodes with devices that have identical * compatible strings */ - const u64 of_reg; + u64 of_reg; /* Set to 'true' to use 'of_reg' (above) - allows for of_reg=0 */ bool use_of_reg; From 86ffa60dd7928a46016e663983ce42e9c0100b92 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Mon, 28 Aug 2023 17:02:24 +0100 Subject: [PATCH 031/515] mfd: max8997: Simplify obtaining I2C match data and drop max8997_i2c_get_driver_data() Simplify probe() by using i2c_get_match_data() instead of max8997_i2c_get_driver_data() for retrieving match data from OF/ID tables. Signed-off-by: Biju Das Reviewed-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230828160224.92037-1-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/max8997.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c index 110bef71f208cd..ffe96b40368e12 100644 --- a/drivers/mfd/max8997.c +++ b/drivers/mfd/max8997.c @@ -142,18 +142,8 @@ static struct max8997_platform_data *max8997_i2c_parse_dt_pdata( return pd; } -static inline unsigned long max8997_i2c_get_driver_data(struct i2c_client *i2c, - const struct i2c_device_id *id) -{ - if (i2c->dev.of_node) - return (unsigned long)of_device_get_match_data(&i2c->dev); - - return id->driver_data; -} - static int max8997_i2c_probe(struct i2c_client *i2c) { - const struct i2c_device_id *id = i2c_client_get_device_id(i2c); struct max8997_dev *max8997; struct max8997_platform_data *pdata = dev_get_platdata(&i2c->dev); int ret = 0; @@ -166,7 +156,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c) i2c_set_clientdata(i2c, max8997); max8997->dev = &i2c->dev; max8997->i2c = i2c; - max8997->type = max8997_i2c_get_driver_data(i2c, id); + max8997->type = (uintptr_t)i2c_get_match_data(i2c); max8997->irq = i2c->irq; if (IS_ENABLED(CONFIG_OF) && max8997->dev->of_node) { From d1aca55b4dcf7de3da90076303b140c40a07c53c Mon Sep 17 00:00:00 2001 From: Tyler Fanelli Date: Tue, 19 Sep 2023 22:40:00 -0400 Subject: [PATCH 032/515] fs/fuse: Rename DIRECT_IO_RELAX to DIRECT_IO_ALLOW_MMAP Although DIRECT_IO_RELAX's initial usage is to allow shared mmap, its description indicates a purpose of reducing memory footprint. This may imply that it could be further used to relax other DIRECT_IO operations in the future. Replace it with a flag DIRECT_IO_ALLOW_MMAP which does only one thing, allow shared mmap of DIRECT_IO files while still bypassing the cache on regular reads and writes. Signed-off-by: Tyler Fanelli Signed-off-by: Miklos Szeredi --- fs/fuse/file.c | 6 +++--- fs/fuse/fuse_i.h | 4 ++-- fs/fuse/inode.c | 6 +++--- include/uapi/linux/fuse.h | 7 +++---- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 1cdb6327511ef8..89e870d1a5262e 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1448,7 +1448,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, if (!ia) return -ENOMEM; - if (fopen_direct_io && fc->direct_io_relax) { + if (fopen_direct_io && fc->direct_io_allow_mmap) { res = filemap_write_and_wait_range(mapping, pos, pos + count - 1); if (res) { fuse_io_free(ia); @@ -2466,9 +2466,9 @@ static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma) if (ff->open_flags & FOPEN_DIRECT_IO) { /* Can't provide the coherency needed for MAP_SHARED - * if FUSE_DIRECT_IO_RELAX isn't set. + * if FUSE_DIRECT_IO_ALLOW_MMAP isn't set. */ - if ((vma->vm_flags & VM_MAYSHARE) && !fc->direct_io_relax) + if ((vma->vm_flags & VM_MAYSHARE) && !fc->direct_io_allow_mmap) return -ENODEV; invalidate_inode_pages2(file->f_mapping); diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index bf0b85d0b95c7d..405252bb51f234 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -797,8 +797,8 @@ struct fuse_conn { /* Is tmpfile not implemented by fs? */ unsigned int no_tmpfile:1; - /* relax restrictions in FOPEN_DIRECT_IO mode */ - unsigned int direct_io_relax:1; + /* Relax restrictions to allow shared mmap in FOPEN_DIRECT_IO mode */ + unsigned int direct_io_allow_mmap:1; /* Is statx not implemented by fs? */ unsigned int no_statx:1; diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 2e4eb7cf26fb33..444418e240c85c 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -1232,8 +1232,8 @@ static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args, fc->init_security = 1; if (flags & FUSE_CREATE_SUPP_GROUP) fc->create_supp_group = 1; - if (flags & FUSE_DIRECT_IO_RELAX) - fc->direct_io_relax = 1; + if (flags & FUSE_DIRECT_IO_ALLOW_MMAP) + fc->direct_io_allow_mmap = 1; } else { ra_pages = fc->max_read / PAGE_SIZE; fc->no_lock = 1; @@ -1280,7 +1280,7 @@ void fuse_send_init(struct fuse_mount *fm) FUSE_NO_OPENDIR_SUPPORT | FUSE_EXPLICIT_INVAL_DATA | FUSE_HANDLE_KILLPRIV_V2 | FUSE_SETXATTR_EXT | FUSE_INIT_EXT | FUSE_SECURITY_CTX | FUSE_CREATE_SUPP_GROUP | - FUSE_HAS_EXPIRE_ONLY | FUSE_DIRECT_IO_RELAX; + FUSE_HAS_EXPIRE_ONLY | FUSE_DIRECT_IO_ALLOW_MMAP; #ifdef CONFIG_FUSE_DAX if (fm->fc->dax) flags |= FUSE_MAP_ALIGNMENT; diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h index db92a7202b342b..a924b495b55888 100644 --- a/include/uapi/linux/fuse.h +++ b/include/uapi/linux/fuse.h @@ -209,7 +209,7 @@ * - add FUSE_HAS_EXPIRE_ONLY * * 7.39 - * - add FUSE_DIRECT_IO_RELAX + * - add FUSE_DIRECT_IO_ALLOW_MMAP * - add FUSE_STATX and related structures */ @@ -409,8 +409,7 @@ struct fuse_file_lock { * FUSE_CREATE_SUPP_GROUP: add supplementary group info to create, mkdir, * symlink and mknod (single group that matches parent) * FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation - * FUSE_DIRECT_IO_RELAX: relax restrictions in FOPEN_DIRECT_IO mode, for now - * allow shared mmap + * FUSE_DIRECT_IO_ALLOW_MMAP: allow shared mmap in FOPEN_DIRECT_IO mode. */ #define FUSE_ASYNC_READ (1 << 0) #define FUSE_POSIX_LOCKS (1 << 1) @@ -449,7 +448,7 @@ struct fuse_file_lock { #define FUSE_HAS_INODE_DAX (1ULL << 33) #define FUSE_CREATE_SUPP_GROUP (1ULL << 34) #define FUSE_HAS_EXPIRE_ONLY (1ULL << 35) -#define FUSE_DIRECT_IO_RELAX (1ULL << 36) +#define FUSE_DIRECT_IO_ALLOW_MMAP (1ULL << 36) /** * CUSE INIT request/reply flags From ae3024a4c4995ff6927882e800f9f447109e62ae Mon Sep 17 00:00:00 2001 From: Tyler Fanelli Date: Tue, 19 Sep 2023 22:40:01 -0400 Subject: [PATCH 033/515] docs/fuse-io: Document the usage of DIRECT_IO_ALLOW_MMAP By default, shared mmap is disabled in FUSE DIRECT_IO mode. However, when the DIRECT_IO_ALLOW_MMAP flag is enabled in the FUSE_INIT reply, shared mmap is allowed. Signed-off-by: Tyler Fanelli Signed-off-by: Miklos Szeredi --- Documentation/filesystems/fuse-io.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/filesystems/fuse-io.rst b/Documentation/filesystems/fuse-io.rst index 255a368fe534b4..6464de4266ad50 100644 --- a/Documentation/filesystems/fuse-io.rst +++ b/Documentation/filesystems/fuse-io.rst @@ -15,7 +15,8 @@ The direct-io mode can be selected with the FOPEN_DIRECT_IO flag in the FUSE_OPEN reply. In direct-io mode the page cache is completely bypassed for reads and writes. -No read-ahead takes place. Shared mmap is disabled. +No read-ahead takes place. Shared mmap is disabled by default. To allow shared +mmap, the FUSE_DIRECT_IO_ALLOW_MMAP flag may be enabled in the FUSE_INIT reply. In cached mode reads may be satisfied from the page cache, and data may be read-ahead by the kernel to fill the cache. The cache is always kept consistent From 852355e98e45ec7f9adf06de92bba063424aa7cb Mon Sep 17 00:00:00 2001 From: Bryan O'Donoghue Date: Wed, 16 Aug 2023 12:51:45 +0100 Subject: [PATCH 034/515] dt-bindings: mfd: qcom,spmi-pmic: Add typec to SPMI device types Add the PMIC Type-C port driver to the list of devices. Signed-off-by: Bryan O'Donoghue Acked-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20230816115151.501736-2-bryan.odonoghue@linaro.org Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml index debed393fa8c69..55e931ba5b47ee 100644 --- a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml +++ b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml @@ -169,6 +169,10 @@ patternProperties: type: object $ref: /schemas/thermal/qcom,spmi-temp-alarm.yaml# + "^typec@[0-9a-f]+$": + type: object + $ref: /schemas/usb/qcom,pmic-typec.yaml# + "^usb-detect@[0-9a-f]+$": type: object $ref: /schemas/extcon/qcom,pm8941-misc.yaml# From 36d139dc63db18eb95165fcc2bd3c670c948d605 Mon Sep 17 00:00:00 2001 From: Herve Codina Date: Fri, 18 Aug 2023 18:39:17 +0200 Subject: [PATCH 035/515] mfd: core: Ensure disabled devices are skipped without aborting The loop searching for a matching device based on its compatible string is aborted when a matching disabled device is found. This abort prevents to add devices as soon as one disabled device is found. Continue searching for an other device instead of aborting on the first disabled one fixes the issue. Fixes: 22380b65dc70 ("mfd: mfd-core: Ensure disabled devices are ignored without error") Signed-off-by: Herve Codina Reviewed-by: Christophe Leroy Signed-off-by: Christophe Leroy Link: https://lore.kernel.org/r/528425d6472176bb1d02d79596b51f8c28a551cc.1692376361.git.christophe.leroy@csgroup.eu Signed-off-by: Lee Jones --- drivers/mfd/mfd-core.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c index 0ed7c0d7784e1b..2b85509a90fc29 100644 --- a/drivers/mfd/mfd-core.c +++ b/drivers/mfd/mfd-core.c @@ -146,6 +146,7 @@ static int mfd_add_device(struct device *parent, int id, struct platform_device *pdev; struct device_node *np = NULL; struct mfd_of_node_entry *of_entry, *tmp; + bool disabled = false; int ret = -ENOMEM; int platform_id; int r; @@ -183,11 +184,10 @@ static int mfd_add_device(struct device *parent, int id, if (IS_ENABLED(CONFIG_OF) && parent->of_node && cell->of_compatible) { for_each_child_of_node(parent->of_node, np) { if (of_device_is_compatible(np, cell->of_compatible)) { - /* Ignore 'disabled' devices error free */ + /* Skip 'disabled' devices */ if (!of_device_is_available(np)) { - of_node_put(np); - ret = 0; - goto fail_alias; + disabled = true; + continue; } ret = mfd_match_of_node_to_dev(pdev, np, cell); @@ -197,10 +197,17 @@ static int mfd_add_device(struct device *parent, int id, if (ret) goto fail_alias; - break; + goto match; } } + if (disabled) { + /* Ignore 'disabled' devices error free */ + ret = 0; + goto fail_alias; + } + +match: if (!pdev->dev.of_node) pr_warn("%s: Failed to locate of_node [id: %d]\n", cell->name, platform_id); From 4c57b25b09932acf81ead78bd32019fc5d0ea913 Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Tue, 29 Aug 2023 19:16:17 +0200 Subject: [PATCH 036/515] dt-bindings: mfd: syscon: Add rockchip,rk3128-qos compatible Document Rockchip RK3128 SoC compatible for qos registers. Signed-off-by: Alex Bee Acked-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20230829171647.187787-2-knaerzche@gmail.com Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/syscon.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mfd/syscon.yaml b/Documentation/devicetree/bindings/mfd/syscon.yaml index 8103154bbb529e..089ad6bf58c5b7 100644 --- a/Documentation/devicetree/bindings/mfd/syscon.yaml +++ b/Documentation/devicetree/bindings/mfd/syscon.yaml @@ -61,6 +61,7 @@ properties: - rockchip,px30-qos - rockchip,rk3036-qos - rockchip,rk3066-qos + - rockchip,rk3128-qos - rockchip,rk3228-qos - rockchip,rk3288-qos - rockchip,rk3368-qos From 0235574f1ae5569a39e35de72767e42e03747bc0 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Wed, 30 Aug 2023 16:53:43 +0200 Subject: [PATCH 037/515] dt-bindings: mfd: stericsson,db8500-prcmu: Spelling s/Cortex A-/Cortex-A/ Fix a misspelling of "Cortex-A9". Signed-off-by: Geert Uytterhoeven Reviewed-by: Linus Walleij Acked-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/0789000f012122a7fa27ef709c738101b00cd834.1693407196.git.geert+renesas@glider.be Signed-off-by: Lee Jones --- .../devicetree/bindings/mfd/stericsson,db8500-prcmu.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/mfd/stericsson,db8500-prcmu.yaml b/Documentation/devicetree/bindings/mfd/stericsson,db8500-prcmu.yaml index 5e0002f099e45e..cb2a42caabb5d7 100644 --- a/Documentation/devicetree/bindings/mfd/stericsson,db8500-prcmu.yaml +++ b/Documentation/devicetree/bindings/mfd/stericsson,db8500-prcmu.yaml @@ -75,7 +75,7 @@ properties: unevaluatedProperties: false db8500_varm: - description: The voltage for the ARM Cortex A-9 CPU. + description: The voltage for the ARM Cortex-A9 CPU. type: object $ref: ../regulator/regulator.yaml# unevaluatedProperties: false From 00e54d48f88eda223306a38cf6016e7209cd1f00 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Thu, 31 Aug 2023 19:31:50 +0100 Subject: [PATCH 038/515] mfd: palmas: Remove trailing comma in the terminator entry Remove trailing comma in the terminator entry for OF table. Signed-off-by: Biju Das Link: https://lore.kernel.org/r/20230831183153.63750-2-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/palmas.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index 6e562bab62e423..769538b5090392 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c @@ -499,7 +499,7 @@ static const struct of_device_id of_palmas_match_tbl[] = { .compatible = "ti,tps65917", .data = &tps65917_data, }, - { }, + { } }; MODULE_DEVICE_TABLE(of, of_palmas_match_tbl); From e8b286068fc1f53f9784b1e8364bd6630918bbb2 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Thu, 31 Aug 2023 19:31:51 +0100 Subject: [PATCH 039/515] mfd: palmas: Constify .data in OF table and {palmas,tps65917}_irq_chip Constify .data in OF table and {palmas,tps65917}_irq_chip and replace the variable *features->features in struct palmas_driver_data and drop the {palmas,tps659038}_features variables and use their values directly in the named initialization. Signed-off-by: Biju Das Link: https://lore.kernel.org/r/20230831183153.63750-3-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/palmas.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index 769538b5090392..3c0a3d6448349d 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c @@ -296,7 +296,7 @@ static const struct regmap_irq palmas_irqs[] = { }, }; -static struct regmap_irq_chip palmas_irq_chip = { +static const struct regmap_irq_chip palmas_irq_chip = { .name = "palmas", .irqs = palmas_irqs, .num_irqs = ARRAY_SIZE(palmas_irqs), @@ -309,7 +309,7 @@ static struct regmap_irq_chip palmas_irq_chip = { PALMAS_INT1_MASK), }; -static struct regmap_irq_chip tps65917_irq_chip = { +static const struct regmap_irq_chip tps65917_irq_chip = { .name = "tps65917", .irqs = tps65917_irqs, .num_irqs = ARRAY_SIZE(tps65917_irqs), @@ -463,26 +463,21 @@ static void palmas_power_off(void) __func__, ret); } -static unsigned int palmas_features = PALMAS_PMIC_FEATURE_SMPS10_BOOST; -static unsigned int tps659038_features; - struct palmas_driver_data { - unsigned int *features; - struct regmap_irq_chip *irq_chip; + unsigned int features; + const struct regmap_irq_chip *irq_chip; }; -static struct palmas_driver_data palmas_data = { - .features = &palmas_features, +static const struct palmas_driver_data palmas_data = { + .features = PALMAS_PMIC_FEATURE_SMPS10_BOOST, .irq_chip = &palmas_irq_chip, }; -static struct palmas_driver_data tps659038_data = { - .features = &tps659038_features, +static const struct palmas_driver_data tps659038_data = { .irq_chip = &palmas_irq_chip, }; -static struct palmas_driver_data tps65917_data = { - .features = &tps659038_features, +static const struct palmas_driver_data tps65917_data = { .irq_chip = &tps65917_irq_chip, }; @@ -507,7 +502,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c) { struct palmas *palmas; struct palmas_platform_data *pdata; - struct palmas_driver_data *driver_data; + const struct palmas_driver_data *driver_data; struct device_node *node = i2c->dev.of_node; int ret = 0, i; unsigned int reg, addr; @@ -535,8 +530,8 @@ static int palmas_i2c_probe(struct i2c_client *i2c) palmas->dev = &i2c->dev; palmas->irq = i2c->irq; - driver_data = (struct palmas_driver_data *) device_get_match_data(&i2c->dev); - palmas->features = *driver_data->features; + driver_data = device_get_match_data(&i2c->dev); + palmas->features = driver_data->features; for (i = 0; i < PALMAS_NUM_CLIENTS; i++) { if (i == 0) From ce48b597e892a4eb5cb1b0adad4b46c4af737860 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Thu, 31 Aug 2023 19:31:52 +0100 Subject: [PATCH 040/515] mfd: palmas: Move OF table closer to its consumer Move OF table near to the user. While at it, arrange compatible and data in single line. Signed-off-by: Biju Das Link: https://lore.kernel.org/r/20230831183153.63750-4-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/palmas.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index 3c0a3d6448349d..3ac9dec2b117a1 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c @@ -481,23 +481,6 @@ static const struct palmas_driver_data tps65917_data = { .irq_chip = &tps65917_irq_chip, }; -static const struct of_device_id of_palmas_match_tbl[] = { - { - .compatible = "ti,palmas", - .data = &palmas_data, - }, - { - .compatible = "ti,tps659038", - .data = &tps659038_data, - }, - { - .compatible = "ti,tps65917", - .data = &tps65917_data, - }, - { } -}; -MODULE_DEVICE_TABLE(of, of_palmas_match_tbl); - static int palmas_i2c_probe(struct i2c_client *i2c) { struct palmas *palmas; @@ -707,6 +690,14 @@ static void palmas_i2c_remove(struct i2c_client *i2c) } } +static const struct of_device_id of_palmas_match_tbl[] = { + { .compatible = "ti,palmas", .data = &palmas_data }, + { .compatible = "ti,tps659038", .data = &tps659038_data }, + { .compatible = "ti,tps65917", .data = &tps65917_data }, + { } +}; +MODULE_DEVICE_TABLE(of, of_palmas_match_tbl); + static const struct i2c_device_id palmas_i2c_id[] = { { "palmas", }, { "twl6035", }, From 3935ffa5258510e516645a29ae3c4ac582e66ff3 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Thu, 31 Aug 2023 19:31:53 +0100 Subject: [PATCH 041/515] mfd: palmas: Make similar OF and ID table Make similar OF and ID table to extend support for ID match using i2c_match_data(). Currently it works only for OF match tables as the driver_data is wrong for ID match. Signed-off-by: Biju Das Link: https://lore.kernel.org/r/20230831183153.63750-5-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/palmas.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index 3ac9dec2b117a1..7fc886f4f80e62 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c @@ -513,7 +513,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c) palmas->dev = &i2c->dev; palmas->irq = i2c->irq; - driver_data = device_get_match_data(&i2c->dev); + driver_data = i2c_get_match_data(i2c); palmas->features = driver_data->features; for (i = 0; i < PALMAS_NUM_CLIENTS; i++) { @@ -699,10 +699,10 @@ static const struct of_device_id of_palmas_match_tbl[] = { MODULE_DEVICE_TABLE(of, of_palmas_match_tbl); static const struct i2c_device_id palmas_i2c_id[] = { - { "palmas", }, - { "twl6035", }, - { "twl6037", }, - { "tps65913", }, + { "palmas", (kernel_ulong_t)&palmas_data }, + { "twl6035", (kernel_ulong_t)&palmas_data }, + { "twl6037", (kernel_ulong_t)&palmas_data }, + { "tps65913", (kernel_ulong_t)&palmas_data }, { /* end */ } }; MODULE_DEVICE_TABLE(i2c, palmas_i2c_id); From fe2ed36d419fdae48a6850bdbe2d2e7543c3c389 Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Thu, 14 Sep 2023 17:13:34 +0800 Subject: [PATCH 042/515] riscv: Remove duplicate objcopy flag There are two duplicate `-O binary` flags when objcopying from vmlinux to Image/xipImage. RISC-V set `-O binary` flag in both OBJCOPYFLAGS in the top-level riscv Makefile and OBJCOPYFLAGS_* in the boot/Makefile, and the objcopy cmd in Kbuild would join them together. The `-O binary` flag is only needed for objcopying Image, so remove the OBJCOPYFLAGS in the top-level riscv Makefile. Fixes: c0fbcd991860 ("RISC-V: Build flat and compressed kernel images") Signed-off-by: Song Shuai Link: https://lore.kernel.org/r/20230914091334.1458542-1-songshuaishuai@tinylab.org Signed-off-by: Palmer Dabbelt --- arch/riscv/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile index 1329e060c5482d..b43a6bb7e4dcb6 100644 --- a/arch/riscv/Makefile +++ b/arch/riscv/Makefile @@ -6,7 +6,6 @@ # for more details. # -OBJCOPYFLAGS := -O binary LDFLAGS_vmlinux := -z norelro ifeq ($(CONFIG_RELOCATABLE),y) LDFLAGS_vmlinux += -shared -Bsymbolic -z notext --emit-relocs From e928aaf249755fd3c1659dece4a23e089534f66f Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Mon, 28 Aug 2023 22:32:29 +0100 Subject: [PATCH 043/515] mfd: axp20x: Generalise handling without interrupt At the moment we allow the AXP15060 and the AXP806 PMICs to omit the interrupt line to the SoC, and we skip registering the PEK (power key) driver in this case, since that crashes when no IRQ is described in the DT node. The IRQ pin potentially not being connected to anything does affect more PMICs, though, and the PEK driver is not the only one requiring an interrupt: at least the AC power supply driver crashes in a similar fashion. Generalise the handling of AXP MFD devices when the platform tables describe no interrupt, by allowing each device to specify an alternative MFD list for this case. If no specific alternative is specified, we go with the safe default of "just the regulators", which matches the current situation. This enables new devices using the AXP313a PMIC, but not connecting the IRQ pin. Signed-off-by: Andre Przywara Reviewed-by: Jernej Skrabec Link: https://lore.kernel.org/r/20230828213229.20332-1-andre.przywara@arm.com Signed-off-by: Lee Jones --- drivers/mfd/axp20x.c | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 87603eeaa27705..d93189b0230de6 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -1133,6 +1133,8 @@ int axp20x_match_device(struct axp20x_dev *axp20x) struct device *dev = axp20x->dev; const struct acpi_device_id *acpi_id; const struct of_device_id *of_id; + const struct mfd_cell *cells_no_irq = NULL; + int nr_cells_no_irq = 0; if (dev->of_node) { of_id = of_match_device(dev->driver->of_match_table, dev); @@ -1207,14 +1209,15 @@ int axp20x_match_device(struct axp20x_dev *axp20x) * if there is no interrupt line. */ if (of_property_read_bool(axp20x->dev->of_node, - "x-powers,self-working-mode") && - axp20x->irq > 0) { + "x-powers,self-working-mode")) { axp20x->nr_cells = ARRAY_SIZE(axp806_self_working_cells); axp20x->cells = axp806_self_working_cells; } else { axp20x->nr_cells = ARRAY_SIZE(axp806_cells); axp20x->cells = axp806_cells; } + nr_cells_no_irq = ARRAY_SIZE(axp806_cells); + cells_no_irq = axp806_cells; axp20x->regmap_cfg = &axp806_regmap_config; axp20x->regmap_irq_chip = &axp806_regmap_irq_chip; break; @@ -1238,24 +1241,8 @@ int axp20x_match_device(struct axp20x_dev *axp20x) axp20x->regmap_irq_chip = &axp803_regmap_irq_chip; break; case AXP15060_ID: - /* - * Don't register the power key part if there is no interrupt - * line. - * - * Since most use cases of AXP PMICs are Allwinner SOCs, board - * designers follow Allwinner's reference design and connects - * IRQ line to SOC, there's no need for those variants to deal - * with cases that IRQ isn't connected. However, AXP15660 is - * used by some other vendors' SOCs that didn't connect IRQ - * line, we need to deal with this case. - */ - if (axp20x->irq > 0) { - axp20x->nr_cells = ARRAY_SIZE(axp15060_cells); - axp20x->cells = axp15060_cells; - } else { - axp20x->nr_cells = ARRAY_SIZE(axp_regulator_only_cells); - axp20x->cells = axp_regulator_only_cells; - } + axp20x->nr_cells = ARRAY_SIZE(axp15060_cells); + axp20x->cells = axp15060_cells; axp20x->regmap_cfg = &axp15060_regmap_config; axp20x->regmap_irq_chip = &axp15060_regmap_irq_chip; break; @@ -1263,6 +1250,23 @@ int axp20x_match_device(struct axp20x_dev *axp20x) dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant); return -EINVAL; } + + /* + * Use an alternative cell array when no interrupt line is connected, + * since IRQs are required by some drivers. + * The default is the safe "regulator-only", as this works fine without + * an interrupt specified. + */ + if (axp20x->irq <= 0) { + if (cells_no_irq) { + axp20x->nr_cells = nr_cells_no_irq; + axp20x->cells = cells_no_irq; + } else { + axp20x->nr_cells = ARRAY_SIZE(axp_regulator_only_cells); + axp20x->cells = axp_regulator_only_cells; + } + } + dev_info(dev, "AXP20x variant %s found\n", axp20x_model_names[axp20x->variant]); From 961c8e9cffce3bcbea982b609fd3df1913c9b905 Mon Sep 17 00:00:00 2001 From: Tengfei Fan Date: Fri, 8 Sep 2023 14:58:43 +0800 Subject: [PATCH 044/515] dt-bindings: mfd: qcom,tcsr: Add compatible for sm4450 Document the qcom,sm4450-tcsr compatible. Signed-off-by: Tengfei Fan Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20230908065847.28382-3-quic_tengfan@quicinc.com Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml b/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml index 5ad9d5deaaf8ac..33c3d023a10681 100644 --- a/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml +++ b/Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml @@ -27,6 +27,7 @@ properties: - qcom,sdm845-tcsr - qcom,sdx55-tcsr - qcom,sdx65-tcsr + - qcom,sm4450-tcsr - qcom,sm8150-tcsr - qcom,sm8450-tcsr - qcom,tcsr-apq8064 From f62fbc01e78ff3f055092b22dc62dcedff90879e Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Mon, 11 Sep 2023 14:01:35 +0200 Subject: [PATCH 045/515] dt-bindings: mfd: maxim,max8998: Convert to DT schema Convert the bindings for Maxim MAX8998, National/TI LP3974 Power Management IC to DT schema. Adjust example to real DTS and make second interrupt optional (like on s5pv210-aries.dtsi). Signed-off-by: Krzysztof Kozlowski Reviewed-by: Conor Dooley Link: https://lore.kernel.org/r/20230911120135.37528-1-krzysztof.kozlowski@linaro.org Signed-off-by: Lee Jones --- .../devicetree/bindings/mfd/max8998.txt | 125 ------- .../bindings/mfd/maxim,max8998.yaml | 324 ++++++++++++++++++ 2 files changed, 324 insertions(+), 125 deletions(-) delete mode 100644 Documentation/devicetree/bindings/mfd/max8998.txt create mode 100644 Documentation/devicetree/bindings/mfd/maxim,max8998.yaml diff --git a/Documentation/devicetree/bindings/mfd/max8998.txt b/Documentation/devicetree/bindings/mfd/max8998.txt deleted file mode 100644 index 4ed52184d08143..00000000000000 --- a/Documentation/devicetree/bindings/mfd/max8998.txt +++ /dev/null @@ -1,125 +0,0 @@ -* Maxim MAX8998, National/TI LP3974 multi-function device - -The Maxim MAX8998 is a multi-function device which includes voltage/current -regulators, real time clock, battery charging controller and several -other sub-blocks. It is interfaced using an I2C interface. Each sub-block -is addressed by the host system using different i2c slave address. - -PMIC sub-block --------------- - -The PMIC sub-block contains a number of voltage and current regulators, -with controllable parameters and dynamic voltage scaling capability. -In addition, it includes a real time clock and battery charging controller -as well. It is accessible at I2C address 0x66. - -Required properties: -- compatible: Should be one of the following: - - "maxim,max8998" for Maxim MAX8998 - - "national,lp3974" or "ti,lp3974" for National/TI LP3974. -- reg: Specifies the i2c slave address of the pmic block. It should be 0x66. - -Optional properties: -- interrupts: Interrupt specifiers for two interrupt sources. - - First interrupt specifier is for main interrupt. - - Second interrupt specifier is for power-on/-off interrupt. -- max8998,pmic-buck1-dvs-gpios: GPIO specifiers for two host gpios used - for buck 1 dvs. The format of the gpio specifier depends on the gpio - controller. -- max8998,pmic-buck2-dvs-gpio: GPIO specifier for host gpio used - for buck 2 dvs. The format of the gpio specifier depends on the gpio - controller. -- max8998,pmic-buck1-default-dvs-idx: Default voltage setting selected from - the possible 4 options selectable by the dvs gpios. The value of this - property should be 0, 1, 2 or 3. If not specified or out of range, - a default value of 0 is taken. -- max8998,pmic-buck2-default-dvs-idx: Default voltage setting selected from - the possible 2 options selectable by the dvs gpios. The value of this - property should be 0 or 1. If not specified or out of range, a default - value of 0 is taken. -- max8998,pmic-buck-voltage-lock: If present, disallows changing of - preprogrammed buck dvfs voltages. - -Additional properties required if max8998,pmic-buck1-dvs-gpios is defined: -- max8998,pmic-buck1-dvs-voltage: An array of 4 voltage values in microvolts - for buck1 regulator that can be selected using dvs gpio. - -Additional properties required if max8998,pmic-buck2-dvs-gpio is defined: -- max8998,pmic-buck2-dvs-voltage: An array of 2 voltage values in microvolts - for buck2 regulator that can be selected using dvs gpio. - -Regulators: All the regulators of MAX8998 to be instantiated shall be -listed in a child node named 'regulators'. Each regulator is represented -by a child node of the 'regulators' node. - - regulator-name { - /* standard regulator bindings here */ - }; - -Following regulators of the MAX8998 PMIC block are supported. Note that -the 'n' in regulator name, as in LDOn or BUCKn, represents the LDO or BUCK -number as described in MAX8998 datasheet. - - - LDOn - - valid values for n are 2 to 17 - - Example: LDO2, LDO10, LDO17 - - BUCKn - - valid values for n are 1 to 4. - - Example: BUCK1, BUCK2, BUCK3, BUCK4 - - - ENVICHG: Battery Charging Current Monitor Output. This is a fixed - voltage type regulator - - - ESAFEOUT1: (ldo19) - - ESAFEOUT2: (ld020) - - - CHARGER: main battery charger current control - -Standard regulator bindings are used inside regulator subnodes. Check - Documentation/devicetree/bindings/regulator/regulator.txt -for more details. - -Example: - - pmic@66 { - compatible = "maxim,max8998-pmic"; - reg = <0x66>; - interrupt-parent = <&wakeup_eint>; - interrupts = <4 0>, <3 0>; - - /* Buck 1 DVS settings */ - max8998,pmic-buck1-default-dvs-idx = <0>; - max8998,pmic-buck1-dvs-gpios = <&gpx0 0 1 0 0>, /* SET1 */ - <&gpx0 1 1 0 0>; /* SET2 */ - max8998,pmic-buck1-dvs-voltage = <1350000>, <1300000>, - <1000000>, <950000>; - - /* Buck 2 DVS settings */ - max8998,pmic-buck2-default-dvs-idx = <0>; - max8998,pmic-buck2-dvs-gpio = <&gpx0 0 3 0 0>; /* SET3 */ - max8998,pmic-buck2-dvs-voltage = <1350000>, <1300000>; - - /* Regulators to instantiate */ - regulators { - ldo2_reg: LDO2 { - regulator-name = "VDD_ALIVE_1.1V"; - regulator-min-microvolt = <1100000>; - regulator-max-microvolt = <1100000>; - regulator-always-on; - }; - - buck1_reg: BUCK1 { - regulator-name = "VDD_ARM_1.2V"; - regulator-min-microvolt = <950000>; - regulator-max-microvolt = <1350000>; - regulator-always-on; - regulator-boot-on; - }; - - charger_reg: CHARGER { - regulator-name = "CHARGER"; - regulator-min-microamp = <90000>; - regulator-max-microamp = <800000>; - }; - }; - }; diff --git a/Documentation/devicetree/bindings/mfd/maxim,max8998.yaml b/Documentation/devicetree/bindings/mfd/maxim,max8998.yaml new file mode 100644 index 00000000000000..f3c3f64fd012b1 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/maxim,max8998.yaml @@ -0,0 +1,324 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/maxim,max8998.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Maxim MAX8998, National/TI LP3974 Power Management IC + +maintainers: + - Krzysztof Kozlowski + +description: + The Maxim MAX8998 is a Power Management IC which includes voltage/current + regulators, real time clock, battery charging controller and several other + sub-blocks. It is interfaced using an I2C interface. Each sub-block is + addressed by the host system using different i2c slave address. + +properties: + compatible: + enum: + - maxim,max8998 + - national,lp3974 + - ti,lp3974 + + reg: + maxItems: 1 + + interrupts: + minItems: 1 + items: + - description: Main interrupt + - description: Power-on/-off interrupt + + max8998,pmic-buck1-dvs-gpios: + maxItems: 2 + description: + Two host gpios used for buck1 DVS. + + max8998,pmic-buck2-dvs-gpio: + maxItems: 1 + description: + Host gpio used for buck2 DVS. + + max8998,pmic-buck1-default-dvs-idx: + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1, 2, 3] + default: 0 + description: + Default voltage setting selected from the possible 4 options selectable + by the DVS gpios. + + max8998,pmic-buck2-default-dvs-idx: + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1] + default: 0 + description: + Default voltage setting selected from the possible 2 options selectable + by the DVS GPIOs. + + max8998,pmic-buck-voltage-lock: + type: boolean + description: + If present, disallows changing of preprogrammed buck DVS voltages. + + max8998,pmic-buck1-dvs-voltage: + $ref: /schemas/types.yaml#/definitions/uint32-array + maxItems: 4 + description: + Four voltage values in microvolts for buck1 regulator that can be + selected using DVS GPIO. + + max8998,pmic-buck2-dvs-voltage: + $ref: /schemas/types.yaml#/definitions/uint32-array + maxItems: 2 + description: + Two voltage values in microvolts for buck2 regulator that can be + selected using DVS GPIO. + + regulators: + type: object + additionalProperties: false + + properties: + CHARGER: + type: object + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false + description: + CHARGER is main battery charger current control, wrongly represented + as regulator. + + properties: + regulator-min-microamp: + minimum: 90000 + maximum: 800000 + + regulator-max-microamp: + minimum: 90000 + maximum: 800000 + + regulator-min-microvolt: false + regulator-max-microvolt: false + + required: + - regulator-name + + patternProperties: + "^(LDO([2-9]|1[0-7])|BUCK[1-4])$": + type: object + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false + + required: + - regulator-name + + "^(EN32KHz-AP|EN32KHz-CP|ENVICHG|ESAFEOUT[12])$": + type: object + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false + description: | + EN32KHz-AP and EN32KHz-CP are 32768 Hz clocks, wrongly represented as + regulators. + ENVICHG is a Battery Charging Current Monitor Output. + + properties: + regulator-min-microvolt: false + regulator-max-microvolt: false + + required: + - regulator-name + +dependencies: + max8998,pmic-buck1-dvs-gpios: [ "max8998,pmic-buck1-dvs-voltage" ] + max8998,pmic-buck2-dvs-gpio: [ "max8998,pmic-buck2-dvs-voltage" ] + +required: + - compatible + - reg + - regulators + +additionalProperties: false + +examples: + - | + #include + #include + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + pmic@66 { + compatible = "national,lp3974"; + reg = <0x66>; + interrupts-extended = <&gpx0 7 IRQ_TYPE_LEVEL_LOW>, + <&gpx2 7 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&lp3974_irq>; + + max8998,pmic-buck1-default-dvs-idx = <0>; + max8998,pmic-buck1-dvs-gpios = <&gpx0 5 GPIO_ACTIVE_HIGH>, + <&gpx0 6 GPIO_ACTIVE_HIGH>; + max8998,pmic-buck1-dvs-voltage = <1100000>, <1000000>, + <1100000>, <1000000>; + max8998,pmic-buck2-default-dvs-idx = <0>; + max8998,pmic-buck2-dvs-gpio = <&gpe2 0 GPIO_ACTIVE_HIGH>; + max8998,pmic-buck2-dvs-voltage = <1200000>, <1100000>; + + regulators { + LDO2 { + regulator-name = "VALIVE_1.2V"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + regulator-always-on; + }; + + LDO3 { + regulator-name = "VUSB+MIPI_1.1V"; + regulator-min-microvolt = <1100000>; + regulator-max-microvolt = <1100000>; + regulator-always-on; + }; + + LDO4 { + regulator-name = "VADC_3.3V"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + LDO5 { + regulator-name = "VTF_2.8V"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + }; + + LDO6 { + regulator-name = "LDO6"; + regulator-min-microvolt = <2000000>; + regulator-max-microvolt = <2000000>; + }; + + LDO7 { + regulator-name = "VLCD+VMIPI_1.8V"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + LDO8 { + regulator-name = "VUSB+VDAC_3.3V"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + + LDO9 { + regulator-name = "VCC_2.8V"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + regulator-always-on; + }; + + LDO10 { + regulator-name = "VPLL_1.1V"; + regulator-min-microvolt = <1100000>; + regulator-max-microvolt = <1100000>; + regulator-boot-on; + regulator-always-on; + }; + + LDO11 { + regulator-name = "CAM_AF_3.3V"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + LDO12 { + regulator-name = "PS_2.8V"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + }; + + LDO13 { + regulator-name = "VHIC_1.2V"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + }; + + LDO14 { + regulator-name = "CAM_I_HOST_1.8V"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + LDO15 { + regulator-name = "CAM_S_DIG+FM33_CORE_1.2V"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + }; + + LDO16 { + regulator-name = "CAM_S_ANA_2.8V"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + }; + + LDO17 { + regulator-name = "VCC_3.0V_LCD"; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + }; + + BUCK1 { + regulator-name = "VINT_1.1V"; + regulator-min-microvolt = <750000>; + regulator-max-microvolt = <1500000>; + regulator-boot-on; + regulator-always-on; + }; + + BUCK2 { + regulator-name = "VG3D_1.1V"; + regulator-min-microvolt = <750000>; + regulator-max-microvolt = <1500000>; + regulator-boot-on; + }; + + BUCK3 { + regulator-name = "VCC_1.8V"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; + }; + + BUCK4 { + regulator-name = "VMEM_1.2V"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + regulator-always-on; + }; + + EN32KHz-AP { + regulator-name = "32KHz AP"; + regulator-always-on; + }; + + EN32KHz-CP { + regulator-name = "32KHz CP"; + }; + + ENVICHG { + regulator-name = "VICHG"; + }; + + ESAFEOUT1 { + regulator-name = "SAFEOUT1"; + }; + + ESAFEOUT2 { + regulator-name = "SAFEOUT2"; + regulator-boot-on; + }; + }; + }; + }; From e141e0544443e3aa800eaddc3beb47417469cb0c Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 12 Sep 2023 12:36:46 +0100 Subject: [PATCH 046/515] mfd: wcd934x: Update to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. In v6.5 it has also acquired the ability to generate multi-register writes in sync operations, bringing performance up to parity with the rbtree cache there. Update the wcd934x to use the more modern data structure. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20230912-mfd-wcd934x-maple-v2-1-292a154113e3@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/wcd934x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/wcd934x.c b/drivers/mfd/wcd934x.c index 6b942d5270c165..7b9873b72c37b6 100644 --- a/drivers/mfd/wcd934x.c +++ b/drivers/mfd/wcd934x.c @@ -112,7 +112,7 @@ static const struct regmap_range_cfg wcd934x_ranges[] = { static struct regmap_config wcd934x_regmap_config = { .reg_bits = 16, .val_bits = 8, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .max_register = 0xffff, .can_multi_write = true, .ranges = wcd934x_ranges, From b173dcd781e0a8293f2dbba92c7245ff9aac5820 Mon Sep 17 00:00:00 2001 From: Ying Sun Date: Wed, 13 Sep 2023 16:45:59 +0800 Subject: [PATCH 047/515] mfd: ab8500: Remove non-existent configuration "#ifdef CONFIG_AB8500_DEBUG" The CONFIG_AB8500_DEBUG has been deleted in: 3d4d1266597c0 ("mfd: ab8500: Drop debugfs module") The condition "#ifdef CONFIG_AB8500_DEBUG" in: include/linux/mfd/abx500/ab8500.h:502 ...cannot be valid. It is recommended to delete redundant code. Suggested-by: Yanjie Ren Signed-off-by: Ying Sun Link: https://lore.kernel.org/r/20230913084559.18141-1-sunying@nj.iscas.ac.cn Signed-off-by: Lee Jones --- include/linux/mfd/abx500/ab8500.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/include/linux/mfd/abx500/ab8500.h b/include/linux/mfd/abx500/ab8500.h index 09fb3c56e7d7bc..76d326ea8ebab6 100644 --- a/include/linux/mfd/abx500/ab8500.h +++ b/include/linux/mfd/abx500/ab8500.h @@ -499,13 +499,7 @@ static inline int is_ab9540_2p0_or_earlier(struct ab8500 *ab) void ab8500_override_turn_on_stat(u8 mask, u8 set); -#ifdef CONFIG_AB8500_DEBUG -extern int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); -void ab8500_dump_all_banks(struct device *dev); -void ab8500_debug_register_interrupt(int line); -#else static inline void ab8500_dump_all_banks(struct device *dev) {} static inline void ab8500_debug_register_interrupt(int line) {} -#endif #endif /* MFD_AB8500_H */ From 9cfffe6a730feea95e7bc827537f5b0a2931171c Mon Sep 17 00:00:00 2001 From: Andrew Davis Date: Mon, 11 Sep 2023 09:25:55 -0500 Subject: [PATCH 048/515] dt-bindings: mfd: syscon: Add ti,am654-dss-oldi-io-ctrl compatible Add TI DSS OLDI-IO control registers compatible. This is a region of 5 32bit registers found in the TI AM65 CTRL_MMR0 register space[0]. They are used to control the characteristics of the OLDI DATA/CLK IO as needed by the DSS display controller node. [0] https://www.ti.com/lit/pdf/spruid7 Signed-off-by: Andrew Davis Acked-by: Krzysztof Kozlowski Reviewed-by: Aradhya Bhatia Link: https://lore.kernel.org/r/20230911142556.64108-1-afd@ti.com Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/syscon.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mfd/syscon.yaml b/Documentation/devicetree/bindings/mfd/syscon.yaml index 089ad6bf58c5b7..7a6e6bbd58f77f 100644 --- a/Documentation/devicetree/bindings/mfd/syscon.yaml +++ b/Documentation/devicetree/bindings/mfd/syscon.yaml @@ -70,6 +70,7 @@ properties: - rockchip,rk3588-qos - rockchip,rv1126-qos - starfive,jh7100-sysmain + - ti,am654-dss-oldi-io-ctrl - const: syscon From c743c12c79ff716e081095c5a2ba360e42b39d78 Mon Sep 17 00:00:00 2001 From: Manikandan Muralidharan Date: Fri, 15 Sep 2023 16:18:42 +0530 Subject: [PATCH 049/515] mfd: atmel-hlcdc: Add compatible for sam9x75 XLCD controller Add compatible for sam9x75 XLCD controller. Signed-off-by: Manikandan Muralidharan Link: https://lore.kernel.org/r/20230915104849.187146-2-manikandan.m@microchip.com Signed-off-by: Lee Jones --- drivers/mfd/atmel-hlcdc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mfd/atmel-hlcdc.c b/drivers/mfd/atmel-hlcdc.c index 20de7f49a8309f..4c4e35d404f36b 100644 --- a/drivers/mfd/atmel-hlcdc.c +++ b/drivers/mfd/atmel-hlcdc.c @@ -139,6 +139,7 @@ static const struct of_device_id atmel_hlcdc_match[] = { { .compatible = "atmel,sama5d3-hlcdc" }, { .compatible = "atmel,sama5d4-hlcdc" }, { .compatible = "microchip,sam9x60-hlcdc" }, + { .compatible = "microchip,sam9x75-xlcdc" }, { /* sentinel */ }, }; MODULE_DEVICE_TABLE(of, atmel_hlcdc_match); From e43d6b679091d196d9ac7664035155ed4c9637cc Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:09:39 -0700 Subject: [PATCH 050/515] leds: aw200xx: Annotate struct aw200xx with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct aw200xx. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230915200938.never.767-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-aw200xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c index 691a743cc9b0fd..4d517cace3e797 100644 --- a/drivers/leds/leds-aw200xx.c +++ b/drivers/leds/leds-aw200xx.c @@ -112,7 +112,7 @@ struct aw200xx { struct mutex mutex; u32 num_leds; u32 display_rows; - struct aw200xx_led leds[]; + struct aw200xx_led leds[] __counted_by(num_leds); }; static ssize_t dim_show(struct device *dev, struct device_attribute *devattr, From dfd75548c30c4a27bcc4c81aed0287d2e8b62add Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:09:48 -0700 Subject: [PATCH 051/515] leds: cr0014114: Annotate struct cr0014114 with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct cr0014114. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230915200948.never.728-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-cr0014114.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-cr0014114.c b/drivers/leds/leds-cr0014114.c index b33bca397ea60d..c9914fc51f2023 100644 --- a/drivers/leds/leds-cr0014114.c +++ b/drivers/leds/leds-cr0014114.c @@ -56,7 +56,7 @@ struct cr0014114 { struct spi_device *spi; u8 *buf; unsigned long delay; - struct cr0014114_led leds[]; + struct cr0014114_led leds[] __counted_by(count); }; static void cr0014114_calc_crc(u8 *buf, const size_t len) From 1d6d5c03fabeb5e5bb7fd7ac3319a8c5471be9e8 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:09:56 -0700 Subject: [PATCH 052/515] leds: el15203000: Annotate struct el15203000 with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct el15203000. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230915200955.never.871-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-el15203000.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-el15203000.c b/drivers/leds/leds-el15203000.c index 7e7b617bcd56e4..d40194a3029f57 100644 --- a/drivers/leds/leds-el15203000.c +++ b/drivers/leds/leds-el15203000.c @@ -80,7 +80,7 @@ struct el15203000 { struct spi_device *spi; unsigned long delay; size_t count; - struct el15203000_led leds[]; + struct el15203000_led leds[] __counted_by(count); }; #define to_el15203000_led(d) container_of(d, struct el15203000_led, ldev) From 00f91ead9c8037d044414ae44a0e75ef3df27e6f Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:10:04 -0700 Subject: [PATCH 053/515] leds: gpio: Annotate struct gpio_leds_priv with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct gpio_leds_priv. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230915201003.never.148-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-gpio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index 7bfe40a6bfddfa..a6597f0f3eb4d5 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -142,7 +142,7 @@ static int create_gpio_led(const struct gpio_led *template, struct gpio_leds_priv { int num_leds; - struct gpio_led_data leds[]; + struct gpio_led_data leds[] __counted_by(num_leds); }; static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev) From 1a210f7d060854f541be9a613bf942849fd5c0b5 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:10:10 -0700 Subject: [PATCH 054/515] leds: lm3697: Annotate struct lm3697 with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct lm3697. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230915201010.never.399-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-lm3697.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-lm3697.c b/drivers/leds/leds-lm3697.c index cfb8ac220db6da..380d17a58fe934 100644 --- a/drivers/leds/leds-lm3697.c +++ b/drivers/leds/leds-lm3697.c @@ -89,7 +89,7 @@ struct lm3697 { int bank_cfg; int num_banks; - struct lm3697_led leds[]; + struct lm3697_led leds[] __counted_by(num_banks); }; static const struct reg_default lm3697_reg_defs[] = { From 3a2a14ad346d60da60aef0a2afc1fb256a56c83c Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:11:00 -0700 Subject: [PATCH 055/515] leds: qcom-lpg: Annotate struct lpg_led with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct lpg_led. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230915201059.never.086-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/rgb/leds-qcom-lpg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/rgb/leds-qcom-lpg.c b/drivers/leds/rgb/leds-qcom-lpg.c index df469aaa7e6e7e..7d93e02a030a25 100644 --- a/drivers/leds/rgb/leds-qcom-lpg.c +++ b/drivers/leds/rgb/leds-qcom-lpg.c @@ -173,7 +173,7 @@ struct lpg_led { struct led_classdev_mc mcdev; unsigned int num_channels; - struct lpg_channel *channels[]; + struct lpg_channel *channels[] __counted_by(num_channels); }; /** From 098e2d6fd72fc99097af33e6e8cb4cd0921a26ac Mon Sep 17 00:00:00 2001 From: Andreas Kemnade Date: Sat, 16 Sep 2023 12:05:11 +0200 Subject: [PATCH 056/515] dt-bindings: mfd: Convert twl-family.txt to json-schema Convert the TWL[46]030 binding to DT schema format. To do it as a step by step work, do not include / handle nodes for subdevices yet, just convert things with minimal corrections. There are already some bindings for its subdevices in the tree. Signed-off-by: Andreas Kemnade Reviewed-by: Conor Dooley Link: https://lore.kernel.org/r/20230916100515.1650336-2-andreas@kemnade.info Signed-off-by: Lee Jones --- .../bindings/input/twl4030-pwrbutton.txt | 2 +- .../devicetree/bindings/mfd/ti,twl.yaml | 64 +++++++++++++++++++ .../devicetree/bindings/mfd/twl-family.txt | 46 ------------- 3 files changed, 65 insertions(+), 47 deletions(-) create mode 100644 Documentation/devicetree/bindings/mfd/ti,twl.yaml delete mode 100644 Documentation/devicetree/bindings/mfd/twl-family.txt diff --git a/Documentation/devicetree/bindings/input/twl4030-pwrbutton.txt b/Documentation/devicetree/bindings/input/twl4030-pwrbutton.txt index f5021214edecb9..6c201a2ba8acfb 100644 --- a/Documentation/devicetree/bindings/input/twl4030-pwrbutton.txt +++ b/Documentation/devicetree/bindings/input/twl4030-pwrbutton.txt @@ -1,7 +1,7 @@ Texas Instruments TWL family (twl4030) pwrbutton module This module is part of the TWL4030. For more details about the whole -chip see Documentation/devicetree/bindings/mfd/twl-family.txt. +chip see Documentation/devicetree/bindings/mfd/ti,twl.yaml. This module provides a simple power button event via an Interrupt. diff --git a/Documentation/devicetree/bindings/mfd/ti,twl.yaml b/Documentation/devicetree/bindings/mfd/ti,twl.yaml new file mode 100644 index 00000000000000..f125b254a4b934 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/ti,twl.yaml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: GPL-2.0 +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/ti,twl.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Texas Instruments TWL family + +maintainers: + - Andreas Kemnade + +description: | + The TWLs are Integrated Power Management Chips. + Some version might contain much more analog function like + USB transceiver or Audio amplifier. + These chips are connected to an i2c bus. + +properties: + compatible: + description: + TWL4030 for integrated power-management/audio CODEC device used in OMAP3 + based boards + TWL6030/32 for integrated power-management used in OMAP4 based boards + enum: + - ti,twl4030 + - ti,twl6030 + - ti,twl6032 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + interrupt-controller: true + + "#interrupt-cells": + const: 1 + +additionalProperties: false + +required: + - compatible + - reg + - interrupts + - interrupt-controller + - "#interrupt-cells" + +examples: + - | + i2c { + #address-cells = <1>; + #size-cells = <0>; + + pmic@48 { + compatible = "ti,twl6030"; + reg = <0x48>; + interrupts = <39>; /* IRQ_SYS_1N cascaded to gic */ + interrupt-controller; + #interrupt-cells = <1>; + interrupt-parent = <&gic>; + }; + }; + diff --git a/Documentation/devicetree/bindings/mfd/twl-family.txt b/Documentation/devicetree/bindings/mfd/twl-family.txt deleted file mode 100644 index c2f9302965dea4..00000000000000 --- a/Documentation/devicetree/bindings/mfd/twl-family.txt +++ /dev/null @@ -1,46 +0,0 @@ -Texas Instruments TWL family - -The TWLs are Integrated Power Management Chips. -Some version might contain much more analog function like -USB transceiver or Audio amplifier. -These chips are connected to an i2c bus. - - -Required properties: -- compatible : Must be "ti,twl4030"; - For Integrated power-management/audio CODEC device used in OMAP3 - based boards -- compatible : Must be "ti,twl6030"; - For Integrated power-management used in OMAP4 based boards -- interrupts : This i2c device has an IRQ line connected to the main SoC -- interrupt-controller : Since the twl support several interrupts internally, - it is considered as an interrupt controller cascaded to the SoC one. -- #interrupt-cells = <1>; - -Optional node: -- Child nodes contain in the twl. The twl family is made of several variants - that support a different number of features. - The children nodes will thus depend of the capability of the variant. - - -Example: -/* - * Integrated Power Management Chip - * https://www.ti.com/lit/ds/symlink/twl6030.pdf - */ -twl@48 { - compatible = "ti,twl6030"; - reg = <0x48>; - interrupts = <39>; /* IRQ_SYS_1N cascaded to gic */ - interrupt-controller; - #interrupt-cells = <1>; - interrupt-parent = <&gic>; - #address-cells = <1>; - #size-cells = <0>; - - twl_rtc { - compatible = "ti,twl_rtc"; - interrupts = <11>; - reg = <0>; - }; -}; From eb9fba08e386ff98818de12b40a5ee1443129229 Mon Sep 17 00:00:00 2001 From: Andreas Kemnade Date: Sat, 16 Sep 2023 12:05:12 +0200 Subject: [PATCH 057/515] dt-bindings: mfd: ti,twl: Add clock provider properties Since these devices provide clock outputs, add the corresponding property. Signed-off-by: Andreas Kemnade Acked-by: Conor Dooley Link: https://lore.kernel.org/r/20230916100515.1650336-3-andreas@kemnade.info Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/ti,twl.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/ti,twl.yaml b/Documentation/devicetree/bindings/mfd/ti,twl.yaml index f125b254a4b934..c04d57ba22b49f 100644 --- a/Documentation/devicetree/bindings/mfd/ti,twl.yaml +++ b/Documentation/devicetree/bindings/mfd/ti,twl.yaml @@ -37,6 +37,9 @@ properties: "#interrupt-cells": const: 1 + "#clock-cells": + const: 1 + additionalProperties: false required: From 3e359099b245227c6729dd5f81f2757dea5d4656 Mon Sep 17 00:00:00 2001 From: Andreas Kemnade Date: Sat, 16 Sep 2023 12:05:13 +0200 Subject: [PATCH 058/515] mfd: twl-core: Add a clock subdevice for the TWL6032 Clock device needs no separate devicetree node, so add it as a platform device. Other devices in the family also have controllable clocks, but due to the lack of testing, just add it for the TWL6032 now. Signed-off-by: Andreas Kemnade Link: https://lore.kernel.org/r/20230916100515.1650336-4-andreas@kemnade.info Signed-off-by: Lee Jones --- drivers/mfd/twl-core.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index ce01a87f8dc399..234500b2e53fca 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -31,6 +31,8 @@ #include #include + +#include #include /* Register descriptions for audio */ @@ -690,6 +692,10 @@ static struct of_dev_auxdata twl_auxdata_lookup[] = { { /* sentinel */ }, }; +static const struct mfd_cell twl6032_cells[] = { + { .name = "twl6032-clk" }, +}; + /* NOTE: This driver only handles a single twl4030/tps659x0 chip */ static int twl_probe(struct i2c_client *client) @@ -836,6 +842,16 @@ twl_probe(struct i2c_client *client) TWL4030_DCDC_GLOBAL_CFG); } + if (id->driver_data == (TWL6030_CLASS | TWL6032_SUBCLASS)) { + status = devm_mfd_add_devices(&client->dev, + PLATFORM_DEVID_NONE, + twl6032_cells, + ARRAY_SIZE(twl6032_cells), + NULL, 0, NULL); + if (status < 0) + goto free; + } + status = of_platform_populate(node, NULL, twl_auxdata_lookup, &client->dev); From 5af618bb43581f2c7d1bdfe8b769a2c85025854e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sat, 16 Sep 2023 18:45:16 +0200 Subject: [PATCH 059/515] leds: simatic-ipc-leds-gpio: Convert to platform remove callback returning void MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is (mostly) ignored and this typically results in resource leaks. To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new() which already returns void. Make simatic_ipc_leds_gpio_remove() return void instead of returning zero unconditionally. After that the three remove callbacks that use this function were trivial to convert to return void, too. Signed-off-by: Uwe Kleine-König Link: https://lore.kernel.org/r/20230916164516.1063380-1-u.kleine-koenig@pengutronix.de Signed-off-by: Lee Jones --- drivers/leds/simple/simatic-ipc-leds-gpio-apollolake.c | 8 ++++---- drivers/leds/simple/simatic-ipc-leds-gpio-core.c | 4 +--- drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c | 7 +++---- drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c | 8 ++++---- drivers/leds/simple/simatic-ipc-leds-gpio.h | 6 +++--- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-apollolake.c b/drivers/leds/simple/simatic-ipc-leds-gpio-apollolake.c index e1c712729dcf7e..4183ee71fcce67 100644 --- a/drivers/leds/simple/simatic-ipc-leds-gpio-apollolake.c +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-apollolake.c @@ -45,15 +45,15 @@ static int simatic_ipc_leds_gpio_apollolake_probe(struct platform_device *pdev) &simatic_ipc_led_gpio_table_extra); } -static int simatic_ipc_leds_gpio_apollolake_remove(struct platform_device *pdev) +static void simatic_ipc_leds_gpio_apollolake_remove(struct platform_device *pdev) { - return simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, - &simatic_ipc_led_gpio_table_extra); + simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, + &simatic_ipc_led_gpio_table_extra); } static struct platform_driver simatic_ipc_led_gpio_apollolake_driver = { .probe = simatic_ipc_leds_gpio_apollolake_probe, - .remove = simatic_ipc_leds_gpio_apollolake_remove, + .remove_new = simatic_ipc_leds_gpio_apollolake_remove, .driver = { .name = KBUILD_MODNAME, }, diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c index c552ea73ed9df6..667ba1bc3a30fe 100644 --- a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c @@ -33,15 +33,13 @@ static const struct gpio_led_platform_data simatic_ipc_gpio_leds_pdata = { .leds = simatic_ipc_gpio_leds, }; -int simatic_ipc_leds_gpio_remove(struct platform_device *pdev, +void simatic_ipc_leds_gpio_remove(struct platform_device *pdev, struct gpiod_lookup_table *table, struct gpiod_lookup_table *table_extra) { gpiod_remove_lookup_table(table); gpiod_remove_lookup_table(table_extra); platform_device_unregister(simatic_leds_pdev); - - return 0; } EXPORT_SYMBOL_GPL(simatic_ipc_leds_gpio_remove); diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c b/drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c index 6ba21dbb3ba0a6..4a53d4dbf52fdf 100644 --- a/drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c @@ -36,15 +36,14 @@ static int simatic_ipc_leds_gpio_elkhartlake_probe(struct platform_device *pdev) NULL); } -static int simatic_ipc_leds_gpio_elkhartlake_remove(struct platform_device *pdev) +static void simatic_ipc_leds_gpio_elkhartlake_remove(struct platform_device *pdev) { - return simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, - NULL); + simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, NULL); } static struct platform_driver simatic_ipc_led_gpio_elkhartlake_driver = { .probe = simatic_ipc_leds_gpio_elkhartlake_probe, - .remove = simatic_ipc_leds_gpio_elkhartlake_remove, + .remove_new = simatic_ipc_leds_gpio_elkhartlake_remove, .driver = { .name = KBUILD_MODNAME, }, diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c b/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c index 583a6b6c7c2226..c7c3a1f986e61d 100644 --- a/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c @@ -45,15 +45,15 @@ static int simatic_ipc_leds_gpio_f7188x_probe(struct platform_device *pdev) &simatic_ipc_led_gpio_table_extra); } -static int simatic_ipc_leds_gpio_f7188x_remove(struct platform_device *pdev) +static void simatic_ipc_leds_gpio_f7188x_remove(struct platform_device *pdev) { - return simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, - &simatic_ipc_led_gpio_table_extra); + simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, + &simatic_ipc_led_gpio_table_extra); } static struct platform_driver simatic_ipc_led_gpio_driver = { .probe = simatic_ipc_leds_gpio_f7188x_probe, - .remove = simatic_ipc_leds_gpio_f7188x_remove, + .remove_new = simatic_ipc_leds_gpio_f7188x_remove, .driver = { .name = KBUILD_MODNAME, }, diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio.h b/drivers/leds/simple/simatic-ipc-leds-gpio.h index 3d4877aa4e0cb4..6b2519809cee8c 100644 --- a/drivers/leds/simple/simatic-ipc-leds-gpio.h +++ b/drivers/leds/simple/simatic-ipc-leds-gpio.h @@ -15,8 +15,8 @@ int simatic_ipc_leds_gpio_probe(struct platform_device *pdev, struct gpiod_lookup_table *table, struct gpiod_lookup_table *table_extra); -int simatic_ipc_leds_gpio_remove(struct platform_device *pdev, - struct gpiod_lookup_table *table, - struct gpiod_lookup_table *table_extra); +void simatic_ipc_leds_gpio_remove(struct platform_device *pdev, + struct gpiod_lookup_table *table, + struct gpiod_lookup_table *table_extra); #endif /* _SIMATIC_IPC_LEDS_GPIO_H */ From 1bb7500cbe756484c3091e7f56171d4141e860ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sun, 17 Sep 2023 15:09:47 +0200 Subject: [PATCH 060/515] leds: Convert all platform drivers to return void MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is ignored (apart from emitting a warning) and this typically results in resource leaks. To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new() which already returns void. Eventually after all drivers are converted, .remove_new() is renamed to .remove(). All platform drivers below drivers/leds/ unconditionally return zero in their remove callback and so can be converted trivially to the variant returning void. Signed-off-by: Uwe Kleine-König Link: https://lore.kernel.org/r/20230917130947.1122198-1-u.kleine-koenig@pengutronix.de Signed-off-by: Lee Jones --- drivers/leds/blink/leds-lgm-sso.c | 6 ++---- drivers/leds/flash/leds-aat1290.c | 6 ++---- drivers/leds/flash/leds-ktd2692.c | 6 ++---- drivers/leds/flash/leds-max77693.c | 6 ++---- drivers/leds/flash/leds-mt6360.c | 5 ++--- drivers/leds/flash/leds-qcom-flash.c | 5 ++--- drivers/leds/flash/leds-rt8515.c | 6 ++---- drivers/leds/flash/leds-sgm3140.c | 6 ++---- drivers/leds/leds-88pm860x.c | 6 ++---- drivers/leds/leds-adp5520.c | 6 ++---- drivers/leds/leds-clevo-mail.c | 5 ++--- drivers/leds/leds-da903x.c | 6 ++---- drivers/leds/leds-da9052.c | 6 ++---- drivers/leds/leds-lm3533.c | 6 ++---- drivers/leds/leds-mc13783.c | 6 ++---- drivers/leds/leds-mlxreg.c | 6 ++---- drivers/leds/leds-mt6323.c | 6 ++---- drivers/leds/leds-nic78bx.c | 6 ++---- drivers/leds/leds-powernv.c | 5 ++--- drivers/leds/leds-rb532.c | 5 ++--- drivers/leds/leds-regulator.c | 5 ++--- drivers/leds/leds-sc27xx-bltc.c | 5 ++--- drivers/leds/leds-sunfire.c | 8 +++----- drivers/leds/leds-wm831x-status.c | 6 ++---- drivers/leds/leds-wm8350.c | 5 ++--- drivers/leds/rgb/leds-qcom-lpg.c | 6 ++---- 26 files changed, 53 insertions(+), 97 deletions(-) diff --git a/drivers/leds/blink/leds-lgm-sso.c b/drivers/leds/blink/leds-lgm-sso.c index 35c61311e7fd8b..7b04ea14626058 100644 --- a/drivers/leds/blink/leds-lgm-sso.c +++ b/drivers/leds/blink/leds-lgm-sso.c @@ -837,7 +837,7 @@ static int intel_sso_led_probe(struct platform_device *pdev) return 0; } -static int intel_sso_led_remove(struct platform_device *pdev) +static void intel_sso_led_remove(struct platform_device *pdev) { struct sso_led_priv *priv; struct sso_led *led, *n; @@ -850,8 +850,6 @@ static int intel_sso_led_remove(struct platform_device *pdev) } regmap_exit(priv->mmap); - - return 0; } static const struct of_device_id of_sso_led_match[] = { @@ -863,7 +861,7 @@ MODULE_DEVICE_TABLE(of, of_sso_led_match); static struct platform_driver intel_sso_led_driver = { .probe = intel_sso_led_probe, - .remove = intel_sso_led_remove, + .remove_new = intel_sso_led_remove, .driver = { .name = "lgm-ssoled", .of_match_table = of_sso_led_match, diff --git a/drivers/leds/flash/leds-aat1290.c b/drivers/leds/flash/leds-aat1290.c index f12ecb2c658031..0195935a7c9903 100644 --- a/drivers/leds/flash/leds-aat1290.c +++ b/drivers/leds/flash/leds-aat1290.c @@ -522,7 +522,7 @@ static int aat1290_led_probe(struct platform_device *pdev) return ret; } -static int aat1290_led_remove(struct platform_device *pdev) +static void aat1290_led_remove(struct platform_device *pdev) { struct aat1290_led *led = platform_get_drvdata(pdev); @@ -530,8 +530,6 @@ static int aat1290_led_remove(struct platform_device *pdev) led_classdev_flash_unregister(&led->fled_cdev); mutex_destroy(&led->lock); - - return 0; } static const struct of_device_id aat1290_led_dt_match[] = { @@ -542,7 +540,7 @@ MODULE_DEVICE_TABLE(of, aat1290_led_dt_match); static struct platform_driver aat1290_led_driver = { .probe = aat1290_led_probe, - .remove = aat1290_led_remove, + .remove_new = aat1290_led_remove, .driver = { .name = "aat1290", .of_match_table = aat1290_led_dt_match, diff --git a/drivers/leds/flash/leds-ktd2692.c b/drivers/leds/flash/leds-ktd2692.c index 670f3bf2e90628..598eee5daa5271 100644 --- a/drivers/leds/flash/leds-ktd2692.c +++ b/drivers/leds/flash/leds-ktd2692.c @@ -386,15 +386,13 @@ static int ktd2692_probe(struct platform_device *pdev) return 0; } -static int ktd2692_remove(struct platform_device *pdev) +static void ktd2692_remove(struct platform_device *pdev) { struct ktd2692_context *led = platform_get_drvdata(pdev); led_classdev_flash_unregister(&led->fled_cdev); mutex_destroy(&led->lock); - - return 0; } static const struct of_device_id ktd2692_match[] = { @@ -409,7 +407,7 @@ static struct platform_driver ktd2692_driver = { .of_match_table = ktd2692_match, }, .probe = ktd2692_probe, - .remove = ktd2692_remove, + .remove_new = ktd2692_remove, }; module_platform_driver(ktd2692_driver); diff --git a/drivers/leds/flash/leds-max77693.c b/drivers/leds/flash/leds-max77693.c index 5c1faeb55a3142..9f016b851193c2 100644 --- a/drivers/leds/flash/leds-max77693.c +++ b/drivers/leds/flash/leds-max77693.c @@ -1016,7 +1016,7 @@ static int max77693_led_probe(struct platform_device *pdev) return ret; } -static int max77693_led_remove(struct platform_device *pdev) +static void max77693_led_remove(struct platform_device *pdev) { struct max77693_led_device *led = platform_get_drvdata(pdev); struct max77693_sub_led *sub_leds = led->sub_leds; @@ -1032,8 +1032,6 @@ static int max77693_led_remove(struct platform_device *pdev) } mutex_destroy(&led->lock); - - return 0; } static const struct of_device_id max77693_led_dt_match[] = { @@ -1044,7 +1042,7 @@ MODULE_DEVICE_TABLE(of, max77693_led_dt_match); static struct platform_driver max77693_led_driver = { .probe = max77693_led_probe, - .remove = max77693_led_remove, + .remove_new = max77693_led_remove, .driver = { .name = "max77693-led", .of_match_table = max77693_led_dt_match, diff --git a/drivers/leds/flash/leds-mt6360.c b/drivers/leds/flash/leds-mt6360.c index 1af6c589834348..81401c481e2b9c 100644 --- a/drivers/leds/flash/leds-mt6360.c +++ b/drivers/leds/flash/leds-mt6360.c @@ -855,12 +855,11 @@ static int mt6360_led_probe(struct platform_device *pdev) return ret; } -static int mt6360_led_remove(struct platform_device *pdev) +static void mt6360_led_remove(struct platform_device *pdev) { struct mt6360_priv *priv = platform_get_drvdata(pdev); mt6360_v4l2_flash_release(priv); - return 0; } static const struct of_device_id __maybe_unused mt6360_led_of_id[] = { @@ -875,7 +874,7 @@ static struct platform_driver mt6360_led_driver = { .of_match_table = mt6360_led_of_id, }, .probe = mt6360_led_probe, - .remove = mt6360_led_remove, + .remove_new = mt6360_led_remove, }; module_platform_driver(mt6360_led_driver); diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c index a73d3ea5c97a33..7c99a303917163 100644 --- a/drivers/leds/flash/leds-qcom-flash.c +++ b/drivers/leds/flash/leds-qcom-flash.c @@ -755,7 +755,7 @@ static int qcom_flash_led_probe(struct platform_device *pdev) return rc; } -static int qcom_flash_led_remove(struct platform_device *pdev) +static void qcom_flash_led_remove(struct platform_device *pdev) { struct qcom_flash_data *flash_data = platform_get_drvdata(pdev); @@ -763,7 +763,6 @@ static int qcom_flash_led_remove(struct platform_device *pdev) v4l2_flash_release(flash_data->v4l2_flash[flash_data->leds_count--]); mutex_destroy(&flash_data->lock); - return 0; } static const struct of_device_id qcom_flash_led_match_table[] = { @@ -778,7 +777,7 @@ static struct platform_driver qcom_flash_led_driver = { .of_match_table = qcom_flash_led_match_table, }, .probe = qcom_flash_led_probe, - .remove = qcom_flash_led_remove, + .remove_new = qcom_flash_led_remove, }; module_platform_driver(qcom_flash_led_driver); diff --git a/drivers/leds/flash/leds-rt8515.c b/drivers/leds/flash/leds-rt8515.c index 44904fdee3cc0e..eef426924eafb4 100644 --- a/drivers/leds/flash/leds-rt8515.c +++ b/drivers/leds/flash/leds-rt8515.c @@ -367,15 +367,13 @@ static int rt8515_probe(struct platform_device *pdev) return 0; } -static int rt8515_remove(struct platform_device *pdev) +static void rt8515_remove(struct platform_device *pdev) { struct rt8515 *rt = platform_get_drvdata(pdev); rt8515_v4l2_flash_release(rt); del_timer_sync(&rt->powerdown_timer); mutex_destroy(&rt->lock); - - return 0; } static const struct of_device_id rt8515_match[] = { @@ -390,7 +388,7 @@ static struct platform_driver rt8515_driver = { .of_match_table = rt8515_match, }, .probe = rt8515_probe, - .remove = rt8515_remove, + .remove_new = rt8515_remove, }; module_platform_driver(rt8515_driver); diff --git a/drivers/leds/flash/leds-sgm3140.c b/drivers/leds/flash/leds-sgm3140.c index d3f50dca513660..eb648ff54b4e55 100644 --- a/drivers/leds/flash/leds-sgm3140.c +++ b/drivers/leds/flash/leds-sgm3140.c @@ -278,15 +278,13 @@ static int sgm3140_probe(struct platform_device *pdev) return ret; } -static int sgm3140_remove(struct platform_device *pdev) +static void sgm3140_remove(struct platform_device *pdev) { struct sgm3140 *priv = platform_get_drvdata(pdev); del_timer_sync(&priv->powerdown_timer); v4l2_flash_release(priv->v4l2_flash); - - return 0; } static const struct of_device_id sgm3140_dt_match[] = { @@ -299,7 +297,7 @@ MODULE_DEVICE_TABLE(of, sgm3140_dt_match); static struct platform_driver sgm3140_driver = { .probe = sgm3140_probe, - .remove = sgm3140_remove, + .remove_new = sgm3140_remove, .driver = { .name = "sgm3140", .of_match_table = sgm3140_dt_match, diff --git a/drivers/leds/leds-88pm860x.c b/drivers/leds/leds-88pm860x.c index 508d0d859f2e02..033ab5fed38a4b 100644 --- a/drivers/leds/leds-88pm860x.c +++ b/drivers/leds/leds-88pm860x.c @@ -215,13 +215,11 @@ static int pm860x_led_probe(struct platform_device *pdev) return 0; } -static int pm860x_led_remove(struct platform_device *pdev) +static void pm860x_led_remove(struct platform_device *pdev) { struct pm860x_led *data = platform_get_drvdata(pdev); led_classdev_unregister(&data->cdev); - - return 0; } static struct platform_driver pm860x_led_driver = { @@ -229,7 +227,7 @@ static struct platform_driver pm860x_led_driver = { .name = "88pm860x-led", }, .probe = pm860x_led_probe, - .remove = pm860x_led_remove, + .remove_new = pm860x_led_remove, }; module_platform_driver(pm860x_led_driver); diff --git a/drivers/leds/leds-adp5520.c b/drivers/leds/leds-adp5520.c index 5a0cc7af2df844..d89a4dca50ae4a 100644 --- a/drivers/leds/leds-adp5520.c +++ b/drivers/leds/leds-adp5520.c @@ -163,7 +163,7 @@ static int adp5520_led_probe(struct platform_device *pdev) return ret; } -static int adp5520_led_remove(struct platform_device *pdev) +static void adp5520_led_remove(struct platform_device *pdev) { struct adp5520_leds_platform_data *pdata = dev_get_platdata(&pdev->dev); struct adp5520_led *led; @@ -177,8 +177,6 @@ static int adp5520_led_remove(struct platform_device *pdev) for (i = 0; i < pdata->num_leds; i++) { led_classdev_unregister(&led[i].cdev); } - - return 0; } static struct platform_driver adp5520_led_driver = { @@ -186,7 +184,7 @@ static struct platform_driver adp5520_led_driver = { .name = "adp5520-led", }, .probe = adp5520_led_probe, - .remove = adp5520_led_remove, + .remove_new = adp5520_led_remove, }; module_platform_driver(adp5520_led_driver); diff --git a/drivers/leds/leds-clevo-mail.c b/drivers/leds/leds-clevo-mail.c index f512e99b976b17..82da0fe688ade9 100644 --- a/drivers/leds/leds-clevo-mail.c +++ b/drivers/leds/leds-clevo-mail.c @@ -159,14 +159,13 @@ static int __init clevo_mail_led_probe(struct platform_device *pdev) return led_classdev_register(&pdev->dev, &clevo_mail_led); } -static int clevo_mail_led_remove(struct platform_device *pdev) +static void clevo_mail_led_remove(struct platform_device *pdev) { led_classdev_unregister(&clevo_mail_led); - return 0; } static struct platform_driver clevo_mail_led_driver = { - .remove = clevo_mail_led_remove, + .remove_new = clevo_mail_led_remove, .driver = { .name = KBUILD_MODNAME, }, diff --git a/drivers/leds/leds-da903x.c b/drivers/leds/leds-da903x.c index 2b5fb00438a2d3..f067a5f4d3c492 100644 --- a/drivers/leds/leds-da903x.c +++ b/drivers/leds/leds-da903x.c @@ -121,13 +121,11 @@ static int da903x_led_probe(struct platform_device *pdev) return 0; } -static int da903x_led_remove(struct platform_device *pdev) +static void da903x_led_remove(struct platform_device *pdev) { struct da903x_led *led = platform_get_drvdata(pdev); led_classdev_unregister(&led->cdev); - - return 0; } static struct platform_driver da903x_led_driver = { @@ -135,7 +133,7 @@ static struct platform_driver da903x_led_driver = { .name = "da903x-led", }, .probe = da903x_led_probe, - .remove = da903x_led_remove, + .remove_new = da903x_led_remove, }; module_platform_driver(da903x_led_driver); diff --git a/drivers/leds/leds-da9052.c b/drivers/leds/leds-da9052.c index 04060c862bf955..64679d62076bbb 100644 --- a/drivers/leds/leds-da9052.c +++ b/drivers/leds/leds-da9052.c @@ -156,7 +156,7 @@ static int da9052_led_probe(struct platform_device *pdev) return error; } -static int da9052_led_remove(struct platform_device *pdev) +static void da9052_led_remove(struct platform_device *pdev) { struct da9052_led *led = platform_get_drvdata(pdev); struct da9052_pdata *pdata; @@ -172,8 +172,6 @@ static int da9052_led_remove(struct platform_device *pdev) da9052_set_led_brightness(&led[i], LED_OFF); led_classdev_unregister(&led[i].cdev); } - - return 0; } static struct platform_driver da9052_led_driver = { @@ -181,7 +179,7 @@ static struct platform_driver da9052_led_driver = { .name = "da9052-leds", }, .probe = da9052_led_probe, - .remove = da9052_led_remove, + .remove_new = da9052_led_remove, }; module_platform_driver(da9052_led_driver); diff --git a/drivers/leds/leds-lm3533.c b/drivers/leds/leds-lm3533.c index bcd414eb47246e..a3d33165d262bf 100644 --- a/drivers/leds/leds-lm3533.c +++ b/drivers/leds/leds-lm3533.c @@ -718,7 +718,7 @@ static int lm3533_led_probe(struct platform_device *pdev) return ret; } -static int lm3533_led_remove(struct platform_device *pdev) +static void lm3533_led_remove(struct platform_device *pdev) { struct lm3533_led *led = platform_get_drvdata(pdev); @@ -726,8 +726,6 @@ static int lm3533_led_remove(struct platform_device *pdev) lm3533_ctrlbank_disable(&led->cb); led_classdev_unregister(&led->cdev); - - return 0; } static void lm3533_led_shutdown(struct platform_device *pdev) @@ -746,7 +744,7 @@ static struct platform_driver lm3533_led_driver = { .name = "lm3533-leds", }, .probe = lm3533_led_probe, - .remove = lm3533_led_remove, + .remove_new = lm3533_led_remove, .shutdown = lm3533_led_shutdown, }; module_platform_driver(lm3533_led_driver); diff --git a/drivers/leds/leds-mc13783.c b/drivers/leds/leds-mc13783.c index 675502c15c2b40..bbd1d359bba47c 100644 --- a/drivers/leds/leds-mc13783.c +++ b/drivers/leds/leds-mc13783.c @@ -261,15 +261,13 @@ static int __init mc13xxx_led_probe(struct platform_device *pdev) return ret; } -static int mc13xxx_led_remove(struct platform_device *pdev) +static void mc13xxx_led_remove(struct platform_device *pdev) { struct mc13xxx_leds *leds = platform_get_drvdata(pdev); int i; for (i = 0; i < leds->num_leds; i++) led_classdev_unregister(&leds->led[i].cdev); - - return 0; } static const struct mc13xxx_led_devtype mc13783_led_devtype = { @@ -305,7 +303,7 @@ static struct platform_driver mc13xxx_led_driver = { .driver = { .name = "mc13xxx-led", }, - .remove = mc13xxx_led_remove, + .remove_new = mc13xxx_led_remove, .id_table = mc13xxx_led_id_table, }; module_platform_driver_probe(mc13xxx_led_driver, mc13xxx_led_probe); diff --git a/drivers/leds/leds-mlxreg.c b/drivers/leds/leds-mlxreg.c index 39210653acf7fe..d8e3d5d8d2d092 100644 --- a/drivers/leds/leds-mlxreg.c +++ b/drivers/leds/leds-mlxreg.c @@ -275,13 +275,11 @@ static int mlxreg_led_probe(struct platform_device *pdev) return mlxreg_led_config(priv); } -static int mlxreg_led_remove(struct platform_device *pdev) +static void mlxreg_led_remove(struct platform_device *pdev) { struct mlxreg_led_priv_data *priv = dev_get_drvdata(&pdev->dev); mutex_destroy(&priv->access_lock); - - return 0; } static struct platform_driver mlxreg_led_driver = { @@ -289,7 +287,7 @@ static struct platform_driver mlxreg_led_driver = { .name = "leds-mlxreg", }, .probe = mlxreg_led_probe, - .remove = mlxreg_led_remove, + .remove_new = mlxreg_led_remove, }; module_platform_driver(mlxreg_led_driver); diff --git a/drivers/leds/leds-mt6323.c b/drivers/leds/leds-mt6323.c index 24f35bdb55fbf3..40d50851082329 100644 --- a/drivers/leds/leds-mt6323.c +++ b/drivers/leds/leds-mt6323.c @@ -632,7 +632,7 @@ static int mt6323_led_probe(struct platform_device *pdev) return ret; } -static int mt6323_led_remove(struct platform_device *pdev) +static void mt6323_led_remove(struct platform_device *pdev) { struct mt6323_leds *leds = platform_get_drvdata(pdev); const struct mt6323_regs *regs = leds->pdata->regs; @@ -647,8 +647,6 @@ static int mt6323_led_remove(struct platform_device *pdev) RG_DRV_32K_CK_PDN); mutex_destroy(&leds->lock); - - return 0; } static const struct mt6323_regs mt6323_registers = { @@ -723,7 +721,7 @@ MODULE_DEVICE_TABLE(of, mt6323_led_dt_match); static struct platform_driver mt6323_led_driver = { .probe = mt6323_led_probe, - .remove = mt6323_led_remove, + .remove_new = mt6323_led_remove, .driver = { .name = "mt6323-led", .of_match_table = mt6323_led_dt_match, diff --git a/drivers/leds/leds-nic78bx.c b/drivers/leds/leds-nic78bx.c index f196f52eec1e21..a86b43dd995ee4 100644 --- a/drivers/leds/leds-nic78bx.c +++ b/drivers/leds/leds-nic78bx.c @@ -167,15 +167,13 @@ static int nic78bx_probe(struct platform_device *pdev) return ret; } -static int nic78bx_remove(struct platform_device *pdev) +static void nic78bx_remove(struct platform_device *pdev) { struct nic78bx_led_data *led_data = platform_get_drvdata(pdev); /* Lock LED register */ outb(NIC78BX_LOCK_VALUE, led_data->io_base + NIC78BX_LOCK_REG_OFFSET); - - return 0; } static const struct acpi_device_id led_device_ids[] = { @@ -186,7 +184,7 @@ MODULE_DEVICE_TABLE(acpi, led_device_ids); static struct platform_driver led_driver = { .probe = nic78bx_probe, - .remove = nic78bx_remove, + .remove_new = nic78bx_remove, .driver = { .name = KBUILD_MODNAME, .acpi_match_table = ACPI_PTR(led_device_ids), diff --git a/drivers/leds/leds-powernv.c b/drivers/leds/leds-powernv.c index 743e2cdd0891b3..4f01acb75727dd 100644 --- a/drivers/leds/leds-powernv.c +++ b/drivers/leds/leds-powernv.c @@ -309,7 +309,7 @@ static int powernv_led_probe(struct platform_device *pdev) } /* Platform driver remove */ -static int powernv_led_remove(struct platform_device *pdev) +static void powernv_led_remove(struct platform_device *pdev) { struct powernv_led_common *powernv_led_common; @@ -321,7 +321,6 @@ static int powernv_led_remove(struct platform_device *pdev) mutex_destroy(&powernv_led_common->lock); dev_info(&pdev->dev, "PowerNV led module unregistered\n"); - return 0; } /* Platform driver property match */ @@ -335,7 +334,7 @@ MODULE_DEVICE_TABLE(of, powernv_led_match); static struct platform_driver powernv_led_driver = { .probe = powernv_led_probe, - .remove = powernv_led_remove, + .remove_new = powernv_led_remove, .driver = { .name = "powernv-led-driver", .of_match_table = powernv_led_match, diff --git a/drivers/leds/leds-rb532.c b/drivers/leds/leds-rb532.c index b6447c1721b4df..e66f73879c8e39 100644 --- a/drivers/leds/leds-rb532.c +++ b/drivers/leds/leds-rb532.c @@ -42,15 +42,14 @@ static int rb532_led_probe(struct platform_device *pdev) return led_classdev_register(&pdev->dev, &rb532_uled); } -static int rb532_led_remove(struct platform_device *pdev) +static void rb532_led_remove(struct platform_device *pdev) { led_classdev_unregister(&rb532_uled); - return 0; } static struct platform_driver rb532_led_driver = { .probe = rb532_led_probe, - .remove = rb532_led_remove, + .remove_new = rb532_led_remove, .driver = { .name = "rb532-led", }, diff --git a/drivers/leds/leds-regulator.c b/drivers/leds/leds-regulator.c index 8a8b73b4e35871..848e929c4a61c8 100644 --- a/drivers/leds/leds-regulator.c +++ b/drivers/leds/leds-regulator.c @@ -173,13 +173,12 @@ static int regulator_led_probe(struct platform_device *pdev) return 0; } -static int regulator_led_remove(struct platform_device *pdev) +static void regulator_led_remove(struct platform_device *pdev) { struct regulator_led *led = platform_get_drvdata(pdev); led_classdev_unregister(&led->cdev); regulator_led_disable(led); - return 0; } static const struct of_device_id regulator_led_of_match[] = { @@ -194,7 +193,7 @@ static struct platform_driver regulator_led_driver = { .of_match_table = regulator_led_of_match, }, .probe = regulator_led_probe, - .remove = regulator_led_remove, + .remove_new = regulator_led_remove, }; module_platform_driver(regulator_led_driver); diff --git a/drivers/leds/leds-sc27xx-bltc.c b/drivers/leds/leds-sc27xx-bltc.c index e199ea15e40680..af1f00a2f3288c 100644 --- a/drivers/leds/leds-sc27xx-bltc.c +++ b/drivers/leds/leds-sc27xx-bltc.c @@ -330,12 +330,11 @@ static int sc27xx_led_probe(struct platform_device *pdev) return err; } -static int sc27xx_led_remove(struct platform_device *pdev) +static void sc27xx_led_remove(struct platform_device *pdev) { struct sc27xx_led_priv *priv = platform_get_drvdata(pdev); mutex_destroy(&priv->lock); - return 0; } static const struct of_device_id sc27xx_led_of_match[] = { @@ -350,7 +349,7 @@ static struct platform_driver sc27xx_led_driver = { .of_match_table = sc27xx_led_of_match, }, .probe = sc27xx_led_probe, - .remove = sc27xx_led_remove, + .remove_new = sc27xx_led_remove, }; module_platform_driver(sc27xx_led_driver); diff --git a/drivers/leds/leds-sunfire.c b/drivers/leds/leds-sunfire.c index eba7313719bffb..6fd89efb420aa3 100644 --- a/drivers/leds/leds-sunfire.c +++ b/drivers/leds/leds-sunfire.c @@ -163,15 +163,13 @@ static int sunfire_led_generic_probe(struct platform_device *pdev, return 0; } -static int sunfire_led_generic_remove(struct platform_device *pdev) +static void sunfire_led_generic_remove(struct platform_device *pdev) { struct sunfire_drvdata *p = platform_get_drvdata(pdev); int i; for (i = 0; i < NUM_LEDS_PER_BOARD; i++) led_classdev_unregister(&p->leds[i].led_cdev); - - return 0; } static struct led_type clockboard_led_types[NUM_LEDS_PER_BOARD] = { @@ -221,7 +219,7 @@ MODULE_ALIAS("platform:sunfire-fhc-leds"); static struct platform_driver sunfire_clockboard_led_driver = { .probe = sunfire_clockboard_led_probe, - .remove = sunfire_led_generic_remove, + .remove_new = sunfire_led_generic_remove, .driver = { .name = "sunfire-clockboard-leds", }, @@ -229,7 +227,7 @@ static struct platform_driver sunfire_clockboard_led_driver = { static struct platform_driver sunfire_fhc_led_driver = { .probe = sunfire_fhc_led_probe, - .remove = sunfire_led_generic_remove, + .remove_new = sunfire_led_generic_remove, .driver = { .name = "sunfire-fhc-leds", }, diff --git a/drivers/leds/leds-wm831x-status.c b/drivers/leds/leds-wm831x-status.c index c48b80574f0243..70b32d80f9602b 100644 --- a/drivers/leds/leds-wm831x-status.c +++ b/drivers/leds/leds-wm831x-status.c @@ -280,13 +280,11 @@ static int wm831x_status_probe(struct platform_device *pdev) return 0; } -static int wm831x_status_remove(struct platform_device *pdev) +static void wm831x_status_remove(struct platform_device *pdev) { struct wm831x_status *drvdata = platform_get_drvdata(pdev); led_classdev_unregister(&drvdata->cdev); - - return 0; } static struct platform_driver wm831x_status_driver = { @@ -294,7 +292,7 @@ static struct platform_driver wm831x_status_driver = { .name = "wm831x-status", }, .probe = wm831x_status_probe, - .remove = wm831x_status_remove, + .remove_new = wm831x_status_remove, }; module_platform_driver(wm831x_status_driver); diff --git a/drivers/leds/leds-wm8350.c b/drivers/leds/leds-wm8350.c index 8f243c4137234b..61cbefa05710e8 100644 --- a/drivers/leds/leds-wm8350.c +++ b/drivers/leds/leds-wm8350.c @@ -242,13 +242,12 @@ static int wm8350_led_probe(struct platform_device *pdev) return led_classdev_register(&pdev->dev, &led->cdev); } -static int wm8350_led_remove(struct platform_device *pdev) +static void wm8350_led_remove(struct platform_device *pdev) { struct wm8350_led *led = platform_get_drvdata(pdev); led_classdev_unregister(&led->cdev); wm8350_led_disable(led); - return 0; } static struct platform_driver wm8350_led_driver = { @@ -256,7 +255,7 @@ static struct platform_driver wm8350_led_driver = { .name = "wm8350-led", }, .probe = wm8350_led_probe, - .remove = wm8350_led_remove, + .remove_new = wm8350_led_remove, .shutdown = wm8350_led_shutdown, }; diff --git a/drivers/leds/rgb/leds-qcom-lpg.c b/drivers/leds/rgb/leds-qcom-lpg.c index 7d93e02a030a25..bf03abb94e684b 100644 --- a/drivers/leds/rgb/leds-qcom-lpg.c +++ b/drivers/leds/rgb/leds-qcom-lpg.c @@ -1364,13 +1364,11 @@ static int lpg_probe(struct platform_device *pdev) return lpg_add_pwm(lpg); } -static int lpg_remove(struct platform_device *pdev) +static void lpg_remove(struct platform_device *pdev) { struct lpg *lpg = platform_get_drvdata(pdev); pwmchip_remove(&lpg->pwm); - - return 0; } static const struct lpg_data pm8916_pwm_data = { @@ -1532,7 +1530,7 @@ MODULE_DEVICE_TABLE(of, lpg_of_table); static struct platform_driver lpg_driver = { .probe = lpg_probe, - .remove = lpg_remove, + .remove_new = lpg_remove, .driver = { .name = "qcom-spmi-lpg", .of_match_table = lpg_of_table, From cecdfff8f5c82816d8b9ef2f4b3d7f4943dfd360 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:10:20 -0700 Subject: [PATCH 061/515] leds: mt6360: Annotate struct mt6360_priv with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct mt6360_priv. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Reviewed-by: AngeloGioacchino Del Regno Link: https://lore.kernel.org/r/20230915201020.never.433-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/flash/leds-mt6360.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/flash/leds-mt6360.c b/drivers/leds/flash/leds-mt6360.c index 81401c481e2b9c..a90de82f456837 100644 --- a/drivers/leds/flash/leds-mt6360.c +++ b/drivers/leds/flash/leds-mt6360.c @@ -91,7 +91,7 @@ struct mt6360_priv { unsigned int fled_torch_used; unsigned int leds_active; unsigned int leds_count; - struct mt6360_led leds[]; + struct mt6360_led leds[] __counted_by(leds_count); }; static int mt6360_mc_brightness_set(struct led_classdev *lcdev, From 799107c1bb9049f9b3f28b5d651e336d09856019 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 15 Sep 2023 13:10:52 -0700 Subject: [PATCH 062/515] leds: mt6370: Annotate struct mt6370_priv with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct mt6370_priv. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Reviewed-by: AngeloGioacchino Del Regno Link: https://lore.kernel.org/r/20230915201051.never.429-kees@kernel.org Signed-off-by: Lee Jones --- drivers/leds/flash/leds-mt6370-flash.c | 2 +- drivers/leds/rgb/leds-mt6370-rgb.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/leds/flash/leds-mt6370-flash.c b/drivers/leds/flash/leds-mt6370-flash.c index 931067c8a75f0e..912d9d6223207f 100644 --- a/drivers/leds/flash/leds-mt6370-flash.c +++ b/drivers/leds/flash/leds-mt6370-flash.c @@ -81,7 +81,7 @@ struct mt6370_priv { unsigned int fled_torch_used; unsigned int leds_active; unsigned int leds_count; - struct mt6370_led leds[]; + struct mt6370_led leds[] __counted_by(leds_count); }; static int mt6370_torch_brightness_set(struct led_classdev *lcdev, enum led_brightness level) diff --git a/drivers/leds/rgb/leds-mt6370-rgb.c b/drivers/leds/rgb/leds-mt6370-rgb.c index bb62431efe8368..448d0da118480e 100644 --- a/drivers/leds/rgb/leds-mt6370-rgb.c +++ b/drivers/leds/rgb/leds-mt6370-rgb.c @@ -153,7 +153,7 @@ struct mt6370_priv { const struct mt6370_pdata *pdata; unsigned int leds_count; unsigned int leds_active; - struct mt6370_led leds[]; + struct mt6370_led leds[] __counted_by(leds_count); }; static const struct reg_field common_reg_fields[F_MAX_FIELDS] = { From 823313068617bf2414c6067504b4e2ce5768e601 Mon Sep 17 00:00:00 2001 From: Vignesh Viswanathan Date: Tue, 5 Sep 2023 15:25:35 +0530 Subject: [PATCH 063/515] hwspinlock: qcom: Remove IPQ6018 SOC specific compatible IPQ6018 has 32 tcsr_mutex hwlock registers with stride 0x1000. The compatible string qcom,ipq6018-tcsr-mutex is mapped to of_msm8226_tcsr_mutex which has 32 locks configured with stride of 0x80 and doesn't match the HW present in IPQ6018. Remove IPQ6018 specific compatible string so that it fallsback to of_tcsr_mutex data which maps to the correct configuration for IPQ6018. Changes in v2: - Updated commit message - Added Fixes and stable tags Cc: stable@vger.kernel.org Fixes: 5d4753f741d8 ("hwspinlock: qcom: add support for MMIO on older SoCs") Signed-off-by: Vignesh Viswanathan Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20230905095535.1263113-3-quic_viswanat@quicinc.com Signed-off-by: Bjorn Andersson --- drivers/hwspinlock/qcom_hwspinlock.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/hwspinlock/qcom_hwspinlock.c b/drivers/hwspinlock/qcom_hwspinlock.c index a0fd67fd293444..814dfe8697bf36 100644 --- a/drivers/hwspinlock/qcom_hwspinlock.c +++ b/drivers/hwspinlock/qcom_hwspinlock.c @@ -115,7 +115,6 @@ static const struct of_device_id qcom_hwspinlock_of_match[] = { { .compatible = "qcom,sfpb-mutex", .data = &of_sfpb_mutex }, { .compatible = "qcom,tcsr-mutex", .data = &of_tcsr_mutex }, { .compatible = "qcom,apq8084-tcsr-mutex", .data = &of_msm8226_tcsr_mutex }, - { .compatible = "qcom,ipq6018-tcsr-mutex", .data = &of_msm8226_tcsr_mutex }, { .compatible = "qcom,msm8226-tcsr-mutex", .data = &of_msm8226_tcsr_mutex }, { .compatible = "qcom,msm8974-tcsr-mutex", .data = &of_msm8226_tcsr_mutex }, { .compatible = "qcom,msm8994-tcsr-mutex", .data = &of_msm8226_tcsr_mutex }, From 130afb8ce11175d3a697b2e90d1dccfbdb3fd0f9 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Wed, 13 Sep 2023 16:54:14 -0700 Subject: [PATCH 064/515] module: Clarify documentation of module_param_call() Commit 9bbb9e5a3310 ("param: use ops in struct kernel_param, rather than get and set fns directly") added the comment that module_param_call() was deprecated, during a large scale refactoring to bring sanity to type casting back then. In 2017 following more cleanups, it became useful again as it wraps a common pattern of creating an ops struct for a given get/set pair: b2f270e87473 ("module: Prepare to convert all module_param_call() prototypes") ece1996a21ee ("module: Do not paper over type mismatches in module_param_call()") static const struct kernel_param_ops __param_ops_##name = \ { .flags = 0, .set = _set, .get = _get }; \ __module_param_call(MODULE_PARAM_PREFIX, \ name, &__param_ops_##name, arg, perm, -1, 0) __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, 0) Many users of module_param_cb() appear to be almost universally open-coding the same thing that module_param_call() does now. Don't discourage[1] people from using module_param_call(): clarify the comment to show that module_param_cb() is useful if you repeatedly use the same pair of get/set functions. [1] https://lore.kernel.org/lkml/202308301546.5C789E5EC@keescook/ Cc: Luis Chamberlain Cc: Johan Hovold Cc: Jessica Yu Cc: Sagi Grimberg Cc: Nick Desaulniers Cc: Miguel Ojeda Cc: Joe Perches Cc: linux-modules@vger.kernel.org Reviewed-by: Miguel Ojeda Signed-off-by: Kees Cook Signed-off-by: Luis Chamberlain --- include/linux/moduleparam.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 962cd41a2cb5af..d4452f93d060c0 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -293,7 +293,11 @@ struct kparam_array = { __param_str_##name, THIS_MODULE, ops, \ VERIFY_OCTAL_PERMISSIONS(perm), level, flags, { arg } } -/* Obsolete - use module_param_cb() */ +/* + * Useful for describing a set/get pair used only once (i.e. for this + * parameter). For repeated set/get pairs (i.e. the same struct + * kernel_param_ops), use module_param_cb() instead. + */ #define module_param_call(name, _set, _get, arg, perm) \ static const struct kernel_param_ops __param_ops_##name = \ { .flags = 0, .set = _set, .get = _get }; \ From c7540b27da9e97ccb3d5f0528e7a6c762e5241d2 Mon Sep 17 00:00:00 2001 From: Luis Chamberlain Date: Wed, 20 Sep 2023 14:07:58 -0700 Subject: [PATCH 065/515] MAINTAINERS: add include/linux/module*.h to modules Use glob include/linux/module*.h to capture all module changes. Suggested-by: Kees Cook Signed-off-by: Luis Chamberlain --- MAINTAINERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 3be1bdfe8ecc7f..b78cf8dc7f1637 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -14289,7 +14289,7 @@ L: linux-kernel@vger.kernel.org S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules-next F: include/linux/kmod.h -F: include/linux/module.h +F: include/linux/module*.h F: kernel/module/ F: lib/test_kmod.c F: scripts/module* From b72d5a66766df63cc8d5c01c1363d1fedcb72f54 Mon Sep 17 00:00:00 2001 From: Andrea Righi Date: Wed, 30 Aug 2023 17:58:20 +0200 Subject: [PATCH 066/515] module/decompress: use vmalloc() for gzip decompression workspace Use a similar approach as commit a419beac4a07 ("module/decompress: use vmalloc() for zstd decompression workspace") and replace kmalloc() with vmalloc() also for the gzip module decompression workspace. In this case the workspace is represented by struct inflate_workspace that can be fairly large for kmalloc() and it can potentially lead to allocation errors on certain systems: $ pahole inflate_workspace struct inflate_workspace { struct inflate_state inflate_state; /* 0 9544 */ /* --- cacheline 149 boundary (9536 bytes) was 8 bytes ago --- */ unsigned char working_window[32768]; /* 9544 32768 */ /* size: 42312, cachelines: 662, members: 2 */ /* last cacheline: 8 bytes */ }; Considering that there is no need to use continuous physical memory, simply switch to vmalloc() to provide a more reliable in-kernel module decompression. Fixes: b1ae6dc41eaa ("module: add in-kernel support for decompressing") Signed-off-by: Andrea Righi Signed-off-by: Luis Chamberlain --- kernel/module/decompress.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/module/decompress.c b/kernel/module/decompress.c index 87440f714c0ca2..4156d59be44081 100644 --- a/kernel/module/decompress.c +++ b/kernel/module/decompress.c @@ -100,7 +100,7 @@ static ssize_t module_gzip_decompress(struct load_info *info, s.next_in = buf + gzip_hdr_len; s.avail_in = size - gzip_hdr_len; - s.workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); + s.workspace = vmalloc(zlib_inflate_workspacesize()); if (!s.workspace) return -ENOMEM; @@ -138,7 +138,7 @@ static ssize_t module_gzip_decompress(struct load_info *info, out_inflate_end: zlib_inflateEnd(&s); out: - kfree(s.workspace); + vfree(s.workspace); return retval; } #elif defined(CONFIG_MODULE_COMPRESS_XZ) From bac202d3712f6328dbe9f55df66309c8170fc51a Mon Sep 17 00:00:00 2001 From: Tiezhu Yang Date: Fri, 16 Jun 2023 09:51:32 +0800 Subject: [PATCH 067/515] module: Make is_mapping_symbol() return bool The return value of is_mapping_symbol() is true or false, so change its type to reflect that. Suggested-by: Xi Zhang Signed-off-by: Tiezhu Yang Signed-off-by: Luis Chamberlain --- include/linux/module_symbol.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/module_symbol.h b/include/linux/module_symbol.h index 1269543d0634b2..77c9895b9ddb19 100644 --- a/include/linux/module_symbol.h +++ b/include/linux/module_symbol.h @@ -3,7 +3,7 @@ #define _LINUX_MODULE_SYMBOL_H /* This ignores the intensely annoying "mapping symbols" found in ELF files. */ -static inline int is_mapping_symbol(const char *str) +static inline bool is_mapping_symbol(const char *str) { if (str[0] == '.' && str[1] == 'L') return true; From dc95e422c2835c2fb201883965f31e9873a28b3a Mon Sep 17 00:00:00 2001 From: Tiezhu Yang Date: Fri, 16 Jun 2023 09:51:33 +0800 Subject: [PATCH 068/515] module: Make is_valid_name() return bool The return value of is_valid_name() is true or false, so change its type to reflect that. Signed-off-by: Tiezhu Yang Signed-off-by: Luis Chamberlain --- scripts/mod/modpost.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index b29b29707f1046..72e1d5b01715f9 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -1046,12 +1046,12 @@ static int secref_whitelist(const char *fromsec, const char *fromsym, * only by merging __exit and __init sections into __text, bloating * the kernel (which is especially evil on embedded platforms). */ -static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym) +static inline bool is_valid_name(struct elf_info *elf, Elf_Sym *sym) { const char *name = elf->strtab + sym->st_name; if (!name || !strlen(name)) - return 0; + return false; return !is_mapping_symbol(name); } From 331e833a7606c09cd40ba7aedbd113057fe3667d Mon Sep 17 00:00:00 2001 From: Zhu Mao Date: Wed, 20 Sep 2023 17:13:09 -0700 Subject: [PATCH 069/515] module: Fix comment typo Delete duplicated word in comment. Signed-off-by: Zhu Mao Signed-off-by: Luis Chamberlain --- kernel/module/stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/module/stats.c b/kernel/module/stats.c index 6ab2c94d6bc32f..3ba0e98b3c9103 100644 --- a/kernel/module/stats.c +++ b/kernel/module/stats.c @@ -126,7 +126,7 @@ static LIST_HEAD(dup_failed_modules); * These typically should not happen unless your system is under memory * pressure. * * invalid_becoming_bytes: total number of bytes allocated and freed used - * used to read the kernel module userspace wants us to read before we + * to read the kernel module userspace wants us to read before we * promote it to be processed to be added to our @modules linked list. These * failures can happen if we had a check in between a successful kernel_read_file_from_fd() * call and right before we allocate the our private memory for the module From e62db9d5be9bc96e121013b35987dfa850c040f9 Mon Sep 17 00:00:00 2001 From: Stefan Eichenberger Date: Mon, 18 Sep 2023 16:32:38 +0200 Subject: [PATCH 070/515] leds: lp55xx: Use gpiod_set_value_cansleep() Use gpiod_set_value_cansleep in the init_device function. Without this change, the driver may print a warning if the LP55xx enable pin is connected to a GPIO chip which can sleep (e.g. a GPIO expander): WARNING: CPU: 0 PID: 2719 at drivers/gpio/gpiolib.c:3051 gpiod_set_value+0x64/0xbc Signed-off-by: Stefan Eichenberger Link: https://lore.kernel.org/r/20230918143238.75600-1-eichest@gmail.com Signed-off-by: Lee Jones --- drivers/leds/leds-lp55xx-common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c index 77bb26906ea6e4..8e7074f0fee002 100644 --- a/drivers/leds/leds-lp55xx-common.c +++ b/drivers/leds/leds-lp55xx-common.c @@ -442,9 +442,9 @@ int lp55xx_init_device(struct lp55xx_chip *chip) gpiod_direction_output(pdata->enable_gpiod, 0); gpiod_set_consumer_name(pdata->enable_gpiod, "LP55xx enable"); - gpiod_set_value(pdata->enable_gpiod, 0); + gpiod_set_value_cansleep(pdata->enable_gpiod, 0); usleep_range(1000, 2000); /* Keep enable down at least 1ms */ - gpiod_set_value(pdata->enable_gpiod, 1); + gpiod_set_value_cansleep(pdata->enable_gpiod, 1); usleep_range(1000, 2000); /* 500us abs min. */ } From 28350bc0ac77e17365ba87d3edb2db0a79c98fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Beh=C3=BAn?= Date: Mon, 18 Sep 2023 18:11:01 +0200 Subject: [PATCH 071/515] leds: turris-omnia: Do not use SMBUS calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The leds-turris-omnia driver uses three function for I2C access: - i2c_smbus_write_byte_data() and i2c_smbus_read_byte_data(), which cause an emulated SMBUS transfer, - i2c_master_send(), which causes an ordinary I2C transfer. The Turris Omnia MCU LED controller is not semantically SMBUS, it operates as a simple I2C bus. It does not implement any of the SMBUS specific features, like PEC, or procedure calls, or anything. Moreover the I2C controller driver also does not implement SMBUS, and so the emulated SMBUS procedure from drivers/i2c/i2c-core-smbus.c is used for the SMBUS calls, which gives an unnecessary overhead. When I first wrote the driver, I was unaware of these facts, and I simply used the first function that worked. Drop the I2C SMBUS calls and instead use simple I2C transfers. Fixes: 089381b27abe ("leds: initial support for Turris Omnia LEDs") Signed-off-by: Marek Behún Link: https://lore.kernel.org/r/20230918161104.20860-2-kabel@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-turris-omnia.c | 54 +++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c index b8a95a917cfa49..b13a547e72c49d 100644 --- a/drivers/leds/leds-turris-omnia.c +++ b/drivers/leds/leds-turris-omnia.c @@ -2,7 +2,7 @@ /* * CZ.NIC's Turris Omnia LEDs driver * - * 2020 by Marek Behún + * 2020, 2023 by Marek Behún */ #include @@ -41,6 +41,37 @@ struct omnia_leds { struct omnia_led leds[]; }; +static int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd, u8 val) +{ + u8 buf[2] = { cmd, val }; + + return i2c_master_send(client, buf, sizeof(buf)); +} + +static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd) +{ + struct i2c_msg msgs[2]; + u8 reply; + int ret; + + msgs[0].addr = client->addr; + msgs[0].flags = 0; + msgs[0].len = 1; + msgs[0].buf = &cmd; + msgs[1].addr = client->addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len = 1; + msgs[1].buf = &reply; + + ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + if (likely(ret == ARRAY_SIZE(msgs))) + return reply; + else if (ret < 0) + return ret; + else + return -EIO; +} + static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, enum led_brightness brightness) { @@ -64,7 +95,7 @@ static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, if (buf[2] || buf[3] || buf[4]) state |= CMD_LED_STATE_ON; - ret = i2c_smbus_write_byte_data(leds->client, CMD_LED_STATE, state); + ret = omnia_cmd_write_u8(leds->client, CMD_LED_STATE, state); if (ret >= 0 && (state & CMD_LED_STATE_ON)) ret = i2c_master_send(leds->client, buf, 5); @@ -114,9 +145,9 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, cdev->brightness_set_blocking = omnia_led_brightness_set_blocking; /* put the LED into software mode */ - ret = i2c_smbus_write_byte_data(client, CMD_LED_MODE, - CMD_LED_MODE_LED(led->reg) | - CMD_LED_MODE_USER); + ret = omnia_cmd_write_u8(client, CMD_LED_MODE, + CMD_LED_MODE_LED(led->reg) | + CMD_LED_MODE_USER); if (ret < 0) { dev_err(dev, "Cannot set LED %pOF to software mode: %i\n", np, ret); @@ -124,8 +155,8 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, } /* disable the LED */ - ret = i2c_smbus_write_byte_data(client, CMD_LED_STATE, - CMD_LED_STATE_LED(led->reg)); + ret = omnia_cmd_write_u8(client, CMD_LED_STATE, + CMD_LED_STATE_LED(led->reg)); if (ret < 0) { dev_err(dev, "Cannot set LED %pOF brightness: %i\n", np, ret); return ret; @@ -158,7 +189,7 @@ static ssize_t brightness_show(struct device *dev, struct device_attribute *a, struct i2c_client *client = to_i2c_client(dev); int ret; - ret = i2c_smbus_read_byte_data(client, CMD_LED_GET_BRIGHTNESS); + ret = omnia_cmd_read_u8(client, CMD_LED_GET_BRIGHTNESS); if (ret < 0) return ret; @@ -179,8 +210,7 @@ static ssize_t brightness_store(struct device *dev, struct device_attribute *a, if (brightness > 100) return -EINVAL; - ret = i2c_smbus_write_byte_data(client, CMD_LED_SET_BRIGHTNESS, - (u8)brightness); + ret = omnia_cmd_write_u8(client, CMD_LED_SET_BRIGHTNESS, brightness); return ret < 0 ? ret : count; } @@ -237,8 +267,8 @@ static void omnia_leds_remove(struct i2c_client *client) u8 buf[5]; /* put all LEDs into default (HW triggered) mode */ - i2c_smbus_write_byte_data(client, CMD_LED_MODE, - CMD_LED_MODE_LED(OMNIA_BOARD_LEDS)); + omnia_cmd_write_u8(client, CMD_LED_MODE, + CMD_LED_MODE_LED(OMNIA_BOARD_LEDS)); /* set all LEDs color to [255, 255, 255] */ buf[0] = CMD_LED_COLOR; From 4d5ed2621c2437d40b8fe92bd0fd34b0b1870753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Beh=C3=BAn?= Date: Mon, 18 Sep 2023 18:11:02 +0200 Subject: [PATCH 072/515] leds: turris-omnia: Make set_brightness() more efficient MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement caching of the LED color and state values that are sent to MCU in order to make the set_brightness() operation more efficient by avoiding I2C transactions which are not needed. On Turris Omnia's MCU, which acts as the RGB LED controller, each LED has a RGB color, and a ON/OFF state, which are configurable via I2C commands CMD_LED_COLOR and CMD_LED_STATE. The CMD_LED_COLOR command sends 5 bytes and the CMD_LED_STATE command 2 bytes over the I2C bus, which operates at 100 kHz. With I2C overhead this allows ~1670 color changing commands and ~3200 state changing commands per second (or around 1000 color + state changes per second). This may seem more than enough, but the issue is that the I2C bus is shared with another peripheral, the MCU. The MCU exposes an interrupt interface, and it can trigger hundreds of interrupts per second. Each time, we need to read the interrupt state register over this I2C bus. Whenever we are sending a LED color/state changing command, the interrupt reading is waiting. Currently, every time LED brightness or LED multi intensity is changed, we send a CMD_LED_STATE command, and if the computed color (brightness adjusted multi_intensity) is non-zero, we also send a CMD_LED_COLOR command. Consider for example the situation when we have a netdev trigger enabled for a LED. The netdev trigger does not change the LED color, only the brightness (either to 0 or to currently configured brightness), and so there is no need to send the CMD_LED_COLOR command. But each change of brightness to 0 sends one CMD_LED_STATE command, and each change of brightness to max_brightness sends one CMD_LED_STATE command and one CMD_LED_COLOR command: set_brightness(0) -> CMD_LED_STATE set_brightness(255) -> CMD_LED_STATE + CMD_LED_COLOR (unnecessary) We can avoid the unnecessary I2C transactions if we cache the values of state and color that are sent to the controller. If the color does not change from the one previously sent, there is no need to do the CMD_LED_COLOR I2C transaction, and if the state does not change, there is no need to do the CMD_LED_STATE transaction. Because we need to make sure that our cached values are consistent with the controller state, add explicit setting of the LED color to white at probe time (this is the default setting when MCU resets, but does not necessarily need to be the case, for example if U-Boot played with the LED colors). Signed-off-by: Marek Behún Link: https://lore.kernel.org/r/20230918161104.20860-3-kabel@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-turris-omnia.c | 96 ++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c index b13a547e72c49d..16ea9d56062a34 100644 --- a/drivers/leds/leds-turris-omnia.c +++ b/drivers/leds/leds-turris-omnia.c @@ -30,6 +30,8 @@ struct omnia_led { struct led_classdev_mc mc_cdev; struct mc_subled subled_info[OMNIA_LED_NUM_CHANNELS]; + u8 cached_channels[OMNIA_LED_NUM_CHANNELS]; + bool on; int reg; }; @@ -72,36 +74,82 @@ static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd) return -EIO; } +static int omnia_led_send_color_cmd(const struct i2c_client *client, + struct omnia_led *led) +{ + char cmd[5]; + int ret; + + cmd[0] = CMD_LED_COLOR; + cmd[1] = led->reg; + cmd[2] = led->subled_info[0].brightness; + cmd[3] = led->subled_info[1].brightness; + cmd[4] = led->subled_info[2].brightness; + + /* Send the color change command */ + ret = i2c_master_send(client, cmd, 5); + if (ret < 0) + return ret; + + /* Cache the RGB channel brightnesses */ + for (int i = 0; i < OMNIA_LED_NUM_CHANNELS; ++i) + led->cached_channels[i] = led->subled_info[i].brightness; + + return 0; +} + +/* Determine if the computed RGB channels are different from the cached ones */ +static bool omnia_led_channels_changed(struct omnia_led *led) +{ + for (int i = 0; i < OMNIA_LED_NUM_CHANNELS; ++i) + if (led->subled_info[i].brightness != led->cached_channels[i]) + return true; + + return false; +} + static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, enum led_brightness brightness) { struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev); struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent); struct omnia_led *led = to_omnia_led(mc_cdev); - u8 buf[5], state; - int ret; + int err = 0; mutex_lock(&leds->lock); - led_mc_calc_color_components(&led->mc_cdev, brightness); + /* + * Only recalculate RGB brightnesses from intensities if brightness is + * non-zero. Otherwise we won't be using them and we can save ourselves + * some software divisions (Omnia's CPU does not implement the division + * instruction). + */ + if (brightness) { + led_mc_calc_color_components(mc_cdev, brightness); + + /* + * Send color command only if brightness is non-zero and the RGB + * channel brightnesses changed. + */ + if (omnia_led_channels_changed(led)) + err = omnia_led_send_color_cmd(leds->client, led); + } - buf[0] = CMD_LED_COLOR; - buf[1] = led->reg; - buf[2] = mc_cdev->subled_info[0].brightness; - buf[3] = mc_cdev->subled_info[1].brightness; - buf[4] = mc_cdev->subled_info[2].brightness; + /* Send on/off state change only if (bool)brightness changed */ + if (!err && !brightness != !led->on) { + u8 state = CMD_LED_STATE_LED(led->reg); - state = CMD_LED_STATE_LED(led->reg); - if (buf[2] || buf[3] || buf[4]) - state |= CMD_LED_STATE_ON; + if (brightness) + state |= CMD_LED_STATE_ON; - ret = omnia_cmd_write_u8(leds->client, CMD_LED_STATE, state); - if (ret >= 0 && (state & CMD_LED_STATE_ON)) - ret = i2c_master_send(leds->client, buf, 5); + err = omnia_cmd_write_u8(leds->client, CMD_LED_STATE, state); + if (!err) + led->on = !!brightness; + } mutex_unlock(&leds->lock); - return ret; + return err; } static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, @@ -129,11 +177,15 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, } led->subled_info[0].color_index = LED_COLOR_ID_RED; - led->subled_info[0].channel = 0; led->subled_info[1].color_index = LED_COLOR_ID_GREEN; - led->subled_info[1].channel = 1; led->subled_info[2].color_index = LED_COLOR_ID_BLUE; - led->subled_info[2].channel = 2; + + /* Initial color is white */ + for (int i = 0; i < OMNIA_LED_NUM_CHANNELS; ++i) { + led->subled_info[i].intensity = 255; + led->subled_info[i].brightness = 255; + led->subled_info[i].channel = i; + } led->mc_cdev.subled_info = led->subled_info; led->mc_cdev.num_colors = OMNIA_LED_NUM_CHANNELS; @@ -162,6 +214,14 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, return ret; } + /* Set initial color and cache it */ + ret = omnia_led_send_color_cmd(client, led); + if (ret < 0) { + dev_err(dev, "Cannot set LED %pOF initial color: %i\n", np, + ret); + return ret; + } + ret = devm_led_classdev_multicolor_register_ext(dev, &led->mc_cdev, &init_data); if (ret < 0) { From aaf38273cf766d88296f4aa3f2e4e3c0d399a4a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Beh=C3=BAn?= Date: Mon, 18 Sep 2023 18:11:03 +0200 Subject: [PATCH 073/515] leds: turris-omnia: Support HW controlled mode via private trigger MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for enabling MCU controlled mode of the Turris Omnia LEDs via a LED private trigger called "omnia-mcu". Recall that private LED triggers will only be listed in the sysfs trigger file for LEDs that support them (currently there is no user of this mechanism). When in MCU controlled mode, the user can still set LED color, but the blinking is done by MCU, which does different things for different LEDs: - WAN LED is blinked according to the LED[0] pin of the WAN PHY - LAN LEDs are blinked according to the LED[0] output of the corresponding port of the LAN switch - PCIe LEDs are blinked according to the logical OR of the MiniPCIe port LED pins In the future I want to make the netdev trigger to transparently offload the blinking to the HW if user sets compatible settings for the netdev trigger (for LEDs associated with network devices). There was some work on this already, and hopefully we will be able to complete it sometime, but for now there are still multiple blockers for this, and even if there weren't, we still would not be able to configure HW controlled mode for the LEDs associated with MiniPCIe ports. In the meantime let's support HW controlled mode via the private LED trigger mechanism. If, in the future, we manage to complete the netdev trigger offloading, we can still keep this private trigger for backwards compatibility, if needed. We also set "omnia-mcu" to cdev->default_trigger, so that the MCU keeps control until the user first wants to take over it. If a different default trigger is specified in device-tree via the 'linux,default-trigger' property, LED class will overwrite cdev->default_trigger, and so the DT property will be respected. Signed-off-by: Marek Behún Link: https://lore.kernel.org/r/20230918161104.20860-4-kabel@kernel.org Signed-off-by: Lee Jones --- drivers/leds/Kconfig | 1 + drivers/leds/leds-turris-omnia.c | 98 +++++++++++++++++++++++++++++--- 2 files changed, 91 insertions(+), 8 deletions(-) diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index b92208eccdea9a..6292fddcc55cd4 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -187,6 +187,7 @@ config LEDS_TURRIS_OMNIA depends on I2C depends on MACH_ARMADA_38X || COMPILE_TEST depends on OF + select LEDS_TRIGGERS help This option enables basic support for the LEDs found on the front side of CZ.NIC's Turris Omnia router. There are 12 RGB LEDs on the diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c index 16ea9d56062a34..ef2844d351683e 100644 --- a/drivers/leds/leds-turris-omnia.c +++ b/drivers/leds/leds-turris-omnia.c @@ -31,7 +31,7 @@ struct omnia_led { struct led_classdev_mc mc_cdev; struct mc_subled subled_info[OMNIA_LED_NUM_CHANNELS]; u8 cached_channels[OMNIA_LED_NUM_CHANNELS]; - bool on; + bool on, hwtrig; int reg; }; @@ -120,12 +120,14 @@ static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, /* * Only recalculate RGB brightnesses from intensities if brightness is - * non-zero. Otherwise we won't be using them and we can save ourselves - * some software divisions (Omnia's CPU does not implement the division - * instruction). + * non-zero (if it is zero and the LED is in HW blinking mode, we use + * max_brightness as brightness). Otherwise we won't be using them and + * we can save ourselves some software divisions (Omnia's CPU does not + * implement the division instruction). */ - if (brightness) { - led_mc_calc_color_components(mc_cdev, brightness); + if (brightness || led->hwtrig) { + led_mc_calc_color_components(mc_cdev, brightness ?: + cdev->max_brightness); /* * Send color command only if brightness is non-zero and the RGB @@ -135,8 +137,11 @@ static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, err = omnia_led_send_color_cmd(leds->client, led); } - /* Send on/off state change only if (bool)brightness changed */ - if (!err && !brightness != !led->on) { + /* + * Send on/off state change only if (bool)brightness changed and the LED + * is not being blinked by HW. + */ + if (!err && !led->hwtrig && !brightness != !led->on) { u8 state = CMD_LED_STATE_LED(led->reg); if (brightness) @@ -152,6 +157,71 @@ static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, return err; } +static struct led_hw_trigger_type omnia_hw_trigger_type; + +static int omnia_hwtrig_activate(struct led_classdev *cdev) +{ + struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev); + struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent); + struct omnia_led *led = to_omnia_led(mc_cdev); + int err = 0; + + mutex_lock(&leds->lock); + + if (!led->on) { + /* + * If the LED is off (brightness was set to 0), the last + * configured color was not necessarily sent to the MCU. + * Recompute with max_brightness and send if needed. + */ + led_mc_calc_color_components(mc_cdev, cdev->max_brightness); + + if (omnia_led_channels_changed(led)) + err = omnia_led_send_color_cmd(leds->client, led); + } + + if (!err) { + /* Put the LED into MCU controlled mode */ + err = omnia_cmd_write_u8(leds->client, CMD_LED_MODE, + CMD_LED_MODE_LED(led->reg)); + if (!err) + led->hwtrig = true; + } + + mutex_unlock(&leds->lock); + + return err; +} + +static void omnia_hwtrig_deactivate(struct led_classdev *cdev) +{ + struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent); + struct omnia_led *led = to_omnia_led(lcdev_to_mccdev(cdev)); + int err; + + mutex_lock(&leds->lock); + + led->hwtrig = false; + + /* Put the LED into software mode */ + err = omnia_cmd_write_u8(leds->client, CMD_LED_MODE, + CMD_LED_MODE_LED(led->reg) | + CMD_LED_MODE_USER); + + mutex_unlock(&leds->lock); + + if (err < 0) + dev_err(cdev->dev, "Cannot put LED to software mode: %i\n", + err); +} + +static struct led_trigger omnia_hw_trigger = { + .name = "omnia-mcu", + .activate = omnia_hwtrig_activate, + .deactivate = omnia_hwtrig_deactivate, + .trigger_type = &omnia_hw_trigger_type, +}; + static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, struct device_node *np) { @@ -195,6 +265,12 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, cdev = &led->mc_cdev.led_cdev; cdev->max_brightness = 255; cdev->brightness_set_blocking = omnia_led_brightness_set_blocking; + cdev->trigger_type = &omnia_hw_trigger_type; + /* + * Use the omnia-mcu trigger as the default trigger. It may be rewritten + * by LED class from the linux,default-trigger property. + */ + cdev->default_trigger = omnia_hw_trigger.name; /* put the LED into software mode */ ret = omnia_cmd_write_u8(client, CMD_LED_MODE, @@ -308,6 +384,12 @@ static int omnia_leds_probe(struct i2c_client *client) mutex_init(&leds->lock); + ret = devm_led_trigger_register(dev, &omnia_hw_trigger); + if (ret < 0) { + dev_err(dev, "Cannot register private LED trigger: %d\n", ret); + return ret; + } + led = &leds->leds[0]; for_each_available_child_of_node(np, child) { ret = omnia_led_register(client, led, child); From 685f192b3a0a80af8000cb90692bd4ef7bc6f7f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Beh=C3=BAn?= Date: Mon, 18 Sep 2023 18:11:04 +0200 Subject: [PATCH 074/515] leds: turris-omnia: Add support for enabling/disabling HW gamma correction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the MCU on Turris Omnia is running newer firmware versions, the LED controller supports RGB gamma correction (and enables it by default for newer boards). Determine whether the gamma correction setting feature is supported and add the ability to set it via sysfs attribute file. Signed-off-by: Marek Behún Link: https://lore.kernel.org/r/20230918161104.20860-5-kabel@kernel.org Signed-off-by: Lee Jones --- .../sysfs-class-led-driver-turris-omnia | 14 ++ drivers/leds/leds-turris-omnia.c | 137 +++++++++++++++--- 2 files changed, 134 insertions(+), 17 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-class-led-driver-turris-omnia b/Documentation/ABI/testing/sysfs-class-led-driver-turris-omnia index c4d46970c1cf92..369b4ae8be5f43 100644 --- a/Documentation/ABI/testing/sysfs-class-led-driver-turris-omnia +++ b/Documentation/ABI/testing/sysfs-class-led-driver-turris-omnia @@ -12,3 +12,17 @@ Description: (RW) On the front panel of the Turris Omnia router there is also able to change this setting from software. Format: %i + +What: /sys/class/leds//device/gamma_correction +Date: August 2023 +KernelVersion: 6.6 +Contact: Marek Behún +Description: (RW) Newer versions of the microcontroller firmware of the + Turris Omnia router support gamma correction for the RGB LEDs. + This feature can be enabled/disabled by writing to this file. + + If the feature is not supported because the MCU firmware is too + old, the file always reads as 0, and writing to the file results + in the EOPNOTSUPP error. + + Format: %i diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c index ef2844d351683e..f27241896970a3 100644 --- a/drivers/leds/leds-turris-omnia.c +++ b/drivers/leds/leds-turris-omnia.c @@ -15,17 +15,30 @@ #define OMNIA_BOARD_LEDS 12 #define OMNIA_LED_NUM_CHANNELS 3 -#define CMD_LED_MODE 3 -#define CMD_LED_MODE_LED(l) ((l) & 0x0f) -#define CMD_LED_MODE_USER 0x10 +/* MCU controller commands at I2C address 0x2a */ +#define OMNIA_MCU_I2C_ADDR 0x2a -#define CMD_LED_STATE 4 -#define CMD_LED_STATE_LED(l) ((l) & 0x0f) -#define CMD_LED_STATE_ON 0x10 +#define CMD_GET_STATUS_WORD 0x01 +#define STS_FEATURES_SUPPORTED BIT(2) -#define CMD_LED_COLOR 5 -#define CMD_LED_SET_BRIGHTNESS 7 -#define CMD_LED_GET_BRIGHTNESS 8 +#define CMD_GET_FEATURES 0x10 +#define FEAT_LED_GAMMA_CORRECTION BIT(5) + +/* LED controller commands at I2C address 0x2b */ +#define CMD_LED_MODE 0x03 +#define CMD_LED_MODE_LED(l) ((l) & 0x0f) +#define CMD_LED_MODE_USER 0x10 + +#define CMD_LED_STATE 0x04 +#define CMD_LED_STATE_LED(l) ((l) & 0x0f) +#define CMD_LED_STATE_ON 0x10 + +#define CMD_LED_COLOR 0x05 +#define CMD_LED_SET_BRIGHTNESS 0x07 +#define CMD_LED_GET_BRIGHTNESS 0x08 + +#define CMD_SET_GAMMA_CORRECTION 0x30 +#define CMD_GET_GAMMA_CORRECTION 0x31 struct omnia_led { struct led_classdev_mc mc_cdev; @@ -40,6 +53,7 @@ struct omnia_led { struct omnia_leds { struct i2c_client *client; struct mutex lock; + bool has_gamma_correction; struct omnia_led leds[]; }; @@ -50,30 +64,42 @@ static int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd, u8 val) return i2c_master_send(client, buf, sizeof(buf)); } -static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd) +static int omnia_cmd_read_raw(struct i2c_adapter *adapter, u8 addr, u8 cmd, + void *reply, size_t len) { struct i2c_msg msgs[2]; - u8 reply; int ret; - msgs[0].addr = client->addr; + msgs[0].addr = addr; msgs[0].flags = 0; msgs[0].len = 1; msgs[0].buf = &cmd; - msgs[1].addr = client->addr; + msgs[1].addr = addr; msgs[1].flags = I2C_M_RD; - msgs[1].len = 1; - msgs[1].buf = &reply; + msgs[1].len = len; + msgs[1].buf = reply; - ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs)); if (likely(ret == ARRAY_SIZE(msgs))) - return reply; + return len; else if (ret < 0) return ret; else return -EIO; } +static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd) +{ + u8 reply; + int ret; + + ret = omnia_cmd_read_raw(client->adapter, client->addr, cmd, &reply, 1); + if (ret < 0) + return ret; + + return reply; +} + static int omnia_led_send_color_cmd(const struct i2c_client *client, struct omnia_led *led) { @@ -352,12 +378,74 @@ static ssize_t brightness_store(struct device *dev, struct device_attribute *a, } static DEVICE_ATTR_RW(brightness); +static ssize_t gamma_correction_show(struct device *dev, + struct device_attribute *a, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct omnia_leds *leds = i2c_get_clientdata(client); + int ret; + + if (leds->has_gamma_correction) { + ret = omnia_cmd_read_u8(client, CMD_GET_GAMMA_CORRECTION); + if (ret < 0) + return ret; + } else { + ret = 0; + } + + return sysfs_emit(buf, "%d\n", !!ret); +} + +static ssize_t gamma_correction_store(struct device *dev, + struct device_attribute *a, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct omnia_leds *leds = i2c_get_clientdata(client); + bool val; + int ret; + + if (!leds->has_gamma_correction) + return -EOPNOTSUPP; + + if (kstrtobool(buf, &val) < 0) + return -EINVAL; + + ret = omnia_cmd_write_u8(client, CMD_SET_GAMMA_CORRECTION, val); + + return ret < 0 ? ret : count; +} +static DEVICE_ATTR_RW(gamma_correction); + static struct attribute *omnia_led_controller_attrs[] = { &dev_attr_brightness.attr, + &dev_attr_gamma_correction.attr, NULL, }; ATTRIBUTE_GROUPS(omnia_led_controller); +static int omnia_mcu_get_features(const struct i2c_client *client) +{ + u16 reply; + int err; + + err = omnia_cmd_read_raw(client->adapter, OMNIA_MCU_I2C_ADDR, + CMD_GET_STATUS_WORD, &reply, sizeof(reply)); + if (err < 0) + return err; + + /* Check whether MCU firmware supports the CMD_GET_FEAUTRES command */ + if (!(le16_to_cpu(reply) & STS_FEATURES_SUPPORTED)) + return 0; + + err = omnia_cmd_read_raw(client->adapter, OMNIA_MCU_I2C_ADDR, + CMD_GET_FEATURES, &reply, sizeof(reply)); + if (err < 0) + return err; + + return le16_to_cpu(reply); +} + static int omnia_leds_probe(struct i2c_client *client) { struct device *dev = &client->dev; @@ -382,6 +470,21 @@ static int omnia_leds_probe(struct i2c_client *client) leds->client = client; i2c_set_clientdata(client, leds); + ret = omnia_mcu_get_features(client); + if (ret < 0) { + dev_err(dev, "Cannot determine MCU supported features: %d\n", + ret); + return ret; + } + + leds->has_gamma_correction = ret & FEAT_LED_GAMMA_CORRECTION; + if (!leds->has_gamma_correction) { + dev_info(dev, + "Your board's MCU firmware does not support the LED gamma correction feature.\n"); + dev_info(dev, + "Consider upgrading MCU firmware with the omnia-mcutool utility.\n"); + } + mutex_init(&leds->lock); ret = devm_led_trigger_register(dev, &omnia_hw_trigger); From 3111add7f414fddb587cf8e419df2d73500cb4e6 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 22 Sep 2023 10:52:53 -0700 Subject: [PATCH 075/515] module: Annotate struct module_notes_attrs with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct module_notes_attrs. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Cc: Luis Chamberlain Cc: linux-modules@vger.kernel.org Signed-off-by: Kees Cook Signed-off-by: Luis Chamberlain --- kernel/module/sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/module/sysfs.c b/kernel/module/sysfs.c index c921bf044050ff..d964167c665868 100644 --- a/kernel/module/sysfs.c +++ b/kernel/module/sysfs.c @@ -143,7 +143,7 @@ static void remove_sect_attrs(struct module *mod) struct module_notes_attrs { struct kobject *dir; unsigned int notes; - struct bin_attribute attrs[]; + struct bin_attribute attrs[] __counted_by(notes); }; static ssize_t module_notes_read(struct file *filp, struct kobject *kobj, From a464d2f75fa16689b2d0307248740d83828d9b0c Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 22 Sep 2023 10:53:35 -0700 Subject: [PATCH 076/515] firewire: Annotate struct fw_node with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct fw_node. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Cc: Takashi Sakamoto Cc: linux1394-devel@lists.sourceforge.net Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230922175334.work.335-kees@kernel.org Signed-off-by: Takashi Sakamoto --- drivers/firewire/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h index 2a05f411328fd4..95c10f3d2282f5 100644 --- a/drivers/firewire/core.h +++ b/drivers/firewire/core.h @@ -191,7 +191,7 @@ struct fw_node { /* Upper layer specific data. */ void *data; - struct fw_node *ports[]; + struct fw_node *ports[] __counted_by(port_count); }; static inline struct fw_node *fw_node_get(struct fw_node *node) From 93e09158eb43dcdb684ac3fa85e27ff149f587ba Mon Sep 17 00:00:00 2001 From: Fabrice Gasnier Date: Tue, 29 Aug 2023 15:40:25 +0200 Subject: [PATCH 077/515] mfd: stm32-timers: Add support for interrupts There are two types of STM32 timers that may have: - a global interrupt line - 4 dedicated interrupt lines. Those interrupts are optional as defined in the dt-bindings. Enforce checks on either one, four or no interrupts are provided with their names. Optionally get them here, to be used by child devices. Signed-off-by: Fabrice Gasnier Link: https://lore.kernel.org/r/20230829134029.2402868-5-fabrice.gasnier@foss.st.com Signed-off-by: Lee Jones --- drivers/mfd/stm32-timers.c | 46 ++++++++++++++++++++++++++++++++ include/linux/mfd/stm32-timers.h | 11 ++++++++ 2 files changed, 57 insertions(+) diff --git a/drivers/mfd/stm32-timers.c b/drivers/mfd/stm32-timers.c index 732a28db80fade..a656a1c186a896 100644 --- a/drivers/mfd/stm32-timers.c +++ b/drivers/mfd/stm32-timers.c @@ -215,6 +215,48 @@ static void stm32_timers_dma_remove(struct device *dev, dma_release_channel(ddata->dma.chans[i]); } +static const char * const stm32_timers_irq_name[STM32_TIMERS_MAX_IRQS] = { + "brk", "up", "trg-com", "cc" +}; + +static int stm32_timers_irq_probe(struct platform_device *pdev, + struct stm32_timers *ddata) +{ + int i, ret; + + /* + * STM32 Timer may have either: + * - a unique global interrupt line + * - four dedicated interrupt lines that may be handled separately. + * Optionally get them here, to be used by child devices. + */ + ret = platform_get_irq_byname_optional(pdev, "global"); + if (ret < 0 && ret != -ENXIO) { + return ret; + } else if (ret != -ENXIO) { + ddata->irq[STM32_TIMERS_IRQ_GLOBAL_BRK] = ret; + ddata->nr_irqs = 1; + return 0; + } + + for (i = 0; i < STM32_TIMERS_MAX_IRQS; i++) { + ret = platform_get_irq_byname_optional(pdev, stm32_timers_irq_name[i]); + if (ret < 0 && ret != -ENXIO) { + return ret; + } else if (ret != -ENXIO) { + ddata->irq[i] = ret; + ddata->nr_irqs++; + } + } + + if (ddata->nr_irqs && ddata->nr_irqs != STM32_TIMERS_MAX_IRQS) { + dev_err(&pdev->dev, "Invalid number of IRQs %d\n", ddata->nr_irqs); + return -EINVAL; + } + + return 0; +} + static int stm32_timers_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -245,6 +287,10 @@ static int stm32_timers_probe(struct platform_device *pdev) stm32_timers_get_arr_size(ddata); + ret = stm32_timers_irq_probe(pdev, ddata); + if (ret) + return ret; + ret = stm32_timers_dma_probe(dev, ddata); if (ret) { stm32_timers_dma_remove(dev, ddata); diff --git a/include/linux/mfd/stm32-timers.h b/include/linux/mfd/stm32-timers.h index 1b94325febb318..ca35af30745f7f 100644 --- a/include/linux/mfd/stm32-timers.h +++ b/include/linux/mfd/stm32-timers.h @@ -102,6 +102,15 @@ enum stm32_timers_dmas { STM32_TIMERS_MAX_DMAS, }; +/* STM32 Timer may have either a unique global interrupt or 4 interrupt lines */ +enum stm32_timers_irqs { + STM32_TIMERS_IRQ_GLOBAL_BRK, /* global or brk IRQ */ + STM32_TIMERS_IRQ_UP, + STM32_TIMERS_IRQ_TRG_COM, + STM32_TIMERS_IRQ_CC, + STM32_TIMERS_MAX_IRQS, +}; + /** * struct stm32_timers_dma - STM32 timer DMA handling. * @completion: end of DMA transfer completion @@ -123,6 +132,8 @@ struct stm32_timers { struct regmap *regmap; u32 max_arr; struct stm32_timers_dma dma; /* Only to be used by the parent */ + unsigned int nr_irqs; + int irq[STM32_TIMERS_MAX_IRQS]; }; #if IS_REACHABLE(CONFIG_MFD_STM32_TIMERS) From d39d86e3e78b9df72da49984072be7a19bca7374 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Mon, 10 Jul 2023 18:49:01 +0530 Subject: [PATCH 078/515] clocksource: timer-riscv: Don't enable/disable timer interrupt Currently, we enable/disable timer interrupt at runtime to start/stop timer events. This makes timer interrupt state go out-of-sync with the Linux interrupt subsystem. To address the above issue, we can stop a per-HART timer interrupt by setting U64_MAX in timecmp CSR (or sbi_set_timer()) at the time of handling timer interrupt. Signed-off-by: Anup Patel Reviewed-by: Conor Dooley Acked-by: Palmer Dabbelt Link: https://lore.kernel.org/r/20230710131902.1459180-2-apatel@ventanamicro.com Signed-off-by: Palmer Dabbelt --- drivers/clocksource/timer-riscv.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/clocksource/timer-riscv.c b/drivers/clocksource/timer-riscv.c index da3071b387eb59..f2ea2b3d2d43e0 100644 --- a/drivers/clocksource/timer-riscv.c +++ b/drivers/clocksource/timer-riscv.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -31,12 +32,22 @@ static DEFINE_STATIC_KEY_FALSE(riscv_sstc_available); static bool riscv_timer_cannot_wake_cpu; +static void riscv_clock_event_stop(void) +{ + if (static_branch_likely(&riscv_sstc_available)) { + csr_write(CSR_STIMECMP, ULONG_MAX); + if (IS_ENABLED(CONFIG_32BIT)) + csr_write(CSR_STIMECMPH, ULONG_MAX); + } else { + sbi_set_timer(U64_MAX); + } +} + static int riscv_clock_next_event(unsigned long delta, struct clock_event_device *ce) { u64 next_tval = get_cycles64() + delta; - csr_set(CSR_IE, IE_TIE); if (static_branch_likely(&riscv_sstc_available)) { #if defined(CONFIG_32BIT) csr_write(CSR_STIMECMP, next_tval & 0xFFFFFFFF); @@ -119,7 +130,7 @@ static irqreturn_t riscv_timer_interrupt(int irq, void *dev_id) { struct clock_event_device *evdev = this_cpu_ptr(&riscv_clock_event); - csr_clear(CSR_IE, IE_TIE); + riscv_clock_event_stop(); evdev->event_handler(evdev); return IRQ_HANDLED; From fde893ef70848b1a5fa10c18bfbc92f06558e0d2 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Mon, 10 Jul 2023 18:49:02 +0530 Subject: [PATCH 079/515] clocksource: timer-riscv: Increase rating of clock_event_device for Sstc When Sstc is available the RISC-V timer clock_event_device should be the preferred clock_event_device hence we increase clock_event_device rating for Sstc. Signed-off-by: Anup Patel Reviewed-by: Conor Dooley Acked-by: Palmer Dabbelt Link: https://lore.kernel.org/r/20230710131902.1459180-3-apatel@ventanamicro.com Signed-off-by: Palmer Dabbelt --- drivers/clocksource/timer-riscv.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clocksource/timer-riscv.c b/drivers/clocksource/timer-riscv.c index f2ea2b3d2d43e0..9c8f3e2decc22c 100644 --- a/drivers/clocksource/timer-riscv.c +++ b/drivers/clocksource/timer-riscv.c @@ -105,6 +105,8 @@ static int riscv_timer_starting_cpu(unsigned int cpu) ce->irq = riscv_clock_event_irq; if (riscv_timer_cannot_wake_cpu) ce->features |= CLOCK_EVT_FEAT_C3STOP; + if (static_branch_likely(&riscv_sstc_available)) + ce->rating = 450; clockevents_config_and_register(ce, riscv_timebase, 100, 0x7fffffff); enable_percpu_irq(riscv_clock_event_irq, From 67ec9dfb762a7ba708053e87aa81e745c3a54507 Mon Sep 17 00:00:00 2001 From: Palmer Dabbelt Date: Tue, 29 Aug 2023 21:39:19 -0700 Subject: [PATCH 080/515] RISC-V: Provide pgtable_l5_enabled on rv32 A few of the other page table level helpers are defined on rv32, but not pgtable_l5_enabled. This adds the definition as a constant and converts pgtable_l4_enabled to a constant as well. Link: https://lore.kernel.org/r/20230830044129.11481-2-palmer@rivosinc.com Signed-off-by: Palmer Dabbelt --- arch/riscv/include/asm/pgtable-32.h | 3 +++ arch/riscv/include/asm/pgtable.h | 1 - arch/riscv/mm/init.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/riscv/include/asm/pgtable-32.h b/arch/riscv/include/asm/pgtable-32.h index 59ba1fbaf78493..00f3369570a836 100644 --- a/arch/riscv/include/asm/pgtable-32.h +++ b/arch/riscv/include/asm/pgtable-32.h @@ -33,4 +33,7 @@ _PAGE_WRITE | _PAGE_EXEC | \ _PAGE_USER | _PAGE_GLOBAL)) +static const __maybe_unused int pgtable_l4_enabled; +static const __maybe_unused int pgtable_l5_enabled; + #endif /* _ASM_RISCV_PGTABLE_32_H */ diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index b2ba3f79cfe9a7..e05e5c8f652644 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -914,7 +914,6 @@ extern uintptr_t _dtb_early_pa; #define dtb_early_pa _dtb_early_pa #endif /* CONFIG_XIP_KERNEL */ extern u64 satp_mode; -extern bool pgtable_l4_enabled; void paging_init(void); void misc_mem_init(void); diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 0798bd861dcb9a..eed1758720c9b5 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -49,10 +49,12 @@ u64 satp_mode __ro_after_init = SATP_MODE_32; #endif EXPORT_SYMBOL(satp_mode); +#ifdef CONFIG_64BIT bool pgtable_l4_enabled = IS_ENABLED(CONFIG_64BIT) && !IS_ENABLED(CONFIG_XIP_KERNEL); bool pgtable_l5_enabled = IS_ENABLED(CONFIG_64BIT) && !IS_ENABLED(CONFIG_XIP_KERNEL); EXPORT_SYMBOL(pgtable_l4_enabled); EXPORT_SYMBOL(pgtable_l5_enabled); +#endif phys_addr_t phys_ram_base __ro_after_init; EXPORT_SYMBOL(phys_ram_base); From 9bc411e5558e3322dcc358e2057b7c9bb2517918 Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Tue, 29 Aug 2023 21:39:20 -0700 Subject: [PATCH 081/515] riscv: correct pt_level name via pgtable_l5/4_enabled The pt_level uses CONFIG_PGTABLE_LEVELS to display page table names. But if page mode is downgraded from kernel cmdline or restricted by the hardware in 64BIT, it will give a wrong name. Like, using no4lvl for sv39, ptdump named the 1G-mapping as "PUD" that should be "PGD": 0xffffffd840000000-0xffffffd900000000 0x00000000c0000000 3G PUD D A G . . W R V So select "P4D/PUD" or "PGD" via pgtable_l5/4_enabled to correct it. Fixes: e8a62cc26ddf ("riscv: Implement sv48 support") Reviewed-by: Alexandre Ghiti Signed-off-by: Song Shuai Link: https://lore.kernel.org/r/20230712115740.943324-1-suagrfillet@gmail.com Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20230830044129.11481-3-palmer@rivosinc.com Signed-off-by: Palmer Dabbelt --- arch/riscv/mm/ptdump.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/riscv/mm/ptdump.c b/arch/riscv/mm/ptdump.c index 20a9f991a6d746..e9090b38f8117c 100644 --- a/arch/riscv/mm/ptdump.c +++ b/arch/riscv/mm/ptdump.c @@ -384,6 +384,9 @@ static int __init ptdump_init(void) kernel_ptd_info.base_addr = KERN_VIRT_START; + pg_level[1].name = pgtable_l5_enabled ? "P4D" : "PGD"; + pg_level[2].name = pgtable_l4_enabled ? "PUD" : "PGD"; + for (i = 0; i < ARRAY_SIZE(pg_level); i++) for (j = 0; j < ARRAY_SIZE(pte_bits); j++) pg_level[i].mask |= pte_bits[j].mask; From 58473e8abbc68dad4a3c5f4fce6c6b32c85cbe28 Mon Sep 17 00:00:00 2001 From: Tsukasa OI Date: Wed, 26 Jul 2023 05:44:16 +0000 Subject: [PATCH 082/515] RISC-V: clarify the QEMU workaround in ISA parser Extensions prefixed with "Su" won't corrupt the workaround in many cases. The only exception is when the first multi-letter extension in the ISA string begins with "Su" and is not prefixed with an underscore. For instance, following ISA string can confuse this QEMU workaround. * "rv64imacsuclic" (RV64I + M + A + C + "Suclic") However, this case is very unlikely because extensions prefixed by either "Z", "Sm" or "Ss" will most likely precede first. For instance, the "Suclic" extension (draft as of now) will be placed after related "Smclic" and "Ssclic" extensions. It's also highly likely that other unprivileged extensions like "Zba" will precede. It's also possible to suppress the issue in the QEMU workaround with an underscore. Following ISA string won't confuse the QEMU workaround. * "rv64imac_suclic" (RV64I + M + A + C + delimited "Suclic") This fix is to tell kernel developers the nature of this workaround precisely. There are some "Su*" extensions to be ratified but don't worry about this workaround too much. This commit comes with other minor editorial fixes (for minor wording and spacing issues, without changing the meaning). Signed-off-by: Tsukasa OI Reviewed-by: Conor Dooley Link: https://lore.kernel.org/r/8a127608cf6194a6d288289f2520bd1744b81437.1690350252.git.research_trasio@irq.a4lg.com Signed-off-by: Palmer Dabbelt --- arch/riscv/kernel/cpufeature.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c index 8ad6da03ee348a..9e0d375a40f6e1 100644 --- a/arch/riscv/kernel/cpufeature.c +++ b/arch/riscv/kernel/cpufeature.c @@ -204,10 +204,11 @@ static void __init riscv_parse_isa_string(unsigned long *this_hwcap, struct risc switch (*ext) { case 's': /* - * Workaround for invalid single-letter 's' & 'u'(QEMU). + * Workaround for invalid single-letter 's' & 'u' (QEMU). * No need to set the bit in riscv_isa as 's' & 'u' are - * not valid ISA extensions. It works until multi-letter - * extension starting with "Su" appears. + * not valid ISA extensions. It works unless the first + * multi-letter extension in the ISA string begins with + * "Su" and is not prefixed with an underscore. */ if (ext[-1] != '_' && ext[1] == 'u') { ++isa; From 1025d4c1837eb457f9d599611096bf3a4d954333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Fri, 22 Sep 2023 21:28:34 +0200 Subject: [PATCH 083/515] leds: pwm: Don't disable the PWM when the LED should be off MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disabling a PWM (i.e. calling pwm_apply_state with .enabled = false) gives no guarantees what the PWM output does. It might freeze where it currently is, or go in a High-Z state or drive the active or inactive state, it might even continue to toggle. To ensure that the LED gets really disabled, don't disable the PWM even when .duty_cycle is zero. This fixes disabling a leds-pwm LED on i.MX28. The PWM on this SoC is one of those that freezes its output on disable, so if you disable an LED that is full on, it stays on. If you disable a LED with half brightness it goes off in 50% of the cases and full on in the other 50%. Fixes: 41c42ff5dbe2 ("leds: simple driver for pwm driven LEDs") Reported-by: Rogan Dawes Reported-by: Fabio Estevam Signed-off-by: Uwe Kleine-König Reviewed-by: Fabio Estevam Link: https://lore.kernel.org/r/20230922192834.1695727-1-u.kleine-koenig@pengutronix.de Signed-off-by: Lee Jones --- drivers/leds/leds-pwm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c index 419b710984ab62..2b3bf1353b7077 100644 --- a/drivers/leds/leds-pwm.c +++ b/drivers/leds/leds-pwm.c @@ -53,7 +53,7 @@ static int led_pwm_set(struct led_classdev *led_cdev, duty = led_dat->pwmstate.period - duty; led_dat->pwmstate.duty_cycle = duty; - led_dat->pwmstate.enabled = duty > 0; + led_dat->pwmstate.enabled = true; return pwm_apply_state(led_dat->pwm, &led_dat->pwmstate); } From 5272d74b29929c8395720a7e35971a4f0fb6783d Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Sat, 23 Sep 2023 09:15:38 +0200 Subject: [PATCH 084/515] leds: trigger: ledtrig-cpu:: Fix 'output may be truncated' issue for 'cpu' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In order to teach the compiler that 'trig->name' will never be truncated, we need to tell it that 'cpu' is not negative. When building with W=1, this fixes the following warnings: drivers/leds/trigger/ledtrig-cpu.c: In function ‘ledtrig_cpu_init’: drivers/leds/trigger/ledtrig-cpu.c:155:56: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 5 [-Werror=format-truncation=] 155 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu); | ^~ drivers/leds/trigger/ledtrig-cpu.c:155:52: note: directive argument in the range [-2147483648, 7] 155 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu); | ^~~~~~~ drivers/leds/trigger/ledtrig-cpu.c:155:17: note: ‘snprintf’ output between 5 and 15 bytes into a destination of size 8 155 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fixes: 8f88731d052d ("led-triggers: create a trigger for CPU activity") Signed-off-by: Christophe JAILLET Link: https://lore.kernel.org/r/3f4be7a99933cf8566e630da54f6ab913caac432.1695453322.git.christophe.jaillet@wanadoo.fr Signed-off-by: Lee Jones --- drivers/leds/trigger/ledtrig-cpu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/leds/trigger/ledtrig-cpu.c b/drivers/leds/trigger/ledtrig-cpu.c index 8af4f9bb9cde89..05848a2fecff66 100644 --- a/drivers/leds/trigger/ledtrig-cpu.c +++ b/drivers/leds/trigger/ledtrig-cpu.c @@ -130,7 +130,7 @@ static int ledtrig_prepare_down_cpu(unsigned int cpu) static int __init ledtrig_cpu_init(void) { - int cpu; + unsigned int cpu; int ret; /* Supports up to 9999 cpu cores */ @@ -152,7 +152,7 @@ static int __init ledtrig_cpu_init(void) if (cpu >= 8) continue; - snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu); + snprintf(trig->name, MAX_NAME_LEN, "cpu%u", cpu); led_trigger_register_simple(trig->name, &trig->_trig); } From d25fad59146b4fb24f690bc0bedd32a299bc1541 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 22 Sep 2023 10:53:38 -0700 Subject: [PATCH 085/515] mfd: iqs62x: Annotate struct iqs62x_fw_blk with __counted_by Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). As found with Coccinelle[1], add __counted_by for struct iqs62x_fw_blk. [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci Signed-off-by: Kees Cook Reviewed-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/20230922175337.work.150-kees@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/iqs62x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/iqs62x.c b/drivers/mfd/iqs62x.c index e03b4d38fbb0a6..1b465590567cf4 100644 --- a/drivers/mfd/iqs62x.c +++ b/drivers/mfd/iqs62x.c @@ -96,7 +96,7 @@ struct iqs62x_fw_blk { u8 addr; u8 mask; u8 len; - u8 data[]; + u8 data[] __counted_by(len); }; struct iqs62x_info { From 33b5b46a3bd2664a32568f7df2c7b5fd9d2873ae Mon Sep 17 00:00:00 2001 From: Biju Das Date: Sat, 23 Sep 2023 18:49:25 +0100 Subject: [PATCH 086/515] mfd: arizona-i2c: Simplify obtaining I2C match data Simplify probe() by replacing device_get_match_data() and ID lookup for retrieving match data by i2c_get_match_data(). After this drop intializing the variable type. Signed-off-by: Biju Das Acked-by: Charles Keepax Tested-by: Charles Keepax Link: https://lore.kernel.org/r/20230923174928.56824-2-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/arizona-i2c.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/drivers/mfd/arizona-i2c.c b/drivers/mfd/arizona-i2c.c index 9b7183ffc92809..10e76fc8f12ea6 100644 --- a/drivers/mfd/arizona-i2c.c +++ b/drivers/mfd/arizona-i2c.c @@ -22,19 +22,12 @@ static int arizona_i2c_probe(struct i2c_client *i2c) { - const struct i2c_device_id *id = i2c_client_get_device_id(i2c); - const void *match_data; struct arizona *arizona; const struct regmap_config *regmap_config = NULL; - unsigned long type = 0; + unsigned long type; int ret; - match_data = device_get_match_data(&i2c->dev); - if (match_data) - type = (unsigned long)match_data; - else if (id) - type = id->driver_data; - + type = (uintptr_t)i2c_get_match_data(i2c); switch (type) { case WM5102: if (IS_ENABLED(CONFIG_MFD_WM5102)) From 7a6ff7d69d9921d269b796ca0c2a96717563fe84 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Sat, 23 Sep 2023 18:49:26 +0100 Subject: [PATCH 087/515] mfd: madera-i2c: Simplify obtaining I2C match data Simplify probe() by replacing of_device_get_match_data() and ID lookup for retrieving match data by i2c_get_match_data(). Signed-off-by: Biju Das Acked-by: Charles Keepax Link: https://lore.kernel.org/r/20230923174928.56824-3-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/madera-i2c.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/mfd/madera-i2c.c b/drivers/mfd/madera-i2c.c index a404ea26bc7984..0986e4a99f4aa0 100644 --- a/drivers/mfd/madera-i2c.c +++ b/drivers/mfd/madera-i2c.c @@ -18,21 +18,14 @@ static int madera_i2c_probe(struct i2c_client *i2c) { - const struct i2c_device_id *id = i2c_client_get_device_id(i2c); struct madera *madera; const struct regmap_config *regmap_16bit_config = NULL; const struct regmap_config *regmap_32bit_config = NULL; - const void *of_data; unsigned long type; const char *name; int ret; - of_data = of_device_get_match_data(&i2c->dev); - if (of_data) - type = (unsigned long)of_data; - else - type = id->driver_data; - + type = (uintptr_t)i2c_get_match_data(i2c); switch (type) { case CS47L15: if (IS_ENABLED(CONFIG_MFD_CS47L15)) { From 9abf37d4bbb20d6fb6e15a73d8e8247c8e791f46 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Sat, 23 Sep 2023 18:49:27 +0100 Subject: [PATCH 088/515] mfd: max77541: Simplify obtaining I2C match data Simplify probe() by replacing device_get_match_data() and ID lookup for retrieving match data by i2c_get_match_data(). Signed-off-by: Biju Das Link: https://lore.kernel.org/r/20230923174928.56824-4-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/max77541.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/mfd/max77541.c b/drivers/mfd/max77541.c index 10c2e274b4af60..d77c31c86e4356 100644 --- a/drivers/mfd/max77541.c +++ b/drivers/mfd/max77541.c @@ -162,7 +162,6 @@ static int max77541_pmic_setup(struct device *dev) static int max77541_probe(struct i2c_client *client) { - const struct i2c_device_id *id = i2c_client_get_device_id(client); struct device *dev = &client->dev; struct max77541 *max77541; @@ -173,10 +172,7 @@ static int max77541_probe(struct i2c_client *client) i2c_set_clientdata(client, max77541); max77541->i2c = client; - max77541->id = (uintptr_t)device_get_match_data(dev); - if (!max77541->id) - max77541->id = (enum max7754x_ids)id->driver_data; - + max77541->id = (uintptr_t)i2c_get_match_data(client); if (!max77541->id) return -EINVAL; From 36270a2599628fbd8052b3d9241f4a4b02faea7c Mon Sep 17 00:00:00 2001 From: Biju Das Date: Sat, 23 Sep 2023 18:49:28 +0100 Subject: [PATCH 089/515] mfd: max8998: Simplify obtaining I2C match data and drop max8998_i2c_get_driver_data() Simplify probe() by using i2c_get_match_data() instead of max8998_i2c_get_driver_data() for retrieving match data from OF/ID tables. Signed-off-by: Biju Das Reviewed-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230923174928.56824-5-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/mfd/max8998.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c index 4cc426a6c7679d..6ba27171da28b7 100644 --- a/drivers/mfd/max8998.c +++ b/drivers/mfd/max8998.c @@ -152,18 +152,8 @@ static struct max8998_platform_data *max8998_i2c_parse_dt_pdata( return pd; } -static inline unsigned long max8998_i2c_get_driver_data(struct i2c_client *i2c, - const struct i2c_device_id *id) -{ - if (i2c->dev.of_node) - return (unsigned long)of_device_get_match_data(&i2c->dev); - - return id->driver_data; -} - static int max8998_i2c_probe(struct i2c_client *i2c) { - const struct i2c_device_id *id = i2c_client_get_device_id(i2c); struct max8998_platform_data *pdata = dev_get_platdata(&i2c->dev); struct max8998_dev *max8998; int ret = 0; @@ -183,7 +173,7 @@ static int max8998_i2c_probe(struct i2c_client *i2c) max8998->dev = &i2c->dev; max8998->i2c = i2c; max8998->irq = i2c->irq; - max8998->type = max8998_i2c_get_driver_data(i2c, id); + max8998->type = (uintptr_t)i2c_get_match_data(i2c); max8998->pdata = pdata; if (pdata) { max8998->ono = pdata->ono; From 20890756e8753844de76afdf757cb74c6bab3e8b Mon Sep 17 00:00:00 2001 From: Dinghao Liu Date: Mon, 25 Sep 2023 10:41:33 +0800 Subject: [PATCH 090/515] mfd: dln2: Fix double put in dln2_probe The dln2_free() already contains usb_put_dev(). Therefore, the redundant usb_put_dev() before dln2_free() may lead to a double free. Fixes: 96da8f148396 ("mfd: dln2: Fix memory leak in dln2_probe()") Signed-off-by: Dinghao Liu Link: https://lore.kernel.org/r/20230925024134.9683-1-dinghao.liu@zju.edu.cn Signed-off-by: Lee Jones --- drivers/mfd/dln2.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/mfd/dln2.c b/drivers/mfd/dln2.c index c7510434380a43..fbbe82c6e75b5c 100644 --- a/drivers/mfd/dln2.c +++ b/drivers/mfd/dln2.c @@ -826,7 +826,6 @@ static int dln2_probe(struct usb_interface *interface, dln2_stop_rx_urbs(dln2); out_free: - usb_put_dev(dln2->usb_dev); dln2_free(dln2); return ret; From 821d3ff4b4e2c689576a623348555114e3f2f1c2 Mon Sep 17 00:00:00 2001 From: Justin Stitt Date: Fri, 22 Sep 2023 15:27:17 +0000 Subject: [PATCH 091/515] leds: lp3952: Replace deprecated strncpy with strscpy `strncpy` is deprecated for use on NUL-terminated destination strings [1] and as such we should prefer more robust and less ambiguous string interfaces. We expect `dest` to be NUL-terminated due to its use with dev_err. lp3952_get_label()'s dest argument is priv->leds[i].name: | acpi_ret = lp3952_get_label(&priv->client->dev, led_name_hdl[i], | priv->leds[i].name); ... which is then assigned to: | priv->leds[i].cdev.name = priv->leds[i].name; ... which is used with a format string | dev_err(&priv->client->dev, | "couldn't register LED %s\n", | priv->leds[i].cdev.name); There is no indication that NUL-padding is required but if it is let's opt for strscpy_pad. Considering the above, a suitable replacement is `strscpy` [2] due to the fact that it guarantees NUL-termination on the destination buffer without unnecessarily NUL-padding. Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1] Link: https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html [2] Link: https://github.com/KSPP/linux/issues/90 Signed-off-by: Justin Stitt Reviewed-by: Kees Cook Link: https://lore.kernel.org/r/20230922-strncpy-drivers-leds-leds-lp3952-c-v1-1-4941d6f60ca4@google.com Signed-off-by: Lee Jones --- drivers/leds/leds-lp3952.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-lp3952.c b/drivers/leds/leds-lp3952.c index 3bd55652a706ce..62ade3f05a87eb 100644 --- a/drivers/leds/leds-lp3952.c +++ b/drivers/leds/leds-lp3952.c @@ -101,7 +101,7 @@ static int lp3952_get_label(struct device *dev, const char *label, char *dest) if (ret) return ret; - strncpy(dest, str, LP3952_LABEL_MAX_LEN); + strscpy(dest, str, LP3952_LABEL_MAX_LEN); return 0; } From 734adca71b2ccc6df12c244037e0b284aab7cf58 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Sat, 23 Sep 2023 18:19:20 +0100 Subject: [PATCH 092/515] leds: pca955x: Convert enum->pointer for data in the match tables Convert enum->pointer for data in the match tables, so that device_get_match_data() can do match against OF/ACPI/I2C tables, once i2c bus type match support added to it. Replace enum->struct *pca955x_chipdefs for data in the match table. Simplify the probe() by replacing device_get_match_data() and ID lookup for retrieving data by i2c_get_match_data(). While at it, add const definition to pca955x_chipdefs[]. Signed-off-by: Biju Das Reviewed-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230923171921.53503-2-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/leds/leds-pca955x.c | 49 ++++++++++++++----------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c index 1d7fa0cd97bf88..891cfc05301d3b 100644 --- a/drivers/leds/leds-pca955x.c +++ b/drivers/leds/leds-pca955x.c @@ -76,7 +76,7 @@ struct pca955x_chipdef { int slv_addr_shift; /* Number of bits to ignore */ }; -static struct pca955x_chipdef pca955x_chipdefs[] = { +static const struct pca955x_chipdef pca955x_chipdefs[] = { [pca9550] = { .bits = 2, .slv_addr = /* 110000x */ 0x60, @@ -105,11 +105,11 @@ static struct pca955x_chipdef pca955x_chipdefs[] = { }; static const struct i2c_device_id pca955x_id[] = { - { "pca9550", pca9550 }, - { "pca9551", pca9551 }, - { "pca9552", pca9552 }, - { "ibm-pca9552", ibm_pca9552 }, - { "pca9553", pca9553 }, + { "pca9550", (kernel_ulong_t)&pca955x_chipdefs[pca9550] }, + { "pca9551", (kernel_ulong_t)&pca955x_chipdefs[pca9551] }, + { "pca9552", (kernel_ulong_t)&pca955x_chipdefs[pca9552] }, + { "ibm-pca9552", (kernel_ulong_t)&pca955x_chipdefs[ibm_pca9552] }, + { "pca9553", (kernel_ulong_t)&pca955x_chipdefs[pca9553] }, { } }; MODULE_DEVICE_TABLE(i2c, pca955x_id); @@ -117,7 +117,7 @@ MODULE_DEVICE_TABLE(i2c, pca955x_id); struct pca955x { struct mutex lock; struct pca955x_led *leds; - struct pca955x_chipdef *chipdef; + const struct pca955x_chipdef *chipdef; struct i2c_client *client; unsigned long active_pins; #ifdef CONFIG_LEDS_PCA955X_GPIO @@ -415,7 +415,7 @@ static int pca955x_gpio_direction_output(struct gpio_chip *gc, #endif /* CONFIG_LEDS_PCA955X_GPIO */ static struct pca955x_platform_data * -pca955x_get_pdata(struct i2c_client *client, struct pca955x_chipdef *chip) +pca955x_get_pdata(struct i2c_client *client, const struct pca955x_chipdef *chip) { struct pca955x_platform_data *pdata; struct pca955x_led *led; @@ -458,11 +458,11 @@ pca955x_get_pdata(struct i2c_client *client, struct pca955x_chipdef *chip) } static const struct of_device_id of_pca955x_match[] = { - { .compatible = "nxp,pca9550", .data = (void *)pca9550 }, - { .compatible = "nxp,pca9551", .data = (void *)pca9551 }, - { .compatible = "nxp,pca9552", .data = (void *)pca9552 }, - { .compatible = "ibm,pca9552", .data = (void *)ibm_pca9552 }, - { .compatible = "nxp,pca9553", .data = (void *)pca9553 }, + { .compatible = "nxp,pca9550", .data = &pca955x_chipdefs[pca9550] }, + { .compatible = "nxp,pca9551", .data = &pca955x_chipdefs[pca9551] }, + { .compatible = "nxp,pca9552", .data = &pca955x_chipdefs[pca9552] }, + { .compatible = "ibm,pca9552", .data = &pca955x_chipdefs[ibm_pca9552] }, + { .compatible = "nxp,pca9553", .data = &pca955x_chipdefs[pca9553] }, {}, }; MODULE_DEVICE_TABLE(of, of_pca955x_match); @@ -471,7 +471,7 @@ static int pca955x_probe(struct i2c_client *client) { struct pca955x *pca955x; struct pca955x_led *pca955x_led; - struct pca955x_chipdef *chip; + const struct pca955x_chipdef *chip; struct led_classdev *led; struct led_init_data init_data; struct i2c_adapter *adapter; @@ -480,24 +480,11 @@ static int pca955x_probe(struct i2c_client *client) bool set_default_label = false; bool keep_pwm = false; char default_label[8]; - enum pca955x_type chip_type; - const void *md = device_get_match_data(&client->dev); - - if (md) { - chip_type = (enum pca955x_type)(uintptr_t)md; - } else { - const struct i2c_device_id *id = i2c_match_id(pca955x_id, - client); - - if (id) { - chip_type = (enum pca955x_type)id->driver_data; - } else { - dev_err(&client->dev, "unknown chip\n"); - return -ENODEV; - } - } - chip = &pca955x_chipdefs[chip_type]; + chip = i2c_get_match_data(client); + if (!chip) + return dev_err_probe(&client->dev, -ENODEV, "unknown chip\n"); + adapter = client->adapter; pdata = dev_get_platdata(&client->dev); if (!pdata) { From e1f9ce22d669bc53210d1c1017f96eeef067b034 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Sat, 23 Sep 2023 18:19:21 +0100 Subject: [PATCH 093/515] leds: pca955x: Cleanup OF/ID table terminators Some cleanups: * Remove the trailing comma in the terminator entry for the OF table making code robust against (theoretical) misrebases or other similar things where the new entry goes _after_ the termination without the compiler noticing. * Drop a space from terminator entry for ID table. While at it, move OF/ID table near to the user. Signed-off-by: Biju Das Reviewed-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230923171921.53503-3-biju.das.jz@bp.renesas.com Signed-off-by: Lee Jones --- drivers/leds/leds-pca955x.c | 40 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c index 891cfc05301d3b..94a9f8a54b3593 100644 --- a/drivers/leds/leds-pca955x.c +++ b/drivers/leds/leds-pca955x.c @@ -104,16 +104,6 @@ static const struct pca955x_chipdef pca955x_chipdefs[] = { }, }; -static const struct i2c_device_id pca955x_id[] = { - { "pca9550", (kernel_ulong_t)&pca955x_chipdefs[pca9550] }, - { "pca9551", (kernel_ulong_t)&pca955x_chipdefs[pca9551] }, - { "pca9552", (kernel_ulong_t)&pca955x_chipdefs[pca9552] }, - { "ibm-pca9552", (kernel_ulong_t)&pca955x_chipdefs[ibm_pca9552] }, - { "pca9553", (kernel_ulong_t)&pca955x_chipdefs[pca9553] }, - { } -}; -MODULE_DEVICE_TABLE(i2c, pca955x_id); - struct pca955x { struct mutex lock; struct pca955x_led *leds; @@ -457,16 +447,6 @@ pca955x_get_pdata(struct i2c_client *client, const struct pca955x_chipdef *chip) return pdata; } -static const struct of_device_id of_pca955x_match[] = { - { .compatible = "nxp,pca9550", .data = &pca955x_chipdefs[pca9550] }, - { .compatible = "nxp,pca9551", .data = &pca955x_chipdefs[pca9551] }, - { .compatible = "nxp,pca9552", .data = &pca955x_chipdefs[pca9552] }, - { .compatible = "ibm,pca9552", .data = &pca955x_chipdefs[ibm_pca9552] }, - { .compatible = "nxp,pca9553", .data = &pca955x_chipdefs[pca9553] }, - {}, -}; -MODULE_DEVICE_TABLE(of, of_pca955x_match); - static int pca955x_probe(struct i2c_client *client) { struct pca955x *pca955x; @@ -650,6 +630,26 @@ static int pca955x_probe(struct i2c_client *client) return 0; } +static const struct i2c_device_id pca955x_id[] = { + { "pca9550", (kernel_ulong_t)&pca955x_chipdefs[pca9550] }, + { "pca9551", (kernel_ulong_t)&pca955x_chipdefs[pca9551] }, + { "pca9552", (kernel_ulong_t)&pca955x_chipdefs[pca9552] }, + { "ibm-pca9552", (kernel_ulong_t)&pca955x_chipdefs[ibm_pca9552] }, + { "pca9553", (kernel_ulong_t)&pca955x_chipdefs[pca9553] }, + {} +}; +MODULE_DEVICE_TABLE(i2c, pca955x_id); + +static const struct of_device_id of_pca955x_match[] = { + { .compatible = "nxp,pca9550", .data = &pca955x_chipdefs[pca9550] }, + { .compatible = "nxp,pca9551", .data = &pca955x_chipdefs[pca9551] }, + { .compatible = "nxp,pca9552", .data = &pca955x_chipdefs[pca9552] }, + { .compatible = "ibm,pca9552", .data = &pca955x_chipdefs[ibm_pca9552] }, + { .compatible = "nxp,pca9553", .data = &pca955x_chipdefs[pca9553] }, + {} +}; +MODULE_DEVICE_TABLE(of, of_pca955x_match); + static struct i2c_driver pca955x_driver = { .driver = { .name = "leds-pca955x", From cf71329eb3a37f90c8ddec0651dc7b3fa76036c1 Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Tue, 19 Sep 2023 11:39:12 +0100 Subject: [PATCH 094/515] dt-bindings: mfd: x-powers,axp152: Make interrupt optional for more chips All X-Powers PMICs described by this binding have an IRQ pin, and so far (almost) all boards connected this to some NMI pin or GPIO on the SoC they are connected to. However we start to see boards that omit this connection, and technically the IRQ pin is not essential to the basic PMIC operation. The existing Linux driver allows skipping the IRQ pin setup for two chips already, so update the binding to also make the DT property optional for the missing chip. And while we are at it, add the AXP313a to that list, as they are actually boards out there not connecting the IRQ pin. This allows to have DTs correctly describing those boards not wiring up the interrupt. Signed-off-by: Andre Przywara Acked-by: Conor Dooley Link: https://lore.kernel.org/r/20230919103913.463156-2-andre.przywara@arm.com Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml index 9ad55746133b5e..06f1779835a1ef 100644 --- a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml +++ b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml @@ -67,7 +67,10 @@ allOf: properties: compatible: contains: - const: x-powers,axp305 + enum: + - x-powers,axp15060 + - x-powers,axp305 + - x-powers,axp313a then: required: From c7d1263be9396582f86024dc33f336d974496b83 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Mon, 25 Sep 2023 16:27:24 -0500 Subject: [PATCH 095/515] dt-bindings: mfd: Add missing unevaluatedProperties on child node schemas Just as unevaluatedProperties or additionalProperties are required at the top level of schemas, they should (and will) also be required for child node schemas. That ensures only documented properties are present for any node. Add unevaluatedProperties as needed, and then add any missing properties flagged by the addition. Signed-off-by: Rob Herring Acked-by: Conor Dooley Reviewed-by: AngeloGioacchino Del Regno Link: https://lore.kernel.org/r/20230925212729.1976117-1-robh@kernel.org Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/maxim,max5970.yaml | 5 +++++ Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml | 2 ++ Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml | 1 + Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml | 1 + Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml | 3 ++- Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml | 1 + Documentation/devicetree/bindings/mfd/ti,lp87524-q1.yaml | 1 + Documentation/devicetree/bindings/mfd/ti,lp87561-q1.yaml | 1 + Documentation/devicetree/bindings/mfd/ti,lp87565-q1.yaml | 1 + 9 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/mfd/maxim,max5970.yaml b/Documentation/devicetree/bindings/mfd/maxim,max5970.yaml index da67742c5aa947..0da5cae3852e0c 100644 --- a/Documentation/devicetree/bindings/mfd/maxim,max5970.yaml +++ b/Documentation/devicetree/bindings/mfd/maxim,max5970.yaml @@ -45,8 +45,13 @@ properties: patternProperties: "^led@[0-3]$": $ref: /schemas/leds/common.yaml# + unevaluatedProperties: false type: object + properties: + reg: + maximum: 3 + additionalProperties: false vss1-supply: diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml index fc2a53148e1cbb..37423c2e0fdfa3 100644 --- a/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml +++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml @@ -40,6 +40,7 @@ properties: regulators: type: object $ref: /schemas/regulator/mediatek,mt6357-regulator.yaml + unevaluatedProperties: false description: List of MT6357 BUCKs and LDOs regulators. @@ -59,6 +60,7 @@ properties: keys: type: object $ref: /schemas/input/mediatek,pmic-keys.yaml + unevaluatedProperties: false description: MT6357 power and home keys. diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml index 4992f71b6fc3f0..af6cd1969c226f 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml @@ -80,6 +80,7 @@ properties: "^(DCDC_REG[1-4]|LDO_REG[1-3])$": type: object $ref: ../regulator/regulator.yaml# + unevaluatedProperties: false unevaluatedProperties: false allOf: diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml index f5908fa01a61af..8a16d651c2a310 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml @@ -107,6 +107,7 @@ properties: "^(DCDC_REG[1-4]|LDO_REG[1-8]|SWITCH_REG[1-2])$": type: object $ref: ../regulator/regulator.yaml# + unevaluatedProperties: false unevaluatedProperties: false required: diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml index 7fb849ac74a7cd..e922e0176ee7fa 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml @@ -86,7 +86,8 @@ properties: patternProperties: "^(LDO_REG[1-9]|DCDC_REG[1-5]|SWITCH_REG[1-2])$": type: object - $ref: ../regulator/regulator.yaml# + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false unevaluatedProperties: false allOf: diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml index b57c4b005cf455..ee5bca6e75dfac 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml @@ -99,6 +99,7 @@ properties: "^(DCDC_REG[1-4]|DCDC_BOOST|LDO_REG[1-9]|SWITCH_REG|HDMI_SWITCH|OTG_SWITCH)$": type: object $ref: ../regulator/regulator.yaml# + unevaluatedProperties: false unevaluatedProperties: false required: diff --git a/Documentation/devicetree/bindings/mfd/ti,lp87524-q1.yaml b/Documentation/devicetree/bindings/mfd/ti,lp87524-q1.yaml index f6cac4b1079c9a..ae149eb8593dcf 100644 --- a/Documentation/devicetree/bindings/mfd/ti,lp87524-q1.yaml +++ b/Documentation/devicetree/bindings/mfd/ti,lp87524-q1.yaml @@ -37,6 +37,7 @@ properties: "^buck[0123]$": type: object $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false required: - buck0 diff --git a/Documentation/devicetree/bindings/mfd/ti,lp87561-q1.yaml b/Documentation/devicetree/bindings/mfd/ti,lp87561-q1.yaml index dc5a29b5ef7d90..5167d6eb904a13 100644 --- a/Documentation/devicetree/bindings/mfd/ti,lp87561-q1.yaml +++ b/Documentation/devicetree/bindings/mfd/ti,lp87561-q1.yaml @@ -41,6 +41,7 @@ properties: buck3210: type: object $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false required: - buck3210 diff --git a/Documentation/devicetree/bindings/mfd/ti,lp87565-q1.yaml b/Documentation/devicetree/bindings/mfd/ti,lp87565-q1.yaml index 012d25111054c4..eca430edf608eb 100644 --- a/Documentation/devicetree/bindings/mfd/ti,lp87565-q1.yaml +++ b/Documentation/devicetree/bindings/mfd/ti,lp87565-q1.yaml @@ -47,6 +47,7 @@ properties: "^buck(10|23)$": type: object $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false required: - buck10 From be05b4a42901fc3bee6f84719178508f8cd82b9c Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 26 Sep 2023 22:08:31 +0300 Subject: [PATCH 096/515] mfd: lpc_ich: Make struct lpc_ich_priv use enum for chipset member We have a specific enum for the supported chipsets. Make struct lpc_ich_priv use better type for the chipset member. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230926190834.932233-1-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/mfd/lpc_ich.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c index 7b1c597b6879fb..58da6c95c46253 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c @@ -85,19 +85,6 @@ #define wdt_mem_res(i) wdt_res(ICH_RES_MEM_OFF, i) #define wdt_res(b, i) (&wdt_ich_res[(b) + (i)]) -struct lpc_ich_priv { - int chipset; - - int abase; /* ACPI base */ - int actrl_pbase; /* ACPI control or PMC base */ - int gbase; /* GPIO base */ - int gctrl; /* GPIO control */ - - int abase_save; /* Cached ACPI base value */ - int actrl_pbase_save; /* Cached ACPI control or PMC base value */ - int gctrl_save; /* Cached GPIO control value */ -}; - static struct resource wdt_ich_res[] = { /* ACPI - TCO */ { @@ -293,6 +280,19 @@ enum lpc_chipsets { LPC_COUGARMOUNTAIN,/* Cougar Mountain SoC*/ }; +struct lpc_ich_priv { + enum lpc_chipsets chipset; + + int abase; /* ACPI base */ + int actrl_pbase; /* ACPI control or PMC base */ + int gbase; /* GPIO base */ + int gctrl; /* GPIO control */ + + int abase_save; /* Cached ACPI base value */ + int actrl_pbase_save; /* Cached ACPI control or PMC base value */ + int gctrl_save; /* Cached GPIO control value */ +}; + static struct lpc_ich_info lpc_chipset_info[] = { [LPC_ICH] = { .name = "ICH", From a7c5e755ef3d14fcf201660531261ab650812baf Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 26 Sep 2023 22:08:32 +0300 Subject: [PATCH 097/515] mfd: lpc_ich: Convert gpio_version to be enum We have an anonymous enum for the GPIO versions. Make it named and use this type for the gpio_version member of struct lpc_ich_info. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230926190834.932233-2-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- include/linux/mfd/lpc_ich.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/mfd/lpc_ich.h b/include/linux/mfd/lpc_ich.h index ea4a4b1b246a29..83621e0ccf330d 100644 --- a/include/linux/mfd/lpc_ich.h +++ b/include/linux/mfd/lpc_ich.h @@ -15,7 +15,7 @@ #define ICH_RES_GPE0 1 /* GPIO compatibility */ -enum { +enum lpc_gpio_versions { ICH_I3100_GPIO, ICH_V5_GPIO, ICH_V6_GPIO, @@ -29,7 +29,7 @@ enum { struct lpc_ich_info { char name[32]; unsigned int iTCO_version; - unsigned int gpio_version; + enum lpc_gpio_versions gpio_version; enum intel_spi_type spi_type; u8 use_gpio; }; From 123a58d7c429d30f6e0e615b20c1b74e1e1e6616 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 26 Sep 2023 22:08:33 +0300 Subject: [PATCH 098/515] mfd: lpc_ich: Move APL GPIO resources to a custom structure We are expecting more platforms that want to instantiate the GPIO device via P2SB. For them prepare the custom structure and move Apollo Lake data there. Refactor the code accordingly. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230926190834.932233-3-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/mfd/lpc_ich.c | 52 +++++++++++++++++++++++++++++-------- include/linux/mfd/lpc_ich.h | 3 +++ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c index 58da6c95c46253..8b21d0f629c85e 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c @@ -131,22 +131,33 @@ static struct mfd_cell lpc_ich_gpio_cell = { .ignore_resource_conflicts = true, }; +#define INTEL_GPIO_RESOURCE_SIZE 0x1000 + +struct lpc_ich_gpio_info { + const char *hid; + const struct mfd_cell *devices; + size_t nr_devices; + struct resource **resources; + size_t nr_resources; + resource_size_t *offsets; +}; + #define APL_GPIO_NORTH 0 #define APL_GPIO_NORTHWEST 1 #define APL_GPIO_WEST 2 #define APL_GPIO_SOUTHWEST 3 + #define APL_GPIO_NR_DEVICES 4 +#define APL_GPIO_NR_RESOURCES 4 /* Offset data for Apollo Lake GPIO controllers */ -static resource_size_t apl_gpio_offsets[APL_GPIO_NR_DEVICES] = { +static resource_size_t apl_gpio_offsets[APL_GPIO_NR_RESOURCES] = { [APL_GPIO_NORTH] = 0xc50000, [APL_GPIO_NORTHWEST] = 0xc40000, [APL_GPIO_WEST] = 0xc70000, [APL_GPIO_SOUTHWEST] = 0xc00000, }; -#define APL_GPIO_RESOURCE_SIZE 0x1000 - #define APL_GPIO_IRQ 14 static struct resource apl_gpio_resources[APL_GPIO_NR_DEVICES][2] = { @@ -168,6 +179,13 @@ static struct resource apl_gpio_resources[APL_GPIO_NR_DEVICES][2] = { }, }; +static struct resource *apl_gpio_mem_resources[APL_GPIO_NR_RESOURCES] = { + [APL_GPIO_NORTH] = &apl_gpio_resources[APL_GPIO_NORTH][0], + [APL_GPIO_NORTHWEST] = &apl_gpio_resources[APL_GPIO_NORTHWEST][0], + [APL_GPIO_WEST] = &apl_gpio_resources[APL_GPIO_WEST][0], + [APL_GPIO_SOUTHWEST] = &apl_gpio_resources[APL_GPIO_SOUTHWEST][0], +}; + static const struct mfd_cell apl_gpio_devices[APL_GPIO_NR_DEVICES] = { [APL_GPIO_NORTH] = { .name = "apollolake-pinctrl", @@ -199,6 +217,15 @@ static const struct mfd_cell apl_gpio_devices[APL_GPIO_NR_DEVICES] = { }, }; +static const struct lpc_ich_gpio_info apl_gpio_info = { + .hid = "INT3452", + .devices = apl_gpio_devices, + .nr_devices = ARRAY_SIZE(apl_gpio_devices), + .resources = apl_gpio_mem_resources, + .nr_resources = ARRAY_SIZE(apl_gpio_mem_resources), + .offsets = apl_gpio_offsets, +}; + static struct mfd_cell lpc_ich_spi_cell = { .name = "intel-spi", .num_resources = ARRAY_SIZE(intel_spi_res), @@ -618,6 +645,7 @@ static struct lpc_ich_info lpc_chipset_info[] = { [LPC_APL] = { .name = "Apollo Lake SoC", .iTCO_version = 5, + .gpio_info = &apl_gpio_info, .spi_type = INTEL_SPI_BXT, }, [LPC_GLK] = { @@ -1156,30 +1184,32 @@ static int lpc_ich_init_wdt(struct pci_dev *dev) static int lpc_ich_init_pinctrl(struct pci_dev *dev) { + struct lpc_ich_priv *priv = pci_get_drvdata(dev); + const struct lpc_ich_gpio_info *info = lpc_chipset_info[priv->chipset].gpio_info; struct resource base; unsigned int i; int ret; /* Check, if GPIO has been exported as an ACPI device */ - if (acpi_dev_present("INT3452", NULL, -1)) + if (acpi_dev_present(info->hid, NULL, -1)) return -EEXIST; ret = p2sb_bar(dev->bus, 0, &base); if (ret) return ret; - for (i = 0; i < ARRAY_SIZE(apl_gpio_devices); i++) { - struct resource *mem = &apl_gpio_resources[i][0]; - resource_size_t offset = apl_gpio_offsets[i]; + for (i = 0; i < info->nr_resources; i++) { + struct resource *mem = info->resources[i]; + resource_size_t offset = info->offsets[i]; /* Fill MEM resource */ mem->start = base.start + offset; - mem->end = base.start + offset + APL_GPIO_RESOURCE_SIZE - 1; + mem->end = base.start + offset + INTEL_GPIO_RESOURCE_SIZE - 1; mem->flags = base.flags; } - return mfd_add_devices(&dev->dev, 0, apl_gpio_devices, - ARRAY_SIZE(apl_gpio_devices), NULL, 0, NULL); + return mfd_add_devices(&dev->dev, 0, info->devices, info->nr_devices, + NULL, 0, NULL); } static bool lpc_ich_byt_set_writeable(void __iomem *base, void *data) @@ -1332,7 +1362,7 @@ static int lpc_ich_probe(struct pci_dev *dev, cell_added = true; } - if (priv->chipset == LPC_APL) { + if (lpc_chipset_info[priv->chipset].gpio_info) { ret = lpc_ich_init_pinctrl(dev); if (!ret) cell_added = true; diff --git a/include/linux/mfd/lpc_ich.h b/include/linux/mfd/lpc_ich.h index 83621e0ccf330d..1fbda1f8967db4 100644 --- a/include/linux/mfd/lpc_ich.h +++ b/include/linux/mfd/lpc_ich.h @@ -26,11 +26,14 @@ enum lpc_gpio_versions { AVOTON_GPIO, }; +struct lpc_ich_gpio_info; + struct lpc_ich_info { char name[32]; unsigned int iTCO_version; enum lpc_gpio_versions gpio_version; enum intel_spi_type spi_type; + const struct lpc_ich_gpio_info *gpio_info; u8 use_gpio; }; From 032d77aada6e56f8232d836a006b541045297d82 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 26 Sep 2023 22:08:34 +0300 Subject: [PATCH 099/515] mfd: lpc_ich: Add a platform device for pinctrl Denverton This is to cater the need in non-ACPI system whereby a platform device has to be created in order to bind with the Denverton pinctrl driver. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230926190834.932233-4-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/mfd/lpc_ich.c | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c index 8b21d0f629c85e..ea5f01e07dafd5 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c @@ -226,6 +226,49 @@ static const struct lpc_ich_gpio_info apl_gpio_info = { .offsets = apl_gpio_offsets, }; +#define DNV_GPIO_NORTH 0 +#define DNV_GPIO_SOUTH 1 + +#define DNV_GPIO_NR_DEVICES 1 +#define DNV_GPIO_NR_RESOURCES 2 + +/* Offset data for Denverton GPIO controllers */ +static resource_size_t dnv_gpio_offsets[DNV_GPIO_NR_RESOURCES] = { + [DNV_GPIO_NORTH] = 0xc20000, + [DNV_GPIO_SOUTH] = 0xc50000, +}; + +#define DNV_GPIO_IRQ 14 + +static struct resource dnv_gpio_resources[DNV_GPIO_NR_RESOURCES + 1] = { + [DNV_GPIO_NORTH] = DEFINE_RES_MEM(0, 0), + [DNV_GPIO_SOUTH] = DEFINE_RES_MEM(0, 0), + DEFINE_RES_IRQ(DNV_GPIO_IRQ), +}; + +static struct resource *dnv_gpio_mem_resources[DNV_GPIO_NR_RESOURCES] = { + [DNV_GPIO_NORTH] = &dnv_gpio_resources[DNV_GPIO_NORTH], + [DNV_GPIO_SOUTH] = &dnv_gpio_resources[DNV_GPIO_SOUTH], +}; + +static const struct mfd_cell dnv_gpio_devices[DNV_GPIO_NR_DEVICES] = { + { + .name = "denverton-pinctrl", + .num_resources = ARRAY_SIZE(dnv_gpio_resources), + .resources = dnv_gpio_resources, + .ignore_resource_conflicts = true, + }, +}; + +static const struct lpc_ich_gpio_info dnv_gpio_info = { + .hid = "INTC3000", + .devices = dnv_gpio_devices, + .nr_devices = ARRAY_SIZE(dnv_gpio_devices), + .resources = dnv_gpio_mem_resources, + .nr_resources = ARRAY_SIZE(dnv_gpio_mem_resources), + .offsets = dnv_gpio_offsets, +}; + static struct mfd_cell lpc_ich_spi_cell = { .name = "intel-spi", .num_resources = ARRAY_SIZE(intel_spi_res), @@ -303,6 +346,7 @@ enum lpc_chipsets { LPC_LEWISBURG, /* Lewisburg */ LPC_9S, /* 9 Series */ LPC_APL, /* Apollo Lake SoC */ + LPC_DNV, /* Denverton SoC */ LPC_GLK, /* Gemini Lake SoC */ LPC_COUGARMOUNTAIN,/* Cougar Mountain SoC*/ }; @@ -648,6 +692,10 @@ static struct lpc_ich_info lpc_chipset_info[] = { .gpio_info = &apl_gpio_info, .spi_type = INTEL_SPI_BXT, }, + [LPC_DNV] = { + .name = "Denverton SoC", + .gpio_info = &dnv_gpio_info, + }, [LPC_GLK] = { .name = "Gemini Lake SoC", .spi_type = INTEL_SPI_BXT, @@ -666,6 +714,7 @@ static struct lpc_ich_info lpc_chipset_info[] = { */ static const struct pci_device_id lpc_ich_ids[] = { { PCI_VDEVICE(INTEL, 0x0f1c), LPC_BAYTRAIL}, + { PCI_VDEVICE(INTEL, 0x19dc), LPC_DNV}, { PCI_VDEVICE(INTEL, 0x1c41), LPC_CPT}, { PCI_VDEVICE(INTEL, 0x1c42), LPC_CPTD}, { PCI_VDEVICE(INTEL, 0x1c43), LPC_CPTM}, From 4aa583f1a6b85c88e3278d2461797d592ac61fcc Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Tue, 26 Sep 2023 23:48:12 +0200 Subject: [PATCH 100/515] dt-bindings: leds: Mention GPIO triggers We reuse the trigger-sources phandle to just point to GPIOs we may want to use as LED triggers. Example: gpio: gpio@0 { compatible "my-gpio"; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; #trigger-source-cells = <2>; }; leds { compatible = "gpio-leds"; led-my-gpio { label = "device:blue:myled"; gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; default-state = "off"; linux,default-trigger = "gpio"; trigger-sources = <&gpio 1 GPIO_ACTIVE_HIGH>; }; }; Signed-off-by: Linus Walleij Acked-by: Conor Dooley Link: https://lore.kernel.org/r/20230926-gpio-led-trigger-dt-v2-2-e06e458b788e@linaro.org Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/leds/common.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/leds/common.yaml b/Documentation/devicetree/bindings/leds/common.yaml index 5fb7007f36189b..b42950643b9d61 100644 --- a/Documentation/devicetree/bindings/leds/common.yaml +++ b/Documentation/devicetree/bindings/leds/common.yaml @@ -191,6 +191,8 @@ properties: each of them having its own LED assigned (assuming they are not hardwired). In such cases this property should contain phandle(s) of related source device(s). + Another example is a GPIO line that will be monitored and mirror the + state of the line (with or without inversion flags) to the LED. In many cases LED can be related to more than one device (e.g. one USB LED vs. multiple USB ports). Each source should be represented by a node in the device tree and be referenced by a phandle and a set of phandle From 1222f5dbc7723cc78741343da2e414b80de83c8f Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Tue, 26 Sep 2023 23:48:13 +0200 Subject: [PATCH 101/515] leds: triggers: gpio: Rewrite to use trigger-sources By providing a GPIO line as "trigger-sources" in the FWNODE (such as from the device tree) and combining with the GPIO trigger, we can support a GPIO LED trigger in a natural way from the hardware description instead of using the custom sysfs and deprecated global GPIO numberspace. Example: gpio: gpio@0 { compatible "my-gpio"; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; #trigger-source-cells = <2>; }; leds { compatible = "gpio-leds"; led-my-gpio { label = "device:blue:myled"; gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; default-state = "off"; linux,default-trigger = "gpio"; trigger-sources = <&gpio 1 GPIO_ACTIVE_HIGH>; }; }; Make this the norm, unmark the driver as broken. Delete the sysfs handling of GPIOs. Since GPIO descriptors inherently can describe inversion, the inversion handling can just be deleted. Signed-off-by: Linus Walleij Link: https://lore.kernel.org/r/20230926-gpio-led-trigger-dt-v2-3-e06e458b788e@linaro.org Signed-off-by: Lee Jones --- drivers/leds/trigger/Kconfig | 5 +- drivers/leds/trigger/ledtrig-gpio.c | 137 ++++++++-------------------- 2 files changed, 41 insertions(+), 101 deletions(-) diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig index 2a57328eca2077..d11d80176fc0fd 100644 --- a/drivers/leds/trigger/Kconfig +++ b/drivers/leds/trigger/Kconfig @@ -83,13 +83,10 @@ config LEDS_TRIGGER_ACTIVITY config LEDS_TRIGGER_GPIO tristate "LED GPIO Trigger" depends on GPIOLIB || COMPILE_TEST - depends on BROKEN help This allows LEDs to be controlled by gpio events. It's good when using gpios as switches and triggering the needed LEDs - from there. One use case is n810's keypad LEDs that could - be triggered by this trigger when user slides up to show - keypad. + from there. Triggers are defined as device properties. If unsure, say N. diff --git a/drivers/leds/trigger/ledtrig-gpio.c b/drivers/leds/trigger/ledtrig-gpio.c index 0120faa3dafa64..9b7fe5dd52088f 100644 --- a/drivers/leds/trigger/ledtrig-gpio.c +++ b/drivers/leds/trigger/ledtrig-gpio.c @@ -3,12 +3,13 @@ * ledtrig-gio.c - LED Trigger Based on GPIO events * * Copyright 2009 Felipe Balbi + * Copyright 2023 Linus Walleij */ #include #include #include -#include +#include #include #include #include @@ -16,10 +17,8 @@ struct gpio_trig_data { struct led_classdev *led; - unsigned desired_brightness; /* desired brightness when led is on */ - unsigned inverted; /* true when gpio is inverted */ - unsigned gpio; /* gpio that triggers the leds */ + struct gpio_desc *gpiod; /* gpio that triggers the led */ }; static irqreturn_t gpio_trig_irq(int irq, void *_led) @@ -28,10 +27,7 @@ static irqreturn_t gpio_trig_irq(int irq, void *_led) struct gpio_trig_data *gpio_data = led_get_trigger_data(led); int tmp; - tmp = gpio_get_value_cansleep(gpio_data->gpio); - if (gpio_data->inverted) - tmp = !tmp; - + tmp = gpiod_get_value_cansleep(gpio_data->gpiod); if (tmp) { if (gpio_data->desired_brightness) led_set_brightness_nosleep(gpio_data->led, @@ -73,93 +69,8 @@ static ssize_t gpio_trig_brightness_store(struct device *dev, static DEVICE_ATTR(desired_brightness, 0644, gpio_trig_brightness_show, gpio_trig_brightness_store); -static ssize_t gpio_trig_inverted_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - - return sprintf(buf, "%u\n", gpio_data->inverted); -} - -static ssize_t gpio_trig_inverted_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t n) -{ - struct led_classdev *led = led_trigger_get_led(dev); - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - unsigned long inverted; - int ret; - - ret = kstrtoul(buf, 10, &inverted); - if (ret < 0) - return ret; - - if (inverted > 1) - return -EINVAL; - - gpio_data->inverted = inverted; - - /* After inverting, we need to update the LED. */ - if (gpio_is_valid(gpio_data->gpio)) - gpio_trig_irq(0, led); - - return n; -} -static DEVICE_ATTR(inverted, 0644, gpio_trig_inverted_show, - gpio_trig_inverted_store); - -static ssize_t gpio_trig_gpio_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - - return sprintf(buf, "%u\n", gpio_data->gpio); -} - -static ssize_t gpio_trig_gpio_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t n) -{ - struct led_classdev *led = led_trigger_get_led(dev); - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - unsigned gpio; - int ret; - - ret = sscanf(buf, "%u", &gpio); - if (ret < 1) { - dev_err(dev, "couldn't read gpio number\n"); - return -EINVAL; - } - - if (gpio_data->gpio == gpio) - return n; - - if (!gpio_is_valid(gpio)) { - if (gpio_is_valid(gpio_data->gpio)) - free_irq(gpio_to_irq(gpio_data->gpio), led); - gpio_data->gpio = gpio; - return n; - } - - ret = request_threaded_irq(gpio_to_irq(gpio), NULL, gpio_trig_irq, - IRQF_ONESHOT | IRQF_SHARED | IRQF_TRIGGER_RISING - | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led); - if (ret) { - dev_err(dev, "request_irq failed with error %d\n", ret); - } else { - if (gpio_is_valid(gpio_data->gpio)) - free_irq(gpio_to_irq(gpio_data->gpio), led); - gpio_data->gpio = gpio; - /* After changing the GPIO, we need to update the LED. */ - gpio_trig_irq(0, led); - } - - return ret ? ret : n; -} -static DEVICE_ATTR(gpio, 0644, gpio_trig_gpio_show, gpio_trig_gpio_store); - static struct attribute *gpio_trig_attrs[] = { &dev_attr_desired_brightness.attr, - &dev_attr_inverted.attr, - &dev_attr_gpio.attr, NULL }; ATTRIBUTE_GROUPS(gpio_trig); @@ -167,16 +78,48 @@ ATTRIBUTE_GROUPS(gpio_trig); static int gpio_trig_activate(struct led_classdev *led) { struct gpio_trig_data *gpio_data; + struct device *dev = led->dev; + int ret; gpio_data = kzalloc(sizeof(*gpio_data), GFP_KERNEL); if (!gpio_data) return -ENOMEM; - gpio_data->led = led; - gpio_data->gpio = -ENOENT; + /* + * The generic property "trigger-sources" is followed, + * and we hope that this is a GPIO. + */ + gpio_data->gpiod = fwnode_gpiod_get_index(dev->fwnode, + "trigger-sources", + 0, GPIOD_IN, + "led-trigger"); + if (IS_ERR(gpio_data->gpiod)) { + ret = PTR_ERR(gpio_data->gpiod); + kfree(gpio_data); + return ret; + } + if (!gpio_data->gpiod) { + dev_err(dev, "no valid GPIO for the trigger\n"); + kfree(gpio_data); + return -EINVAL; + } + gpio_data->led = led; led_set_trigger_data(led, gpio_data); + ret = request_threaded_irq(gpiod_to_irq(gpio_data->gpiod), NULL, gpio_trig_irq, + IRQF_ONESHOT | IRQF_SHARED | IRQF_TRIGGER_RISING + | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led); + if (ret) { + dev_err(dev, "request_irq failed with error %d\n", ret); + gpiod_put(gpio_data->gpiod); + kfree(gpio_data); + return ret; + } + + /* Finally update the LED to initial status */ + gpio_trig_irq(0, led); + return 0; } @@ -184,8 +127,8 @@ static void gpio_trig_deactivate(struct led_classdev *led) { struct gpio_trig_data *gpio_data = led_get_trigger_data(led); - if (gpio_is_valid(gpio_data->gpio)) - free_irq(gpio_to_irq(gpio_data->gpio), led); + free_irq(gpiod_to_irq(gpio_data->gpiod), led); + gpiod_put(gpio_data->gpiod); kfree(gpio_data); } From bf92834e6f6e75db5241717019d309252796ed3d Mon Sep 17 00:00:00 2001 From: Vincent Donnefort Date: Thu, 28 Sep 2023 18:32:04 +0100 Subject: [PATCH 102/515] KVM: arm64: Use folio for THP adjustment Since commit cb196ee1ef39 ("mm/huge_memory: convert do_huge_pmd_anonymous_page() to use vma_alloc_folio()"), transparent huge pages use folios. It enables us to check efficiently if a page is mapped by a block simply looking at the folio size. This is saving a page table walk. It is safe to read the folio in this path. We've just increased its refcount (GUP from __gfn_to_pfn_memslot()). This will prevent attempts of splitting the huge page. Signed-off-by: Vincent Donnefort Reviewed-by: Gavin Shan Reviewed-by: Marc Zyngier Link: https://lore.kernel.org/r/20230928173205.2826598-3-vdonnefort@google.com Signed-off-by: Oliver Upton --- arch/arm64/kvm/mmu.c | 59 +++----------------------------------------- 1 file changed, 3 insertions(+), 56 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index de5e5148ef5de5..69fcbcc7aca59e 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -791,51 +791,6 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size, return 0; } -static struct kvm_pgtable_mm_ops kvm_user_mm_ops = { - /* We shouldn't need any other callback to walk the PT */ - .phys_to_virt = kvm_host_va, -}; - -static int get_user_mapping_size(struct kvm *kvm, u64 addr) -{ - struct kvm_pgtable pgt = { - .pgd = (kvm_pteref_t)kvm->mm->pgd, - .ia_bits = vabits_actual, - .start_level = (KVM_PGTABLE_MAX_LEVELS - - CONFIG_PGTABLE_LEVELS), - .mm_ops = &kvm_user_mm_ops, - }; - unsigned long flags; - kvm_pte_t pte = 0; /* Keep GCC quiet... */ - u32 level = ~0; - int ret; - - /* - * Disable IRQs so that we hazard against a concurrent - * teardown of the userspace page tables (which relies on - * IPI-ing threads). - */ - local_irq_save(flags); - ret = kvm_pgtable_get_leaf(&pgt, addr, &pte, &level); - local_irq_restore(flags); - - if (ret) - return ret; - - /* - * Not seeing an error, but not updating level? Something went - * deeply wrong... - */ - if (WARN_ON(level >= KVM_PGTABLE_MAX_LEVELS)) - return -EFAULT; - - /* Oops, the userspace PTs are gone... Replay the fault */ - if (!kvm_pte_valid(pte)) - return -EAGAIN; - - return BIT(ARM64_HW_PGTABLE_LEVEL_SHIFT(level)); -} - static struct kvm_pgtable_mm_ops kvm_s2_mm_ops = { .zalloc_page = stage2_memcache_zalloc_page, .zalloc_pages_exact = kvm_s2_zalloc_pages_exact, @@ -1274,7 +1229,7 @@ static bool fault_supports_stage2_huge_mapping(struct kvm_memory_slot *memslot, * * Returns the size of the mapping. */ -static long +static unsigned long transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot, unsigned long hva, kvm_pfn_t *pfnp, phys_addr_t *ipap) @@ -1287,10 +1242,7 @@ transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot, * block map is contained within the memslot. */ if (fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE)) { - int sz = get_user_mapping_size(kvm, hva); - - if (sz < 0) - return sz; + size_t sz = folio_size(pfn_folio(pfn)); if (sz < PMD_SIZE) return PAGE_SIZE; @@ -1385,7 +1337,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, kvm_pfn_t pfn; bool logging_active = memslot_is_logging(memslot); unsigned long fault_level = kvm_vcpu_trap_get_fault_level(vcpu); - long vma_pagesize, fault_granule; + unsigned long vma_pagesize, fault_granule; enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R; struct kvm_pgtable *pgt; @@ -1530,11 +1482,6 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, vma_pagesize = transparent_hugepage_adjust(kvm, memslot, hva, &pfn, &fault_ipa); - - if (vma_pagesize < 0) { - ret = vma_pagesize; - goto out_unlock; - } } if (fault_status != ESR_ELx_FSC_PERM && !device && kvm_has_mte(kvm)) { From 5a6e594fc60703d4589a9148bbf6e0136f40a605 Mon Sep 17 00:00:00 2001 From: Oliver Upton Date: Fri, 22 Sep 2023 22:32:29 +0000 Subject: [PATCH 103/515] KVM: arm64: Always invalidate TLB for stage-2 permission faults It is possible for multiple vCPUs to fault on the same IPA and attempt to resolve the fault. One of the page table walks will actually update the PTE and the rest will return -EAGAIN per our race detection scheme. KVM elides the TLB invalidation on the racing threads as the return value is nonzero. Before commit a12ab1378a88 ("KVM: arm64: Use local TLBI on permission relaxation") KVM always used broadcast TLB invalidations when handling permission faults, which had the convenient property of making the stage-2 updates visible to all CPUs in the system. However now we do a local invalidation, and TLBI elision leads to the vCPU thread faulting again on the stale entry. Remember that the architecture permits the TLB to cache translations that precipitate a permission fault. Invalidate the TLB entry responsible for the permission fault if the stage-2 descriptor has been relaxed, regardless of which thread actually did the job. Acked-by: Marc Zyngier Link: https://lore.kernel.org/r/20230922223229.1608155-1-oliver.upton@linux.dev Signed-off-by: Oliver Upton --- arch/arm64/kvm/hyp/pgtable.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index f155b8c9e98c7f..28688875179327 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -1314,7 +1314,7 @@ int kvm_pgtable_stage2_relax_perms(struct kvm_pgtable *pgt, u64 addr, ret = stage2_update_leaf_attrs(pgt, addr, 1, set, clr, NULL, &level, KVM_PGTABLE_WALK_HANDLE_FAULT | KVM_PGTABLE_WALK_SHARED); - if (!ret) + if (!ret || ret == -EAGAIN) kvm_call_hyp(__kvm_tlb_flush_vmid_ipa_nsh, pgt->mmu, addr, level); return ret; } From 76a4729964506bd5248cd08ccb154a8890e7d646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Mon, 25 Sep 2023 11:55:31 +0200 Subject: [PATCH 104/515] soc/xilinx: zynqmp_power: Convert to platform remove callback returning void MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is ignored (apart from emitting a warning) and this typically results in resource leaks. To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new() which already returns void. Eventually after all drivers are converted, .remove_new() will be renamed to .remove(). Trivially convert this driver from always returning zero in the remove callback to the void returning variant. Signed-off-by: Uwe Kleine-König Link: https://lore.kernel.org/r/20230925095532.1984344-41-u.kleine-koenig@pengutronix.de Signed-off-by: Michal Simek --- drivers/soc/xilinx/zynqmp_power.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/soc/xilinx/zynqmp_power.c b/drivers/soc/xilinx/zynqmp_power.c index c2c819701eec11..9d27f850f491ce 100644 --- a/drivers/soc/xilinx/zynqmp_power.c +++ b/drivers/soc/xilinx/zynqmp_power.c @@ -275,7 +275,7 @@ static int zynqmp_pm_probe(struct platform_device *pdev) return 0; } -static int zynqmp_pm_remove(struct platform_device *pdev) +static void zynqmp_pm_remove(struct platform_device *pdev) { sysfs_remove_file(&pdev->dev.kobj, &dev_attr_suspend_mode.attr); if (event_registered) @@ -283,8 +283,6 @@ static int zynqmp_pm_remove(struct platform_device *pdev) if (!rx_chan) mbox_free_channel(rx_chan); - - return 0; } static const struct of_device_id pm_of_match[] = { @@ -295,7 +293,7 @@ MODULE_DEVICE_TABLE(of, pm_of_match); static struct platform_driver zynqmp_pm_platform_driver = { .probe = zynqmp_pm_probe, - .remove = zynqmp_pm_remove, + .remove_new = zynqmp_pm_remove, .driver = { .name = "zynqmp_power", .of_match_table = pm_of_match, From aa4122dd5be905d8a4ecda9fdfcca69628d2971d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Sat, 16 Sep 2023 10:30:57 +0200 Subject: [PATCH 105/515] ARM: dts: BCM5301X: Relicense Felix's code to the GPL 2.0+ / MIT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move code added by Felix to the bcm-ns.dtsi which uses dual licensing. That syncs more Northstar code to be based on the same licensing schema. This code was added in the commit 1ff80363524c ("ARM: BCM5301X: Add profiling support"). Cc: Felix Fietkau Signed-off-by: Rafał Miłecki Acked-by: Felix Fietkau Link: https://lore.kernel.org/r/20230916083057.10458-1-zajec5@gmail.com Signed-off-by: Florian Fainelli --- arch/arm/boot/dts/broadcom/bcm-ns.dtsi | 7 +++++++ arch/arm/boot/dts/broadcom/bcm5301x.dtsi | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/arm/boot/dts/broadcom/bcm-ns.dtsi b/arch/arm/boot/dts/broadcom/bcm-ns.dtsi index 88fda18af1f8e6..f0f3a718c4130a 100644 --- a/arch/arm/boot/dts/broadcom/bcm-ns.dtsi +++ b/arch/arm/boot/dts/broadcom/bcm-ns.dtsi @@ -14,6 +14,13 @@ #address-cells = <1>; #size-cells = <1>; + pmu { + compatible = "arm,cortex-a9-pmu"; + interrupts = + , + ; + }; + chipcommon-a-bus@18000000 { compatible = "simple-bus"; ranges = <0x00000000 0x18000000 0x00001000>; diff --git a/arch/arm/boot/dts/broadcom/bcm5301x.dtsi b/arch/arm/boot/dts/broadcom/bcm5301x.dtsi index 600a1b54f2ae5c..de46dbd5b876ab 100644 --- a/arch/arm/boot/dts/broadcom/bcm5301x.dtsi +++ b/arch/arm/boot/dts/broadcom/bcm5301x.dtsi @@ -26,13 +26,6 @@ }; }; - pmu { - compatible = "arm,cortex-a9-pmu"; - interrupts = - , - ; - }; - clocks { #address-cells = <1>; #size-cells = <1>; From 3c960671fcdfcc4adc7bd1cc55f63501e37cf263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Sat, 16 Sep 2023 10:58:55 +0200 Subject: [PATCH 106/515] ARM: dts: BCM5301X: Relicense Vivek's code to the GPL 2.0+ / MIT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move code added by Vivek to the bcm-ns.dtsi which uses dual licensing. That syncs more Northstar code to be based on the same licensing schema. This code was added in the commit 37f6130ec39f ("ARM: dts: BCM5301X: Make USB 3.0 PHY use MDIO PHY driver"). Cc: Vivek Unune Signed-off-by: Rafał Miłecki Acked-by: Vivek Unune Link: https://lore.kernel.org/r/20230916085855.28375-1-zajec5@gmail.com Signed-off-by: Florian Fainelli --- arch/arm/boot/dts/broadcom/bcm-ns.dtsi | 27 ++++++++++++++++++++++++ arch/arm/boot/dts/broadcom/bcm5301x.dtsi | 27 ------------------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/arch/arm/boot/dts/broadcom/bcm-ns.dtsi b/arch/arm/boot/dts/broadcom/bcm-ns.dtsi index f0f3a718c4130a..d0d5f7e52a9176 100644 --- a/arch/arm/boot/dts/broadcom/bcm-ns.dtsi +++ b/arch/arm/boot/dts/broadcom/bcm-ns.dtsi @@ -327,6 +327,29 @@ #address-cells = <1>; }; + mdio-mux@18003000 { + compatible = "mdio-mux-mmioreg", "mdio-mux"; + mdio-parent-bus = <&mdio>; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x18003000 0x4>; + mux-mask = <0x200>; + + mdio@0 { + reg = <0x0>; + #address-cells = <1>; + #size-cells = <0>; + + usb3_phy: usb3-phy@10 { + compatible = "brcm,ns-ax-usb3-phy"; + reg = <0x10>; + usb3-dmp-syscon = <&usb3_dmp>; + #phy-cells = <0>; + status = "disabled"; + }; + }; + }; + rng: rng@18004000 { compatible = "brcm,bcm5301x-rng"; reg = <0x18004000 0x14>; @@ -467,6 +490,10 @@ brcm,nand-has-wp; }; + usb3_dmp: syscon@18105000 { + reg = <0x18105000 0x1000>; + }; + thermal-zones { cpu_thermal: cpu-thermal { polling-delay-passive = <0>; diff --git a/arch/arm/boot/dts/broadcom/bcm5301x.dtsi b/arch/arm/boot/dts/broadcom/bcm5301x.dtsi index de46dbd5b876ab..f06a178a9240ae 100644 --- a/arch/arm/boot/dts/broadcom/bcm5301x.dtsi +++ b/arch/arm/boot/dts/broadcom/bcm5301x.dtsi @@ -62,33 +62,6 @@ }; }; - mdio-mux@18003000 { - compatible = "mdio-mux-mmioreg", "mdio-mux"; - mdio-parent-bus = <&mdio>; - #address-cells = <1>; - #size-cells = <0>; - reg = <0x18003000 0x4>; - mux-mask = <0x200>; - - mdio@0 { - reg = <0x0>; - #address-cells = <1>; - #size-cells = <0>; - - usb3_phy: usb3-phy@10 { - compatible = "brcm,ns-ax-usb3-phy"; - reg = <0x10>; - usb3-dmp-syscon = <&usb3_dmp>; - #phy-cells = <0>; - status = "disabled"; - }; - }; - }; - - usb3_dmp: syscon@18105000 { - reg = <0x18105000 0x1000>; - }; - i2c0: i2c@18009000 { compatible = "brcm,iproc-i2c"; reg = <0x18009000 0x50>; From 5e8a8238ff5868cbc82d8caccb8b5dc7ae21406e Mon Sep 17 00:00:00 2001 From: Kieran Bingham Date: Mon, 25 Sep 2023 16:18:11 +0100 Subject: [PATCH 107/515] firmware: raspberrypi: Fix devm_rpi_firmware_get documentation The function documentation for devm_rpi_firmware_get() was missing a description for the dev parameter. Provide it and clear the warning produced here. Fixes: f663204c9a1f ("firmware: raspberrypi: Introduce devm_rpi_firmware_get()") Signed-off-by: Kieran Bingham Signed-off-by: Kieran Bingham Link: https://lore.kernel.org/r/20230925151812.142480-1-kieran.bingham+renesas@ideasonboard.com Signed-off-by: Florian Fainelli --- drivers/firmware/raspberrypi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c index f66efaa5196d9d..4cd290a60fbaaa 100644 --- a/drivers/firmware/raspberrypi.c +++ b/drivers/firmware/raspberrypi.c @@ -378,6 +378,7 @@ EXPORT_SYMBOL_GPL(rpi_firmware_get); /** * devm_rpi_firmware_get - Get pointer to rpi_firmware structure. + * @dev: The firmware device structure * @firmware_node: Pointer to the firmware Device Tree node. * * Returns NULL is the firmware device is not ready. From 9e2a2fd1ca0555bd0c278cd4061cc4bd9c8d0f7f Mon Sep 17 00:00:00 2001 From: Chen-Yu Tsai Date: Thu, 28 Sep 2023 16:55:24 +0800 Subject: [PATCH 108/515] dt-bindings: mfd: mt6397: Split out compatible for MediaTek MT6366 PMIC The MT6366 PMIC is mostly, but not fully, compatible with MT6358. It has a different set of regulators. Specifically, it lacks the camera related VCAM* LDOs and VLDO28, but has additional VM18, VMDDR, and VSRAM_CORE LDOs. The PMICs contain a chip ID register that can be used to detect which exact model is preset, so it is possible to share a common base compatible string. Add a separate compatible for the MT6366 PMIC, with a fallback to the MT6358 PMIC. Fixes: 49be16305587 ("dt-bindings: mfd: Add compatible for the MediaTek MT6366 PMIC") Signed-off-by: Chen-Yu Tsai Acked-by: Krzysztof Kozlowski Reviewed-by: AngeloGioacchino Del Regno Link: https://lore.kernel.org/r/20230928085537.3246669-2-wenst@chromium.org Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/mt6397.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt index 294693a8906cf5..10540aa7afa1af 100644 --- a/Documentation/devicetree/bindings/mfd/mt6397.txt +++ b/Documentation/devicetree/bindings/mfd/mt6397.txt @@ -22,8 +22,9 @@ compatible: "mediatek,mt6323" for PMIC MT6323 "mediatek,mt6331" for PMIC MT6331 and MT6332 "mediatek,mt6357" for PMIC MT6357 - "mediatek,mt6358" for PMIC MT6358 and MT6366 + "mediatek,mt6358" for PMIC MT6358 "mediatek,mt6359" for PMIC MT6359 + "mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366 "mediatek,mt6397" for PMIC MT6397 Optional subnodes: @@ -40,6 +41,7 @@ Optional subnodes: - compatible: "mediatek,mt6323-regulator" see ../regulator/mt6323-regulator.txt - compatible: "mediatek,mt6358-regulator" + - compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator" see ../regulator/mt6358-regulator.txt - compatible: "mediatek,mt6397-regulator" see ../regulator/mt6397-regulator.txt From 5f0c4e32e8da434a83dd74a08e477c11e7efc6f7 Mon Sep 17 00:00:00 2001 From: Justin Stitt Date: Wed, 27 Sep 2023 05:10:54 +0000 Subject: [PATCH 109/515] mfd: db8500-prcmu: Replace deprecated strncpy with strscpy `strncpy` is deprecated for use on NUL-terminated destination strings [1] and as such we should prefer more robust and less ambiguous string interfaces. We expect project_name to be NUL-terminated based on its use with pr_info: | pr_info("PRCMU firmware: %s(%d), version %d.%d.%d\n", | fw_info.version.project_name, | fw_info.version.project, | fw_info.version.api_version, | fw_info.version.func_version, | fw_info.version.errata); Moreover, NUL-padding does not seem to be needed. Considering the above, a suitable replacement is `strscpy` [2] due to the fact that it guarantees NUL-termination on the destination buffer without unnecessarily NUL-padding. Let's also change `PRCMU_FW_PROJECT_NAME_LEN` to just sizeof(fw_info.version.project_name) as this is more idiomatic strscpy usage. Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1] Link: https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html [2] Link: https://github.com/KSPP/linux/issues/90 Cc: linux-hardening@vger.kernel.org Signed-off-by: Justin Stitt Reviewed-by: Linus Walleij Link: https://lore.kernel.org/r/20230927-strncpy-drivers-mfd-db8500-prcmu-c-v1-1-db9693f92a68@google.com Signed-off-by: Lee Jones --- drivers/mfd/db8500-prcmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index 27a881da4d6e63..5b3e355e78f6b2 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c @@ -2639,9 +2639,9 @@ static void dbx500_fw_version_init(struct device_node *np) fw_info.version.api_version = (version >> 8) & 0xFF; fw_info.version.func_version = (version >> 16) & 0xFF; fw_info.version.errata = (version >> 24) & 0xFF; - strncpy(fw_info.version.project_name, + strscpy(fw_info.version.project_name, fw_project_name(fw_info.version.project), - PRCMU_FW_PROJECT_NAME_LEN); + sizeof(fw_info.version.project_name)); fw_info.valid = true; pr_info("PRCMU firmware: %s(%d), version %d.%d.%d\n", fw_info.version.project_name, From c2b7575239f5d0925035f3fc3bb155d176abee80 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 29 Sep 2023 17:23:35 +0200 Subject: [PATCH 110/515] leds: lm3601x: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20230929-leds-maple-v1-1-ba5f9dcb1e75@kernel.org Signed-off-by: Lee Jones --- drivers/leds/flash/leds-lm3601x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/flash/leds-lm3601x.c b/drivers/leds/flash/leds-lm3601x.c index b6c524facf498b..8191be0ef0c693 100644 --- a/drivers/leds/flash/leds-lm3601x.c +++ b/drivers/leds/flash/leds-lm3601x.c @@ -123,7 +123,7 @@ static const struct regmap_config lm3601x_regmap = { .max_register = LM3601X_DEV_ID_REG, .reg_defaults = lm3601x_regmap_defs, .num_reg_defaults = ARRAY_SIZE(lm3601x_regmap_defs), - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_reg = lm3601x_volatile_reg, }; From 2aedfe62b4151b0abe35bf022edf18f84817afcd Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 29 Sep 2023 17:23:36 +0200 Subject: [PATCH 111/515] leds: aw200xx: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20230929-leds-maple-v1-2-ba5f9dcb1e75@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-aw200xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c index 4d517cace3e797..14ca236ce29e59 100644 --- a/drivers/leds/leds-aw200xx.c +++ b/drivers/leds/leds-aw200xx.c @@ -479,7 +479,7 @@ static const struct regmap_config aw200xx_regmap_config = { .num_ranges = ARRAY_SIZE(aw200xx_ranges), .rd_table = &aw200xx_readable_table, .wr_table = &aw200xx_writeable_table, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static int aw200xx_probe(struct i2c_client *client) From c2ecac98222a23ad8209a71ad5c1e32a8be46392 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 29 Sep 2023 17:23:37 +0200 Subject: [PATCH 112/515] leds: lm392x: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20230929-leds-maple-v1-3-ba5f9dcb1e75@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-lm3692x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-lm3692x.c b/drivers/leds/leds-lm3692x.c index f8ad61e47a1929..c319ff4d70b2aa 100644 --- a/drivers/leds/leds-lm3692x.c +++ b/drivers/leds/leds-lm3692x.c @@ -139,7 +139,7 @@ static const struct regmap_config lm3692x_regmap_config = { .max_register = LM3692X_FAULT_FLAGS, .reg_defaults = lm3692x_reg_defs, .num_reg_defaults = ARRAY_SIZE(lm3692x_reg_defs), - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static int lm3692x_fault_check(struct lm3692x_led *led) From 2997d69d888d6ee7114a89d066889a016448422a Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 29 Sep 2023 17:23:38 +0200 Subject: [PATCH 113/515] leds: lp3952: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20230929-leds-maple-v1-4-ba5f9dcb1e75@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-lp3952.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-lp3952.c b/drivers/leds/leds-lp3952.c index 62ade3f05a87eb..5d18bbfd1f2318 100644 --- a/drivers/leds/leds-lp3952.c +++ b/drivers/leds/leds-lp3952.c @@ -204,7 +204,7 @@ static const struct regmap_config lp3952_regmap = { .reg_bits = 8, .val_bits = 8, .max_register = REG_MAX, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static int lp3952_probe(struct i2c_client *client) From aa732bb3da329abc28b4eee89efd974acb5b8c36 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 11:27:48 +0100 Subject: [PATCH 114/515] mfd: tps65086: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-ti-maple-v1-1-0657862de3f6@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/tps65086.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c index 9bb7d7d8dcfcaa..152179ee11ca89 100644 --- a/drivers/mfd/tps65086.c +++ b/drivers/mfd/tps65086.c @@ -34,7 +34,7 @@ static const struct regmap_access_table tps65086_volatile_table = { static const struct regmap_config tps65086_regmap_config = { .reg_bits = 8, .val_bits = 8, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_table = &tps65086_volatile_table, }; From 21a3beab2dbf6c0f3fdc45a14dfffbe2d1c53e79 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 11:27:49 +0100 Subject: [PATCH 115/515] mfd: tps65090: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-ti-maple-v1-2-0657862de3f6@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/tps65090.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/tps65090.c b/drivers/mfd/tps65090.c index 9245e11219f3ce..b764badaa62a43 100644 --- a/drivers/mfd/tps65090.c +++ b/drivers/mfd/tps65090.c @@ -151,7 +151,7 @@ static const struct regmap_config tps65090_regmap_config = { .val_bits = 8, .max_register = TPS65090_MAX_REG, .num_reg_defaults_raw = TPS65090_NUM_REGS, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_reg = is_volatile_reg, }; From d252f0f6c8df10559cca85bc8824e9b7c45c1c51 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 11:27:50 +0100 Subject: [PATCH 116/515] mfd: tps65128: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-ti-maple-v1-3-0657862de3f6@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/tps65218.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/tps65218.c b/drivers/mfd/tps65218.c index 11e4e52b56bef7..427a2b97f11711 100644 --- a/drivers/mfd/tps65218.c +++ b/drivers/mfd/tps65218.c @@ -127,7 +127,7 @@ static const struct regmap_access_table tps65218_volatile_table = { static const struct regmap_config tps65218_regmap_config = { .reg_bits = 8, .val_bits = 8, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_table = &tps65218_volatile_table, }; From 0c16d3d6b758aca06c7c550cc43b8a0368525bba Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 11:27:51 +0100 Subject: [PATCH 117/515] mfd: tps6586x: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-ti-maple-v1-4-0657862de3f6@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/tps6586x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c index 7e8160b947848d..03c65bbf214389 100644 --- a/drivers/mfd/tps6586x.c +++ b/drivers/mfd/tps6586x.c @@ -456,7 +456,7 @@ static const struct regmap_config tps6586x_regmap_config = { .val_bits = 8, .max_register = TPS6586X_MAX_REGISTER, .volatile_reg = is_volatile_reg, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static int tps6586x_power_off_handler(struct sys_off_data *data) From f77a3bcff35c1c8bccb347f2f7cf3e25af782984 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 11:27:52 +0100 Subject: [PATCH 118/515] mfd: tps65910: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-ti-maple-v1-5-0657862de3f6@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/tps65910.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c index 41408df1712f08..307d30da274b14 100644 --- a/drivers/mfd/tps65910.c +++ b/drivers/mfd/tps65910.c @@ -281,7 +281,7 @@ static const struct regmap_config tps65910_regmap_config = { .val_bits = 8, .volatile_reg = is_volatile_reg, .max_register = TPS65910_MAX_REGISTER - 1, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static int tps65910_ck32k_init(struct tps65910 *tps65910, From 6e554a744ff576223275fbedafccf9d88581b1fd Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 11:27:53 +0100 Subject: [PATCH 119/515] mfd: tps65912: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-ti-maple-v1-6-0657862de3f6@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/tps65912-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c index 7d994b8a5965f3..2305ea60367ac3 100644 --- a/drivers/mfd/tps65912-core.c +++ b/drivers/mfd/tps65912-core.c @@ -81,7 +81,7 @@ static const struct regmap_access_table tps65912_volatile_table = { const struct regmap_config tps65912_regmap_config = { .reg_bits = 8, .val_bits = 8, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_table = &tps65912_volatile_table, }; EXPORT_SYMBOL_GPL(tps65912_regmap_config); From 680d253c3ba0674b8da269e5c51e6caaa623cad5 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 11:27:54 +0100 Subject: [PATCH 120/515] mfd: twl: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-ti-maple-v1-7-0657862de3f6@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/twl-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 234500b2e53fca..6e384a79e34189 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -314,7 +314,7 @@ static const struct regmap_config twl4030_regmap_config[4] = { .reg_defaults = twl4030_49_defaults, .num_reg_defaults = ARRAY_SIZE(twl4030_49_defaults), - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }, { /* Address 0x4a */ From 2341a4f343e90f3fcc49ff3a49610d251b4c2532 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 00:44:22 +0100 Subject: [PATCH 121/515] mfd: rk8xx: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-rk88x-maple-v1-1-90434cfb2f90@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/rk8xx-i2c.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mfd/rk8xx-i2c.c b/drivers/mfd/rk8xx-i2c.c index 1a98feea97e2c5..75b5cf09d5a033 100644 --- a/drivers/mfd/rk8xx-i2c.c +++ b/drivers/mfd/rk8xx-i2c.c @@ -80,7 +80,7 @@ static const struct regmap_config rk818_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = RK818_USB_CTRL_REG, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_reg = rk808_is_volatile_reg, }; @@ -88,7 +88,7 @@ static const struct regmap_config rk805_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = RK805_OFF_SOURCE_REG, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_reg = rk808_is_volatile_reg, }; @@ -96,7 +96,7 @@ static const struct regmap_config rk808_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = RK808_IO_POL_REG, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .volatile_reg = rk808_is_volatile_reg, }; From ae1fbe1b021a3075020856b2717fd971a72f9429 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 2 Oct 2023 11:33:44 +0300 Subject: [PATCH 122/515] mfd: intel-lpss: Add Intel Lunar Lake-M PCI IDs Add Intel Lunar Lake-M SoC PCI IDs. Signed-off-by: Jarkko Nikula Link: https://lore.kernel.org/r/20231002083344.75611-1-jarkko.nikula@linux.intel.com Signed-off-by: Lee Jones --- drivers/mfd/intel-lpss-pci.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c index 699f44ffff0e4b..ae5759200622c4 100644 --- a/drivers/mfd/intel-lpss-pci.c +++ b/drivers/mfd/intel-lpss-pci.c @@ -561,6 +561,19 @@ static const struct pci_device_id intel_lpss_pci_ids[] = { { PCI_VDEVICE(INTEL, 0xa3e2), (kernel_ulong_t)&spt_i2c_info }, { PCI_VDEVICE(INTEL, 0xa3e3), (kernel_ulong_t)&spt_i2c_info }, { PCI_VDEVICE(INTEL, 0xa3e6), (kernel_ulong_t)&spt_uart_info }, + /* LNL-M */ + { PCI_VDEVICE(INTEL, 0xa825), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0xa826), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0xa827), (kernel_ulong_t)&tgl_info }, + { PCI_VDEVICE(INTEL, 0xa830), (kernel_ulong_t)&tgl_info }, + { PCI_VDEVICE(INTEL, 0xa846), (kernel_ulong_t)&tgl_info }, + { PCI_VDEVICE(INTEL, 0xa850), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0xa851), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0xa852), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0xa878), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0xa879), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0xa87a), (kernel_ulong_t)&ehl_i2c_info }, + { PCI_VDEVICE(INTEL, 0xa87b), (kernel_ulong_t)&ehl_i2c_info }, { } }; MODULE_DEVICE_TABLE(pci, intel_lpss_pci_ids); From d940a9c2e9320ac9cebcdf93087df850b377b6a8 Mon Sep 17 00:00:00 2001 From: Luca Weiss Date: Mon, 2 Oct 2023 09:00:11 +0200 Subject: [PATCH 123/515] dt-bindings: mfd: qcom,spmi-pmic: Drop unused labels from examples There's not much point in having unused labels in the binding example, so drop them. This patch was originally motivated by ea25d61b448a ("arm64: dts: qcom: Use plural _gpios node label for PMIC gpios") updating all dts files to use the plural _gpios label instead of the singular _gpio as label but this example wasn't updated. But since we should just drop the label alltogether, do that. Signed-off-by: Luca Weiss Acked-by: Conor Dooley Acked-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20231002-pm7250b-gpio-fixup-v2-1-debb8b599989@fairphone.com Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml index 55e931ba5b47ee..9fa56860393069 100644 --- a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml +++ b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml @@ -239,13 +239,13 @@ examples: interrupt-controller; #interrupt-cells = <4>; - pmi8998_lsid0: pmic@2 { + pmic@2 { compatible = "qcom,pmi8998", "qcom,spmi-pmic"; reg = <0x2 SPMI_USID>; #address-cells = <1>; #size-cells = <0>; - pmi8998_gpio: gpio@c000 { + gpio@c000 { compatible = "qcom,pmi8998-gpio", "qcom,spmi-gpio"; reg = <0xc000>; gpio-controller; @@ -330,7 +330,7 @@ examples: }; }; - pm6150_gpio: gpio@c000 { + gpio@c000 { compatible = "qcom,pm6150-gpio", "qcom,spmi-gpio"; reg = <0xc000>; gpio-controller; From ed84d55d5115455d17fa93f63dbf89697a309d6e Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 2 Oct 2023 16:56:29 +0300 Subject: [PATCH 124/515] leds: tca6507: Don't use fixed GPIO base First of all, the fixed GPIO base is source of troubles and it doesn't scale. Second, there is no in-kernel user of this base, so drop it. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231002135629.2605462-1-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/leds-tca6507.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/drivers/leds/leds-tca6507.c b/drivers/leds/leds-tca6507.c index aab8617712101b..e190746140959e 100644 --- a/drivers/leds/leds-tca6507.c +++ b/drivers/leds/leds-tca6507.c @@ -92,9 +92,6 @@ struct tca6507_platform_data { struct led_platform_data leds; -#ifdef CONFIG_GPIOLIB - int gpio_base; -#endif }; #define TCA6507_MAKE_GPIO 1 @@ -636,7 +633,7 @@ static int tca6507_probe_gpios(struct device *dev, tca->gpio.label = "gpio-tca6507"; tca->gpio.ngpio = gpios; - tca->gpio.base = pdata->gpio_base; + tca->gpio.base = -1; tca->gpio.owner = THIS_MODULE; tca->gpio.direction_output = tca6507_gpio_direction_output; tca->gpio.set = tca6507_gpio_set_value; @@ -715,9 +712,6 @@ tca6507_led_dt_init(struct device *dev) pdata->leds.leds = tca_leds; pdata->leds.num_leds = NUM_LEDS; -#ifdef CONFIG_GPIOLIB - pdata->gpio_base = -1; -#endif return pdata; } From 966f92187485bf43edd76b7c53781cafa20cf808 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 00:47:05 +0100 Subject: [PATCH 125/515] mfd: max77620: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Link: https://lore.kernel.org/r/20231001-mfd-maxim-maple-v1-1-cdfeb48a4d15@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/max77620.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c index e63e8e47d908d9..74ef3f6d576cca 100644 --- a/drivers/mfd/max77620.c +++ b/drivers/mfd/max77620.c @@ -172,7 +172,7 @@ static const struct regmap_config max77620_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = MAX77620_REG_DVSSD4 + 1, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .rd_table = &max77620_readable_table, .wr_table = &max77620_writable_table, .volatile_table = &max77620_volatile_table, @@ -184,7 +184,7 @@ static const struct regmap_config max20024_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = MAX20024_REG_MAX_ADD + 1, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .rd_table = &max20024_readable_table, .wr_table = &max77620_writable_table, .volatile_table = &max77620_volatile_table, @@ -213,7 +213,7 @@ static const struct regmap_config max77663_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = MAX77620_REG_CID5 + 1, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, .rd_table = &max77663_readable_table, .wr_table = &max77663_writable_table, .volatile_table = &max77620_volatile_table, From ce828b9f04ba338ed3a1fb8d5137a0a66973b479 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 00:47:06 +0100 Subject: [PATCH 126/515] mfd: max77686: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Reviewed-by: Krzysztof Kozlowski Reviewed-by: Chanwoo Choi Link: https://lore.kernel.org/r/20231001-mfd-maxim-maple-v1-2-cdfeb48a4d15@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/max77686.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/max77686.c b/drivers/mfd/max77686.c index 91c286c4571cbd..0118a444a68b11 100644 --- a/drivers/mfd/max77686.c +++ b/drivers/mfd/max77686.c @@ -108,7 +108,7 @@ static const struct regmap_config max77802_regmap_config = { .precious_reg = max77802_is_precious_reg, .volatile_reg = max77802_is_volatile_reg, .name = "max77802-pmic", - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static const struct regmap_irq max77686_irqs[] = { From 58704298aa29615108e2dd33f88b31ae38609096 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 1 Oct 2023 00:47:07 +0100 Subject: [PATCH 127/515] mfd: max8907: Convert to use maple tree register cache The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. Signed-off-by: Mark Brown Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20231001-mfd-maxim-maple-v1-3-cdfeb48a4d15@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/max8907.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/mfd/max8907.c b/drivers/mfd/max8907.c index 8bbe7979db9145..accf426234b66b 100644 --- a/drivers/mfd/max8907.c +++ b/drivers/mfd/max8907.c @@ -63,7 +63,7 @@ static const struct regmap_config max8907_regmap_gen_config = { .precious_reg = max8907_gen_is_precious_reg, .writeable_reg = max8907_gen_is_writeable_reg, .max_register = MAX8907_REG_LDO20VOUT, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static bool max8907_rtc_is_volatile_reg(struct device *dev, unsigned int reg) @@ -108,7 +108,7 @@ static const struct regmap_config max8907_regmap_rtc_config = { .precious_reg = max8907_rtc_is_precious_reg, .writeable_reg = max8907_rtc_is_writeable_reg, .max_register = MAX8907_REG_MPL_CNTL, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_MAPLE, }; static const struct regmap_irq max8907_chg_irqs[] = { From 89c8e0520d2df61e78d4201b5514e8877de9f1a5 Mon Sep 17 00:00:00 2001 From: Russ Weight Date: Thu, 28 Sep 2023 09:47:38 -0700 Subject: [PATCH 128/515] mfd: intel-m10-bmc: Change contact for ABI docs Change ABI documentation contact information from Russ Weight to Peter Colberg. Signed-off-by: Russ Weight Acked-by: Peter Colberg Link: https://lore.kernel.org/r/20230928164738.278635-1-russell.h.weight@intel.com Signed-off-by: Lee Jones --- Documentation/ABI/testing/sysfs-driver-intel-m10-bmc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc b/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc index a8ab58035c95f0..c12316dfd9732d 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc +++ b/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc @@ -17,7 +17,7 @@ Description: Read only. Returns the firmware version of Intel MAX10 What: /sys/bus/.../drivers/intel-m10-bmc/.../mac_address Date: January 2021 KernelVersion: 5.12 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns the first MAC address in a block of sequential MAC addresses assigned to the board that is managed by the Intel MAX10 BMC. It is stored in @@ -28,7 +28,7 @@ Description: Read only. Returns the first MAC address in a block What: /sys/bus/.../drivers/intel-m10-bmc/.../mac_count Date: January 2021 KernelVersion: 5.12 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns the number of sequential MAC addresses assigned to the board managed by the Intel MAX10 BMC. This value is stored in FLASH and is mirrored From a37d4c46392e207518deb6533768986634b193c0 Mon Sep 17 00:00:00 2001 From: Brian Foster Date: Mon, 2 Oct 2023 14:50:20 -0400 Subject: [PATCH 129/515] ext4: fix racy may inline data check in dio write syzbot reports that the following warning from ext4_iomap_begin() triggers as of the commit referenced below: if (WARN_ON_ONCE(ext4_has_inline_data(inode))) return -ERANGE; This occurs during a dio write, which is never expected to encounter an inode with inline data. To enforce this behavior, ext4_dio_write_iter() checks the current inline state of the inode and clears the MAY_INLINE_DATA state flag to either fall back to buffered writes, or enforce that any other writers in progress on the inode are not allowed to create inline data. The problem is that the check for existing inline data and the state flag can span a lock cycle. For example, if the ilock is originally locked shared and subsequently upgraded to exclusive, another writer may have reacquired the lock and created inline data before the dio write task acquires the lock and proceeds. The commit referenced below loosens the lock requirements to allow some forms of unaligned dio writes to occur under shared lock, but AFAICT the inline data check was technically already racy for any dio write that would have involved a lock cycle. Regardless, lift clearing of the state bit to the same lock critical section that checks for preexisting inline data on the inode to close the race. Reported-by: syzbot+307da6ca5cb0d01d581a@syzkaller.appspotmail.com Fixes: 310ee0902b8d ("ext4: allow concurrent unaligned dio overwrites") Signed-off-by: Brian Foster Link: https://lore.kernel.org/r/20231002185020.531537-1-bfoster@redhat.com Signed-off-by: Theodore Ts'o --- fs/ext4/file.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 6830ea3a6c59c6..747c0378122daa 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -569,18 +569,20 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from) return ext4_buffered_write_iter(iocb, from); } + /* + * Prevent inline data from being created since we are going to allocate + * blocks for DIO. We know the inode does not currently have inline data + * because ext4_should_use_dio() checked for it, but we have to clear + * the state flag before the write checks because a lock cycle could + * introduce races with other writers. + */ + ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); + ret = ext4_dio_write_checks(iocb, from, &ilock_shared, &extend, &unwritten, &dio_flags); if (ret <= 0) return ret; - /* - * Make sure inline data cannot be created anymore since we are going - * to allocate blocks for DIO. We know the inode does not have any - * inline data now because ext4_dio_supported() checked for that. - */ - ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); - offset = iocb->ki_pos; count = ret; From 2db949178eca1434942efbe8032c7e9ffec32876 Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Thu, 5 Oct 2023 10:17:46 -0700 Subject: [PATCH 130/515] fs/proc: Add boot loader arguments as comment to /proc/bootconfig In kernels built with CONFIG_BOOT_CONFIG_FORCE=y, /proc/cmdline will show all kernel boot parameters, both those supplied by the boot loader and those embedded in the kernel image. This works well for those who just want to see all of the kernel boot parameters, but is not helpful to those who need to see only those parameters supplied by the boot loader. This is especially important when these parameters are presented to the boot loader by automation that might gather them from diverse sources. It is also useful when booting the next kernel via kexec(), in which case it is necessary to supply only those kernel command-line arguments from the boot loader, and most definitely not those that were embedded into the current kernel. Therefore, add comments to /proc/bootconfig of the form: # Parameters from bootloader: # root=UUID=ac0f0548-a69d-43ca-a06b-7db01bcbd5ad ro quiet ... The second added line shows only those kernel boot parameters supplied by the boot loader. Link: https://lore.kernel.org/all/CAHk-=wjpVAW3iRq_bfKnVfs0ZtASh_aT67bQBG11b4W6niYVUw@mail.gmail.com/ Link: https://lore.kernel.org/all/20230731233130.424913-1-paulmck@kernel.org/ Co-developed-by: Masami Hiramatsu Link: https://lore.kernel.org/all/20231005171747.541123-2-paulmck@kernel.org/ Signed-off-by: Masami Hiramatsu Link: https://lore.kernel.org/all/20231005171747.541123-2-paulmck@kernel.org/ Signed-off-by: Paul E. McKenney Cc: Linus Torvalds Cc: Stephen Rothwell Cc: Arnd Bergmann Cc: Nick Desaulniers Cc: Alexey Dobriyan Cc: Andrew Morton Cc: Kees Cook Cc: Cc: Acked-by: Masami Hiramatsu (Google) Signed-off-by: Masami Hiramatsu (Google) --- fs/proc/bootconfig.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/proc/bootconfig.c b/fs/proc/bootconfig.c index 2e244ada1f970b..902b326e1e5607 100644 --- a/fs/proc/bootconfig.c +++ b/fs/proc/bootconfig.c @@ -62,6 +62,12 @@ static int __init copy_xbc_key_value_list(char *dst, size_t size) break; dst += ret; } + if (ret >= 0 && boot_command_line[0]) { + ret = snprintf(dst, rest(dst, end), "# Parameters from bootloader:\n# %s\n", + boot_command_line); + if (ret > 0) + dst += ret; + } } out: kfree(key); From fe632ccbe7eb9780b7477a30822f1cb83db25c6f Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Thu, 5 Oct 2023 10:17:47 -0700 Subject: [PATCH 131/515] doc: Add /proc/bootconfig to proc.rst Add /proc/bootconfig description to Documentation/filesystems/proc.rst. Reported-by: Masami Hiramatsu Link: https://lore.kernel.org/all/20231005171747.541123-3-paulmck@kernel.org/ Signed-off-by: Paul E. McKenney Acked-by: Masami Hiramatsu (Google) Signed-off-by: Masami Hiramatsu (Google) --- Documentation/filesystems/proc.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/filesystems/proc.rst b/Documentation/filesystems/proc.rst index 36da7038a1c939..7d56c87eba7806 100644 --- a/Documentation/filesystems/proc.rst +++ b/Documentation/filesystems/proc.rst @@ -689,6 +689,11 @@ files are there, and which are missing. File Content ============ =============================================================== apm Advanced power management info + bootconfig Kernel command line obtained from boot config, + and, if there were kernel parameters from the + boot loader, a "# Parameters from bootloader:" + line followed by a line containing those + parameters prefixed by "# ". (5.5) buddyinfo Kernel memory allocator information (see text) (2.5) bus Directory containing bus specific information cmdline Kernel command line, both from bootloader and embedded From 45c9683d5ce1e2db792222bee6af1b3f802d0b24 Mon Sep 17 00:00:00 2001 From: Zenghui Yu Date: Sat, 7 Oct 2023 20:40:42 +0800 Subject: [PATCH 132/515] KVM: arm64: selftest: Add the missing .guest_prepare() Running page_fault_test on a Cortex A72 fails with Test: ro_memslot_no_syndrome_guest_cas Testing guest mode: PA-bits:40, VA-bits:48, 4K pages Testing memory backing src type: anonymous ==== Test Assertion Failure ==== aarch64/page_fault_test.c:117: guest_check_lse() pid=1944087 tid=1944087 errno=4 - Interrupted system call 1 0x00000000004028b3: vcpu_run_loop at page_fault_test.c:682 2 0x0000000000402d93: run_test at page_fault_test.c:731 3 0x0000000000403957: for_each_guest_mode at guest_modes.c:100 4 0x00000000004019f3: for_each_test_and_guest_mode at page_fault_test.c:1108 5 (inlined by) main at page_fault_test.c:1134 6 0x0000ffff868e503b: ?? ??:0 7 0x0000ffff868e5113: ?? ??:0 8 0x0000000000401aaf: _start at ??:? guest_check_lse() because we don't have a guest_prepare stage to check the presence of FEAT_LSE and skip the related guest_cas testing, and we end-up failing in GUEST_ASSERT(guest_check_lse()). Add the missing .guest_prepare() where it's indeed required. Signed-off-by: Zenghui Yu Acked-by: Marc Zyngier Link: https://lore.kernel.org/r/20231007124043.626-1-yuzenghui@huawei.com Signed-off-by: Oliver Upton --- tools/testing/selftests/kvm/aarch64/page_fault_test.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/testing/selftests/kvm/aarch64/page_fault_test.c b/tools/testing/selftests/kvm/aarch64/page_fault_test.c index 47bb914ab2fa83..eb5ead50c0b126 100644 --- a/tools/testing/selftests/kvm/aarch64/page_fault_test.c +++ b/tools/testing/selftests/kvm/aarch64/page_fault_test.c @@ -842,6 +842,7 @@ static void help(char *name) .name = SCAT2(ro_memslot_no_syndrome, _access), \ .data_memslot_flags = KVM_MEM_READONLY, \ .pt_memslot_flags = KVM_MEM_READONLY, \ + .guest_prepare = { _PREPARE(_access) }, \ .guest_test = _access, \ .fail_vcpu_run_handler = fail_vcpu_run_mmio_no_syndrome_handler, \ .expected_events = { .fail_vcpu_runs = 1 }, \ @@ -865,6 +866,7 @@ static void help(char *name) .name = SCAT2(ro_memslot_no_syn_and_dlog, _access), \ .data_memslot_flags = KVM_MEM_READONLY | KVM_MEM_LOG_DIRTY_PAGES, \ .pt_memslot_flags = KVM_MEM_READONLY | KVM_MEM_LOG_DIRTY_PAGES, \ + .guest_prepare = { _PREPARE(_access) }, \ .guest_test = _access, \ .guest_test_check = { _test_check }, \ .fail_vcpu_run_handler = fail_vcpu_run_mmio_no_syndrome_handler, \ @@ -894,6 +896,7 @@ static void help(char *name) .data_memslot_flags = KVM_MEM_READONLY, \ .pt_memslot_flags = KVM_MEM_READONLY, \ .mem_mark_cmd = CMD_HOLE_DATA | CMD_HOLE_PT, \ + .guest_prepare = { _PREPARE(_access) }, \ .guest_test = _access, \ .uffd_data_handler = _uffd_data_handler, \ .uffd_pt_handler = uffd_pt_handler, \ From a9c9864f3c2f7edc4b24849f77aa57d2258b46fd Mon Sep 17 00:00:00 2001 From: Zenghui Yu Date: Sat, 7 Oct 2023 20:40:43 +0800 Subject: [PATCH 133/515] KVM: arm64: selftest: Perform ISB before reading PAR_EL1 It looks like a mistake to issue ISB *after* reading PAR_EL1, we should instead perform it between the AT instruction and the reads of PAR_EL1. As according to DDI0487J.a IJTYVP, "When an address translation instruction is executed, explicit synchronization is required to guarantee the result is visible to subsequent direct reads of PAR_EL1." Otherwise all guest_at testcases fail on my box with ==== Test Assertion Failure ==== aarch64/page_fault_test.c:142: par & 1 == 0 pid=1355864 tid=1355864 errno=4 - Interrupted system call 1 0x0000000000402853: vcpu_run_loop at page_fault_test.c:681 2 0x0000000000402cdb: run_test at page_fault_test.c:730 3 0x0000000000403897: for_each_guest_mode at guest_modes.c:100 4 0x00000000004019f3: for_each_test_and_guest_mode at page_fault_test.c:1105 5 (inlined by) main at page_fault_test.c:1131 6 0x0000ffffb153c03b: ?? ??:0 7 0x0000ffffb153c113: ?? ??:0 8 0x0000000000401aaf: _start at ??:? 0x1 != 0x0 (par & 1 != 0) Signed-off-by: Zenghui Yu Acked-by: Marc Zyngier Link: https://lore.kernel.org/r/20231007124043.626-2-yuzenghui@huawei.com Signed-off-by: Oliver Upton --- tools/testing/selftests/kvm/aarch64/page_fault_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/aarch64/page_fault_test.c b/tools/testing/selftests/kvm/aarch64/page_fault_test.c index eb5ead50c0b126..9a3be80e8bc916 100644 --- a/tools/testing/selftests/kvm/aarch64/page_fault_test.c +++ b/tools/testing/selftests/kvm/aarch64/page_fault_test.c @@ -135,8 +135,8 @@ static void guest_at(void) uint64_t par; asm volatile("at s1e1r, %0" :: "r" (guest_test_memory)); - par = read_sysreg(par_el1); isb(); + par = read_sysreg(par_el1); /* Bit 1 indicates whether the AT was successful */ GUEST_ASSERT_EQ(par & 1, 0); From 5b02f138839ea48d5ac87f5e3f4d206c7189c586 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Fri, 3 Jun 2022 06:50:50 -0700 Subject: [PATCH 134/515] xtensa: import ESP32 core variant Import processor configuration for the Xtensa core found in Espressif ESP32 SoC. Signed-off-by: Max Filippov --- .../variants/esp32/include/variant/core.h | 655 ++++++++++++++++++ .../variants/esp32/include/variant/tie-asm.h | 323 +++++++++ .../variants/esp32/include/variant/tie.h | 182 +++++ 3 files changed, 1160 insertions(+) create mode 100644 arch/xtensa/variants/esp32/include/variant/core.h create mode 100644 arch/xtensa/variants/esp32/include/variant/tie-asm.h create mode 100644 arch/xtensa/variants/esp32/include/variant/tie.h diff --git a/arch/xtensa/variants/esp32/include/variant/core.h b/arch/xtensa/variants/esp32/include/variant/core.h new file mode 100644 index 00000000000000..f3f4e45f001f85 --- /dev/null +++ b/arch/xtensa/variants/esp32/include/variant/core.h @@ -0,0 +1,655 @@ +/* + * xtensa/config/core-isa.h -- HAL definitions that are dependent on Xtensa + * processor CORE configuration + * + * See , which includes this file, for more details. + */ + +/* Xtensa processor core configuration information. + + Copyright (c) 1999-2016 Tensilica Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_CONFIGURATION_H +#define _XTENSA_CORE_CONFIGURATION_H + + +/**************************************************************************** + Parameters Useful for Any Code, USER or PRIVILEGED + ****************************************************************************/ + +/* + * Note: Macros of the form XCHAL_HAVE_*** have a value of 1 if the option is + * configured, and a value of 0 otherwise. These macros are always defined. + */ + + +/*---------------------------------------------------------------------- + ISA + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_BE 0 /* big-endian byte ordering */ +#define XCHAL_HAVE_WINDOWED 1 /* windowed registers option */ +#define XCHAL_NUM_AREGS 64 /* num of physical addr regs */ +#define XCHAL_NUM_AREGS_LOG2 6 /* log2(XCHAL_NUM_AREGS) */ +#define XCHAL_MAX_INSTRUCTION_SIZE 3 /* max instr bytes (3..8) */ +#define XCHAL_HAVE_DEBUG 1 /* debug option */ +#define XCHAL_HAVE_DENSITY 1 /* 16-bit instructions */ +#define XCHAL_HAVE_LOOPS 1 /* zero-overhead loops */ +#define XCHAL_LOOP_BUFFER_SIZE 256 /* zero-ov. loop instr buffer size */ +#define XCHAL_HAVE_NSA 1 /* NSA/NSAU instructions */ +#define XCHAL_HAVE_MINMAX 1 /* MIN/MAX instructions */ +#define XCHAL_HAVE_SEXT 1 /* SEXT instruction */ +#define XCHAL_HAVE_DEPBITS 0 /* DEPBITS instruction */ +#define XCHAL_HAVE_CLAMPS 1 /* CLAMPS instruction */ +#define XCHAL_HAVE_MUL16 1 /* MUL16S/MUL16U instructions */ +#define XCHAL_HAVE_MUL32 1 /* MULL instruction */ +#define XCHAL_HAVE_MUL32_HIGH 1 /* MULUH/MULSH instructions */ +#define XCHAL_HAVE_DIV32 1 /* QUOS/QUOU/REMS/REMU instructions */ +#define XCHAL_HAVE_L32R 1 /* L32R instruction */ +#define XCHAL_HAVE_ABSOLUTE_LITERALS 0 /* non-PC-rel (extended) L32R */ +#define XCHAL_HAVE_CONST16 0 /* CONST16 instruction */ +#define XCHAL_HAVE_ADDX 1 /* ADDX#/SUBX# instructions */ +#define XCHAL_HAVE_WIDE_BRANCHES 0 /* B*.W18 or B*.W15 instr's */ +#define XCHAL_HAVE_PREDICTED_BRANCHES 0 /* B[EQ/EQZ/NE/NEZ]T instr's */ +#define XCHAL_HAVE_CALL4AND12 1 /* (obsolete option) */ +#define XCHAL_HAVE_ABS 1 /* ABS instruction */ +/*#define XCHAL_HAVE_POPC 0*/ /* POPC instruction */ +/*#define XCHAL_HAVE_CRC 0*/ /* CRC instruction */ +#define XCHAL_HAVE_RELEASE_SYNC 1 /* L32AI/S32RI instructions */ +#define XCHAL_HAVE_S32C1I 1 /* S32C1I instruction */ +#define XCHAL_HAVE_SPECULATION 0 /* speculation */ +#define XCHAL_HAVE_FULL_RESET 1 /* all regs/state reset */ +#define XCHAL_NUM_CONTEXTS 1 /* */ +#define XCHAL_NUM_MISC_REGS 4 /* num of scratch regs (0..4) */ +#define XCHAL_HAVE_TAP_MASTER 0 /* JTAG TAP control instr's */ +#define XCHAL_HAVE_PRID 1 /* processor ID register */ +#define XCHAL_HAVE_EXTERN_REGS 1 /* WER/RER instructions */ +#define XCHAL_HAVE_MX 0 /* MX core (Tensilica internal) */ +#define XCHAL_HAVE_MP_INTERRUPTS 0 /* interrupt distributor port */ +#define XCHAL_HAVE_MP_RUNSTALL 0 /* core RunStall control port */ +#define XCHAL_HAVE_PSO 0 /* Power Shut-Off */ +#define XCHAL_HAVE_PSO_CDM 0 /* core/debug/mem pwr domains */ +#define XCHAL_HAVE_PSO_FULL_RETENTION 0 /* all regs preserved on PSO */ +#define XCHAL_HAVE_THREADPTR 1 /* THREADPTR register */ +#define XCHAL_HAVE_BOOLEANS 1 /* boolean registers */ +#define XCHAL_HAVE_CP 1 /* CPENABLE reg (coprocessor) */ +#define XCHAL_CP_MAXCFG 8 /* max allowed cp id plus one */ +#define XCHAL_HAVE_MAC16 1 /* MAC16 package */ + +#define XCHAL_HAVE_FUSION 0 /* Fusion*/ +#define XCHAL_HAVE_FUSION_FP 0 /* Fusion FP option */ +#define XCHAL_HAVE_FUSION_LOW_POWER 0 /* Fusion Low Power option */ +#define XCHAL_HAVE_FUSION_AES 0 /* Fusion BLE/Wifi AES-128 CCM option */ +#define XCHAL_HAVE_FUSION_CONVENC 0 /* Fusion Conv Encode option */ +#define XCHAL_HAVE_FUSION_LFSR_CRC 0 /* Fusion LFSR-CRC option */ +#define XCHAL_HAVE_FUSION_BITOPS 0 /* Fusion Bit Operations Support option */ +#define XCHAL_HAVE_FUSION_AVS 0 /* Fusion AVS option */ +#define XCHAL_HAVE_FUSION_16BIT_BASEBAND 0 /* Fusion 16-bit Baseband option */ +#define XCHAL_HAVE_FUSION_VITERBI 0 /* Fusion Viterbi option */ +#define XCHAL_HAVE_FUSION_SOFTDEMAP 0 /* Fusion Soft Bit Demap option */ +#define XCHAL_HAVE_HIFIPRO 0 /* HiFiPro Audio Engine pkg */ +#define XCHAL_HAVE_HIFI4 0 /* HiFi4 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI4_VFPU 0 /* HiFi4 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI3 0 /* HiFi3 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI3_VFPU 0 /* HiFi3 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI2 0 /* HiFi2 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI2EP 0 /* HiFi2EP */ +#define XCHAL_HAVE_HIFI_MINI 0 + + +#define XCHAL_HAVE_VECTORFPU2005 0 /* vector or user floating-point pkg */ +#define XCHAL_HAVE_USER_DPFPU 0 /* user DP floating-point pkg */ +#define XCHAL_HAVE_USER_SPFPU 0 /* user DP floating-point pkg */ +#define XCHAL_HAVE_FP 1 /* single prec floating point */ +#define XCHAL_HAVE_FP_DIV 1 /* FP with DIV instructions */ +#define XCHAL_HAVE_FP_RECIP 1 /* FP with RECIP instructions */ +#define XCHAL_HAVE_FP_SQRT 1 /* FP with SQRT instructions */ +#define XCHAL_HAVE_FP_RSQRT 1 /* FP with RSQRT instructions */ +#define XCHAL_HAVE_DFP 0 /* double precision FP pkg */ +#define XCHAL_HAVE_DFP_DIV 0 /* DFP with DIV instructions */ +#define XCHAL_HAVE_DFP_RECIP 0 /* DFP with RECIP instructions*/ +#define XCHAL_HAVE_DFP_SQRT 0 /* DFP with SQRT instructions */ +#define XCHAL_HAVE_DFP_RSQRT 0 /* DFP with RSQRT instructions*/ +#define XCHAL_HAVE_DFP_ACCEL 1 /* double precision FP acceleration pkg */ +#define XCHAL_HAVE_DFP_accel XCHAL_HAVE_DFP_ACCEL /* for backward compatibility */ + +#define XCHAL_HAVE_DFPU_SINGLE_ONLY 1 /* DFPU Coprocessor, single precision only */ +#define XCHAL_HAVE_DFPU_SINGLE_DOUBLE 0 /* DFPU Coprocessor, single and double precision */ +#define XCHAL_HAVE_VECTRA1 0 /* Vectra I pkg */ +#define XCHAL_HAVE_VECTRALX 0 /* Vectra LX pkg */ +#define XCHAL_HAVE_PDX4 0 /* PDX4 */ +#define XCHAL_HAVE_CONNXD2 0 /* ConnX D2 pkg */ +#define XCHAL_HAVE_CONNXD2_DUALLSFLIX 0 /* ConnX D2 & Dual LoadStore Flix */ +#define XCHAL_HAVE_BBE16 0 /* ConnX BBE16 pkg */ +#define XCHAL_HAVE_BBE16_RSQRT 0 /* BBE16 & vector recip sqrt */ +#define XCHAL_HAVE_BBE16_VECDIV 0 /* BBE16 & vector divide */ +#define XCHAL_HAVE_BBE16_DESPREAD 0 /* BBE16 & despread */ +#define XCHAL_HAVE_BBENEP 0 /* ConnX BBENEP pkgs */ +#define XCHAL_HAVE_BSP3 0 /* ConnX BSP3 pkg */ +#define XCHAL_HAVE_BSP3_TRANSPOSE 0 /* BSP3 & transpose32x32 */ +#define XCHAL_HAVE_SSP16 0 /* ConnX SSP16 pkg */ +#define XCHAL_HAVE_SSP16_VITERBI 0 /* SSP16 & viterbi */ +#define XCHAL_HAVE_TURBO16 0 /* ConnX Turbo16 pkg */ +#define XCHAL_HAVE_BBP16 0 /* ConnX BBP16 pkg */ +#define XCHAL_HAVE_FLIX3 0 /* basic 3-way FLIX option */ +#define XCHAL_HAVE_GRIVPEP 0 /* GRIVPEP is General Release of IVPEP */ +#define XCHAL_HAVE_GRIVPEP_HISTOGRAM 0 /* Histogram option on GRIVPEP */ + + +/*---------------------------------------------------------------------- + MISC + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_LOADSTORE_UNITS 1 /* load/store units */ +#define XCHAL_NUM_WRITEBUFFER_ENTRIES 4 /* size of write buffer */ +#define XCHAL_INST_FETCH_WIDTH 4 /* instr-fetch width in bytes */ +#define XCHAL_DATA_WIDTH 4 /* data width in bytes */ +#define XCHAL_DATA_PIPE_DELAY 2 /* d-side pipeline delay + (1 = 5-stage, 2 = 7-stage) */ +#define XCHAL_CLOCK_GATING_GLOBAL 1 /* global clock gating */ +#define XCHAL_CLOCK_GATING_FUNCUNIT 1 /* funct. unit clock gating */ +/* In T1050, applies to selected core load and store instructions (see ISA): */ +#define XCHAL_UNALIGNED_LOAD_EXCEPTION 0 /* unaligned loads cause exc. */ +#define XCHAL_UNALIGNED_STORE_EXCEPTION 0 /* unaligned stores cause exc.*/ +#define XCHAL_UNALIGNED_LOAD_HW 1 /* unaligned loads work in hw */ +#define XCHAL_UNALIGNED_STORE_HW 1 /* unaligned stores work in hw*/ + +#define XCHAL_SW_VERSION 1100003 /* sw version of this header */ + +#define XCHAL_CORE_ID "esp32_v3_49_prod" /* alphanum core name + (CoreID) set in the Xtensa + Processor Generator */ + +#define XCHAL_BUILD_UNIQUE_ID 0x0005FE96 /* 22-bit sw build ID */ + +/* + * These definitions describe the hardware targeted by this software. + */ +#define XCHAL_HW_CONFIGID0 0xC2BCFFFE /* ConfigID hi 32 bits*/ +#define XCHAL_HW_CONFIGID1 0x1CC5FE96 /* ConfigID lo 32 bits*/ +#define XCHAL_HW_VERSION_NAME "LX6.0.3" /* full version name */ +#define XCHAL_HW_VERSION_MAJOR 2600 /* major ver# of targeted hw */ +#define XCHAL_HW_VERSION_MINOR 3 /* minor ver# of targeted hw */ +#define XCHAL_HW_VERSION 260003 /* major*100+minor */ +#define XCHAL_HW_REL_LX6 1 +#define XCHAL_HW_REL_LX6_0 1 +#define XCHAL_HW_REL_LX6_0_3 1 +#define XCHAL_HW_CONFIGID_RELIABLE 1 +/* If software targets a *range* of hardware versions, these are the bounds: */ +#define XCHAL_HW_MIN_VERSION_MAJOR 2600 /* major v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION_MINOR 3 /* minor v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION 260003 /* earliest targeted hw */ +#define XCHAL_HW_MAX_VERSION_MAJOR 2600 /* major v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION_MINOR 3 /* minor v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION 260003 /* latest targeted hw */ + + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_ICACHE_LINESIZE 4 /* I-cache line size in bytes */ +#define XCHAL_DCACHE_LINESIZE 4 /* D-cache line size in bytes */ +#define XCHAL_ICACHE_LINEWIDTH 2 /* log2(I line size in bytes) */ +#define XCHAL_DCACHE_LINEWIDTH 2 /* log2(D line size in bytes) */ + +#define XCHAL_ICACHE_SIZE 0 /* I-cache size in bytes or 0 */ +#define XCHAL_DCACHE_SIZE 0 /* D-cache size in bytes or 0 */ + +#define XCHAL_DCACHE_IS_WRITEBACK 0 /* writeback feature */ +#define XCHAL_DCACHE_IS_COHERENT 0 /* MP coherence feature */ + +#define XCHAL_HAVE_PREFETCH 0 /* PREFCTL register */ +#define XCHAL_HAVE_PREFETCH_L1 0 /* prefetch to L1 dcache */ +#define XCHAL_PREFETCH_CASTOUT_LINES 0 /* dcache pref. castout bufsz */ +#define XCHAL_PREFETCH_ENTRIES 0 /* cache prefetch entries */ +#define XCHAL_PREFETCH_BLOCK_ENTRIES 0 /* prefetch block streams */ +#define XCHAL_HAVE_CACHE_BLOCKOPS 0 /* block prefetch for caches */ +#define XCHAL_HAVE_ICACHE_TEST 0 /* Icache test instructions */ +#define XCHAL_HAVE_DCACHE_TEST 0 /* Dcache test instructions */ +#define XCHAL_HAVE_ICACHE_DYN_WAYS 0 /* Icache dynamic way support */ +#define XCHAL_HAVE_DCACHE_DYN_WAYS 0 /* Dcache dynamic way support */ + + + + +/**************************************************************************** + Parameters Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code + ****************************************************************************/ + + +#ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_PIF 1 /* any outbound PIF present */ +#define XCHAL_HAVE_AXI 0 /* AXI bus */ + +#define XCHAL_HAVE_PIF_WR_RESP 0 /* pif write response */ +#define XCHAL_HAVE_PIF_REQ_ATTR 0 /* pif attribute */ + +/* If present, cache size in bytes == (ways * 2^(linewidth + setwidth)). */ + +/* Number of cache sets in log2(lines per way): */ +#define XCHAL_ICACHE_SETWIDTH 0 +#define XCHAL_DCACHE_SETWIDTH 0 + +/* Cache set associativity (number of ways): */ +#define XCHAL_ICACHE_WAYS 1 +#define XCHAL_DCACHE_WAYS 1 + +/* Cache features: */ +#define XCHAL_ICACHE_LINE_LOCKABLE 0 +#define XCHAL_DCACHE_LINE_LOCKABLE 0 +#define XCHAL_ICACHE_ECC_PARITY 0 +#define XCHAL_DCACHE_ECC_PARITY 0 + +/* Cache access size in bytes (affects operation of SICW instruction): */ +#define XCHAL_ICACHE_ACCESS_SIZE 1 +#define XCHAL_DCACHE_ACCESS_SIZE 1 + +#define XCHAL_DCACHE_BANKS 0 /* number of banks */ + +/* Number of encoded cache attr bits (see for decoded bits): */ +#define XCHAL_CA_BITS 4 + + +/*---------------------------------------------------------------------- + INTERNAL I/D RAM/ROMs and XLMI + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_INSTROM 1 /* number of core instr. ROMs */ +#define XCHAL_NUM_INSTRAM 2 /* number of core instr. RAMs */ +#define XCHAL_NUM_DATAROM 1 /* number of core data ROMs */ +#define XCHAL_NUM_DATARAM 2 /* number of core data RAMs */ +#define XCHAL_NUM_URAM 0 /* number of core unified RAMs*/ +#define XCHAL_NUM_XLMI 1 /* number of core XLMI ports */ + +/* Instruction ROM 0: */ +#define XCHAL_INSTROM0_VADDR 0x40800000 /* virtual address */ +#define XCHAL_INSTROM0_PADDR 0x40800000 /* physical address */ +#define XCHAL_INSTROM0_SIZE 4194304 /* size in bytes */ +#define XCHAL_INSTROM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +/* Instruction RAM 0: */ +#define XCHAL_INSTRAM0_VADDR 0x40000000 /* virtual address */ +#define XCHAL_INSTRAM0_PADDR 0x40000000 /* physical address */ +#define XCHAL_INSTRAM0_SIZE 4194304 /* size in bytes */ +#define XCHAL_INSTRAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +/* Instruction RAM 1: */ +#define XCHAL_INSTRAM1_VADDR 0x40400000 /* virtual address */ +#define XCHAL_INSTRAM1_PADDR 0x40400000 /* physical address */ +#define XCHAL_INSTRAM1_SIZE 4194304 /* size in bytes */ +#define XCHAL_INSTRAM1_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +/* Data ROM 0: */ +#define XCHAL_DATAROM0_VADDR 0x3F400000 /* virtual address */ +#define XCHAL_DATAROM0_PADDR 0x3F400000 /* physical address */ +#define XCHAL_DATAROM0_SIZE 4194304 /* size in bytes */ +#define XCHAL_DATAROM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATAROM0_BANKS 1 /* number of banks */ + +/* Data RAM 0: */ +#define XCHAL_DATARAM0_VADDR 0x3FF80000 /* virtual address */ +#define XCHAL_DATARAM0_PADDR 0x3FF80000 /* physical address */ +#define XCHAL_DATARAM0_SIZE 524288 /* size in bytes */ +#define XCHAL_DATARAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATARAM0_BANKS 1 /* number of banks */ + +/* Data RAM 1: */ +#define XCHAL_DATARAM1_VADDR 0x3F800000 /* virtual address */ +#define XCHAL_DATARAM1_PADDR 0x3F800000 /* physical address */ +#define XCHAL_DATARAM1_SIZE 4194304 /* size in bytes */ +#define XCHAL_DATARAM1_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATARAM1_BANKS 1 /* number of banks */ + +/* XLMI Port 0: */ +#define XCHAL_XLMI0_VADDR 0x3FF00000 /* virtual address */ +#define XCHAL_XLMI0_PADDR 0x3FF00000 /* physical address */ +#define XCHAL_XLMI0_SIZE 524288 /* size in bytes */ +#define XCHAL_XLMI0_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +#define XCHAL_HAVE_IMEM_LOADSTORE 1 /* can load/store to IROM/IRAM*/ + + +/*---------------------------------------------------------------------- + INTERRUPTS and TIMERS + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_INTERRUPTS 1 /* interrupt option */ +#define XCHAL_HAVE_HIGHPRI_INTERRUPTS 1 /* med/high-pri. interrupts */ +#define XCHAL_HAVE_NMI 1 /* non-maskable interrupt */ +#define XCHAL_HAVE_CCOUNT 1 /* CCOUNT reg. (timer option) */ +#define XCHAL_NUM_TIMERS 3 /* number of CCOMPAREn regs */ +#define XCHAL_NUM_INTERRUPTS 32 /* number of interrupts */ +#define XCHAL_NUM_INTERRUPTS_LOG2 5 /* ceil(log2(NUM_INTERRUPTS)) */ +#define XCHAL_NUM_EXTINTERRUPTS 26 /* num of external interrupts */ +#define XCHAL_NUM_INTLEVELS 6 /* number of interrupt levels + (not including level zero) */ +#define XCHAL_EXCM_LEVEL 3 /* level masked by PS.EXCM */ + /* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */ + +/* Masks of interrupts at each interrupt level: */ +#define XCHAL_INTLEVEL1_MASK 0x000637FF +#define XCHAL_INTLEVEL2_MASK 0x00380000 +#define XCHAL_INTLEVEL3_MASK 0x28C08800 +#define XCHAL_INTLEVEL4_MASK 0x53000000 +#define XCHAL_INTLEVEL5_MASK 0x84010000 +#define XCHAL_INTLEVEL6_MASK 0x00000000 +#define XCHAL_INTLEVEL7_MASK 0x00004000 + +/* Masks of interrupts at each range 1..n of interrupt levels: */ +#define XCHAL_INTLEVEL1_ANDBELOW_MASK 0x000637FF +#define XCHAL_INTLEVEL2_ANDBELOW_MASK 0x003E37FF +#define XCHAL_INTLEVEL3_ANDBELOW_MASK 0x28FEBFFF +#define XCHAL_INTLEVEL4_ANDBELOW_MASK 0x7BFEBFFF +#define XCHAL_INTLEVEL5_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL6_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL7_ANDBELOW_MASK 0xFFFFFFFF + +/* Level of each interrupt: */ +#define XCHAL_INT0_LEVEL 1 +#define XCHAL_INT1_LEVEL 1 +#define XCHAL_INT2_LEVEL 1 +#define XCHAL_INT3_LEVEL 1 +#define XCHAL_INT4_LEVEL 1 +#define XCHAL_INT5_LEVEL 1 +#define XCHAL_INT6_LEVEL 1 +#define XCHAL_INT7_LEVEL 1 +#define XCHAL_INT8_LEVEL 1 +#define XCHAL_INT9_LEVEL 1 +#define XCHAL_INT10_LEVEL 1 +#define XCHAL_INT11_LEVEL 3 +#define XCHAL_INT12_LEVEL 1 +#define XCHAL_INT13_LEVEL 1 +#define XCHAL_INT14_LEVEL 7 +#define XCHAL_INT15_LEVEL 3 +#define XCHAL_INT16_LEVEL 5 +#define XCHAL_INT17_LEVEL 1 +#define XCHAL_INT18_LEVEL 1 +#define XCHAL_INT19_LEVEL 2 +#define XCHAL_INT20_LEVEL 2 +#define XCHAL_INT21_LEVEL 2 +#define XCHAL_INT22_LEVEL 3 +#define XCHAL_INT23_LEVEL 3 +#define XCHAL_INT24_LEVEL 4 +#define XCHAL_INT25_LEVEL 4 +#define XCHAL_INT26_LEVEL 5 +#define XCHAL_INT27_LEVEL 3 +#define XCHAL_INT28_LEVEL 4 +#define XCHAL_INT29_LEVEL 3 +#define XCHAL_INT30_LEVEL 4 +#define XCHAL_INT31_LEVEL 5 +#define XCHAL_DEBUGLEVEL 6 /* debug interrupt level */ +#define XCHAL_HAVE_DEBUG_EXTERN_INT 1 /* OCD external db interrupt */ +#define XCHAL_NMILEVEL 7 /* NMI "level" (for use with + EXCSAVE/EPS/EPC_n, RFI n) */ + +/* Type of each interrupt: */ +#define XCHAL_INT0_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT1_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT2_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT3_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT4_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT5_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT6_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT7_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT8_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT9_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT10_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT11_TYPE XTHAL_INTTYPE_PROFILING +#define XCHAL_INT12_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT13_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT14_TYPE XTHAL_INTTYPE_NMI +#define XCHAL_INT15_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT16_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT17_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT18_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT19_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT20_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT21_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT22_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT23_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT24_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT25_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT26_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT27_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT28_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT29_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT30_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT31_TYPE XTHAL_INTTYPE_EXTERN_LEVEL + +/* Masks of interrupts for each type of interrupt: */ +#define XCHAL_INTTYPE_MASK_UNCONFIGURED 0x00000000 +#define XCHAL_INTTYPE_MASK_SOFTWARE 0x20000080 +#define XCHAL_INTTYPE_MASK_EXTERN_EDGE 0x50400400 +#define XCHAL_INTTYPE_MASK_EXTERN_LEVEL 0x8FBE333F +#define XCHAL_INTTYPE_MASK_TIMER 0x00018040 +#define XCHAL_INTTYPE_MASK_NMI 0x00004000 +#define XCHAL_INTTYPE_MASK_WRITE_ERROR 0x00000000 +#define XCHAL_INTTYPE_MASK_PROFILING 0x00000800 + +/* Interrupt numbers assigned to specific interrupt sources: */ +#define XCHAL_TIMER0_INTERRUPT 6 /* CCOMPARE0 */ +#define XCHAL_TIMER1_INTERRUPT 15 /* CCOMPARE1 */ +#define XCHAL_TIMER2_INTERRUPT 16 /* CCOMPARE2 */ +#define XCHAL_TIMER3_INTERRUPT XTHAL_TIMER_UNCONFIGURED +#define XCHAL_NMI_INTERRUPT 14 /* non-maskable interrupt */ +#define XCHAL_PROFILING_INTERRUPT 11 /* profiling interrupt */ + +/* Interrupt numbers for levels at which only one interrupt is configured: */ +#define XCHAL_INTLEVEL7_NUM 14 +/* (There are many interrupts each at level(s) 1, 2, 3, 4, 5.) */ + + +/* + * External interrupt mapping. + * These macros describe how Xtensa processor interrupt numbers + * (as numbered internally, eg. in INTERRUPT and INTENABLE registers) + * map to external BInterrupt pins, for those interrupts + * configured as external (level-triggered, edge-triggered, or NMI). + * See the Xtensa processor databook for more details. + */ + +/* Core interrupt numbers mapped to each EXTERNAL BInterrupt pin number: */ +#define XCHAL_EXTINT0_NUM 0 /* (intlevel 1) */ +#define XCHAL_EXTINT1_NUM 1 /* (intlevel 1) */ +#define XCHAL_EXTINT2_NUM 2 /* (intlevel 1) */ +#define XCHAL_EXTINT3_NUM 3 /* (intlevel 1) */ +#define XCHAL_EXTINT4_NUM 4 /* (intlevel 1) */ +#define XCHAL_EXTINT5_NUM 5 /* (intlevel 1) */ +#define XCHAL_EXTINT6_NUM 8 /* (intlevel 1) */ +#define XCHAL_EXTINT7_NUM 9 /* (intlevel 1) */ +#define XCHAL_EXTINT8_NUM 10 /* (intlevel 1) */ +#define XCHAL_EXTINT9_NUM 12 /* (intlevel 1) */ +#define XCHAL_EXTINT10_NUM 13 /* (intlevel 1) */ +#define XCHAL_EXTINT11_NUM 14 /* (intlevel 7) */ +#define XCHAL_EXTINT12_NUM 17 /* (intlevel 1) */ +#define XCHAL_EXTINT13_NUM 18 /* (intlevel 1) */ +#define XCHAL_EXTINT14_NUM 19 /* (intlevel 2) */ +#define XCHAL_EXTINT15_NUM 20 /* (intlevel 2) */ +#define XCHAL_EXTINT16_NUM 21 /* (intlevel 2) */ +#define XCHAL_EXTINT17_NUM 22 /* (intlevel 3) */ +#define XCHAL_EXTINT18_NUM 23 /* (intlevel 3) */ +#define XCHAL_EXTINT19_NUM 24 /* (intlevel 4) */ +#define XCHAL_EXTINT20_NUM 25 /* (intlevel 4) */ +#define XCHAL_EXTINT21_NUM 26 /* (intlevel 5) */ +#define XCHAL_EXTINT22_NUM 27 /* (intlevel 3) */ +#define XCHAL_EXTINT23_NUM 28 /* (intlevel 4) */ +#define XCHAL_EXTINT24_NUM 30 /* (intlevel 4) */ +#define XCHAL_EXTINT25_NUM 31 /* (intlevel 5) */ +/* EXTERNAL BInterrupt pin numbers mapped to each core interrupt number: */ +#define XCHAL_INT0_EXTNUM 0 /* (intlevel 1) */ +#define XCHAL_INT1_EXTNUM 1 /* (intlevel 1) */ +#define XCHAL_INT2_EXTNUM 2 /* (intlevel 1) */ +#define XCHAL_INT3_EXTNUM 3 /* (intlevel 1) */ +#define XCHAL_INT4_EXTNUM 4 /* (intlevel 1) */ +#define XCHAL_INT5_EXTNUM 5 /* (intlevel 1) */ +#define XCHAL_INT8_EXTNUM 6 /* (intlevel 1) */ +#define XCHAL_INT9_EXTNUM 7 /* (intlevel 1) */ +#define XCHAL_INT10_EXTNUM 8 /* (intlevel 1) */ +#define XCHAL_INT12_EXTNUM 9 /* (intlevel 1) */ +#define XCHAL_INT13_EXTNUM 10 /* (intlevel 1) */ +#define XCHAL_INT14_EXTNUM 11 /* (intlevel 7) */ +#define XCHAL_INT17_EXTNUM 12 /* (intlevel 1) */ +#define XCHAL_INT18_EXTNUM 13 /* (intlevel 1) */ +#define XCHAL_INT19_EXTNUM 14 /* (intlevel 2) */ +#define XCHAL_INT20_EXTNUM 15 /* (intlevel 2) */ +#define XCHAL_INT21_EXTNUM 16 /* (intlevel 2) */ +#define XCHAL_INT22_EXTNUM 17 /* (intlevel 3) */ +#define XCHAL_INT23_EXTNUM 18 /* (intlevel 3) */ +#define XCHAL_INT24_EXTNUM 19 /* (intlevel 4) */ +#define XCHAL_INT25_EXTNUM 20 /* (intlevel 4) */ +#define XCHAL_INT26_EXTNUM 21 /* (intlevel 5) */ +#define XCHAL_INT27_EXTNUM 22 /* (intlevel 3) */ +#define XCHAL_INT28_EXTNUM 23 /* (intlevel 4) */ +#define XCHAL_INT30_EXTNUM 24 /* (intlevel 4) */ +#define XCHAL_INT31_EXTNUM 25 /* (intlevel 5) */ + + +/*---------------------------------------------------------------------- + EXCEPTIONS and VECTORS + ----------------------------------------------------------------------*/ + +#define XCHAL_XEA_VERSION 2 /* Xtensa Exception Architecture + number: 1 == XEA1 (old) + 2 == XEA2 (new) + 0 == XEAX (extern) or TX */ +#define XCHAL_HAVE_XEA1 0 /* Exception Architecture 1 */ +#define XCHAL_HAVE_XEA2 1 /* Exception Architecture 2 */ +#define XCHAL_HAVE_XEAX 0 /* External Exception Arch. */ +#define XCHAL_HAVE_EXCEPTIONS 1 /* exception option */ +#define XCHAL_HAVE_HALT 0 /* halt architecture option */ +#define XCHAL_HAVE_BOOTLOADER 0 /* boot loader (for TX) */ +#define XCHAL_HAVE_MEM_ECC_PARITY 0 /* local memory ECC/parity */ +#define XCHAL_HAVE_VECTOR_SELECT 1 /* relocatable vectors */ +#define XCHAL_HAVE_VECBASE 1 /* relocatable vectors */ +#define XCHAL_VECBASE_RESET_VADDR 0x40000000 /* VECBASE reset value */ +#define XCHAL_VECBASE_RESET_PADDR 0x40000000 +#define XCHAL_RESET_VECBASE_OVERLAP 0 + +#define XCHAL_RESET_VECTOR0_VADDR 0x50000000 +#define XCHAL_RESET_VECTOR0_PADDR 0x50000000 +#define XCHAL_RESET_VECTOR1_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR1_PADDR 0x40000400 +#define XCHAL_RESET_VECTOR_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR_PADDR 0x40000400 +#define XCHAL_USER_VECOFS 0x00000340 +#define XCHAL_USER_VECTOR_VADDR 0x40000340 +#define XCHAL_USER_VECTOR_PADDR 0x40000340 +#define XCHAL_KERNEL_VECOFS 0x00000300 +#define XCHAL_KERNEL_VECTOR_VADDR 0x40000300 +#define XCHAL_KERNEL_VECTOR_PADDR 0x40000300 +#define XCHAL_DOUBLEEXC_VECOFS 0x000003C0 +#define XCHAL_DOUBLEEXC_VECTOR_VADDR 0x400003C0 +#define XCHAL_DOUBLEEXC_VECTOR_PADDR 0x400003C0 +#define XCHAL_WINDOW_OF4_VECOFS 0x00000000 +#define XCHAL_WINDOW_UF4_VECOFS 0x00000040 +#define XCHAL_WINDOW_OF8_VECOFS 0x00000080 +#define XCHAL_WINDOW_UF8_VECOFS 0x000000C0 +#define XCHAL_WINDOW_OF12_VECOFS 0x00000100 +#define XCHAL_WINDOW_UF12_VECOFS 0x00000140 +#define XCHAL_WINDOW_VECTORS_VADDR 0x40000000 +#define XCHAL_WINDOW_VECTORS_PADDR 0x40000000 +#define XCHAL_INTLEVEL2_VECOFS 0x00000180 +#define XCHAL_INTLEVEL2_VECTOR_VADDR 0x40000180 +#define XCHAL_INTLEVEL2_VECTOR_PADDR 0x40000180 +#define XCHAL_INTLEVEL3_VECOFS 0x000001C0 +#define XCHAL_INTLEVEL3_VECTOR_VADDR 0x400001C0 +#define XCHAL_INTLEVEL3_VECTOR_PADDR 0x400001C0 +#define XCHAL_INTLEVEL4_VECOFS 0x00000200 +#define XCHAL_INTLEVEL4_VECTOR_VADDR 0x40000200 +#define XCHAL_INTLEVEL4_VECTOR_PADDR 0x40000200 +#define XCHAL_INTLEVEL5_VECOFS 0x00000240 +#define XCHAL_INTLEVEL5_VECTOR_VADDR 0x40000240 +#define XCHAL_INTLEVEL5_VECTOR_PADDR 0x40000240 +#define XCHAL_INTLEVEL6_VECOFS 0x00000280 +#define XCHAL_INTLEVEL6_VECTOR_VADDR 0x40000280 +#define XCHAL_INTLEVEL6_VECTOR_PADDR 0x40000280 +#define XCHAL_DEBUG_VECOFS XCHAL_INTLEVEL6_VECOFS +#define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL6_VECTOR_VADDR +#define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL6_VECTOR_PADDR +#define XCHAL_NMI_VECOFS 0x000002C0 +#define XCHAL_NMI_VECTOR_VADDR 0x400002C0 +#define XCHAL_NMI_VECTOR_PADDR 0x400002C0 +#define XCHAL_INTLEVEL7_VECOFS XCHAL_NMI_VECOFS +#define XCHAL_INTLEVEL7_VECTOR_VADDR XCHAL_NMI_VECTOR_VADDR +#define XCHAL_INTLEVEL7_VECTOR_PADDR XCHAL_NMI_VECTOR_PADDR + + +/*---------------------------------------------------------------------- + DEBUG MODULE + ----------------------------------------------------------------------*/ + +/* Misc */ +#define XCHAL_HAVE_DEBUG_ERI 1 /* ERI to debug module */ +#define XCHAL_HAVE_DEBUG_APB 1 /* APB to debug module */ +#define XCHAL_HAVE_DEBUG_JTAG 1 /* JTAG to debug module */ + +/* On-Chip Debug (OCD) */ +#define XCHAL_HAVE_OCD 1 /* OnChipDebug option */ +#define XCHAL_NUM_IBREAK 2 /* number of IBREAKn regs */ +#define XCHAL_NUM_DBREAK 2 /* number of DBREAKn regs */ +#define XCHAL_HAVE_OCD_DIR_ARRAY 0 /* faster OCD option (to LX4) */ +#define XCHAL_HAVE_OCD_LS32DDR 1 /* L32DDR/S32DDR (faster OCD) */ + +/* TRAX (in core) */ +#define XCHAL_HAVE_TRAX 1 /* TRAX in debug module */ +#define XCHAL_TRAX_MEM_SIZE 16384 /* TRAX memory size in bytes */ +#define XCHAL_TRAX_MEM_SHAREABLE 1 /* start/end regs; ready sig. */ +#define XCHAL_TRAX_ATB_WIDTH 32 /* ATB width (bits), 0=no ATB */ +#define XCHAL_TRAX_TIME_WIDTH 0 /* timestamp bitwidth, 0=none */ + +/* Perf counters */ +#define XCHAL_NUM_PERF_COUNTERS 2 /* performance counters */ + + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* See core-matmap.h header file for more details. */ + +#define XCHAL_HAVE_TLBS 1 /* inverse of HAVE_CACHEATTR */ +#define XCHAL_HAVE_SPANNING_WAY 1 /* one way maps I+D 4GB vaddr */ +#define XCHAL_SPANNING_WAY 0 /* TLB spanning way number */ +#define XCHAL_HAVE_IDENTITY_MAP 1 /* vaddr == paddr always */ +#define XCHAL_HAVE_CACHEATTR 0 /* CACHEATTR register present */ +#define XCHAL_HAVE_MIMIC_CACHEATTR 1 /* region protection */ +#define XCHAL_HAVE_XLT_CACHEATTR 0 /* region prot. w/translation */ +#define XCHAL_HAVE_PTP_MMU 0 /* full MMU (with page table + [autorefill] and protection) + usable for an MMU-based OS */ +/* If none of the above last 4 are set, it's a custom TLB configuration. */ + +#define XCHAL_MMU_ASID_BITS 0 /* number of bits in ASIDs */ +#define XCHAL_MMU_RINGS 1 /* number of rings (1..4) */ +#define XCHAL_MMU_RING_BITS 0 /* num of bits in RING field */ + +#endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */ + + +#endif /* _XTENSA_CORE_CONFIGURATION_H */ + diff --git a/arch/xtensa/variants/esp32/include/variant/tie-asm.h b/arch/xtensa/variants/esp32/include/variant/tie-asm.h new file mode 100644 index 00000000000000..831d8676ae2c8c --- /dev/null +++ b/arch/xtensa/variants/esp32/include/variant/tie-asm.h @@ -0,0 +1,323 @@ +/* + * tie-asm.h -- compile-time HAL assembler definitions dependent on CORE & TIE + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file contains assembly-language definitions (assembly + macros, etc.) for this specific Xtensa processor's TIE extensions + and options. It is customized to this Xtensa processor configuration. + + Customer ID=11657; Build=0x5fe96; Copyright (c) 1999-2016 Cadence Design Systems Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_TIE_ASM_H +#define _XTENSA_CORE_TIE_ASM_H + +/* Selection parameter values for save-area save/restore macros: */ +/* Option vs. TIE: */ +#define XTHAL_SAS_TIE 0x0001 /* custom extension or coprocessor */ +#define XTHAL_SAS_OPT 0x0002 /* optional (and not a coprocessor) */ +#define XTHAL_SAS_ANYOT 0x0003 /* both of the above */ +/* Whether used automatically by compiler: */ +#define XTHAL_SAS_NOCC 0x0004 /* not used by compiler w/o special opts/code */ +#define XTHAL_SAS_CC 0x0008 /* used by compiler without special opts/code */ +#define XTHAL_SAS_ANYCC 0x000C /* both of the above */ +/* ABI handling across function calls: */ +#define XTHAL_SAS_CALR 0x0010 /* caller-saved */ +#define XTHAL_SAS_CALE 0x0020 /* callee-saved */ +#define XTHAL_SAS_GLOB 0x0040 /* global across function calls (in thread) */ +#define XTHAL_SAS_ANYABI 0x0070 /* all of the above three */ +/* Misc */ +#define XTHAL_SAS_ALL 0xFFFF /* include all default NCP contents */ +#define XTHAL_SAS3(optie,ccuse,abi) ( ((optie) & XTHAL_SAS_ANYOT) \ + | ((ccuse) & XTHAL_SAS_ANYCC) \ + | ((abi) & XTHAL_SAS_ANYABI) ) + + + /* + * Macro to store all non-coprocessor (extra) custom TIE and optional state + * (not including zero-overhead loop registers). + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_NCP_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters: + * continue If macro invoked as part of a larger store sequence, set to 1 + * if this is not the first in the sequence. Defaults to 0. + * ofs Offset from start of larger sequence (from value of first ptr + * in sequence) at which to store. Defaults to next available space + * (or 0 if is 0). + * select Select what category(ies) of registers to store, as a bitmask + * (see XTHAL_SAS_xxx constants). Defaults to all registers. + * alloc Select what category(ies) of registers to allocate; if any + * category is selected here that is not in , space for + * the corresponding registers is skipped without doing any load. + */ + .macro xchal_ncp_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Optional global registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\select) + xchal_sa_align \ptr, 0, 1016, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.THREADPTR \at1 // threadptr option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1016, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .endif + // Optional caller-saved registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 1012, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wsr.ACCLO \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+4 + wsr.ACCHI \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1012, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .endif + // Optional caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 996, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wsr.BR \at1 // boolean option + l32i \at1, \ptr, .Lxchal_ofs_+4 + wsr.SCOMPARE1 \at1 // conditional store option + l32i \at1, \ptr, .Lxchal_ofs_+8 + wsr.M0 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+12 + wsr.M1 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+16 + wsr.M2 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+20 + wsr.M3 \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 996, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .endif + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 1008, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.F64R_LO \at1 // ureg 234 + l32i \at1, \ptr, .Lxchal_ofs_+4 + wur.F64R_HI \at1 // ureg 235 + l32i \at1, \ptr, .Lxchal_ofs_+8 + wur.F64S \at1 // ureg 236 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 12 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1008, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 12 + .endif + .endm // xchal_ncp_load + + +#define XCHAL_NCP_NUM_ATMPS 1 + + /* + * Macro to store the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_store. + */ +#define xchal_cp_FPU_store xchal_cp0_store + .macro xchal_cp0_store ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + rur.FCR \at1 // ureg 232 + s32i \at1, \ptr, .Lxchal_ofs_+0 + rur.FSR \at1 // ureg 233 + s32i \at1, \ptr, .Lxchal_ofs_+4 + ssi f0, \ptr, .Lxchal_ofs_+8 + ssi f1, \ptr, .Lxchal_ofs_+12 + ssi f2, \ptr, .Lxchal_ofs_+16 + ssi f3, \ptr, .Lxchal_ofs_+20 + ssi f4, \ptr, .Lxchal_ofs_+24 + ssi f5, \ptr, .Lxchal_ofs_+28 + ssi f6, \ptr, .Lxchal_ofs_+32 + ssi f7, \ptr, .Lxchal_ofs_+36 + ssi f8, \ptr, .Lxchal_ofs_+40 + ssi f9, \ptr, .Lxchal_ofs_+44 + ssi f10, \ptr, .Lxchal_ofs_+48 + ssi f11, \ptr, .Lxchal_ofs_+52 + ssi f12, \ptr, .Lxchal_ofs_+56 + ssi f13, \ptr, .Lxchal_ofs_+60 + ssi f14, \ptr, .Lxchal_ofs_+64 + ssi f15, \ptr, .Lxchal_ofs_+68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_store + + /* + * Macro to load the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_load. + */ +#define xchal_cp_FPU_load xchal_cp0_load + .macro xchal_cp0_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.FCR \at1 // ureg 232 + l32i \at1, \ptr, .Lxchal_ofs_+4 + wur.FSR \at1 // ureg 233 + lsi f0, \ptr, .Lxchal_ofs_+8 + lsi f1, \ptr, .Lxchal_ofs_+12 + lsi f2, \ptr, .Lxchal_ofs_+16 + lsi f3, \ptr, .Lxchal_ofs_+20 + lsi f4, \ptr, .Lxchal_ofs_+24 + lsi f5, \ptr, .Lxchal_ofs_+28 + lsi f6, \ptr, .Lxchal_ofs_+32 + lsi f7, \ptr, .Lxchal_ofs_+36 + lsi f8, \ptr, .Lxchal_ofs_+40 + lsi f9, \ptr, .Lxchal_ofs_+44 + lsi f10, \ptr, .Lxchal_ofs_+48 + lsi f11, \ptr, .Lxchal_ofs_+52 + lsi f12, \ptr, .Lxchal_ofs_+56 + lsi f13, \ptr, .Lxchal_ofs_+60 + lsi f14, \ptr, .Lxchal_ofs_+64 + lsi f15, \ptr, .Lxchal_ofs_+68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_load + +#define XCHAL_CP0_NUM_ATMPS 1 +#define XCHAL_SA_NUM_ATMPS 1 + + /* Empty macros for unconfigured coprocessors: */ + .macro xchal_cp1_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp1_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp2_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp2_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp3_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp3_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp4_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp4_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp5_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp5_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp6_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp6_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp7_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp7_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + +#endif /*_XTENSA_CORE_TIE_ASM_H*/ + diff --git a/arch/xtensa/variants/esp32/include/variant/tie.h b/arch/xtensa/variants/esp32/include/variant/tie.h new file mode 100644 index 00000000000000..e178799708e27b --- /dev/null +++ b/arch/xtensa/variants/esp32/include/variant/tie.h @@ -0,0 +1,182 @@ +/* + * tie.h -- compile-time HAL definitions dependent on CORE & TIE configuration + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file describes this specific Xtensa processor's TIE extensions + that extend basic Xtensa core functionality. It is customized to this + Xtensa processor configuration. + + Customer ID=11657; Build=0x5fe96; Copyright (c) 1999-2016 Cadence Design Systems Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_TIE_H +#define _XTENSA_CORE_TIE_H + +#define XCHAL_CP_NUM 1 /* number of coprocessors */ +#define XCHAL_CP_MAX 1 /* max CP ID + 1 (0 if none) */ +#define XCHAL_CP_MASK 0x01 /* bitmask of all CPs by ID */ +#define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ + +/* Basic parameters of each coprocessor: */ +#define XCHAL_CP0_NAME "FPU" +#define XCHAL_CP0_IDENT FPU +#define XCHAL_CP0_SA_SIZE 72 /* size of state save area */ +#define XCHAL_CP0_SA_ALIGN 4 /* min alignment of save area */ +#define XCHAL_CP_ID_FPU 0 /* coprocessor ID (0..7) */ + +/* Filler info for unassigned coprocessors, to simplify arrays etc: */ +#define XCHAL_CP1_SA_SIZE 0 +#define XCHAL_CP1_SA_ALIGN 1 +#define XCHAL_CP2_SA_SIZE 0 +#define XCHAL_CP2_SA_ALIGN 1 +#define XCHAL_CP3_SA_SIZE 0 +#define XCHAL_CP3_SA_ALIGN 1 +#define XCHAL_CP4_SA_SIZE 0 +#define XCHAL_CP4_SA_ALIGN 1 +#define XCHAL_CP5_SA_SIZE 0 +#define XCHAL_CP5_SA_ALIGN 1 +#define XCHAL_CP6_SA_SIZE 0 +#define XCHAL_CP6_SA_ALIGN 1 +#define XCHAL_CP7_SA_SIZE 0 +#define XCHAL_CP7_SA_ALIGN 1 + +/* Save area for non-coprocessor optional and custom (TIE) state: */ +#define XCHAL_NCP_SA_SIZE 48 +#define XCHAL_NCP_SA_ALIGN 4 + +/* Total save area for optional and custom state (NCP + CPn): */ +#define XCHAL_TOTAL_SA_SIZE 128 /* with 16-byte align padding */ +#define XCHAL_TOTAL_SA_ALIGN 4 /* actual minimum alignment */ + +/* + * Detailed contents of save areas. + * NOTE: caller must define the XCHAL_SA_REG macro (not defined here) + * before expanding the XCHAL_xxx_SA_LIST() macros. + * + * XCHAL_SA_REG(s,ccused,abikind,kind,opt,name,galign,align,asize, + * dbnum,base,regnum,bitsz,gapsz,reset,x...) + * + * s = passed from XCHAL_*_LIST(s), eg. to select how to expand + * ccused = set if used by compiler without special options or code + * abikind = 0 (caller-saved), 1 (callee-saved), or 2 (thread-global) + * kind = 0 (special reg), 1 (TIE user reg), or 2 (TIE regfile reg) + * opt = 0 (custom TIE extension or coprocessor), or 1 (optional reg) + * name = lowercase reg name (no quotes) + * galign = group byte alignment (power of 2) (galign >= align) + * align = register byte alignment (power of 2) + * asize = allocated size in bytes (asize*8 == bitsz + gapsz + padsz) + * (not including any pad bytes required to galign this or next reg) + * dbnum = unique target number f/debug (see ) + * base = reg shortname w/o index (or sr=special, ur=TIE user reg) + * regnum = reg index in regfile, or special/TIE-user reg number + * bitsz = number of significant bits (regfile width, or ur/sr mask bits) + * gapsz = intervening bits, if bitsz bits not stored contiguously + * (padsz = pad bits at end [TIE regfile] or at msbits [ur,sr] of asize) + * reset = register reset value (or 0 if undefined at reset) + * x = reserved for future use (0 until then) + * + * To filter out certain registers, e.g. to expand only the non-global + * registers used by the compiler, you can do something like this: + * + * #define XCHAL_SA_REG(s,ccused,p...) SELCC##ccused(p) + * #define SELCC0(p...) + * #define SELCC1(abikind,p...) SELAK##abikind(p) + * #define SELAK0(p...) REG(p) + * #define SELAK1(p...) REG(p) + * #define SELAK2(p...) + * #define REG(kind,tie,name,galn,aln,asz,csz,dbnum,base,rnum,bsz,rst,x...) \ + * ...what you want to expand... + */ + +#define XCHAL_NCP_SA_NUM 12 +#define XCHAL_NCP_SA_LIST(s) \ + XCHAL_SA_REG(s,1,2,1,1, threadptr, 4, 4, 4,0x03E7, ur,231, 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acclo, 4, 4, 4,0x0210, sr,16 , 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acchi, 4, 4, 4,0x0211, sr,17 , 8,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, br, 4, 4, 4,0x0204, sr,4 , 16,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, scompare1, 4, 4, 4,0x020C, sr,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m0, 4, 4, 4,0x0220, sr,32 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m1, 4, 4, 4,0x0221, sr,33 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m2, 4, 4, 4,0x0222, sr,34 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m3, 4, 4, 4,0x0223, sr,35 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, f64r_lo, 4, 4, 4,0x03EA, ur,234, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, f64r_hi, 4, 4, 4,0x03EB, ur,235, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, f64s, 4, 4, 4,0x03EC, ur,236, 32,0,0,0) + +#define XCHAL_CP0_SA_NUM 18 +#define XCHAL_CP0_SA_LIST(s) \ + XCHAL_SA_REG(s,0,0,1,0, fcr, 4, 4, 4,0x03E8, ur,232, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, fsr, 4, 4, 4,0x03E9, ur,233, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f0, 4, 4, 4,0x0030, f,0 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f1, 4, 4, 4,0x0031, f,1 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f2, 4, 4, 4,0x0032, f,2 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f3, 4, 4, 4,0x0033, f,3 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f4, 4, 4, 4,0x0034, f,4 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f5, 4, 4, 4,0x0035, f,5 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f6, 4, 4, 4,0x0036, f,6 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f7, 4, 4, 4,0x0037, f,7 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f8, 4, 4, 4,0x0038, f,8 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f9, 4, 4, 4,0x0039, f,9 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f10, 4, 4, 4,0x003A, f,10 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f11, 4, 4, 4,0x003B, f,11 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f12, 4, 4, 4,0x003C, f,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f13, 4, 4, 4,0x003D, f,13 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f14, 4, 4, 4,0x003E, f,14 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f15, 4, 4, 4,0x003F, f,15 , 32,0,0,0) + +#define XCHAL_CP1_SA_NUM 0 +#define XCHAL_CP1_SA_LIST(s) /* empty */ + +#define XCHAL_CP2_SA_NUM 0 +#define XCHAL_CP2_SA_LIST(s) /* empty */ + +#define XCHAL_CP3_SA_NUM 0 +#define XCHAL_CP3_SA_LIST(s) /* empty */ + +#define XCHAL_CP4_SA_NUM 0 +#define XCHAL_CP4_SA_LIST(s) /* empty */ + +#define XCHAL_CP5_SA_NUM 0 +#define XCHAL_CP5_SA_LIST(s) /* empty */ + +#define XCHAL_CP6_SA_NUM 0 +#define XCHAL_CP6_SA_LIST(s) /* empty */ + +#define XCHAL_CP7_SA_NUM 0 +#define XCHAL_CP7_SA_LIST(s) /* empty */ + +/* Byte length of instruction from its first nibble (op0 field), per FLIX. */ +#define XCHAL_OP0_FORMAT_LENGTHS 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3 +/* Byte length of instruction from its first byte, per FLIX. */ +#define XCHAL_BYTE0_FORMAT_LENGTHS \ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3 + +#endif /*_XTENSA_CORE_TIE_H*/ + From a83a72730c330a57c1a07cd98603140f5fbe0bf9 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sat, 6 May 2023 17:09:46 -0700 Subject: [PATCH 135/515] xtensa: import ESP32S3 core variant Import processor configuration for the Xtensa core found in Espressif ESP32S3 SoC. Signed-off-by: Max Filippov --- .../variants/esp32s3/include/variant/core.h | 681 ++++++++++++++++++ .../esp32s3/include/variant/tie-asm.h | 429 +++++++++++ .../variants/esp32s3/include/variant/tie.h | 207 ++++++ 3 files changed, 1317 insertions(+) create mode 100644 arch/xtensa/variants/esp32s3/include/variant/core.h create mode 100644 arch/xtensa/variants/esp32s3/include/variant/tie-asm.h create mode 100644 arch/xtensa/variants/esp32s3/include/variant/tie.h diff --git a/arch/xtensa/variants/esp32s3/include/variant/core.h b/arch/xtensa/variants/esp32s3/include/variant/core.h new file mode 100644 index 00000000000000..6c8fc963c0aa24 --- /dev/null +++ b/arch/xtensa/variants/esp32s3/include/variant/core.h @@ -0,0 +1,681 @@ +/* + * xtensa/config/core-isa.h -- HAL definitions that are dependent on Xtensa + * processor CORE configuration + * + * See , which includes this file, for more details. + */ + +/* Xtensa processor core configuration information. + + Customer ID=15128; Build=0x90f1f; Copyright (c) 1999-2021 Tensilica Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_CONFIGURATION_H +#define _XTENSA_CORE_CONFIGURATION_H + + +/**************************************************************************** + Parameters Useful for Any Code, USER or PRIVILEGED + ****************************************************************************/ + +/* + * Note: Macros of the form XCHAL_HAVE_*** have a value of 1 if the option is + * configured, and a value of 0 otherwise. These macros are always defined. + */ + + +/*---------------------------------------------------------------------- + ISA + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_BE 0 /* big-endian byte ordering */ +#define XCHAL_HAVE_WINDOWED 1 /* windowed registers option */ +#define XCHAL_NUM_AREGS 64 /* num of physical addr regs */ +#define XCHAL_NUM_AREGS_LOG2 6 /* log2(XCHAL_NUM_AREGS) */ +#define XCHAL_MAX_INSTRUCTION_SIZE 4 /* max instr bytes (3..8) */ +#define XCHAL_HAVE_DEBUG 1 /* debug option */ +#define XCHAL_HAVE_DENSITY 1 /* 16-bit instructions */ +#define XCHAL_HAVE_LOOPS 1 /* zero-overhead loops */ +#define XCHAL_LOOP_BUFFER_SIZE 256 /* zero-ov. loop instr buffer size */ +#define XCHAL_HAVE_NSA 1 /* NSA/NSAU instructions */ +#define XCHAL_HAVE_MINMAX 1 /* MIN/MAX instructions */ +#define XCHAL_HAVE_SEXT 1 /* SEXT instruction */ +#define XCHAL_HAVE_DEPBITS 0 /* DEPBITS instruction */ +#define XCHAL_HAVE_CLAMPS 1 /* CLAMPS instruction */ +#define XCHAL_HAVE_MUL16 1 /* MUL16S/MUL16U instructions */ +#define XCHAL_HAVE_MUL32 1 /* MULL instruction */ +#define XCHAL_HAVE_MUL32_HIGH 1 /* MULUH/MULSH instructions */ +#define XCHAL_HAVE_DIV32 1 /* QUOS/QUOU/REMS/REMU instructions */ +#define XCHAL_HAVE_L32R 1 /* L32R instruction */ +#define XCHAL_HAVE_ABSOLUTE_LITERALS 0 /* non-PC-rel (extended) L32R */ +#define XCHAL_HAVE_CONST16 0 /* CONST16 instruction */ +#define XCHAL_HAVE_ADDX 1 /* ADDX#/SUBX# instructions */ +#define XCHAL_HAVE_EXCLUSIVE 0 /* L32EX/S32EX instructions */ +#define XCHAL_HAVE_WIDE_BRANCHES 0 /* B*.W18 or B*.W15 instr's */ +#define XCHAL_HAVE_PREDICTED_BRANCHES 0 /* B[EQ/EQZ/NE/NEZ]T instr's */ +#define XCHAL_HAVE_CALL4AND12 1 /* (obsolete option) */ +#define XCHAL_HAVE_ABS 1 /* ABS instruction */ +/*#define XCHAL_HAVE_POPC 0*/ /* POPC instruction */ +/*#define XCHAL_HAVE_CRC 0*/ /* CRC instruction */ +#define XCHAL_HAVE_RELEASE_SYNC 1 /* L32AI/S32RI instructions */ +#define XCHAL_HAVE_S32C1I 1 /* S32C1I instruction */ +#define XCHAL_HAVE_SPECULATION 0 /* speculation */ +#define XCHAL_HAVE_FULL_RESET 1 /* all regs/state reset */ +#define XCHAL_NUM_CONTEXTS 1 /* */ +#define XCHAL_NUM_MISC_REGS 4 /* num of scratch regs (0..4) */ +#define XCHAL_HAVE_TAP_MASTER 0 /* JTAG TAP control instr's */ +#define XCHAL_HAVE_PRID 1 /* processor ID register */ +#define XCHAL_HAVE_EXTERN_REGS 1 /* WER/RER instructions */ +#define XCHAL_HAVE_MX 0 /* MX core (Tensilica internal) */ +#define XCHAL_HAVE_MP_INTERRUPTS 0 /* interrupt distributor port */ +#define XCHAL_HAVE_MP_RUNSTALL 0 /* core RunStall control port */ +#define XCHAL_HAVE_PSO 0 /* Power Shut-Off */ +#define XCHAL_HAVE_PSO_CDM 0 /* core/debug/mem pwr domains */ +#define XCHAL_HAVE_PSO_FULL_RETENTION 0 /* all regs preserved on PSO */ +#define XCHAL_HAVE_THREADPTR 1 /* THREADPTR register */ +#define XCHAL_HAVE_BOOLEANS 1 /* boolean registers */ +#define XCHAL_HAVE_CP 1 /* CPENABLE reg (coprocessor) */ +#define XCHAL_CP_MAXCFG 8 /* max allowed cp id plus one */ +#define XCHAL_HAVE_MAC16 1 /* MAC16 package */ + +#define XCHAL_HAVE_FUSION 0 /* Fusion*/ +#define XCHAL_HAVE_FUSION_FP 0 /* Fusion FP option */ +#define XCHAL_HAVE_FUSION_LOW_POWER 0 /* Fusion Low Power option */ +#define XCHAL_HAVE_FUSION_AES 0 /* Fusion BLE/Wifi AES-128 CCM option */ +#define XCHAL_HAVE_FUSION_CONVENC 0 /* Fusion Conv Encode option */ +#define XCHAL_HAVE_FUSION_LFSR_CRC 0 /* Fusion LFSR-CRC option */ +#define XCHAL_HAVE_FUSION_BITOPS 0 /* Fusion Bit Operations Support option */ +#define XCHAL_HAVE_FUSION_AVS 0 /* Fusion AVS option */ +#define XCHAL_HAVE_FUSION_16BIT_BASEBAND 0 /* Fusion 16-bit Baseband option */ +#define XCHAL_HAVE_FUSION_VITERBI 0 /* Fusion Viterbi option */ +#define XCHAL_HAVE_FUSION_SOFTDEMAP 0 /* Fusion Soft Bit Demap option */ +#define XCHAL_HAVE_HIFIPRO 0 /* HiFiPro Audio Engine pkg */ +#define XCHAL_HAVE_HIFI5 0 /* HiFi5 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI5_NN_MAC 0 /* HiFi5 Audio Engine NN-MAC option */ +#define XCHAL_HAVE_HIFI5_VFPU 0 /* HiFi5 Audio Engine Single-Precision VFPU option */ +#define XCHAL_HAVE_HIFI5_HP_VFPU 0 /* HiFi5 Audio Engine Half-Precision VFPU option */ +#define XCHAL_HAVE_HIFI4 0 /* HiFi4 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI4_VFPU 0 /* HiFi4 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI3 0 /* HiFi3 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI3_VFPU 0 /* HiFi3 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI3Z 0 /* HiFi3Z Audio Engine pkg */ +#define XCHAL_HAVE_HIFI3Z_VFPU 0 /* HiFi3Z Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI2 0 /* HiFi2 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI2EP 0 /* HiFi2EP */ +#define XCHAL_HAVE_HIFI_MINI 0 + + + +#define XCHAL_HAVE_VECTORFPU2005 0 /* vector floating-point pkg */ +#define XCHAL_HAVE_USER_DPFPU 0 /* user DP floating-point pkg */ +#define XCHAL_HAVE_USER_SPFPU 0 /* user SP floating-point pkg */ +#define XCHAL_HAVE_FP 1 /* single prec floating point */ +#define XCHAL_HAVE_FP_DIV 1 /* FP with DIV instructions */ +#define XCHAL_HAVE_FP_RECIP 1 /* FP with RECIP instructions */ +#define XCHAL_HAVE_FP_SQRT 1 /* FP with SQRT instructions */ +#define XCHAL_HAVE_FP_RSQRT 1 /* FP with RSQRT instructions */ +#define XCHAL_HAVE_DFP 0 /* double precision FP pkg */ +#define XCHAL_HAVE_DFP_DIV 0 /* DFP with DIV instructions */ +#define XCHAL_HAVE_DFP_RECIP 0 /* DFP with RECIP instructions*/ +#define XCHAL_HAVE_DFP_SQRT 0 /* DFP with SQRT instructions */ +#define XCHAL_HAVE_DFP_RSQRT 0 /* DFP with RSQRT instructions*/ +#define XCHAL_HAVE_DFP_ACCEL 0 /* double precision FP acceleration pkg */ +#define XCHAL_HAVE_DFP_accel XCHAL_HAVE_DFP_ACCEL /* for backward compatibility */ + +#define XCHAL_HAVE_DFPU_SINGLE_ONLY 1 /* DFPU Coprocessor, single precision only */ +#define XCHAL_HAVE_DFPU_SINGLE_DOUBLE 0 /* DFPU Coprocessor, single and double precision */ +#define XCHAL_HAVE_VECTRA1 0 /* Vectra I pkg */ +#define XCHAL_HAVE_VECTRALX 0 /* Vectra LX pkg */ + +#define XCHAL_HAVE_FUSIONG 0 /* FusionG */ +#define XCHAL_HAVE_FUSIONG3 0 /* FusionG3 */ +#define XCHAL_HAVE_FUSIONG6 0 /* FusionG6 */ +#define XCHAL_HAVE_FUSIONG_SP_VFPU 0 /* sp_vfpu option on FusionG */ +#define XCHAL_HAVE_FUSIONG_DP_VFPU 0 /* dp_vfpu option on FusionG */ +#define XCHAL_FUSIONG_SIMD32 0 /* simd32 for FusionG */ + +#define XCHAL_HAVE_PDX 0 /* PDX */ +#define XCHAL_PDX_SIMD32 0 /* simd32 for PDX */ +#define XCHAL_HAVE_PDX4 0 /* PDX4 */ +#define XCHAL_HAVE_PDX8 0 /* PDX8 */ +#define XCHAL_HAVE_PDX16 0 /* PDX16 */ + +#define XCHAL_HAVE_CONNXD2 0 /* ConnX D2 pkg */ +#define XCHAL_HAVE_CONNXD2_DUALLSFLIX 0 /* ConnX D2 & Dual LoadStore Flix */ +#define XCHAL_HAVE_BBE16 0 /* ConnX BBE16 pkg */ +#define XCHAL_HAVE_BBE16_RSQRT 0 /* BBE16 & vector recip sqrt */ +#define XCHAL_HAVE_BBE16_VECDIV 0 /* BBE16 & vector divide */ +#define XCHAL_HAVE_BBE16_DESPREAD 0 /* BBE16 & despread */ +#define XCHAL_HAVE_BBENEP 0 /* ConnX BBENEP pkgs */ +#define XCHAL_HAVE_BBENEP_SP_VFPU 0 /* sp_vfpu option on BBE-EP */ +#define XCHAL_HAVE_BSP3 0 /* ConnX BSP3 pkg */ +#define XCHAL_HAVE_BSP3_TRANSPOSE 0 /* BSP3 & transpose32x32 */ +#define XCHAL_HAVE_SSP16 0 /* ConnX SSP16 pkg */ +#define XCHAL_HAVE_SSP16_VITERBI 0 /* SSP16 & viterbi */ +#define XCHAL_HAVE_TURBO16 0 /* ConnX Turbo16 pkg */ +#define XCHAL_HAVE_BBP16 0 /* ConnX BBP16 pkg */ +#define XCHAL_HAVE_FLIX3 0 /* basic 3-way FLIX option */ +#define XCHAL_HAVE_GRIVPEP 0 /* General Release of IVPEP */ +#define XCHAL_HAVE_GRIVPEP_HISTOGRAM 0 /* Histogram option on GRIVPEP */ + +#define XCHAL_HAVE_VISION 0 /* Vision P5/P6 */ +#define XCHAL_VISION_SIMD16 0 /* simd16 for Vision P5/P6 */ +#define XCHAL_VISION_TYPE 0 /* Vision P5, P6, or P3 */ +#define XCHAL_VISION_QUAD_MAC_TYPE 0 /* quad_mac option on Vision P6 */ +#define XCHAL_HAVE_VISION_HISTOGRAM 0 /* histogram option on Vision P5/P6 */ +#define XCHAL_HAVE_VISION_SP_VFPU 0 /* sp_vfpu option on Vision P5/P6 */ +#define XCHAL_HAVE_VISION_HP_VFPU 0 /* hp_vfpu option on Vision P6 */ + +#define XCHAL_HAVE_VISIONC 0 /* Vision C */ + +/*---------------------------------------------------------------------- + MISC + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_LOADSTORE_UNITS 1 /* load/store units */ +#define XCHAL_NUM_WRITEBUFFER_ENTRIES 4 /* size of write buffer */ +#define XCHAL_INST_FETCH_WIDTH 4 /* instr-fetch width in bytes */ +#define XCHAL_DATA_WIDTH 16 /* data width in bytes */ +#define XCHAL_DATA_PIPE_DELAY 1 /* d-side pipeline delay + (1 = 5-stage, 2 = 7-stage) */ +#define XCHAL_CLOCK_GATING_GLOBAL 1 /* global clock gating */ +#define XCHAL_CLOCK_GATING_FUNCUNIT 1 /* funct. unit clock gating */ +/* In T1050, applies to selected core load and store instructions (see ISA): */ +#define XCHAL_UNALIGNED_LOAD_EXCEPTION 0 /* unaligned loads cause exc. */ +#define XCHAL_UNALIGNED_STORE_EXCEPTION 0 /* unaligned stores cause exc.*/ +#define XCHAL_UNALIGNED_LOAD_HW 1 /* unaligned loads work in hw */ +#define XCHAL_UNALIGNED_STORE_HW 1 /* unaligned stores work in hw*/ + +#define XCHAL_SW_VERSION 1200012 /* sw version of this header */ + +#define XCHAL_CORE_ID "LX7_ESP32_S3_MP" /* alphanum core name + (CoreID) set in the Xtensa + Processor Generator */ + +#define XCHAL_BUILD_UNIQUE_ID 0x00090F1F /* 22-bit sw build ID */ + +/* + * These definitions describe the hardware targeted by this software. + */ +#define XCHAL_HW_CONFIGID0 0xC2F0FFFE /* ConfigID hi 32 bits*/ +#define XCHAL_HW_CONFIGID1 0x23090F1F /* ConfigID lo 32 bits*/ +#define XCHAL_HW_VERSION_NAME "LX7.0.12" /* full version name */ +#define XCHAL_HW_VERSION_MAJOR 2700 /* major ver# of targeted hw */ +#define XCHAL_HW_VERSION_MINOR 12 /* minor ver# of targeted hw */ +#define XCHAL_HW_VERSION 270012 /* major*100+minor */ +#define XCHAL_HW_REL_LX7 1 +#define XCHAL_HW_REL_LX7_0 1 +#define XCHAL_HW_REL_LX7_0_12 1 +#define XCHAL_HW_CONFIGID_RELIABLE 1 +/* If software targets a *range* of hardware versions, these are the bounds: */ +#define XCHAL_HW_MIN_VERSION_MAJOR 2700 /* major v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION_MINOR 12 /* minor v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION 270012 /* earliest targeted hw */ +#define XCHAL_HW_MAX_VERSION_MAJOR 2700 /* major v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION_MINOR 12 /* minor v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION 270012 /* latest targeted hw */ + + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_ICACHE_LINESIZE 4 /* I-cache line size in bytes */ +#define XCHAL_DCACHE_LINESIZE 16 /* D-cache line size in bytes */ +#define XCHAL_ICACHE_LINEWIDTH 2 /* log2(I line size in bytes) */ +#define XCHAL_DCACHE_LINEWIDTH 4 /* log2(D line size in bytes) */ + +#define XCHAL_ICACHE_SIZE 0 /* I-cache size in bytes or 0 */ +#define XCHAL_DCACHE_SIZE 0 /* D-cache size in bytes or 0 */ + +#define XCHAL_DCACHE_IS_WRITEBACK 0 /* writeback feature */ +#define XCHAL_DCACHE_IS_COHERENT 0 /* MP coherence feature */ + +#define XCHAL_HAVE_PREFETCH 0 /* PREFCTL register */ +#define XCHAL_HAVE_PREFETCH_L1 0 /* prefetch to L1 dcache */ +#define XCHAL_PREFETCH_CASTOUT_LINES 0 /* dcache pref. castout bufsz */ +#define XCHAL_PREFETCH_ENTRIES 0 /* cache prefetch entries */ +#define XCHAL_PREFETCH_BLOCK_ENTRIES 0 /* prefetch block streams */ +#define XCHAL_HAVE_CACHE_BLOCKOPS 0 /* block prefetch for caches */ +#define XCHAL_HAVE_ICACHE_TEST 0 /* Icache test instructions */ +#define XCHAL_HAVE_DCACHE_TEST 0 /* Dcache test instructions */ +#define XCHAL_HAVE_ICACHE_DYN_WAYS 0 /* Icache dynamic way support */ +#define XCHAL_HAVE_DCACHE_DYN_WAYS 0 /* Dcache dynamic way support */ + + + + +/**************************************************************************** + Parameters Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code + ****************************************************************************/ + + +#ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_PIF 1 /* any outbound bus present */ + +#define XCHAL_HAVE_AXI 0 /* AXI bus */ +#define XCHAL_HAVE_AXI_ECC 0 /* ECC on AXI bus */ +#define XCHAL_HAVE_ACELITE 0 /* ACELite bus */ + +#define XCHAL_HAVE_PIF_WR_RESP 0 /* pif write response */ +#define XCHAL_HAVE_PIF_REQ_ATTR 1 /* pif attribute */ + +/* If present, cache size in bytes == (ways * 2^(linewidth + setwidth)). */ + +/* Number of cache sets in log2(lines per way): */ +#define XCHAL_ICACHE_SETWIDTH 0 +#define XCHAL_DCACHE_SETWIDTH 0 + +/* Cache set associativity (number of ways): */ +#define XCHAL_ICACHE_WAYS 1 +#define XCHAL_DCACHE_WAYS 1 + +/* Cache features: */ +#define XCHAL_ICACHE_LINE_LOCKABLE 0 +#define XCHAL_DCACHE_LINE_LOCKABLE 0 +#define XCHAL_ICACHE_ECC_PARITY 0 +#define XCHAL_DCACHE_ECC_PARITY 0 +#define XCHAL_ICACHE_ECC_WIDTH 1 +#define XCHAL_DCACHE_ECC_WIDTH 1 + +/* Cache access size in bytes (affects operation of SICW instruction): */ +#define XCHAL_ICACHE_ACCESS_SIZE 1 +#define XCHAL_DCACHE_ACCESS_SIZE 1 + +#define XCHAL_DCACHE_BANKS 0 /* number of banks */ + +/* Number of encoded cache attr bits (see for decoded bits): */ +#define XCHAL_CA_BITS 4 + + +/*---------------------------------------------------------------------- + INTERNAL I/D RAM/ROMs and XLMI + ----------------------------------------------------------------------*/ +#define XCHAL_NUM_INSTROM 0 /* number of core instr. ROMs */ +#define XCHAL_NUM_INSTRAM 1 /* number of core instr. RAMs */ +#define XCHAL_NUM_DATAROM 0 /* number of core data ROMs */ +#define XCHAL_NUM_DATARAM 1 /* number of core data RAMs */ +#define XCHAL_NUM_URAM 0 /* number of core unified RAMs*/ +#define XCHAL_NUM_XLMI 0 /* number of core XLMI ports */ + +/* Instruction RAM 0: */ +#define XCHAL_INSTRAM0_VADDR 0x40000000 /* virtual address */ +#define XCHAL_INSTRAM0_PADDR 0x40000000 /* physical address */ +#define XCHAL_INSTRAM0_SIZE 67108864 /* size in bytes */ +#define XCHAL_INSTRAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_HAVE_INSTRAM0 1 +#define XCHAL_INSTRAM0_HAVE_IDMA 0 /* idma supported by this local memory */ + +/* Data RAM 0: */ +#define XCHAL_DATARAM0_VADDR 0x3C000000 /* virtual address */ +#define XCHAL_DATARAM0_PADDR 0x3C000000 /* physical address */ +#define XCHAL_DATARAM0_SIZE 67108864 /* size in bytes */ +#define XCHAL_DATARAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATARAM0_BANKS 1 /* number of banks */ +#define XCHAL_HAVE_DATARAM0 1 +#define XCHAL_DATARAM0_HAVE_IDMA 0 /* idma supported by this local memory */ + +#define XCHAL_HAVE_IDMA 0 +#define XCHAL_HAVE_IDMA_TRANSPOSE 0 + +#define XCHAL_HAVE_IMEM_LOADSTORE 1 /* can load/store to IROM/IRAM*/ + + +/*---------------------------------------------------------------------- + INTERRUPTS and TIMERS + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_INTERRUPTS 1 /* interrupt option */ +#define XCHAL_HAVE_HIGHPRI_INTERRUPTS 1 /* med/high-pri. interrupts */ +#define XCHAL_HAVE_NMI 1 /* non-maskable interrupt */ +#define XCHAL_HAVE_CCOUNT 1 /* CCOUNT reg. (timer option) */ +#define XCHAL_NUM_TIMERS 3 /* number of CCOMPAREn regs */ +#define XCHAL_NUM_INTERRUPTS 32 /* number of interrupts */ +#define XCHAL_NUM_INTERRUPTS_LOG2 5 /* ceil(log2(NUM_INTERRUPTS)) */ +#define XCHAL_NUM_EXTINTERRUPTS 26 /* num of external interrupts */ +#define XCHAL_NUM_INTLEVELS 6 /* number of interrupt levels + (not including level zero) */ +#define XCHAL_EXCM_LEVEL 3 /* level masked by PS.EXCM */ + /* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */ + +/* Masks of interrupts at each interrupt level: */ +#define XCHAL_INTLEVEL1_MASK 0x000637FF +#define XCHAL_INTLEVEL2_MASK 0x00380000 +#define XCHAL_INTLEVEL3_MASK 0x28C08800 +#define XCHAL_INTLEVEL4_MASK 0x53000000 +#define XCHAL_INTLEVEL5_MASK 0x84010000 +#define XCHAL_INTLEVEL6_MASK 0x00000000 +#define XCHAL_INTLEVEL7_MASK 0x00004000 + +/* Masks of interrupts at each range 1..n of interrupt levels: */ +#define XCHAL_INTLEVEL1_ANDBELOW_MASK 0x000637FF +#define XCHAL_INTLEVEL2_ANDBELOW_MASK 0x003E37FF +#define XCHAL_INTLEVEL3_ANDBELOW_MASK 0x28FEBFFF +#define XCHAL_INTLEVEL4_ANDBELOW_MASK 0x7BFEBFFF +#define XCHAL_INTLEVEL5_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL6_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL7_ANDBELOW_MASK 0xFFFFFFFF + +/* Level of each interrupt: */ +#define XCHAL_INT0_LEVEL 1 +#define XCHAL_INT1_LEVEL 1 +#define XCHAL_INT2_LEVEL 1 +#define XCHAL_INT3_LEVEL 1 +#define XCHAL_INT4_LEVEL 1 +#define XCHAL_INT5_LEVEL 1 +#define XCHAL_INT6_LEVEL 1 +#define XCHAL_INT7_LEVEL 1 +#define XCHAL_INT8_LEVEL 1 +#define XCHAL_INT9_LEVEL 1 +#define XCHAL_INT10_LEVEL 1 +#define XCHAL_INT11_LEVEL 3 +#define XCHAL_INT12_LEVEL 1 +#define XCHAL_INT13_LEVEL 1 +#define XCHAL_INT14_LEVEL 7 +#define XCHAL_INT15_LEVEL 3 +#define XCHAL_INT16_LEVEL 5 +#define XCHAL_INT17_LEVEL 1 +#define XCHAL_INT18_LEVEL 1 +#define XCHAL_INT19_LEVEL 2 +#define XCHAL_INT20_LEVEL 2 +#define XCHAL_INT21_LEVEL 2 +#define XCHAL_INT22_LEVEL 3 +#define XCHAL_INT23_LEVEL 3 +#define XCHAL_INT24_LEVEL 4 +#define XCHAL_INT25_LEVEL 4 +#define XCHAL_INT26_LEVEL 5 +#define XCHAL_INT27_LEVEL 3 +#define XCHAL_INT28_LEVEL 4 +#define XCHAL_INT29_LEVEL 3 +#define XCHAL_INT30_LEVEL 4 +#define XCHAL_INT31_LEVEL 5 +#define XCHAL_DEBUGLEVEL 6 /* debug interrupt level */ +#define XCHAL_HAVE_DEBUG_EXTERN_INT 1 /* OCD external db interrupt */ +#define XCHAL_NMILEVEL 7 /* NMI "level" (for use with + EXCSAVE/EPS/EPC_n, RFI n) */ + +/* Type of each interrupt: */ +#define XCHAL_INT0_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT1_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT2_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT3_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT4_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT5_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT6_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT7_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT8_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT9_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT10_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT11_TYPE XTHAL_INTTYPE_PROFILING +#define XCHAL_INT12_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT13_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT14_TYPE XTHAL_INTTYPE_NMI +#define XCHAL_INT15_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT16_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT17_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT18_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT19_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT20_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT21_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT22_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT23_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT24_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT25_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT26_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT27_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT28_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT29_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT30_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT31_TYPE XTHAL_INTTYPE_EXTERN_LEVEL + +/* Masks of interrupts for each type of interrupt: */ +#define XCHAL_INTTYPE_MASK_UNCONFIGURED 0x00000000 +#define XCHAL_INTTYPE_MASK_SOFTWARE 0x20000080 +#define XCHAL_INTTYPE_MASK_EXTERN_EDGE 0x50400400 +#define XCHAL_INTTYPE_MASK_EXTERN_LEVEL 0x8FBE333F +#define XCHAL_INTTYPE_MASK_TIMER 0x00018040 +#define XCHAL_INTTYPE_MASK_NMI 0x00004000 +#define XCHAL_INTTYPE_MASK_WRITE_ERROR 0x00000000 +#define XCHAL_INTTYPE_MASK_PROFILING 0x00000800 +#define XCHAL_INTTYPE_MASK_IDMA_DONE 0x00000000 +#define XCHAL_INTTYPE_MASK_IDMA_ERR 0x00000000 +#define XCHAL_INTTYPE_MASK_GS_ERR 0x00000000 + +/* Interrupt numbers assigned to specific interrupt sources: */ +#define XCHAL_TIMER0_INTERRUPT 6 /* CCOMPARE0 */ +#define XCHAL_TIMER1_INTERRUPT 15 /* CCOMPARE1 */ +#define XCHAL_TIMER2_INTERRUPT 16 /* CCOMPARE2 */ +#define XCHAL_TIMER3_INTERRUPT XTHAL_TIMER_UNCONFIGURED +#define XCHAL_NMI_INTERRUPT 14 /* non-maskable interrupt */ +#define XCHAL_PROFILING_INTERRUPT 11 + +/* Interrupt numbers for levels at which only one interrupt is configured: */ +#define XCHAL_INTLEVEL7_NUM 14 +/* (There are many interrupts each at level(s) 1, 2, 3, 4, 5.) */ + + +/* + * External interrupt mapping. + * These macros describe how Xtensa processor interrupt numbers + * (as numbered internally, eg. in INTERRUPT and INTENABLE registers) + * map to external BInterrupt pins, for those interrupts + * configured as external (level-triggered, edge-triggered, or NMI). + * See the Xtensa processor databook for more details. + */ + +/* Core interrupt numbers mapped to each EXTERNAL BInterrupt pin number: */ +#define XCHAL_EXTINT0_NUM 0 /* (intlevel 1) */ +#define XCHAL_EXTINT1_NUM 1 /* (intlevel 1) */ +#define XCHAL_EXTINT2_NUM 2 /* (intlevel 1) */ +#define XCHAL_EXTINT3_NUM 3 /* (intlevel 1) */ +#define XCHAL_EXTINT4_NUM 4 /* (intlevel 1) */ +#define XCHAL_EXTINT5_NUM 5 /* (intlevel 1) */ +#define XCHAL_EXTINT6_NUM 8 /* (intlevel 1) */ +#define XCHAL_EXTINT7_NUM 9 /* (intlevel 1) */ +#define XCHAL_EXTINT8_NUM 10 /* (intlevel 1) */ +#define XCHAL_EXTINT9_NUM 12 /* (intlevel 1) */ +#define XCHAL_EXTINT10_NUM 13 /* (intlevel 1) */ +#define XCHAL_EXTINT11_NUM 14 /* (intlevel 7) */ +#define XCHAL_EXTINT12_NUM 17 /* (intlevel 1) */ +#define XCHAL_EXTINT13_NUM 18 /* (intlevel 1) */ +#define XCHAL_EXTINT14_NUM 19 /* (intlevel 2) */ +#define XCHAL_EXTINT15_NUM 20 /* (intlevel 2) */ +#define XCHAL_EXTINT16_NUM 21 /* (intlevel 2) */ +#define XCHAL_EXTINT17_NUM 22 /* (intlevel 3) */ +#define XCHAL_EXTINT18_NUM 23 /* (intlevel 3) */ +#define XCHAL_EXTINT19_NUM 24 /* (intlevel 4) */ +#define XCHAL_EXTINT20_NUM 25 /* (intlevel 4) */ +#define XCHAL_EXTINT21_NUM 26 /* (intlevel 5) */ +#define XCHAL_EXTINT22_NUM 27 /* (intlevel 3) */ +#define XCHAL_EXTINT23_NUM 28 /* (intlevel 4) */ +#define XCHAL_EXTINT24_NUM 30 /* (intlevel 4) */ +#define XCHAL_EXTINT25_NUM 31 /* (intlevel 5) */ +/* EXTERNAL BInterrupt pin numbers mapped to each core interrupt number: */ +#define XCHAL_INT0_EXTNUM 0 /* (intlevel 1) */ +#define XCHAL_INT1_EXTNUM 1 /* (intlevel 1) */ +#define XCHAL_INT2_EXTNUM 2 /* (intlevel 1) */ +#define XCHAL_INT3_EXTNUM 3 /* (intlevel 1) */ +#define XCHAL_INT4_EXTNUM 4 /* (intlevel 1) */ +#define XCHAL_INT5_EXTNUM 5 /* (intlevel 1) */ +#define XCHAL_INT8_EXTNUM 6 /* (intlevel 1) */ +#define XCHAL_INT9_EXTNUM 7 /* (intlevel 1) */ +#define XCHAL_INT10_EXTNUM 8 /* (intlevel 1) */ +#define XCHAL_INT12_EXTNUM 9 /* (intlevel 1) */ +#define XCHAL_INT13_EXTNUM 10 /* (intlevel 1) */ +#define XCHAL_INT14_EXTNUM 11 /* (intlevel 7) */ +#define XCHAL_INT17_EXTNUM 12 /* (intlevel 1) */ +#define XCHAL_INT18_EXTNUM 13 /* (intlevel 1) */ +#define XCHAL_INT19_EXTNUM 14 /* (intlevel 2) */ +#define XCHAL_INT20_EXTNUM 15 /* (intlevel 2) */ +#define XCHAL_INT21_EXTNUM 16 /* (intlevel 2) */ +#define XCHAL_INT22_EXTNUM 17 /* (intlevel 3) */ +#define XCHAL_INT23_EXTNUM 18 /* (intlevel 3) */ +#define XCHAL_INT24_EXTNUM 19 /* (intlevel 4) */ +#define XCHAL_INT25_EXTNUM 20 /* (intlevel 4) */ +#define XCHAL_INT26_EXTNUM 21 /* (intlevel 5) */ +#define XCHAL_INT27_EXTNUM 22 /* (intlevel 3) */ +#define XCHAL_INT28_EXTNUM 23 /* (intlevel 4) */ +#define XCHAL_INT30_EXTNUM 24 /* (intlevel 4) */ +#define XCHAL_INT31_EXTNUM 25 /* (intlevel 5) */ + + +/*---------------------------------------------------------------------- + EXCEPTIONS and VECTORS + ----------------------------------------------------------------------*/ + +#define XCHAL_XEA_VERSION 2 /* Xtensa Exception Architecture + number: 1 == XEA1 (old) + 2 == XEA2 (new) + 0 == XEAX (extern) or TX */ +#define XCHAL_HAVE_XEA1 0 /* Exception Architecture 1 */ +#define XCHAL_HAVE_XEA2 1 /* Exception Architecture 2 */ +#define XCHAL_HAVE_XEAX 0 /* External Exception Arch. */ +#define XCHAL_HAVE_EXCEPTIONS 1 /* exception option */ +#define XCHAL_HAVE_HALT 0 /* halt architecture option */ +#define XCHAL_HAVE_BOOTLOADER 0 /* boot loader (for TX) */ +#define XCHAL_HAVE_MEM_ECC_PARITY 0 /* local memory ECC/parity */ +#define XCHAL_HAVE_VECTOR_SELECT 1 /* relocatable vectors */ +#define XCHAL_HAVE_VECBASE 1 /* relocatable vectors */ +#define XCHAL_VECBASE_RESET_VADDR 0x40000000 /* VECBASE reset value */ +#define XCHAL_VECBASE_RESET_PADDR 0x40000000 +#define XCHAL_RESET_VECBASE_OVERLAP 0 + +#define XCHAL_RESET_VECTOR0_VADDR 0x50000000 +#define XCHAL_RESET_VECTOR0_PADDR 0x50000000 +#define XCHAL_RESET_VECTOR1_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR1_PADDR 0x40000400 +#define XCHAL_RESET_VECTOR_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR_PADDR 0x40000400 +#define XCHAL_USER_VECOFS 0x00000340 +#define XCHAL_USER_VECTOR_VADDR 0x40000340 +#define XCHAL_USER_VECTOR_PADDR 0x40000340 +#define XCHAL_KERNEL_VECOFS 0x00000300 +#define XCHAL_KERNEL_VECTOR_VADDR 0x40000300 +#define XCHAL_KERNEL_VECTOR_PADDR 0x40000300 +#define XCHAL_DOUBLEEXC_VECOFS 0x000003C0 +#define XCHAL_DOUBLEEXC_VECTOR_VADDR 0x400003C0 +#define XCHAL_DOUBLEEXC_VECTOR_PADDR 0x400003C0 +#define XCHAL_WINDOW_OF4_VECOFS 0x00000000 +#define XCHAL_WINDOW_UF4_VECOFS 0x00000040 +#define XCHAL_WINDOW_OF8_VECOFS 0x00000080 +#define XCHAL_WINDOW_UF8_VECOFS 0x000000C0 +#define XCHAL_WINDOW_OF12_VECOFS 0x00000100 +#define XCHAL_WINDOW_UF12_VECOFS 0x00000140 +#define XCHAL_WINDOW_VECTORS_VADDR 0x40000000 +#define XCHAL_WINDOW_VECTORS_PADDR 0x40000000 +#define XCHAL_INTLEVEL2_VECOFS 0x00000180 +#define XCHAL_INTLEVEL2_VECTOR_VADDR 0x40000180 +#define XCHAL_INTLEVEL2_VECTOR_PADDR 0x40000180 +#define XCHAL_INTLEVEL3_VECOFS 0x000001C0 +#define XCHAL_INTLEVEL3_VECTOR_VADDR 0x400001C0 +#define XCHAL_INTLEVEL3_VECTOR_PADDR 0x400001C0 +#define XCHAL_INTLEVEL4_VECOFS 0x00000200 +#define XCHAL_INTLEVEL4_VECTOR_VADDR 0x40000200 +#define XCHAL_INTLEVEL4_VECTOR_PADDR 0x40000200 +#define XCHAL_INTLEVEL5_VECOFS 0x00000240 +#define XCHAL_INTLEVEL5_VECTOR_VADDR 0x40000240 +#define XCHAL_INTLEVEL5_VECTOR_PADDR 0x40000240 +#define XCHAL_INTLEVEL6_VECOFS 0x00000280 +#define XCHAL_INTLEVEL6_VECTOR_VADDR 0x40000280 +#define XCHAL_INTLEVEL6_VECTOR_PADDR 0x40000280 +#define XCHAL_DEBUG_VECOFS XCHAL_INTLEVEL6_VECOFS +#define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL6_VECTOR_VADDR +#define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL6_VECTOR_PADDR +#define XCHAL_NMI_VECOFS 0x000002C0 +#define XCHAL_NMI_VECTOR_VADDR 0x400002C0 +#define XCHAL_NMI_VECTOR_PADDR 0x400002C0 +#define XCHAL_INTLEVEL7_VECOFS XCHAL_NMI_VECOFS +#define XCHAL_INTLEVEL7_VECTOR_VADDR XCHAL_NMI_VECTOR_VADDR +#define XCHAL_INTLEVEL7_VECTOR_PADDR XCHAL_NMI_VECTOR_PADDR + + +/*---------------------------------------------------------------------- + DEBUG MODULE + ----------------------------------------------------------------------*/ + +/* Misc */ +#define XCHAL_HAVE_DEBUG_ERI 1 /* ERI to debug module */ +#define XCHAL_HAVE_DEBUG_APB 0 /* APB to debug module */ +#define XCHAL_HAVE_DEBUG_JTAG 1 /* JTAG to debug module */ + +/* On-Chip Debug (OCD) */ +#define XCHAL_HAVE_OCD 1 /* OnChipDebug option */ +#define XCHAL_NUM_IBREAK 2 /* number of IBREAKn regs */ +#define XCHAL_NUM_DBREAK 2 /* number of DBREAKn regs */ +#define XCHAL_HAVE_OCD_DIR_ARRAY 0 /* faster OCD option (to LX4) */ +#define XCHAL_HAVE_OCD_LS32DDR 1 /* L32DDR/S32DDR (faster OCD) */ + +/* TRAX (in core) */ +#define XCHAL_HAVE_TRAX 1 /* TRAX in debug module */ +#define XCHAL_TRAX_MEM_SIZE 16384 /* TRAX memory size in bytes */ +#define XCHAL_TRAX_MEM_SHAREABLE 1 /* start/end regs; ready sig. */ +#define XCHAL_TRAX_ATB_WIDTH 0 /* ATB width (bits), 0=no ATB */ +#define XCHAL_TRAX_TIME_WIDTH 0 /* timestamp bitwidth, 0=none */ + +/* Perf counters */ +#define XCHAL_NUM_PERF_COUNTERS 2 /* performance counters */ + + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* See core-matmap.h header file for more details. */ + +#define XCHAL_HAVE_TLBS 1 /* inverse of HAVE_CACHEATTR */ +#define XCHAL_HAVE_SPANNING_WAY 1 /* one way maps I+D 4GB vaddr */ +#define XCHAL_SPANNING_WAY 0 /* TLB spanning way number */ +#define XCHAL_HAVE_IDENTITY_MAP 1 /* vaddr == paddr always */ +#define XCHAL_HAVE_CACHEATTR 0 /* CACHEATTR register present */ +#define XCHAL_HAVE_MIMIC_CACHEATTR 1 /* region protection */ +#define XCHAL_HAVE_XLT_CACHEATTR 0 /* region prot. w/translation */ +#define XCHAL_HAVE_PTP_MMU 0 /* full MMU (with page table + [autorefill] and protection) + usable for an MMU-based OS */ + +/* If none of the above last 5 are set, it's a custom TLB configuration. */ + +#define XCHAL_MMU_ASID_BITS 0 /* number of bits in ASIDs */ +#define XCHAL_MMU_RINGS 1 /* number of rings (1..4) */ +#define XCHAL_MMU_RING_BITS 0 /* num of bits in RING field */ + +/*---------------------------------------------------------------------- + MPU + ----------------------------------------------------------------------*/ +#define XCHAL_HAVE_MPU 0 +#define XCHAL_MPU_ENTRIES 0 + +#define XCHAL_MPU_ALIGN_REQ 1 /* MPU requires alignment of entries to background map */ +#define XCHAL_MPU_BACKGROUND_ENTRIES 0 /* number of entries in bg map*/ +#define XCHAL_MPU_BG_CACHEADRDIS 0 /* default CACHEADRDIS for bg */ + +#define XCHAL_MPU_ALIGN_BITS 0 +#define XCHAL_MPU_ALIGN 0 + +#endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */ + + +#endif /* _XTENSA_CORE_CONFIGURATION_H */ diff --git a/arch/xtensa/variants/esp32s3/include/variant/tie-asm.h b/arch/xtensa/variants/esp32s3/include/variant/tie-asm.h new file mode 100644 index 00000000000000..104dc10fd414a7 --- /dev/null +++ b/arch/xtensa/variants/esp32s3/include/variant/tie-asm.h @@ -0,0 +1,429 @@ +/* + * tie-asm.h -- compile-time HAL assembler definitions dependent on CORE & TIE + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file contains assembly-language definitions (assembly + macros, etc.) for this specific Xtensa processor's TIE extensions + and options. It is customized to this Xtensa processor configuration. + + Customer ID=15128; Build=0x90f1f; Copyright (c) 1999-2021 Cadence Design Systems Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_TIE_ASM_H +#define _XTENSA_CORE_TIE_ASM_H + +/* Selection parameter values for save-area save/restore macros: */ +/* Option vs. TIE: */ +#define XTHAL_SAS_TIE 0x0001 /* custom extension or coprocessor */ +#define XTHAL_SAS_OPT 0x0002 /* optional (and not a coprocessor) */ +#define XTHAL_SAS_ANYOT 0x0003 /* both of the above */ +/* Whether used automatically by compiler: */ +#define XTHAL_SAS_NOCC 0x0004 /* not used by compiler w/o special opts/code */ +#define XTHAL_SAS_CC 0x0008 /* used by compiler without special opts/code */ +#define XTHAL_SAS_ANYCC 0x000C /* both of the above */ +/* ABI handling across function calls: */ +#define XTHAL_SAS_CALR 0x0010 /* caller-saved */ +#define XTHAL_SAS_CALE 0x0020 /* callee-saved */ +#define XTHAL_SAS_GLOB 0x0040 /* global across function calls (in thread) */ +#define XTHAL_SAS_ANYABI 0x0070 /* all of the above three */ +/* Misc */ +#define XTHAL_SAS_ALL 0xFFFF /* include all default NCP contents */ +#define XTHAL_SAS3(optie,ccuse,abi) ( ((optie) & XTHAL_SAS_ANYOT) \ + | ((ccuse) & XTHAL_SAS_ANYCC) \ + | ((abi) & XTHAL_SAS_ANYABI) ) + + + /* + * Macro to store all non-coprocessor (extra) custom TIE and optional state + * (not including zero-overhead loop registers). + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_NCP_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters: + * continue If macro invoked as part of a larger store sequence, set to 1 + * if this is not the first in the sequence. Defaults to 0. + * ofs Offset from start of larger sequence (from value of first ptr + * in sequence) at which to store. Defaults to next available space + * (or 0 if is 0). + * select Select what category(ies) of registers to store, as a bitmask + * (see XTHAL_SAS_xxx constants). Defaults to all registers. + * alloc Select what category(ies) of registers to allocate; if any + * category is selected here that is not in , space for + * the corresponding registers is skipped without doing any load. + */ + .macro xchal_ncp_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Optional global registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\select) + xchal_sa_align \ptr, 0, 1016, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.THREADPTR \at1 // threadptr option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1016, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .endif + // Optional caller-saved registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 1012, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wsr.ACCLO \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+4 + wsr.ACCHI \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1012, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .endif + // Optional caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 996, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wsr.BR \at1 // boolean option + l32i \at1, \ptr, .Lxchal_ofs_+4 + wsr.SCOMPARE1 \at1 // conditional store option + l32i \at1, \ptr, .Lxchal_ofs_+8 + wsr.M0 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+12 + wsr.M1 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+16 + wsr.M2 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+20 + wsr.M3 \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 996, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .endif + .endm // xchal_ncp_load + + +#define XCHAL_NCP_NUM_ATMPS 1 + + /* + * Macro to store the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_store. + */ +#define xchal_cp_FPU_store xchal_cp0_store + .macro xchal_cp0_store ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + rur.FCR \at1 // ureg 232 + s32i \at1, \ptr, .Lxchal_ofs_+0 + rur.FSR \at1 // ureg 233 + s32i \at1, \ptr, .Lxchal_ofs_+4 + ssi f0, \ptr, .Lxchal_ofs_+8 + ssi f1, \ptr, .Lxchal_ofs_+12 + ssi f2, \ptr, .Lxchal_ofs_+16 + ssi f3, \ptr, .Lxchal_ofs_+20 + ssi f4, \ptr, .Lxchal_ofs_+24 + ssi f5, \ptr, .Lxchal_ofs_+28 + ssi f6, \ptr, .Lxchal_ofs_+32 + ssi f7, \ptr, .Lxchal_ofs_+36 + ssi f8, \ptr, .Lxchal_ofs_+40 + ssi f9, \ptr, .Lxchal_ofs_+44 + ssi f10, \ptr, .Lxchal_ofs_+48 + ssi f11, \ptr, .Lxchal_ofs_+52 + ssi f12, \ptr, .Lxchal_ofs_+56 + ssi f13, \ptr, .Lxchal_ofs_+60 + ssi f14, \ptr, .Lxchal_ofs_+64 + ssi f15, \ptr, .Lxchal_ofs_+68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_store + + /* + * Macro to load the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_load. + */ +#define xchal_cp_FPU_load xchal_cp0_load + .macro xchal_cp0_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.FCR \at1 // ureg 232 + l32i \at1, \ptr, .Lxchal_ofs_+4 + wur.FSR \at1 // ureg 233 + lsi f0, \ptr, .Lxchal_ofs_+8 + lsi f1, \ptr, .Lxchal_ofs_+12 + lsi f2, \ptr, .Lxchal_ofs_+16 + lsi f3, \ptr, .Lxchal_ofs_+20 + lsi f4, \ptr, .Lxchal_ofs_+24 + lsi f5, \ptr, .Lxchal_ofs_+28 + lsi f6, \ptr, .Lxchal_ofs_+32 + lsi f7, \ptr, .Lxchal_ofs_+36 + lsi f8, \ptr, .Lxchal_ofs_+40 + lsi f9, \ptr, .Lxchal_ofs_+44 + lsi f10, \ptr, .Lxchal_ofs_+48 + lsi f11, \ptr, .Lxchal_ofs_+52 + lsi f12, \ptr, .Lxchal_ofs_+56 + lsi f13, \ptr, .Lxchal_ofs_+60 + lsi f14, \ptr, .Lxchal_ofs_+64 + lsi f15, \ptr, .Lxchal_ofs_+68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_load + +#define XCHAL_CP0_NUM_ATMPS 1 + /* + * Macro to store the state of TIE coprocessor cop_ai. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 16 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP3_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_store. + */ +#define xchal_cp_cop_ai_store xchal_cp3_store + .macro xchal_cp3_store ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 0, 16, 16 + rur.ACCX_0 \at1 // ureg 0 + s32i \at1, \ptr, .Lxchal_ofs_+0 + rur.ACCX_1 \at1 // ureg 1 + s32i \at1, \ptr, .Lxchal_ofs_+4 + rur.QACC_H_0 \at1 // ureg 2 + s32i \at1, \ptr, .Lxchal_ofs_+8 + rur.QACC_H_1 \at1 // ureg 3 + s32i \at1, \ptr, .Lxchal_ofs_+12 + rur.QACC_H_2 \at1 // ureg 4 + s32i \at1, \ptr, .Lxchal_ofs_+16 + rur.QACC_H_3 \at1 // ureg 5 + s32i \at1, \ptr, .Lxchal_ofs_+20 + rur.QACC_H_4 \at1 // ureg 6 + s32i \at1, \ptr, .Lxchal_ofs_+24 + rur.QACC_L_0 \at1 // ureg 7 + s32i \at1, \ptr, .Lxchal_ofs_+28 + rur.QACC_L_1 \at1 // ureg 8 + s32i \at1, \ptr, .Lxchal_ofs_+32 + rur.QACC_L_2 \at1 // ureg 9 + s32i \at1, \ptr, .Lxchal_ofs_+36 + rur.QACC_L_3 \at1 // ureg 10 + s32i \at1, \ptr, .Lxchal_ofs_+40 + rur.QACC_L_4 \at1 // ureg 11 + s32i \at1, \ptr, .Lxchal_ofs_+44 + rur.SAR_BYTE \at1 // ureg 13 + s32i \at1, \ptr, .Lxchal_ofs_+48 + rur.FFT_BIT_WIDTH \at1 // ureg 14 + s32i \at1, \ptr, .Lxchal_ofs_+52 + rur.UA_STATE_0 \at1 // ureg 15 + s32i \at1, \ptr, .Lxchal_ofs_+56 + rur.UA_STATE_1 \at1 // ureg 16 + s32i \at1, \ptr, .Lxchal_ofs_+60 + rur.UA_STATE_2 \at1 // ureg 17 + s32i \at1, \ptr, .Lxchal_ofs_+64 + rur.UA_STATE_3 \at1 // ureg 18 + s32i \at1, \ptr, .Lxchal_ofs_+68 + st.qr q0, \ptr, .Lxchal_ofs_+80 + st.qr q1, \ptr, .Lxchal_ofs_+96 + st.qr q2, \ptr, .Lxchal_ofs_+112 + addi \ptr, \ptr, 128 + st.qr q3, \ptr, .Lxchal_ofs_+0 + st.qr q4, \ptr, .Lxchal_ofs_+16 + st.qr q5, \ptr, .Lxchal_ofs_+32 + st.qr q6, \ptr, .Lxchal_ofs_+48 + st.qr q7, \ptr, .Lxchal_ofs_+64 + .set .Lxchal_pofs_, .Lxchal_pofs_ + 128 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 80 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 0, 16, 16 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 208 + .endif + .endm // xchal_cp3_store + + /* + * Macro to load the state of TIE coprocessor cop_ai. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 16 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP3_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_load. + */ +#define xchal_cp_cop_ai_load xchal_cp3_load + .macro xchal_cp3_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 0, 16, 16 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.ACCX_0 \at1 // ureg 0 + l32i \at1, \ptr, .Lxchal_ofs_+4 + wur.ACCX_1 \at1 // ureg 1 + l32i \at1, \ptr, .Lxchal_ofs_+8 + wur.QACC_H_0 \at1 // ureg 2 + l32i \at1, \ptr, .Lxchal_ofs_+12 + wur.QACC_H_1 \at1 // ureg 3 + l32i \at1, \ptr, .Lxchal_ofs_+16 + wur.QACC_H_2 \at1 // ureg 4 + l32i \at1, \ptr, .Lxchal_ofs_+20 + wur.QACC_H_3 \at1 // ureg 5 + l32i \at1, \ptr, .Lxchal_ofs_+24 + wur.QACC_H_4 \at1 // ureg 6 + l32i \at1, \ptr, .Lxchal_ofs_+28 + wur.QACC_L_0 \at1 // ureg 7 + l32i \at1, \ptr, .Lxchal_ofs_+32 + wur.QACC_L_1 \at1 // ureg 8 + l32i \at1, \ptr, .Lxchal_ofs_+36 + wur.QACC_L_2 \at1 // ureg 9 + l32i \at1, \ptr, .Lxchal_ofs_+40 + wur.QACC_L_3 \at1 // ureg 10 + l32i \at1, \ptr, .Lxchal_ofs_+44 + wur.QACC_L_4 \at1 // ureg 11 + l32i \at1, \ptr, .Lxchal_ofs_+48 + wur.SAR_BYTE \at1 // ureg 13 + l32i \at1, \ptr, .Lxchal_ofs_+52 + wur.FFT_BIT_WIDTH \at1 // ureg 14 + l32i \at1, \ptr, .Lxchal_ofs_+56 + wur.UA_STATE_0 \at1 // ureg 15 + l32i \at1, \ptr, .Lxchal_ofs_+60 + wur.UA_STATE_1 \at1 // ureg 16 + l32i \at1, \ptr, .Lxchal_ofs_+64 + wur.UA_STATE_2 \at1 // ureg 17 + l32i \at1, \ptr, .Lxchal_ofs_+68 + wur.UA_STATE_3 \at1 // ureg 18 + ld.qr q0, \ptr, .Lxchal_ofs_+80 + ld.qr q1, \ptr, .Lxchal_ofs_+96 + ld.qr q2, \ptr, .Lxchal_ofs_+112 + addi \ptr, \ptr, 128 + ld.qr q3, \ptr, .Lxchal_ofs_+0 + ld.qr q4, \ptr, .Lxchal_ofs_+16 + ld.qr q5, \ptr, .Lxchal_ofs_+32 + ld.qr q6, \ptr, .Lxchal_ofs_+48 + ld.qr q7, \ptr, .Lxchal_ofs_+64 + .set .Lxchal_pofs_, .Lxchal_pofs_ + 128 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 80 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 0, 16, 16 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 208 + .endif + .endm // xchal_cp3_load + +#define XCHAL_CP3_NUM_ATMPS 1 +#define XCHAL_SA_NUM_ATMPS 1 + + /* Empty macros for unconfigured coprocessors: */ + .macro xchal_cp1_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp1_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp2_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp2_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp4_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp4_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp5_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp5_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp6_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp6_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp7_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp7_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + +#endif /*_XTENSA_CORE_TIE_ASM_H*/ diff --git a/arch/xtensa/variants/esp32s3/include/variant/tie.h b/arch/xtensa/variants/esp32s3/include/variant/tie.h new file mode 100644 index 00000000000000..e7671b1979e4bc --- /dev/null +++ b/arch/xtensa/variants/esp32s3/include/variant/tie.h @@ -0,0 +1,207 @@ +/* + * tie.h -- compile-time HAL definitions dependent on CORE & TIE configuration + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file describes this specific Xtensa processor's TIE extensions + that extend basic Xtensa core functionality. It is customized to this + Xtensa processor configuration. + + Customer ID=15128; Build=0x90f1f; Copyright (c) 1999-2021 Cadence Design Systems Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef _XTENSA_CORE_TIE_H +#define _XTENSA_CORE_TIE_H + +#define XCHAL_CP_NUM 2 /* number of coprocessors */ +#define XCHAL_CP_MAX 4 /* max CP ID + 1 (0 if none) */ +#define XCHAL_CP_MASK 0x09 /* bitmask of all CPs by ID */ +#define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ + +/* Basic parameters of each coprocessor: */ +#define XCHAL_CP0_NAME "FPU" +#define XCHAL_CP0_IDENT FPU +#define XCHAL_CP0_SA_SIZE 72 /* size of state save area */ +#define XCHAL_CP0_SA_ALIGN 4 /* min alignment of save area */ +#define XCHAL_CP_ID_FPU 0 /* coprocessor ID (0..7) */ +#define XCHAL_CP3_NAME "cop_ai" +#define XCHAL_CP3_IDENT cop_ai +#define XCHAL_CP3_SA_SIZE 208 /* size of state save area */ +#define XCHAL_CP3_SA_ALIGN 16 /* min alignment of save area */ +#define XCHAL_CP_ID_COP_AI 3 /* coprocessor ID (0..7) */ + +/* Filler info for unassigned coprocessors, to simplify arrays etc: */ +#define XCHAL_CP1_SA_SIZE 0 +#define XCHAL_CP1_SA_ALIGN 1 +#define XCHAL_CP2_SA_SIZE 0 +#define XCHAL_CP2_SA_ALIGN 1 +#define XCHAL_CP4_SA_SIZE 0 +#define XCHAL_CP4_SA_ALIGN 1 +#define XCHAL_CP5_SA_SIZE 0 +#define XCHAL_CP5_SA_ALIGN 1 +#define XCHAL_CP6_SA_SIZE 0 +#define XCHAL_CP6_SA_ALIGN 1 +#define XCHAL_CP7_SA_SIZE 0 +#define XCHAL_CP7_SA_ALIGN 1 + +/* Save area for non-coprocessor optional and custom (TIE) state: */ +#define XCHAL_NCP_SA_SIZE 36 +#define XCHAL_NCP_SA_ALIGN 4 + +/* Total save area for optional and custom state (NCP + CPn): */ +#define XCHAL_TOTAL_SA_SIZE 336 /* with 16-byte align padding */ +#define XCHAL_TOTAL_SA_ALIGN 16 /* actual minimum alignment */ + +/* + * Detailed contents of save areas. + * NOTE: caller must define the XCHAL_SA_REG macro (not defined here) + * before expanding the XCHAL_xxx_SA_LIST() macros. + * + * XCHAL_SA_REG(s,ccused,abikind,kind,opt,name,galign,align,asize, + * dbnum,base,regnum,bitsz,gapsz,reset,x...) + * + * s = passed from XCHAL_*_LIST(s), eg. to select how to expand + * ccused = set if used by compiler without special options or code + * abikind = 0 (caller-saved), 1 (callee-saved), or 2 (thread-global) + * kind = 0 (special reg), 1 (TIE user reg), or 2 (TIE regfile reg) + * opt = 0 (custom TIE extension or coprocessor), or 1 (optional reg) + * name = lowercase reg name (no quotes) + * galign = group byte alignment (power of 2) (galign >= align) + * align = register byte alignment (power of 2) + * asize = allocated size in bytes (asize*8 == bitsz + gapsz + padsz) + * (not including any pad bytes required to galign this or next reg) + * dbnum = unique target number f/debug (see ) + * base = reg shortname w/o index (or sr=special, ur=TIE user reg) + * regnum = reg index in regfile, or special/TIE-user reg number + * bitsz = number of significant bits (regfile width, or ur/sr mask bits) + * gapsz = intervening bits, if bitsz bits not stored contiguously + * (padsz = pad bits at end [TIE regfile] or at msbits [ur,sr] of asize) + * reset = register reset value (or 0 if undefined at reset) + * x = reserved for future use (0 until then) + * + * To filter out certain registers, e.g. to expand only the non-global + * registers used by the compiler, you can do something like this: + * + * #define XCHAL_SA_REG(s,ccused,p...) SELCC##ccused(p) + * #define SELCC0(p...) + * #define SELCC1(abikind,p...) SELAK##abikind(p) + * #define SELAK0(p...) REG(p) + * #define SELAK1(p...) REG(p) + * #define SELAK2(p...) + * #define REG(kind,tie,name,galn,aln,asz,csz,dbnum,base,rnum,bsz,rst,x...) \ + * ...what you want to expand... + */ + +#define XCHAL_NCP_SA_NUM 9 +#define XCHAL_NCP_SA_LIST(s) \ + XCHAL_SA_REG(s,1,2,1,1, threadptr, 4, 4, 4,0x03E7, ur,231, 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acclo, 4, 4, 4,0x0210, sr,16 , 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acchi, 4, 4, 4,0x0211, sr,17 , 8,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, br, 4, 4, 4,0x0204, sr,4 , 16,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, scompare1, 4, 4, 4,0x020C, sr,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m0, 4, 4, 4,0x0220, sr,32 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m1, 4, 4, 4,0x0221, sr,33 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m2, 4, 4, 4,0x0222, sr,34 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m3, 4, 4, 4,0x0223, sr,35 , 32,0,0,0) + +#define XCHAL_CP0_SA_NUM 18 +#define XCHAL_CP0_SA_LIST(s) \ + XCHAL_SA_REG(s,0,0,1,0, fcr, 4, 4, 4,0x03E8, ur,232, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, fsr, 4, 4, 4,0x03E9, ur,233, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f0, 4, 4, 4,0x0030, f,0 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f1, 4, 4, 4,0x0031, f,1 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f2, 4, 4, 4,0x0032, f,2 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f3, 4, 4, 4,0x0033, f,3 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f4, 4, 4, 4,0x0034, f,4 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f5, 4, 4, 4,0x0035, f,5 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f6, 4, 4, 4,0x0036, f,6 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f7, 4, 4, 4,0x0037, f,7 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f8, 4, 4, 4,0x0038, f,8 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f9, 4, 4, 4,0x0039, f,9 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f10, 4, 4, 4,0x003A, f,10 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f11, 4, 4, 4,0x003B, f,11 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f12, 4, 4, 4,0x003C, f,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f13, 4, 4, 4,0x003D, f,13 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f14, 4, 4, 4,0x003E, f,14 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f15, 4, 4, 4,0x003F, f,15 , 32,0,0,0) + +#define XCHAL_CP1_SA_NUM 0 +#define XCHAL_CP1_SA_LIST(s) /* empty */ + +#define XCHAL_CP2_SA_NUM 0 +#define XCHAL_CP2_SA_LIST(s) /* empty */ + +#define XCHAL_CP3_SA_NUM 26 +#define XCHAL_CP3_SA_LIST(s) \ + XCHAL_SA_REG(s,0,0,1,0, accx_0,16, 4, 4,0x0300, ur,0 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, accx_1, 4, 4, 4,0x0301, ur,1 , 8,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_0, 4, 4, 4,0x0302, ur,2 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_1, 4, 4, 4,0x0303, ur,3 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_2, 4, 4, 4,0x0304, ur,4 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_3, 4, 4, 4,0x0305, ur,5 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_h_4, 4, 4, 4,0x0306, ur,6 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_0, 4, 4, 4,0x0307, ur,7 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_1, 4, 4, 4,0x0308, ur,8 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_2, 4, 4, 4,0x0309, ur,9 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_3, 4, 4, 4,0x030A, ur,10 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, qacc_l_4, 4, 4, 4,0x030B, ur,11 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, sar_byte, 4, 4, 4,0x030D, ur,13 , 4,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, fft_bit_width, 4, 4, 4,0x030E, ur,14 , 4,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, ua_state_0, 4, 4, 4,0x030F, ur,15 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, ua_state_1, 4, 4, 4,0x0310, ur,16 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, ua_state_2, 4, 4, 4,0x0311, ur,17 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, ua_state_3, 4, 4, 4,0x0312, ur,18 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q0,16,16,16,0x1008, q,0 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q1,16,16,16,0x1009, q,1 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q2,16,16,16,0x100A, q,2 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q3,16,16,16,0x100B, q,3 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q4,16,16,16,0x100C, q,4 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q5,16,16,16,0x100D, q,5 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q6,16,16,16,0x100E, q,6 ,128,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, q7,16,16,16,0x100F, q,7 ,128,0,0,0) + +#define XCHAL_CP4_SA_NUM 0 +#define XCHAL_CP4_SA_LIST(s) /* empty */ + +#define XCHAL_CP5_SA_NUM 0 +#define XCHAL_CP5_SA_LIST(s) /* empty */ + +#define XCHAL_CP6_SA_NUM 0 +#define XCHAL_CP6_SA_LIST(s) /* empty */ + +#define XCHAL_CP7_SA_NUM 0 +#define XCHAL_CP7_SA_LIST(s) /* empty */ + +/* Byte length of instruction from its first nibble (op0 field), per FLIX. */ +#define XCHAL_OP0_FORMAT_LENGTHS 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4 +/* Byte length of instruction from its first byte, per FLIX. */ +#define XCHAL_BYTE0_FORMAT_LENGTHS \ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,4 + +#endif /*_XTENSA_CORE_TIE_H*/ From 1bb2b7de033abd0deff9c9fcf939e7394f032eb4 Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Wed, 4 Oct 2023 01:29:00 +0200 Subject: [PATCH 136/515] srcu: Only accelerate on enqueue time Acceleration in SRCU happens on enqueue time for each new callback. This operation is expected not to fail and therefore any similar attempt from other places shouldn't find any remaining callbacks to accelerate. Moreover accelerations performed beyond enqueue time are error prone because rcu_seq_snap() then may return the snapshot for a new grace period that is not going to be started. Remove these dangerous and needless accelerations and introduce instead assertions reporting leaking unaccelerated callbacks beyond enqueue time. Co-developed-by:: Yong He Signed-off-by: Yong He Co-developed-by: Joel Fernandes (Google) Signed-off-by: Joel Fernandes (Google) Co-developed-by: Neeraj upadhyay Signed-off-by: Neeraj upadhyay Reviewed-by: Like Xu Signed-off-by: Frederic Weisbecker --- kernel/rcu/srcutree.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c index 9fab9ac3699633..560e99ec53335c 100644 --- a/kernel/rcu/srcutree.c +++ b/kernel/rcu/srcutree.c @@ -784,8 +784,7 @@ static void srcu_gp_start(struct srcu_struct *ssp) spin_lock_rcu_node(sdp); /* Interrupts already disabled. */ rcu_segcblist_advance(&sdp->srcu_cblist, rcu_seq_current(&ssp->srcu_sup->srcu_gp_seq)); - (void)rcu_segcblist_accelerate(&sdp->srcu_cblist, - rcu_seq_snap(&ssp->srcu_sup->srcu_gp_seq)); + WARN_ON_ONCE(!rcu_segcblist_segempty(&sdp->srcu_cblist, RCU_NEXT_TAIL)); spin_unlock_rcu_node(sdp); /* Interrupts remain disabled. */ WRITE_ONCE(ssp->srcu_sup->srcu_gp_start, jiffies); WRITE_ONCE(ssp->srcu_sup->srcu_n_exp_nodelay, 0); @@ -1721,6 +1720,7 @@ static void srcu_invoke_callbacks(struct work_struct *work) ssp = sdp->ssp; rcu_cblist_init(&ready_cbs); spin_lock_irq_rcu_node(sdp); + WARN_ON_ONCE(!rcu_segcblist_segempty(&sdp->srcu_cblist, RCU_NEXT_TAIL)); rcu_segcblist_advance(&sdp->srcu_cblist, rcu_seq_current(&ssp->srcu_sup->srcu_gp_seq)); if (sdp->srcu_cblist_invoking || @@ -1750,8 +1750,6 @@ static void srcu_invoke_callbacks(struct work_struct *work) */ spin_lock_irq_rcu_node(sdp); rcu_segcblist_add_len(&sdp->srcu_cblist, -len); - (void)rcu_segcblist_accelerate(&sdp->srcu_cblist, - rcu_seq_snap(&ssp->srcu_sup->srcu_gp_seq)); sdp->srcu_cblist_invoking = false; more = rcu_segcblist_ready_cbs(&sdp->srcu_cblist); spin_unlock_irq_rcu_node(sdp); From 1d1472185a8821a14dd796ce3fa6375ed5a9f519 Mon Sep 17 00:00:00 2001 From: Jinjie Ruan Date: Thu, 31 Aug 2023 20:39:27 +0800 Subject: [PATCH 137/515] ntb: intel: Fix the NULL vs IS_ERR() bug for debugfs_create_dir() The debugfs_create_dir() function returns error pointers. It never returns NULL. So use IS_ERR() to check it. Fixes: e26a5843f7f5 ("NTB: Split ntb_hw_intel and ntb_transport drivers") Signed-off-by: Jinjie Ruan Reviewed-by: Dave Jiang Signed-off-by: Jon Mason --- drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.c b/drivers/ntb/hw/intel/ntb_hw_gen1.c index 9ab836d0d4f12d..079b8cd7978573 100644 --- a/drivers/ntb/hw/intel/ntb_hw_gen1.c +++ b/drivers/ntb/hw/intel/ntb_hw_gen1.c @@ -778,7 +778,7 @@ static void ndev_init_debugfs(struct intel_ntb_dev *ndev) ndev->debugfs_dir = debugfs_create_dir(pci_name(ndev->ntb.pdev), debugfs_dir); - if (!ndev->debugfs_dir) + if (IS_ERR(ndev->debugfs_dir)) ndev->debugfs_info = NULL; else ndev->debugfs_info = From 9341b37ec17a8793e8439e9b18354ba69556b786 Mon Sep 17 00:00:00 2001 From: Max Hawking Date: Sun, 8 Oct 2023 20:45:16 -0700 Subject: [PATCH 138/515] ntb_perf: Fix printk format The correct printk format is %pa or %pap, but not %pa[p]. Fixes: 99a06056124d ("NTB: ntb_perf: Fix address err in perf_copy_chunk") Signed-off-by: Max Hawking Signed-off-by: Jon Mason --- drivers/ntb/test/ntb_perf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c index 553f1f46bc664f..72bc1d017a46ee 100644 --- a/drivers/ntb/test/ntb_perf.c +++ b/drivers/ntb/test/ntb_perf.c @@ -1227,7 +1227,7 @@ static ssize_t perf_dbgfs_read_info(struct file *filep, char __user *ubuf, "\tOut buffer addr 0x%pK\n", peer->outbuf); pos += scnprintf(buf + pos, buf_size - pos, - "\tOut buff phys addr %pa[p]\n", &peer->out_phys_addr); + "\tOut buff phys addr %pap\n", &peer->out_phys_addr); pos += scnprintf(buf + pos, buf_size - pos, "\tOut buffer size %pa\n", &peer->outbuf_size); From 56df40c804fa40712239478355abe265aeda2197 Mon Sep 17 00:00:00 2001 From: Sui Jingfeng Date: Mon, 2 Oct 2023 19:12:06 +0800 Subject: [PATCH 139/515] drm/etnaviv: Add a helper to get the first available GPU device node This patch make the code in the etnaviv_pdev_probe() less twisted, and it also make it easier to drop the reference to device node after finished. Before apply this patch, there is no call to of_node_put() when done. We should call of_node_put() when done. Signed-off-by: Sui Jingfeng Signed-off-by: Lucas Stach --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 28 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c index 8fe39e31d22d96..a9a1659840ec3f 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -29,6 +29,17 @@ * DRM operations: */ +static struct device_node *etnaviv_of_first_available_node(void) +{ + struct device_node *np; + + for_each_compatible_node(np, NULL, "vivante,gc") { + if (of_device_is_available(np)) + return np; + } + + return NULL; +} static void load_gpu(struct drm_device *dev) { @@ -597,11 +608,10 @@ static int etnaviv_pdev_probe(struct platform_device *pdev) if (!of_device_is_available(core_node)) continue; - if (!first_node) - first_node = core_node; - drm_of_component_match_add(&pdev->dev, &match, component_compare_of, core_node); + + of_node_put(core_node); } } else { char **names = dev->platform_data; @@ -634,8 +644,11 @@ static int etnaviv_pdev_probe(struct platform_device *pdev) * device as the GPU we found. This assumes that all Vivante * GPUs in the system share the same DMA constraints. */ - if (first_node) + first_node = etnaviv_of_first_available_node(); + if (first_node) { of_dma_configure(&pdev->dev, first_node, true); + of_node_put(first_node); + } return component_master_add_with_match(dev, &etnaviv_master_ops, match); } @@ -709,16 +722,13 @@ static int __init etnaviv_init(void) * If the DT contains at least one available GPU device, instantiate * the DRM platform device. */ - for_each_compatible_node(np, NULL, "vivante,gc") { - if (!of_device_is_available(np)) - continue; + np = etnaviv_of_first_available_node(); + if (np) { of_node_put(np); ret = etnaviv_create_platform_device("etnaviv", &etnaviv_drm); if (ret) goto unregister_platform_driver; - - break; } return 0; From 9cf5e2be7c19fd8a1a672d1fa42e0d93794dd878 Mon Sep 17 00:00:00 2001 From: Sui Jingfeng Date: Mon, 2 Oct 2023 19:12:07 +0800 Subject: [PATCH 140/515] drm/etnaviv: Clean up etnaviv_gem_get_pages As in the etnaviv_gem_get_pages() function, the point to the drm_device has already been cached to the 'dev' local variable. We can use it directly, While at it, using 'unsigned int' type to count the number of pages. As the drm_prime_pages_to_sg() function takes an unsigned int type for its third argument. No functional change. Signed-off-by: Sui Jingfeng [lst: Reword subject to make more generic and match patch content] Signed-off-by: Lucas Stach --- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c index be2f459c66b5d9..71a6d2b1c80f51 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c @@ -100,11 +100,10 @@ struct page **etnaviv_gem_get_pages(struct etnaviv_gem_object *etnaviv_obj) if (!etnaviv_obj->sgt) { struct drm_device *dev = etnaviv_obj->base.dev; - int npages = etnaviv_obj->base.size >> PAGE_SHIFT; + unsigned int npages = etnaviv_obj->base.size >> PAGE_SHIFT; struct sg_table *sgt; - sgt = drm_prime_pages_to_sg(etnaviv_obj->base.dev, - etnaviv_obj->pages, npages); + sgt = drm_prime_pages_to_sg(dev, etnaviv_obj->pages, npages); if (IS_ERR(sgt)) { dev_err(dev->dev, "failed to allocate sgt: %ld\n", PTR_ERR(sgt)); From 3bfb45fabb04fa30e5e0866076d1439cba6dfa41 Mon Sep 17 00:00:00 2001 From: Sui Jingfeng Date: Sat, 7 Oct 2023 15:03:12 +0800 Subject: [PATCH 141/515] drm/etnaviv: Drop the 'len' parameter of etnaviv_iommu_map() function The 'len' parameter is the 4th argument, because it is not get used, so drop it. No functional change. Signed-off-by: Sui Jingfeng Signed-off-by: Lucas Stach --- drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c index 4fa72567183a8e..1661d589bf3e7f 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c @@ -70,7 +70,7 @@ static int etnaviv_context_map(struct etnaviv_iommu_context *context, } static int etnaviv_iommu_map(struct etnaviv_iommu_context *context, u32 iova, - struct sg_table *sgt, unsigned len, int prot) + struct sg_table *sgt, int prot) { struct scatterlist *sg; unsigned int da = iova; unsigned int i; @@ -314,7 +314,7 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu_context *context, goto unlock; mapping->iova = node->start; - ret = etnaviv_iommu_map(context, node->start, sgt, etnaviv_obj->base.size, + ret = etnaviv_iommu_map(context, node->start, sgt, ETNAVIV_PROT_READ | ETNAVIV_PROT_WRITE); if (ret < 0) { From 925b10728f20c24516031060f3d01e4410c4a52a Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 7 Jun 2023 14:58:41 +0200 Subject: [PATCH 142/515] drm/etnaviv: disable MLCG and pulse eater on GPU reset Module level clock gating and the pulse eater might interfere with the GPU reset, as they both have the potential to stop the clock and thus reset propagation to parts of the GPU. Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner --- drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c index 9276756e1397d3..1dcfa23db3be44 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c @@ -513,8 +513,19 @@ static int etnaviv_hw_reset(struct etnaviv_gpu *gpu) timeout = jiffies + msecs_to_jiffies(1000); while (time_is_after_jiffies(timeout)) { - /* enable clock */ unsigned int fscale = 1 << (6 - gpu->freq_scale); + u32 pulse_eater = 0x01590880; + + /* disable clock gating */ + gpu_write_power(gpu, VIVS_PM_POWER_CONTROLS, 0x0); + + /* disable pulse eater */ + pulse_eater |= BIT(17); + gpu_write_power(gpu, VIVS_PM_PULSE_EATER, pulse_eater); + pulse_eater |= BIT(0); + gpu_write_power(gpu, VIVS_PM_PULSE_EATER, pulse_eater); + + /* enable clock */ control = VIVS_HI_CLOCK_CONTROL_FSCALE_VAL(fscale); etnaviv_gpu_load_clock(gpu, control); From fdb7bb34af8b063b5a8bb1290af4252c38d935ea Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Sun, 8 Oct 2023 16:21:00 +0200 Subject: [PATCH 143/515] dt-bindings: leds: Last color ID is now 14 (LED_COLOR_ID_LIME) Increase the limit to match available values in dt-bindings/leds/common.h Fixes: 472d7b9e8141 ("dt-bindings: leds: Expand LED_COLOR_ID definitions") Signed-off-by: Ondrej Jirman Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20231008142103.1174028-1-megi@xff.cz Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/leds/common.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/leds/common.yaml b/Documentation/devicetree/bindings/leds/common.yaml index b42950643b9d61..c8d0ba5f232764 100644 --- a/Documentation/devicetree/bindings/leds/common.yaml +++ b/Documentation/devicetree/bindings/leds/common.yaml @@ -43,7 +43,7 @@ properties: LED_COLOR_ID available, add a new one. $ref: /schemas/types.yaml#/definitions/uint32 minimum: 0 - maximum: 9 + maximum: 14 function-enumerator: description: From e2d508c7abbf0f8ff0d6467de07abf08c8fb5041 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Sun, 8 Oct 2023 16:40:13 +0200 Subject: [PATCH 144/515] leds: core: Add more colors from DT bindings to led_colors The colors are already part of DT bindings. Make sure the kernel is able to convert them to strings. Signed-off-by: Ondrej Jirman Link: https://lore.kernel.org/r/20231008144014.1180334-1-megi@xff.cz Signed-off-by: Lee Jones --- drivers/leds/led-core.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c index 04f9ea675f2cef..742595d923ee36 100644 --- a/drivers/leds/led-core.c +++ b/drivers/leds/led-core.c @@ -36,6 +36,11 @@ const char * const led_colors[LED_COLOR_ID_MAX] = { [LED_COLOR_ID_IR] = "ir", [LED_COLOR_ID_MULTI] = "multicolor", [LED_COLOR_ID_RGB] = "rgb", + [LED_COLOR_ID_PURPLE] = "purple", + [LED_COLOR_ID_ORANGE] = "orange", + [LED_COLOR_ID_PINK] = "pink", + [LED_COLOR_ID_CYAN] = "cyan", + [LED_COLOR_ID_LIME] = "lime", }; EXPORT_SYMBOL_GPL(led_colors); From 25766993d24a623c4ddcbd34a78fdc76026d9b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Apitzsch?= Date: Mon, 2 Oct 2023 18:48:27 +0200 Subject: [PATCH 145/515] dt-bindings: leds: Add Kinetic KTD2026/2027 LED MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document Kinetic KTD2026/2027 LED driver devicetree bindings. Signed-off-by: André Apitzsch Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20231002-ktd202x-v6-1-26be8eefeb88@apitzsch.eu Signed-off-by: Lee Jones --- .../bindings/leds/kinetic,ktd202x.yaml | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 Documentation/devicetree/bindings/leds/kinetic,ktd202x.yaml diff --git a/Documentation/devicetree/bindings/leds/kinetic,ktd202x.yaml b/Documentation/devicetree/bindings/leds/kinetic,ktd202x.yaml new file mode 100644 index 00000000000000..832c030a5acf27 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/kinetic,ktd202x.yaml @@ -0,0 +1,171 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/leds/kinetic,ktd202x.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Kinetic KTD2026/7 RGB/White LED Driver + +maintainers: + - André Apitzsch + +description: | + The KTD2026/7 is a RGB/White LED driver with I2C interface. + + The data sheet can be found at: + https://www.kinet-ic.com/uploads/KTD2026-7-04h.pdf + +properties: + compatible: + enum: + - kinetic,ktd2026 + - kinetic,ktd2027 + + reg: + maxItems: 1 + + vin-supply: + description: Regulator providing power to the "VIN" pin. + + vio-supply: + description: Regulator providing power for pull-up of the I/O lines. + Note that this regulator does not directly connect to KTD2026, but is + needed for the correct operation of the status ("ST") and I2C lines. + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + multi-led: + type: object + $ref: leds-class-multicolor.yaml# + unevaluatedProperties: false + + properties: + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + patternProperties: + "^led@[0-3]$": + type: object + $ref: common.yaml# + unevaluatedProperties: false + + properties: + reg: + description: Index of the LED. + minimum: 0 + maximum: 3 + + required: + - reg + - color + + required: + - "#address-cells" + - "#size-cells" + +patternProperties: + "^led@[0-3]$": + type: object + $ref: common.yaml# + unevaluatedProperties: false + + properties: + reg: + description: Index of the LED. + minimum: 0 + maximum: 3 + + required: + - reg + +required: + - compatible + - reg + - "#address-cells" + - "#size-cells" + +additionalProperties: false + +examples: + - | + #include + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + led-controller@30 { + compatible = "kinetic,ktd2026"; + reg = <0x30>; + #address-cells = <1>; + #size-cells = <0>; + + vin-supply = <&pm8916_l17>; + vio-supply = <&pm8916_l6>; + + led@0 { + reg = <0>; + function = LED_FUNCTION_STATUS; + color = ; + }; + + led@1 { + reg = <1>; + function = LED_FUNCTION_STATUS; + color = ; + }; + + led@2 { + reg = <2>; + function = LED_FUNCTION_STATUS; + color = ; + }; + }; + }; + - | + #include + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + led-controller@30 { + compatible = "kinetic,ktd2026"; + reg = <0x30>; + #address-cells = <1>; + #size-cells = <0>; + + vin-supply = <&pm8916_l17>; + vio-supply = <&pm8916_l6>; + + multi-led { + color = ; + function = LED_FUNCTION_STATUS; + + #address-cells = <1>; + #size-cells = <0>; + + led@0 { + reg = <0>; + color = ; + }; + + led@1 { + reg = <1>; + color = ; + }; + + led@2 { + reg = <2>; + color = ; + }; + }; + }; + }; From 4239b17b5de0dcd5900727be5597ba061acd00b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Apitzsch?= Date: Mon, 2 Oct 2023 18:48:28 +0200 Subject: [PATCH 146/515] leds: Add ktd202x driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds support for Kinetic KTD2026/7 RGB/White LED driver. Signed-off-by: André Apitzsch Link: https://lore.kernel.org/r/20231002-ktd202x-v6-2-26be8eefeb88@apitzsch.eu Signed-off-by: Lee Jones --- drivers/leds/rgb/Kconfig | 13 + drivers/leds/rgb/Makefile | 1 + drivers/leds/rgb/leds-ktd202x.c | 625 ++++++++++++++++++++++++++++++++ 3 files changed, 639 insertions(+) create mode 100644 drivers/leds/rgb/leds-ktd202x.c diff --git a/drivers/leds/rgb/Kconfig b/drivers/leds/rgb/Kconfig index 183bccc06cf3ec..a6a21f5646734c 100644 --- a/drivers/leds/rgb/Kconfig +++ b/drivers/leds/rgb/Kconfig @@ -14,6 +14,19 @@ config LEDS_GROUP_MULTICOLOR To compile this driver as a module, choose M here: the module will be called leds-group-multicolor. +config LEDS_KTD202X + tristate "LED support for KTD202x Chips" + depends on I2C + depends on OF + select REGMAP_I2C + help + This option enables support for the Kinetic KTD2026/KTD2027 + RGB/White LED driver found in different BQ mobile phones. + It is a 3 or 4 channel LED driver programmed via an I2C interface. + + To compile this driver as a module, choose M here: the module + will be called leds-ktd202x. + config LEDS_PWM_MULTICOLOR tristate "PWM driven multi-color LED Support" depends on PWM diff --git a/drivers/leds/rgb/Makefile b/drivers/leds/rgb/Makefile index c11cc56384e70c..243f31e4d70d48 100644 --- a/drivers/leds/rgb/Makefile +++ b/drivers/leds/rgb/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_LEDS_GROUP_MULTICOLOR) += leds-group-multicolor.o +obj-$(CONFIG_LEDS_KTD202X) += leds-ktd202x.o obj-$(CONFIG_LEDS_PWM_MULTICOLOR) += leds-pwm-multicolor.o obj-$(CONFIG_LEDS_QCOM_LPG) += leds-qcom-lpg.o obj-$(CONFIG_LEDS_MT6370_RGB) += leds-mt6370-rgb.o diff --git a/drivers/leds/rgb/leds-ktd202x.c b/drivers/leds/rgb/leds-ktd202x.c new file mode 100644 index 00000000000000..514965795a1057 --- /dev/null +++ b/drivers/leds/rgb/leds-ktd202x.c @@ -0,0 +1,625 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Kinetic KTD2026/7 RGB/White LED driver with I2C interface + * + * Copyright 2023 André Apitzsch + * + * Datasheet: https://www.kinet-ic.com/uploads/KTD2026-7-04h.pdf + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define KTD2026_NUM_LEDS 3 +#define KTD2027_NUM_LEDS 4 +#define KTD202X_MAX_LEDS 4 + +/* Register bank */ +#define KTD202X_REG_RESET_CONTROL 0x00 +#define KTD202X_REG_FLASH_PERIOD 0x01 +#define KTD202X_REG_PWM1_TIMER 0x02 +#define KTD202X_REG_PWM2_TIMER 0x03 +#define KTD202X_REG_CHANNEL_CTRL 0x04 +#define KTD202X_REG_TRISE_FALL 0x05 +#define KTD202X_REG_LED_IOUT(x) (0x06 + (x)) + +/* Register 0 */ +#define KTD202X_TIMER_SLOT_CONTROL_TSLOT1 0x00 +#define KTD202X_TIMER_SLOT_CONTROL_TSLOT2 0x01 +#define KTD202X_TIMER_SLOT_CONTROL_TSLOT3 0x02 +#define KTD202X_TIMER_SLOT_CONTROL_TSLOT4 0x03 +#define KTD202X_RSTR_RESET 0x07 + +#define KTD202X_ENABLE_CTRL_WAKE 0x00 /* SCL High & SDA High */ +#define KTD202X_ENABLE_CTRL_SLEEP 0x08 /* SCL High & SDA Toggling */ + +#define KTD202X_TRISE_FALL_SCALE_NORMAL 0x00 +#define KTD202X_TRISE_FALL_SCALE_SLOW_X2 0x20 +#define KTD202X_TRISE_FALL_SCALE_SLOW_X4 0x40 +#define KTD202X_TRISE_FALL_SCALE_FAST_X8 0x60 + +/* Register 1 */ +#define KTD202X_FLASH_PERIOD_256_MS_LOG_RAMP 0x00 + +/* Register 2-3 */ +#define KTD202X_FLASH_ON_TIME_0_4_PERCENT 0x01 + +/* Register 4 */ +#define KTD202X_CHANNEL_CTRL_MASK(x) (BIT(2 * (x)) | BIT(2 * (x) + 1)) +#define KTD202X_CHANNEL_CTRL_OFF 0x00 +#define KTD202X_CHANNEL_CTRL_ON(x) BIT(2 * (x)) +#define KTD202X_CHANNEL_CTRL_PWM1(x) BIT(2 * (x) + 1) +#define KTD202X_CHANNEL_CTRL_PWM2(x) (BIT(2 * (x)) | BIT(2 * (x) + 1)) + +/* Register 5 */ +#define KTD202X_RAMP_TIMES_2_MS 0x00 + +/* Register 6-9 */ +#define KTD202X_LED_CURRENT_10_mA 0x4f + +#define KTD202X_FLASH_PERIOD_MIN_MS 256 +#define KTD202X_FLASH_PERIOD_STEP_MS 128 +#define KTD202X_FLASH_PERIOD_MAX_STEPS 126 +#define KTD202X_FLASH_ON_MAX 256 + +#define KTD202X_MAX_BRIGHTNESS 192 + +static const struct reg_default ktd202x_reg_defaults[] = { + { KTD202X_REG_RESET_CONTROL, KTD202X_TIMER_SLOT_CONTROL_TSLOT1 | + KTD202X_ENABLE_CTRL_WAKE | KTD202X_TRISE_FALL_SCALE_NORMAL }, + { KTD202X_REG_FLASH_PERIOD, KTD202X_FLASH_PERIOD_256_MS_LOG_RAMP }, + { KTD202X_REG_PWM1_TIMER, KTD202X_FLASH_ON_TIME_0_4_PERCENT }, + { KTD202X_REG_PWM2_TIMER, KTD202X_FLASH_ON_TIME_0_4_PERCENT }, + { KTD202X_REG_CHANNEL_CTRL, KTD202X_CHANNEL_CTRL_OFF }, + { KTD202X_REG_TRISE_FALL, KTD202X_RAMP_TIMES_2_MS }, + { KTD202X_REG_LED_IOUT(0), KTD202X_LED_CURRENT_10_mA }, + { KTD202X_REG_LED_IOUT(1), KTD202X_LED_CURRENT_10_mA }, + { KTD202X_REG_LED_IOUT(2), KTD202X_LED_CURRENT_10_mA }, + { KTD202X_REG_LED_IOUT(3), KTD202X_LED_CURRENT_10_mA }, +}; + +struct ktd202x_led { + struct ktd202x *chip; + union { + struct led_classdev cdev; + struct led_classdev_mc mcdev; + }; + u32 index; +}; + +struct ktd202x { + struct mutex mutex; + struct regulator_bulk_data regulators[2]; + struct device *dev; + struct regmap *regmap; + bool enabled; + int num_leds; + struct ktd202x_led leds[] __counted_by(num_leds); +}; + +static int ktd202x_chip_disable(struct ktd202x *chip) +{ + int ret; + + if (!chip->enabled) + return 0; + + regmap_write(chip->regmap, KTD202X_REG_RESET_CONTROL, KTD202X_ENABLE_CTRL_SLEEP); + + ret = regulator_bulk_disable(ARRAY_SIZE(chip->regulators), chip->regulators); + if (ret) { + dev_err(chip->dev, "Failed to disable regulators: %d\n", ret); + return ret; + } + + chip->enabled = false; + return 0; +} + +static int ktd202x_chip_enable(struct ktd202x *chip) +{ + int ret; + + if (chip->enabled) + return 0; + + ret = regulator_bulk_enable(ARRAY_SIZE(chip->regulators), chip->regulators); + if (ret) { + dev_err(chip->dev, "Failed to enable regulators: %d\n", ret); + return ret; + } + chip->enabled = true; + + ret = regmap_write(chip->regmap, KTD202X_REG_RESET_CONTROL, KTD202X_ENABLE_CTRL_WAKE); + + if (ret) { + dev_err(chip->dev, "Failed to enable the chip: %d\n", ret); + ktd202x_chip_disable(chip); + } + + return ret; +} + +static bool ktd202x_chip_in_use(struct ktd202x *chip) +{ + int i; + + for (i = 0; i < chip->num_leds; i++) { + if (chip->leds[i].cdev.brightness) + return true; + } + + return false; +} + +static int ktd202x_brightness_set(struct ktd202x_led *led, + struct mc_subled *subleds, + unsigned int num_channels) +{ + bool mode_blink = false; + int channel; + int state; + int ret; + int i; + + if (ktd202x_chip_in_use(led->chip)) { + ret = ktd202x_chip_enable(led->chip); + if (ret) + return ret; + } + + ret = regmap_read(led->chip->regmap, KTD202X_REG_CHANNEL_CTRL, &state); + if (ret) + return ret; + + /* + * In multicolor case, assume blink mode if PWM is set for at least one + * channel because another channel cannot be in state ON at the same time + */ + for (i = 0; i < num_channels; i++) { + int channel_state; + + channel = subleds[i].channel; + channel_state = (state >> 2 * channel) & KTD202X_CHANNEL_CTRL_MASK(0); + if (channel_state == KTD202X_CHANNEL_CTRL_OFF) + continue; + mode_blink = channel_state == KTD202X_CHANNEL_CTRL_PWM1(0); + break; + } + + for (i = 0; i < num_channels; i++) { + enum led_brightness brightness; + int mode; + + brightness = subleds[i].brightness; + channel = subleds[i].channel; + + if (brightness) { + /* Register expects brightness between 0 and MAX_BRIGHTNESS - 1 */ + ret = regmap_write(led->chip->regmap, KTD202X_REG_LED_IOUT(channel), + brightness - 1); + if (ret) + return ret; + + if (mode_blink) + mode = KTD202X_CHANNEL_CTRL_PWM1(channel); + else + mode = KTD202X_CHANNEL_CTRL_ON(channel); + } else { + mode = KTD202X_CHANNEL_CTRL_OFF; + } + ret = regmap_update_bits(led->chip->regmap, KTD202X_REG_CHANNEL_CTRL, + KTD202X_CHANNEL_CTRL_MASK(channel), mode); + if (ret) + return ret; + } + + if (!ktd202x_chip_in_use(led->chip)) + return ktd202x_chip_disable(led->chip); + + return 0; +} + +static int ktd202x_brightness_single_set(struct led_classdev *cdev, + enum led_brightness value) +{ + struct ktd202x_led *led = container_of(cdev, struct ktd202x_led, cdev); + struct mc_subled info; + int ret; + + cdev->brightness = value; + + mutex_lock(&led->chip->mutex); + + info.brightness = value; + info.channel = led->index; + ret = ktd202x_brightness_set(led, &info, 1); + + mutex_unlock(&led->chip->mutex); + + return ret; +} + +static int ktd202x_brightness_mc_set(struct led_classdev *cdev, + enum led_brightness value) +{ + struct led_classdev_mc *mc = lcdev_to_mccdev(cdev); + struct ktd202x_led *led = container_of(mc, struct ktd202x_led, mcdev); + int ret; + + cdev->brightness = value; + + mutex_lock(&led->chip->mutex); + + led_mc_calc_color_components(mc, value); + ret = ktd202x_brightness_set(led, mc->subled_info, mc->num_colors); + + mutex_unlock(&led->chip->mutex); + + return ret; +} + +static int ktd202x_blink_set(struct ktd202x_led *led, unsigned long *delay_on, + unsigned long *delay_off, struct mc_subled *subleds, + unsigned int num_channels) +{ + unsigned long delay_total_ms; + int ret, num_steps, on; + u8 ctrl_mask = 0; + u8 ctrl_pwm1 = 0; + u8 ctrl_on = 0; + int i; + + mutex_lock(&led->chip->mutex); + + for (i = 0; i < num_channels; i++) { + int channel = subleds[i].channel; + + ctrl_mask |= KTD202X_CHANNEL_CTRL_MASK(channel); + ctrl_on |= KTD202X_CHANNEL_CTRL_ON(channel); + ctrl_pwm1 |= KTD202X_CHANNEL_CTRL_PWM1(channel); + } + + /* Never off - brightness is already set, disable blinking */ + if (!*delay_off) { + ret = regmap_update_bits(led->chip->regmap, KTD202X_REG_CHANNEL_CTRL, + ctrl_mask, ctrl_on); + goto out; + } + + /* Convert into values the HW will understand. */ + + /* Integer representation of time of flash period */ + num_steps = (*delay_on + *delay_off - KTD202X_FLASH_PERIOD_MIN_MS) / + KTD202X_FLASH_PERIOD_STEP_MS; + num_steps = clamp(num_steps, 0, KTD202X_FLASH_PERIOD_MAX_STEPS); + + /* Integer representation of percentage of LED ON time */ + on = (*delay_on * KTD202X_FLASH_ON_MAX) / (*delay_on + *delay_off); + + /* Actually used delay_{on,off} values */ + delay_total_ms = num_steps * KTD202X_FLASH_PERIOD_STEP_MS + KTD202X_FLASH_PERIOD_MIN_MS; + *delay_on = (delay_total_ms * on) / KTD202X_FLASH_ON_MAX; + *delay_off = delay_total_ms - *delay_on; + + /* Set timings */ + ret = regmap_write(led->chip->regmap, KTD202X_REG_FLASH_PERIOD, num_steps); + if (ret) + goto out; + + ret = regmap_write(led->chip->regmap, KTD202X_REG_PWM1_TIMER, on); + if (ret) + goto out; + + ret = regmap_update_bits(led->chip->regmap, KTD202X_REG_CHANNEL_CTRL, + ctrl_mask, ctrl_pwm1); +out: + mutex_unlock(&led->chip->mutex); + return ret; +} + +static int ktd202x_blink_single_set(struct led_classdev *cdev, + unsigned long *delay_on, + unsigned long *delay_off) +{ + struct ktd202x_led *led = container_of(cdev, struct ktd202x_led, cdev); + struct mc_subled info; + int ret; + + if (!cdev->brightness) { + ret = ktd202x_brightness_single_set(cdev, KTD202X_MAX_BRIGHTNESS); + if (ret) + return ret; + } + + /* If no blink specified, default to 1 Hz. */ + if (!*delay_off && !*delay_on) { + *delay_off = 500; + *delay_on = 500; + } + + /* Never on - just set to off */ + if (!*delay_on) + return ktd202x_brightness_single_set(cdev, LED_OFF); + + info.channel = led->index; + + return ktd202x_blink_set(led, delay_on, delay_off, &info, 1); +} + +static int ktd202x_blink_mc_set(struct led_classdev *cdev, + unsigned long *delay_on, + unsigned long *delay_off) +{ + struct led_classdev_mc *mc = lcdev_to_mccdev(cdev); + struct ktd202x_led *led = container_of(mc, struct ktd202x_led, mcdev); + int ret; + + if (!cdev->brightness) { + ret = ktd202x_brightness_mc_set(cdev, KTD202X_MAX_BRIGHTNESS); + if (ret) + return ret; + } + + /* If no blink specified, default to 1 Hz. */ + if (!*delay_off && !*delay_on) { + *delay_off = 500; + *delay_on = 500; + } + + /* Never on - just set to off */ + if (!*delay_on) + return ktd202x_brightness_mc_set(cdev, LED_OFF); + + return ktd202x_blink_set(led, delay_on, delay_off, mc->subled_info, + mc->num_colors); +} + +static int ktd202x_setup_led_rgb(struct ktd202x *chip, struct device_node *np, + struct ktd202x_led *led, struct led_init_data *init_data) +{ + struct led_classdev *cdev; + struct device_node *child; + struct mc_subled *info; + int num_channels; + int i = 0; + + num_channels = of_get_available_child_count(np); + if (!num_channels || num_channels > chip->num_leds) + return -EINVAL; + + info = devm_kcalloc(chip->dev, num_channels, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + for_each_available_child_of_node(np, child) { + u32 mono_color; + u32 reg; + int ret; + + ret = of_property_read_u32(child, "reg", ®); + if (ret != 0 || reg >= chip->num_leds) { + dev_err(chip->dev, "invalid 'reg' of %pOFn\n", child); + of_node_put(child); + return -EINVAL; + } + + ret = of_property_read_u32(child, "color", &mono_color); + if (ret < 0 && ret != -EINVAL) { + dev_err(chip->dev, "failed to parse 'color' of %pOF\n", child); + of_node_put(child); + return ret; + } + + info[i].color_index = mono_color; + info[i].channel = reg; + info[i].intensity = KTD202X_MAX_BRIGHTNESS; + i++; + } + + led->mcdev.subled_info = info; + led->mcdev.num_colors = num_channels; + + cdev = &led->mcdev.led_cdev; + cdev->brightness_set_blocking = ktd202x_brightness_mc_set; + cdev->blink_set = ktd202x_blink_mc_set; + + return devm_led_classdev_multicolor_register_ext(chip->dev, &led->mcdev, init_data); +} + +static int ktd202x_setup_led_single(struct ktd202x *chip, struct device_node *np, + struct ktd202x_led *led, struct led_init_data *init_data) +{ + struct led_classdev *cdev; + u32 reg; + int ret; + + ret = of_property_read_u32(np, "reg", ®); + if (ret != 0 || reg >= chip->num_leds) { + dev_err(chip->dev, "invalid 'reg' of %pOFn\n", np); + return -EINVAL; + } + led->index = reg; + + cdev = &led->cdev; + cdev->brightness_set_blocking = ktd202x_brightness_single_set; + cdev->blink_set = ktd202x_blink_single_set; + + return devm_led_classdev_register_ext(chip->dev, &led->cdev, init_data); +} + +static int ktd202x_add_led(struct ktd202x *chip, struct device_node *np, unsigned int index) +{ + struct ktd202x_led *led = &chip->leds[index]; + struct led_init_data init_data = {}; + struct led_classdev *cdev; + u32 color; + int ret; + + /* Color property is optional in single color case */ + ret = of_property_read_u32(np, "color", &color); + if (ret < 0 && ret != -EINVAL) { + dev_err(chip->dev, "failed to parse 'color' of %pOF\n", np); + return ret; + } + + led->chip = chip; + init_data.fwnode = of_fwnode_handle(np); + + if (color == LED_COLOR_ID_RGB) { + cdev = &led->mcdev.led_cdev; + ret = ktd202x_setup_led_rgb(chip, np, led, &init_data); + } else { + cdev = &led->cdev; + ret = ktd202x_setup_led_single(chip, np, led, &init_data); + } + + if (ret) { + dev_err(chip->dev, "unable to register %s\n", cdev->name); + return ret; + } + + cdev->max_brightness = KTD202X_MAX_BRIGHTNESS; + + return 0; +} + +static int ktd202x_probe_dt(struct ktd202x *chip) +{ + struct device_node *np = dev_of_node(chip->dev), *child; + int count; + int i = 0; + + chip->num_leds = (int)(unsigned long)of_device_get_match_data(chip->dev); + + count = of_get_available_child_count(np); + if (!count || count > chip->num_leds) + return -EINVAL; + + regmap_write(chip->regmap, KTD202X_REG_RESET_CONTROL, KTD202X_RSTR_RESET); + + /* Allow the device to execute the complete reset */ + usleep_range(200, 300); + + for_each_available_child_of_node(np, child) { + int ret = ktd202x_add_led(chip, child, i); + + if (ret) { + of_node_put(child); + return ret; + } + i++; + } + + return 0; +} + +static const struct regmap_config ktd202x_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .max_register = 0x09, + .cache_type = REGCACHE_FLAT, + .reg_defaults = ktd202x_reg_defaults, + .num_reg_defaults = ARRAY_SIZE(ktd202x_reg_defaults), +}; + +static int ktd202x_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct ktd202x *chip; + int count; + int ret; + + count = device_get_child_node_count(dev); + if (!count || count > KTD202X_MAX_LEDS) + return dev_err_probe(dev, -EINVAL, "Incorrect number of leds (%d)", count); + + chip = devm_kzalloc(dev, struct_size(chip, leds, count), GFP_KERNEL); + if (!chip) + return -ENOMEM; + + chip->dev = dev; + i2c_set_clientdata(client, chip); + + chip->regmap = devm_regmap_init_i2c(client, &ktd202x_regmap_config); + if (IS_ERR(chip->regmap)) { + ret = dev_err_probe(dev, PTR_ERR(chip->regmap), + "Failed to allocate register map.\n"); + return ret; + } + + chip->regulators[0].supply = "vin"; + chip->regulators[1].supply = "vio"; + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(chip->regulators), chip->regulators); + if (ret < 0) { + dev_err_probe(dev, ret, "Failed to request regulators.\n"); + return ret; + } + + ret = regulator_bulk_enable(ARRAY_SIZE(chip->regulators), chip->regulators); + if (ret) { + dev_err_probe(dev, ret, "Failed to enable regulators.\n"); + return ret; + } + + ret = ktd202x_probe_dt(chip); + if (ret < 0) { + regulator_bulk_disable(ARRAY_SIZE(chip->regulators), chip->regulators); + return ret; + } + + ret = regulator_bulk_disable(ARRAY_SIZE(chip->regulators), chip->regulators); + if (ret) { + dev_err_probe(dev, ret, "Failed to disable regulators.\n"); + return ret; + } + + mutex_init(&chip->mutex); + + return 0; +} + +static void ktd202x_remove(struct i2c_client *client) +{ + struct ktd202x *chip = i2c_get_clientdata(client); + + ktd202x_chip_disable(chip); + + mutex_destroy(&chip->mutex); +} + +static void ktd202x_shutdown(struct i2c_client *client) +{ + struct ktd202x *chip = i2c_get_clientdata(client); + + /* Reset registers to make sure all LEDs are off before shutdown */ + regmap_write(chip->regmap, KTD202X_REG_RESET_CONTROL, KTD202X_RSTR_RESET); +} + +static const struct of_device_id ktd202x_match_table[] = { + { .compatible = "kinetic,ktd2026", .data = (void *)KTD2026_NUM_LEDS }, + { .compatible = "kinetic,ktd2027", .data = (void *)KTD2027_NUM_LEDS }, + {}, +}; +MODULE_DEVICE_TABLE(of, ktd202x_match_table); + +static struct i2c_driver ktd202x_driver = { + .driver = { + .name = "leds-ktd202x", + .of_match_table = ktd202x_match_table, + }, + .probe = ktd202x_probe, + .remove = ktd202x_remove, + .shutdown = ktd202x_shutdown, +}; +module_i2c_driver(ktd202x_driver); + +MODULE_AUTHOR("André Apitzsch "); +MODULE_DESCRIPTION("Kinetic KTD2026/7 LED driver"); +MODULE_LICENSE("GPL"); From e0e29e434cdca9705eb420b3f26928444fa559f6 Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Sat, 7 Oct 2023 15:10:42 +0200 Subject: [PATCH 147/515] leds: trigger: netdev: Move size check in set_device_name GCC 13.2 complains about array subscript 17 is above array bounds of 'char[16]' with IFNAMSIZ set to 16. The warning is correct but this scenario is impossible. set_device_name is called by device_name_store (store sysfs entry) and netdev_trig_activate. device_name_store already check if size is >= of IFNAMSIZ and return -EINVAL. (making the warning scenario impossible) netdev_trig_activate works on already defined interface, where the name has already been checked and should already follow the condition of strlen() < IFNAMSIZ. Aside from the scenario being impossible, set_device_name can be improved to both mute the warning and make the function safer. To make it safer, move size check from device_name_store directly to set_device_name and prevent any out of bounds scenario. Cc: stable@vger.kernel.org Fixes: 28a6a2ef18ad ("leds: trigger: netdev: refactor code setting device name") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202309192035.GTJEEbem-lkp@intel.com/ Signed-off-by: Christian Marangi Link: https://lore.kernel.org/r/20231007131042.15032-1-ansuelsmth@gmail.com Signed-off-by: Lee Jones --- drivers/leds/trigger/ledtrig-netdev.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c index a2835f9fed9d52..ac10681668610b 100644 --- a/drivers/leds/trigger/ledtrig-netdev.c +++ b/drivers/leds/trigger/ledtrig-netdev.c @@ -221,6 +221,9 @@ static ssize_t device_name_show(struct device *dev, static int set_device_name(struct led_netdev_data *trigger_data, const char *name, size_t size) { + if (size >= IFNAMSIZ) + return -EINVAL; + cancel_delayed_work_sync(&trigger_data->work); mutex_lock(&trigger_data->lock); @@ -263,9 +266,6 @@ static ssize_t device_name_store(struct device *dev, struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); int ret; - if (size >= IFNAMSIZ) - return -EINVAL; - ret = set_device_name(trigger_data, buf, size); if (ret < 0) From 9a2834e91d3d1c7dc77aa3a5719a582ee5893205 Mon Sep 17 00:00:00 2001 From: Xiao Wang Date: Thu, 21 Sep 2023 22:16:52 +0800 Subject: [PATCH 148/515] riscv/mm: Fix the comment for swap pte format Swap type takes bits 7-11 and swap offset should start from bit 12. Signed-off-by: Xiao Wang Reviewed-by: David Hildenbrand Link: https://lore.kernel.org/r/20230921141652.2657054-1-xiao.w.wang@intel.com Signed-off-by: Palmer Dabbelt --- arch/riscv/include/asm/pgtable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index e05e5c8f652644..c8e8867c42f6a9 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -811,7 +811,7 @@ extern pmd_t pmdp_collapse_flush(struct vm_area_struct *vma, * bit 5: _PAGE_PROT_NONE (zero) * bit 6: exclusive marker * bits 7 to 11: swap type - * bits 11 to XLEN-1: swap offset + * bits 12 to XLEN-1: swap offset */ #define __SWP_TYPE_SHIFT 7 #define __SWP_TYPE_BITS 5 From f6f45c1c55d1ae992703e55c5b462e8e96c51865 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:07 +0200 Subject: [PATCH 149/515] block: Provide bdev_open_* functions Create struct bdev_handle that contains all parameters that need to be passed to blkdev_put() and provide bdev_open_* functions that return this structure instead of plain bdev pointer. This will eventually allow us to pass one more argument to blkdev_put() (renamed to bdev_release()) without too much hassle. Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-1-jack@suse.cz Signed-off-by: Christian Brauner --- block/bdev.c | 48 ++++++++++++++++++++++++++++++++++++++++++ include/linux/blkdev.h | 10 +++++++++ 2 files changed, 58 insertions(+) diff --git a/block/bdev.c b/block/bdev.c index f3b13aa1b7d428..bdc7d739882bb0 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -829,6 +829,25 @@ struct block_device *blkdev_get_by_dev(dev_t dev, blk_mode_t mode, void *holder, } EXPORT_SYMBOL(blkdev_get_by_dev); +struct bdev_handle *bdev_open_by_dev(dev_t dev, blk_mode_t mode, void *holder, + const struct blk_holder_ops *hops) +{ + struct bdev_handle *handle = kmalloc(sizeof(*handle), GFP_KERNEL); + struct block_device *bdev; + + if (!handle) + return ERR_PTR(-ENOMEM); + bdev = blkdev_get_by_dev(dev, mode, holder, hops); + if (IS_ERR(bdev)) { + kfree(handle); + return ERR_CAST(bdev); + } + handle->bdev = bdev; + handle->holder = holder; + return handle; +} +EXPORT_SYMBOL(bdev_open_by_dev); + /** * blkdev_get_by_path - open a block device by name * @path: path to the block device to open @@ -867,6 +886,28 @@ struct block_device *blkdev_get_by_path(const char *path, blk_mode_t mode, } EXPORT_SYMBOL(blkdev_get_by_path); +struct bdev_handle *bdev_open_by_path(const char *path, blk_mode_t mode, + void *holder, const struct blk_holder_ops *hops) +{ + struct bdev_handle *handle; + dev_t dev; + int error; + + error = lookup_bdev(path, &dev); + if (error) + return ERR_PTR(error); + + handle = bdev_open_by_dev(dev, mode, holder, hops); + if (!IS_ERR(handle) && (mode & BLK_OPEN_WRITE) && + bdev_read_only(handle->bdev)) { + bdev_release(handle); + return ERR_PTR(-EACCES); + } + + return handle; +} +EXPORT_SYMBOL(bdev_open_by_path); + void blkdev_put(struct block_device *bdev, void *holder) { struct gendisk *disk = bdev->bd_disk; @@ -903,6 +944,13 @@ void blkdev_put(struct block_device *bdev, void *holder) } EXPORT_SYMBOL(blkdev_put); +void bdev_release(struct bdev_handle *handle) +{ + blkdev_put(handle->bdev, handle->holder); + kfree(handle); +} +EXPORT_SYMBOL(bdev_release); + /** * lookup_bdev() - Look up a struct block_device by name. * @pathname: Name of the block device in the filesystem. diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index eef450f259828d..03d3adc3ff347d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1479,14 +1479,24 @@ extern const struct blk_holder_ops fs_holder_ops; #define sb_open_mode(flags) \ (BLK_OPEN_READ | (((flags) & SB_RDONLY) ? 0 : BLK_OPEN_WRITE)) +struct bdev_handle { + struct block_device *bdev; + void *holder; +}; + struct block_device *blkdev_get_by_dev(dev_t dev, blk_mode_t mode, void *holder, const struct blk_holder_ops *hops); struct block_device *blkdev_get_by_path(const char *path, blk_mode_t mode, void *holder, const struct blk_holder_ops *hops); +struct bdev_handle *bdev_open_by_dev(dev_t dev, blk_mode_t mode, void *holder, + const struct blk_holder_ops *hops); +struct bdev_handle *bdev_open_by_path(const char *path, blk_mode_t mode, + void *holder, const struct blk_holder_ops *hops); int bd_prepare_to_claim(struct block_device *bdev, void *holder, const struct blk_holder_ops *hops); void bd_abort_claiming(struct block_device *bdev, void *holder); void blkdev_put(struct block_device *bdev, void *holder); +void bdev_release(struct bdev_handle *handle); /* just for blk-cgroup, don't use elsewhere */ struct block_device *blkdev_get_no_open(dev_t dev); From 154286e9516e689d9a38a0ed6f38b276430575af Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:08 +0200 Subject: [PATCH 150/515] block: Use bdev_open_by_dev() in blkdev_open() Convert blkdev_open() to use bdev_open_by_dev(). To be able to propagate handle from blkdev_open() to blkdev_release() we need to stop using existence of file->private_data to determine exclusive block device opens. Use bdev_handle->mode for this purpose since file->f_flags isn't usable for this (O_EXCL is cleared from the flags during open). Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-2-jack@suse.cz Signed-off-by: Christian Brauner --- block/bdev.c | 3 +++ block/fops.c | 44 +++++++++++++++++++++++++++--------------- include/linux/blkdev.h | 1 + 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/block/bdev.c b/block/bdev.c index bdc7d739882bb0..4628dcb1da8a58 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -844,6 +844,9 @@ struct bdev_handle *bdev_open_by_dev(dev_t dev, blk_mode_t mode, void *holder, } handle->bdev = bdev; handle->holder = holder; + if (holder) + mode |= BLK_OPEN_EXCL; + handle->mode = mode; return handle; } EXPORT_SYMBOL(bdev_open_by_dev); diff --git a/block/fops.c b/block/fops.c index acff3d5d22d461..91e9cf2fca2445 100644 --- a/block/fops.c +++ b/block/fops.c @@ -542,15 +542,31 @@ static int blkdev_fsync(struct file *filp, loff_t start, loff_t end, return error; } +/** + * file_to_blk_mode - get block open flags from file flags + * @file: file whose open flags should be converted + * + * Look at file open flags and generate corresponding block open flags from + * them. The function works both for file just being open (e.g. during ->open + * callback) and for file that is already open. This is actually non-trivial + * (see comment in the function). + */ blk_mode_t file_to_blk_mode(struct file *file) { blk_mode_t mode = 0; + struct bdev_handle *handle = file->private_data; if (file->f_mode & FMODE_READ) mode |= BLK_OPEN_READ; if (file->f_mode & FMODE_WRITE) mode |= BLK_OPEN_WRITE; - if (file->private_data) + /* + * do_dentry_open() clears O_EXCL from f_flags, use handle->mode to + * determine whether the open was exclusive for already open files. + */ + if (handle) + mode |= handle->mode & BLK_OPEN_EXCL; + else if (file->f_flags & O_EXCL) mode |= BLK_OPEN_EXCL; if (file->f_flags & O_NDELAY) mode |= BLK_OPEN_NDELAY; @@ -568,7 +584,8 @@ blk_mode_t file_to_blk_mode(struct file *file) static int blkdev_open(struct inode *inode, struct file *filp) { - struct block_device *bdev; + struct bdev_handle *handle; + blk_mode_t mode; /* * Preserve backwards compatibility and allow large file access @@ -579,29 +596,24 @@ static int blkdev_open(struct inode *inode, struct file *filp) filp->f_flags |= O_LARGEFILE; filp->f_mode |= FMODE_BUF_RASYNC | FMODE_CAN_ODIRECT; - /* - * Use the file private data to store the holder for exclusive openes. - * file_to_blk_mode relies on it being present to set BLK_OPEN_EXCL. - */ - if (filp->f_flags & O_EXCL) - filp->private_data = filp; - - bdev = blkdev_get_by_dev(inode->i_rdev, file_to_blk_mode(filp), - filp->private_data, NULL); - if (IS_ERR(bdev)) - return PTR_ERR(bdev); + mode = file_to_blk_mode(filp); + handle = bdev_open_by_dev(inode->i_rdev, mode, + mode & BLK_OPEN_EXCL ? filp : NULL, NULL); + if (IS_ERR(handle)) + return PTR_ERR(handle); - if (bdev_nowait(bdev)) + if (bdev_nowait(handle->bdev)) filp->f_mode |= FMODE_NOWAIT; - filp->f_mapping = bdev->bd_inode->i_mapping; + filp->f_mapping = handle->bdev->bd_inode->i_mapping; filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping); + filp->private_data = handle; return 0; } static int blkdev_release(struct inode *inode, struct file *filp) { - blkdev_put(I_BDEV(filp->f_mapping->host), filp->private_data); + bdev_release(filp->private_data); return 0; } diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 03d3adc3ff347d..51fa7ffdee83b4 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1482,6 +1482,7 @@ extern const struct blk_holder_ops fs_holder_ops; struct bdev_handle { struct block_device *bdev; void *holder; + blk_mode_t mode; }; struct block_device *blkdev_get_by_dev(dev_t dev, blk_mode_t mode, void *holder, From 3551e361e25ab966cfb8bb949e82d559e83a9b8b Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:09 +0200 Subject: [PATCH 151/515] block: Use bdev_open_by_dev() in disk_scan_partitions() and blkdev_bszset() Convert disk_scan_partitions() and blkdev_bszset() to use bdev_open_by_dev(). Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-3-jack@suse.cz Signed-off-by: Christian Brauner --- block/genhd.c | 12 ++++++------ block/ioctl.c | 6 ++++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index cc32a0c704eb84..4a16a424f57d4f 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -342,7 +342,7 @@ EXPORT_SYMBOL_GPL(disk_uevent); int disk_scan_partitions(struct gendisk *disk, blk_mode_t mode) { - struct block_device *bdev; + struct bdev_handle *handle; int ret = 0; if (disk->flags & (GENHD_FL_NO_PART | GENHD_FL_HIDDEN)) @@ -366,12 +366,12 @@ int disk_scan_partitions(struct gendisk *disk, blk_mode_t mode) } set_bit(GD_NEED_PART_SCAN, &disk->state); - bdev = blkdev_get_by_dev(disk_devt(disk), mode & ~BLK_OPEN_EXCL, NULL, - NULL); - if (IS_ERR(bdev)) - ret = PTR_ERR(bdev); + handle = bdev_open_by_dev(disk_devt(disk), mode & ~BLK_OPEN_EXCL, NULL, + NULL); + if (IS_ERR(handle)) + ret = PTR_ERR(handle); else - blkdev_put(bdev, NULL); + bdev_release(handle); /* * If blkdev_get_by_dev() failed early, GD_NEED_PART_SCAN is still set, diff --git a/block/ioctl.c b/block/ioctl.c index d5f5cd61efd7fc..5d356c96435204 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -467,6 +467,7 @@ static int blkdev_bszset(struct block_device *bdev, blk_mode_t mode, int __user *argp) { int ret, n; + struct bdev_handle *handle; if (!capable(CAP_SYS_ADMIN)) return -EACCES; @@ -478,10 +479,11 @@ static int blkdev_bszset(struct block_device *bdev, blk_mode_t mode, if (mode & BLK_OPEN_EXCL) return set_blocksize(bdev, n); - if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode, &bdev, NULL))) + handle = bdev_open_by_dev(bdev->bd_dev, mode, &bdev, NULL); + if (IS_ERR(handle)) return -EBUSY; ret = set_blocksize(bdev, n); - blkdev_put(bdev, &bdev); + bdev_release(handle); return ret; } From 78808016c59bdb97529b495d62029f2bfc610cf7 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:10 +0200 Subject: [PATCH 152/515] drdb: Convert to use bdev_open_by_path() Convert drdb to use bdev_open_by_path(). CC: drbd-dev@lists.linbit.com Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-4-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/block/drbd/drbd_int.h | 2 ++ drivers/block/drbd/drbd_nl.c | 65 +++++++++++++++++------------------ 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index a30a5ed811bea8..f017e917612b95 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -524,7 +524,9 @@ struct drbd_md { struct drbd_backing_dev { struct block_device *backing_bdev; + struct bdev_handle *backing_bdev_handle; struct block_device *md_bdev; + struct bdev_handle *md_bdev_handle; struct drbd_md md; struct disk_conf *disk_conf; /* RCU, for updates: resource->conf_update */ sector_t known_size; /* last known size of that backing device */ diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index d3538bd83fb3ba..43747a1aae4353 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -82,7 +82,7 @@ static atomic_t notify_genl_seq = ATOMIC_INIT(2); /* two. */ DEFINE_MUTEX(notification_mutex); -/* used blkdev_get_by_path, to claim our meta data device(s) */ +/* used bdev_open_by_path, to claim our meta data device(s) */ static char *drbd_m_holder = "Hands off! this is DRBD's meta data device."; static void drbd_adm_send_reply(struct sk_buff *skb, struct genl_info *info) @@ -1635,43 +1635,45 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) return 0; } -static struct block_device *open_backing_dev(struct drbd_device *device, +static struct bdev_handle *open_backing_dev(struct drbd_device *device, const char *bdev_path, void *claim_ptr, bool do_bd_link) { - struct block_device *bdev; + struct bdev_handle *handle; int err = 0; - bdev = blkdev_get_by_path(bdev_path, BLK_OPEN_READ | BLK_OPEN_WRITE, - claim_ptr, NULL); - if (IS_ERR(bdev)) { + handle = bdev_open_by_path(bdev_path, BLK_OPEN_READ | BLK_OPEN_WRITE, + claim_ptr, NULL); + if (IS_ERR(handle)) { drbd_err(device, "open(\"%s\") failed with %ld\n", - bdev_path, PTR_ERR(bdev)); - return bdev; + bdev_path, PTR_ERR(handle)); + return handle; } if (!do_bd_link) - return bdev; + return handle; - err = bd_link_disk_holder(bdev, device->vdisk); + err = bd_link_disk_holder(handle->bdev, device->vdisk); if (err) { - blkdev_put(bdev, claim_ptr); + bdev_release(handle); drbd_err(device, "bd_link_disk_holder(\"%s\", ...) failed with %d\n", bdev_path, err); - bdev = ERR_PTR(err); + handle = ERR_PTR(err); } - return bdev; + return handle; } static int open_backing_devices(struct drbd_device *device, struct disk_conf *new_disk_conf, struct drbd_backing_dev *nbc) { - struct block_device *bdev; + struct bdev_handle *handle; - bdev = open_backing_dev(device, new_disk_conf->backing_dev, device, true); - if (IS_ERR(bdev)) + handle = open_backing_dev(device, new_disk_conf->backing_dev, device, + true); + if (IS_ERR(handle)) return ERR_OPEN_DISK; - nbc->backing_bdev = bdev; + nbc->backing_bdev = handle->bdev; + nbc->backing_bdev_handle = handle; /* * meta_dev_idx >= 0: external fixed size, possibly multiple @@ -1681,7 +1683,7 @@ static int open_backing_devices(struct drbd_device *device, * should check it for you already; but if you don't, or * someone fooled it, we need to double check here) */ - bdev = open_backing_dev(device, new_disk_conf->meta_dev, + handle = open_backing_dev(device, new_disk_conf->meta_dev, /* claim ptr: device, if claimed exclusively; shared drbd_m_holder, * if potentially shared with other drbd minors */ (new_disk_conf->meta_dev_idx < 0) ? (void*)device : (void*)drbd_m_holder, @@ -1689,20 +1691,21 @@ static int open_backing_devices(struct drbd_device *device, * as would happen with internal metadata. */ (new_disk_conf->meta_dev_idx != DRBD_MD_INDEX_FLEX_INT && new_disk_conf->meta_dev_idx != DRBD_MD_INDEX_INTERNAL)); - if (IS_ERR(bdev)) + if (IS_ERR(handle)) return ERR_OPEN_MD_DISK; - nbc->md_bdev = bdev; + nbc->md_bdev = handle->bdev; + nbc->md_bdev_handle = handle; return NO_ERROR; } -static void close_backing_dev(struct drbd_device *device, struct block_device *bdev, - void *claim_ptr, bool do_bd_unlink) +static void close_backing_dev(struct drbd_device *device, + struct bdev_handle *handle, bool do_bd_unlink) { - if (!bdev) + if (!handle) return; if (do_bd_unlink) - bd_unlink_disk_holder(bdev, device->vdisk); - blkdev_put(bdev, claim_ptr); + bd_unlink_disk_holder(handle->bdev, device->vdisk); + bdev_release(handle); } void drbd_backing_dev_free(struct drbd_device *device, struct drbd_backing_dev *ldev) @@ -1710,11 +1713,9 @@ void drbd_backing_dev_free(struct drbd_device *device, struct drbd_backing_dev * if (ldev == NULL) return; - close_backing_dev(device, ldev->md_bdev, - ldev->md.meta_dev_idx < 0 ? - (void *)device : (void *)drbd_m_holder, + close_backing_dev(device, ldev->md_bdev_handle, ldev->md_bdev != ldev->backing_bdev); - close_backing_dev(device, ldev->backing_bdev, device, true); + close_backing_dev(device, ldev->backing_bdev_handle, true); kfree(ldev->disk_conf); kfree(ldev); @@ -2130,11 +2131,9 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) fail: conn_reconfig_done(connection); if (nbc) { - close_backing_dev(device, nbc->md_bdev, - nbc->disk_conf->meta_dev_idx < 0 ? - (void *)device : (void *)drbd_m_holder, + close_backing_dev(device, nbc->md_bdev_handle, nbc->md_bdev != nbc->backing_bdev); - close_backing_dev(device, nbc->backing_bdev, device, true); + close_backing_dev(device, nbc->backing_bdev_handle, true); kfree(nbc); } kfree(new_disk_conf); From de6361b3d6cecf182b97455d1419e4a9f6ba0269 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:11 +0200 Subject: [PATCH 153/515] pktcdvd: Convert to bdev_open_by_dev() Convert pktcdvd to use bdev_open_by_dev(). Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-5-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/block/pktcdvd.c | 76 ++++++++++++++++++++++------------------- include/linux/pktcdvd.h | 4 ++- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index a1428538bda506..d56d972aadb36f 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -340,8 +340,8 @@ static ssize_t device_map_show(const struct class *c, const struct class_attribu n += sysfs_emit_at(data, n, "%s %u:%u %u:%u\n", pd->disk->disk_name, MAJOR(pd->pkt_dev), MINOR(pd->pkt_dev), - MAJOR(pd->bdev->bd_dev), - MINOR(pd->bdev->bd_dev)); + MAJOR(pd->bdev_handle->bdev->bd_dev), + MINOR(pd->bdev_handle->bdev->bd_dev)); } mutex_unlock(&ctl_mutex); return n; @@ -437,7 +437,8 @@ static int pkt_seq_show(struct seq_file *m, void *p) char *msg; int states[PACKET_NUM_STATES]; - seq_printf(m, "Writer %s mapped to %pg:\n", pd->disk->disk_name, pd->bdev); + seq_printf(m, "Writer %s mapped to %pg:\n", pd->disk->disk_name, + pd->bdev_handle->bdev); seq_printf(m, "\nSettings:\n"); seq_printf(m, "\tpacket size:\t\t%dkB\n", pd->settings.size / 2); @@ -714,7 +715,7 @@ static void pkt_rbtree_insert(struct pktcdvd_device *pd, struct pkt_rb_node *nod */ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc) { - struct request_queue *q = bdev_get_queue(pd->bdev); + struct request_queue *q = bdev_get_queue(pd->bdev_handle->bdev); struct scsi_cmnd *scmd; struct request *rq; int ret = 0; @@ -1047,7 +1048,8 @@ static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt) continue; bio = pkt->r_bios[f]; - bio_init(bio, pd->bdev, bio->bi_inline_vecs, 1, REQ_OP_READ); + bio_init(bio, pd->bdev_handle->bdev, bio->bi_inline_vecs, 1, + REQ_OP_READ); bio->bi_iter.bi_sector = pkt->sector + f * (CD_FRAMESIZE >> 9); bio->bi_end_io = pkt_end_io_read; bio->bi_private = pkt; @@ -1262,8 +1264,8 @@ static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt) struct device *ddev = disk_to_dev(pd->disk); int f; - bio_init(pkt->w_bio, pd->bdev, pkt->w_bio->bi_inline_vecs, pkt->frames, - REQ_OP_WRITE); + bio_init(pkt->w_bio, pd->bdev_handle->bdev, pkt->w_bio->bi_inline_vecs, + pkt->frames, REQ_OP_WRITE); pkt->w_bio->bi_iter.bi_sector = pkt->sector; pkt->w_bio->bi_end_io = pkt_end_io_packet_write; pkt->w_bio->bi_private = pkt; @@ -2160,18 +2162,20 @@ static int pkt_open_dev(struct pktcdvd_device *pd, bool write) int ret; long lba; struct request_queue *q; - struct block_device *bdev; + struct bdev_handle *bdev_handle; /* * We need to re-open the cdrom device without O_NONBLOCK to be able * to read/write from/to it. It is already opened in O_NONBLOCK mode * so open should not fail. */ - bdev = blkdev_get_by_dev(pd->bdev->bd_dev, BLK_OPEN_READ, pd, NULL); - if (IS_ERR(bdev)) { - ret = PTR_ERR(bdev); + bdev_handle = bdev_open_by_dev(pd->bdev_handle->bdev->bd_dev, + BLK_OPEN_READ, pd, NULL); + if (IS_ERR(bdev_handle)) { + ret = PTR_ERR(bdev_handle); goto out; } + pd->open_bdev_handle = bdev_handle; ret = pkt_get_last_written(pd, &lba); if (ret) { @@ -2180,9 +2184,9 @@ static int pkt_open_dev(struct pktcdvd_device *pd, bool write) } set_capacity(pd->disk, lba << 2); - set_capacity_and_notify(pd->bdev->bd_disk, lba << 2); + set_capacity_and_notify(pd->bdev_handle->bdev->bd_disk, lba << 2); - q = bdev_get_queue(pd->bdev); + q = bdev_get_queue(pd->bdev_handle->bdev); if (write) { ret = pkt_open_write(pd); if (ret) @@ -2214,7 +2218,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, bool write) return 0; out_putdev: - blkdev_put(bdev, pd); + bdev_release(bdev_handle); out: return ret; } @@ -2233,7 +2237,8 @@ static void pkt_release_dev(struct pktcdvd_device *pd, int flush) pkt_lock_door(pd, 0); pkt_set_speed(pd, MAX_SPEED, MAX_SPEED); - blkdev_put(pd->bdev, pd); + bdev_release(pd->open_bdev_handle); + pd->open_bdev_handle = NULL; pkt_shrink_pktlist(pd); } @@ -2321,8 +2326,8 @@ static void pkt_end_io_read_cloned(struct bio *bio) static void pkt_make_request_read(struct pktcdvd_device *pd, struct bio *bio) { - struct bio *cloned_bio = - bio_alloc_clone(pd->bdev, bio, GFP_NOIO, &pkt_bio_set); + struct bio *cloned_bio = bio_alloc_clone(pd->bdev_handle->bdev, bio, + GFP_NOIO, &pkt_bio_set); struct packet_stacked_data *psd = mempool_alloc(&psd_pool, GFP_NOIO); psd->pd = pd; @@ -2492,7 +2497,7 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) { struct device *ddev = disk_to_dev(pd->disk); int i; - struct block_device *bdev; + struct bdev_handle *bdev_handle; struct scsi_device *sdev; if (pd->pkt_dev == dev) { @@ -2503,8 +2508,9 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) struct pktcdvd_device *pd2 = pkt_devs[i]; if (!pd2) continue; - if (pd2->bdev->bd_dev == dev) { - dev_err(ddev, "%pg already setup\n", pd2->bdev); + if (pd2->bdev_handle->bdev->bd_dev == dev) { + dev_err(ddev, "%pg already setup\n", + pd2->bdev_handle->bdev); return -EBUSY; } if (pd2->pkt_dev == dev) { @@ -2513,13 +2519,13 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) } } - bdev = blkdev_get_by_dev(dev, BLK_OPEN_READ | BLK_OPEN_NDELAY, NULL, - NULL); - if (IS_ERR(bdev)) - return PTR_ERR(bdev); - sdev = scsi_device_from_queue(bdev->bd_disk->queue); + bdev_handle = bdev_open_by_dev(dev, BLK_OPEN_READ | BLK_OPEN_NDELAY, + NULL, NULL); + if (IS_ERR(bdev_handle)) + return PTR_ERR(bdev_handle); + sdev = scsi_device_from_queue(bdev_handle->bdev->bd_disk->queue); if (!sdev) { - blkdev_put(bdev, NULL); + bdev_release(bdev_handle); return -EINVAL; } put_device(&sdev->sdev_gendev); @@ -2527,8 +2533,8 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) /* This is safe, since we have a reference from open(). */ __module_get(THIS_MODULE); - pd->bdev = bdev; - set_blocksize(bdev, CD_FRAMESIZE); + pd->bdev_handle = bdev_handle; + set_blocksize(bdev_handle->bdev, CD_FRAMESIZE); pkt_init_queue(pd); @@ -2540,11 +2546,11 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) } proc_create_single_data(pd->disk->disk_name, 0, pkt_proc, pkt_seq_show, pd); - dev_notice(ddev, "writer mapped to %pg\n", bdev); + dev_notice(ddev, "writer mapped to %pg\n", bdev_handle->bdev); return 0; out_mem: - blkdev_put(bdev, NULL); + bdev_release(bdev_handle); /* This is safe: open() is still holding a reference. */ module_put(THIS_MODULE); return -ENOMEM; @@ -2599,9 +2605,9 @@ static unsigned int pkt_check_events(struct gendisk *disk, if (!pd) return 0; - if (!pd->bdev) + if (!pd->bdev_handle) return 0; - attached_disk = pd->bdev->bd_disk; + attached_disk = pd->bdev_handle->bdev->bd_disk; if (!attached_disk || !attached_disk->fops->check_events) return 0; return attached_disk->fops->check_events(attached_disk, clearing); @@ -2686,7 +2692,7 @@ static int pkt_setup_dev(dev_t dev, dev_t* pkt_dev) goto out_mem2; /* inherit events of the host device */ - disk->events = pd->bdev->bd_disk->events; + disk->events = pd->bdev_handle->bdev->bd_disk->events; ret = add_disk(disk); if (ret) @@ -2751,7 +2757,7 @@ static int pkt_remove_dev(dev_t pkt_dev) pkt_debugfs_dev_remove(pd); pkt_sysfs_dev_remove(pd); - blkdev_put(pd->bdev, NULL); + bdev_release(pd->bdev_handle); remove_proc_entry(pd->disk->disk_name, pkt_proc); dev_notice(ddev, "writer unmapped\n"); @@ -2778,7 +2784,7 @@ static void pkt_get_status(struct pkt_ctrl_command *ctrl_cmd) pd = pkt_find_dev_from_minor(ctrl_cmd->dev_index); if (pd) { - ctrl_cmd->dev = new_encode_dev(pd->bdev->bd_dev); + ctrl_cmd->dev = new_encode_dev(pd->bdev_handle->bdev->bd_dev); ctrl_cmd->pkt_dev = new_encode_dev(pd->pkt_dev); } else { ctrl_cmd->dev = 0; diff --git a/include/linux/pktcdvd.h b/include/linux/pktcdvd.h index 80cb00db42a4fb..79594aeb160daf 100644 --- a/include/linux/pktcdvd.h +++ b/include/linux/pktcdvd.h @@ -154,7 +154,9 @@ struct packet_stacked_data struct pktcdvd_device { - struct block_device *bdev; /* dev attached */ + struct bdev_handle *bdev_handle; /* dev attached */ + /* handle acquired for bdev during pkt_open_dev() */ + struct bdev_handle *open_bdev_handle; dev_t pkt_dev; /* our dev */ struct packet_settings settings; struct packet_stats stats; From 89e6730268b6bdd357489488861c69859166f1c3 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:12 +0200 Subject: [PATCH 154/515] rnbd-srv: Convert to use bdev_open_by_path() Convert rnbd-srv to use bdev_open_by_path() and pass the handle around. CC: Jack Wang CC: "Md. Haris Iqbal" Acked-by: "Md. Haris Iqbal" Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-6-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/block/rnbd/rnbd-srv.c | 27 ++++++++++++++------------- drivers/block/rnbd/rnbd-srv.h | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c index c186df0ec641c8..65de51f3dfd9a6 100644 --- a/drivers/block/rnbd/rnbd-srv.c +++ b/drivers/block/rnbd/rnbd-srv.c @@ -145,7 +145,7 @@ static int process_rdma(struct rnbd_srv_session *srv_sess, priv->sess_dev = sess_dev; priv->id = id; - bio = bio_alloc(sess_dev->bdev, 1, + bio = bio_alloc(sess_dev->bdev_handle->bdev, 1, rnbd_to_bio_flags(le32_to_cpu(msg->rw)), GFP_KERNEL); if (bio_add_page(bio, virt_to_page(data), datalen, offset_in_page(data)) != datalen) { @@ -219,7 +219,7 @@ void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev, bool keep_id) rnbd_put_sess_dev(sess_dev); wait_for_completion(&dc); /* wait for inflights to drop to zero */ - blkdev_put(sess_dev->bdev, NULL); + bdev_release(sess_dev->bdev_handle); mutex_lock(&sess_dev->dev->lock); list_del(&sess_dev->dev_list); if (!sess_dev->readonly) @@ -534,7 +534,7 @@ rnbd_srv_get_or_create_srv_dev(struct block_device *bdev, static void rnbd_srv_fill_msg_open_rsp(struct rnbd_msg_open_rsp *rsp, struct rnbd_srv_sess_dev *sess_dev) { - struct block_device *bdev = sess_dev->bdev; + struct block_device *bdev = sess_dev->bdev_handle->bdev; rsp->hdr.type = cpu_to_le16(RNBD_MSG_OPEN_RSP); rsp->device_id = cpu_to_le32(sess_dev->device_id); @@ -559,7 +559,7 @@ static void rnbd_srv_fill_msg_open_rsp(struct rnbd_msg_open_rsp *rsp, static struct rnbd_srv_sess_dev * rnbd_srv_create_set_sess_dev(struct rnbd_srv_session *srv_sess, const struct rnbd_msg_open *open_msg, - struct block_device *bdev, bool readonly, + struct bdev_handle *handle, bool readonly, struct rnbd_srv_dev *srv_dev) { struct rnbd_srv_sess_dev *sdev = rnbd_sess_dev_alloc(srv_sess); @@ -571,7 +571,7 @@ rnbd_srv_create_set_sess_dev(struct rnbd_srv_session *srv_sess, strscpy(sdev->pathname, open_msg->dev_name, sizeof(sdev->pathname)); - sdev->bdev = bdev; + sdev->bdev_handle = handle; sdev->sess = srv_sess; sdev->dev = srv_dev; sdev->readonly = readonly; @@ -676,7 +676,7 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess, struct rnbd_srv_dev *srv_dev; struct rnbd_srv_sess_dev *srv_sess_dev; const struct rnbd_msg_open *open_msg = msg; - struct block_device *bdev; + struct bdev_handle *bdev_handle; blk_mode_t open_flags = BLK_OPEN_READ; char *full_path; struct rnbd_msg_open_rsp *rsp = data; @@ -714,15 +714,15 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess, goto reject; } - bdev = blkdev_get_by_path(full_path, open_flags, NULL, NULL); - if (IS_ERR(bdev)) { - ret = PTR_ERR(bdev); + bdev_handle = bdev_open_by_path(full_path, open_flags, NULL, NULL); + if (IS_ERR(bdev_handle)) { + ret = PTR_ERR(bdev_handle); pr_err("Opening device '%s' on session %s failed, failed to open the block device, err: %d\n", full_path, srv_sess->sessname, ret); goto free_path; } - srv_dev = rnbd_srv_get_or_create_srv_dev(bdev, srv_sess, + srv_dev = rnbd_srv_get_or_create_srv_dev(bdev_handle->bdev, srv_sess, open_msg->access_mode); if (IS_ERR(srv_dev)) { pr_err("Opening device '%s' on session %s failed, creating srv_dev failed, err: %ld\n", @@ -731,7 +731,8 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess, goto blkdev_put; } - srv_sess_dev = rnbd_srv_create_set_sess_dev(srv_sess, open_msg, bdev, + srv_sess_dev = rnbd_srv_create_set_sess_dev(srv_sess, open_msg, + bdev_handle, open_msg->access_mode == RNBD_ACCESS_RO, srv_dev); if (IS_ERR(srv_sess_dev)) { @@ -747,7 +748,7 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess, */ mutex_lock(&srv_dev->lock); if (!srv_dev->dev_kobj.state_in_sysfs) { - ret = rnbd_srv_create_dev_sysfs(srv_dev, bdev); + ret = rnbd_srv_create_dev_sysfs(srv_dev, bdev_handle->bdev); if (ret) { mutex_unlock(&srv_dev->lock); rnbd_srv_err(srv_sess_dev, @@ -790,7 +791,7 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess, } rnbd_put_srv_dev(srv_dev); blkdev_put: - blkdev_put(bdev, NULL); + bdev_release(bdev_handle); free_path: kfree(full_path); reject: diff --git a/drivers/block/rnbd/rnbd-srv.h b/drivers/block/rnbd/rnbd-srv.h index 1027656dedb0a3..343cc682b617b4 100644 --- a/drivers/block/rnbd/rnbd-srv.h +++ b/drivers/block/rnbd/rnbd-srv.h @@ -46,7 +46,7 @@ struct rnbd_srv_dev { struct rnbd_srv_sess_dev { /* Entry inside rnbd_srv_dev struct */ struct list_head dev_list; - struct block_device *bdev; + struct bdev_handle *bdev_handle; struct rnbd_srv_session *sess; struct rnbd_srv_dev *dev; struct kobject kobj; From 737ea70777d20c4728f586b39d5e8f0418fa45eb Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:13 +0200 Subject: [PATCH 155/515] xen/blkback: Convert to bdev_open_by_dev() Convert xen/blkback to use bdev_open_by_dev() and pass the handle around. CC: xen-devel@lists.xenproject.org Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-7-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/block/xen-blkback/blkback.c | 4 +-- drivers/block/xen-blkback/common.h | 4 +-- drivers/block/xen-blkback/xenbus.c | 40 +++++++++++++++-------------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index c362f4ad80ab07..4defd7f387c786 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -465,7 +465,7 @@ static int xen_vbd_translate(struct phys_req *req, struct xen_blkif *blkif, } req->dev = vbd->pdevice; - req->bdev = vbd->bdev; + req->bdev = vbd->bdev_handle->bdev; rc = 0; out: @@ -969,7 +969,7 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, int err = 0; int status = BLKIF_RSP_OKAY; struct xen_blkif *blkif = ring->blkif; - struct block_device *bdev = blkif->vbd.bdev; + struct block_device *bdev = blkif->vbd.bdev_handle->bdev; struct phys_req preq; xen_blkif_get(blkif); diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h index 40f67bfc052deb..5ff50e76cee573 100644 --- a/drivers/block/xen-blkback/common.h +++ b/drivers/block/xen-blkback/common.h @@ -221,7 +221,7 @@ struct xen_vbd { unsigned char type; /* phys device that this vbd maps to. */ u32 pdevice; - struct block_device *bdev; + struct bdev_handle *bdev_handle; /* Cached size parameter. */ sector_t size; unsigned int flush_support:1; @@ -360,7 +360,7 @@ struct pending_req { }; -#define vbd_sz(_v) bdev_nr_sectors((_v)->bdev) +#define vbd_sz(_v) bdev_nr_sectors((_v)->bdev_handle->bdev) #define xen_blkif_get(_b) (atomic_inc(&(_b)->refcnt)) #define xen_blkif_put(_b) \ diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index bb66178c432b0d..e34219ea2b058c 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -81,7 +81,7 @@ static void xen_update_blkif_status(struct xen_blkif *blkif) int i; /* Not ready to connect? */ - if (!blkif->rings || !blkif->rings[0].irq || !blkif->vbd.bdev) + if (!blkif->rings || !blkif->rings[0].irq || !blkif->vbd.bdev_handle) return; /* Already connected? */ @@ -99,12 +99,13 @@ static void xen_update_blkif_status(struct xen_blkif *blkif) return; } - err = sync_blockdev(blkif->vbd.bdev); + err = sync_blockdev(blkif->vbd.bdev_handle->bdev); if (err) { xenbus_dev_error(blkif->be->dev, err, "block flush"); return; } - invalidate_inode_pages2(blkif->vbd.bdev->bd_inode->i_mapping); + invalidate_inode_pages2( + blkif->vbd.bdev_handle->bdev->bd_inode->i_mapping); for (i = 0; i < blkif->nr_rings; i++) { ring = &blkif->rings[i]; @@ -472,9 +473,9 @@ static void xenvbd_sysfs_delif(struct xenbus_device *dev) static void xen_vbd_free(struct xen_vbd *vbd) { - if (vbd->bdev) - blkdev_put(vbd->bdev, NULL); - vbd->bdev = NULL; + if (vbd->bdev_handle) + bdev_release(vbd->bdev_handle); + vbd->bdev_handle = NULL; } static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, @@ -482,7 +483,7 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, int cdrom) { struct xen_vbd *vbd; - struct block_device *bdev; + struct bdev_handle *bdev_handle; vbd = &blkif->vbd; vbd->handle = handle; @@ -491,17 +492,17 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, vbd->pdevice = MKDEV(major, minor); - bdev = blkdev_get_by_dev(vbd->pdevice, vbd->readonly ? + bdev_handle = bdev_open_by_dev(vbd->pdevice, vbd->readonly ? BLK_OPEN_READ : BLK_OPEN_WRITE, NULL, NULL); - if (IS_ERR(bdev)) { + if (IS_ERR(bdev_handle)) { pr_warn("xen_vbd_create: device %08x could not be opened\n", vbd->pdevice); return -ENOENT; } - vbd->bdev = bdev; - if (vbd->bdev->bd_disk == NULL) { + vbd->bdev_handle = bdev_handle; + if (vbd->bdev_handle->bdev->bd_disk == NULL) { pr_warn("xen_vbd_create: device %08x doesn't exist\n", vbd->pdevice); xen_vbd_free(vbd); @@ -509,14 +510,14 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, } vbd->size = vbd_sz(vbd); - if (cdrom || disk_to_cdi(vbd->bdev->bd_disk)) + if (cdrom || disk_to_cdi(vbd->bdev_handle->bdev->bd_disk)) vbd->type |= VDISK_CDROM; - if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE) + if (vbd->bdev_handle->bdev->bd_disk->flags & GENHD_FL_REMOVABLE) vbd->type |= VDISK_REMOVABLE; - if (bdev_write_cache(bdev)) + if (bdev_write_cache(bdev_handle->bdev)) vbd->flush_support = true; - if (bdev_max_secure_erase_sectors(bdev)) + if (bdev_max_secure_erase_sectors(bdev_handle->bdev)) vbd->discard_secure = true; pr_debug("Successful creation of handle=%04x (dom=%u)\n", @@ -569,7 +570,7 @@ static void xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info struct xen_blkif *blkif = be->blkif; int err; int state = 0; - struct block_device *bdev = be->blkif->vbd.bdev; + struct block_device *bdev = be->blkif->vbd.bdev_handle->bdev; if (!xenbus_read_unsigned(dev->nodename, "discard-enable", 1)) return; @@ -930,15 +931,16 @@ static void connect(struct backend_info *be) goto abort; } err = xenbus_printf(xbt, dev->nodename, "sector-size", "%lu", - (unsigned long) - bdev_logical_block_size(be->blkif->vbd.bdev)); + (unsigned long)bdev_logical_block_size( + be->blkif->vbd.bdev_handle->bdev)); if (err) { xenbus_dev_fatal(dev, err, "writing %s/sector-size", dev->nodename); goto abort; } err = xenbus_printf(xbt, dev->nodename, "physical-sector-size", "%u", - bdev_physical_block_size(be->blkif->vbd.bdev)); + bdev_physical_block_size( + be->blkif->vbd.bdev_handle->bdev)); if (err) xenbus_dev_error(dev, err, "writing %s/physical-sector-size", dev->nodename); From 212b0514d55f56ddcb026d04584aa87ef2a23ba5 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:14 +0200 Subject: [PATCH 156/515] zram: Convert to use bdev_open_by_dev() Convert zram to use bdev_open_by_dev() and pass the handle around. CC: Minchan Kim CC: Sergey Senozhatsky Acked-by: Christoph Hellwig Acked-by: Christian Brauner Reviewed-by: Sergey Senozhatsky Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-8-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/block/zram/zram_drv.c | 31 ++++++++++++++----------------- drivers/block/zram/zram_drv.h | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 06673c6ca25555..d77d3664ca0805 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -414,17 +414,14 @@ static ssize_t writeback_limit_show(struct device *dev, static void reset_bdev(struct zram *zram) { - struct block_device *bdev; - if (!zram->backing_dev) return; - bdev = zram->bdev; - blkdev_put(bdev, zram); + bdev_release(zram->bdev_handle); /* hope filp_close flush all of IO */ filp_close(zram->backing_dev, NULL); zram->backing_dev = NULL; - zram->bdev = NULL; + zram->bdev_handle = NULL; zram->disk->fops = &zram_devops; kvfree(zram->bitmap); zram->bitmap = NULL; @@ -470,7 +467,7 @@ static ssize_t backing_dev_store(struct device *dev, struct address_space *mapping; unsigned int bitmap_sz; unsigned long nr_pages, *bitmap = NULL; - struct block_device *bdev = NULL; + struct bdev_handle *bdev_handle = NULL; int err; struct zram *zram = dev_to_zram(dev); @@ -507,11 +504,11 @@ static ssize_t backing_dev_store(struct device *dev, goto out; } - bdev = blkdev_get_by_dev(inode->i_rdev, BLK_OPEN_READ | BLK_OPEN_WRITE, - zram, NULL); - if (IS_ERR(bdev)) { - err = PTR_ERR(bdev); - bdev = NULL; + bdev_handle = bdev_open_by_dev(inode->i_rdev, + BLK_OPEN_READ | BLK_OPEN_WRITE, zram, NULL); + if (IS_ERR(bdev_handle)) { + err = PTR_ERR(bdev_handle); + bdev_handle = NULL; goto out; } @@ -525,7 +522,7 @@ static ssize_t backing_dev_store(struct device *dev, reset_bdev(zram); - zram->bdev = bdev; + zram->bdev_handle = bdev_handle; zram->backing_dev = backing_dev; zram->bitmap = bitmap; zram->nr_pages = nr_pages; @@ -538,8 +535,8 @@ static ssize_t backing_dev_store(struct device *dev, out: kvfree(bitmap); - if (bdev) - blkdev_put(bdev, zram); + if (bdev_handle) + bdev_release(bdev_handle); if (backing_dev) filp_close(backing_dev, NULL); @@ -581,7 +578,7 @@ static void read_from_bdev_async(struct zram *zram, struct page *page, { struct bio *bio; - bio = bio_alloc(zram->bdev, 1, parent->bi_opf, GFP_NOIO); + bio = bio_alloc(zram->bdev_handle->bdev, 1, parent->bi_opf, GFP_NOIO); bio->bi_iter.bi_sector = entry * (PAGE_SIZE >> 9); __bio_add_page(bio, page, PAGE_SIZE, 0); bio_chain(bio, parent); @@ -697,7 +694,7 @@ static ssize_t writeback_store(struct device *dev, continue; } - bio_init(&bio, zram->bdev, &bio_vec, 1, + bio_init(&bio, zram->bdev_handle->bdev, &bio_vec, 1, REQ_OP_WRITE | REQ_SYNC); bio.bi_iter.bi_sector = blk_idx * (PAGE_SIZE >> 9); __bio_add_page(&bio, page, PAGE_SIZE, 0); @@ -779,7 +776,7 @@ static void zram_sync_read(struct work_struct *work) struct bio_vec bv; struct bio bio; - bio_init(&bio, zw->zram->bdev, &bv, 1, REQ_OP_READ); + bio_init(&bio, zw->zram->bdev_handle->bdev, &bv, 1, REQ_OP_READ); bio.bi_iter.bi_sector = zw->entry * (PAGE_SIZE >> 9); __bio_add_page(&bio, zw->page, PAGE_SIZE, 0); zw->error = submit_bio_wait(&bio); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index ca7a15bd48456a..d090753f97bec4 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -132,7 +132,7 @@ struct zram { spinlock_t wb_limit_lock; bool wb_limit_enable; u64 bd_wb_limit; - struct block_device *bdev; + struct bdev_handle *bdev_handle; unsigned long *bitmap; unsigned long nr_pages; #endif From d5550fe9e6c94b24ef4bca010c7f3bcece64dbaa Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:15 +0200 Subject: [PATCH 157/515] bcache: Convert to bdev_open_by_path() Convert bcache to use bdev_open_by_path() and pass the handle around. CC: linux-bcache@vger.kernel.org CC: Coly Li CC: Kent Overstreet Acked-by: Christoph Hellwig Acked-by: Christian Brauner Acked-by: Coly Li Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-9-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/md/bcache/bcache.h | 2 + drivers/md/bcache/super.c | 78 ++++++++++++++++++++------------------ 2 files changed, 43 insertions(+), 37 deletions(-) diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 5a79bb3c272f1b..2aa3f2c1f7192d 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -299,6 +299,7 @@ struct cached_dev { struct list_head list; struct bcache_device disk; struct block_device *bdev; + struct bdev_handle *bdev_handle; struct cache_sb sb; struct cache_sb_disk *sb_disk; @@ -421,6 +422,7 @@ struct cache { struct kobject kobj; struct block_device *bdev; + struct bdev_handle *bdev_handle; struct task_struct *alloc_thread; diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 0ae2b367629307..c11ac86be72b05 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -1368,8 +1368,8 @@ static void cached_dev_free(struct closure *cl) if (dc->sb_disk) put_page(virt_to_page(dc->sb_disk)); - if (!IS_ERR_OR_NULL(dc->bdev)) - blkdev_put(dc->bdev, dc); + if (dc->bdev_handle) + bdev_release(dc->bdev_handle); wake_up(&unregister_wait); @@ -1444,7 +1444,7 @@ static int cached_dev_init(struct cached_dev *dc, unsigned int block_size) /* Cached device - bcache superblock */ static int register_bdev(struct cache_sb *sb, struct cache_sb_disk *sb_disk, - struct block_device *bdev, + struct bdev_handle *bdev_handle, struct cached_dev *dc) { const char *err = "cannot allocate memory"; @@ -1452,14 +1452,15 @@ static int register_bdev(struct cache_sb *sb, struct cache_sb_disk *sb_disk, int ret = -ENOMEM; memcpy(&dc->sb, sb, sizeof(struct cache_sb)); - dc->bdev = bdev; + dc->bdev_handle = bdev_handle; + dc->bdev = bdev_handle->bdev; dc->sb_disk = sb_disk; if (cached_dev_init(dc, sb->block_size << 9)) goto err; err = "error creating kobject"; - if (kobject_add(&dc->disk.kobj, bdev_kobj(bdev), "bcache")) + if (kobject_add(&dc->disk.kobj, bdev_kobj(dc->bdev), "bcache")) goto err; if (bch_cache_accounting_add_kobjs(&dc->accounting, &dc->disk.kobj)) goto err; @@ -2216,8 +2217,8 @@ void bch_cache_release(struct kobject *kobj) if (ca->sb_disk) put_page(virt_to_page(ca->sb_disk)); - if (!IS_ERR_OR_NULL(ca->bdev)) - blkdev_put(ca->bdev, ca); + if (ca->bdev_handle) + bdev_release(ca->bdev_handle); kfree(ca); module_put(THIS_MODULE); @@ -2337,16 +2338,18 @@ static int cache_alloc(struct cache *ca) } static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk, - struct block_device *bdev, struct cache *ca) + struct bdev_handle *bdev_handle, + struct cache *ca) { const char *err = NULL; /* must be set for any error case */ int ret = 0; memcpy(&ca->sb, sb, sizeof(struct cache_sb)); - ca->bdev = bdev; + ca->bdev_handle = bdev_handle; + ca->bdev = bdev_handle->bdev; ca->sb_disk = sb_disk; - if (bdev_max_discard_sectors((bdev))) + if (bdev_max_discard_sectors((bdev_handle->bdev))) ca->discard = CACHE_DISCARD(&ca->sb); ret = cache_alloc(ca); @@ -2354,10 +2357,10 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk, /* * If we failed here, it means ca->kobj is not initialized yet, * kobject_put() won't be called and there is no chance to - * call blkdev_put() to bdev in bch_cache_release(). So we - * explicitly call blkdev_put() here. + * call bdev_release() to bdev in bch_cache_release(). So + * we explicitly call bdev_release() here. */ - blkdev_put(bdev, ca); + bdev_release(bdev_handle); if (ret == -ENOMEM) err = "cache_alloc(): -ENOMEM"; else if (ret == -EPERM) @@ -2367,7 +2370,7 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk, goto err; } - if (kobject_add(&ca->kobj, bdev_kobj(bdev), "bcache")) { + if (kobject_add(&ca->kobj, bdev_kobj(bdev_handle->bdev), "bcache")) { err = "error calling kobject_add"; ret = -ENOMEM; goto out; @@ -2382,14 +2385,14 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk, goto out; } - pr_info("registered cache device %pg\n", ca->bdev); + pr_info("registered cache device %pg\n", ca->bdev_handle->bdev); out: kobject_put(&ca->kobj); err: if (err) - pr_notice("error %pg: %s\n", ca->bdev, err); + pr_notice("error %pg: %s\n", ca->bdev_handle->bdev, err); return ret; } @@ -2445,7 +2448,7 @@ struct async_reg_args { char *path; struct cache_sb *sb; struct cache_sb_disk *sb_disk; - struct block_device *bdev; + struct bdev_handle *bdev_handle; void *holder; }; @@ -2456,8 +2459,8 @@ static void register_bdev_worker(struct work_struct *work) container_of(work, struct async_reg_args, reg_work.work); mutex_lock(&bch_register_lock); - if (register_bdev(args->sb, args->sb_disk, args->bdev, args->holder) - < 0) + if (register_bdev(args->sb, args->sb_disk, args->bdev_handle, + args->holder) < 0) fail = true; mutex_unlock(&bch_register_lock); @@ -2477,7 +2480,8 @@ static void register_cache_worker(struct work_struct *work) container_of(work, struct async_reg_args, reg_work.work); /* blkdev_put() will be called in bch_cache_release() */ - if (register_cache(args->sb, args->sb_disk, args->bdev, args->holder)) + if (register_cache(args->sb, args->sb_disk, args->bdev_handle, + args->holder)) fail = true; if (fail) @@ -2514,7 +2518,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, char *path = NULL; struct cache_sb *sb; struct cache_sb_disk *sb_disk; - struct block_device *bdev, *bdev2; + struct bdev_handle *bdev_handle, *bdev_handle2; void *holder = NULL; ssize_t ret; bool async_registration = false; @@ -2547,15 +2551,15 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, ret = -EINVAL; err = "failed to open device"; - bdev = blkdev_get_by_path(strim(path), BLK_OPEN_READ, NULL, NULL); - if (IS_ERR(bdev)) + bdev_handle = bdev_open_by_path(strim(path), BLK_OPEN_READ, NULL, NULL); + if (IS_ERR(bdev_handle)) goto out_free_sb; err = "failed to set blocksize"; - if (set_blocksize(bdev, 4096)) + if (set_blocksize(bdev_handle->bdev, 4096)) goto out_blkdev_put; - err = read_super(sb, bdev, &sb_disk); + err = read_super(sb, bdev_handle->bdev, &sb_disk); if (err) goto out_blkdev_put; @@ -2567,13 +2571,13 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, } /* Now reopen in exclusive mode with proper holder */ - bdev2 = blkdev_get_by_dev(bdev->bd_dev, BLK_OPEN_READ | BLK_OPEN_WRITE, - holder, NULL); - blkdev_put(bdev, NULL); - bdev = bdev2; - if (IS_ERR(bdev)) { - ret = PTR_ERR(bdev); - bdev = NULL; + bdev_handle2 = bdev_open_by_dev(bdev_handle->bdev->bd_dev, + BLK_OPEN_READ | BLK_OPEN_WRITE, holder, NULL); + bdev_release(bdev_handle); + bdev_handle = bdev_handle2; + if (IS_ERR(bdev_handle)) { + ret = PTR_ERR(bdev_handle); + bdev_handle = NULL; if (ret == -EBUSY) { dev_t dev; @@ -2608,7 +2612,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, args->path = path; args->sb = sb; args->sb_disk = sb_disk; - args->bdev = bdev; + args->bdev_handle = bdev_handle; args->holder = holder; register_device_async(args); /* No wait and returns to user space */ @@ -2617,14 +2621,14 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, if (SB_IS_BDEV(sb)) { mutex_lock(&bch_register_lock); - ret = register_bdev(sb, sb_disk, bdev, holder); + ret = register_bdev(sb, sb_disk, bdev_handle, holder); mutex_unlock(&bch_register_lock); /* blkdev_put() will be called in cached_dev_free() */ if (ret < 0) goto out_free_sb; } else { /* blkdev_put() will be called in bch_cache_release() */ - ret = register_cache(sb, sb_disk, bdev, holder); + ret = register_cache(sb, sb_disk, bdev_handle, holder); if (ret) goto out_free_sb; } @@ -2640,8 +2644,8 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, out_put_sb_page: put_page(virt_to_page(sb_disk)); out_blkdev_put: - if (bdev) - blkdev_put(bdev, holder); + if (bdev_handle) + bdev_release(bdev_handle); out_free_sb: kfree(sb); out_free_path: From b0574de0106755fc3d32ef870c6742200660701a Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:16 +0200 Subject: [PATCH 158/515] dm: Convert to bdev_open_by_dev() Convert device mapper to use bdev_open_by_dev() and pass the handle around. CC: Alasdair Kergon CC: Mike Snitzer CC: dm-devel@redhat.com Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-10-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/md/dm.c | 20 +++++++++++--------- include/linux/device-mapper.h | 1 + 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 64a1f306c96c11..f7212e8fc27f0f 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -724,7 +724,7 @@ static struct table_device *open_table_device(struct mapped_device *md, dev_t dev, blk_mode_t mode) { struct table_device *td; - struct block_device *bdev; + struct bdev_handle *bdev_handle; u64 part_off; int r; @@ -733,9 +733,9 @@ static struct table_device *open_table_device(struct mapped_device *md, return ERR_PTR(-ENOMEM); refcount_set(&td->count, 1); - bdev = blkdev_get_by_dev(dev, mode, _dm_claim_ptr, NULL); - if (IS_ERR(bdev)) { - r = PTR_ERR(bdev); + bdev_handle = bdev_open_by_dev(dev, mode, _dm_claim_ptr, NULL); + if (IS_ERR(bdev_handle)) { + r = PTR_ERR(bdev_handle); goto out_free_td; } @@ -745,20 +745,22 @@ static struct table_device *open_table_device(struct mapped_device *md, * called. */ if (md->disk->slave_dir) { - r = bd_link_disk_holder(bdev, md->disk); + r = bd_link_disk_holder(bdev_handle->bdev, md->disk); if (r) goto out_blkdev_put; } td->dm_dev.mode = mode; - td->dm_dev.bdev = bdev; - td->dm_dev.dax_dev = fs_dax_get_by_bdev(bdev, &part_off, NULL, NULL); + td->dm_dev.bdev = bdev_handle->bdev; + td->dm_dev.bdev_handle = bdev_handle; + td->dm_dev.dax_dev = fs_dax_get_by_bdev(bdev_handle->bdev, &part_off, + NULL, NULL); format_dev_t(td->dm_dev.name, dev); list_add(&td->list, &md->table_devices); return td; out_blkdev_put: - blkdev_put(bdev, _dm_claim_ptr); + bdev_release(bdev_handle); out_free_td: kfree(td); return ERR_PTR(r); @@ -771,7 +773,7 @@ static void close_table_device(struct table_device *td, struct mapped_device *md { if (md->disk->slave_dir) bd_unlink_disk_holder(td->dm_dev.bdev, md->disk); - blkdev_put(td->dm_dev.bdev, _dm_claim_ptr); + bdev_release(td->dm_dev.bdev_handle); put_dax(td->dm_dev.dax_dev); list_del(&td->list); kfree(td); diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 69d0435c7ebb0d..772ab4d74d944b 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -165,6 +165,7 @@ void dm_error(const char *message); struct dm_dev { struct block_device *bdev; + struct bdev_handle *bdev_handle; struct dax_device *dax_dev; blk_mode_t mode; char name[16]; From 078fa573d7e2216bd644c060dc0183f63c3009bd Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:17 +0200 Subject: [PATCH 159/515] md: Convert to bdev_open_by_dev() Convert md to use bdev_open_by_dev() and pass the handle around. We also don't need the 'Holder' flag anymore so remove it. CC: linux-raid@vger.kernel.org CC: Song Liu Acked-by: Song Liu Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-11-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/md/md.c | 23 ++++++++--------------- drivers/md/md.h | 4 +--- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index a104a025084dc7..839e79e567eef8 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -2452,8 +2452,7 @@ static void export_rdev(struct md_rdev *rdev, struct mddev *mddev) if (test_bit(AutoDetected, &rdev->flags)) md_autodetect_dev(rdev->bdev->bd_dev); #endif - blkdev_put(rdev->bdev, - test_bit(Holder, &rdev->flags) ? rdev : &claim_rdev); + bdev_release(rdev->bdev_handle); rdev->bdev = NULL; kobject_put(&rdev->kobj); } @@ -3633,7 +3632,6 @@ EXPORT_SYMBOL_GPL(md_rdev_init); static struct md_rdev *md_import_device(dev_t newdev, int super_format, int super_minor) { struct md_rdev *rdev; - struct md_rdev *holder; sector_t size; int err; @@ -3648,21 +3646,16 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe if (err) goto out_clear_rdev; - if (super_format == -2) { - holder = &claim_rdev; - } else { - holder = rdev; - set_bit(Holder, &rdev->flags); - } - - rdev->bdev = blkdev_get_by_dev(newdev, BLK_OPEN_READ | BLK_OPEN_WRITE, - holder, NULL); - if (IS_ERR(rdev->bdev)) { + rdev->bdev_handle = bdev_open_by_dev(newdev, + BLK_OPEN_READ | BLK_OPEN_WRITE, + super_format == -2 ? &claim_rdev : rdev, NULL); + if (IS_ERR(rdev->bdev_handle)) { pr_warn("md: could not open device unknown-block(%u,%u).\n", MAJOR(newdev), MINOR(newdev)); - err = PTR_ERR(rdev->bdev); + err = PTR_ERR(rdev->bdev_handle); goto out_clear_rdev; } + rdev->bdev = rdev->bdev_handle->bdev; kobject_init(&rdev->kobj, &rdev_ktype); @@ -3693,7 +3686,7 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe return rdev; out_blkdev_put: - blkdev_put(rdev->bdev, holder); + bdev_release(rdev->bdev_handle); out_clear_rdev: md_rdev_clear(rdev); out_free_rdev: diff --git a/drivers/md/md.h b/drivers/md/md.h index 7c9c13abd7cac0..274e7d61d19fca 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -59,6 +59,7 @@ struct md_rdev { */ struct block_device *meta_bdev; struct block_device *bdev; /* block device handle */ + struct bdev_handle *bdev_handle; /* Handle from open for bdev */ struct page *sb_page, *bb_page; int sb_loaded; @@ -211,9 +212,6 @@ enum flag_bits { * check if there is collision between raid1 * serial bios. */ - Holder, /* rdev is used as holder while opening - * underlying disk exclusively. - */ }; static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors, From 1bcded92d938d141987fc1d80422bf65e4eb57ff Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:18 +0200 Subject: [PATCH 160/515] mtd: block2mtd: Convert to bdev_open_by_dev/path() Convert block2mtd to use bdev_open_by_dev() and bdev_open_by_path() and pass the handle around. CC: Joern Engel CC: linux-mtd@lists.infradead.org Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-12-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/mtd/devices/block2mtd.c | 51 +++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index be106dc20ff3cf..aa44a23ec0451e 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c @@ -37,7 +37,7 @@ /* Info for the block device */ struct block2mtd_dev { struct list_head list; - struct block_device *blkdev; + struct bdev_handle *bdev_handle; struct mtd_info mtd; struct mutex write_mutex; }; @@ -55,7 +55,8 @@ static struct page *page_read(struct address_space *mapping, pgoff_t index) /* erase a specified part of the device */ static int _block2mtd_erase(struct block2mtd_dev *dev, loff_t to, size_t len) { - struct address_space *mapping = dev->blkdev->bd_inode->i_mapping; + struct address_space *mapping = + dev->bdev_handle->bdev->bd_inode->i_mapping; struct page *page; pgoff_t index = to >> PAGE_SHIFT; // page index int pages = len >> PAGE_SHIFT; @@ -105,6 +106,8 @@ static int block2mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) { struct block2mtd_dev *dev = mtd->priv; + struct address_space *mapping = + dev->bdev_handle->bdev->bd_inode->i_mapping; struct page *page; pgoff_t index = from >> PAGE_SHIFT; int offset = from & (PAGE_SIZE-1); @@ -117,7 +120,7 @@ static int block2mtd_read(struct mtd_info *mtd, loff_t from, size_t len, cpylen = len; // this page len = len - cpylen; - page = page_read(dev->blkdev->bd_inode->i_mapping, index); + page = page_read(mapping, index); if (IS_ERR(page)) return PTR_ERR(page); @@ -139,7 +142,8 @@ static int _block2mtd_write(struct block2mtd_dev *dev, const u_char *buf, loff_t to, size_t len, size_t *retlen) { struct page *page; - struct address_space *mapping = dev->blkdev->bd_inode->i_mapping; + struct address_space *mapping = + dev->bdev_handle->bdev->bd_inode->i_mapping; pgoff_t index = to >> PAGE_SHIFT; // page index int offset = to & ~PAGE_MASK; // page offset int cpylen; @@ -194,7 +198,7 @@ static int block2mtd_write(struct mtd_info *mtd, loff_t to, size_t len, static void block2mtd_sync(struct mtd_info *mtd) { struct block2mtd_dev *dev = mtd->priv; - sync_blockdev(dev->blkdev); + sync_blockdev(dev->bdev_handle->bdev); return; } @@ -206,10 +210,10 @@ static void block2mtd_free_device(struct block2mtd_dev *dev) kfree(dev->mtd.name); - if (dev->blkdev) { - invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, - 0, -1); - blkdev_put(dev->blkdev, NULL); + if (dev->bdev_handle) { + invalidate_mapping_pages( + dev->bdev_handle->bdev->bd_inode->i_mapping, 0, -1); + bdev_release(dev->bdev_handle); } kfree(dev); @@ -219,10 +223,10 @@ static void block2mtd_free_device(struct block2mtd_dev *dev) * This function is marked __ref because it calls the __init marked * early_lookup_bdev when called from the early boot code. */ -static struct block_device __ref *mdtblock_early_get_bdev(const char *devname, +static struct bdev_handle __ref *mdtblock_early_get_bdev(const char *devname, blk_mode_t mode, int timeout, struct block2mtd_dev *dev) { - struct block_device *bdev = ERR_PTR(-ENODEV); + struct bdev_handle *bdev_handle = ERR_PTR(-ENODEV); #ifndef MODULE int i; @@ -230,7 +234,7 @@ static struct block_device __ref *mdtblock_early_get_bdev(const char *devname, * We can't use early_lookup_bdev from a running system. */ if (system_state >= SYSTEM_RUNNING) - return bdev; + return bdev_handle; /* * We might not have the root device mounted at this point. @@ -249,19 +253,20 @@ static struct block_device __ref *mdtblock_early_get_bdev(const char *devname, wait_for_device_probe(); if (!early_lookup_bdev(devname, &devt)) { - bdev = blkdev_get_by_dev(devt, mode, dev, NULL); - if (!IS_ERR(bdev)) + bdev_handle = bdev_open_by_dev(devt, mode, dev, NULL); + if (!IS_ERR(bdev_handle)) break; } } #endif - return bdev; + return bdev_handle; } static struct block2mtd_dev *add_device(char *devname, int erase_size, char *label, int timeout) { const blk_mode_t mode = BLK_OPEN_READ | BLK_OPEN_WRITE; + struct bdev_handle *bdev_handle; struct block_device *bdev; struct block2mtd_dev *dev; char *name; @@ -274,21 +279,23 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size, return NULL; /* Get a handle on the device */ - bdev = blkdev_get_by_path(devname, mode, dev, NULL); - if (IS_ERR(bdev)) - bdev = mdtblock_early_get_bdev(devname, mode, timeout, dev); - if (IS_ERR(bdev)) { + bdev_handle = bdev_open_by_path(devname, mode, dev, NULL); + if (IS_ERR(bdev_handle)) + bdev_handle = mdtblock_early_get_bdev(devname, mode, timeout, + dev); + if (IS_ERR(bdev_handle)) { pr_err("error: cannot open device %s\n", devname); goto err_free_block2mtd; } - dev->blkdev = bdev; + dev->bdev_handle = bdev_handle; + bdev = bdev_handle->bdev; if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) { pr_err("attempting to use an MTD device as a block device\n"); goto err_free_block2mtd; } - if ((long)dev->blkdev->bd_inode->i_size % erase_size) { + if ((long)bdev->bd_inode->i_size % erase_size) { pr_err("erasesize must be a divisor of device size\n"); goto err_free_block2mtd; } @@ -306,7 +313,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size, dev->mtd.name = name; - dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK; + dev->mtd.size = bdev->bd_inode->i_size & PAGE_MASK; dev->mtd.erasesize = erase_size; dev->mtd.writesize = 1; dev->mtd.writebufsize = PAGE_SIZE; From 3bcdb9f944e30d1a09ed7793c0eda1deb69d5947 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:19 +0200 Subject: [PATCH 161/515] nvmet: Convert to bdev_open_by_path() Convert nvmet to use bdev_open_by_path() and pass the handle around. CC: linux-nvme@lists.infradead.org Acked-by: Christoph Hellwig Acked-by: Christian Brauner Reviewed-by: Chaitanya Kulkarni Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-13-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/nvme/target/io-cmd-bdev.c | 20 +++++++++++--------- drivers/nvme/target/nvmet.h | 1 + 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c index 468833675cc949..f11400a908f269 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -50,9 +50,10 @@ void nvmet_bdev_set_limits(struct block_device *bdev, struct nvme_id_ns *id) void nvmet_bdev_ns_disable(struct nvmet_ns *ns) { - if (ns->bdev) { - blkdev_put(ns->bdev, NULL); + if (ns->bdev_handle) { + bdev_release(ns->bdev_handle); ns->bdev = NULL; + ns->bdev_handle = NULL; } } @@ -84,17 +85,18 @@ int nvmet_bdev_ns_enable(struct nvmet_ns *ns) if (ns->buffered_io) return -ENOTBLK; - ns->bdev = blkdev_get_by_path(ns->device_path, - BLK_OPEN_READ | BLK_OPEN_WRITE, NULL, NULL); - if (IS_ERR(ns->bdev)) { - ret = PTR_ERR(ns->bdev); + ns->bdev_handle = bdev_open_by_path(ns->device_path, + BLK_OPEN_READ | BLK_OPEN_WRITE, NULL, NULL); + if (IS_ERR(ns->bdev_handle)) { + ret = PTR_ERR(ns->bdev_handle); if (ret != -ENOTBLK) { - pr_err("failed to open block device %s: (%ld)\n", - ns->device_path, PTR_ERR(ns->bdev)); + pr_err("failed to open block device %s: (%d)\n", + ns->device_path, ret); } - ns->bdev = NULL; + ns->bdev_handle = NULL; return ret; } + ns->bdev = ns->bdev_handle->bdev; ns->size = bdev_nr_bytes(ns->bdev); ns->blksize_shift = blksize_bits(bdev_logical_block_size(ns->bdev)); diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h index 8cfd60f3b5648f..360e385be33b09 100644 --- a/drivers/nvme/target/nvmet.h +++ b/drivers/nvme/target/nvmet.h @@ -58,6 +58,7 @@ struct nvmet_ns { struct percpu_ref ref; + struct bdev_handle *bdev_handle; struct block_device *bdev; struct file *file; bool readonly; From 8af75895f2386907e405dd2f6ca02a2754b62b43 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:20 +0200 Subject: [PATCH 162/515] s390/dasd: Convert to bdev_open_by_path() Convert dasd to use bdev_open_by_path() and pass the handle around. CC: linux-s390@vger.kernel.org CC: Christian Borntraeger CC: Sven Schnelle Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-14-jack@suse.cz Signed-off-by: Christian Brauner --- drivers/s390/block/dasd.c | 12 +++++---- drivers/s390/block/dasd_genhd.c | 45 ++++++++++++++++----------------- drivers/s390/block/dasd_int.h | 2 +- drivers/s390/block/dasd_ioctl.c | 2 +- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 215597f73be4f3..d440319a7945b8 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -412,7 +412,8 @@ dasd_state_ready_to_online(struct dasd_device * device) KOBJ_CHANGE); return 0; } - disk_uevent(device->block->bdev->bd_disk, KOBJ_CHANGE); + disk_uevent(device->block->bdev_handle->bdev->bd_disk, + KOBJ_CHANGE); } return 0; } @@ -432,7 +433,8 @@ static int dasd_state_online_to_ready(struct dasd_device *device) device->state = DASD_STATE_READY; if (device->block && !(device->features & DASD_FEATURE_USERAW)) - disk_uevent(device->block->bdev->bd_disk, KOBJ_CHANGE); + disk_uevent(device->block->bdev_handle->bdev->bd_disk, + KOBJ_CHANGE); return 0; } @@ -3590,7 +3592,7 @@ int dasd_generic_set_offline(struct ccw_device *cdev) * in the other openers. */ if (device->block) { - max_count = device->block->bdev ? 0 : -1; + max_count = device->block->bdev_handle ? 0 : -1; open_count = atomic_read(&device->block->open_count); if (open_count > max_count) { if (open_count > 0) @@ -3636,8 +3638,8 @@ int dasd_generic_set_offline(struct ccw_device *cdev) * so sync bdev first and then wait for our queues to become * empty */ - if (device->block) - bdev_mark_dead(device->block->bdev, false); + if (device->block && device->block->bdev_handle) + bdev_mark_dead(device->block->bdev_handle->bdev, false); dasd_schedule_device_bh(device); rc = wait_event_interruptible(shutdown_waitq, _wait_for_empty_queues(device)); diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index fe5108a1b332ea..55e3abe94cde2f 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -127,15 +127,15 @@ void dasd_gendisk_free(struct dasd_block *block) */ int dasd_scan_partitions(struct dasd_block *block) { - struct block_device *bdev; + struct bdev_handle *bdev_handle; int rc; - bdev = blkdev_get_by_dev(disk_devt(block->gdp), BLK_OPEN_READ, NULL, - NULL); - if (IS_ERR(bdev)) { + bdev_handle = bdev_open_by_dev(disk_devt(block->gdp), BLK_OPEN_READ, + NULL, NULL); + if (IS_ERR(bdev_handle)) { DBF_DEV_EVENT(DBF_ERR, block->base, "scan partitions error, blkdev_get returned %ld", - PTR_ERR(bdev)); + PTR_ERR(bdev_handle)); return -ENODEV; } @@ -147,16 +147,15 @@ int dasd_scan_partitions(struct dasd_block *block) "scan partitions error, rc %d", rc); /* - * Since the matching blkdev_put call to the blkdev_get in - * this function is not called before dasd_destroy_partitions - * the offline open_count limit needs to be increased from - * 0 to 1. This is done by setting device->bdev (see - * dasd_generic_set_offline). As long as the partition - * detection is running no offline should be allowed. That - * is why the assignment to device->bdev is done AFTER - * the BLKRRPART ioctl. + * Since the matching bdev_release() call to the + * bdev_open_by_path() in this function is not called before + * dasd_destroy_partitions the offline open_count limit needs to be + * increased from 0 to 1. This is done by setting device->bdev_handle + * (see dasd_generic_set_offline). As long as the partition detection + * is running no offline should be allowed. That is why the assignment + * to block->bdev_handle is done AFTER the BLKRRPART ioctl. */ - block->bdev = bdev; + block->bdev_handle = bdev_handle; return 0; } @@ -166,21 +165,21 @@ int dasd_scan_partitions(struct dasd_block *block) */ void dasd_destroy_partitions(struct dasd_block *block) { - struct block_device *bdev; + struct bdev_handle *bdev_handle; /* - * Get the bdev pointer from the device structure and clear - * device->bdev to lower the offline open_count limit again. + * Get the bdev_handle pointer from the device structure and clear + * device->bdev_handle to lower the offline open_count limit again. */ - bdev = block->bdev; - block->bdev = NULL; + bdev_handle = block->bdev_handle; + block->bdev_handle = NULL; - mutex_lock(&bdev->bd_disk->open_mutex); - bdev_disk_changed(bdev->bd_disk, true); - mutex_unlock(&bdev->bd_disk->open_mutex); + mutex_lock(&bdev_handle->bdev->bd_disk->open_mutex); + bdev_disk_changed(bdev_handle->bdev->bd_disk, true); + mutex_unlock(&bdev_handle->bdev->bd_disk->open_mutex); /* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */ - blkdev_put(bdev, NULL); + bdev_release(bdev_handle); } int dasd_gendisk_init(void) diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index 8a4dbe9d774113..2e663131adaf67 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h @@ -650,7 +650,7 @@ struct dasd_block { struct gendisk *gdp; spinlock_t request_queue_lock; struct blk_mq_tag_set tag_set; - struct block_device *bdev; + struct bdev_handle *bdev_handle; atomic_t open_count; unsigned long blocks; /* size of volume in blocks */ diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index d55862605b8286..61b9675e2a675e 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c @@ -537,7 +537,7 @@ static int __dasd_ioctl_information(struct dasd_block *block, * This must be hidden from user-space. */ dasd_info->open_count = atomic_read(&block->open_count); - if (!block->bdev) + if (!block->bdev_handle) dasd_info->open_count++; /* From 18ea3fbd438855977bd1d7835fd22a17d0554c5e Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:21 +0200 Subject: [PATCH 163/515] scsi: target: Convert to bdev_open_by_path() Convert iblock and pscsi drivers to use bdev_open_by_path() and pass the handle around. CC: target-devel@vger.kernel.org CC: linux-scsi@vger.kernel.org Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-15-jack@suse.cz Reviewed-by: "Martin K. Petersen" Signed-off-by: Christian Brauner --- drivers/target/target_core_iblock.c | 19 +++++++++++-------- drivers/target/target_core_iblock.h | 1 + drivers/target/target_core_pscsi.c | 26 +++++++++++++------------- drivers/target/target_core_pscsi.h | 2 +- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index a6a06a5f74834d..8eb9eb7ce5df52 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -91,7 +91,8 @@ static int iblock_configure_device(struct se_device *dev) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); struct request_queue *q; - struct block_device *bd = NULL; + struct bdev_handle *bdev_handle; + struct block_device *bd; struct blk_integrity *bi; blk_mode_t mode = BLK_OPEN_READ; unsigned int max_write_zeroes_sectors; @@ -116,12 +117,14 @@ static int iblock_configure_device(struct se_device *dev) else dev->dev_flags |= DF_READ_ONLY; - bd = blkdev_get_by_path(ib_dev->ibd_udev_path, mode, ib_dev, NULL); - if (IS_ERR(bd)) { - ret = PTR_ERR(bd); + bdev_handle = bdev_open_by_path(ib_dev->ibd_udev_path, mode, ib_dev, + NULL); + if (IS_ERR(bdev_handle)) { + ret = PTR_ERR(bdev_handle); goto out_free_bioset; } - ib_dev->ibd_bd = bd; + ib_dev->ibd_bdev_handle = bdev_handle; + ib_dev->ibd_bd = bd = bdev_handle->bdev; q = bdev_get_queue(bd); @@ -177,7 +180,7 @@ static int iblock_configure_device(struct se_device *dev) return 0; out_blkdev_put: - blkdev_put(ib_dev->ibd_bd, ib_dev); + bdev_release(ib_dev->ibd_bdev_handle); out_free_bioset: bioset_exit(&ib_dev->ibd_bio_set); out: @@ -202,8 +205,8 @@ static void iblock_destroy_device(struct se_device *dev) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); - if (ib_dev->ibd_bd != NULL) - blkdev_put(ib_dev->ibd_bd, ib_dev); + if (ib_dev->ibd_bdev_handle) + bdev_release(ib_dev->ibd_bdev_handle); bioset_exit(&ib_dev->ibd_bio_set); } diff --git a/drivers/target/target_core_iblock.h b/drivers/target/target_core_iblock.h index 8c55375d2f754e..683f9a55945bb2 100644 --- a/drivers/target/target_core_iblock.h +++ b/drivers/target/target_core_iblock.h @@ -32,6 +32,7 @@ struct iblock_dev { u32 ibd_flags; struct bio_set ibd_bio_set; struct block_device *ibd_bd; + struct bdev_handle *ibd_bdev_handle; bool ibd_readonly; struct iblock_dev_plug *ibd_plug; } ____cacheline_aligned; diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 0d4f09693ef46e..41b7489d37ce95 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -352,7 +352,7 @@ static int pscsi_create_type_disk(struct se_device *dev, struct scsi_device *sd) struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr; struct pscsi_dev_virt *pdv = PSCSI_DEV(dev); struct Scsi_Host *sh = sd->host; - struct block_device *bd; + struct bdev_handle *bdev_handle; int ret; if (scsi_device_get(sd)) { @@ -366,18 +366,18 @@ static int pscsi_create_type_disk(struct se_device *dev, struct scsi_device *sd) * Claim exclusive struct block_device access to struct scsi_device * for TYPE_DISK and TYPE_ZBC using supplied udev_path */ - bd = blkdev_get_by_path(dev->udev_path, BLK_OPEN_WRITE | BLK_OPEN_READ, - pdv, NULL); - if (IS_ERR(bd)) { - pr_err("pSCSI: blkdev_get_by_path() failed\n"); + bdev_handle = bdev_open_by_path(dev->udev_path, + BLK_OPEN_WRITE | BLK_OPEN_READ, pdv, NULL); + if (IS_ERR(bdev_handle)) { + pr_err("pSCSI: bdev_open_by_path() failed\n"); scsi_device_put(sd); - return PTR_ERR(bd); + return PTR_ERR(bdev_handle); } - pdv->pdv_bd = bd; + pdv->pdv_bdev_handle = bdev_handle; ret = pscsi_add_device_to_list(dev, sd); if (ret) { - blkdev_put(pdv->pdv_bd, pdv); + bdev_release(bdev_handle); scsi_device_put(sd); return ret; } @@ -564,9 +564,9 @@ static void pscsi_destroy_device(struct se_device *dev) * from pscsi_create_type_disk() */ if ((sd->type == TYPE_DISK || sd->type == TYPE_ZBC) && - pdv->pdv_bd) { - blkdev_put(pdv->pdv_bd, pdv); - pdv->pdv_bd = NULL; + pdv->pdv_bdev_handle) { + bdev_release(pdv->pdv_bdev_handle); + pdv->pdv_bdev_handle = NULL; } /* * For HBA mode PHV_LLD_SCSI_HOST_NO, release the reference @@ -994,8 +994,8 @@ static sector_t pscsi_get_blocks(struct se_device *dev) { struct pscsi_dev_virt *pdv = PSCSI_DEV(dev); - if (pdv->pdv_bd) - return bdev_nr_sectors(pdv->pdv_bd); + if (pdv->pdv_bdev_handle) + return bdev_nr_sectors(pdv->pdv_bdev_handle->bdev); return 0; } diff --git a/drivers/target/target_core_pscsi.h b/drivers/target/target_core_pscsi.h index 23d9a6e340d41a..b0a3ef136592a9 100644 --- a/drivers/target/target_core_pscsi.h +++ b/drivers/target/target_core_pscsi.h @@ -37,7 +37,7 @@ struct pscsi_dev_virt { int pdv_channel_id; int pdv_target_id; int pdv_lun_id; - struct block_device *pdv_bd; + struct bdev_handle *pdv_bdev_handle; struct scsi_device *pdv_sd; struct Scsi_Host *pdv_lld_host; } ____cacheline_aligned; From 3a7e00e03fde4319e4a9175f70d04926cb01ec7b Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:22 +0200 Subject: [PATCH 164/515] PM: hibernate: Convert to bdev_open_by_dev() Convert hibernation code to use bdev_open_by_dev(). CC: linux-pm@vger.kernel.org Acked-by: Christoph Hellwig Acked-by: "Rafael J. Wysocki" Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-16-jack@suse.cz Signed-off-by: Christian Brauner --- kernel/power/swap.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 74edbce2320bae..095a263da7c4d9 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -222,7 +222,7 @@ int swsusp_swap_in_use(void) */ static unsigned short root_swap = 0xffff; -static struct block_device *hib_resume_bdev; +static struct bdev_handle *hib_resume_bdev_handle; struct hib_bio_batch { atomic_t count; @@ -276,7 +276,8 @@ static int hib_submit_io(blk_opf_t opf, pgoff_t page_off, void *addr, struct bio *bio; int error = 0; - bio = bio_alloc(hib_resume_bdev, 1, opf, GFP_NOIO | __GFP_HIGH); + bio = bio_alloc(hib_resume_bdev_handle->bdev, 1, opf, + GFP_NOIO | __GFP_HIGH); bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9); if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { @@ -356,14 +357,14 @@ static int swsusp_swap_check(void) return res; root_swap = res; - hib_resume_bdev = blkdev_get_by_dev(swsusp_resume_device, + hib_resume_bdev_handle = bdev_open_by_dev(swsusp_resume_device, BLK_OPEN_WRITE, NULL, NULL); - if (IS_ERR(hib_resume_bdev)) - return PTR_ERR(hib_resume_bdev); + if (IS_ERR(hib_resume_bdev_handle)) + return PTR_ERR(hib_resume_bdev_handle); - res = set_blocksize(hib_resume_bdev, PAGE_SIZE); + res = set_blocksize(hib_resume_bdev_handle->bdev, PAGE_SIZE); if (res < 0) - blkdev_put(hib_resume_bdev, NULL); + bdev_release(hib_resume_bdev_handle); return res; } @@ -1522,10 +1523,10 @@ int swsusp_check(bool exclusive) void *holder = exclusive ? &swsusp_holder : NULL; int error; - hib_resume_bdev = blkdev_get_by_dev(swsusp_resume_device, BLK_OPEN_READ, - holder, NULL); - if (!IS_ERR(hib_resume_bdev)) { - set_blocksize(hib_resume_bdev, PAGE_SIZE); + hib_resume_bdev_handle = bdev_open_by_dev(swsusp_resume_device, + BLK_OPEN_READ, holder, NULL); + if (!IS_ERR(hib_resume_bdev_handle)) { + set_blocksize(hib_resume_bdev_handle->bdev, PAGE_SIZE); clear_page(swsusp_header); error = hib_submit_io(REQ_OP_READ, swsusp_resume_block, swsusp_header, NULL); @@ -1550,11 +1551,11 @@ int swsusp_check(bool exclusive) put: if (error) - blkdev_put(hib_resume_bdev, holder); + bdev_release(hib_resume_bdev_handle); else pr_debug("Image signature found, resuming\n"); } else { - error = PTR_ERR(hib_resume_bdev); + error = PTR_ERR(hib_resume_bdev_handle); } if (error) @@ -1570,12 +1571,12 @@ int swsusp_check(bool exclusive) void swsusp_close(bool exclusive) { - if (IS_ERR(hib_resume_bdev)) { + if (IS_ERR(hib_resume_bdev_handle)) { pr_debug("Image device not initialised\n"); return; } - blkdev_put(hib_resume_bdev, exclusive ? &swsusp_holder : NULL); + bdev_release(hib_resume_bdev_handle); } /** From 41447095dfcc63840ef08e00d14d32be8e5fa975 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:23 +0200 Subject: [PATCH 165/515] PM: hibernate: Drop unused snapshot_test argument snapshot_test argument is now unused in swsusp_close() and load_image_and_restore(). Drop it CC: linux-pm@vger.kernel.org Acked-by: Christoph Hellwig Acked-by: "Rafael J. Wysocki" Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-17-jack@suse.cz Signed-off-by: Christian Brauner --- kernel/power/hibernate.c | 14 +++++++------- kernel/power/power.h | 2 +- kernel/power/swap.c | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 8d35b9f9aaa3f2..dee341ae4ace78 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -684,7 +684,7 @@ static void power_down(void) cpu_relax(); } -static int load_image_and_restore(bool snapshot_test) +static int load_image_and_restore(void) { int error; unsigned int flags; @@ -694,12 +694,12 @@ static int load_image_and_restore(bool snapshot_test) lock_device_hotplug(); error = create_basic_memory_bitmaps(); if (error) { - swsusp_close(snapshot_test); + swsusp_close(); goto Unlock; } error = swsusp_read(&flags); - swsusp_close(snapshot_test); + swsusp_close(); if (!error) error = hibernation_restore(flags & SF_PLATFORM_MODE); @@ -788,7 +788,7 @@ int hibernate(void) pm_pr_dbg("Checking hibernation image\n"); error = swsusp_check(false); if (!error) - error = load_image_and_restore(false); + error = load_image_and_restore(); } thaw_processes(); @@ -952,7 +952,7 @@ static int software_resume(void) /* The snapshot device should not be opened while we're running */ if (!hibernate_acquire()) { error = -EBUSY; - swsusp_close(true); + swsusp_close(); goto Unlock; } @@ -973,7 +973,7 @@ static int software_resume(void) goto Close_Finish; } - error = load_image_and_restore(true); + error = load_image_and_restore(); thaw_processes(); Finish: pm_notifier_call_chain(PM_POST_RESTORE); @@ -987,7 +987,7 @@ static int software_resume(void) pm_pr_dbg("Hibernation image not present or could not be loaded.\n"); return error; Close_Finish: - swsusp_close(true); + swsusp_close(); goto Finish; } diff --git a/kernel/power/power.h b/kernel/power/power.h index a98f95e309a338..17fd9aaaf084aa 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -172,7 +172,7 @@ int swsusp_check(bool exclusive); extern void swsusp_free(void); extern int swsusp_read(unsigned int *flags_p); extern int swsusp_write(unsigned int flags); -void swsusp_close(bool exclusive); +void swsusp_close(void); #ifdef CONFIG_SUSPEND extern int swsusp_unmark(void); #endif diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 095a263da7c4d9..68a5c2f0695744 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -444,7 +444,7 @@ static int get_swap_writer(struct swap_map_handle *handle) err_rel: release_swap_writer(handle); err_close: - swsusp_close(false); + swsusp_close(); return ret; } @@ -509,7 +509,7 @@ static int swap_writer_finish(struct swap_map_handle *handle, if (error) free_all_swap_pages(root_swap); release_swap_writer(handle); - swsusp_close(false); + swsusp_close(); return error; } @@ -1569,7 +1569,7 @@ int swsusp_check(bool exclusive) * @exclusive: Close the resume device which is exclusively opened. */ -void swsusp_close(bool exclusive) +void swsusp_close(void) { if (IS_ERR(hib_resume_bdev_handle)) { pr_debug("Image device not initialised\n"); From e3fe0df3067be7e16e923b94df3880150c1134c2 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:24 +0200 Subject: [PATCH 166/515] mm/swap: Convert to use bdev_open_by_dev() Convert swapping code to use bdev_open_by_dev() and pass the handle around. CC: linux-mm@kvack.org CC: Andrew Morton Acked-by: Christoph Hellwig Acked-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-18-jack@suse.cz Signed-off-by: Christian Brauner --- include/linux/swap.h | 1 + mm/swapfile.c | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 493487ed7c388b..f6dd6575b90545 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -298,6 +298,7 @@ struct swap_info_struct { unsigned int __percpu *cluster_next_cpu; /*percpu index for next allocation */ struct percpu_cluster __percpu *percpu_cluster; /* per cpu's swap location */ struct rb_root swap_extent_root;/* root of the swap extent rbtree */ + struct bdev_handle *bdev_handle;/* open handle of the bdev */ struct block_device *bdev; /* swap device or bdev of swap file */ struct file *swap_file; /* seldom referenced */ unsigned int old_block_size; /* seldom referenced */ diff --git a/mm/swapfile.c b/mm/swapfile.c index e52f486834ebf7..4bc70f45916414 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -2530,11 +2530,10 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) exit_swap_address_space(p->type); inode = mapping->host; - if (S_ISBLK(inode->i_mode)) { - struct block_device *bdev = I_BDEV(inode); - - set_blocksize(bdev, old_block_size); - blkdev_put(bdev, p); + if (p->bdev_handle) { + set_blocksize(p->bdev, old_block_size); + bdev_release(p->bdev_handle); + p->bdev_handle = NULL; } inode_lock(inode); @@ -2764,13 +2763,14 @@ static int claim_swapfile(struct swap_info_struct *p, struct inode *inode) int error; if (S_ISBLK(inode->i_mode)) { - p->bdev = blkdev_get_by_dev(inode->i_rdev, + p->bdev_handle = bdev_open_by_dev(inode->i_rdev, BLK_OPEN_READ | BLK_OPEN_WRITE, p, NULL); - if (IS_ERR(p->bdev)) { - error = PTR_ERR(p->bdev); - p->bdev = NULL; + if (IS_ERR(p->bdev_handle)) { + error = PTR_ERR(p->bdev_handle); + p->bdev_handle = NULL; return error; } + p->bdev = p->bdev_handle->bdev; p->old_block_size = block_size(p->bdev); error = set_blocksize(p->bdev, PAGE_SIZE); if (error < 0) @@ -3206,9 +3206,10 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) p->percpu_cluster = NULL; free_percpu(p->cluster_next_cpu); p->cluster_next_cpu = NULL; - if (inode && S_ISBLK(inode->i_mode) && p->bdev) { + if (p->bdev_handle) { set_blocksize(p->bdev, p->old_block_size); - blkdev_put(p->bdev, p); + bdev_release(p->bdev_handle); + p->bdev_handle = NULL; } inode = NULL; destroy_swap_extents(p); From 9d84fe9877cdaf5c6fbf2bd4e403b0d73373144f Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:25 +0200 Subject: [PATCH 167/515] fs: Convert to bdev_open_by_dev() Convert mount code to use bdev_open_by_dev() and propagate the handle around to bdev_release(). Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-19-jack@suse.cz Signed-off-by: Christian Brauner --- fs/cramfs/inode.c | 2 +- fs/romfs/super.c | 2 +- fs/super.c | 15 +++++++++------ include/linux/fs.h | 1 + 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index 5ee7d7bbb361ce..2fbf97077ce910 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -495,7 +495,7 @@ static void cramfs_kill_sb(struct super_block *sb) sb->s_mtd = NULL; } else if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV) && sb->s_bdev) { sync_blockdev(sb->s_bdev); - blkdev_put(sb->s_bdev, sb); + bdev_release(sb->s_bdev_handle); } kfree(sbi); } diff --git a/fs/romfs/super.c b/fs/romfs/super.c index 5c35f6c760377e..b1bdfbc211c3c0 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c @@ -593,7 +593,7 @@ static void romfs_kill_sb(struct super_block *sb) #ifdef CONFIG_ROMFS_ON_BLOCK if (sb->s_bdev) { sync_blockdev(sb->s_bdev); - blkdev_put(sb->s_bdev, sb); + bdev_release(sb->s_bdev_handle); } #endif } diff --git a/fs/super.c b/fs/super.c index 2d762ce67f6e6c..26b96191e9b3ca 100644 --- a/fs/super.c +++ b/fs/super.c @@ -1479,14 +1479,16 @@ int setup_bdev_super(struct super_block *sb, int sb_flags, struct fs_context *fc) { blk_mode_t mode = sb_open_mode(sb_flags); + struct bdev_handle *bdev_handle; struct block_device *bdev; - bdev = blkdev_get_by_dev(sb->s_dev, mode, sb, &fs_holder_ops); - if (IS_ERR(bdev)) { + bdev_handle = bdev_open_by_dev(sb->s_dev, mode, sb, &fs_holder_ops); + if (IS_ERR(bdev_handle)) { if (fc) errorf(fc, "%s: Can't open blockdev", fc->source); - return PTR_ERR(bdev); + return PTR_ERR(bdev_handle); } + bdev = bdev_handle->bdev; /* * This really should be in blkdev_get_by_dev, but right now can't due @@ -1494,7 +1496,7 @@ int setup_bdev_super(struct super_block *sb, int sb_flags, * writable from userspace even for a read-only block device. */ if ((mode & BLK_OPEN_WRITE) && bdev_read_only(bdev)) { - blkdev_put(bdev, sb); + bdev_release(bdev_handle); return -EACCES; } @@ -1510,10 +1512,11 @@ int setup_bdev_super(struct super_block *sb, int sb_flags, mutex_unlock(&bdev->bd_fsfreeze_mutex); if (fc) warnf(fc, "%pg: Can't mount, blockdev is frozen", bdev); - blkdev_put(bdev, sb); + bdev_release(bdev_handle); return -EBUSY; } spin_lock(&sb_lock); + sb->s_bdev_handle = bdev_handle; sb->s_bdev = bdev; sb->s_bdi = bdi_get(bdev->bd_disk->bdi); if (bdev_stable_writes(bdev)) @@ -1646,7 +1649,7 @@ void kill_block_super(struct super_block *sb) generic_shutdown_super(sb); if (bdev) { sync_blockdev(bdev); - blkdev_put(bdev, sb); + bdev_release(sb->s_bdev_handle); } } diff --git a/include/linux/fs.h b/include/linux/fs.h index b528f063e8ffaa..03afc8b6f2afbd 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1221,6 +1221,7 @@ struct super_block { struct hlist_bl_head s_roots; /* alternate root dentries for NFS */ struct list_head s_mounts; /* list of mounts; _not_ for fs use */ struct block_device *s_bdev; + struct bdev_handle *s_bdev_handle; struct backing_dev_info *s_bdi; struct mtd_info *s_mtd; struct hlist_node s_instances; From 78ea17967093b73f2989fba4c78b6368b9ffbe0f Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:26 +0200 Subject: [PATCH 168/515] btrfs: Convert to bdev_open_by_path() Convert btrfs to use bdev_open_by_path() and pass the handle around. We also drop the holder from struct btrfs_device as it is now not needed anymore. CC: David Sterba CC: linux-btrfs@vger.kernel.org Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-20-jack@suse.cz Signed-off-by: Christian Brauner --- fs/btrfs/dev-replace.c | 14 +++--- fs/btrfs/ioctl.c | 18 +++---- fs/btrfs/volumes.c | 107 +++++++++++++++++++++-------------------- fs/btrfs/volumes.h | 6 +-- 4 files changed, 73 insertions(+), 72 deletions(-) diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c index d3998cad62c26b..f9544fda38e96f 100644 --- a/fs/btrfs/dev-replace.c +++ b/fs/btrfs/dev-replace.c @@ -246,6 +246,7 @@ static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info, { struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; struct btrfs_device *device; + struct bdev_handle *bdev_handle; struct block_device *bdev; u64 devid = BTRFS_DEV_REPLACE_DEVID; int ret = 0; @@ -256,12 +257,13 @@ static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info, return -EINVAL; } - bdev = blkdev_get_by_path(device_path, BLK_OPEN_WRITE, - fs_info->bdev_holder, NULL); - if (IS_ERR(bdev)) { + bdev_handle = bdev_open_by_path(device_path, BLK_OPEN_WRITE, + fs_info->bdev_holder, NULL); + if (IS_ERR(bdev_handle)) { btrfs_err(fs_info, "target device %s is invalid!", device_path); - return PTR_ERR(bdev); + return PTR_ERR(bdev_handle); } + bdev = bdev_handle->bdev; if (!btrfs_check_device_zone_type(fs_info, bdev)) { btrfs_err(fs_info, @@ -312,9 +314,9 @@ static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info, device->commit_bytes_used = device->bytes_used; device->fs_info = fs_info; device->bdev = bdev; + device->bdev_handle = bdev_handle; set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); set_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state); - device->holder = fs_info->bdev_holder; device->dev_stats_valid = 1; set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE); device->fs_devices = fs_devices; @@ -333,7 +335,7 @@ static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info, return 0; error: - blkdev_put(bdev, fs_info->bdev_holder); + bdev_release(bdev_handle); return ret; } diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 89cd212735ea67..752acff2c73436 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -2682,8 +2682,7 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg) struct inode *inode = file_inode(file); struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); struct btrfs_ioctl_vol_args_v2 *vol_args; - struct block_device *bdev = NULL; - void *holder; + struct bdev_handle *bdev_handle = NULL; int ret; bool cancel = false; @@ -2720,7 +2719,7 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg) goto err_drop; /* Exclusive operation is now claimed */ - ret = btrfs_rm_device(fs_info, &args, &bdev, &holder); + ret = btrfs_rm_device(fs_info, &args, &bdev_handle); btrfs_exclop_finish(fs_info); @@ -2734,8 +2733,8 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg) } err_drop: mnt_drop_write_file(file); - if (bdev) - blkdev_put(bdev, holder); + if (bdev_handle) + bdev_release(bdev_handle); out: btrfs_put_dev_args_from_path(&args); kfree(vol_args); @@ -2748,8 +2747,7 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg) struct inode *inode = file_inode(file); struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); struct btrfs_ioctl_vol_args *vol_args; - struct block_device *bdev = NULL; - void *holder; + struct bdev_handle *bdev_handle = NULL; int ret; bool cancel = false; @@ -2776,15 +2774,15 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg) ret = exclop_start_or_cancel_reloc(fs_info, BTRFS_EXCLOP_DEV_REMOVE, cancel); if (ret == 0) { - ret = btrfs_rm_device(fs_info, &args, &bdev, &holder); + ret = btrfs_rm_device(fs_info, &args, &bdev_handle); if (!ret) btrfs_info(fs_info, "disk deleted %s", vol_args->name); btrfs_exclop_finish(fs_info); } mnt_drop_write_file(file); - if (bdev) - blkdev_put(bdev, holder); + if (bdev_handle) + bdev_release(bdev_handle); out: btrfs_put_dev_args_from_path(&args); kfree(vol_args); diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 1fdfa9153e30c5..ea983deae007d8 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -457,37 +457,39 @@ static noinline struct btrfs_fs_devices *find_fsid( static int btrfs_get_bdev_and_sb(const char *device_path, blk_mode_t flags, void *holder, - int flush, struct block_device **bdev, + int flush, struct bdev_handle **bdev_handle, struct btrfs_super_block **disk_super) { + struct block_device *bdev; int ret; - *bdev = blkdev_get_by_path(device_path, flags, holder, NULL); + *bdev_handle = bdev_open_by_path(device_path, flags, holder, NULL); - if (IS_ERR(*bdev)) { - ret = PTR_ERR(*bdev); + if (IS_ERR(*bdev_handle)) { + ret = PTR_ERR(*bdev_handle); goto error; } + bdev = (*bdev_handle)->bdev; if (flush) - sync_blockdev(*bdev); - ret = set_blocksize(*bdev, BTRFS_BDEV_BLOCKSIZE); + sync_blockdev(bdev); + ret = set_blocksize(bdev, BTRFS_BDEV_BLOCKSIZE); if (ret) { - blkdev_put(*bdev, holder); + bdev_release(*bdev_handle); goto error; } - invalidate_bdev(*bdev); - *disk_super = btrfs_read_dev_super(*bdev); + invalidate_bdev(bdev); + *disk_super = btrfs_read_dev_super(bdev); if (IS_ERR(*disk_super)) { ret = PTR_ERR(*disk_super); - blkdev_put(*bdev, holder); + bdev_release(*bdev_handle); goto error; } return 0; error: - *bdev = NULL; + *bdev_handle = NULL; return ret; } @@ -630,7 +632,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices, struct btrfs_device *device, blk_mode_t flags, void *holder) { - struct block_device *bdev; + struct bdev_handle *bdev_handle; struct btrfs_super_block *disk_super; u64 devid; int ret; @@ -641,7 +643,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices, return -EINVAL; ret = btrfs_get_bdev_and_sb(device->name->str, flags, holder, 1, - &bdev, &disk_super); + &bdev_handle, &disk_super); if (ret) return ret; @@ -665,21 +667,21 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices, clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); fs_devices->seeding = true; } else { - if (bdev_read_only(bdev)) + if (bdev_read_only(bdev_handle->bdev)) clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); else set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); } - if (!bdev_nonrot(bdev)) + if (!bdev_nonrot(bdev_handle->bdev)) fs_devices->rotating = true; - if (bdev_max_discard_sectors(bdev)) + if (bdev_max_discard_sectors(bdev_handle->bdev)) fs_devices->discardable = true; - device->bdev = bdev; + device->bdev_handle = bdev_handle; + device->bdev = bdev_handle->bdev; clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); - device->holder = holder; fs_devices->open_devices++; if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) && @@ -693,7 +695,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices, error_free_page: btrfs_release_disk_super(disk_super); - blkdev_put(bdev, holder); + bdev_release(bdev_handle); return -EINVAL; } @@ -1002,9 +1004,10 @@ static void __btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, if (device->devid == BTRFS_DEV_REPLACE_DEVID) continue; - if (device->bdev) { - blkdev_put(device->bdev, device->holder); + if (device->bdev_handle) { + bdev_release(device->bdev_handle); device->bdev = NULL; + device->bdev_handle = NULL; fs_devices->open_devices--; } if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { @@ -1049,7 +1052,7 @@ static void btrfs_close_bdev(struct btrfs_device *device) invalidate_bdev(device->bdev); } - blkdev_put(device->bdev, device->holder); + bdev_release(device->bdev_handle); } static void btrfs_close_one_device(struct btrfs_device *device) @@ -1302,7 +1305,7 @@ struct btrfs_device *btrfs_scan_one_device(const char *path, blk_mode_t flags, struct btrfs_super_block *disk_super; bool new_device_added = false; struct btrfs_device *device = NULL; - struct block_device *bdev; + struct bdev_handle *bdev_handle; u64 bytenr, bytenr_orig; int ret; @@ -1325,18 +1328,19 @@ struct btrfs_device *btrfs_scan_one_device(const char *path, blk_mode_t flags, * values temporarily, as the device paths of the fsid are the only * required information for assembling the volume. */ - bdev = blkdev_get_by_path(path, flags, NULL, NULL); - if (IS_ERR(bdev)) - return ERR_CAST(bdev); + bdev_handle = bdev_open_by_path(path, flags, NULL, NULL); + if (IS_ERR(bdev_handle)) + return ERR_CAST(bdev_handle); bytenr_orig = btrfs_sb_offset(0); - ret = btrfs_sb_log_location_bdev(bdev, 0, READ, &bytenr); + ret = btrfs_sb_log_location_bdev(bdev_handle->bdev, 0, READ, &bytenr); if (ret) { device = ERR_PTR(ret); goto error_bdev_put; } - disk_super = btrfs_read_disk_super(bdev, bytenr, bytenr_orig); + disk_super = btrfs_read_disk_super(bdev_handle->bdev, bytenr, + bytenr_orig); if (IS_ERR(disk_super)) { device = ERR_CAST(disk_super); goto error_bdev_put; @@ -1366,7 +1370,7 @@ struct btrfs_device *btrfs_scan_one_device(const char *path, blk_mode_t flags, btrfs_release_disk_super(disk_super); error_bdev_put: - blkdev_put(bdev, NULL); + bdev_release(bdev_handle); return device; } @@ -2043,7 +2047,7 @@ void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info, int btrfs_rm_device(struct btrfs_fs_info *fs_info, struct btrfs_dev_lookup_args *args, - struct block_device **bdev, void **holder) + struct bdev_handle **bdev_handle) { struct btrfs_trans_handle *trans; struct btrfs_device *device; @@ -2152,7 +2156,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, btrfs_assign_next_active_device(device, NULL); - if (device->bdev) { + if (device->bdev_handle) { cur_devices->open_devices--; /* remove sysfs entry */ btrfs_sysfs_remove_device(device); @@ -2168,9 +2172,9 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, * free the device. * * We cannot call btrfs_close_bdev() here because we're holding the sb - * write lock, and blkdev_put() will pull in the ->open_mutex on the - * block device and it's dependencies. Instead just flush the device - * and let the caller do the final blkdev_put. + * write lock, and bdev_release() will pull in the ->open_mutex on + * the block device and it's dependencies. Instead just flush the + * device and let the caller do the final bdev_release. */ if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { btrfs_scratch_superblocks(fs_info, device->bdev, @@ -2181,8 +2185,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, } } - *bdev = device->bdev; - *holder = device->holder; + *bdev_handle = device->bdev_handle; synchronize_rcu(); btrfs_free_device(device); @@ -2319,7 +2322,7 @@ int btrfs_get_dev_args_from_path(struct btrfs_fs_info *fs_info, const char *path) { struct btrfs_super_block *disk_super; - struct block_device *bdev; + struct bdev_handle *bdev_handle; int ret; if (!path || !path[0]) @@ -2337,7 +2340,7 @@ int btrfs_get_dev_args_from_path(struct btrfs_fs_info *fs_info, } ret = btrfs_get_bdev_and_sb(path, BLK_OPEN_READ, NULL, 0, - &bdev, &disk_super); + &bdev_handle, &disk_super); if (ret) { btrfs_put_dev_args_from_path(args); return ret; @@ -2350,7 +2353,7 @@ int btrfs_get_dev_args_from_path(struct btrfs_fs_info *fs_info, else memcpy(args->fsid, disk_super->fsid, BTRFS_FSID_SIZE); btrfs_release_disk_super(disk_super); - blkdev_put(bdev, NULL); + bdev_release(bdev_handle); return 0; } @@ -2570,7 +2573,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path struct btrfs_root *root = fs_info->dev_root; struct btrfs_trans_handle *trans; struct btrfs_device *device; - struct block_device *bdev; + struct bdev_handle *bdev_handle; struct super_block *sb = fs_info->sb; struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; struct btrfs_fs_devices *seed_devices = NULL; @@ -2583,12 +2586,12 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path if (sb_rdonly(sb) && !fs_devices->seeding) return -EROFS; - bdev = blkdev_get_by_path(device_path, BLK_OPEN_WRITE, - fs_info->bdev_holder, NULL); - if (IS_ERR(bdev)) - return PTR_ERR(bdev); + bdev_handle = bdev_open_by_path(device_path, BLK_OPEN_WRITE, + fs_info->bdev_holder, NULL); + if (IS_ERR(bdev_handle)) + return PTR_ERR(bdev_handle); - if (!btrfs_check_device_zone_type(fs_info, bdev)) { + if (!btrfs_check_device_zone_type(fs_info, bdev_handle->bdev)) { ret = -EINVAL; goto error; } @@ -2600,11 +2603,11 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path locked = true; } - sync_blockdev(bdev); + sync_blockdev(bdev_handle->bdev); rcu_read_lock(); list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) { - if (device->bdev == bdev) { + if (device->bdev == bdev_handle->bdev) { ret = -EEXIST; rcu_read_unlock(); goto error; @@ -2620,7 +2623,8 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path } device->fs_info = fs_info; - device->bdev = bdev; + device->bdev_handle = bdev_handle; + device->bdev = bdev_handle->bdev; ret = lookup_bdev(device_path, &device->devt); if (ret) goto error_free_device; @@ -2641,12 +2645,11 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path device->io_align = fs_info->sectorsize; device->sector_size = fs_info->sectorsize; device->total_bytes = - round_down(bdev_nr_bytes(bdev), fs_info->sectorsize); + round_down(bdev_nr_bytes(device->bdev), fs_info->sectorsize); device->disk_total_bytes = device->total_bytes; device->commit_total_bytes = device->total_bytes; set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state); - device->holder = fs_info->bdev_holder; device->dev_stats_valid = 1; set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE); @@ -2682,7 +2685,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path atomic64_add(device->total_bytes, &fs_info->free_chunk_space); - if (!bdev_nonrot(bdev)) + if (!bdev_nonrot(device->bdev)) fs_devices->rotating = true; orig_super_total_bytes = btrfs_super_total_bytes(fs_info->super_copy); @@ -2804,7 +2807,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path error_free_device: btrfs_free_device(device); error: - blkdev_put(bdev, fs_info->bdev_holder); + bdev_release(bdev_handle); if (locked) { mutex_unlock(&uuid_mutex); up_write(&sb->s_umount); diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 5dd4ad775e5ddc..9cc374864a79fa 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -90,13 +90,11 @@ struct btrfs_device { u64 generation; + struct bdev_handle *bdev_handle; struct block_device *bdev; struct btrfs_zoned_device_info *zone_info; - /* block device holder for blkdev_get/put */ - void *holder; - /* * Device's major-minor number. Must be set even if the device is not * opened (bdev == NULL), unless the device is missing. @@ -648,7 +646,7 @@ struct btrfs_device *btrfs_alloc_device(struct btrfs_fs_info *fs_info, void btrfs_put_dev_args_from_path(struct btrfs_dev_lookup_args *args); int btrfs_rm_device(struct btrfs_fs_info *fs_info, struct btrfs_dev_lookup_args *args, - struct block_device **bdev, void **holder); + struct bdev_handle **bdev_handle); void __exit btrfs_cleanup_fs_uuids(void); int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len); int btrfs_grow_device(struct btrfs_trans_handle *trans, From 0df3381c4646de9b10fa7f2e7f556b7c33c8bd19 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:27 +0200 Subject: [PATCH 169/515] erofs: Convert to use bdev_open_by_path() Convert erofs to use bdev_open_by_path() and pass the handle around. CC: Gao Xiang CC: Chao Yu CC: linux-erofs@lists.ozlabs.org Acked-by: Christoph Hellwig Acked-by: Gao Xiang Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-21-jack@suse.cz Signed-off-by: Christian Brauner --- fs/erofs/data.c | 4 ++-- fs/erofs/internal.h | 2 +- fs/erofs/super.c | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/fs/erofs/data.c b/fs/erofs/data.c index 0c2c99c58b5e3a..f6a0a17485218d 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -222,7 +222,7 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) up_read(&devs->rwsem); return 0; } - map->m_bdev = dif->bdev; + map->m_bdev = dif->bdev_handle->bdev; map->m_daxdev = dif->dax_dev; map->m_dax_part_off = dif->dax_part_off; map->m_fscache = dif->fscache; @@ -240,7 +240,7 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) if (map->m_pa >= startoff && map->m_pa < startoff + length) { map->m_pa -= startoff; - map->m_bdev = dif->bdev; + map->m_bdev = dif->bdev_handle->bdev; map->m_daxdev = dif->dax_dev; map->m_dax_part_off = dif->dax_part_off; map->m_fscache = dif->fscache; diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 4ff88d0dd980fb..cf04e21bfda287 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -47,7 +47,7 @@ typedef u32 erofs_blk_t; struct erofs_device_info { char *path; struct erofs_fscache *fscache; - struct block_device *bdev; + struct bdev_handle *bdev_handle; struct dax_device *dax_dev; u64 dax_part_off; diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 3700af9ee17332..6fd04781fec544 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -227,7 +227,7 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb, struct erofs_sb_info *sbi = EROFS_SB(sb); struct erofs_fscache *fscache; struct erofs_deviceslot *dis; - struct block_device *bdev; + struct bdev_handle *bdev_handle; void *ptr; ptr = erofs_read_metabuf(buf, sb, erofs_blknr(sb, *pos), EROFS_KMAP); @@ -251,13 +251,13 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb, return PTR_ERR(fscache); dif->fscache = fscache; } else if (!sbi->devs->flatdev) { - bdev = blkdev_get_by_path(dif->path, BLK_OPEN_READ, sb->s_type, - NULL); - if (IS_ERR(bdev)) - return PTR_ERR(bdev); - dif->bdev = bdev; - dif->dax_dev = fs_dax_get_by_bdev(bdev, &dif->dax_part_off, - NULL, NULL); + bdev_handle = bdev_open_by_path(dif->path, BLK_OPEN_READ, + sb->s_type, NULL); + if (IS_ERR(bdev_handle)) + return PTR_ERR(bdev_handle); + dif->bdev_handle = bdev_handle; + dif->dax_dev = fs_dax_get_by_bdev(bdev_handle->bdev, + &dif->dax_part_off, NULL, NULL); } dif->blocks = le32_to_cpu(dis->blocks); @@ -806,8 +806,8 @@ static int erofs_release_device_info(int id, void *ptr, void *data) struct erofs_device_info *dif = ptr; fs_put_dax(dif->dax_dev, NULL); - if (dif->bdev) - blkdev_put(dif->bdev, &erofs_fs_type); + if (dif->bdev_handle) + bdev_release(dif->bdev_handle); erofs_fscache_unregister_cookie(dif->fscache); dif->fscache = NULL; kfree(dif->path); From 919273192b6a6e8bc34f8bb138be896d1a1c4650 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:28 +0200 Subject: [PATCH 170/515] ext4: Convert to bdev_open_by_dev() Convert ext4 to use bdev_open_by_dev() and pass the handle around. CC: linux-ext4@vger.kernel.org CC: Ted Tso Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-22-jack@suse.cz Signed-off-by: Christian Brauner --- fs/ext4/ext4.h | 2 +- fs/ext4/fsmap.c | 9 +++++---- fs/ext4/super.c | 52 +++++++++++++++++++++++++------------------------ 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 9418359b1d9d3b..2b3218b49bcad2 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1537,7 +1537,7 @@ struct ext4_sb_info { unsigned long s_commit_interval; u32 s_max_batch_time; u32 s_min_batch_time; - struct block_device *s_journal_bdev; + struct bdev_handle *s_journal_bdev_handle; #ifdef CONFIG_QUOTA /* Names of quota files with journalled quota */ char __rcu *s_qf_names[EXT4_MAXQUOTAS]; diff --git a/fs/ext4/fsmap.c b/fs/ext4/fsmap.c index cdf9bfe10137ff..11e6f33677a2c8 100644 --- a/fs/ext4/fsmap.c +++ b/fs/ext4/fsmap.c @@ -576,8 +576,9 @@ static bool ext4_getfsmap_is_valid_device(struct super_block *sb, if (fm->fmr_device == 0 || fm->fmr_device == UINT_MAX || fm->fmr_device == new_encode_dev(sb->s_bdev->bd_dev)) return true; - if (EXT4_SB(sb)->s_journal_bdev && - fm->fmr_device == new_encode_dev(EXT4_SB(sb)->s_journal_bdev->bd_dev)) + if (EXT4_SB(sb)->s_journal_bdev_handle && + fm->fmr_device == + new_encode_dev(EXT4_SB(sb)->s_journal_bdev_handle->bdev->bd_dev)) return true; return false; } @@ -647,9 +648,9 @@ int ext4_getfsmap(struct super_block *sb, struct ext4_fsmap_head *head, memset(handlers, 0, sizeof(handlers)); handlers[0].gfd_dev = new_encode_dev(sb->s_bdev->bd_dev); handlers[0].gfd_fn = ext4_getfsmap_datadev; - if (EXT4_SB(sb)->s_journal_bdev) { + if (EXT4_SB(sb)->s_journal_bdev_handle) { handlers[1].gfd_dev = new_encode_dev( - EXT4_SB(sb)->s_journal_bdev->bd_dev); + EXT4_SB(sb)->s_journal_bdev_handle->bdev->bd_dev); handlers[1].gfd_fn = ext4_getfsmap_logdev; } diff --git a/fs/ext4/super.c b/fs/ext4/super.c index dbebd8b3127e51..d43f8324242a38 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1351,14 +1351,14 @@ static void ext4_put_super(struct super_block *sb) sync_blockdev(sb->s_bdev); invalidate_bdev(sb->s_bdev); - if (sbi->s_journal_bdev) { + if (sbi->s_journal_bdev_handle) { /* * Invalidate the journal device's buffers. We don't want them * floating about in memory - the physical journal device may * hotswapped, and it breaks the `ro-after' testing code. */ - sync_blockdev(sbi->s_journal_bdev); - invalidate_bdev(sbi->s_journal_bdev); + sync_blockdev(sbi->s_journal_bdev_handle->bdev); + invalidate_bdev(sbi->s_journal_bdev_handle->bdev); } ext4_xattr_destroy_cache(sbi->s_ea_inode_cache); @@ -4233,7 +4233,7 @@ int ext4_calculate_overhead(struct super_block *sb) * Add the internal journal blocks whether the journal has been * loaded or not */ - if (sbi->s_journal && !sbi->s_journal_bdev) + if (sbi->s_journal && !sbi->s_journal_bdev_handle) overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_total_len); else if (ext4_has_feature_journal(sb) && !sbi->s_journal && j_inum) { /* j_inum for internal journal is non-zero */ @@ -5670,9 +5670,9 @@ failed_mount9: __maybe_unused #endif fscrypt_free_dummy_policy(&sbi->s_dummy_enc_policy); brelse(sbi->s_sbh); - if (sbi->s_journal_bdev) { - invalidate_bdev(sbi->s_journal_bdev); - blkdev_put(sbi->s_journal_bdev, sb); + if (sbi->s_journal_bdev_handle) { + invalidate_bdev(sbi->s_journal_bdev_handle->bdev); + bdev_release(sbi->s_journal_bdev_handle); } out_fail: invalidate_bdev(sb->s_bdev); @@ -5842,12 +5842,13 @@ static journal_t *ext4_open_inode_journal(struct super_block *sb, return journal; } -static struct block_device *ext4_get_journal_blkdev(struct super_block *sb, +static struct bdev_handle *ext4_get_journal_blkdev(struct super_block *sb, dev_t j_dev, ext4_fsblk_t *j_start, ext4_fsblk_t *j_len) { struct buffer_head *bh; struct block_device *bdev; + struct bdev_handle *bdev_handle; int hblock, blocksize; ext4_fsblk_t sb_block; unsigned long offset; @@ -5856,16 +5857,17 @@ static struct block_device *ext4_get_journal_blkdev(struct super_block *sb, /* see get_tree_bdev why this is needed and safe */ up_write(&sb->s_umount); - bdev = blkdev_get_by_dev(j_dev, BLK_OPEN_READ | BLK_OPEN_WRITE, sb, - &fs_holder_ops); + bdev_handle = bdev_open_by_dev(j_dev, BLK_OPEN_READ | BLK_OPEN_WRITE, + sb, &fs_holder_ops); down_write(&sb->s_umount); - if (IS_ERR(bdev)) { + if (IS_ERR(bdev_handle)) { ext4_msg(sb, KERN_ERR, "failed to open journal device unknown-block(%u,%u) %ld", - MAJOR(j_dev), MINOR(j_dev), PTR_ERR(bdev)); - return ERR_CAST(bdev); + MAJOR(j_dev), MINOR(j_dev), PTR_ERR(bdev_handle)); + return bdev_handle; } + bdev = bdev_handle->bdev; blocksize = sb->s_blocksize; hblock = bdev_logical_block_size(bdev); if (blocksize < hblock) { @@ -5912,12 +5914,12 @@ static struct block_device *ext4_get_journal_blkdev(struct super_block *sb, *j_start = sb_block + 1; *j_len = ext4_blocks_count(es); brelse(bh); - return bdev; + return bdev_handle; out_bh: brelse(bh); out_bdev: - blkdev_put(bdev, sb); + bdev_release(bdev_handle); return ERR_PTR(errno); } @@ -5927,14 +5929,14 @@ static journal_t *ext4_open_dev_journal(struct super_block *sb, journal_t *journal; ext4_fsblk_t j_start; ext4_fsblk_t j_len; - struct block_device *journal_bdev; + struct bdev_handle *bdev_handle; int errno = 0; - journal_bdev = ext4_get_journal_blkdev(sb, j_dev, &j_start, &j_len); - if (IS_ERR(journal_bdev)) - return ERR_CAST(journal_bdev); + bdev_handle = ext4_get_journal_blkdev(sb, j_dev, &j_start, &j_len); + if (IS_ERR(bdev_handle)) + return ERR_CAST(bdev_handle); - journal = jbd2_journal_init_dev(journal_bdev, sb->s_bdev, j_start, + journal = jbd2_journal_init_dev(bdev_handle->bdev, sb->s_bdev, j_start, j_len, sb->s_blocksize); if (IS_ERR(journal)) { ext4_msg(sb, KERN_ERR, "failed to create device journal"); @@ -5949,14 +5951,14 @@ static journal_t *ext4_open_dev_journal(struct super_block *sb, goto out_journal; } journal->j_private = sb; - EXT4_SB(sb)->s_journal_bdev = journal_bdev; + EXT4_SB(sb)->s_journal_bdev_handle = bdev_handle; ext4_init_journal_params(sb, journal); return journal; out_journal: jbd2_journal_destroy(journal); out_bdev: - blkdev_put(journal_bdev, sb); + bdev_release(bdev_handle); return ERR_PTR(errno); } @@ -7300,12 +7302,12 @@ static inline int ext3_feature_set_ok(struct super_block *sb) static void ext4_kill_sb(struct super_block *sb) { struct ext4_sb_info *sbi = EXT4_SB(sb); - struct block_device *journal_bdev = sbi ? sbi->s_journal_bdev : NULL; + struct bdev_handle *handle = sbi ? sbi->s_journal_bdev_handle : NULL; kill_block_super(sb); - if (journal_bdev) - blkdev_put(journal_bdev, sb); + if (handle) + bdev_release(handle); } static struct file_system_type ext4_fs_type = { From 174f23c885fae717dd71a5243b33f03288d3b5a9 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:29 +0200 Subject: [PATCH 171/515] f2fs: Convert to bdev_open_by_dev/path() Convert f2fs to use bdev_open_by_dev/path() and pass the handle around. CC: Jaegeuk Kim CC: Chao Yu CC: linux-f2fs-devel@lists.sourceforge.net Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-23-jack@suse.cz Signed-off-by: Christian Brauner --- fs/f2fs/f2fs.h | 1 + fs/f2fs/super.c | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 6d688e42d89c59..3878288122eec5 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1234,6 +1234,7 @@ struct f2fs_bio_info { #define FDEV(i) (sbi->devs[i]) #define RDEV(i) (raw_super->devs[i]) struct f2fs_dev_info { + struct bdev_handle *bdev_handle; struct block_device *bdev; char path[MAX_PATH_LEN]; unsigned int total_segments; diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index a8c8232852bb18..027c3ee0398503 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1562,7 +1562,7 @@ static void destroy_device_list(struct f2fs_sb_info *sbi) for (i = 0; i < sbi->s_ndevs; i++) { if (i > 0) - blkdev_put(FDEV(i).bdev, sbi->sb); + bdev_release(FDEV(i).bdev_handle); #ifdef CONFIG_BLK_DEV_ZONED kvfree(FDEV(i).blkz_seq); #endif @@ -4198,7 +4198,7 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi) for (i = 0; i < max_devices; i++) { if (i == 0) - FDEV(0).bdev = sbi->sb->s_bdev; + FDEV(0).bdev_handle = sbi->sb->s_bdev_handle; else if (!RDEV(i).path[0]) break; @@ -4218,13 +4218,14 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi) FDEV(i).end_blk = FDEV(i).start_blk + (FDEV(i).total_segments << sbi->log_blocks_per_seg) - 1; - FDEV(i).bdev = blkdev_get_by_path(FDEV(i).path, - mode, sbi->sb, NULL); + FDEV(i).bdev_handle = bdev_open_by_path( + FDEV(i).path, mode, sbi->sb, NULL); } } - if (IS_ERR(FDEV(i).bdev)) - return PTR_ERR(FDEV(i).bdev); + if (IS_ERR(FDEV(i).bdev_handle)) + return PTR_ERR(FDEV(i).bdev_handle); + FDEV(i).bdev = FDEV(i).bdev_handle->bdev; /* to release errored devices */ sbi->s_ndevs = i + 1; From c65fec24f14428637500d8c32180ff32d28172f9 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:30 +0200 Subject: [PATCH 172/515] jfs: Convert to bdev_open_by_dev() Convert jfs to use bdev_open_by_dev() and pass the handle around. CC: Dave Kleikamp CC: jfs-discussion@lists.sourceforge.net Acked-by: Christoph Hellwig Acked-by: Dave Kleikamp Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-24-jack@suse.cz Signed-off-by: Christian Brauner --- fs/jfs/jfs_logmgr.c | 29 +++++++++++++++-------------- fs/jfs/jfs_logmgr.h | 2 +- fs/jfs/jfs_mount.c | 3 ++- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index e855b8fde76ce1..c911d838b8ec8c 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -1058,7 +1058,7 @@ void jfs_syncpt(struct jfs_log *log, int hard_sync) int lmLogOpen(struct super_block *sb) { int rc; - struct block_device *bdev; + struct bdev_handle *bdev_handle; struct jfs_log *log; struct jfs_sb_info *sbi = JFS_SBI(sb); @@ -1070,7 +1070,7 @@ int lmLogOpen(struct super_block *sb) mutex_lock(&jfs_log_mutex); list_for_each_entry(log, &jfs_external_logs, journal_list) { - if (log->bdev->bd_dev == sbi->logdev) { + if (log->bdev_handle->bdev->bd_dev == sbi->logdev) { if (!uuid_equal(&log->uuid, &sbi->loguuid)) { jfs_warn("wrong uuid on JFS journal"); mutex_unlock(&jfs_log_mutex); @@ -1100,14 +1100,14 @@ int lmLogOpen(struct super_block *sb) * file systems to log may have n-to-1 relationship; */ - bdev = blkdev_get_by_dev(sbi->logdev, BLK_OPEN_READ | BLK_OPEN_WRITE, - log, NULL); - if (IS_ERR(bdev)) { - rc = PTR_ERR(bdev); + bdev_handle = bdev_open_by_dev(sbi->logdev, + BLK_OPEN_READ | BLK_OPEN_WRITE, log, NULL); + if (IS_ERR(bdev_handle)) { + rc = PTR_ERR(bdev_handle); goto free; } - log->bdev = bdev; + log->bdev_handle = bdev_handle; uuid_copy(&log->uuid, &sbi->loguuid); /* @@ -1141,7 +1141,7 @@ int lmLogOpen(struct super_block *sb) lbmLogShutdown(log); close: /* close external log device */ - blkdev_put(bdev, log); + bdev_release(bdev_handle); free: /* free log descriptor */ mutex_unlock(&jfs_log_mutex); @@ -1162,7 +1162,7 @@ static int open_inline_log(struct super_block *sb) init_waitqueue_head(&log->syncwait); set_bit(log_INLINELOG, &log->flag); - log->bdev = sb->s_bdev; + log->bdev_handle = sb->s_bdev_handle; log->base = addressPXD(&JFS_SBI(sb)->logpxd); log->size = lengthPXD(&JFS_SBI(sb)->logpxd) >> (L2LOGPSIZE - sb->s_blocksize_bits); @@ -1436,7 +1436,7 @@ int lmLogClose(struct super_block *sb) { struct jfs_sb_info *sbi = JFS_SBI(sb); struct jfs_log *log = sbi->log; - struct block_device *bdev; + struct bdev_handle *bdev_handle; int rc = 0; jfs_info("lmLogClose: log:0x%p", log); @@ -1482,10 +1482,10 @@ int lmLogClose(struct super_block *sb) * external log as separate logical volume */ list_del(&log->journal_list); - bdev = log->bdev; + bdev_handle = log->bdev_handle; rc = lmLogShutdown(log); - blkdev_put(bdev, log); + bdev_release(bdev_handle); kfree(log); @@ -1972,7 +1972,7 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) bp->l_flag |= lbmREAD; - bio = bio_alloc(log->bdev, 1, REQ_OP_READ, GFP_NOFS); + bio = bio_alloc(log->bdev_handle->bdev, 1, REQ_OP_READ, GFP_NOFS); bio->bi_iter.bi_sector = bp->l_blkno << (log->l2bsize - 9); __bio_add_page(bio, bp->l_page, LOGPSIZE, bp->l_offset); BUG_ON(bio->bi_iter.bi_size != LOGPSIZE); @@ -2113,7 +2113,8 @@ static void lbmStartIO(struct lbuf * bp) jfs_info("lbmStartIO"); - bio = bio_alloc(log->bdev, 1, REQ_OP_WRITE | REQ_SYNC, GFP_NOFS); + bio = bio_alloc(log->bdev_handle->bdev, 1, REQ_OP_WRITE | REQ_SYNC, + GFP_NOFS); bio->bi_iter.bi_sector = bp->l_blkno << (log->l2bsize - 9); __bio_add_page(bio, bp->l_page, LOGPSIZE, bp->l_offset); BUG_ON(bio->bi_iter.bi_size != LOGPSIZE); diff --git a/fs/jfs/jfs_logmgr.h b/fs/jfs/jfs_logmgr.h index 805877ce502044..84aa2d25390743 100644 --- a/fs/jfs/jfs_logmgr.h +++ b/fs/jfs/jfs_logmgr.h @@ -356,7 +356,7 @@ struct jfs_log { * before writing syncpt. */ struct list_head journal_list; /* Global list */ - struct block_device *bdev; /* 4: log lv pointer */ + struct bdev_handle *bdev_handle; /* 4: log lv pointer */ int serial; /* 4: log mount serial number */ s64 base; /* @8: log extent address (inline log ) */ diff --git a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c index b83aae56a1f261..415eb65a36ffcb 100644 --- a/fs/jfs/jfs_mount.c +++ b/fs/jfs/jfs_mount.c @@ -430,7 +430,8 @@ int updateSuper(struct super_block *sb, uint state) if (state == FM_MOUNT) { /* record log's dev_t and mount serial number */ - j_sb->s_logdev = cpu_to_le32(new_encode_dev(sbi->log->bdev->bd_dev)); + j_sb->s_logdev = cpu_to_le32( + new_encode_dev(sbi->log->bdev_handle->bdev->bd_dev)); j_sb->s_logserial = cpu_to_le32(sbi->log->serial); } else if (state == FM_CLEAN) { /* From 1460fa65fdc89c7b5cbc4c03e806fe7b485869f2 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:31 +0200 Subject: [PATCH 173/515] nfs/blocklayout: Convert to use bdev_open_by_dev/path() Convert block device handling to use bdev_open_by_dev/path() and pass the handle around. CC: linux-nfs@vger.kernel.org CC: Trond Myklebust CC: Anna Schumaker Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-25-jack@suse.cz Signed-off-by: Christian Brauner --- fs/nfs/blocklayout/blocklayout.h | 2 +- fs/nfs/blocklayout/dev.c | 76 ++++++++++++++++---------------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h index 716bc75e9ed2a5..b4294a8aa2d4c5 100644 --- a/fs/nfs/blocklayout/blocklayout.h +++ b/fs/nfs/blocklayout/blocklayout.h @@ -108,7 +108,7 @@ struct pnfs_block_dev { struct pnfs_block_dev *children; u64 chunk_size; - struct block_device *bdev; + struct bdev_handle *bdev_handle; u64 disk_offset; u64 pr_key; diff --git a/fs/nfs/blocklayout/dev.c b/fs/nfs/blocklayout/dev.c index 65cbb5607a5fc4..f318a05a80e17a 100644 --- a/fs/nfs/blocklayout/dev.c +++ b/fs/nfs/blocklayout/dev.c @@ -25,17 +25,17 @@ bl_free_device(struct pnfs_block_dev *dev) } else { if (dev->pr_registered) { const struct pr_ops *ops = - dev->bdev->bd_disk->fops->pr_ops; + dev->bdev_handle->bdev->bd_disk->fops->pr_ops; int error; - error = ops->pr_register(dev->bdev, dev->pr_key, 0, - false); + error = ops->pr_register(dev->bdev_handle->bdev, + dev->pr_key, 0, false); if (error) pr_err("failed to unregister PR key.\n"); } - if (dev->bdev) - blkdev_put(dev->bdev, NULL); + if (dev->bdev_handle) + bdev_release(dev->bdev_handle); } } @@ -169,7 +169,7 @@ static bool bl_map_simple(struct pnfs_block_dev *dev, u64 offset, map->start = dev->start; map->len = dev->len; map->disk_offset = dev->disk_offset; - map->bdev = dev->bdev; + map->bdev = dev->bdev_handle->bdev; return true; } @@ -236,28 +236,26 @@ bl_parse_simple(struct nfs_server *server, struct pnfs_block_dev *d, struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask) { struct pnfs_block_volume *v = &volumes[idx]; - struct block_device *bdev; + struct bdev_handle *bdev_handle; dev_t dev; dev = bl_resolve_deviceid(server, v, gfp_mask); if (!dev) return -EIO; - bdev = blkdev_get_by_dev(dev, BLK_OPEN_READ | BLK_OPEN_WRITE, NULL, - NULL); - if (IS_ERR(bdev)) { + bdev_handle = bdev_open_by_dev(dev, BLK_OPEN_READ | BLK_OPEN_WRITE, + NULL, NULL); + if (IS_ERR(bdev_handle)) { printk(KERN_WARNING "pNFS: failed to open device %d:%d (%ld)\n", - MAJOR(dev), MINOR(dev), PTR_ERR(bdev)); - return PTR_ERR(bdev); + MAJOR(dev), MINOR(dev), PTR_ERR(bdev_handle)); + return PTR_ERR(bdev_handle); } - d->bdev = bdev; - - - d->len = bdev_nr_bytes(d->bdev); + d->bdev_handle = bdev_handle; + d->len = bdev_nr_bytes(bdev_handle->bdev); d->map = bl_map_simple; printk(KERN_INFO "pNFS: using block device %s\n", - d->bdev->bd_disk->disk_name); + bdev_handle->bdev->bd_disk->disk_name); return 0; } @@ -302,10 +300,10 @@ bl_validate_designator(struct pnfs_block_volume *v) } } -static struct block_device * +static struct bdev_handle * bl_open_path(struct pnfs_block_volume *v, const char *prefix) { - struct block_device *bdev; + struct bdev_handle *bdev_handle; const char *devname; devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/%s%*phN", @@ -313,15 +311,15 @@ bl_open_path(struct pnfs_block_volume *v, const char *prefix) if (!devname) return ERR_PTR(-ENOMEM); - bdev = blkdev_get_by_path(devname, BLK_OPEN_READ | BLK_OPEN_WRITE, NULL, - NULL); - if (IS_ERR(bdev)) { + bdev_handle = bdev_open_by_path(devname, BLK_OPEN_READ | BLK_OPEN_WRITE, + NULL, NULL); + if (IS_ERR(bdev_handle)) { pr_warn("pNFS: failed to open device %s (%ld)\n", - devname, PTR_ERR(bdev)); + devname, PTR_ERR(bdev_handle)); } kfree(devname); - return bdev; + return bdev_handle; } static int @@ -329,7 +327,7 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d, struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask) { struct pnfs_block_volume *v = &volumes[idx]; - struct block_device *bdev; + struct bdev_handle *bdev_handle; const struct pr_ops *ops; int error; @@ -342,32 +340,32 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d, * On other distributions like Debian, the default SCSI by-id path will * point to the dm-multipath device if one exists. */ - bdev = bl_open_path(v, "dm-uuid-mpath-0x"); - if (IS_ERR(bdev)) - bdev = bl_open_path(v, "wwn-0x"); - if (IS_ERR(bdev)) - return PTR_ERR(bdev); - d->bdev = bdev; - - d->len = bdev_nr_bytes(d->bdev); + bdev_handle = bl_open_path(v, "dm-uuid-mpath-0x"); + if (IS_ERR(bdev_handle)) + bdev_handle = bl_open_path(v, "wwn-0x"); + if (IS_ERR(bdev_handle)) + return PTR_ERR(bdev_handle); + d->bdev_handle = bdev_handle; + + d->len = bdev_nr_bytes(d->bdev_handle->bdev); d->map = bl_map_simple; d->pr_key = v->scsi.pr_key; pr_info("pNFS: using block device %s (reservation key 0x%llx)\n", - d->bdev->bd_disk->disk_name, d->pr_key); + d->bdev_handle->bdev->bd_disk->disk_name, d->pr_key); - ops = d->bdev->bd_disk->fops->pr_ops; + ops = d->bdev_handle->bdev->bd_disk->fops->pr_ops; if (!ops) { pr_err("pNFS: block device %s does not support reservations.", - d->bdev->bd_disk->disk_name); + d->bdev_handle->bdev->bd_disk->disk_name); error = -EINVAL; goto out_blkdev_put; } - error = ops->pr_register(d->bdev, 0, d->pr_key, true); + error = ops->pr_register(d->bdev_handle->bdev, 0, d->pr_key, true); if (error) { pr_err("pNFS: failed to register key for block device %s.", - d->bdev->bd_disk->disk_name); + d->bdev_handle->bdev->bd_disk->disk_name); goto out_blkdev_put; } @@ -375,7 +373,7 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d, return 0; out_blkdev_put: - blkdev_put(d->bdev, NULL); + bdev_release(d->bdev_handle); return error; } From 1408aa73bb2ba89c9d644e4e2040cd9eced82a5b Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:32 +0200 Subject: [PATCH 174/515] ocfs2: Convert to use bdev_open_by_dev() Convert ocfs2 heartbeat code to use bdev_open_by_dev() and pass the handle around. CC: Joseph Qi CC: ocfs2-devel@oss.oracle.com Acked-by: Christoph Hellwig Reviewed-by: Joseph Qi Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-26-jack@suse.cz Signed-off-by: Christian Brauner --- fs/ocfs2/cluster/heartbeat.c | 81 ++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 21472e3ed182aa..4d7efefa98c5ec 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -213,7 +213,7 @@ struct o2hb_region { unsigned int hr_num_pages; struct page **hr_slot_data; - struct block_device *hr_bdev; + struct bdev_handle *hr_bdev_handle; struct o2hb_disk_slot *hr_slots; /* live node map of this region */ @@ -261,6 +261,11 @@ struct o2hb_region { int hr_last_hb_status; }; +static inline struct block_device *reg_bdev(struct o2hb_region *reg) +{ + return reg->hr_bdev_handle ? reg->hr_bdev_handle->bdev : NULL; +} + struct o2hb_bio_wait_ctxt { atomic_t wc_num_reqs; struct completion wc_io_complete; @@ -286,7 +291,7 @@ static void o2hb_write_timeout(struct work_struct *work) hr_write_timeout_work.work); mlog(ML_ERROR, "Heartbeat write timeout to device %pg after %u " - "milliseconds\n", reg->hr_bdev, + "milliseconds\n", reg_bdev(reg), jiffies_to_msecs(jiffies - reg->hr_last_timeout_start)); if (o2hb_global_heartbeat_active()) { @@ -383,7 +388,7 @@ static void o2hb_nego_timeout(struct work_struct *work) if (!test_bit(master_node, reg->hr_nego_node_bitmap)) { printk(KERN_NOTICE "o2hb: node %d hb write hung for %ds on region %s (%pg).\n", o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000, - config_item_name(®->hr_item), reg->hr_bdev); + config_item_name(®->hr_item), reg_bdev(reg)); set_bit(master_node, reg->hr_nego_node_bitmap); } if (!bitmap_equal(reg->hr_nego_node_bitmap, live_node_bitmap, @@ -398,7 +403,8 @@ static void o2hb_nego_timeout(struct work_struct *work) } printk(KERN_NOTICE "o2hb: all nodes hb write hung, maybe region %s (%pg) is down.\n", - config_item_name(®->hr_item), reg->hr_bdev); + config_item_name(®->hr_item), + reg_bdev(reg)); /* approve negotiate timeout request. */ o2hb_arm_timeout(reg); @@ -419,7 +425,7 @@ static void o2hb_nego_timeout(struct work_struct *work) /* negotiate timeout with master node. */ printk(KERN_NOTICE "o2hb: node %d hb write hung for %ds on region %s (%pg), negotiate timeout with node %d.\n", o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000, config_item_name(®->hr_item), - reg->hr_bdev, master_node); + reg_bdev(reg), master_node); ret = o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG, master_node); if (ret) @@ -436,7 +442,8 @@ static int o2hb_nego_timeout_handler(struct o2net_msg *msg, u32 len, void *data, nego_msg = (struct o2hb_nego_msg *)msg->buf; printk(KERN_NOTICE "o2hb: receive negotiate timeout message from node %d on region %s (%pg).\n", - nego_msg->node_num, config_item_name(®->hr_item), reg->hr_bdev); + nego_msg->node_num, config_item_name(®->hr_item), + reg_bdev(reg)); if (nego_msg->node_num < O2NM_MAX_NODES) set_bit(nego_msg->node_num, reg->hr_nego_node_bitmap); else @@ -451,7 +458,7 @@ static int o2hb_nego_approve_handler(struct o2net_msg *msg, u32 len, void *data, struct o2hb_region *reg = data; printk(KERN_NOTICE "o2hb: negotiate timeout approved by master node on region %s (%pg).\n", - config_item_name(®->hr_item), reg->hr_bdev); + config_item_name(®->hr_item), reg_bdev(reg)); o2hb_arm_timeout(reg); return 0; } @@ -515,7 +522,7 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, * GFP_KERNEL that the local node can get fenced. It would be * nicest if we could pre-allocate these bios and avoid this * all together. */ - bio = bio_alloc(reg->hr_bdev, 16, opf, GFP_ATOMIC); + bio = bio_alloc(reg_bdev(reg), 16, opf, GFP_ATOMIC); if (!bio) { mlog(ML_ERROR, "Could not alloc slots BIO!\n"); bio = ERR_PTR(-ENOMEM); @@ -687,7 +694,7 @@ static int o2hb_check_own_slot(struct o2hb_region *reg) errstr = ERRSTR3; mlog(ML_ERROR, "%s (%pg): expected(%u:0x%llx, 0x%llx), " - "ondisk(%u:0x%llx, 0x%llx)\n", errstr, reg->hr_bdev, + "ondisk(%u:0x%llx, 0x%llx)\n", errstr, reg_bdev(reg), slot->ds_node_num, (unsigned long long)slot->ds_last_generation, (unsigned long long)slot->ds_last_time, hb_block->hb_node, (unsigned long long)le64_to_cpu(hb_block->hb_generation), @@ -861,7 +868,7 @@ static void o2hb_set_quorum_device(struct o2hb_region *reg) goto unlock; printk(KERN_NOTICE "o2hb: Region %s (%pg) is now a quorum device\n", - config_item_name(®->hr_item), reg->hr_bdev); + config_item_name(®->hr_item), reg_bdev(reg)); set_bit(reg->hr_region_num, o2hb_quorum_region_bitmap); @@ -920,7 +927,7 @@ static int o2hb_check_slot(struct o2hb_region *reg, * consider it a transient miss but don't populate any * other values as they may be junk. */ mlog(ML_ERROR, "Node %d has written a bad crc to %pg\n", - slot->ds_node_num, reg->hr_bdev); + slot->ds_node_num, reg_bdev(reg)); o2hb_dump_slot(hb_block); slot->ds_equal_samples++; @@ -1003,8 +1010,8 @@ static int o2hb_check_slot(struct o2hb_region *reg, "of %u ms, but our count is %u ms.\n" "Please double check your configuration values " "for 'O2CB_HEARTBEAT_THRESHOLD'\n", - slot->ds_node_num, reg->hr_bdev, slot_dead_ms, - dead_ms); + slot->ds_node_num, reg_bdev(reg), + slot_dead_ms, dead_ms); } goto out; } @@ -1143,7 +1150,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg) * can't be sure that the new block ever made it to * disk */ mlog(ML_ERROR, "Write error %d on device \"%pg\"\n", - write_wc.wc_error, reg->hr_bdev); + write_wc.wc_error, reg_bdev(reg)); ret = write_wc.wc_error; goto bail; } @@ -1169,7 +1176,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg) printk(KERN_NOTICE "o2hb: Unable to stabilize " "heartbeat on region %s (%pg)\n", config_item_name(®->hr_item), - reg->hr_bdev); + reg_bdev(reg)); atomic_set(®->hr_steady_iterations, 0); reg->hr_aborted_start = 1; wake_up(&o2hb_steady_queue); @@ -1489,7 +1496,7 @@ static void o2hb_region_release(struct config_item *item) struct page *page; struct o2hb_region *reg = to_o2hb_region(item); - mlog(ML_HEARTBEAT, "hb region release (%pg)\n", reg->hr_bdev); + mlog(ML_HEARTBEAT, "hb region release (%pg)\n", reg_bdev(reg)); kfree(reg->hr_tmp_block); @@ -1502,8 +1509,8 @@ static void o2hb_region_release(struct config_item *item) kfree(reg->hr_slot_data); } - if (reg->hr_bdev) - blkdev_put(reg->hr_bdev, NULL); + if (reg->hr_bdev_handle) + bdev_release(reg->hr_bdev_handle); kfree(reg->hr_slots); @@ -1562,7 +1569,7 @@ static ssize_t o2hb_region_block_bytes_store(struct config_item *item, unsigned long block_bytes; unsigned int block_bits; - if (reg->hr_bdev) + if (reg->hr_bdev_handle) return -EINVAL; status = o2hb_read_block_input(reg, page, &block_bytes, @@ -1591,7 +1598,7 @@ static ssize_t o2hb_region_start_block_store(struct config_item *item, char *p = (char *)page; ssize_t ret; - if (reg->hr_bdev) + if (reg->hr_bdev_handle) return -EINVAL; ret = kstrtoull(p, 0, &tmp); @@ -1616,7 +1623,7 @@ static ssize_t o2hb_region_blocks_store(struct config_item *item, unsigned long tmp; char *p = (char *)page; - if (reg->hr_bdev) + if (reg->hr_bdev_handle) return -EINVAL; tmp = simple_strtoul(p, &p, 0); @@ -1635,8 +1642,8 @@ static ssize_t o2hb_region_dev_show(struct config_item *item, char *page) { unsigned int ret = 0; - if (to_o2hb_region(item)->hr_bdev) - ret = sprintf(page, "%pg\n", to_o2hb_region(item)->hr_bdev); + if (to_o2hb_region(item)->hr_bdev_handle) + ret = sprintf(page, "%pg\n", reg_bdev(to_o2hb_region(item))); return ret; } @@ -1745,7 +1752,10 @@ static int o2hb_populate_slot_data(struct o2hb_region *reg) return ret; } -/* this is acting as commit; we set up all of hr_bdev and hr_task or nothing */ +/* + * this is acting as commit; we set up all of hr_bdev_handle and hr_task or + * nothing + */ static ssize_t o2hb_region_dev_store(struct config_item *item, const char *page, size_t count) @@ -1759,7 +1769,7 @@ static ssize_t o2hb_region_dev_store(struct config_item *item, ssize_t ret = -EINVAL; int live_threshold; - if (reg->hr_bdev) + if (reg->hr_bdev_handle) goto out; /* We can't heartbeat without having had our node number @@ -1785,16 +1795,15 @@ static ssize_t o2hb_region_dev_store(struct config_item *item, if (!S_ISBLK(f.file->f_mapping->host->i_mode)) goto out2; - reg->hr_bdev = blkdev_get_by_dev(f.file->f_mapping->host->i_rdev, - BLK_OPEN_WRITE | BLK_OPEN_READ, NULL, - NULL); - if (IS_ERR(reg->hr_bdev)) { - ret = PTR_ERR(reg->hr_bdev); - reg->hr_bdev = NULL; + reg->hr_bdev_handle = bdev_open_by_dev(f.file->f_mapping->host->i_rdev, + BLK_OPEN_WRITE | BLK_OPEN_READ, NULL, NULL); + if (IS_ERR(reg->hr_bdev_handle)) { + ret = PTR_ERR(reg->hr_bdev_handle); + reg->hr_bdev_handle = NULL; goto out2; } - sectsize = bdev_logical_block_size(reg->hr_bdev); + sectsize = bdev_logical_block_size(reg_bdev(reg)); if (sectsize != reg->hr_block_bytes) { mlog(ML_ERROR, "blocksize %u incorrect for device, expected %d", @@ -1890,12 +1899,12 @@ static ssize_t o2hb_region_dev_store(struct config_item *item, if (hb_task && o2hb_global_heartbeat_active()) printk(KERN_NOTICE "o2hb: Heartbeat started on region %s (%pg)\n", - config_item_name(®->hr_item), reg->hr_bdev); + config_item_name(®->hr_item), reg_bdev(reg)); out3: if (ret < 0) { - blkdev_put(reg->hr_bdev, NULL); - reg->hr_bdev = NULL; + bdev_release(reg->hr_bdev_handle); + reg->hr_bdev_handle = NULL; } out2: fdput(f); @@ -2085,7 +2094,7 @@ static void o2hb_heartbeat_group_drop_item(struct config_group *group, printk(KERN_NOTICE "o2hb: Heartbeat %s on region %s (%pg)\n", ((atomic_read(®->hr_steady_iterations) == 0) ? "stopped" : "start aborted"), config_item_name(item), - reg->hr_bdev); + reg_bdev(reg)); } /* From 14133e58f172e924badc684ee63966a12f02f3f4 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:33 +0200 Subject: [PATCH 175/515] reiserfs: Convert to bdev_open_by_dev/path() Convert reiserfs to use bdev_open_by_dev/path() and pass the handle around. CC: reiserfs-devel@vger.kernel.org Acked-by: Christoph Hellwig Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-27-jack@suse.cz Signed-off-by: Christian Brauner --- fs/reiserfs/journal.c | 56 +++++++++++++++++++----------------------- fs/reiserfs/procfs.c | 2 +- fs/reiserfs/reiserfs.h | 11 ++++++--- 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 015bfe4e452417..171c912af50f6f 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -90,8 +90,7 @@ static int flush_commit_list(struct super_block *s, static int can_dirty(struct reiserfs_journal_cnode *cn); static int journal_join(struct reiserfs_transaction_handle *th, struct super_block *sb); -static void release_journal_dev(struct super_block *super, - struct reiserfs_journal *journal); +static void release_journal_dev(struct reiserfs_journal *journal); static void dirty_one_transaction(struct super_block *s, struct reiserfs_journal_list *jl); static void flush_async_commits(struct work_struct *work); @@ -1893,7 +1892,7 @@ static void free_journal_ram(struct super_block *sb) * j_header_bh is on the journal dev, make sure * not to release the journal dev until we brelse j_header_bh */ - release_journal_dev(sb, journal); + release_journal_dev(journal); vfree(journal); } @@ -2387,7 +2386,7 @@ static int journal_read(struct super_block *sb) cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb); reiserfs_info(sb, "checking transaction log (%pg)\n", - journal->j_dev_bd); + journal->j_bdev_handle->bdev); start = ktime_get_seconds(); /* @@ -2448,7 +2447,7 @@ static int journal_read(struct super_block *sb) * device and journal device to be the same */ d_bh = - reiserfs_breada(journal->j_dev_bd, cur_dblock, + reiserfs_breada(journal->j_bdev_handle->bdev, cur_dblock, sb->s_blocksize, SB_ONDISK_JOURNAL_1st_BLOCK(sb) + SB_ONDISK_JOURNAL_SIZE(sb)); @@ -2587,17 +2586,11 @@ static void journal_list_init(struct super_block *sb) SB_JOURNAL(sb)->j_current_jl = alloc_journal_list(sb); } -static void release_journal_dev(struct super_block *super, - struct reiserfs_journal *journal) +static void release_journal_dev(struct reiserfs_journal *journal) { - if (journal->j_dev_bd != NULL) { - void *holder = NULL; - - if (journal->j_dev_bd->bd_dev != super->s_dev) - holder = journal; - - blkdev_put(journal->j_dev_bd, holder); - journal->j_dev_bd = NULL; + if (journal->j_bdev_handle) { + bdev_release(journal->j_bdev_handle); + journal->j_bdev_handle = NULL; } } @@ -2612,7 +2605,7 @@ static int journal_init_dev(struct super_block *super, result = 0; - journal->j_dev_bd = NULL; + journal->j_bdev_handle = NULL; jdev = SB_ONDISK_JOURNAL_DEVICE(super) ? new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev; @@ -2623,36 +2616,37 @@ static int journal_init_dev(struct super_block *super, if ((!jdev_name || !jdev_name[0])) { if (jdev == super->s_dev) holder = NULL; - journal->j_dev_bd = blkdev_get_by_dev(jdev, blkdev_mode, holder, - NULL); - if (IS_ERR(journal->j_dev_bd)) { - result = PTR_ERR(journal->j_dev_bd); - journal->j_dev_bd = NULL; + journal->j_bdev_handle = bdev_open_by_dev(jdev, blkdev_mode, + holder, NULL); + if (IS_ERR(journal->j_bdev_handle)) { + result = PTR_ERR(journal->j_bdev_handle); + journal->j_bdev_handle = NULL; reiserfs_warning(super, "sh-458", "cannot init journal device unknown-block(%u,%u): %i", MAJOR(jdev), MINOR(jdev), result); return result; } else if (jdev != super->s_dev) - set_blocksize(journal->j_dev_bd, super->s_blocksize); + set_blocksize(journal->j_bdev_handle->bdev, + super->s_blocksize); return 0; } - journal->j_dev_bd = blkdev_get_by_path(jdev_name, blkdev_mode, holder, - NULL); - if (IS_ERR(journal->j_dev_bd)) { - result = PTR_ERR(journal->j_dev_bd); - journal->j_dev_bd = NULL; + journal->j_bdev_handle = bdev_open_by_path(jdev_name, blkdev_mode, + holder, NULL); + if (IS_ERR(journal->j_bdev_handle)) { + result = PTR_ERR(journal->j_bdev_handle); + journal->j_bdev_handle = NULL; reiserfs_warning(super, "sh-457", "journal_init_dev: Cannot open '%s': %i", jdev_name, result); return result; } - set_blocksize(journal->j_dev_bd, super->s_blocksize); + set_blocksize(journal->j_bdev_handle->bdev, super->s_blocksize); reiserfs_info(super, "journal_init_dev: journal device: %pg\n", - journal->j_dev_bd); + journal->j_bdev_handle->bdev); return 0; } @@ -2810,7 +2804,7 @@ int journal_init(struct super_block *sb, const char *j_dev_name, "journal header magic %x (device %pg) does " "not match to magic found in super block %x", jh->jh_journal.jp_journal_magic, - journal->j_dev_bd, + journal->j_bdev_handle->bdev, sb_jp_journal_magic(rs)); brelse(bhjh); goto free_and_return; @@ -2834,7 +2828,7 @@ int journal_init(struct super_block *sb, const char *j_dev_name, reiserfs_info(sb, "journal params: device %pg, size %u, " "journal first block %u, max trans len %u, max batch %u, " "max commit age %u, max trans age %u\n", - journal->j_dev_bd, + journal->j_bdev_handle->bdev, SB_ONDISK_JOURNAL_SIZE(sb), SB_ONDISK_JOURNAL_1st_BLOCK(sb), journal->j_trans_max, diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c index 3dba8acf4e832a..83cb9402e0f9c5 100644 --- a/fs/reiserfs/procfs.c +++ b/fs/reiserfs/procfs.c @@ -354,7 +354,7 @@ static int show_journal(struct seq_file *m, void *unused) "prepare: \t%12lu\n" "prepare_retry: \t%12lu\n", DJP(jp_journal_1st_block), - SB_JOURNAL(sb)->j_dev_bd, + SB_JOURNAL(sb)->j_bdev_handle->bdev, DJP(jp_journal_dev), DJP(jp_journal_size), DJP(jp_journal_trans_max), diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h index 7d12b8c5b2fa8c..8ad41271c25614 100644 --- a/fs/reiserfs/reiserfs.h +++ b/fs/reiserfs/reiserfs.h @@ -299,7 +299,7 @@ struct reiserfs_journal { /* oldest journal block. start here for traverse */ struct reiserfs_journal_cnode *j_first; - struct block_device *j_dev_bd; + struct bdev_handle *j_bdev_handle; /* first block on s_dev of reserved area journal */ int j_1st_reserved_block; @@ -2809,9 +2809,12 @@ struct reiserfs_journal_header { #define journal_hash(t,sb,block) ((t)[_jhashfn((sb),(block)) & JBH_HASH_MASK]) /* We need these to make journal.c code more readable */ -#define journal_find_get_block(s, block) __find_get_block(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) -#define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) -#define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) +#define journal_find_get_block(s, block) __find_get_block(\ + SB_JOURNAL(s)->j_bdev_handle->bdev, block, s->s_blocksize) +#define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_bdev_handle->bdev,\ + block, s->s_blocksize) +#define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_bdev_handle->bdev,\ + block, s->s_blocksize) enum reiserfs_bh_state_bits { BH_JDirty = BH_PrivateStart, /* buffer is in current transaction */ From ac57b4546274bd0fb0fcac507562114dd0390daf Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 27 Sep 2023 11:34:34 +0200 Subject: [PATCH 176/515] xfs: Convert to bdev_open_by_path() Convert xfs to use bdev_open_by_path() and pass the handle around. CC: "Darrick J. Wong" CC: linux-xfs@vger.kernel.org Acked-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Christian Brauner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20230927093442.25915-28-jack@suse.cz Acked-by: "Darrick J. Wong" Reviewed-by: "Darrick J. Wong" Signed-off-by: Christian Brauner --- fs/xfs/xfs_buf.c | 22 ++++++++++------------ fs/xfs/xfs_buf.h | 3 ++- fs/xfs/xfs_super.c | 42 ++++++++++++++++++++++++------------------ 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index c1ece4a08ff446..003e157241da1e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1945,8 +1945,6 @@ void xfs_free_buftarg( struct xfs_buftarg *btp) { - struct block_device *bdev = btp->bt_bdev; - unregister_shrinker(&btp->bt_shrinker); ASSERT(percpu_counter_sum(&btp->bt_io_count) == 0); percpu_counter_destroy(&btp->bt_io_count); @@ -1954,8 +1952,8 @@ xfs_free_buftarg( fs_put_dax(btp->bt_daxdev, btp->bt_mount); /* the main block device is closed by kill_block_super */ - if (bdev != btp->bt_mount->m_super->s_bdev) - blkdev_put(bdev, btp->bt_mount->m_super); + if (btp->bt_bdev != btp->bt_mount->m_super->s_bdev) + bdev_release(btp->bt_bdev_handle); kmem_free(btp); } @@ -1990,16 +1988,15 @@ xfs_setsize_buftarg( */ STATIC int xfs_setsize_buftarg_early( - xfs_buftarg_t *btp, - struct block_device *bdev) + xfs_buftarg_t *btp) { - return xfs_setsize_buftarg(btp, bdev_logical_block_size(bdev)); + return xfs_setsize_buftarg(btp, bdev_logical_block_size(btp->bt_bdev)); } struct xfs_buftarg * xfs_alloc_buftarg( struct xfs_mount *mp, - struct block_device *bdev) + struct bdev_handle *bdev_handle) { xfs_buftarg_t *btp; const struct dax_holder_operations *ops = NULL; @@ -2010,9 +2007,10 @@ xfs_alloc_buftarg( btp = kmem_zalloc(sizeof(*btp), KM_NOFS); btp->bt_mount = mp; - btp->bt_dev = bdev->bd_dev; - btp->bt_bdev = bdev; - btp->bt_daxdev = fs_dax_get_by_bdev(bdev, &btp->bt_dax_part_off, + btp->bt_bdev_handle = bdev_handle; + btp->bt_dev = bdev_handle->bdev->bd_dev; + btp->bt_bdev = bdev_handle->bdev; + btp->bt_daxdev = fs_dax_get_by_bdev(btp->bt_bdev, &btp->bt_dax_part_off, mp, ops); /* @@ -2022,7 +2020,7 @@ xfs_alloc_buftarg( ratelimit_state_init(&btp->bt_ioerror_rl, 30 * HZ, DEFAULT_RATELIMIT_BURST); - if (xfs_setsize_buftarg_early(btp, bdev)) + if (xfs_setsize_buftarg_early(btp)) goto error_free; if (list_lru_init(&btp->bt_lru)) diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index df8f47953bb4e9..ada9d310b7d3a0 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -98,6 +98,7 @@ typedef unsigned int xfs_buf_flags_t; */ typedef struct xfs_buftarg { dev_t bt_dev; + struct bdev_handle *bt_bdev_handle; struct block_device *bt_bdev; struct dax_device *bt_daxdev; u64 bt_dax_part_off; @@ -364,7 +365,7 @@ xfs_buf_update_cksum(struct xfs_buf *bp, unsigned long cksum_offset) * Handling of buftargs. */ struct xfs_buftarg *xfs_alloc_buftarg(struct xfs_mount *mp, - struct block_device *bdev); + struct bdev_handle *bdev_handle); extern void xfs_free_buftarg(struct xfs_buftarg *); extern void xfs_buftarg_wait(struct xfs_buftarg *); extern void xfs_buftarg_drain(struct xfs_buftarg *); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 819a3568b28f46..f0ae0782815313 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -361,14 +361,15 @@ STATIC int xfs_blkdev_get( xfs_mount_t *mp, const char *name, - struct block_device **bdevp) + struct bdev_handle **handlep) { int error = 0; - *bdevp = blkdev_get_by_path(name, BLK_OPEN_READ | BLK_OPEN_WRITE, - mp->m_super, &fs_holder_ops); - if (IS_ERR(*bdevp)) { - error = PTR_ERR(*bdevp); + *handlep = bdev_open_by_path(name, BLK_OPEN_READ | BLK_OPEN_WRITE, + mp->m_super, &fs_holder_ops); + if (IS_ERR(*handlep)) { + error = PTR_ERR(*handlep); + *handlep = NULL; xfs_warn(mp, "Invalid device [%s], error=%d", name, error); } @@ -433,7 +434,7 @@ xfs_open_devices( { struct super_block *sb = mp->m_super; struct block_device *ddev = sb->s_bdev; - struct block_device *logdev = NULL, *rtdev = NULL; + struct bdev_handle *logdev_handle = NULL, *rtdev_handle = NULL; int error; /* @@ -446,17 +447,19 @@ xfs_open_devices( * Open real time and log devices - order is important. */ if (mp->m_logname) { - error = xfs_blkdev_get(mp, mp->m_logname, &logdev); + error = xfs_blkdev_get(mp, mp->m_logname, &logdev_handle); if (error) goto out_relock; } if (mp->m_rtname) { - error = xfs_blkdev_get(mp, mp->m_rtname, &rtdev); + error = xfs_blkdev_get(mp, mp->m_rtname, &rtdev_handle); if (error) goto out_close_logdev; - if (rtdev == ddev || rtdev == logdev) { + if (rtdev_handle->bdev == ddev || + (logdev_handle && + rtdev_handle->bdev == logdev_handle->bdev)) { xfs_warn(mp, "Cannot mount filesystem with identical rtdev and ddev/logdev."); error = -EINVAL; @@ -468,22 +471,25 @@ xfs_open_devices( * Setup xfs_mount buffer target pointers */ error = -ENOMEM; - mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev); + mp->m_ddev_targp = xfs_alloc_buftarg(mp, sb->s_bdev_handle); if (!mp->m_ddev_targp) goto out_close_rtdev; - if (rtdev) { - mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev); + if (rtdev_handle) { + mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev_handle); if (!mp->m_rtdev_targp) goto out_free_ddev_targ; } - if (logdev && logdev != ddev) { - mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev); + if (logdev_handle && logdev_handle->bdev != ddev) { + mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev_handle); if (!mp->m_logdev_targp) goto out_free_rtdev_targ; } else { mp->m_logdev_targp = mp->m_ddev_targp; + /* Handle won't be used, drop it */ + if (logdev_handle) + bdev_release(logdev_handle); } error = 0; @@ -497,11 +503,11 @@ xfs_open_devices( out_free_ddev_targ: xfs_free_buftarg(mp->m_ddev_targp); out_close_rtdev: - if (rtdev) - blkdev_put(rtdev, sb); + if (rtdev_handle) + bdev_release(rtdev_handle); out_close_logdev: - if (logdev && logdev != ddev) - blkdev_put(logdev, sb); + if (logdev_handle) + bdev_release(logdev_handle); goto out_relock; } From 3df8330f6f9984008d80836bc71c16eeabbc7421 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 4 Oct 2023 11:37:57 +0200 Subject: [PATCH 177/515] bcache: Fixup error handling in register_cache() Coverity has noticed that the printing of error message in register_cache() uses already freed bdev_handle to get to bdev. In fact the problem has been there even before commit "bcache: Convert to bdev_open_by_path()" just a bit more subtle one - cache object itself could have been freed by the time we looked at ca->bdev and we don't hold any reference to bdev either so even that could in principle go away (due to device unplug or similar). Fix all these problems by printing the error message before closing the bdev. Fixes: dc893f51d24a ("bcache: Convert to bdev_open_by_path()") Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20231004093757.11560-1-jack@suse.cz Asked-by: Coly Li Signed-off-by: Christian Brauner --- drivers/md/bcache/super.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index c11ac86be72b05..a30c8d4f2ac8ea 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -2354,6 +2354,13 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk, ret = cache_alloc(ca); if (ret != 0) { + if (ret == -ENOMEM) + err = "cache_alloc(): -ENOMEM"; + else if (ret == -EPERM) + err = "cache_alloc(): cache device is too small"; + else + err = "cache_alloc(): unknown error"; + pr_notice("error %pg: %s\n", bdev_handle->bdev, err); /* * If we failed here, it means ca->kobj is not initialized yet, * kobject_put() won't be called and there is no chance to @@ -2361,17 +2368,12 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk, * we explicitly call bdev_release() here. */ bdev_release(bdev_handle); - if (ret == -ENOMEM) - err = "cache_alloc(): -ENOMEM"; - else if (ret == -EPERM) - err = "cache_alloc(): cache device is too small"; - else - err = "cache_alloc(): unknown error"; - goto err; + return ret; } if (kobject_add(&ca->kobj, bdev_kobj(bdev_handle->bdev), "bcache")) { - err = "error calling kobject_add"; + pr_notice("error %pg: error calling kobject_add\n", + bdev_handle->bdev); ret = -ENOMEM; goto out; } @@ -2389,11 +2391,6 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk, out: kobject_put(&ca->kobj); - -err: - if (err) - pr_notice("error %pg: %s\n", ca->bdev_handle->bdev, err); - return ret; } From ed950352b6fe8a452c82b7a9d54875f2571174f5 Mon Sep 17 00:00:00 2001 From: Lizhi Xu Date: Mon, 9 Oct 2023 17:45:57 +0800 Subject: [PATCH 178/515] jfs: fix log->bdev_handle null ptr deref in lbmStartIO When sbi->flag is JFS_NOINTEGRITY in lmLogOpen(), log->bdev_handle can't be inited, so it value will be NULL. Therefore, add the "log ->no_integrity=1" judgment in lbmStartIO() to avoid such problems. Reported-and-tested-by: syzbot+23bc20037854bb335d59@syzkaller.appspotmail.com Signed-off-by: Lizhi Xu Link: https://lore.kernel.org/r/20231009094557.1398920-1-lizhi.xu@windriver.com Reviewed-by: Jan Kara Signed-off-by: Christian Brauner --- fs/jfs/jfs_logmgr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index c911d838b8ec8c..cb6d1fda66a702 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2110,10 +2110,14 @@ static void lbmStartIO(struct lbuf * bp) { struct bio *bio; struct jfs_log *log = bp->l_log; + struct block_device *bdev = NULL; jfs_info("lbmStartIO"); - bio = bio_alloc(log->bdev_handle->bdev, 1, REQ_OP_WRITE | REQ_SYNC, + if (!log->no_integrity) + bdev = log->bdev_handle->bdev; + + bio = bio_alloc(bdev, 1, REQ_OP_WRITE | REQ_SYNC, GFP_NOFS); bio->bi_iter.bi_sector = bp->l_blkno << (log->l2bsize - 9); __bio_add_page(bio, bp->l_page, LOGPSIZE, bp->l_offset); From f064f4e5ecb151b3fce59762075658ac6f389532 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Thu, 12 Oct 2023 12:55:34 -0700 Subject: [PATCH 179/515] zstd: Fix array-index-out-of-bounds UBSAN warning Zstd used an array of length 1 to mean a flexible array for C89 compatibility. Switch to a C99 flexible array to fix the UBSAN warning. Tested locally by booting the kernel and writing to and reading from a BtrFS filesystem with zstd compression enabled. I was unable to reproduce the issue before the fix, however it is a trivial change. Reported-by: syzbot+1f2eb3e8cd123ffce499@syzkaller.appspotmail.com Reported-by: Eric Biggers Reported-by: Kees Cook Signed-off-by: Nick Terrell --- lib/zstd/common/fse_decompress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/zstd/common/fse_decompress.c b/lib/zstd/common/fse_decompress.c index a0d06095be83de..8dcb8ca39767c8 100644 --- a/lib/zstd/common/fse_decompress.c +++ b/lib/zstd/common/fse_decompress.c @@ -312,7 +312,7 @@ size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size typedef struct { short ncount[FSE_MAX_SYMBOL_VALUE + 1]; - FSE_DTable dtable[1]; /* Dynamically sized */ + FSE_DTable dtable[]; /* Dynamically sized */ } FSE_DecompressWksp; From 4bb36d126cb3147d6bbfd00242a5b846dacad595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Thu, 12 Oct 2023 23:02:29 +0200 Subject: [PATCH 180/515] pwm: samsung: Document new member .channel in struct samsung_pwm_chip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit My earlier commit reworking how driver data is tracked added a new member to struct samsung_pwm_chip but failed to add matching documentation. Make up leeway. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202310130404.uQ33q5Dk-lkp@intel.com/ Fixes: 4c9548d24c0d ("pwm: samsung: Put per-channel data into driver data") Signed-off-by: Uwe Kleine-König Signed-off-by: Thierry Reding --- drivers/pwm/pwm-samsung.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/pwm/pwm-samsung.c b/drivers/pwm/pwm-samsung.c index 10fe2c13cd804e..568491ed6829e9 100644 --- a/drivers/pwm/pwm-samsung.c +++ b/drivers/pwm/pwm-samsung.c @@ -77,6 +77,7 @@ struct samsung_pwm_channel { * @base_clk: base clock used to drive the timers * @tclk0: external clock 0 (can be ERR_PTR if not present) * @tclk1: external clock 1 (can be ERR_PTR if not present) + * @channel: per channel driver data */ struct samsung_pwm_chip { struct pwm_chip chip; From 4425c1d9b44ded655d2668e1ce95a62bccf7b21b Mon Sep 17 00:00:00 2001 From: Seamus Connor Date: Fri, 13 Oct 2023 14:11:29 -0700 Subject: [PATCH 181/515] configfs: improve item creation performance As the size of a directory increases item creation slows down. Optimizing access to s_children removes this bottleneck. dirents are already pinned into the cache, there is no need to scan the s_children list looking for duplicate Items. The configfs_dirent_exists check is moved to a location where it is called only during subsystem initialization. d_lookup will only need to call configfs_lookup in the case where the item in question is not pinned to dcache. The only items not pinned to dcache are attributes. These are placed at the front of the s_children list, whilst pinned items are inserted at the back. configfs_lookup stops scanning when it encounters the first pinned entry in s_children. The assumption of the above optimizations is that there will be few attributes, but potentially many Items in a given directory. Signed-off-by: Seamus Connor Reviewed-by: Joel Becker Signed-off-by: Christoph Hellwig --- fs/configfs/configfs_internal.h | 4 ++-- fs/configfs/dir.c | 42 +++++++++++++++++++++++++-------- fs/configfs/inode.c | 24 ------------------- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/fs/configfs/configfs_internal.h b/fs/configfs/configfs_internal.h index e710a1782382a2..0b969d0eb8ff98 100644 --- a/fs/configfs/configfs_internal.h +++ b/fs/configfs/configfs_internal.h @@ -55,6 +55,8 @@ struct configfs_dirent { #define CONFIGFS_USET_IN_MKDIR 0x0200 #define CONFIGFS_USET_CREATING 0x0400 #define CONFIGFS_NOT_PINNED (CONFIGFS_ITEM_ATTR | CONFIGFS_ITEM_BIN_ATTR) +#define CONFIGFS_PINNED \ + (CONFIGFS_ROOT | CONFIGFS_DIR | CONFIGFS_ITEM_LINK) extern struct mutex configfs_symlink_mutex; extern spinlock_t configfs_dirent_lock; @@ -73,8 +75,6 @@ extern int configfs_make_dirent(struct configfs_dirent *, struct dentry *, void *, umode_t, int, struct configfs_fragment *); extern int configfs_dirent_is_ready(struct configfs_dirent *); -extern void configfs_hash_and_remove(struct dentry * dir, const char * name); - extern const unsigned char * configfs_get_name(struct configfs_dirent *sd); extern void configfs_drop_dentry(struct configfs_dirent *sd, struct dentry *parent); extern int configfs_setattr(struct mnt_idmap *idmap, diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 18677cd4e62f54..7d6cd4b366d5a0 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c @@ -207,7 +207,17 @@ static struct configfs_dirent *configfs_new_dirent(struct configfs_dirent *paren return ERR_PTR(-ENOENT); } sd->s_frag = get_fragment(frag); - list_add(&sd->s_sibling, &parent_sd->s_children); + + /* + * configfs_lookup scans only for unpinned items. s_children is + * partitioned so that configfs_lookup can bail out early. + * CONFIGFS_PINNED and CONFIGFS_NOT_PINNED are not symmetrical. readdir + * cursors still need to be inserted at the front of the list. + */ + if (sd->s_type & CONFIGFS_PINNED) + list_add_tail(&sd->s_sibling, &parent_sd->s_children); + else + list_add(&sd->s_sibling, &parent_sd->s_children); spin_unlock(&configfs_dirent_lock); return sd; @@ -220,10 +230,11 @@ static struct configfs_dirent *configfs_new_dirent(struct configfs_dirent *paren * * called with parent inode's i_mutex held */ -static int configfs_dirent_exists(struct configfs_dirent *parent_sd, - const unsigned char *new) +static int configfs_dirent_exists(struct dentry *dentry) { - struct configfs_dirent * sd; + struct configfs_dirent *parent_sd = dentry->d_parent->d_fsdata; + const unsigned char *new = dentry->d_name.name; + struct configfs_dirent *sd; list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { if (sd->s_element) { @@ -289,10 +300,6 @@ static int configfs_create_dir(struct config_item *item, struct dentry *dentry, BUG_ON(!item); - error = configfs_dirent_exists(p->d_fsdata, dentry->d_name.name); - if (unlikely(error)) - return error; - error = configfs_make_dirent(p->d_fsdata, dentry, item, mode, CONFIGFS_DIR | CONFIGFS_USET_CREATING, frag); @@ -451,6 +458,18 @@ static struct dentry * configfs_lookup(struct inode *dir, spin_lock(&configfs_dirent_lock); list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { + + /* + * s_children is partitioned, see configfs_new_dirent. The first + * pinned item indicates we can stop scanning. + */ + if (sd->s_type & CONFIGFS_PINNED) + break; + + /* + * Note: CONFIGFS_PINNED and CONFIGFS_NOT_PINNED are asymmetric. + * there may be a readdir cursor in this list + */ if ((sd->s_type & CONFIGFS_NOT_PINNED) && !strcmp(configfs_get_name(sd), dentry->d_name.name)) { struct configfs_attribute *attr = sd->s_element; @@ -1875,8 +1894,11 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) if (dentry) { d_add(dentry, NULL); - err = configfs_attach_group(sd->s_element, &group->cg_item, - dentry, frag); + err = configfs_dirent_exists(dentry); + if (!err) + err = configfs_attach_group(sd->s_element, + &group->cg_item, + dentry, frag); if (err) { BUG_ON(d_inode(dentry)); d_drop(dentry); diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c index fbdcb3582926a7..9a133fa147f295 100644 --- a/fs/configfs/inode.c +++ b/fs/configfs/inode.c @@ -217,27 +217,3 @@ void configfs_drop_dentry(struct configfs_dirent * sd, struct dentry * parent) } } -void configfs_hash_and_remove(struct dentry * dir, const char * name) -{ - struct configfs_dirent * sd; - struct configfs_dirent * parent_sd = dir->d_fsdata; - - if (d_really_is_negative(dir)) - /* no inode means this hasn't been made visible yet */ - return; - - inode_lock(d_inode(dir)); - list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { - if (!sd->s_element) - continue; - if (!strcmp(configfs_get_name(sd), name)) { - spin_lock(&configfs_dirent_lock); - list_del_init(&sd->s_sibling); - spin_unlock(&configfs_dirent_lock); - configfs_drop_dentry(sd, dir); - configfs_put(sd); - break; - } - } - inode_unlock(d_inode(dir)); -} From 881158b6e36d5a97aa9cbbb3518f470d9b04f9e1 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Wed, 6 Sep 2023 10:52:13 +0300 Subject: [PATCH 182/515] ovl: use simpler 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. Signed-off-by: Alessio Balsini Signed-off-by: Amir Goldstein --- fs/overlayfs/file.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index 8be4dc050d1ed2..1f4dcf3d854091 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -260,20 +260,12 @@ static void ovl_file_accessed(struct file *file) touch_atime(&file->f_path); } -static rwf_t ovl_iocb_to_rwf(int ifl) +#define OVL_IOCB_MASK \ + (IOCB_NOWAIT | IOCB_HIPRI | IOCB_DSYNC | IOCB_SYNC) + +static rwf_t iocb_to_rw_flags(int flags) { - 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; + return (__force rwf_t)(flags & OVL_IOCB_MASK); } static inline void ovl_aio_put(struct ovl_aio_req *aio_req) @@ -331,8 +323,9 @@ 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)); + rwf_t rwf = iocb_to_rw_flags(iocb->ki_flags); + + ret = vfs_iter_read(real.file, iter, &iocb->ki_pos, rwf); } else { struct ovl_aio_req *aio_req; @@ -398,9 +391,10 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) old_cred = ovl_override_creds(file_inode(file)->i_sb); if (is_sync_kiocb(iocb)) { + rwf_t rwf = iocb_to_rw_flags(ifl); + file_start_write(real.file); - ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, - ovl_iocb_to_rwf(ifl)); + ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, rwf); file_end_write(real.file); /* Update size */ ovl_copyattr(inode); From f37f2a85d442db5bf68596e8fadf0a22f2c38a6d Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Tue, 29 Aug 2023 16:25:47 +0300 Subject: [PATCH 183/515] ovl: propagate IOCB_APPEND flag on writes to realfile If ovl file is opened O_APPEND, the underlying realfile is also opened O_APPEND, so it makes sense to propagate the IOCB_APPEND flags on sync writes to realfile, just as we do with aio writes. Effectively, because sync ovl writes are protected by inode lock, this change only makes a difference if the realfile is written to (size extending writes) from underneath overlayfs. The behavior in this case is undefined, so it is ok if we change the behavior (to fail the ovl IOCB_APPEND write). Signed-off-by: Amir Goldstein --- fs/overlayfs/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index 1f4dcf3d854091..f44017d79bce15 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -261,7 +261,7 @@ static void ovl_file_accessed(struct file *file) } #define OVL_IOCB_MASK \ - (IOCB_NOWAIT | IOCB_HIPRI | IOCB_DSYNC | IOCB_SYNC) + (IOCB_NOWAIT | IOCB_HIPRI | IOCB_DSYNC | IOCB_SYNC | IOCB_APPEND) static rwf_t iocb_to_rw_flags(int flags) { From 4737cb1ded6cf3c462450780badcecd0c5d9f8f4 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Tue, 22 Aug 2023 20:50:59 +0300 Subject: [PATCH 184/515] ovl: punt write aio completion to workqueue We want to protect concurrent updates of ovl inode size and mtime (i.e. ovl_copyattr()) from aio completion context. Punt write aio completion to a workqueue so that we can protect ovl_copyattr() with a spinlock. Export sb_init_dio_done_wq(), so that overlayfs can use its own dio workqueue to punt aio completions. Suggested-by: Jens Axboe Link: https://lore.kernel.org/r/8620dfd3-372d-4ae0-aa3f-2fe97dda1bca@kernel.dk/ Signed-off-by: Amir Goldstein --- fs/overlayfs/file.c | 42 +++++++++++++++++++++++++++++++++++++++++- fs/super.c | 1 + 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index f44017d79bce15..09997340bbd33e 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -15,10 +15,15 @@ #include #include "overlayfs.h" +#include "../internal.h" /* for sb_init_dio_done_wq */ + struct ovl_aio_req { struct kiocb iocb; refcount_t ref; struct kiocb *orig_iocb; + /* used for aio completion */ + struct work_struct work; + long res; }; static struct kmem_cache *ovl_aio_request_cachep; @@ -302,6 +307,37 @@ static void ovl_aio_rw_complete(struct kiocb *iocb, long res) orig_iocb->ki_complete(orig_iocb, res); } +static void ovl_aio_complete_work(struct work_struct *work) +{ + struct ovl_aio_req *aio_req = container_of(work, + struct ovl_aio_req, work); + + ovl_aio_rw_complete(&aio_req->iocb, aio_req->res); +} + +static void ovl_aio_queue_completion(struct kiocb *iocb, long res) +{ + struct ovl_aio_req *aio_req = container_of(iocb, + struct ovl_aio_req, iocb); + struct kiocb *orig_iocb = aio_req->orig_iocb; + + /* + * Punt to a work queue to serialize updates of mtime/size. + */ + aio_req->res = res; + INIT_WORK(&aio_req->work, ovl_aio_complete_work); + queue_work(file_inode(orig_iocb->ki_filp)->i_sb->s_dio_done_wq, + &aio_req->work); +} + +static int ovl_init_aio_done_wq(struct super_block *sb) +{ + if (sb->s_dio_done_wq) + return 0; + + return sb_init_dio_done_wq(sb); +} + static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter) { struct file *file = iocb->ki_filp; @@ -401,6 +437,10 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) } else { struct ovl_aio_req *aio_req; + ret = ovl_init_aio_done_wq(inode->i_sb); + if (ret) + goto out; + ret = -ENOMEM; aio_req = kmem_cache_zalloc(ovl_aio_request_cachep, GFP_KERNEL); if (!aio_req) @@ -409,7 +449,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) aio_req->orig_iocb = iocb; kiocb_clone(&aio_req->iocb, iocb, get_file(real.file)); aio_req->iocb.ki_flags = ifl; - aio_req->iocb.ki_complete = ovl_aio_rw_complete; + aio_req->iocb.ki_complete = ovl_aio_queue_completion; refcount_set(&aio_req->ref, 2); kiocb_start_write(&aio_req->iocb); ret = vfs_iocb_iter_write(real.file, &aio_req->iocb, iter); diff --git a/fs/super.c b/fs/super.c index 2d762ce67f6e6c..6ab6624989f28c 100644 --- a/fs/super.c +++ b/fs/super.c @@ -2139,3 +2139,4 @@ int sb_init_dio_done_wq(struct super_block *sb) destroy_workqueue(wq); return 0; } +EXPORT_SYMBOL_GPL(sb_init_dio_done_wq); From fd2a11eecb8db7026ac3a9bf06ad962f87d3c6a2 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Thu, 24 Aug 2023 14:51:17 +0300 Subject: [PATCH 185/515] ovl: protect copying of realinode attributes to ovl inode ovl_copyattr() may be called concurrently from aio completion context without any lock and that could lead to overlay inode attributes getting permanently out of sync with real inode attributes. Use ovl inode spinlock to protect ovl_copyattr(). Signed-off-by: Amir Goldstein --- fs/overlayfs/util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 89e0d60d35b6cf..b7922862ece3dd 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -1403,6 +1403,7 @@ void ovl_copyattr(struct inode *inode) realinode = ovl_i_path_real(inode, &realpath); real_idmap = mnt_idmap(realpath.mnt); + spin_lock(&inode->i_lock); vfsuid = i_uid_into_vfsuid(real_idmap, realinode); vfsgid = i_gid_into_vfsgid(real_idmap, realinode); @@ -1413,4 +1414,5 @@ void ovl_copyattr(struct inode *inode) inode->i_mtime = realinode->i_mtime; inode_set_ctime_to_ts(inode, inode_get_ctime(realinode)); i_size_write(inode, i_size_read(realinode)); + spin_unlock(&inode->i_lock); } From 2d41cfc89845fe171f049e597a2dacd477247736 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Wed, 27 Sep 2023 13:43:44 +0300 Subject: [PATCH 186/515] ovl: add helper ovl_file_modified() A simple wrapper for updating ovl inode size/mtime, to conform with ovl_file_accessed(). Signed-off-by: Amir Goldstein --- fs/overlayfs/file.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index 09997340bbd33e..acdd79dd4bfa55 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -240,6 +240,12 @@ static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) return ret; } +static void ovl_file_modified(struct file *file) +{ + /* Update size/mtime */ + ovl_copyattr(file_inode(file)); +} + static void ovl_file_accessed(struct file *file) { struct inode *inode, *upperinode; @@ -287,10 +293,8 @@ static void ovl_aio_cleanup_handler(struct ovl_aio_req *aio_req) struct kiocb *orig_iocb = aio_req->orig_iocb; if (iocb->ki_flags & IOCB_WRITE) { - struct inode *inode = file_inode(orig_iocb->ki_filp); - kiocb_end_write(iocb); - ovl_copyattr(inode); + ovl_file_modified(orig_iocb->ki_filp); } orig_iocb->ki_pos = iocb->ki_pos; @@ -433,7 +437,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, rwf); file_end_write(real.file); /* Update size */ - ovl_copyattr(inode); + ovl_file_modified(file); } else { struct ovl_aio_req *aio_req; @@ -523,7 +527,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); fdput(real); @@ -604,7 +608,7 @@ static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len revert_creds(old_cred); /* Update size */ - ovl_copyattr(inode); + ovl_file_modified(file); fdput(real); @@ -688,7 +692,7 @@ static loff_t ovl_copyfile(struct file *file_in, loff_t pos_in, revert_creds(old_cred); /* Update size */ - ovl_copyattr(inode_out); + ovl_file_modified(file_out); fdput(real_in); fdput(real_out); From d8d9363c152c31158f112e63aa869c564109ecf9 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Wed, 16 Aug 2023 12:18:15 +0300 Subject: [PATCH 187/515] ovl: split ovl_want_write() into two helpers ovl_get_write_access() gets write access to upper mnt without taking freeze protection on upper sb and ovl_start_write() only takes freeze protection on upper sb. These helpers will be used to breakup the large ovl_want_write() scope during copy up into finer grained freeze protection scopes. Signed-off-by: Amir Goldstein --- fs/overlayfs/overlayfs.h | 4 ++++ fs/overlayfs/util.c | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index 9817b2dcb132c2..a22de83e0a9b28 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -398,6 +398,10 @@ static inline bool ovl_open_flags_need_copy_up(int flags) } /* util.c */ +int ovl_get_write_access(struct dentry *dentry); +void ovl_put_write_access(struct dentry *dentry); +void ovl_start_write(struct dentry *dentry); +void ovl_end_write(struct dentry *dentry); int ovl_want_write(struct dentry *dentry); void ovl_drop_write(struct dentry *dentry); struct dentry *ovl_workdir(struct dentry *dentry); diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index b7922862ece3dd..483ffc94bffa33 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -17,12 +17,38 @@ #include #include "overlayfs.h" +/* Get write access to upper mnt - may fail if upper sb was remounted ro */ +int ovl_get_write_access(struct dentry *dentry) +{ + struct ovl_fs *ofs = OVL_FS(dentry->d_sb); + return mnt_get_write_access(ovl_upper_mnt(ofs)); +} + +/* Get write access to upper sb - may block if upper sb is frozen */ +void ovl_start_write(struct dentry *dentry) +{ + struct ovl_fs *ofs = OVL_FS(dentry->d_sb); + sb_start_write(ovl_upper_mnt(ofs)->mnt_sb); +} + int ovl_want_write(struct dentry *dentry) { struct ovl_fs *ofs = OVL_FS(dentry->d_sb); return mnt_want_write(ovl_upper_mnt(ofs)); } +void ovl_put_write_access(struct dentry *dentry) +{ + struct ovl_fs *ofs = OVL_FS(dentry->d_sb); + mnt_put_write_access(ovl_upper_mnt(ofs)); +} + +void ovl_end_write(struct dentry *dentry) +{ + struct ovl_fs *ofs = OVL_FS(dentry->d_sb); + sb_end_write(ovl_upper_mnt(ofs)->mnt_sb); +} + void ovl_drop_write(struct dentry *dentry) { struct ovl_fs *ofs = OVL_FS(dentry->d_sb); From fa1a07612ce760ba99bd573974fdafc1abccce02 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Thu, 20 Jul 2023 12:51:21 +0300 Subject: [PATCH 188/515] ovl: reorder ovl_want_write() after ovl_inode_lock() Make the locking order of ovl_inode_lock() strictly between the two vfs stacked layers, i.e.: - ovl vfs locks: sb_writers, inode_lock, ... - ovl_inode_lock - upper vfs locks: sb_writers, inode_lock, ... To that effect, move ovl_want_write() into the helpers ovl_nlink_start() and ovl_copy_up_start which currently take the ovl_inode_lock() after ovl_want_write(). Signed-off-by: Amir Goldstein --- fs/overlayfs/copy_up.c | 13 +++------ fs/overlayfs/dir.c | 60 ++++++++++++++++++------------------------ fs/overlayfs/export.c | 7 +---- fs/overlayfs/inode.c | 57 +++++++++++++++++++-------------------- fs/overlayfs/util.c | 34 +++++++++++++++++++----- 5 files changed, 84 insertions(+), 87 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index ada3fcc9c6d501..a999ae207e7432 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -1170,17 +1170,10 @@ static bool ovl_open_need_copy_up(struct dentry *dentry, int flags) int ovl_maybe_copy_up(struct dentry *dentry, int flags) { - int err = 0; - - if (ovl_open_need_copy_up(dentry, flags)) { - err = ovl_want_write(dentry); - if (!err) { - err = ovl_copy_up_flags(dentry, flags); - ovl_drop_write(dentry); - } - } + if (!ovl_open_need_copy_up(dentry, flags)) + return 0; - return err; + return ovl_copy_up_flags(dentry, flags); } int ovl_copy_up_with_data(struct dentry *dentry) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 033fc0458a3d82..768120c20f85db 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -559,10 +559,6 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, struct cred *override_cred; struct dentry *parent = dentry->d_parent; - err = ovl_copy_up(parent); - if (err) - return err; - old_cred = ovl_override_creds(dentry->d_sb); /* @@ -626,6 +622,10 @@ static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, .link = link, }; + err = ovl_copy_up(dentry->d_parent); + if (err) + return err; + err = ovl_want_write(dentry); if (err) goto out; @@ -700,28 +700,24 @@ static int ovl_link(struct dentry *old, struct inode *newdir, int err; struct inode *inode; - err = ovl_want_write(old); + err = ovl_copy_up(old); if (err) goto out; - err = ovl_copy_up(old); + err = ovl_copy_up(new->d_parent); if (err) - goto out_drop_write; + goto out; - err = ovl_copy_up(new->d_parent); + err = ovl_nlink_start(old); if (err) - goto out_drop_write; + goto out; if (ovl_is_metacopy_dentry(old)) { err = ovl_set_link_redirect(old); if (err) - goto out_drop_write; + goto out_nlink_end; } - err = ovl_nlink_start(old); - if (err) - goto out_drop_write; - inode = d_inode(old); ihold(inode); @@ -731,9 +727,8 @@ static int ovl_link(struct dentry *old, struct inode *newdir, if (err) iput(inode); +out_nlink_end: ovl_nlink_end(old); -out_drop_write: - ovl_drop_write(old); out: return err; } @@ -891,17 +886,13 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) goto out; } - err = ovl_want_write(dentry); - if (err) - goto out; - err = ovl_copy_up(dentry->d_parent); if (err) - goto out_drop_write; + goto out; err = ovl_nlink_start(dentry); if (err) - goto out_drop_write; + goto out; old_cred = ovl_override_creds(dentry->d_sb); if (!lower_positive) @@ -926,8 +917,6 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) if (ovl_dentry_upper(dentry)) ovl_copyattr(d_inode(dentry)); -out_drop_write: - ovl_drop_write(dentry); out: ovl_cache_free(&list); return err; @@ -1131,29 +1120,32 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir, } } - err = ovl_want_write(old); - if (err) - goto out; - err = ovl_copy_up(old); if (err) - goto out_drop_write; + goto out; err = ovl_copy_up(new->d_parent); if (err) - goto out_drop_write; + goto out; if (!overwrite) { err = ovl_copy_up(new); if (err) - goto out_drop_write; + goto out; } else if (d_inode(new)) { err = ovl_nlink_start(new); if (err) - goto out_drop_write; + goto out; update_nlink = true; } + if (!update_nlink) { + /* ovl_nlink_start() took ovl_want_write() */ + err = ovl_want_write(old); + if (err) + goto out; + } + old_cred = ovl_override_creds(old->d_sb); if (!list_empty(&list)) { @@ -1286,8 +1278,8 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir, revert_creds(old_cred); if (update_nlink) ovl_nlink_end(new); -out_drop_write: - ovl_drop_write(old); + else + ovl_drop_write(old); out: dput(opaquedir); ovl_cache_free(&list); diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c index 26b782c53910b5..7e16bbcad95e63 100644 --- a/fs/overlayfs/export.c +++ b/fs/overlayfs/export.c @@ -23,12 +23,7 @@ static int ovl_encode_maybe_copy_up(struct dentry *dentry) if (ovl_dentry_upper(dentry)) return 0; - err = ovl_want_write(dentry); - if (!err) { - err = ovl_copy_up(dentry); - ovl_drop_write(dentry); - } - + err = ovl_copy_up(dentry); if (err) { pr_warn_ratelimited("failed to copy up on encode (%pd2, err=%i)\n", dentry, err); diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 83ef66644c213b..27467e512663cf 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -32,10 +32,6 @@ int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry, if (err) return err; - err = ovl_want_write(dentry); - if (err) - goto out; - if (attr->ia_valid & ATTR_SIZE) { /* Truncate should trigger data copy up as well */ full_copy_up = true; @@ -54,7 +50,7 @@ int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry, winode = d_inode(upperdentry); err = get_write_access(winode); if (err) - goto out_drop_write; + goto out; } if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) @@ -78,6 +74,10 @@ int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry, */ attr->ia_valid &= ~ATTR_OPEN; + err = ovl_want_write(dentry); + if (err) + goto out_put_write; + inode_lock(upperdentry->d_inode); old_cred = ovl_override_creds(dentry->d_sb); err = ovl_do_notify_change(ofs, upperdentry, attr); @@ -85,12 +85,12 @@ int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry, if (!err) ovl_copyattr(dentry->d_inode); inode_unlock(upperdentry->d_inode); + ovl_drop_write(dentry); +out_put_write: if (winode) put_write_access(winode); } -out_drop_write: - ovl_drop_write(dentry); out: return err; } @@ -361,27 +361,27 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, struct path realpath; const struct cred *old_cred; - err = ovl_want_write(dentry); - if (err) - goto out; - if (!value && !upperdentry) { 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); if (err < 0) - goto out_drop_write; + goto out; } if (!upperdentry) { err = ovl_copy_up(dentry); if (err) - goto out_drop_write; + goto out; realdentry = ovl_dentry_upper(dentry); } + err = ovl_want_write(dentry); + if (err) + goto out; + old_cred = ovl_override_creds(dentry->d_sb); if (value) { err = ovl_do_setxattr(ofs, realdentry, name, value, size, @@ -391,12 +391,10 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, err = ovl_do_removexattr(ofs, realdentry, name); } revert_creds(old_cred); + ovl_drop_write(dentry); /* copy c/mtime */ ovl_copyattr(inode); - -out_drop_write: - ovl_drop_write(dentry); out: return err; } @@ -611,10 +609,6 @@ static int ovl_set_or_remove_acl(struct dentry *dentry, struct inode *inode, struct dentry *upperdentry = ovl_dentry_upper(dentry); struct dentry *realdentry = upperdentry ?: ovl_dentry_lower(dentry); - err = ovl_want_write(dentry); - if (err) - return err; - /* * If ACL is to be removed from a lower file, check if it exists in * the first place before copying it up. @@ -630,7 +624,7 @@ static int ovl_set_or_remove_acl(struct dentry *dentry, struct inode *inode, revert_creds(old_cred); if (IS_ERR(real_acl)) { err = PTR_ERR(real_acl); - goto out_drop_write; + goto out; } posix_acl_release(real_acl); } @@ -638,23 +632,26 @@ static int ovl_set_or_remove_acl(struct dentry *dentry, struct inode *inode, if (!upperdentry) { err = ovl_copy_up(dentry); if (err) - goto out_drop_write; + goto out; realdentry = ovl_dentry_upper(dentry); } + err = ovl_want_write(dentry); + if (err) + goto out; + old_cred = ovl_override_creds(dentry->d_sb); if (acl) 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_drop_write(dentry); /* copy c/mtime */ ovl_copyattr(inode); - -out_drop_write: - ovl_drop_write(dentry); +out: return err; } @@ -777,14 +774,14 @@ int ovl_fileattr_set(struct mnt_idmap *idmap, unsigned int flags; int err; - err = ovl_want_write(dentry); - if (err) - goto out; - err = ovl_copy_up(dentry); if (!err) { ovl_path_real(dentry, &upperpath); + err = ovl_want_write(dentry); + if (err) + goto out; + old_cred = ovl_override_creds(inode->i_sb); /* * Store immutable/append-only flags in xattr and clear them @@ -797,6 +794,7 @@ int ovl_fileattr_set(struct mnt_idmap *idmap, if (!err) err = ovl_real_fileattr_set(&upperpath, fa); revert_creds(old_cred); + ovl_drop_write(dentry); /* * Merge real inode flags with inode flags read from @@ -811,7 +809,6 @@ int ovl_fileattr_set(struct mnt_idmap *idmap, /* Update ctime */ ovl_copyattr(inode); } - ovl_drop_write(dentry); out: return err; } diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 483ffc94bffa33..5e35b818ef5d46 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -676,16 +676,26 @@ int ovl_copy_up_start(struct dentry *dentry, int flags) int err; err = ovl_inode_lock_interruptible(inode); - if (!err && ovl_already_copied_up_locked(dentry, flags)) { + if (err) + return err; + + if (ovl_already_copied_up_locked(dentry, flags)) err = 1; /* Already copied up */ - ovl_inode_unlock(inode); - } + else + err = ovl_want_write(dentry); + if (err) + goto out_unlock; + + return 0; +out_unlock: + ovl_inode_unlock(inode); return err; } void ovl_copy_up_end(struct dentry *dentry) { + ovl_drop_write(dentry); ovl_inode_unlock(d_inode(dentry)); } @@ -1088,8 +1098,12 @@ int ovl_nlink_start(struct dentry *dentry) if (err) return err; + err = ovl_want_write(dentry); + if (err) + goto out_unlock; + if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, inode)) - goto out; + return 0; old_cred = ovl_override_creds(dentry->d_sb); /* @@ -1100,10 +1114,15 @@ int ovl_nlink_start(struct dentry *dentry) */ err = ovl_set_nlink_upper(dentry); revert_creds(old_cred); - -out: if (err) - ovl_inode_unlock(inode); + goto out_drop_write; + + return 0; + +out_drop_write: + ovl_drop_write(dentry); +out_unlock: + ovl_inode_unlock(inode); return err; } @@ -1120,6 +1139,7 @@ void ovl_nlink_end(struct dentry *dentry) revert_creds(old_cred); } + ovl_drop_write(dentry); ovl_inode_unlock(inode); } From 80ce87492bceacb51383c6aef9fb0938117dc4d9 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Wed, 16 Aug 2023 12:42:18 +0300 Subject: [PATCH 189/515] ovl: do not open/llseek lower file with upper sb_writers held overlayfs file open (ovl_maybe_lookup_lowerdata) and overlay file llseek take the ovl_inode_lock, without holding upper sb_writers. In case of nested lower overlay that uses same upper fs as this overlay, lockdep will warn about (possibly false positive) circular lock dependency when doing open/llseek of lower ovl file during copy up with our upper sb_writers held, because the locking ordering seems reverse to the locking order in ovl_copy_up_start(): - lower ovl_inode_lock - upper sb_writers Let the copy up "transaction" keeps an elevated mnt write count on upper mnt, but leaves taking upper sb_writers to lower level helpers only when they actually need it. This allows to avoid holding upper sb_writers during lower file open/llseek and prevents the lockdep warning. Minimizing the scope of upper sb_writers during copy up is also needed for fixing another possible deadlocks by a following patch. Signed-off-by: Amir Goldstein --- fs/overlayfs/copy_up.c | 76 ++++++++++++++++++++++++++++++------------ fs/overlayfs/util.c | 8 +++-- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index a999ae207e7432..cabf4752dc3ded 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -252,7 +252,9 @@ static int ovl_copy_up_file(struct ovl_fs *ofs, struct dentry *dentry, return PTR_ERR(old_file); /* Try to use clone_file_range to clone up within the same fs */ + ovl_start_write(dentry); cloned = do_clone_file_range(old_file, 0, new_file, 0, len, 0); + ovl_end_write(dentry); if (cloned == len) goto out_fput; /* Couldn't clone, so now we try to copy the data */ @@ -287,8 +289,12 @@ static int ovl_copy_up_file(struct ovl_fs *ofs, struct dentry *dentry, * it may not recognize all kind of holes and sometimes * only skips partial of hole area. However, it will be * enough for most of the use cases. + * + * We do not hold upper sb_writers throughout the loop to avert + * lockdep warning with llseek of lower file in nested overlay: + * - upper sb_writers + * -- lower ovl_inode_lock (ovl_llseek) */ - if (skip_hole && data_pos < old_pos) { data_pos = vfs_llseek(old_file, old_pos, SEEK_DATA); if (data_pos > old_pos) { @@ -303,9 +309,11 @@ static int ovl_copy_up_file(struct ovl_fs *ofs, struct dentry *dentry, } } + ovl_start_write(dentry); bytes = do_splice_direct(old_file, &old_pos, new_file, &new_pos, this_len, SPLICE_F_MOVE); + ovl_end_write(dentry); if (bytes <= 0) { error = bytes; break; @@ -555,14 +563,16 @@ static int ovl_link_up(struct ovl_copy_up_ctx *c) struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); struct inode *udir = d_inode(upperdir); + ovl_start_write(c->dentry); + /* Mark parent "impure" because it may now contain non-pure upper */ err = ovl_set_impure(c->parent, upperdir); if (err) - return err; + goto out; err = ovl_set_nlink_lower(c->dentry); if (err) - return err; + goto out; inode_lock_nested(udir, I_MUTEX_PARENT); upper = ovl_lookup_upper(ofs, c->dentry->d_name.name, upperdir, @@ -581,10 +591,12 @@ static int ovl_link_up(struct ovl_copy_up_ctx *c) } inode_unlock(udir); if (err) - return err; + goto out; err = ovl_set_nlink_upper(c->dentry); +out: + ovl_end_write(c->dentry); return err; } @@ -719,21 +731,19 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx *c) .link = c->link }; - /* workdir and destdir could be the same when copying up to indexdir */ - err = -EIO; - if (lock_rename(c->workdir, c->destdir) != NULL) - goto unlock; - err = ovl_prep_cu_creds(c->dentry, &cc); if (err) - goto unlock; + return err; + ovl_start_write(c->dentry); + inode_lock(wdir); temp = ovl_create_temp(ofs, c->workdir, &cattr); + inode_unlock(wdir); + ovl_end_write(c->dentry); ovl_revert_cu_creds(&cc); - err = PTR_ERR(temp); if (IS_ERR(temp)) - goto unlock; + return PTR_ERR(temp); /* * Copy up data first and then xattrs. Writing data after @@ -741,8 +751,21 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx *c) */ path.dentry = temp; err = ovl_copy_up_data(c, &path); - if (err) + /* + * We cannot hold lock_rename() throughout this helper, because or + * lock ordering with sb_writers, which shouldn't be held when calling + * ovl_copy_up_data(), so lock workdir and destdir and make sure that + * temp wasn't moved before copy up completion or cleanup. + * If temp was moved, abort without the cleanup. + */ + ovl_start_write(c->dentry); + if (lock_rename(c->workdir, c->destdir) != NULL || + temp->d_parent != c->workdir) { + err = -EIO; + goto unlock; + } else if (err) { goto cleanup; + } err = ovl_copy_up_metadata(c, temp); if (err) @@ -779,6 +802,7 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx *c) ovl_set_flag(OVL_WHITEOUTS, inode); unlock: unlock_rename(c->workdir, c->destdir); + ovl_end_write(c->dentry); return err; @@ -802,9 +826,10 @@ static int ovl_copy_up_tmpfile(struct ovl_copy_up_ctx *c) if (err) return err; + ovl_start_write(c->dentry); tmpfile = ovl_do_tmpfile(ofs, c->workdir, c->stat.mode); + ovl_end_write(c->dentry); ovl_revert_cu_creds(&cc); - if (IS_ERR(tmpfile)) return PTR_ERR(tmpfile); @@ -815,9 +840,11 @@ static int ovl_copy_up_tmpfile(struct ovl_copy_up_ctx *c) goto out_fput; } + ovl_start_write(c->dentry); + err = ovl_copy_up_metadata(c, temp); if (err) - goto out_fput; + goto out; inode_lock_nested(udir, I_MUTEX_PARENT); @@ -831,7 +858,7 @@ static int ovl_copy_up_tmpfile(struct ovl_copy_up_ctx *c) inode_unlock(udir); if (err) - goto out_fput; + goto out; if (c->metacopy_digest) ovl_set_flag(OVL_HAS_DIGEST, d_inode(c->dentry)); @@ -843,6 +870,8 @@ static int ovl_copy_up_tmpfile(struct ovl_copy_up_ctx *c) ovl_set_upperdata(d_inode(c->dentry)); ovl_inode_update(d_inode(c->dentry), dget(temp)); +out: + ovl_end_write(c->dentry); out_fput: fput(tmpfile); return err; @@ -893,7 +922,9 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) * Mark parent "impure" because it may now contain non-pure * upper */ + ovl_start_write(c->dentry); err = ovl_set_impure(c->parent, c->destdir); + ovl_end_write(c->dentry); if (err) return err; } @@ -909,6 +940,7 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) if (c->indexed) ovl_set_flag(OVL_INDEX, d_inode(c->dentry)); + ovl_start_write(c->dentry); if (to_index) { /* Initialize nlink for copy up of disconnected dentry */ err = ovl_set_nlink_upper(c->dentry); @@ -923,6 +955,7 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) ovl_dentry_set_upper_alias(c->dentry); ovl_dentry_update_reval(c->dentry, ovl_dentry_upper(c->dentry)); } + ovl_end_write(c->dentry); out: if (to_index) @@ -1011,15 +1044,16 @@ static int ovl_copy_up_meta_inode_data(struct ovl_copy_up_ctx *c) * Writing to upper file will clear security.capability xattr. We * don't want that to happen for normal copy-up operation. */ + ovl_start_write(c->dentry); if (capability) { err = ovl_do_setxattr(ofs, upperpath.dentry, XATTR_NAME_CAPS, capability, cap_size, 0); - if (err) - goto out_free; } - - - err = ovl_removexattr(ofs, upperpath.dentry, OVL_XATTR_METACOPY); + if (!err) { + err = ovl_removexattr(ofs, upperpath.dentry, + OVL_XATTR_METACOPY); + } + ovl_end_write(c->dentry); if (err) goto out_free; diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 5e35b818ef5d46..7766273203f9d4 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -670,6 +670,10 @@ bool ovl_already_copied_up(struct dentry *dentry, int flags) return false; } +/* + * The copy up "transaction" keeps an elevated mnt write count on upper mnt, + * but leaves taking freeze protection on upper sb to lower level helpers. + */ int ovl_copy_up_start(struct dentry *dentry, int flags) { struct inode *inode = d_inode(dentry); @@ -682,7 +686,7 @@ int ovl_copy_up_start(struct dentry *dentry, int flags) if (ovl_already_copied_up_locked(dentry, flags)) err = 1; /* Already copied up */ else - err = ovl_want_write(dentry); + err = ovl_get_write_access(dentry); if (err) goto out_unlock; @@ -695,7 +699,7 @@ int ovl_copy_up_start(struct dentry *dentry, int flags) void ovl_copy_up_end(struct dentry *dentry) { - ovl_drop_write(dentry); + ovl_put_write_access(dentry); ovl_inode_unlock(d_inode(dentry)); } From 72675d6ab4f8c84632f92b8a25084d64313c8f49 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Wed, 16 Aug 2023 16:47:59 +0300 Subject: [PATCH 190/515] ovl: do not encode lower fh with upper sb_writers held When lower fs is a nested overlayfs, calling encode_fh() on a lower directory dentry may trigger copy up and take sb_writers on the upper fs of the lower nested overlayfs. The lower nested overlayfs may have the same upper fs as this overlayfs, so nested sb_writers lock is illegal. Move all the callers that encode lower fh to before ovl_want_write(). Signed-off-by: Amir Goldstein --- fs/overlayfs/copy_up.c | 53 +++++++++++++++++++++++++--------------- fs/overlayfs/namei.c | 37 +++++++++++++++++++++------- fs/overlayfs/overlayfs.h | 26 ++++++++++++++------ fs/overlayfs/super.c | 20 ++++++++++----- fs/overlayfs/util.c | 11 ++++++++- 5 files changed, 104 insertions(+), 43 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index cabf4752dc3ded..4382881b070948 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -434,29 +434,29 @@ struct ovl_fh *ovl_encode_real_fh(struct ovl_fs *ofs, struct dentry *real, return ERR_PTR(err); } -int ovl_set_origin(struct ovl_fs *ofs, struct dentry *lower, - struct dentry *upper) +struct ovl_fh *ovl_get_origin_fh(struct ovl_fs *ofs, struct dentry *origin) { - const struct ovl_fh *fh = NULL; - int err; - /* * When lower layer doesn't support export operations store a 'null' fh, * so we can use the overlay.origin xattr to distignuish between a copy * up and a pure upper inode. */ - if (ovl_can_decode_fh(lower->d_sb)) { - fh = ovl_encode_real_fh(ofs, lower, false); - if (IS_ERR(fh)) - return PTR_ERR(fh); - } + if (!ovl_can_decode_fh(origin->d_sb)) + return NULL; + + return ovl_encode_real_fh(ofs, origin, false); +} + +int ovl_set_origin_fh(struct ovl_fs *ofs, const struct ovl_fh *fh, + struct dentry *upper) +{ + int err; /* * Do not fail when upper doesn't support xattrs. */ err = ovl_check_setxattr(ofs, upper, OVL_XATTR_ORIGIN, fh->buf, fh ? fh->fb.len : 0, 0); - kfree(fh); /* Ignore -EPERM from setting "user.*" on symlink/special */ return err == -EPERM ? 0 : err; @@ -484,7 +484,7 @@ static int ovl_set_upper_fh(struct ovl_fs *ofs, struct dentry *upper, * * Caller must hold i_mutex on indexdir. */ -static int ovl_create_index(struct dentry *dentry, struct dentry *origin, +static int ovl_create_index(struct dentry *dentry, const struct ovl_fh *fh, struct dentry *upper) { struct ovl_fs *ofs = OVL_FS(dentry->d_sb); @@ -510,7 +510,7 @@ static int ovl_create_index(struct dentry *dentry, struct dentry *origin, if (WARN_ON(ovl_test_flag(OVL_INDEX, d_inode(dentry)))) return -EIO; - err = ovl_get_index_name(ofs, origin, &name); + err = ovl_get_index_name_fh(fh, &name); if (err) return err; @@ -549,6 +549,7 @@ struct ovl_copy_up_ctx { struct dentry *destdir; struct qstr destname; struct dentry *workdir; + const struct ovl_fh *origin_fh; bool origin; bool indexed; bool metacopy; @@ -649,7 +650,7 @@ static int ovl_copy_up_metadata(struct ovl_copy_up_ctx *c, struct dentry *temp) * hard link. */ if (c->origin) { - err = ovl_set_origin(ofs, c->lowerpath.dentry, temp); + err = ovl_set_origin_fh(ofs, c->origin_fh, temp); if (err) return err; } @@ -772,7 +773,7 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx *c) goto cleanup; if (S_ISDIR(c->stat.mode) && c->indexed) { - err = ovl_create_index(c->dentry, c->lowerpath.dentry, temp); + err = ovl_create_index(c->dentry, c->origin_fh, temp); if (err) goto cleanup; } @@ -890,6 +891,8 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) { int err; struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); + struct dentry *origin = c->lowerpath.dentry; + struct ovl_fh *fh = NULL; bool to_index = false; /* @@ -906,17 +909,25 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) to_index = true; } - if (S_ISDIR(c->stat.mode) || c->stat.nlink == 1 || to_index) + if (S_ISDIR(c->stat.mode) || c->stat.nlink == 1 || to_index) { + fh = ovl_get_origin_fh(ofs, origin); + if (IS_ERR(fh)) + return PTR_ERR(fh); + + /* origin_fh may be NULL */ + c->origin_fh = fh; c->origin = true; + } if (to_index) { c->destdir = ovl_indexdir(c->dentry->d_sb); - err = ovl_get_index_name(ofs, c->lowerpath.dentry, &c->destname); + err = ovl_get_index_name(ofs, origin, &c->destname); if (err) - return err; + goto out_free_fh; } else if (WARN_ON(!c->parent)) { /* Disconnected dentry must be copied up to index dir */ - return -EIO; + err = -EIO; + goto out_free_fh; } else { /* * Mark parent "impure" because it may now contain non-pure @@ -926,7 +937,7 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) err = ovl_set_impure(c->parent, c->destdir); ovl_end_write(c->dentry); if (err) - return err; + goto out_free_fh; } /* Should we copyup with O_TMPFILE or with workdir? */ @@ -960,6 +971,8 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) out: if (to_index) kfree(c->destname.name); +out_free_fh: + kfree(fh); return err; } diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index 80391c687c2ad8..f10ac4ae35f0a3 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -507,6 +507,19 @@ static int ovl_verify_fh(struct ovl_fs *ofs, struct dentry *dentry, return err; } +int ovl_verify_set_fh(struct ovl_fs *ofs, struct dentry *dentry, + enum ovl_xattr ox, const struct ovl_fh *fh, + bool is_upper, bool set) +{ + int err; + + err = ovl_verify_fh(ofs, dentry, ox, fh); + if (set && err == -ENODATA) + err = ovl_setxattr(ofs, dentry, ox, fh->buf, fh->fb.len); + + return err; +} + /* * Verify that @real dentry matches the file handle stored in xattr @name. * @@ -515,9 +528,9 @@ static int ovl_verify_fh(struct ovl_fs *ofs, struct dentry *dentry, * * Return 0 on match, -ESTALE on mismatch, -ENODATA on no xattr, < 0 on error. */ -int ovl_verify_set_fh(struct ovl_fs *ofs, struct dentry *dentry, - enum ovl_xattr ox, struct dentry *real, bool is_upper, - bool set) +int ovl_verify_origin_xattr(struct ovl_fs *ofs, struct dentry *dentry, + enum ovl_xattr ox, struct dentry *real, + bool is_upper, bool set) { struct inode *inode; struct ovl_fh *fh; @@ -530,9 +543,7 @@ int ovl_verify_set_fh(struct ovl_fs *ofs, struct dentry *dentry, goto fail; } - err = ovl_verify_fh(ofs, dentry, ox, fh); - if (set && err == -ENODATA) - err = ovl_setxattr(ofs, dentry, ox, fh->buf, fh->fb.len); + err = ovl_verify_set_fh(ofs, dentry, ox, fh, is_upper, set); if (err) goto fail; @@ -548,6 +559,7 @@ int ovl_verify_set_fh(struct ovl_fs *ofs, struct dentry *dentry, goto out; } + /* Get upper dentry from index */ struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index, bool connected) @@ -684,7 +696,7 @@ int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index) goto out; } -static int ovl_get_index_name_fh(struct ovl_fh *fh, struct qstr *name) +int ovl_get_index_name_fh(const struct ovl_fh *fh, struct qstr *name) { char *n, *s; @@ -873,20 +885,27 @@ int ovl_path_next(int idx, struct dentry *dentry, struct path *path) static int ovl_fix_origin(struct ovl_fs *ofs, struct dentry *dentry, struct dentry *lower, struct dentry *upper) { + const struct ovl_fh *fh; int err; if (ovl_check_origin_xattr(ofs, upper)) return 0; + fh = ovl_get_origin_fh(ofs, lower); + if (IS_ERR(fh)) + return PTR_ERR(fh); + err = ovl_want_write(dentry); if (err) - return err; + goto out; - err = ovl_set_origin(ofs, lower, upper); + err = ovl_set_origin_fh(ofs, fh, upper); if (!err) err = ovl_set_impure(dentry->d_parent, upper->d_parent); ovl_drop_write(dentry); +out: + kfree(fh); return err; } diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index a22de83e0a9b28..26e4fc4e44c8a7 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -628,11 +628,15 @@ struct dentry *ovl_decode_real_fh(struct ovl_fs *ofs, struct ovl_fh *fh, int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, bool connected, struct dentry *upperdentry, struct ovl_path **stackp); int ovl_verify_set_fh(struct ovl_fs *ofs, struct dentry *dentry, - enum ovl_xattr ox, struct dentry *real, bool is_upper, - bool set); + enum ovl_xattr ox, const struct ovl_fh *fh, + bool is_upper, bool set); +int ovl_verify_origin_xattr(struct ovl_fs *ofs, struct dentry *dentry, + enum ovl_xattr ox, struct dentry *real, + bool is_upper, bool set); struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index, bool connected); int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index); +int ovl_get_index_name_fh(const struct ovl_fh *fh, struct qstr *name); int ovl_get_index_name(struct ovl_fs *ofs, struct dentry *origin, struct qstr *name); struct dentry *ovl_get_index_fh(struct ovl_fs *ofs, struct ovl_fh *fh); @@ -644,17 +648,24 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags); bool ovl_lower_positive(struct dentry *dentry); +static inline int ovl_verify_origin_fh(struct ovl_fs *ofs, struct dentry *upper, + const struct ovl_fh *fh, bool set) +{ + return ovl_verify_set_fh(ofs, upper, OVL_XATTR_ORIGIN, fh, false, set); +} + static inline int ovl_verify_origin(struct ovl_fs *ofs, struct dentry *upper, struct dentry *origin, bool set) { - return ovl_verify_set_fh(ofs, upper, OVL_XATTR_ORIGIN, origin, - false, set); + return ovl_verify_origin_xattr(ofs, upper, OVL_XATTR_ORIGIN, origin, + false, set); } static inline int ovl_verify_upper(struct ovl_fs *ofs, struct dentry *index, struct dentry *upper, bool set) { - return ovl_verify_set_fh(ofs, index, OVL_XATTR_UPPER, upper, true, set); + return ovl_verify_origin_xattr(ofs, index, OVL_XATTR_UPPER, upper, + true, set); } /* readdir.c */ @@ -819,8 +830,9 @@ int ovl_copy_xattr(struct super_block *sb, const struct path *path, struct dentr int ovl_set_attr(struct ovl_fs *ofs, struct dentry *upper, struct kstat *stat); struct ovl_fh *ovl_encode_real_fh(struct ovl_fs *ofs, struct dentry *real, bool is_upper); -int ovl_set_origin(struct ovl_fs *ofs, struct dentry *lower, - struct dentry *upper); +struct ovl_fh *ovl_get_origin_fh(struct ovl_fs *ofs, struct dentry *origin); +int ovl_set_origin_fh(struct ovl_fs *ofs, const struct ovl_fh *fh, + struct dentry *upper); /* export.c */ extern const struct export_operations ovl_export_operations; diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index fd9ee086f127fb..7fdcc5fa7a3751 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -879,15 +879,20 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs, { struct vfsmount *mnt = ovl_upper_mnt(ofs); struct dentry *indexdir; + struct dentry *origin = ovl_lowerstack(oe)->dentry; + const struct ovl_fh *fh; int err; + fh = ovl_get_origin_fh(ofs, origin); + if (IS_ERR(fh)) + return PTR_ERR(fh); + err = mnt_want_write(mnt); if (err) - return err; + goto out_free_fh; /* Verify lower root is upper root origin */ - err = ovl_verify_origin(ofs, upperpath->dentry, - ovl_lowerstack(oe)->dentry, true); + err = ovl_verify_origin_fh(ofs, upperpath->dentry, fh, true); if (err) { pr_err("failed to verify upper root origin\n"); goto out; @@ -919,9 +924,10 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs, * directory entries. */ if (ovl_check_origin_xattr(ofs, ofs->indexdir)) { - err = ovl_verify_set_fh(ofs, ofs->indexdir, - OVL_XATTR_ORIGIN, - upperpath->dentry, true, false); + err = ovl_verify_origin_xattr(ofs, ofs->indexdir, + OVL_XATTR_ORIGIN, + upperpath->dentry, true, + false); if (err) pr_err("failed to verify index dir 'origin' xattr\n"); } @@ -939,6 +945,8 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs, out: mnt_drop_write(mnt); +out_free_fh: + kfree(fh); return err; } diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 7766273203f9d4..d2ef3c49766dbc 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -1013,12 +1013,18 @@ static void ovl_cleanup_index(struct dentry *dentry) struct dentry *index = NULL; struct inode *inode; struct qstr name = { }; + bool got_write = false; int err; err = ovl_get_index_name(ofs, lowerdentry, &name); if (err) goto fail; + err = ovl_want_write(dentry); + if (err) + goto fail; + + got_write = true; inode = d_inode(upperdentry); if (!S_ISDIR(inode->i_mode) && inode->i_nlink != 1) { pr_warn_ratelimited("cleanup linked index (%pd2, ino=%lu, nlink=%u)\n", @@ -1056,6 +1062,8 @@ static void ovl_cleanup_index(struct dentry *dentry) goto fail; out: + if (got_write) + ovl_drop_write(dentry); kfree(name.name); dput(index); return; @@ -1135,6 +1143,8 @@ void ovl_nlink_end(struct dentry *dentry) { struct inode *inode = d_inode(dentry); + ovl_drop_write(dentry); + if (ovl_test_flag(OVL_INDEX, inode) && inode->i_nlink == 0) { const struct cred *old_cred; @@ -1143,7 +1153,6 @@ void ovl_nlink_end(struct dentry *dentry) revert_creds(old_cred); } - ovl_drop_write(dentry); ovl_inode_unlock(inode); } From 383c69d942cf5cebdea50f081b97149b466c2f4d Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Tue, 10 Oct 2023 14:17:59 +0300 Subject: [PATCH 191/515] ovl: Move xattr support to new xattrs.c file This moves the code from super.c and inode.c, and makes ovl_xattr_get/set() static. This is in preparation for doing more work on xattrs support. Signed-off-by: Alexander Larsson Reviewed-by: Amir Goldstein Signed-off-by: Amir Goldstein --- fs/overlayfs/Makefile | 2 +- fs/overlayfs/inode.c | 122 ------------------------ fs/overlayfs/overlayfs.h | 18 ++-- fs/overlayfs/super.c | 65 +------------ fs/overlayfs/xattrs.c | 196 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 207 insertions(+), 196 deletions(-) create mode 100644 fs/overlayfs/xattrs.c diff --git a/fs/overlayfs/Makefile b/fs/overlayfs/Makefile index 4e173d56b11fae..5648954f8588b8 100644 --- a/fs/overlayfs/Makefile +++ b/fs/overlayfs/Makefile @@ -6,4 +6,4 @@ obj-$(CONFIG_OVERLAY_FS) += overlay.o overlay-objs := super.o namei.o util.o inode.o file.o dir.o readdir.o \ - copy_up.o export.o params.o + copy_up.o export.o params.o xattrs.o diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 27467e512663cf..8adc27e5e45140 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -339,128 +339,6 @@ static const char *ovl_get_link(struct dentry *dentry, return p; } -bool ovl_is_private_xattr(struct super_block *sb, const char *name) -{ - struct ovl_fs *ofs = OVL_FS(sb); - - if (ofs->config.userxattr) - return strncmp(name, OVL_XATTR_USER_PREFIX, - sizeof(OVL_XATTR_USER_PREFIX) - 1) == 0; - else - return strncmp(name, OVL_XATTR_TRUSTED_PREFIX, - sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) == 0; -} - -int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, - const void *value, size_t size, int flags) -{ - int err; - struct ovl_fs *ofs = OVL_FS(dentry->d_sb); - struct dentry *upperdentry = ovl_i_dentry_upper(inode); - struct dentry *realdentry = upperdentry ?: ovl_dentry_lower(dentry); - struct path realpath; - const struct cred *old_cred; - - if (!value && !upperdentry) { - 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); - if (err < 0) - goto out; - } - - if (!upperdentry) { - err = ovl_copy_up(dentry); - if (err) - goto out; - - realdentry = ovl_dentry_upper(dentry); - } - - err = ovl_want_write(dentry); - if (err) - goto out; - - old_cred = ovl_override_creds(dentry->d_sb); - if (value) { - err = ovl_do_setxattr(ofs, realdentry, name, value, size, - flags); - } else { - WARN_ON(flags != XATTR_REPLACE); - err = ovl_do_removexattr(ofs, realdentry, name); - } - revert_creds(old_cred); - ovl_drop_write(dentry); - - /* copy c/mtime */ - ovl_copyattr(inode); -out: - return err; -} - -int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name, - void *value, size_t size) -{ - ssize_t res; - const struct cred *old_cred; - struct path realpath; - - 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); - return res; -} - -static bool ovl_can_list(struct super_block *sb, const char *s) -{ - /* Never list private (.overlay) */ - if (ovl_is_private_xattr(sb, s)) - return false; - - /* List all non-trusted xattrs */ - if (strncmp(s, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0) - return true; - - /* list other trusted for superuser only */ - return ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN); -} - -ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) -{ - struct dentry *realdentry = ovl_dentry_real(dentry); - ssize_t res; - size_t len; - char *s; - const struct cred *old_cred; - - old_cred = ovl_override_creds(dentry->d_sb); - res = vfs_listxattr(realdentry, list, size); - revert_creds(old_cred); - if (res <= 0 || size == 0) - return res; - - /* filter out private xattrs */ - for (s = list, len = res; len;) { - size_t slen = strnlen(s, len) + 1; - - /* underlying fs providing us with an broken xattr list? */ - if (WARN_ON(slen > len)) - return -EIO; - - len -= slen; - if (!ovl_can_list(dentry->d_sb, s)) { - res -= slen; - memmove(s, s + slen, len); - } else { - s += slen; - } - } - - return res; -} - #ifdef CONFIG_FS_POSIX_ACL /* * Apply the idmapping of the layer to POSIX ACLs. The caller must pass a clone diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index 26e4fc4e44c8a7..59ee6ba79ee88b 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -699,17 +699,8 @@ int ovl_set_nlink_lower(struct dentry *dentry); unsigned int ovl_get_nlink(struct ovl_fs *ofs, struct dentry *lowerdentry, struct dentry *upperdentry, unsigned int fallback); -int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry, - struct iattr *attr); -int ovl_getattr(struct mnt_idmap *idmap, const struct path *path, - struct kstat *stat, u32 request_mask, unsigned int flags); int ovl_permission(struct mnt_idmap *idmap, struct inode *inode, int mask); -int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, - const void *value, size_t size, int flags); -int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name, - void *value, size_t size); -ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); #ifdef CONFIG_FS_POSIX_ACL struct posix_acl *do_ovl_get_acl(struct mnt_idmap *idmap, @@ -846,3 +837,12 @@ static inline bool ovl_force_readonly(struct ovl_fs *ofs) { return (!ovl_upper_mnt(ofs) || !ofs->workdir); } + +/* xattr.c */ + +const struct xattr_handler * const *ovl_xattr_handlers(struct ovl_fs *ofs); +int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry, + struct iattr *attr); +int ovl_getattr(struct mnt_idmap *idmap, const struct path *path, + struct kstat *stat, u32 request_mask, unsigned int flags); +ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index 7fdcc5fa7a3751..c487c97c065b3d 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -437,68 +437,6 @@ static bool ovl_workdir_ok(struct dentry *workdir, struct dentry *upperdir) return ok; } -static int ovl_own_xattr_get(const struct xattr_handler *handler, - struct dentry *dentry, struct inode *inode, - const char *name, void *buffer, size_t size) -{ - return -EOPNOTSUPP; -} - -static int ovl_own_xattr_set(const struct xattr_handler *handler, - struct mnt_idmap *idmap, - struct dentry *dentry, struct inode *inode, - const char *name, const void *value, - size_t size, int flags) -{ - return -EOPNOTSUPP; -} - -static int ovl_other_xattr_get(const struct xattr_handler *handler, - struct dentry *dentry, struct inode *inode, - const char *name, void *buffer, size_t size) -{ - return ovl_xattr_get(dentry, inode, name, buffer, size); -} - -static int ovl_other_xattr_set(const struct xattr_handler *handler, - struct mnt_idmap *idmap, - struct dentry *dentry, struct inode *inode, - const char *name, const void *value, - size_t size, int flags) -{ - return ovl_xattr_set(dentry, inode, name, value, size, flags); -} - -static const struct xattr_handler ovl_own_trusted_xattr_handler = { - .prefix = OVL_XATTR_TRUSTED_PREFIX, - .get = ovl_own_xattr_get, - .set = ovl_own_xattr_set, -}; - -static const struct xattr_handler ovl_own_user_xattr_handler = { - .prefix = OVL_XATTR_USER_PREFIX, - .get = ovl_own_xattr_get, - .set = ovl_own_xattr_set, -}; - -static const struct xattr_handler ovl_other_xattr_handler = { - .prefix = "", /* catch all */ - .get = ovl_other_xattr_get, - .set = ovl_other_xattr_set, -}; - -static const struct xattr_handler * const ovl_trusted_xattr_handlers[] = { - &ovl_own_trusted_xattr_handler, - &ovl_other_xattr_handler, - NULL -}; - -static const struct xattr_handler * const ovl_user_xattr_handlers[] = { - &ovl_own_user_xattr_handler, - &ovl_other_xattr_handler, - NULL -}; - static int ovl_setup_trap(struct super_block *sb, struct dentry *dir, struct inode **ptrap, const char *name) { @@ -1493,8 +1431,7 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc) cap_lower(cred->cap_effective, CAP_SYS_RESOURCE); sb->s_magic = OVERLAYFS_SUPER_MAGIC; - sb->s_xattr = ofs->config.userxattr ? ovl_user_xattr_handlers : - ovl_trusted_xattr_handlers; + sb->s_xattr = ovl_xattr_handlers(ofs); sb->s_fs_info = ofs; sb->s_flags |= SB_POSIXACL; sb->s_iflags |= SB_I_SKIP_SYNC | SB_I_IMA_UNVERIFIABLE_SIGNATURE; diff --git a/fs/overlayfs/xattrs.c b/fs/overlayfs/xattrs.c new file mode 100644 index 00000000000000..8e7e4ca62448b0 --- /dev/null +++ b/fs/overlayfs/xattrs.c @@ -0,0 +1,196 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include +#include +#include "overlayfs.h" + +bool ovl_is_private_xattr(struct super_block *sb, const char *name) +{ + struct ovl_fs *ofs = OVL_FS(sb); + + if (ofs->config.userxattr) + return strncmp(name, OVL_XATTR_USER_PREFIX, + sizeof(OVL_XATTR_USER_PREFIX) - 1) == 0; + else + return strncmp(name, OVL_XATTR_TRUSTED_PREFIX, + sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) == 0; +} + +static int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, + const void *value, size_t size, int flags) +{ + int err; + struct ovl_fs *ofs = OVL_FS(dentry->d_sb); + struct dentry *upperdentry = ovl_i_dentry_upper(inode); + struct dentry *realdentry = upperdentry ?: ovl_dentry_lower(dentry); + struct path realpath; + const struct cred *old_cred; + + if (!value && !upperdentry) { + 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); + if (err < 0) + goto out; + } + + if (!upperdentry) { + err = ovl_copy_up(dentry); + if (err) + goto out; + + realdentry = ovl_dentry_upper(dentry); + } + + err = ovl_want_write(dentry); + if (err) + goto out; + + old_cred = ovl_override_creds(dentry->d_sb); + if (value) { + err = ovl_do_setxattr(ofs, realdentry, name, value, size, + flags); + } else { + WARN_ON(flags != XATTR_REPLACE); + err = ovl_do_removexattr(ofs, realdentry, name); + } + revert_creds(old_cred); + ovl_drop_write(dentry); + + /* copy c/mtime */ + ovl_copyattr(inode); +out: + return err; +} + +static int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name, + void *value, size_t size) +{ + ssize_t res; + const struct cred *old_cred; + struct path realpath; + + 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); + return res; +} + +static bool ovl_can_list(struct super_block *sb, const char *s) +{ + /* Never list private (.overlay) */ + if (ovl_is_private_xattr(sb, s)) + return false; + + /* List all non-trusted xattrs */ + if (strncmp(s, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0) + return true; + + /* list other trusted for superuser only */ + return ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN); +} + +ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) +{ + struct dentry *realdentry = ovl_dentry_real(dentry); + ssize_t res; + size_t len; + char *s; + const struct cred *old_cred; + + old_cred = ovl_override_creds(dentry->d_sb); + res = vfs_listxattr(realdentry, list, size); + revert_creds(old_cred); + if (res <= 0 || size == 0) + return res; + + /* filter out private xattrs */ + for (s = list, len = res; len;) { + size_t slen = strnlen(s, len) + 1; + + /* underlying fs providing us with an broken xattr list? */ + if (WARN_ON(slen > len)) + return -EIO; + + len -= slen; + if (!ovl_can_list(dentry->d_sb, s)) { + res -= slen; + memmove(s, s + slen, len); + } else { + s += slen; + } + } + + return res; +} + +static int ovl_own_xattr_get(const struct xattr_handler *handler, + struct dentry *dentry, struct inode *inode, + const char *name, void *buffer, size_t size) +{ + return -EOPNOTSUPP; +} + +static int ovl_own_xattr_set(const struct xattr_handler *handler, + struct mnt_idmap *idmap, + struct dentry *dentry, struct inode *inode, + const char *name, const void *value, + size_t size, int flags) +{ + return -EOPNOTSUPP; +} + +static int ovl_other_xattr_get(const struct xattr_handler *handler, + struct dentry *dentry, struct inode *inode, + const char *name, void *buffer, size_t size) +{ + return ovl_xattr_get(dentry, inode, name, buffer, size); +} + +static int ovl_other_xattr_set(const struct xattr_handler *handler, + struct mnt_idmap *idmap, + struct dentry *dentry, struct inode *inode, + const char *name, const void *value, + size_t size, int flags) +{ + return ovl_xattr_set(dentry, inode, name, value, size, flags); +} + +static const struct xattr_handler ovl_own_trusted_xattr_handler = { + .prefix = OVL_XATTR_TRUSTED_PREFIX, + .get = ovl_own_xattr_get, + .set = ovl_own_xattr_set, +}; + +static const struct xattr_handler ovl_own_user_xattr_handler = { + .prefix = OVL_XATTR_USER_PREFIX, + .get = ovl_own_xattr_get, + .set = ovl_own_xattr_set, +}; + +static const struct xattr_handler ovl_other_xattr_handler = { + .prefix = "", /* catch all */ + .get = ovl_other_xattr_get, + .set = ovl_other_xattr_set, +}; + +static const struct xattr_handler * const ovl_trusted_xattr_handlers[] = { + &ovl_own_trusted_xattr_handler, + &ovl_other_xattr_handler, + NULL +}; + +static const struct xattr_handler * const ovl_user_xattr_handlers[] = { + &ovl_own_user_xattr_handler, + &ovl_other_xattr_handler, + NULL +}; + +const struct xattr_handler * const *ovl_xattr_handlers(struct ovl_fs *ofs) +{ + return ofs->config.userxattr ? ovl_user_xattr_handlers : + ovl_trusted_xattr_handlers; +} + From 901b4eee3038d4aeab3edeb4956384f96a000f5b Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 15 Aug 2023 09:33:44 +0200 Subject: [PATCH 192/515] ovl: Add OVL_XATTR_TRUSTED/USER_PREFIX_LEN macros These match the ones for e.g. XATTR_TRUSTED_PREFIX_LEN. Signed-off-by: Alexander Larsson Reviewed-by: Amir Goldstein Signed-off-by: Amir Goldstein --- fs/overlayfs/overlayfs.h | 2 ++ fs/overlayfs/xattrs.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index 59ee6ba79ee88b..1c0ad84646e86d 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -28,7 +28,9 @@ enum ovl_path_type { #define OVL_XATTR_NAMESPACE "overlay." #define OVL_XATTR_TRUSTED_PREFIX XATTR_TRUSTED_PREFIX OVL_XATTR_NAMESPACE +#define OVL_XATTR_TRUSTED_PREFIX_LEN (sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) #define OVL_XATTR_USER_PREFIX XATTR_USER_PREFIX OVL_XATTR_NAMESPACE +#define OVL_XATTR_USER_PREFIX_LEN (sizeof(OVL_XATTR_USER_PREFIX) - 1) enum ovl_xattr { OVL_XATTR_OPAQUE, diff --git a/fs/overlayfs/xattrs.c b/fs/overlayfs/xattrs.c index 8e7e4ca62448b0..d20032f8a53734 100644 --- a/fs/overlayfs/xattrs.c +++ b/fs/overlayfs/xattrs.c @@ -10,10 +10,10 @@ bool ovl_is_private_xattr(struct super_block *sb, const char *name) if (ofs->config.userxattr) return strncmp(name, OVL_XATTR_USER_PREFIX, - sizeof(OVL_XATTR_USER_PREFIX) - 1) == 0; + OVL_XATTR_USER_PREFIX_LEN) == 0; else return strncmp(name, OVL_XATTR_TRUSTED_PREFIX, - sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) == 0; + OVL_XATTR_TRUSTED_PREFIX_LEN) == 0; } static int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, From a3ba0ba4040c5dec310c22b384005f08600364db Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 15 Aug 2023 09:40:50 +0200 Subject: [PATCH 193/515] ovl: Support escaped overlay.* xattrs There are cases where you want to use an overlayfs mount as a lowerdir for another overlayfs mount. For example, if the system rootfs is on overlayfs due to composefs, or to make it volatile (via tmps), then you cannot currently store a lowerdir on the rootfs. This means you can't e.g. store on the rootfs a prepared container image for use using overlayfs. To work around this, we introduce an escapment mechanism for overlayfs xattrs. Whenever the lower/upper dir has a xattr named "overlay.overlay.XYZ", we list it as "overlay.XYZ" in listxattrs, and when the user calls getxattr or setxattr on "overlay.XYZ", we apply to "overlay.overlay.XYZ" in the backing directories. This allows storing any kind of overlay xattrs in a overlayfs mount that can be used as a lowerdir in another mount. It is possible to stack this mechanism multiple times, such that "overlay.overlay.overlay.XYZ" will survive two levels of overlay mounts, however this is not all that useful in practice because of stack depth limitations of overlayfs mounts. Note: These escaped xattrs are copied to upper during copy-up. Signed-off-by: Alexander Larsson Reviewed-by: Amir Goldstein Signed-off-by: Amir Goldstein --- fs/overlayfs/overlayfs.h | 7 ++++ fs/overlayfs/xattrs.c | 81 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index 1c0ad84646e86d..393c6ba9bffa1c 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -32,6 +32,13 @@ enum ovl_path_type { #define OVL_XATTR_USER_PREFIX XATTR_USER_PREFIX OVL_XATTR_NAMESPACE #define OVL_XATTR_USER_PREFIX_LEN (sizeof(OVL_XATTR_USER_PREFIX) - 1) +#define OVL_XATTR_ESCAPE_PREFIX OVL_XATTR_NAMESPACE +#define OVL_XATTR_ESCAPE_PREFIX_LEN (sizeof(OVL_XATTR_ESCAPE_PREFIX) - 1) +#define OVL_XATTR_ESCAPE_TRUSTED_PREFIX OVL_XATTR_TRUSTED_PREFIX OVL_XATTR_ESCAPE_PREFIX +#define OVL_XATTR_ESCAPE_TRUSTED_PREFIX_LEN (sizeof(OVL_XATTR_ESCAPE_TRUSTED_PREFIX) - 1) +#define OVL_XATTR_ESCAPE_USER_PREFIX OVL_XATTR_USER_PREFIX OVL_XATTR_ESCAPE_PREFIX +#define OVL_XATTR_ESCAPE_USER_PREFIX_LEN (sizeof(OVL_XATTR_ESCAPE_USER_PREFIX) - 1) + enum ovl_xattr { OVL_XATTR_OPAQUE, OVL_XATTR_REDIRECT, diff --git a/fs/overlayfs/xattrs.c b/fs/overlayfs/xattrs.c index d20032f8a53734..383978e4663c2a 100644 --- a/fs/overlayfs/xattrs.c +++ b/fs/overlayfs/xattrs.c @@ -4,7 +4,19 @@ #include #include "overlayfs.h" -bool ovl_is_private_xattr(struct super_block *sb, const char *name) +static bool ovl_is_escaped_xattr(struct super_block *sb, const char *name) +{ + struct ovl_fs *ofs = sb->s_fs_info; + + if (ofs->config.userxattr) + return strncmp(name, OVL_XATTR_ESCAPE_USER_PREFIX, + OVL_XATTR_ESCAPE_USER_PREFIX_LEN) == 0; + else + return strncmp(name, OVL_XATTR_ESCAPE_TRUSTED_PREFIX, + OVL_XATTR_ESCAPE_TRUSTED_PREFIX_LEN - 1) == 0; +} + +static bool ovl_is_own_xattr(struct super_block *sb, const char *name) { struct ovl_fs *ofs = OVL_FS(sb); @@ -16,6 +28,11 @@ bool ovl_is_private_xattr(struct super_block *sb, const char *name) OVL_XATTR_TRUSTED_PREFIX_LEN) == 0; } +bool ovl_is_private_xattr(struct super_block *sb, const char *name) +{ + return ovl_is_own_xattr(sb, name) && !ovl_is_escaped_xattr(sb, name); +} + static int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, const void *value, size_t size, int flags) { @@ -95,10 +112,12 @@ static bool ovl_can_list(struct super_block *sb, const char *s) ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) { struct dentry *realdentry = ovl_dentry_real(dentry); + struct ovl_fs *ofs = OVL_FS(dentry->d_sb); ssize_t res; size_t len; char *s; const struct cred *old_cred; + size_t prefix_len, name_len; old_cred = ovl_override_creds(dentry->d_sb); res = vfs_listxattr(realdentry, list, size); @@ -106,6 +125,9 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) if (res <= 0 || size == 0) return res; + prefix_len = ofs->config.userxattr ? + OVL_XATTR_USER_PREFIX_LEN : OVL_XATTR_TRUSTED_PREFIX_LEN; + /* filter out private xattrs */ for (s = list, len = res; len;) { size_t slen = strnlen(s, len) + 1; @@ -118,6 +140,12 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) if (!ovl_can_list(dentry->d_sb, s)) { res -= slen; memmove(s, s + slen, len); + } else if (ovl_is_escaped_xattr(dentry->d_sb, s)) { + res -= OVL_XATTR_ESCAPE_PREFIX_LEN; + name_len = slen - prefix_len - OVL_XATTR_ESCAPE_PREFIX_LEN; + s += prefix_len; + memmove(s, s + OVL_XATTR_ESCAPE_PREFIX_LEN, name_len + len); + s += name_len; } else { s += slen; } @@ -126,11 +154,47 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) return res; } +static char *ovl_xattr_escape_name(const char *prefix, const char *name) +{ + size_t prefix_len = strlen(prefix); + size_t name_len = strlen(name); + size_t escaped_len; + char *escaped, *s; + + escaped_len = prefix_len + OVL_XATTR_ESCAPE_PREFIX_LEN + name_len; + if (escaped_len > XATTR_NAME_MAX) + return ERR_PTR(-EOPNOTSUPP); + + escaped = kmalloc(escaped_len + 1, GFP_KERNEL); + if (escaped == NULL) + return ERR_PTR(-ENOMEM); + + s = escaped; + memcpy(s, prefix, prefix_len); + s += prefix_len; + memcpy(s, OVL_XATTR_ESCAPE_PREFIX, OVL_XATTR_ESCAPE_PREFIX_LEN); + s += OVL_XATTR_ESCAPE_PREFIX_LEN; + memcpy(s, name, name_len + 1); + + return escaped; +} + static int ovl_own_xattr_get(const struct xattr_handler *handler, struct dentry *dentry, struct inode *inode, const char *name, void *buffer, size_t size) { - return -EOPNOTSUPP; + char *escaped; + int r; + + escaped = ovl_xattr_escape_name(handler->prefix, name); + if (IS_ERR(escaped)) + return PTR_ERR(escaped); + + r = ovl_xattr_get(dentry, inode, escaped, buffer, size); + + kfree(escaped); + + return r; } static int ovl_own_xattr_set(const struct xattr_handler *handler, @@ -139,7 +203,18 @@ static int ovl_own_xattr_set(const struct xattr_handler *handler, const char *name, const void *value, size_t size, int flags) { - return -EOPNOTSUPP; + char *escaped; + int r; + + escaped = ovl_xattr_escape_name(handler->prefix, name); + if (IS_ERR(escaped)) + return PTR_ERR(escaped); + + r = ovl_xattr_set(dentry, inode, escaped, value, size, flags); + + kfree(escaped); + + return r; } static int ovl_other_xattr_get(const struct xattr_handler *handler, From 5c469d167941c400c3f2f5ba55dcf0ef498825aa Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 23 Aug 2023 16:33:42 +0200 Subject: [PATCH 194/515] ovl: Add an alternative type of whiteout An xattr whiteout (called "xwhiteout" in the code) is a reguar file of zero size with the "overlay.whiteout" xattr set. A file like this in a directory with the "overlay.whiteouts" xattrs set will be treated the same way as a regular whiteout. The "overlay.whiteouts" directory xattr is used in order to efficiently handle overlay checks in readdir(), as we only need to checks xattrs in affected directories. The advantage of this kind of whiteout is that they can be escaped using the standard overlay xattr escaping mechanism. So, a file with a "overlay.overlay.whiteout" xattr would be unescaped to "overlay.whiteout", which could then be consumed by another overlayfs as a whiteout. Overlayfs itself doesn't create whiteouts like this, but a userspace mechanism could use this alternative mechanism to convert images that may contain whiteouts to be used with overlayfs. To work as a whiteout for both regular overlayfs mounts as well as userxattr mounts both the "user.overlay.whiteout*" and the "trusted.overlay.whiteout*" xattrs will need to be created. Signed-off-by: Alexander Larsson Reviewed-by: Amir Goldstein Signed-off-by: Amir Goldstein --- fs/overlayfs/dir.c | 4 ++-- fs/overlayfs/namei.c | 15 ++++++++++----- fs/overlayfs/overlayfs.h | 15 +++++++++++++++ fs/overlayfs/readdir.c | 27 ++++++++++++++++++++------- fs/overlayfs/super.c | 2 +- fs/overlayfs/util.c | 40 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 88 insertions(+), 15 deletions(-) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 768120c20f85db..aab3f5d93556f9 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -477,7 +477,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, goto out_unlock; err = -ESTALE; - if (d_is_negative(upper) || !IS_WHITEOUT(d_inode(upper))) + if (d_is_negative(upper) || !ovl_upper_is_whiteout(ofs, upper)) goto out_dput; newdentry = ovl_create_temp(ofs, workdir, cattr); @@ -1211,7 +1211,7 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir, } } else { if (!d_is_negative(newdentry)) { - if (!new_opaque || !ovl_is_whiteout(newdentry)) + if (!new_opaque || !ovl_upper_is_whiteout(ofs, newdentry)) goto out_dput; } else { if (flags & RENAME_EXCHANGE) diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index f10ac4ae35f0a3..03bc8d5dfa3188 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -251,7 +251,10 @@ static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d, err = -EREMOTE; goto out_err; } - if (ovl_is_whiteout(this)) { + + path.dentry = this; + path.mnt = d->mnt; + if (ovl_path_is_whiteout(OVL_FS(d->sb), &path)) { d->stop = d->opaque = true; goto put_and_out; } @@ -264,8 +267,6 @@ static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d, goto put_and_out; } - path.dentry = this; - path.mnt = d->mnt; if (!d_can_lookup(this)) { if (d->is_dir || !last_element) { d->stop = true; @@ -438,7 +439,7 @@ int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, bool connected, else if (IS_ERR(origin)) return PTR_ERR(origin); - if (upperdentry && !ovl_is_whiteout(upperdentry) && + if (upperdentry && !ovl_upper_is_whiteout(ofs, upperdentry) && inode_wrong_type(d_inode(upperdentry), d_inode(origin)->i_mode)) goto invalid; @@ -1402,7 +1403,11 @@ bool ovl_lower_positive(struct dentry *dentry) break; } } else { - positive = !ovl_is_whiteout(this); + struct path path = { + .dentry = this, + .mnt = parentpath->layer->mnt, + }; + positive = !ovl_path_is_whiteout(OVL_FS(dentry->d_sb), &path); done = true; dput(this); } diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index 393c6ba9bffa1c..ca88b2636a5729 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -49,6 +49,8 @@ enum ovl_xattr { OVL_XATTR_UUID, OVL_XATTR_METACOPY, OVL_XATTR_PROTATTR, + OVL_XATTR_XWHITEOUT, + OVL_XATTR_XWHITEOUTS, }; enum ovl_inode_flag { @@ -473,6 +475,7 @@ void ovl_inode_update(struct inode *inode, struct dentry *upperdentry); void ovl_dir_modified(struct dentry *dentry, bool impurity); u64 ovl_inode_version_get(struct inode *inode); bool ovl_is_whiteout(struct dentry *dentry); +bool ovl_path_is_whiteout(struct ovl_fs *ofs, const struct path *path); struct file *ovl_path_open(const struct path *path, int flags); int ovl_copy_up_start(struct dentry *dentry, int flags); void ovl_copy_up_end(struct dentry *dentry); @@ -480,9 +483,21 @@ bool ovl_already_copied_up(struct dentry *dentry, int flags); bool ovl_path_check_dir_xattr(struct ovl_fs *ofs, const struct path *path, enum ovl_xattr ox); bool ovl_path_check_origin_xattr(struct ovl_fs *ofs, const struct path *path); +bool ovl_path_check_xwhiteout_xattr(struct ovl_fs *ofs, const struct path *path); +bool ovl_path_check_xwhiteouts_xattr(struct ovl_fs *ofs, const struct path *path); bool ovl_init_uuid_xattr(struct super_block *sb, struct ovl_fs *ofs, const struct path *upperpath); +static inline bool ovl_upper_is_whiteout(struct ovl_fs *ofs, + struct dentry *upperdentry) +{ + struct path upperpath = { + .dentry = upperdentry, + .mnt = ovl_upper_mnt(ofs), + }; + return ovl_path_is_whiteout(ofs, &upperpath); +} + static inline bool ovl_check_origin_xattr(struct ovl_fs *ofs, struct dentry *upperdentry) { diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c index de39e067ae65a5..a490fc47c3e7ea 100644 --- a/fs/overlayfs/readdir.c +++ b/fs/overlayfs/readdir.c @@ -25,6 +25,7 @@ struct ovl_cache_entry { struct ovl_cache_entry *next_maybe_whiteout; bool is_upper; bool is_whiteout; + bool check_xwhiteout; char name[]; }; @@ -47,6 +48,7 @@ struct ovl_readdir_data { int err; bool is_upper; bool d_type_supported; + bool in_xwhiteouts_dir; }; struct ovl_dir_file { @@ -162,6 +164,8 @@ static struct ovl_cache_entry *ovl_cache_entry_new(struct ovl_readdir_data *rdd, p->ino = 0; p->is_upper = rdd->is_upper; p->is_whiteout = false; + /* Defer check for overlay.whiteout to ovl_iterate() */ + p->check_xwhiteout = rdd->in_xwhiteouts_dir && d_type == DT_REG; if (d_type == DT_CHR) { p->next_maybe_whiteout = rdd->first_maybe_whiteout; @@ -301,6 +305,8 @@ static inline int ovl_dir_read(const struct path *realpath, if (IS_ERR(realfile)) return PTR_ERR(realfile); + rdd->in_xwhiteouts_dir = rdd->dentry && + ovl_path_check_xwhiteouts_xattr(OVL_FS(rdd->dentry->d_sb), realpath); rdd->first_maybe_whiteout = NULL; rdd->ctx.pos = 0; do { @@ -447,7 +453,7 @@ static u64 ovl_remap_lower_ino(u64 ino, int xinobits, int fsid, } /* - * Set d_ino for upper entries. Non-upper entries should always report + * Set d_ino for upper entries if needed. Non-upper entries should always report * the uppermost real inode ino and should not call this function. * * When not all layer are on same fs, report real ino also for upper. @@ -455,8 +461,11 @@ static u64 ovl_remap_lower_ino(u64 ino, int xinobits, int fsid, * When all layers are on the same fs, and upper has a reference to * copy up origin, call vfs_getattr() on the overlay entry to make * sure that d_ino will be consistent with st_ino from stat(2). + * + * Also checks the overlay.whiteout xattr by doing a full lookup which will return + * negative in this case. */ -static int ovl_cache_update_ino(const struct path *path, struct ovl_cache_entry *p) +static int ovl_cache_update(const struct path *path, struct ovl_cache_entry *p, bool update_ino) { struct dentry *dir = path->dentry; @@ -467,7 +476,7 @@ static int ovl_cache_update_ino(const struct path *path, struct ovl_cache_entry int xinobits = ovl_xino_bits(ofs); int err = 0; - if (!ovl_same_dev(ofs)) + if (!ovl_same_dev(ofs) && !p->check_xwhiteout) goto out; if (p->name[0] == '.') { @@ -481,6 +490,7 @@ static int ovl_cache_update_ino(const struct path *path, struct ovl_cache_entry goto get; } } + /* This checks also for xwhiteouts */ this = lookup_one(mnt_idmap(path->mnt), p->name, dir, p->len); if (IS_ERR_OR_NULL(this) || !this->d_inode) { /* Mark a stale entry */ @@ -494,6 +504,9 @@ static int ovl_cache_update_ino(const struct path *path, struct ovl_cache_entry } get: + if (!ovl_same_dev(ofs) || !update_ino) + goto out; + type = ovl_path_type(this); if (OVL_TYPE_ORIGIN(type)) { struct kstat stat; @@ -572,7 +585,7 @@ static int ovl_dir_read_impure(const struct path *path, struct list_head *list, list_for_each_entry_safe(p, n, list, l_node) { if (strcmp(p->name, ".") != 0 && strcmp(p->name, "..") != 0) { - err = ovl_cache_update_ino(path, p); + err = ovl_cache_update(path, p, true); if (err) return err; } @@ -778,13 +791,13 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx) while (od->cursor != &od->cache->entries) { p = list_entry(od->cursor, struct ovl_cache_entry, l_node); if (!p->is_whiteout) { - if (!p->ino) { - err = ovl_cache_update_ino(&file->f_path, p); + if (!p->ino || p->check_xwhiteout) { + err = ovl_cache_update(&file->f_path, p, !p->ino); if (err) goto out; } } - /* ovl_cache_update_ino() sets is_whiteout on stale entry */ + /* ovl_cache_update() sets is_whiteout on stale entry */ if (!p->is_whiteout) { if (!dir_emit(ctx, p->name, p->len, p->ino, p->type)) break; diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index c487c97c065b3d..60bd7331e20ff3 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -577,7 +577,7 @@ static int ovl_check_rename_whiteout(struct ovl_fs *ofs) if (IS_ERR(whiteout)) goto cleanup_temp; - err = ovl_is_whiteout(whiteout); + err = ovl_upper_is_whiteout(ofs, whiteout); /* Best effort cleanup of whiteout and temp file */ if (err) diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index d2ef3c49766dbc..a44eec80dc8232 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -601,6 +601,16 @@ bool ovl_is_whiteout(struct dentry *dentry) return inode && IS_WHITEOUT(inode); } +/* + * Use this over ovl_is_whiteout for upper and lower files, as it also + * handles overlay.whiteout xattr whiteout files. + */ +bool ovl_path_is_whiteout(struct ovl_fs *ofs, const struct path *path) +{ + return ovl_is_whiteout(path->dentry) || + ovl_path_check_xwhiteout_xattr(ofs, path); +} + struct file *ovl_path_open(const struct path *path, int flags) { struct inode *inode = d_inode(path->dentry); @@ -716,6 +726,32 @@ bool ovl_path_check_origin_xattr(struct ovl_fs *ofs, const struct path *path) return false; } +bool ovl_path_check_xwhiteout_xattr(struct ovl_fs *ofs, const struct path *path) +{ + struct dentry *dentry = path->dentry; + int res; + + /* xattr.whiteout must be a zero size regular file */ + if (!d_is_reg(dentry) || i_size_read(d_inode(dentry)) != 0) + return false; + + res = ovl_path_getxattr(ofs, path, OVL_XATTR_XWHITEOUT, NULL, 0); + return res >= 0; +} + +bool ovl_path_check_xwhiteouts_xattr(struct ovl_fs *ofs, const struct path *path) +{ + struct dentry *dentry = path->dentry; + int res; + + /* xattr.whiteouts must be a directory */ + if (!d_is_dir(dentry)) + return false; + + res = ovl_path_getxattr(ofs, path, OVL_XATTR_XWHITEOUTS, NULL, 0); + return res >= 0; +} + /* * Load persistent uuid from xattr into s_uuid if found, or store a new * random generated value in s_uuid and in xattr. @@ -800,6 +836,8 @@ bool ovl_path_check_dir_xattr(struct ovl_fs *ofs, const struct path *path, #define OVL_XATTR_UUID_POSTFIX "uuid" #define OVL_XATTR_METACOPY_POSTFIX "metacopy" #define OVL_XATTR_PROTATTR_POSTFIX "protattr" +#define OVL_XATTR_XWHITEOUT_POSTFIX "whiteout" +#define OVL_XATTR_XWHITEOUTS_POSTFIX "whiteouts" #define OVL_XATTR_TAB_ENTRY(x) \ [x] = { [false] = OVL_XATTR_TRUSTED_PREFIX x ## _POSTFIX, \ @@ -815,6 +853,8 @@ const char *const ovl_xattr_table[][2] = { OVL_XATTR_TAB_ENTRY(OVL_XATTR_UUID), OVL_XATTR_TAB_ENTRY(OVL_XATTR_METACOPY), OVL_XATTR_TAB_ENTRY(OVL_XATTR_PROTATTR), + OVL_XATTR_TAB_ENTRY(OVL_XATTR_XWHITEOUT), + OVL_XATTR_TAB_ENTRY(OVL_XATTR_XWHITEOUTS), }; int ovl_check_setxattr(struct ovl_fs *ofs, struct dentry *upperdentry, From 0b41c33dd34b61d6318d553ed15004efa05e5f09 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 16 Aug 2023 12:57:41 +0200 Subject: [PATCH 195/515] ovl: Add documentation on nesting of overlayfs mounts Signed-off-by: Alexander Larsson Reviewed-by: Amir Goldstein Signed-off-by: Amir Goldstein --- Documentation/filesystems/overlayfs.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Documentation/filesystems/overlayfs.rst b/Documentation/filesystems/overlayfs.rst index 5b93268e400f4c..ae1f72b462e33c 100644 --- a/Documentation/filesystems/overlayfs.rst +++ b/Documentation/filesystems/overlayfs.rst @@ -504,6 +504,29 @@ directory tree on the same or different underlying filesystem, and even to a different machine. With the "inodes index" feature, trying to mount the copied layers will fail the verification of the lower root file handle. +Nesting overlayfs mounts +------------------------ + +It is possible to use a lower directory that is stored on an overlayfs +mount. For regular files this does not need any special care. However, files +that have overlayfs attributes, such as whiteouts or "overlay.*" xattrs will be +interpreted by the underlying overlayfs mount and stripped out. In order to +allow the second overlayfs mount to see the attributes they must be escaped. + +Overlayfs specific xattrs are escaped by using a special prefix of +"overlay.overlay.". So, a file with a "trusted.overlay.overlay.metacopy" xattr +in the lower dir will be exposed as a regular file with a +"trusted.overlay.metacopy" xattr in the overlayfs mount. This can be nested by +repeating the prefix multiple time, as each instance only removes one prefix. + +A lower dir with a regular whiteout will always be handled by the overlayfs +mount, so to support storing an effective whiteout file in an overlayfs mount an +alternative form of whiteout is supported. This form is a regular, zero-size +file with the "overlay.whiteout" xattr set, inside a directory with the +"overlay.whiteouts" xattr set. Such whiteouts are never created by overlayfs, +but can be used by userspace tools (like containers) that generate lower layers. +These alternative whiteouts can be escaped using the standard xattr escape +mechanism in order to properly nest to any depth. Non-standard behavior --------------------- From 88e101a3a8dad4a7569a5b94fffe4eb89fbe1676 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 18 Sep 2023 14:41:12 +0200 Subject: [PATCH 196/515] arm64: xilinx: Do not use '_' in DT node names Character '_' not recommended in node name. Use '-' instead. Pretty much run seds below for node names. s/zynqmp_ipi/zynqmp-ipi/ s/nvmem_firmware/nvmem-firmware/ s/soc_revision/soc-revision/ s/si5335_/si5335-/ Signed-off-by: Michal Simek Link: https://lore.kernel.org/r/5137958580c85a35cf6aadd1c33a2f6bcf81a9e5.1695040866.git.michal.simek@amd.com --- arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts | 4 ++-- arch/arm64/boot/dts/xilinx/zynqmp.dtsi | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts index d0091d3cb7643d..52f998c2253817 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts @@ -123,13 +123,13 @@ io-channels = <&u35 0>, <&u35 1>, <&u35 2>, <&u35 3>; }; - si5335_0: si5335_0 { /* clk0_usb - u23 */ + si5335_0: si5335-0 { /* clk0_usb - u23 */ compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <26000000>; }; - si5335_1: si5335_1 { /* clk1_dp - u23 */ + si5335_1: si5335-1 { /* clk1_dp - u23 */ compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <27000000>; diff --git a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi index b61fc99cd911e8..e50e95cbe81798 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi +++ b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi @@ -129,7 +129,7 @@ }; }; - zynqmp_ipi: zynqmp_ipi { + zynqmp_ipi: zynqmp-ipi { bootph-all; compatible = "xlnx,zynqmp-ipi-mailbox"; interrupt-parent = <&gic>; @@ -194,12 +194,12 @@ mbox-names = "tx", "rx"; }; - nvmem_firmware { + nvmem-firmware { compatible = "xlnx,zynqmp-nvmem-fw"; #address-cells = <1>; #size-cells = <1>; - soc_revision: soc_revision@0 { + soc_revision: soc-revision@0 { reg = <0x0 0x4>; }; }; From 31f1da775843b090769dff82a87bd04c04191b99 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 18 Sep 2023 14:41:13 +0200 Subject: [PATCH 197/515] arm64: xilinx: Use lower case for partition address Lower case should be used for register address. Issue is reported as: flash@0: partitions: Unevaluated properties are not allowed ('partition@22A0000' was unexpected) Reviewed-by: Laurent Pinchart Signed-off-by: Michal Simek Link: https://lore.kernel.org/r/a96ac9a32a363b04958157548f290d480c21590c.1695040866.git.michal.simek@amd.com --- arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts b/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts index c4774a42d5fcd4..157dcb4a27a856 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts @@ -222,9 +222,9 @@ label = "Secure OS Storage"; reg = <0x2280000 0x20000>; /* 128KB */ }; - partition@22A0000 { + partition@22a0000 { label = "User"; - reg = <0x22A0000 0x1d60000>; /* 29.375 MB */ + reg = <0x22a0000 0x1d60000>; /* 29.375 MB */ }; }; }; From e5cd6e9ac16c4760d3b73162261475c5b10e1120 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 18 Sep 2023 14:41:14 +0200 Subject: [PATCH 198/515] arm64: xilinx: Remove mt25qu512a compatible string from SOM mt25qu512a is not documented in DT binding that's why remove it. Signed-off-by: Michal Simek Link: https://lore.kernel.org/r/a1e975f5785dfb6eb04e8d5905dcaa7467ccd585.1695040866.git.michal.simek@amd.com --- arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts b/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts index 157dcb4a27a856..cd5cd7f3b5ced1 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts @@ -131,7 +131,7 @@ &qspi { /* MIO 0-5 - U143 */ status = "okay"; spi_flash: flash@0 { /* MT25QU512A */ - compatible = "mt25qu512a", "jedec,spi-nor"; /* 64MB */ + compatible = "jedec,spi-nor"; /* 64MB */ #address-cells = <1>; #size-cells = <1>; reg = <0>; From e76ba0c14817e31350b85feb6c0c27f8012aeb50 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 18 Sep 2023 14:41:15 +0200 Subject: [PATCH 199/515] arm64: xilinx: Put ethernet phys to mdio node All zynqmp boards have been already described via mdio node that's why also convert zc1751. With using mdio node there is an option to add reset property for the whole mdio bus. Signed-off-by: Michal Simek Link: https://lore.kernel.org/r/dc228a27579b48f3e768fcb439d118b4a0f0ef5b.1695040866.git.michal.simek@amd.com --- .../dts/xilinx/zynqmp-zc1751-xm015-dc1.dts | 8 ++++-- .../dts/xilinx/zynqmp-zc1751-xm016-dc2.dts | 16 +++++++----- .../dts/xilinx/zynqmp-zc1751-xm017-dc3.dts | 8 ++++-- .../dts/xilinx/zynqmp-zc1751-xm018-dc4.dts | 26 +++++++++++-------- .../dts/xilinx/zynqmp-zc1751-xm019-dc5.dts | 8 ++++-- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm015-dc1.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm015-dc1.dts index e821d55d8d5a89..73491626e01e65 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm015-dc1.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm015-dc1.dts @@ -98,8 +98,12 @@ phy-mode = "rgmii-id"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gem3_default>; - phy0: ethernet-phy@0 { - reg = <0>; + mdio: mdio { + #address-cells = <1>; + #size-cells = <0>; + phy0: ethernet-phy@0 { + reg = <0>; + }; }; }; diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts index b59e11316b4be0..f767708fb50d92 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts @@ -91,12 +91,16 @@ phy-mode = "rgmii-id"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gem2_default>; - phy0: ethernet-phy@5 { - reg = <5>; - ti,rx-internal-delay = <0x8>; - ti,tx-internal-delay = <0xa>; - ti,fifo-depth = <0x1>; - ti,dp83867-rxctrl-strap-quirk; + mdio: mdio { + #address-cells = <1>; + #size-cells = <0>; + phy0: ethernet-phy@5 { + reg = <5>; + ti,rx-internal-delay = <0x8>; + ti,tx-internal-delay = <0xa>; + ti,fifo-depth = <0x1>; + ti,dp83867-rxctrl-strap-quirk; + }; }; }; diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm017-dc3.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm017-dc3.dts index 38b0a312171b70..f553b317e6b2a5 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm017-dc3.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm017-dc3.dts @@ -88,8 +88,12 @@ status = "okay"; phy-handle = <&phy0>; phy-mode = "rgmii-id"; - phy0: ethernet-phy@0 { /* VSC8211 */ - reg = <0>; + mdio: mdio { + #address-cells = <1>; + #size-cells = <0>; + phy0: ethernet-phy@0 { /* VSC8211 */ + reg = <0>; + }; }; }; diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm018-dc4.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm018-dc4.dts index 6636e76545a5d9..6ec1d9813973c4 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm018-dc4.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm018-dc4.dts @@ -116,17 +116,21 @@ status = "okay"; phy-mode = "rgmii-id"; phy-handle = <ðernet_phy0>; - ethernet_phy0: ethernet-phy@0 { /* Marvell 88e1512 */ - reg = <0>; - }; - ethernet_phy7: ethernet-phy@7 { /* Vitesse VSC8211 */ - reg = <7>; - }; - ethernet_phy3: ethernet-phy@3 { /* Realtek RTL8211DN */ - reg = <3>; - }; - ethernet_phy8: ethernet-phy@8 { /* Vitesse VSC8211 */ - reg = <8>; + mdio: mdio { + #address-cells = <1>; + #size-cells = <0>; + ethernet_phy0: ethernet-phy@0 { /* Marvell 88e1512 */ + reg = <0>; + }; + ethernet_phy7: ethernet-phy@7 { /* Vitesse VSC8211 */ + reg = <7>; + }; + ethernet_phy3: ethernet-phy@3 { /* Realtek RTL8211DN */ + reg = <3>; + }; + ethernet_phy8: ethernet-phy@8 { /* Vitesse VSC8211 */ + reg = <8>; + }; }; }; diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm019-dc5.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm019-dc5.dts index 0d2ea9c09a0a01..b1857e17ab7e8b 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm019-dc5.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm019-dc5.dts @@ -77,8 +77,12 @@ phy-mode = "rgmii-id"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gem1_default>; - phy0: ethernet-phy@0 { - reg = <0>; + mdio: mdio { + #address-cells = <1>; + #size-cells = <0>; + phy0: ethernet-phy@0 { + reg = <0>; + }; }; }; From d3e8dc9e7fa85e964f0bd40896dc08a8bac44a6a Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 18 Sep 2023 14:41:16 +0200 Subject: [PATCH 200/515] arm64: xilinx: Remove address/size-cells from flash node Partitions are described via fixed-partitions that's why there is no need to have address/size-cells in flash node. Signed-off-by: Michal Simek Link: https://lore.kernel.org/r/c4447028f914e77b8c28640dc458b8409198ee30.1695040866.git.michal.simek@amd.com --- arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts b/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts index cd5cd7f3b5ced1..51622896b1b1c3 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts +++ b/arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts @@ -132,8 +132,6 @@ status = "okay"; spi_flash: flash@0 { /* MT25QU512A */ compatible = "jedec,spi-nor"; /* 64MB */ - #address-cells = <1>; - #size-cells = <1>; reg = <0>; spi-tx-bus-width = <4>; spi-rx-bus-width = <4>; From b4d892f774b54904694cdd594c33f131f01991fa Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 18 Sep 2023 14:41:17 +0200 Subject: [PATCH 201/515] arm64: xilinx: Remove address/size-cells from gem nodes Some boards are using one mdio bus which holds multiple phys and also boards are using mdio node for bus description. That's why there are cases where address/size-cells are unnecessary which is also reported by make W=1 dtbs. That's why remove them from zynqmp.dtsi and let board DTSes to handle it based on used description. Error log: /axi/ethernet@ff0e0000: unnecessary #address-cells/#size-cells without "ranges" or child "reg" property Signed-off-by: Michal Simek Link: https://lore.kernel.org/r/7252203d52af3ca8867764c8514affc4828e530d.1695040866.git.michal.simek@amd.com --- arch/arm64/boot/dts/xilinx/zynqmp.dtsi | 8 -------- 1 file changed, 8 deletions(-) diff --git a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi index e50e95cbe81798..f5e1eb8cb3b7ca 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi +++ b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi @@ -584,8 +584,6 @@ ; reg = <0x0 0xff0b0000 0x0 0x1000>; clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; - #address-cells = <1>; - #size-cells = <0>; iommus = <&smmu 0x874>; power-domains = <&zynqmp_firmware PD_ETH_0>; resets = <&zynqmp_reset ZYNQMP_RESET_GEM0>; @@ -600,8 +598,6 @@ ; reg = <0x0 0xff0c0000 0x0 0x1000>; clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; - #address-cells = <1>; - #size-cells = <0>; iommus = <&smmu 0x875>; power-domains = <&zynqmp_firmware PD_ETH_1>; resets = <&zynqmp_reset ZYNQMP_RESET_GEM1>; @@ -616,8 +612,6 @@ ; reg = <0x0 0xff0d0000 0x0 0x1000>; clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; - #address-cells = <1>; - #size-cells = <0>; iommus = <&smmu 0x876>; power-domains = <&zynqmp_firmware PD_ETH_2>; resets = <&zynqmp_reset ZYNQMP_RESET_GEM2>; @@ -632,8 +626,6 @@ ; reg = <0x0 0xff0e0000 0x0 0x1000>; clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; - #address-cells = <1>; - #size-cells = <0>; iommus = <&smmu 0x877>; power-domains = <&zynqmp_firmware PD_ETH_3>; resets = <&zynqmp_reset ZYNQMP_RESET_GEM3>; From f7714fb9fe2bbecdef987a79e24492395f2cbd93 Mon Sep 17 00:00:00 2001 From: Leo Yan Date: Mon, 4 Sep 2023 17:23:11 +0800 Subject: [PATCH 202/515] MAINTAINERS: Remove myself as a Arm CoreSight reviewer I haven't done any meaningful work for a long while on Arm CoreSight and it's unlikely I'll be able to do related work in the future. Remove myself from the Arm CoreSight "Reviewers" list. Signed-off-by: Leo Yan Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20230904092311.389112-1-leo.yan@linaro.org --- MAINTAINERS | 1 - 1 file changed, 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 7a7bd8bd80e9f2..8e8aa984b5a136 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2054,7 +2054,6 @@ ARM/CORESIGHT FRAMEWORK AND DRIVERS M: Suzuki K Poulose R: Mike Leach R: James Clark -R: Leo Yan L: coresight@lists.linaro.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) S: Maintained From 4817af577b82adedcabbb4463e77ab2afe6d37b0 Mon Sep 17 00:00:00 2001 From: Anshuman Khandual Date: Tue, 29 Aug 2023 19:24:04 +0530 Subject: [PATCH 203/515] coresight: trbe: Add a representative coresight_platform_data for TRBE TRBE coresight devices do not need regular connections information, as the paths get built between all percpu source and their respective percpu sink devices. Please refer 'commit 2cd87a7b293d ("coresight: core: Add support for dedicated percpu sinks")' which added support for percpu sink devices. coresight_register() expect device connections via the platform_data. TRBE devices do not have any graph connections and thus is empty. With upcoming ACPI support for TRBE, we do not get a real acpi_device and thus coresight_get_platform_dat() will end up in failures. Hence this allocates a zeroed coresight_platform_data structure and assigns that back into the device. Cc: Suzuki K Poulose Cc: Mike Leach Cc: Leo Yan Cc: Alexander Shishkin Cc: coresight@lists.linaro.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Anshuman Khandual Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20230829135405.1159449-2-anshuman.khandual@arm.com --- drivers/hwtracing/coresight/coresight-trbe.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-trbe.c b/drivers/hwtracing/coresight/coresight-trbe.c index e20c1c6acc7315..97b9e72965e66b 100644 --- a/drivers/hwtracing/coresight/coresight-trbe.c +++ b/drivers/hwtracing/coresight/coresight-trbe.c @@ -1253,8 +1253,18 @@ static void arm_trbe_register_coresight_cpu(struct trbe_drvdata *drvdata, int cp desc.name = devm_kasprintf(dev, GFP_KERNEL, "trbe%d", cpu); if (!desc.name) goto cpu_clear; - - desc.pdata = coresight_get_platform_data(dev); + /* + * TRBE coresight devices do not need regular connections + * information, as the paths get built between all percpu + * source and their respective percpu sink devices. Though + * coresight_register() expect device connections via the + * platform_data, which TRBE devices do not have. As they + * are not real ACPI devices, coresight_get_platform_data() + * ends up failing. Instead let's allocate a dummy zeroed + * coresight_platform_data structure and assign that back + * into the device for that purpose. + */ + desc.pdata = devm_kzalloc(dev, sizeof(*desc.pdata), GFP_KERNEL); if (IS_ERR(desc.pdata)) goto cpu_clear; From 29edc1ce5c654cb66ef0a234b93c773fc8f2ba4a Mon Sep 17 00:00:00 2001 From: Anshuman Khandual Date: Tue, 29 Aug 2023 19:24:05 +0530 Subject: [PATCH 204/515] coresight: trbe: Enable ACPI based TRBE devices This detects and enables ACPI based TRBE devices via the dummy platform device created earlier for this purpose. Cc: Suzuki K Poulose Cc: Mike Leach Cc: Leo Yan Cc: Alexander Shishkin Cc: coresight@lists.linaro.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Anshuman Khandual Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20230829135405.1159449-3-anshuman.khandual@arm.com --- drivers/hwtracing/coresight/coresight-trbe.c | 9 +++++++++ drivers/hwtracing/coresight/coresight-trbe.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/drivers/hwtracing/coresight/coresight-trbe.c b/drivers/hwtracing/coresight/coresight-trbe.c index 97b9e72965e66b..a3954be7b1f3bf 100644 --- a/drivers/hwtracing/coresight/coresight-trbe.c +++ b/drivers/hwtracing/coresight/coresight-trbe.c @@ -1546,7 +1546,16 @@ static const struct of_device_id arm_trbe_of_match[] = { }; MODULE_DEVICE_TABLE(of, arm_trbe_of_match); +#ifdef CONFIG_ACPI +static const struct platform_device_id arm_trbe_acpi_match[] = { + { ARMV8_TRBE_PDEV_NAME, 0 }, + { } +}; +MODULE_DEVICE_TABLE(platform, arm_trbe_acpi_match); +#endif + static struct platform_driver arm_trbe_driver = { + .id_table = ACPI_PTR(arm_trbe_acpi_match), .driver = { .name = DRVNAME, .of_match_table = of_match_ptr(arm_trbe_of_match), diff --git a/drivers/hwtracing/coresight/coresight-trbe.h b/drivers/hwtracing/coresight/coresight-trbe.h index e915e749be5515..45202c48accec7 100644 --- a/drivers/hwtracing/coresight/coresight-trbe.h +++ b/drivers/hwtracing/coresight/coresight-trbe.h @@ -7,11 +7,13 @@ * * Author: Anshuman Khandual */ +#include #include #include #include #include #include +#include #include #include From 0f55b43dedcdae2b871f0fec59d8c672e62ff5de Mon Sep 17 00:00:00 2001 From: Anshuman Khandual Date: Thu, 21 Sep 2023 09:06:29 +0530 Subject: [PATCH 205/515] coresight: etm: Override TRCIDR3.CCITMIN on errata affected cpus This work arounds errata 1490853 on Cortex-A76, and Neoverse-N1, errata 1491015 on Cortex-A77, errata 1502854 on Cortex-X1, and errata 1619801 on Neoverse-V1, based affected cpus, where software read for TRCIDR3.CCITMIN field in ETM gets an wrong value. If software uses the value returned by the TRCIDR3.CCITMIN register field, then it will limit the range which could be used for programming the ETM. In reality, the ETM could be programmed with a much smaller value than what is indicated by the TRCIDR3.CCITMIN field and still function correctly. If software reads the TRCIDR3.CCITMIN register field, corresponding to the instruction trace counting minimum threshold, observe the value 0x100 or a minimum cycle count threshold of 256. The correct value should be 0x4 or a minimum cycle count threshold of 4. This work arounds the problem via storing 4 in drvdata->ccitmin on affected systems where the TRCIDR3.CCITMIN has been 256, thus preserving cycle count threshold granularity. These errata information has been updated in Documentation/arch/arm64/silicon-errata.rst, but without their corresponding configs because these have been implemented directly in the driver. Cc: Catalin Marinas Cc: Will Deacon Cc: Suzuki K Poulose Cc: Mike Leach Cc: James Clark Cc: Jonathan Corbet Cc: linux-doc@vger.kernel.org Cc: coresight@lists.linaro.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Reviewed-by: Mike Leach Signed-off-by: Anshuman Khandual [ Fixed location of silicon-errata.rst in commit description ] Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20230921033631.1298723-2-anshuman.khandual@arm.com --- Documentation/arch/arm64/silicon-errata.rst | 10 +++++ .../coresight/coresight-etm4x-core.c | 37 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst index f47f63bcf67c91..bfdf236e2af3d4 100644 --- a/Documentation/arch/arm64/silicon-errata.rst +++ b/Documentation/arch/arm64/silicon-errata.rst @@ -117,6 +117,10 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A76 | #1463225 | ARM64_ERRATUM_1463225 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A76 | #1490853 | N/A | ++----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A77 | #1491015 | N/A | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A77 | #1508412 | ARM64_ERRATUM_1508412 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A710 | #2119858 | ARM64_ERRATUM_2119858 | @@ -127,6 +131,8 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A715 | #2645198 | ARM64_ERRATUM_2645198 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-X1 | #1502854 | N/A | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-X2 | #2119858 | ARM64_ERRATUM_2119858 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-X2 | #2224489 | ARM64_ERRATUM_2224489 | @@ -135,6 +141,8 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Neoverse-N1 | #1349291 | N/A | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Neoverse-N1 | #1490853 | N/A | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Neoverse-N1 | #1542419 | ARM64_ERRATUM_1542419 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Neoverse-N2 | #2139208 | ARM64_ERRATUM_2139208 | @@ -143,6 +151,8 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Neoverse-N2 | #2253138 | ARM64_ERRATUM_2253138 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Neoverse-V1 | #1619801 | N/A | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | MMU-500 | #841119,826419 | N/A | +----------------+-----------------+-----------------+-----------------------------+ | ARM | MMU-600 | #1076982,1209401| N/A | diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c index 77b0271ce6eb98..9619d9d0bbb172 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c @@ -1150,6 +1150,41 @@ static void cpu_detect_trace_filtering(struct etmv4_drvdata *drvdata) drvdata->trfcr = trfcr; } +/* + * The following errata on applicable cpu ranges, affect the CCITMIN filed + * in TCRIDR3 register. Software read for the field returns 0x100 limiting + * the cycle threshold granularity, whereas the right value should have + * been 0x4, which is well supported in the hardware. + */ +static struct midr_range etm_wrong_ccitmin_cpus[] = { + /* Erratum #1490853 - Cortex-A76 */ + MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 4, 0), + /* Erratum #1490853 - Neoverse-N1 */ + MIDR_RANGE(MIDR_NEOVERSE_N1, 0, 0, 4, 0), + /* Erratum #1491015 - Cortex-A77 */ + MIDR_RANGE(MIDR_CORTEX_A77, 0, 0, 1, 0), + /* Erratum #1502854 - Cortex-X1 */ + MIDR_REV(MIDR_CORTEX_X1, 0, 0), + /* Erratum #1619801 - Neoverse-V1 */ + MIDR_REV(MIDR_NEOVERSE_V1, 0, 0), + {}, +}; + +static void etm4_fixup_wrong_ccitmin(struct etmv4_drvdata *drvdata) +{ + /* + * Erratum affected cpus will read 256 as the minimum + * instruction trace cycle counting threshold whereas + * the correct value should be 4 instead. Override the + * recorded value for 'drvdata->ccitmin' to workaround + * this problem. + */ + if (is_midr_in_range_list(read_cpuid_id(), etm_wrong_ccitmin_cpus)) { + if (drvdata->ccitmin == 256) + drvdata->ccitmin = 4; + } +} + static void etm4_init_arch_data(void *info) { u32 etmidr0; @@ -1214,6 +1249,8 @@ static void etm4_init_arch_data(void *info) etmidr3 = etm4x_relaxed_read32(csa, TRCIDR3); /* CCITMIN, bits[11:0] minimum threshold value that can be programmed */ drvdata->ccitmin = FIELD_GET(TRCIDR3_CCITMIN_MASK, etmidr3); + etm4_fixup_wrong_ccitmin(drvdata); + /* EXLEVEL_S, bits[19:16] Secure state instruction tracing */ drvdata->s_ex_level = FIELD_GET(TRCIDR3_EXLEVEL_S_MASK, etmidr3); drvdata->config.s_ex_level = drvdata->s_ex_level; From 0cf805fec179c4a5201d19337ce929b6a8daea99 Mon Sep 17 00:00:00 2001 From: Anshuman Khandual Date: Thu, 21 Sep 2023 09:06:30 +0530 Subject: [PATCH 206/515] coresight: etm: Make cycle count threshold user configurable When cycle counting is enabled, we use a default threshold value i.e 0x100 for the instruction trace cycle counting. This patch makes the cycle threshold user configurable via perf event attributes( 'cc_threshold' => event->attr.config3[11:0] ), falling back to the current default if unspecified. Cc: Suzuki K Poulose Cc: Mike Leach Cc: James Clark Cc: Leo Yan Cc: coresight@lists.linaro.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Reviewed-by: Mike Leach Signed-off-by: Anshuman Khandual Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20230921033631.1298723-3-anshuman.khandual@arm.com --- drivers/hwtracing/coresight/coresight-etm-perf.c | 2 ++ drivers/hwtracing/coresight/coresight-etm4x-core.c | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c index 5ca6278baff4fa..09f75dffae6010 100644 --- a/drivers/hwtracing/coresight/coresight-etm-perf.c +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c @@ -68,6 +68,7 @@ PMU_FORMAT_ATTR(preset, "config:0-3"); PMU_FORMAT_ATTR(sinkid, "config2:0-31"); /* config ID - set if a system configuration is selected */ PMU_FORMAT_ATTR(configid, "config2:32-63"); +PMU_FORMAT_ATTR(cc_threshold, "config3:0-11"); /* @@ -101,6 +102,7 @@ static struct attribute *etm_config_formats_attr[] = { &format_attr_preset.attr, &format_attr_configid.attr, &format_attr_branch_broadcast.attr, + &format_attr_cc_threshold.attr, NULL, }; diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c index 9619d9d0bbb172..5b6a878a2ac5b9 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c @@ -644,7 +644,7 @@ static int etm4_parse_event_config(struct coresight_device *csdev, struct etmv4_config *config = &drvdata->config; struct perf_event_attr *attr = &event->attr; unsigned long cfg_hash; - int preset; + int preset, cc_threshold; /* Clear configuration from previous run */ memset(config, 0, sizeof(struct etmv4_config)); @@ -667,7 +667,12 @@ static int etm4_parse_event_config(struct coresight_device *csdev, if (attr->config & BIT(ETM_OPT_CYCACC)) { config->cfg |= TRCCONFIGR_CCI; /* TRM: Must program this for cycacc to work */ - config->ccctlr = ETM_CYC_THRESHOLD_DEFAULT; + cc_threshold = attr->config3 & ETM_CYC_THRESHOLD_MASK; + if (!cc_threshold) + cc_threshold = ETM_CYC_THRESHOLD_DEFAULT; + if (cc_threshold < drvdata->ccitmin) + cc_threshold = drvdata->ccitmin; + config->ccctlr = cc_threshold; } if (attr->config & BIT(ETM_OPT_TS)) { /* From 2b690bebb569769b1143fcd059eeb54c4ad4a7a4 Mon Sep 17 00:00:00 2001 From: Anshuman Khandual Date: Thu, 21 Sep 2023 09:06:31 +0530 Subject: [PATCH 207/515] Documentation: coresight: Add cc_threshold tunable This updates config option to include 'cc_threshold' tunable value. Cc: Suzuki K Poulose Cc: Mike Leach Cc: James Clark Cc: Jonathan Corbet Cc: coresight@lists.linaro.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Reviewed by: Mike Leach Signed-off-by: Anshuman Khandual Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20230921033631.1298723-4-anshuman.khandual@arm.com --- Documentation/trace/coresight/coresight.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/trace/coresight/coresight.rst b/Documentation/trace/coresight/coresight.rst index 4a71ea6cb39076..ce55adb80b82df 100644 --- a/Documentation/trace/coresight/coresight.rst +++ b/Documentation/trace/coresight/coresight.rst @@ -624,6 +624,10 @@ They are also listed in the folder /sys/bus/event_source/devices/cs_etm/format/ * - timestamp - Session local version of the system wide setting: :ref:`ETMv4_MODE_TIMESTAMP ` + * - cc_threshold + - Cycle count threshold value. If nothing is provided here or the provided value is 0, then the + default value i.e 0x100 will be used. If provided value is less than minimum cycles threshold + value, as indicated via TRCIDR3.CCITMIN, then the minimum value will be used instead. How to use the STM module ------------------------- From aca46e6f035058a8768a7596f0cd3be9bf9d1917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Fri, 29 Sep 2023 10:16:37 +0200 Subject: [PATCH 208/515] coresight: etm4x: Remove bogous __exit annotation for some functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit etm4_platform_driver (which lives in ".data" contains a reference to etm4_remove_platform_dev(). So the latter must not be marked with __exit which results in the function being discarded for a build with CONFIG_CORESIGHT_SOURCE_ETM4X=y which in turn makes the remove pointer contain invalid data. etm4x_amba_driver referencing etm4_remove_amba() has the same issue. Drop the __exit annotations for the two affected functions and a third one that is called by the other two. For reasons I don't understand this isn't catched by building with CONFIG_DEBUG_SECTION_MISMATCH=y. Fixes: c23bc382ef0e ("coresight: etm4x: Refactor probing routine") Fixes: 5214b563588e ("coresight: etm4x: Add support for sysreg only devices") Signed-off-by: Uwe Kleine-König Reviewed-by: James Clark Link: https://lore.kernel.org/all/20230929081540.yija47lsj35xtj4v@pengutronix.de/ Link: https://lore.kernel.org/r/20230929081637.2377335-1-u.kleine-koenig@pengutronix.de Signed-off-by: Suzuki K Poulose --- drivers/hwtracing/coresight/coresight-etm4x-core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c index 5b6a878a2ac5b9..285539104bcc42 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c @@ -2266,7 +2266,7 @@ static void clear_etmdrvdata(void *info) per_cpu(delayed_probe, cpu) = NULL; } -static void __exit etm4_remove_dev(struct etmv4_drvdata *drvdata) +static void etm4_remove_dev(struct etmv4_drvdata *drvdata) { bool had_delayed_probe; /* @@ -2295,7 +2295,7 @@ static void __exit etm4_remove_dev(struct etmv4_drvdata *drvdata) } } -static void __exit etm4_remove_amba(struct amba_device *adev) +static void etm4_remove_amba(struct amba_device *adev) { struct etmv4_drvdata *drvdata = dev_get_drvdata(&adev->dev); @@ -2303,7 +2303,7 @@ static void __exit etm4_remove_amba(struct amba_device *adev) etm4_remove_dev(drvdata); } -static int __exit etm4_remove_platform_dev(struct platform_device *pdev) +static int etm4_remove_platform_dev(struct platform_device *pdev) { struct etmv4_drvdata *drvdata = dev_get_drvdata(&pdev->dev); From 078dbba3f0c9291f03d36b36839bf27aba2b0b8b Mon Sep 17 00:00:00 2001 From: James Clark Date: Fri, 6 Oct 2023 14:14:52 +0100 Subject: [PATCH 209/515] coresight: Fix crash when Perf and sysfs modes are used concurrently Partially revert the change in commit 6148652807ba ("coresight: Enable and disable helper devices adjacent to the path") which changed the bare call from source_ops(csdev)->enable() to coresight_enable_source() for Perf sessions. It was missed that coresight_enable_source() is specifically for the sysfs interface, rather than being a generic call. This interferes with the sysfs reference counting to cause the following crash: $ perf record -e cs_etm/@tmc_etr0/ -C 0 & $ echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink $ echo 1 > /sys/bus/coresight/devices/etm0/enable_source $ echo 0 > /sys/bus/coresight/devices/etm0/enable_source Unable to handle kernel NULL pointer dereference at virtual address 00000000000001d0 Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP ... Call trace: etm4_disable+0x54/0x150 [coresight_etm4x] coresight_disable_source+0x6c/0x98 [coresight] coresight_disable+0x74/0x1c0 [coresight] enable_source_store+0x88/0xa0 [coresight] dev_attr_store+0x20/0x40 sysfs_kf_write+0x4c/0x68 kernfs_fop_write_iter+0x120/0x1b8 vfs_write+0x2dc/0x3b0 ksys_write+0x70/0x108 __arm64_sys_write+0x24/0x38 invoke_syscall+0x50/0x128 el0_svc_common.constprop.0+0x104/0x130 do_el0_svc+0x40/0xb8 el0_svc+0x2c/0xb8 el0t_64_sync_handler+0xc0/0xc8 el0t_64_sync+0x1a4/0x1a8 Code: d53cd042 91002000 b9402a81 b8626800 (f940ead5) ---[ end trace 0000000000000000 ]--- This commit linked below also fixes the issue, but has unlocked updates to the mode which could potentially race. So until we come up with a more complete solution that takes all locking and interaction between both modes into account, just revert back to the old behavior for Perf. Reported-by: Junhao He Closes: https://lore.kernel.org/linux-arm-kernel/20230921132904.60996-1-hejunhao3@huawei.com/ Fixes: 6148652807ba ("coresight: Enable and disable helper devices adjacent to the path") Tested-by: Junhao He Signed-off-by: James Clark Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20231006131452.646721-1-james.clark@arm.com --- drivers/hwtracing/coresight/coresight-etm-perf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c index 09f75dffae6010..a52cfcce25d6dd 100644 --- a/drivers/hwtracing/coresight/coresight-etm-perf.c +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c @@ -495,7 +495,7 @@ static void etm_event_start(struct perf_event *event, int flags) goto fail_end_stop; /* Finally enable the tracer */ - if (coresight_enable_source(csdev, CS_MODE_PERF, event)) + if (source_ops(csdev)->enable(csdev, event, CS_MODE_PERF)) goto fail_disable_path; /* @@ -589,7 +589,7 @@ static void etm_event_stop(struct perf_event *event, int mode) return; /* stop tracer */ - coresight_disable_source(csdev, event); + source_ops(csdev)->disable(csdev, event); /* tell the core */ event->hw.state = PERF_HES_STOPPED; From efb05212a230994041b78d351485e495a023e759 Mon Sep 17 00:00:00 2001 From: Anshuman Khandual Date: Fri, 18 Aug 2023 13:51:12 +0530 Subject: [PATCH 210/515] coresight: tmc: Make etr buffer mode user configurable from sysfs Currently TMC-ETR automatically selects the buffer mode from all available methods in the following sequentially fallback manner - also in that order. 1. FLAT mode with or without IOMMU 2. TMC-ETR-SG (scatter gather) mode when available 3. CATU mode when available But this order might not be ideal for all situations. For example if there is a CATU connected to ETR, it may be better to use TMC-ETR scatter gather method, rather than CATU. But hard coding such order changes will prevent us from testing or using a particular mode. This change provides following new sysfs tunables for the user to control TMC-ETR buffer mode explicitly, if required. This adds following new sysfs files for buffer mode selection purpose explicitly in the user space. /sys/bus/coresight/devices/tmc_etr/buf_modes_available /sys/bus/coresight/devices/tmc_etr/buf_mode_preferred $ cat buf_modes_available auto flat tmc-sg catu ------------------> Supported TMC-ETR buffer modes $ echo catu > buf_mode_preferred -------> Explicit buffer mode request But explicit user request has to be within supported ETR buffer modes only. These sysfs interface files are exclussive to ETR, and hence these are not available for other TMC devices such as ETB or ETF etc. A new auto' mode (i.e ETR_MODE_AUTO) has been added to help fallback to the existing default behaviour, when user provided preferred buffer mode fails. ETR_MODE_FLAT and ETR_MODE_AUTO are always available as preferred modes. Cc: Suzuki K Poulose Cc: Mike Leach Cc: James Clark Cc: Leo Yan Cc: Alexander Shishkin Cc: coresight@lists.linaro.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Anshuman Khandual [Fixup year in sysfs ABI documentation] Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20230818082112.554638-1-anshuman.khandual@arm.com --- .../testing/sysfs-bus-coresight-devices-tmc | 16 +++ .../hwtracing/coresight/coresight-tmc-core.c | 15 ++- .../hwtracing/coresight/coresight-tmc-etr.c | 111 ++++++++++++++++-- drivers/hwtracing/coresight/coresight-tmc.h | 3 + 4 files changed, 131 insertions(+), 14 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tmc b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tmc index 6aa527296c7108..96aafa66b4a580 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tmc +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tmc @@ -91,3 +91,19 @@ Contact: Mathieu Poirier Description: (RW) Size of the trace buffer for TMC-ETR when used in SYSFS mode. Writable only for TMC-ETR configurations. The value should be aligned to the kernel pagesize. + +What: /sys/bus/coresight/devices/.tmc/buf_modes_available +Date: August 2023 +KernelVersion: 6.7 +Contact: Anshuman Khandual +Description: (Read) Shows all supported Coresight TMC-ETR buffer modes available + for the users to configure explicitly. This file is avaialble only + for TMC ETR devices. + +What: /sys/bus/coresight/devices/.tmc/buf_mode_preferred +Date: August 2023 +KernelVersion: 6.7 +Contact: Anshuman Khandual +Description: (RW) Current Coresight TMC-ETR buffer mode selected. But user could + only provide a mode which is supported for a given ETR device. This + file is available only for TMC ETR devices. diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c index c106d142e63221..7ec5365e2b6429 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-core.c +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -344,7 +345,14 @@ static const struct attribute_group coresight_tmc_mgmt_group = { .name = "mgmt", }; -static const struct attribute_group *coresight_tmc_groups[] = { +static const struct attribute_group *coresight_etf_groups[] = { + &coresight_tmc_group, + &coresight_tmc_mgmt_group, + NULL, +}; + +static const struct attribute_group *coresight_etr_groups[] = { + &coresight_etr_group, &coresight_tmc_group, &coresight_tmc_mgmt_group, NULL, @@ -465,6 +473,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) drvdata->memwidth = tmc_get_memwidth(devid); /* This device is not associated with a session */ drvdata->pid = -1; + drvdata->etr_mode = ETR_MODE_AUTO; if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) { drvdata->size = tmc_etr_get_default_buffer_size(dev); @@ -474,16 +483,17 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) } desc.dev = dev; - desc.groups = coresight_tmc_groups; switch (drvdata->config_type) { case TMC_CONFIG_TYPE_ETB: + desc.groups = coresight_etf_groups; desc.type = CORESIGHT_DEV_TYPE_SINK; desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER; desc.ops = &tmc_etb_cs_ops; dev_list = &etb_devs; break; case TMC_CONFIG_TYPE_ETR: + desc.groups = coresight_etr_groups; desc.type = CORESIGHT_DEV_TYPE_SINK; desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_SYSMEM; desc.ops = &tmc_etr_cs_ops; @@ -496,6 +506,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) dev_list = &etr_devs; break; case TMC_CONFIG_TYPE_ETF: + desc.groups = coresight_etf_groups; desc.type = CORESIGHT_DEV_TYPE_LINKSINK; desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER; desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_FIFO; diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c index 8311e1028ddb03..af02ba5d5f15de 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c @@ -26,6 +26,12 @@ struct etr_flat_buf { size_t size; }; +struct etr_buf_hw { + bool has_iommu; + bool has_etr_sg; + bool has_catu; +}; + /* * etr_perf_buffer - Perf buffer used for ETR * @drvdata - The ETR drvdaga this buffer has been allocated for. @@ -830,6 +836,22 @@ static inline int tmc_etr_mode_alloc_buf(int mode, } } +static void get_etr_buf_hw(struct device *dev, struct etr_buf_hw *buf_hw) +{ + struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); + + buf_hw->has_iommu = iommu_get_domain_for_dev(dev->parent); + buf_hw->has_etr_sg = tmc_etr_has_cap(drvdata, TMC_ETR_SG); + buf_hw->has_catu = !!tmc_etr_get_catu_device(drvdata); +} + +static bool etr_can_use_flat_mode(struct etr_buf_hw *buf_hw, ssize_t etr_buf_size) +{ + bool has_sg = buf_hw->has_catu || buf_hw->has_etr_sg; + + return !has_sg || buf_hw->has_iommu || etr_buf_size < SZ_1M; +} + /* * tmc_alloc_etr_buf: Allocate a buffer use by ETR. * @drvdata : ETR device details. @@ -843,23 +865,22 @@ static struct etr_buf *tmc_alloc_etr_buf(struct tmc_drvdata *drvdata, int node, void **pages) { int rc = -ENOMEM; - bool has_etr_sg, has_iommu; - bool has_sg, has_catu; struct etr_buf *etr_buf; + struct etr_buf_hw buf_hw; struct device *dev = &drvdata->csdev->dev; - has_etr_sg = tmc_etr_has_cap(drvdata, TMC_ETR_SG); - has_iommu = iommu_get_domain_for_dev(dev->parent); - has_catu = !!tmc_etr_get_catu_device(drvdata); - - has_sg = has_catu || has_etr_sg; - + get_etr_buf_hw(dev, &buf_hw); etr_buf = kzalloc(sizeof(*etr_buf), GFP_KERNEL); if (!etr_buf) return ERR_PTR(-ENOMEM); etr_buf->size = size; + /* If there is user directive for buffer mode, try that first */ + if (drvdata->etr_mode != ETR_MODE_AUTO) + rc = tmc_etr_mode_alloc_buf(drvdata->etr_mode, drvdata, + etr_buf, node, pages); + /* * If we have to use an existing list of pages, we cannot reliably * use a contiguous DMA memory (even if we have an IOMMU). Otherwise, @@ -872,14 +893,13 @@ static struct etr_buf *tmc_alloc_etr_buf(struct tmc_drvdata *drvdata, * Fallback to available mechanisms. * */ - if (!pages && - (!has_sg || has_iommu || size < SZ_1M)) + if (rc && !pages && etr_can_use_flat_mode(&buf_hw, size)) rc = tmc_etr_mode_alloc_buf(ETR_MODE_FLAT, drvdata, etr_buf, node, pages); - if (rc && has_etr_sg) + if (rc && buf_hw.has_etr_sg) rc = tmc_etr_mode_alloc_buf(ETR_MODE_ETR_SG, drvdata, etr_buf, node, pages); - if (rc && has_catu) + if (rc && buf_hw.has_catu) rc = tmc_etr_mode_alloc_buf(ETR_MODE_CATU, drvdata, etr_buf, node, pages); if (rc) { @@ -1804,3 +1824,70 @@ int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata) return 0; } + +static const char *const buf_modes_str[] = { + [ETR_MODE_FLAT] = "flat", + [ETR_MODE_ETR_SG] = "tmc-sg", + [ETR_MODE_CATU] = "catu", + [ETR_MODE_AUTO] = "auto", +}; + +static ssize_t buf_modes_available_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct etr_buf_hw buf_hw; + ssize_t size = 0; + + get_etr_buf_hw(dev, &buf_hw); + size += sysfs_emit(buf, "%s ", buf_modes_str[ETR_MODE_AUTO]); + size += sysfs_emit_at(buf, size, "%s ", buf_modes_str[ETR_MODE_FLAT]); + if (buf_hw.has_etr_sg) + size += sysfs_emit_at(buf, size, "%s ", buf_modes_str[ETR_MODE_ETR_SG]); + + if (buf_hw.has_catu) + size += sysfs_emit_at(buf, size, "%s ", buf_modes_str[ETR_MODE_CATU]); + + size += sysfs_emit_at(buf, size, "\n"); + return size; +} +static DEVICE_ATTR_RO(buf_modes_available); + +static ssize_t buf_mode_preferred_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%s\n", buf_modes_str[drvdata->etr_mode]); +} + +static ssize_t buf_mode_preferred_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); + struct etr_buf_hw buf_hw; + + get_etr_buf_hw(dev, &buf_hw); + if (sysfs_streq(buf, buf_modes_str[ETR_MODE_FLAT])) + drvdata->etr_mode = ETR_MODE_FLAT; + else if (sysfs_streq(buf, buf_modes_str[ETR_MODE_ETR_SG]) && buf_hw.has_etr_sg) + drvdata->etr_mode = ETR_MODE_ETR_SG; + else if (sysfs_streq(buf, buf_modes_str[ETR_MODE_CATU]) && buf_hw.has_catu) + drvdata->etr_mode = ETR_MODE_CATU; + else if (sysfs_streq(buf, buf_modes_str[ETR_MODE_AUTO])) + drvdata->etr_mode = ETR_MODE_AUTO; + else + return -EINVAL; + return size; +} +static DEVICE_ATTR_RW(buf_mode_preferred); + +static struct attribute *coresight_etr_attrs[] = { + &dev_attr_buf_modes_available.attr, + &dev_attr_buf_mode_preferred.attr, + NULL, +}; + +const struct attribute_group coresight_etr_group = { + .attrs = coresight_etr_attrs, +}; diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h index 0ee48c5ba764d1..8dcb426ac3e7aa 100644 --- a/drivers/hwtracing/coresight/coresight-tmc.h +++ b/drivers/hwtracing/coresight/coresight-tmc.h @@ -135,6 +135,7 @@ enum etr_mode { ETR_MODE_FLAT, /* Uses contiguous flat buffer */ ETR_MODE_ETR_SG, /* Uses in-built TMC ETR SG mechanism */ ETR_MODE_CATU, /* Use SG mechanism in CATU */ + ETR_MODE_AUTO, /* Use the default mechanism */ }; struct etr_buf_operations; @@ -207,6 +208,7 @@ struct tmc_drvdata { enum tmc_mem_intf_width memwidth; u32 trigger_cntr; u32 etr_caps; + enum etr_mode etr_mode; struct idr idr; struct mutex idr_mutex; struct etr_buf *sysfs_buf; @@ -334,5 +336,6 @@ void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu); void tmc_etr_remove_catu_ops(void); struct etr_buf *tmc_etr_get_buffer(struct coresight_device *csdev, enum cs_mode mode, void *data); +extern const struct attribute_group coresight_etr_group; #endif From 5d49aeb1b3e419da87be50a6797607a3e905a346 Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:34 +0800 Subject: [PATCH 211/515] coresight-tpdm: Remove the unnecessary lock Remove the unnecessary lock "CS_{UN,}LOCK" in TPDM driver. This lock is only needed while writing the data to Coresight registers. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-2-git-send-email-quic_taozha@quicinc.com --- drivers/hwtracing/coresight/coresight-tpdm.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index f4854af0431e11..b6456120b76a1a 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -114,11 +114,9 @@ static void tpdm_init_default_data(struct tpdm_drvdata *drvdata) { u32 pidr; - CS_UNLOCK(drvdata->base); /* Get the datasets present on the TPDM. */ pidr = readl_relaxed(drvdata->base + CORESIGHT_PERIPHIDR0); drvdata->datasets |= pidr & GENMASK(TPDM_DATASETS - 1, 0); - CS_LOCK(drvdata->base); } /* From a1ce72d22a2e6c7c851ca3ed0721a5ebd0e9832b Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:35 +0800 Subject: [PATCH 212/515] dt-bindings: arm: Add support for DSB element size Add property "qcom,dsb-elem-size" to support DSB(Discrete Single Bit) element for TPDM. The associated aggregator will read this size before it is enabled. DSB element size currently only supports 32-bit and 64-bit. Signed-off-by: Tao Zhang Acked-by: Rob Herring Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-3-git-send-email-quic_taozha@quicinc.com --- .../devicetree/bindings/arm/qcom,coresight-tpdm.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml b/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml index 3bad47b7b02bb9..e19fc375d494ea 100644 --- a/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml +++ b/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml @@ -44,6 +44,14 @@ properties: minItems: 1 maxItems: 2 + qcom,dsb-element-size: + description: + Specifies the DSB(Discrete Single Bit) element size supported by + the monitor. The associated aggregator will read this size before it + is enabled. DSB element size currently only supports 32-bit and 64-bit. + $ref: /schemas/types.yaml#/definitions/uint8 + enum: [32, 64] + clocks: maxItems: 1 @@ -77,6 +85,8 @@ examples: compatible = "qcom,coresight-tpdm", "arm,primecell"; reg = <0x0684c000 0x1000>; + qcom,dsb-element-size = /bits/ 8 <32>; + clocks = <&aoss_qmp>; clock-names = "apb_pclk"; From 6b4fad1b665a8738980eee10539c60f4c787de9f Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:36 +0800 Subject: [PATCH 213/515] coresight-tpdm: Introduce TPDM subtype to TPDM driver Introduce the new subtype of "CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM" for TPDM components in driver. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-4-git-send-email-quic_taozha@quicinc.com --- drivers/hwtracing/coresight/coresight-core.c | 3 +++ drivers/hwtracing/coresight/coresight-tpdm.c | 2 +- include/linux/coresight.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index 9fabe00a40d6a0..d7f0e231feb993 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -1093,6 +1093,7 @@ static int coresight_validate_source(struct coresight_device *csdev, if (subtype != CORESIGHT_DEV_SUBTYPE_SOURCE_PROC && subtype != CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE && + subtype != CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM && subtype != CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS) { dev_err(&csdev->dev, "wrong device subtype in %s\n", function); return -EINVAL; @@ -1162,6 +1163,7 @@ int coresight_enable(struct coresight_device *csdev) per_cpu(tracer_path, cpu) = path; break; case CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE: + case CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM: case CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS: /* * Use the hash of source's device name as ID @@ -1212,6 +1214,7 @@ void coresight_disable(struct coresight_device *csdev) per_cpu(tracer_path, cpu) = NULL; break; case CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE: + case CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM: case CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS: hash = hashlen_hash(hashlen_string(NULL, dev_name(&csdev->dev))); /* Find the path by the hash. */ diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index b6456120b76a1a..abaff0b934dbdf 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -203,7 +203,7 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id) if (!desc.name) return -ENOMEM; desc.type = CORESIGHT_DEV_TYPE_SOURCE; - desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS; + desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM; desc.ops = &tpdm_cs_ops; desc.pdata = adev->dev.platform_data; desc.dev = &adev->dev; diff --git a/include/linux/coresight.h b/include/linux/coresight.h index a269fffaf991ce..a4cb7dd6ca2374 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -64,6 +64,7 @@ enum coresight_dev_subtype_source { CORESIGHT_DEV_SUBTYPE_SOURCE_PROC, CORESIGHT_DEV_SUBTYPE_SOURCE_BUS, CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE, + CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM, CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS, }; From 18e176f77986358154443fca083e562d523a7861 Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:37 +0800 Subject: [PATCH 214/515] coresight-tpda: Add DSB dataset support Read the DSB element size from the device tree. Set the register bit that controls the DSB element size of the corresponding port. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-5-git-send-email-quic_taozha@quicinc.com --- drivers/hwtracing/coresight/coresight-tpda.c | 126 +++++++++++++++++-- drivers/hwtracing/coresight/coresight-tpda.h | 2 + 2 files changed, 118 insertions(+), 10 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c index 8d2b9d29237d47..5f82737c37bba5 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.c +++ b/drivers/hwtracing/coresight/coresight-tpda.c @@ -21,6 +21,80 @@ DEFINE_CORESIGHT_DEVLIST(tpda_devs, "tpda"); +static bool coresight_device_is_tpdm(struct coresight_device *csdev) +{ + return (csdev->type == CORESIGHT_DEV_TYPE_SOURCE) && + (csdev->subtype.source_subtype == + CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM); +} + +/* + * Read the DSB element size from the TPDM device + * Returns + * The dsb element size read from the devicetree if available. + * 0 - Otherwise, with a warning once. + */ +static int tpdm_read_dsb_element_size(struct coresight_device *csdev) +{ + int rc = 0; + u8 size = 0; + + rc = fwnode_property_read_u8(dev_fwnode(csdev->dev.parent), + "qcom,dsb-element-size", &size); + if (rc) + dev_warn_once(&csdev->dev, + "Failed to read TPDM DSB Element size: %d\n", rc); + + return size; +} + +/* + * Search and read element data size from the TPDM node in + * the devicetree. Each input port of TPDA is connected to + * a TPDM. Different TPDM supports different types of dataset, + * and some may support more than one type of dataset. + * Parameter "inport" is used to pass in the input port number + * of TPDA, and it is set to -1 in the recursize call. + */ +static int tpda_get_element_size(struct coresight_device *csdev, + int inport) +{ + int dsb_size = -ENOENT; + int i, size; + struct coresight_device *in; + + for (i = 0; i < csdev->pdata->nr_inconns; i++) { + in = csdev->pdata->in_conns[i]->src_dev; + if (!in) + continue; + + /* Ignore the paths that do not match port */ + if (inport > 0 && + csdev->pdata->in_conns[i]->dest_port != inport) + continue; + + if (coresight_device_is_tpdm(in)) { + size = tpdm_read_dsb_element_size(in); + } else { + /* Recurse down the path */ + size = tpda_get_element_size(in, -1); + } + + if (size < 0) + return size; + + if (dsb_size < 0) { + /* Found a size, save it. */ + dsb_size = size; + } else { + /* Found duplicate TPDMs */ + return -EEXIST; + } + } + + return dsb_size; +} + /* Settings pre enabling port control register */ static void tpda_enable_pre_port(struct tpda_drvdata *drvdata) { @@ -32,26 +106,55 @@ static void tpda_enable_pre_port(struct tpda_drvdata *drvdata) writel_relaxed(val, drvdata->base + TPDA_CR); } -static void tpda_enable_port(struct tpda_drvdata *drvdata, int port) +static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) { u32 val; + int size; val = readl_relaxed(drvdata->base + TPDA_Pn_CR(port)); + /* + * Configure aggregator port n DSB data set element size + * Set the bit to 0 if the size is 32 + * Set the bit to 1 if the size is 64 + */ + size = tpda_get_element_size(drvdata->csdev, port); + switch (size) { + case 32: + val &= ~TPDA_Pn_CR_DSBSIZE; + break; + case 64: + val |= TPDA_Pn_CR_DSBSIZE; + break; + case 0: + return -EEXIST; + case -EEXIST: + dev_warn_once(&drvdata->csdev->dev, + "Detected multiple TPDMs on port %d", -EEXIST); + return -EEXIST; + default: + return -EINVAL; + } + /* Enable the port */ val |= TPDA_Pn_CR_ENA; writel_relaxed(val, drvdata->base + TPDA_Pn_CR(port)); + + return 0; } -static void __tpda_enable(struct tpda_drvdata *drvdata, int port) +static int __tpda_enable(struct tpda_drvdata *drvdata, int port) { + int ret; + CS_UNLOCK(drvdata->base); if (!drvdata->csdev->enable) tpda_enable_pre_port(drvdata); - tpda_enable_port(drvdata, port); - + ret = tpda_enable_port(drvdata, port); CS_LOCK(drvdata->base); + + return ret; } static int tpda_enable(struct coresight_device *csdev, @@ -59,16 +162,19 @@ static int tpda_enable(struct coresight_device *csdev, struct coresight_connection *out) { struct tpda_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); + int ret = 0; spin_lock(&drvdata->spinlock); - if (atomic_read(&in->dest_refcnt) == 0) - __tpda_enable(drvdata, in->dest_port); + if (atomic_read(&in->dest_refcnt) == 0) { + ret = __tpda_enable(drvdata, in->dest_port); + if (!ret) { + atomic_inc(&in->dest_refcnt); + dev_dbg(drvdata->dev, "TPDA inport %d enabled.\n", in->dest_port); + } + } - atomic_inc(&in->dest_refcnt); spin_unlock(&drvdata->spinlock); - - dev_dbg(drvdata->dev, "TPDA inport %d enabled.\n", in->dest_port); - return 0; + return ret; } static void __tpda_disable(struct tpda_drvdata *drvdata, int port) diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/hwtracing/coresight/coresight-tpda.h index 0399678df312fb..b3b38fd41b64bc 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.h +++ b/drivers/hwtracing/coresight/coresight-tpda.h @@ -10,6 +10,8 @@ #define TPDA_Pn_CR(n) (0x004 + (n * 4)) /* Aggregator port enable bit */ #define TPDA_Pn_CR_ENA BIT(0) +/* Aggregator port DSB data set element size bit */ +#define TPDA_Pn_CR_DSBSIZE BIT(8) #define TPDA_MAX_INPORTS 32 From 03f0ff5fcbecf23445c8735c12bc464f11da9c26 Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:38 +0800 Subject: [PATCH 215/515] coresight-tpdm: Initialize DSB subunit configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DSB is used for monitoring “events”. Events are something that occurs at some point in time. It could be a state decode, the act of writing/reading a particular address, a FIFO being empty, etc. This decoding of the event desired is done outside TPDM. DSB subunit need to be configured in enablement and disablement. A struct that specifics associated to dsb dataset is needed. It saves the configuration and parameters of the dsb datasets. This change is to add this struct and initialize the configuration of DSB subunit. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-6-git-send-email-quic_taozha@quicinc.com --- drivers/hwtracing/coresight/coresight-tpdm.c | 64 +++++++++++++++++--- drivers/hwtracing/coresight/coresight-tpdm.h | 18 ++++++ 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index abaff0b934dbdf..951ad4d9b76fb2 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -20,23 +20,57 @@ DEFINE_CORESIGHT_DEVLIST(tpdm_devs, "tpdm"); +static bool tpdm_has_dsb_dataset(struct tpdm_drvdata *drvdata) +{ + return (drvdata->datasets & TPDM_PIDR0_DS_DSB); +} + +static void tpdm_reset_datasets(struct tpdm_drvdata *drvdata) +{ + if (tpdm_has_dsb_dataset(drvdata)) { + memset(drvdata->dsb, 0, sizeof(struct dsb_dataset)); + + drvdata->dsb->trig_ts = true; + drvdata->dsb->trig_type = false; + } +} + static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) { u32 val; - /* Set the enable bit of DSB control register to 1 */ + val = readl_relaxed(drvdata->base + TPDM_DSB_TIER); + /* Set trigger timestamp */ + if (drvdata->dsb->trig_ts) + val |= TPDM_DSB_TIER_XTRIG_TSENAB; + else + val &= ~TPDM_DSB_TIER_XTRIG_TSENAB; + writel_relaxed(val, drvdata->base + TPDM_DSB_TIER); + val = readl_relaxed(drvdata->base + TPDM_DSB_CR); + /* Set trigger type */ + if (drvdata->dsb->trig_type) + val |= TPDM_DSB_CR_TRIG_TYPE; + else + val &= ~TPDM_DSB_CR_TRIG_TYPE; + /* Set the enable bit of DSB control register to 1 */ val |= TPDM_DSB_CR_ENA; writel_relaxed(val, drvdata->base + TPDM_DSB_CR); } -/* TPDM enable operations */ +/* + * TPDM enable operations + * The TPDM or Monitor serves as data collection component for various + * dataset types. It covers Basic Counts(BC), Tenure Counts(TC), + * Continuous Multi-Bit(CMB), Multi-lane CMB(MCMB) and Discrete Single + * Bit(DSB). This function will initialize the configuration according + * to the dataset type supported by the TPDM. + */ static void __tpdm_enable(struct tpdm_drvdata *drvdata) { CS_UNLOCK(drvdata->base); - /* Check if DSB datasets is present for TPDM. */ - if (drvdata->datasets & TPDM_PIDR0_DS_DSB) + if (tpdm_has_dsb_dataset(drvdata)) tpdm_enable_dsb(drvdata); CS_LOCK(drvdata->base); @@ -76,8 +110,7 @@ static void __tpdm_disable(struct tpdm_drvdata *drvdata) { CS_UNLOCK(drvdata->base); - /* Check if DSB datasets is present for TPDM. */ - if (drvdata->datasets & TPDM_PIDR0_DS_DSB) + if (tpdm_has_dsb_dataset(drvdata)) tpdm_disable_dsb(drvdata); CS_LOCK(drvdata->base); @@ -110,13 +143,23 @@ static const struct coresight_ops tpdm_cs_ops = { .source_ops = &tpdm_source_ops, }; -static void tpdm_init_default_data(struct tpdm_drvdata *drvdata) +static int tpdm_datasets_setup(struct tpdm_drvdata *drvdata) { u32 pidr; /* Get the datasets present on the TPDM. */ pidr = readl_relaxed(drvdata->base + CORESIGHT_PERIPHIDR0); drvdata->datasets |= pidr & GENMASK(TPDM_DATASETS - 1, 0); + + if (tpdm_has_dsb_dataset(drvdata) && (!drvdata->dsb)) { + drvdata->dsb = devm_kzalloc(drvdata->dev, + sizeof(*drvdata->dsb), GFP_KERNEL); + if (!drvdata->dsb) + return -ENOMEM; + } + tpdm_reset_datasets(drvdata); + + return 0; } /* @@ -179,6 +222,7 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id) struct coresight_platform_data *pdata; struct tpdm_drvdata *drvdata; struct coresight_desc desc = { 0 }; + int ret; pdata = coresight_get_platform_data(dev); if (IS_ERR(pdata)) @@ -198,6 +242,10 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id) drvdata->base = base; + ret = tpdm_datasets_setup(drvdata); + if (ret) + return ret; + /* Set up coresight component description */ desc.name = coresight_alloc_device_name(&tpdm_devs, dev); if (!desc.name) @@ -214,7 +262,7 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id) return PTR_ERR(drvdata->csdev); spin_lock_init(&drvdata->spinlock); - tpdm_init_default_data(drvdata); + /* Decrease pm refcount when probe is done.*/ pm_runtime_put(&adev->dev); diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h index 543854043a2dd3..f59e751d358168 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.h +++ b/drivers/hwtracing/coresight/coresight-tpdm.h @@ -11,8 +11,14 @@ /* DSB Subunit Registers */ #define TPDM_DSB_CR (0x780) +#define TPDM_DSB_TIER (0x784) + /* Enable bit for DSB subunit */ #define TPDM_DSB_CR_ENA BIT(0) +/* Enable bit for DSB subunit trigger type */ +#define TPDM_DSB_CR_TRIG_TYPE BIT(12) +/* Enable bit for DSB subunit trigger timestamp */ +#define TPDM_DSB_TIER_XTRIG_TSENAB BIT(1) /* TPDM integration test registers */ #define TPDM_ITATBCNTRL (0xEF0) @@ -40,6 +46,16 @@ #define TPDM_PIDR0_DS_IMPDEF BIT(0) #define TPDM_PIDR0_DS_DSB BIT(1) +/** + * struct dsb_dataset - specifics associated to dsb dataset + * @trig_ts: Enable/Disable trigger timestamp. + * @trig_type: Enable/Disable trigger type. + */ +struct dsb_dataset { + bool trig_ts; + bool trig_type; +}; + /** * struct tpdm_drvdata - specifics associated to an TPDM component * @base: memory mapped base address for this component. @@ -48,6 +64,7 @@ * @spinlock: lock for the drvdata value. * @enable: enable status of the component. * @datasets: The datasets types present of the TPDM. + * @dsb Specifics associated to TPDM DSB. */ struct tpdm_drvdata { @@ -57,6 +74,7 @@ struct tpdm_drvdata { spinlock_t spinlock; bool enable; unsigned long datasets; + struct dsb_dataset *dsb; }; #endif /* _CORESIGHT_CORESIGHT_TPDM_H */ From 126f00822388de519156da742f1cabfbb969c4f1 Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:39 +0800 Subject: [PATCH 216/515] coresight-tpdm: Add reset node to TPDM node TPDM device need a node to reset the configurations and status of it. This change provides a node to reset the configurations and disable the TPDM if it has been enabled. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-7-git-send-email-quic_taozha@quicinc.com --- .../testing/sysfs-bus-coresight-devices-tpdm | 10 +++++++++ drivers/hwtracing/coresight/coresight-tpdm.c | 22 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index 4a58e649550d58..ef8b5a6bd4ac4c 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -11,3 +11,13 @@ Description: Accepts only one of the 2 values - 1 or 2. 1 : Generate 64 bits data 2 : Generate 32 bits data + +What: /sys/bus/coresight/devices//reset_dataset +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (Write) Reset the dataset of the tpdm. + + Accepts only one value - 1. + 1 : Reset the dataset of the tpdm diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index 951ad4d9b76fb2..9c65e4c01128ce 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -162,6 +162,27 @@ static int tpdm_datasets_setup(struct tpdm_drvdata *drvdata) return 0; } +static ssize_t reset_dataset_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + int ret = 0; + unsigned long val; + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + ret = kstrtoul(buf, 0, &val); + if (ret || val != 1) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + tpdm_reset_datasets(drvdata); + spin_unlock(&drvdata->spinlock); + + return size; +} +static DEVICE_ATTR_WO(reset_dataset); + /* * value 1: 64 bits test data * value 2: 32 bits test data @@ -202,6 +223,7 @@ static ssize_t integration_test_store(struct device *dev, static DEVICE_ATTR_WO(integration_test); static struct attribute *tpdm_attrs[] = { + &dev_attr_reset_dataset.attr, &dev_attr_integration_test.attr, NULL, }; From c821b93bb6eba26525a690557489b03ea40d019d Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:40 +0800 Subject: [PATCH 217/515] coresight-tpdm: Add nodes to set trigger timestamp and type The nodes are needed to set or show the trigger timestamp and trigger type. This change is to add these nodes to achieve these function. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-8-git-send-email-quic_taozha@quicinc.com --- .../testing/sysfs-bus-coresight-devices-tpdm | 22 +++++ drivers/hwtracing/coresight/coresight-tpdm.c | 95 +++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index ef8b5a6bd4ac4c..b15bf012a050a9 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -21,3 +21,25 @@ Description: Accepts only one value - 1. 1 : Reset the dataset of the tpdm + +What: /sys/bus/coresight/devices//dsb_trig_type +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the trigger type of the DSB for tpdm. + + Accepts only one of the 2 values - 0 or 1. + 0 : Set the DSB trigger type to false + 1 : Set the DSB trigger type to true + +What: /sys/bus/coresight/devices//dsb_trig_ts +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the trigger timestamp of the DSB for tpdm. + + Accepts only one of the 2 values - 0 or 1. + 0 : Set the DSB trigger type to false + 1 : Set the DSB trigger type to true diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index 9c65e4c01128ce..e9fc3482d480aa 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -25,6 +25,18 @@ static bool tpdm_has_dsb_dataset(struct tpdm_drvdata *drvdata) return (drvdata->datasets & TPDM_PIDR0_DS_DSB); } +static umode_t tpdm_dsb_is_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + struct device *dev = kobj_to_dev(kobj); + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + if (drvdata && tpdm_has_dsb_dataset(drvdata)) + return attr->mode; + + return 0; +} + static void tpdm_reset_datasets(struct tpdm_drvdata *drvdata) { if (tpdm_has_dsb_dataset(drvdata)) { @@ -232,8 +244,91 @@ static struct attribute_group tpdm_attr_grp = { .attrs = tpdm_attrs, }; +static ssize_t dsb_trig_type_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", + (unsigned int)drvdata->dsb->trig_type); +} + +/* + * Trigger type (boolean): + * false - Disable trigger type. + * true - Enable trigger type. + */ +static ssize_t dsb_trig_type_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if ((kstrtoul(buf, 0, &val)) || (val & ~1UL)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + if (val) + drvdata->dsb->trig_type = true; + else + drvdata->dsb->trig_type = false; + spin_unlock(&drvdata->spinlock); + return size; +} +static DEVICE_ATTR_RW(dsb_trig_type); + +static ssize_t dsb_trig_ts_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", + (unsigned int)drvdata->dsb->trig_ts); +} + +/* + * Trigger timestamp (boolean): + * false - Disable trigger timestamp. + * true - Enable trigger timestamp. + */ +static ssize_t dsb_trig_ts_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if ((kstrtoul(buf, 0, &val)) || (val & ~1UL)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + if (val) + drvdata->dsb->trig_ts = true; + else + drvdata->dsb->trig_ts = false; + spin_unlock(&drvdata->spinlock); + return size; +} +static DEVICE_ATTR_RW(dsb_trig_ts); + +static struct attribute *tpdm_dsb_attrs[] = { + &dev_attr_dsb_trig_ts.attr, + &dev_attr_dsb_trig_type.attr, + NULL, +}; + +static struct attribute_group tpdm_dsb_attr_grp = { + .attrs = tpdm_dsb_attrs, + .is_visible = tpdm_dsb_is_visible, +}; + static const struct attribute_group *tpdm_attr_grps[] = { &tpdm_attr_grp, + &tpdm_dsb_attr_grp, NULL, }; From 535d80d3c10fff1cf9d3512c55ff4c8b26260d1b Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:41 +0800 Subject: [PATCH 218/515] coresight-tpdm: Add node to set dsb programming mode Add node to set and show programming mode for TPDM DSB subunit. Once the DSB programming mode is set, it will be written to the register DSB_CR. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-9-git-send-email-quic_taozha@quicinc.com --- .../testing/sysfs-bus-coresight-devices-tpdm | 14 +++++ drivers/hwtracing/coresight/coresight-tpdm.c | 53 +++++++++++++++++++ drivers/hwtracing/coresight/coresight-tpdm.h | 19 +++++++ 3 files changed, 86 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index b15bf012a050a9..8ec7548070b7be 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -43,3 +43,17 @@ Description: Accepts only one of the 2 values - 0 or 1. 0 : Set the DSB trigger type to false 1 : Set the DSB trigger type to true + +What: /sys/bus/coresight/devices//dsb_mode +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the programming mode of the DSB for tpdm. + + Accepts the value needs to be greater than 0. What data + bits do is listed below. + Bit[0:1] : Test mode control bit for choosing the inputs. + Bit[3] : Set to 0 for low performance mode. + Set to 1 for high performance mode. + Bit[4:8] : Select byte lane for high performance mode. diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index e9fc3482d480aa..6201f12718ca60 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -47,6 +48,27 @@ static void tpdm_reset_datasets(struct tpdm_drvdata *drvdata) } } +static void set_dsb_mode(struct tpdm_drvdata *drvdata, u32 *val) +{ + u32 mode; + + /* Set the test accurate mode */ + mode = TPDM_DSB_MODE_TEST(drvdata->dsb->mode); + *val &= ~TPDM_DSB_CR_TEST_MODE; + *val |= FIELD_PREP(TPDM_DSB_CR_TEST_MODE, mode); + + /* Set the byte lane for high-performance mode */ + mode = TPDM_DSB_MODE_HPBYTESEL(drvdata->dsb->mode); + *val &= ~TPDM_DSB_CR_HPSEL; + *val |= FIELD_PREP(TPDM_DSB_CR_HPSEL, mode); + + /* Set the performance mode */ + if (drvdata->dsb->mode & TPDM_DSB_MODE_PERF) + *val |= TPDM_DSB_CR_MODE; + else + *val &= ~TPDM_DSB_CR_MODE; +} + static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) { u32 val; @@ -60,6 +82,8 @@ static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) writel_relaxed(val, drvdata->base + TPDM_DSB_TIER); val = readl_relaxed(drvdata->base + TPDM_DSB_CR); + /* Set the mode of DSB dataset */ + set_dsb_mode(drvdata, &val); /* Set trigger type */ if (drvdata->dsb->trig_type) val |= TPDM_DSB_CR_TRIG_TYPE; @@ -244,6 +268,34 @@ static struct attribute_group tpdm_attr_grp = { .attrs = tpdm_attrs, }; +static ssize_t dsb_mode_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%x\n", drvdata->dsb->mode); +} + +static ssize_t dsb_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if ((kstrtoul(buf, 0, &val)) || (val < 0) || + (val & ~TPDM_DSB_MODE_MASK)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + drvdata->dsb->mode = val & TPDM_DSB_MODE_MASK; + spin_unlock(&drvdata->spinlock); + return size; +} +static DEVICE_ATTR_RW(dsb_mode); + static ssize_t dsb_trig_type_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -316,6 +368,7 @@ static ssize_t dsb_trig_ts_store(struct device *dev, static DEVICE_ATTR_RW(dsb_trig_ts); static struct attribute *tpdm_dsb_attrs[] = { + &dev_attr_dsb_mode.attr, &dev_attr_dsb_trig_ts.attr, &dev_attr_dsb_trig_type.attr, NULL, diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h index f59e751d358168..b55d6f5ce85200 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.h +++ b/drivers/hwtracing/coresight/coresight-tpdm.h @@ -15,11 +15,28 @@ /* Enable bit for DSB subunit */ #define TPDM_DSB_CR_ENA BIT(0) +/* Enable bit for DSB subunit perfmance mode */ +#define TPDM_DSB_CR_MODE BIT(1) /* Enable bit for DSB subunit trigger type */ #define TPDM_DSB_CR_TRIG_TYPE BIT(12) +/* Data bits for DSB high performace mode */ +#define TPDM_DSB_CR_HPSEL GENMASK(6, 2) +/* Data bits for DSB test mode */ +#define TPDM_DSB_CR_TEST_MODE GENMASK(10, 9) + /* Enable bit for DSB subunit trigger timestamp */ #define TPDM_DSB_TIER_XTRIG_TSENAB BIT(1) +/* DSB programming modes */ +/* DSB mode bits mask */ +#define TPDM_DSB_MODE_MASK GENMASK(8, 0) +/* Test mode control bit*/ +#define TPDM_DSB_MODE_TEST(val) (val & GENMASK(1, 0)) +/* Performance mode */ +#define TPDM_DSB_MODE_PERF BIT(3) +/* High performance mode */ +#define TPDM_DSB_MODE_HPBYTESEL(val) (val & GENMASK(8, 4)) + /* TPDM integration test registers */ #define TPDM_ITATBCNTRL (0xEF0) #define TPDM_ITCNTRL (0xF00) @@ -48,10 +65,12 @@ /** * struct dsb_dataset - specifics associated to dsb dataset + * @mode: DSB programming mode * @trig_ts: Enable/Disable trigger timestamp. * @trig_type: Enable/Disable trigger type. */ struct dsb_dataset { + u32 mode; bool trig_ts; bool trig_type; }; From dd60b994b3f8ef7c16cf98a6f2ef318c8c8dc581 Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:42 +0800 Subject: [PATCH 219/515] coresight-tpdm: Add nodes for dsb edge control Add the nodes to set value for DSB edge control and DSB edge control mask. Each DSB subunit TPDM has maximum of n(n<16) EDCR resgisters to configure edge control. DSB edge detection control 00: Rising edge detection 01: Falling edge detection 10: Rising and falling edge detection (toggle detection) And each DSB subunit TPDM has maximum of m(m<8) ECDMR registers to configure mask. Eight 32 bit registers providing DSB interface edge detection mask control. Add the nodes to configure DSB edge control and DSB edge control mask. Each DSB subunit TPDM maximum of 256 edge detections can be configured. The index and value sysfs files need to be paired and written to order. The index sysfs file is to set the index number of the edge detection which needs to be configured. And the value sysfs file is to set the control or mask for the edge detection. DSB edge detection control should be set as the following values. 00: Rising edge detection 01: Falling edge detection 10: Rising and falling edge detection (toggle detection) And DSB edge mask should be set as 0 or 1. Each DSB subunit TPDM has maximum of n(n<16) EDCR resgisters to configure edge control. And each DSB subunit TPDM has maximum of m(m<8) ECDMR registers to configure mask. Add the nodes to read a set of the edge control value and mask of the DSB in TPDM. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-10-git-send-email-quic_taozha@quicinc.com --- .../testing/sysfs-bus-coresight-devices-tpdm | 51 +++++ drivers/hwtracing/coresight/coresight-tpdm.c | 174 +++++++++++++++++- drivers/hwtracing/coresight/coresight-tpdm.h | 60 ++++++ 3 files changed, 284 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index 8ec7548070b7be..6853bb1295e300 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -57,3 +57,54 @@ Description: Bit[3] : Set to 0 for low performance mode. Set to 1 for high performance mode. Bit[4:8] : Select byte lane for high performance mode. + +What: /sys/bus/coresight/devices//dsb_edge/ctrl_idx +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the index number of the edge detection for the DSB + subunit TPDM. Since there are at most 256 edge detections, this + value ranges from 0 to 255. + +What: /sys/bus/coresight/devices//dsb_edge/ctrl_val +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + Write a data to control the edge detection corresponding to + the index number. Before writing data to this sysfs file, + "ctrl_idx" should be written first to configure the index + number of the edge detection which needs to be controlled. + + Accepts only one of the following values. + 0 - Rising edge detection + 1 - Falling edge detection + 2 - Rising and falling edge detection (toggle detection) + + +What: /sys/bus/coresight/devices//dsb_edge/ctrl_mask +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + Write a data to mask the edge detection corresponding to the index + number. Before writing data to this sysfs file, "ctrl_idx" should + be written first to configure the index number of the edge detection + which needs to be masked. + + Accepts only one of the 2 values - 0 or 1. + +What: /sys/bus/coresight/devices//dsb_edge/edcr[0:15] +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + Read a set of the edge control value of the DSB in TPDM. + +What: /sys/bus/coresight/devices//dsb_edge/edcmr[0:7] +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + Read a set of the edge control mask of the DSB in TPDM. \ No newline at end of file diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index 6201f12718ca60..7175e70c2c4e04 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -21,6 +21,30 @@ DEFINE_CORESIGHT_DEVLIST(tpdm_devs, "tpdm"); +/* Read dataset array member with the index number */ +static ssize_t tpdm_simple_dataset_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + struct tpdm_dataset_attribute *tpdm_attr = + container_of(attr, struct tpdm_dataset_attribute, attr); + + switch (tpdm_attr->mem) { + case DSB_EDGE_CTRL: + if (tpdm_attr->idx >= TPDM_DSB_MAX_EDCR) + return -EINVAL; + return sysfs_emit(buf, "0x%x\n", + drvdata->dsb->edge_ctrl[tpdm_attr->idx]); + case DSB_EDGE_CTRL_MASK: + if (tpdm_attr->idx >= TPDM_DSB_MAX_EDCMR) + return -EINVAL; + return sysfs_emit(buf, "0x%x\n", + drvdata->dsb->edge_ctrl_mask[tpdm_attr->idx]); + } + return -EINVAL; +} + static bool tpdm_has_dsb_dataset(struct tpdm_drvdata *drvdata) { return (drvdata->datasets & TPDM_PIDR0_DS_DSB); @@ -71,7 +95,14 @@ static void set_dsb_mode(struct tpdm_drvdata *drvdata, u32 *val) static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) { - u32 val; + u32 val, i; + + for (i = 0; i < TPDM_DSB_MAX_EDCR; i++) + writel_relaxed(drvdata->dsb->edge_ctrl[i], + drvdata->base + TPDM_DSB_EDCR(i)); + for (i = 0; i < TPDM_DSB_MAX_EDCMR; i++) + writel_relaxed(drvdata->dsb->edge_ctrl_mask[i], + drvdata->base + TPDM_DSB_EDCMR(i)); val = readl_relaxed(drvdata->base + TPDM_DSB_TIER); /* Set trigger timestamp */ @@ -296,6 +327,109 @@ static ssize_t dsb_mode_store(struct device *dev, } static DEVICE_ATTR_RW(dsb_mode); +static ssize_t ctrl_idx_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", + (unsigned int)drvdata->dsb->edge_ctrl_idx); +} + +/* + * The EDCR registers can include up to 16 32-bit registers, and each + * one can be configured to control up to 16 edge detections(2 bits + * control one edge detection). So a total 256 edge detections can be + * configured. This function provides a way to set the index number of + * the edge detection which needs to be configured. + */ +static ssize_t ctrl_idx_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if ((kstrtoul(buf, 0, &val)) || (val >= TPDM_DSB_MAX_LINES)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + drvdata->dsb->edge_ctrl_idx = val; + spin_unlock(&drvdata->spinlock); + + return size; +} +static DEVICE_ATTR_RW(ctrl_idx); + +/* + * This function is used to control the edge detection according + * to the index number that has been set. + * "edge_ctrl" should be one of the following values. + * 0 - Rising edge detection + * 1 - Falling edge detection + * 2 - Rising and falling edge detection (toggle detection) + */ +static ssize_t ctrl_val_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val, edge_ctrl; + int reg; + + if ((kstrtoul(buf, 0, &edge_ctrl)) || (edge_ctrl > 0x2)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + /* + * There are 2 bit per DSB Edge Control line. + * Thus we have 16 lines in a 32bit word. + */ + reg = EDCR_TO_WORD_IDX(drvdata->dsb->edge_ctrl_idx); + val = drvdata->dsb->edge_ctrl[reg]; + val &= ~EDCR_TO_WORD_MASK(drvdata->dsb->edge_ctrl_idx); + val |= EDCR_TO_WORD_VAL(edge_ctrl, drvdata->dsb->edge_ctrl_idx); + drvdata->dsb->edge_ctrl[reg] = val; + spin_unlock(&drvdata->spinlock); + + return size; +} +static DEVICE_ATTR_WO(ctrl_val); + +static ssize_t ctrl_mask_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + u32 set; + int reg; + + if ((kstrtoul(buf, 0, &val)) || (val & ~1UL)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + /* + * There is 1 bit per DSB Edge Control Mark line. + * Thus we have 32 lines in a 32bit word. + */ + reg = EDCMR_TO_WORD_IDX(drvdata->dsb->edge_ctrl_idx); + set = drvdata->dsb->edge_ctrl_mask[reg]; + if (val) + set |= BIT(EDCMR_TO_WORD_SHIFT(drvdata->dsb->edge_ctrl_idx)); + else + set &= ~BIT(EDCMR_TO_WORD_SHIFT(drvdata->dsb->edge_ctrl_idx)); + drvdata->dsb->edge_ctrl_mask[reg] = set; + spin_unlock(&drvdata->spinlock); + + return size; +} +static DEVICE_ATTR_WO(ctrl_mask); + static ssize_t dsb_trig_type_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -367,6 +501,37 @@ static ssize_t dsb_trig_ts_store(struct device *dev, } static DEVICE_ATTR_RW(dsb_trig_ts); +static struct attribute *tpdm_dsb_edge_attrs[] = { + &dev_attr_ctrl_idx.attr, + &dev_attr_ctrl_val.attr, + &dev_attr_ctrl_mask.attr, + DSB_EDGE_CTRL_ATTR(0), + DSB_EDGE_CTRL_ATTR(1), + DSB_EDGE_CTRL_ATTR(2), + DSB_EDGE_CTRL_ATTR(3), + DSB_EDGE_CTRL_ATTR(4), + DSB_EDGE_CTRL_ATTR(5), + DSB_EDGE_CTRL_ATTR(6), + DSB_EDGE_CTRL_ATTR(7), + DSB_EDGE_CTRL_ATTR(8), + DSB_EDGE_CTRL_ATTR(9), + DSB_EDGE_CTRL_ATTR(10), + DSB_EDGE_CTRL_ATTR(11), + DSB_EDGE_CTRL_ATTR(12), + DSB_EDGE_CTRL_ATTR(13), + DSB_EDGE_CTRL_ATTR(14), + DSB_EDGE_CTRL_ATTR(15), + DSB_EDGE_CTRL_MASK_ATTR(0), + DSB_EDGE_CTRL_MASK_ATTR(1), + DSB_EDGE_CTRL_MASK_ATTR(2), + DSB_EDGE_CTRL_MASK_ATTR(3), + DSB_EDGE_CTRL_MASK_ATTR(4), + DSB_EDGE_CTRL_MASK_ATTR(5), + DSB_EDGE_CTRL_MASK_ATTR(6), + DSB_EDGE_CTRL_MASK_ATTR(7), + NULL, +}; + static struct attribute *tpdm_dsb_attrs[] = { &dev_attr_dsb_mode.attr, &dev_attr_dsb_trig_ts.attr, @@ -379,9 +544,16 @@ static struct attribute_group tpdm_dsb_attr_grp = { .is_visible = tpdm_dsb_is_visible, }; +static struct attribute_group tpdm_dsb_edge_grp = { + .attrs = tpdm_dsb_edge_attrs, + .is_visible = tpdm_dsb_is_visible, + .name = "dsb_edge", +}; + static const struct attribute_group *tpdm_attr_grps[] = { &tpdm_attr_grp, &tpdm_dsb_attr_grp, + &tpdm_dsb_edge_grp, NULL, }; diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h index b55d6f5ce85200..a9c65d96316a0a 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.h +++ b/drivers/hwtracing/coresight/coresight-tpdm.h @@ -12,6 +12,8 @@ /* DSB Subunit Registers */ #define TPDM_DSB_CR (0x780) #define TPDM_DSB_TIER (0x784) +#define TPDM_DSB_EDCR(n) (0x808 + (n * 4)) +#define TPDM_DSB_EDCMR(n) (0x848 + (n * 4)) /* Enable bit for DSB subunit */ #define TPDM_DSB_CR_ENA BIT(0) @@ -37,6 +39,16 @@ /* High performance mode */ #define TPDM_DSB_MODE_HPBYTESEL(val) (val & GENMASK(8, 4)) +#define EDCRS_PER_WORD 16 +#define EDCR_TO_WORD_IDX(r) ((r) / EDCRS_PER_WORD) +#define EDCR_TO_WORD_SHIFT(r) ((r % EDCRS_PER_WORD) * 2) +#define EDCR_TO_WORD_VAL(val, r) (val << EDCR_TO_WORD_SHIFT(r)) +#define EDCR_TO_WORD_MASK(r) EDCR_TO_WORD_VAL(0x3, r) + +#define EDCMRS_PER_WORD 32 +#define EDCMR_TO_WORD_IDX(r) ((r) / EDCMRS_PER_WORD) +#define EDCMR_TO_WORD_SHIFT(r) ((r) % EDCMRS_PER_WORD) + /* TPDM integration test registers */ #define TPDM_ITATBCNTRL (0xEF0) #define TPDM_ITCNTRL (0xF00) @@ -63,14 +75,43 @@ #define TPDM_PIDR0_DS_IMPDEF BIT(0) #define TPDM_PIDR0_DS_DSB BIT(1) +#define TPDM_DSB_MAX_LINES 256 +/* MAX number of EDCR registers */ +#define TPDM_DSB_MAX_EDCR 16 +/* MAX number of EDCMR registers */ +#define TPDM_DSB_MAX_EDCMR 8 + +#define tpdm_simple_dataset_ro(name, mem, idx) \ + (&((struct tpdm_dataset_attribute[]) { \ + { \ + __ATTR(name, 0444, tpdm_simple_dataset_show, NULL), \ + mem, \ + idx, \ + } \ + })[0].attr.attr) + +#define DSB_EDGE_CTRL_ATTR(nr) \ + tpdm_simple_dataset_ro(edcr##nr, \ + DSB_EDGE_CTRL, nr) + +#define DSB_EDGE_CTRL_MASK_ATTR(nr) \ + tpdm_simple_dataset_ro(edcmr##nr, \ + DSB_EDGE_CTRL_MASK, nr) + /** * struct dsb_dataset - specifics associated to dsb dataset * @mode: DSB programming mode + * @edge_ctrl_idx Index number of the edge control + * @edge_ctrl: Save value for edge control + * @edge_ctrl_mask: Save value for edge control mask * @trig_ts: Enable/Disable trigger timestamp. * @trig_type: Enable/Disable trigger type. */ struct dsb_dataset { u32 mode; + u32 edge_ctrl_idx; + u32 edge_ctrl[TPDM_DSB_MAX_EDCR]; + u32 edge_ctrl_mask[TPDM_DSB_MAX_EDCMR]; bool trig_ts; bool trig_type; }; @@ -96,4 +137,23 @@ struct tpdm_drvdata { struct dsb_dataset *dsb; }; +/* Enumerate members of various datasets */ +enum dataset_mem { + DSB_EDGE_CTRL, + DSB_EDGE_CTRL_MASK, +}; + +/** + * struct tpdm_dataset_attribute - Record the member variables and + * index number of datasets that need to be operated by sysfs file + * @attr: The device attribute + * @mem: The member in the dataset data structure + * @idx: The index number of the array data + */ +struct tpdm_dataset_attribute { + struct device_attribute attr; + enum dataset_mem mem; + u32 idx; +}; + #endif /* _CORESIGHT_CORESIGHT_TPDM_H */ From 5898244cf4586666614023d48ef175926ce67f9d Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:43 +0800 Subject: [PATCH 220/515] coresight-tpdm: Add nodes to configure pattern match output Add nodes to configure trigger pattern and trigger pattern mask. Each DSB subunit TPDM has maximum of n(n<7) XPR registers to configure trigger pattern match output. Eight 32 bit registers providing DSB interface trigger output pattern match comparison. And each DSB subunit TPDM has maximum of m(m<7) XPMR registers to configure trigger pattern mask match output. Eight 32 bit registers providing DSB interface trigger output pattern match mask. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-11-git-send-email-quic_taozha@quicinc.com --- .../testing/sysfs-bus-coresight-devices-tpdm | 18 +++- drivers/hwtracing/coresight/coresight-tpdm.c | 82 ++++++++++++++++++- drivers/hwtracing/coresight/coresight-tpdm.h | 28 +++++++ 3 files changed, 126 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index 6853bb1295e300..2252e4706a90dd 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -107,4 +107,20 @@ Date: March 2023 KernelVersion 6.7 Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) Description: - Read a set of the edge control mask of the DSB in TPDM. \ No newline at end of file + Read a set of the edge control mask of the DSB in TPDM. + +What: /sys/bus/coresight/devices//dsb_trig_patt/xpr[0:7] +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the value of the trigger pattern for the DSB + subunit TPDM. + +What: /sys/bus/coresight/devices//dsb_trig_patt/xpmr[0:7] +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the mask of the trigger pattern for the DSB + subunit TPDM. \ No newline at end of file diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index 7175e70c2c4e04..e04c41f8326565 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -41,10 +41,58 @@ static ssize_t tpdm_simple_dataset_show(struct device *dev, return -EINVAL; return sysfs_emit(buf, "0x%x\n", drvdata->dsb->edge_ctrl_mask[tpdm_attr->idx]); + case DSB_TRIG_PATT: + if (tpdm_attr->idx >= TPDM_DSB_MAX_PATT) + return -EINVAL; + return sysfs_emit(buf, "0x%x\n", + drvdata->dsb->trig_patt[tpdm_attr->idx]); + case DSB_TRIG_PATT_MASK: + if (tpdm_attr->idx >= TPDM_DSB_MAX_PATT) + return -EINVAL; + return sysfs_emit(buf, "0x%x\n", + drvdata->dsb->trig_patt_mask[tpdm_attr->idx]); } return -EINVAL; } +/* Write dataset array member with the index number */ +static ssize_t tpdm_simple_dataset_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + unsigned long val; + ssize_t ret = size; + + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + struct tpdm_dataset_attribute *tpdm_attr = + container_of(attr, struct tpdm_dataset_attribute, attr); + + if (kstrtoul(buf, 0, &val)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + switch (tpdm_attr->mem) { + case DSB_TRIG_PATT: + if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) + drvdata->dsb->trig_patt[tpdm_attr->idx] = val; + else + ret = -EINVAL; + break; + case DSB_TRIG_PATT_MASK: + if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) + drvdata->dsb->trig_patt_mask[tpdm_attr->idx] = val; + else + ret = -EINVAL; + break; + default: + ret = -EINVAL; + } + spin_unlock(&drvdata->spinlock); + + return ret; +} + static bool tpdm_has_dsb_dataset(struct tpdm_drvdata *drvdata) { return (drvdata->datasets & TPDM_PIDR0_DS_DSB); @@ -103,7 +151,12 @@ static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) for (i = 0; i < TPDM_DSB_MAX_EDCMR; i++) writel_relaxed(drvdata->dsb->edge_ctrl_mask[i], drvdata->base + TPDM_DSB_EDCMR(i)); - + for (i = 0; i < TPDM_DSB_MAX_PATT; i++) { + writel_relaxed(drvdata->dsb->trig_patt[i], + drvdata->base + TPDM_DSB_XPR(i)); + writel_relaxed(drvdata->dsb->trig_patt_mask[i], + drvdata->base + TPDM_DSB_XPMR(i)); + } val = readl_relaxed(drvdata->base + TPDM_DSB_TIER); /* Set trigger timestamp */ if (drvdata->dsb->trig_ts) @@ -532,6 +585,26 @@ static struct attribute *tpdm_dsb_edge_attrs[] = { NULL, }; +static struct attribute *tpdm_dsb_trig_patt_attrs[] = { + DSB_TRIG_PATT_ATTR(0), + DSB_TRIG_PATT_ATTR(1), + DSB_TRIG_PATT_ATTR(2), + DSB_TRIG_PATT_ATTR(3), + DSB_TRIG_PATT_ATTR(4), + DSB_TRIG_PATT_ATTR(5), + DSB_TRIG_PATT_ATTR(6), + DSB_TRIG_PATT_ATTR(7), + DSB_TRIG_PATT_MASK_ATTR(0), + DSB_TRIG_PATT_MASK_ATTR(1), + DSB_TRIG_PATT_MASK_ATTR(2), + DSB_TRIG_PATT_MASK_ATTR(3), + DSB_TRIG_PATT_MASK_ATTR(4), + DSB_TRIG_PATT_MASK_ATTR(5), + DSB_TRIG_PATT_MASK_ATTR(6), + DSB_TRIG_PATT_MASK_ATTR(7), + NULL, +}; + static struct attribute *tpdm_dsb_attrs[] = { &dev_attr_dsb_mode.attr, &dev_attr_dsb_trig_ts.attr, @@ -550,10 +623,17 @@ static struct attribute_group tpdm_dsb_edge_grp = { .name = "dsb_edge", }; +static struct attribute_group tpdm_dsb_trig_patt_grp = { + .attrs = tpdm_dsb_trig_patt_attrs, + .is_visible = tpdm_dsb_is_visible, + .name = "dsb_trig_patt", +}; + static const struct attribute_group *tpdm_attr_grps[] = { &tpdm_attr_grp, &tpdm_dsb_attr_grp, &tpdm_dsb_edge_grp, + &tpdm_dsb_trig_patt_grp, NULL, }; diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h index a9c65d96316a0a..2cf7bdbdbb15b1 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.h +++ b/drivers/hwtracing/coresight/coresight-tpdm.h @@ -12,6 +12,8 @@ /* DSB Subunit Registers */ #define TPDM_DSB_CR (0x780) #define TPDM_DSB_TIER (0x784) +#define TPDM_DSB_XPR(n) (0x7C8 + (n * 4)) +#define TPDM_DSB_XPMR(n) (0x7E8 + (n * 4)) #define TPDM_DSB_EDCR(n) (0x808 + (n * 4)) #define TPDM_DSB_EDCMR(n) (0x848 + (n * 4)) @@ -80,6 +82,8 @@ #define TPDM_DSB_MAX_EDCR 16 /* MAX number of EDCMR registers */ #define TPDM_DSB_MAX_EDCMR 8 +/* MAX number of DSB pattern */ +#define TPDM_DSB_MAX_PATT 8 #define tpdm_simple_dataset_ro(name, mem, idx) \ (&((struct tpdm_dataset_attribute[]) { \ @@ -90,6 +94,16 @@ } \ })[0].attr.attr) +#define tpdm_simple_dataset_rw(name, mem, idx) \ + (&((struct tpdm_dataset_attribute[]) { \ + { \ + __ATTR(name, 0644, tpdm_simple_dataset_show, \ + tpdm_simple_dataset_store), \ + mem, \ + idx, \ + } \ + })[0].attr.attr) + #define DSB_EDGE_CTRL_ATTR(nr) \ tpdm_simple_dataset_ro(edcr##nr, \ DSB_EDGE_CTRL, nr) @@ -98,12 +112,22 @@ tpdm_simple_dataset_ro(edcmr##nr, \ DSB_EDGE_CTRL_MASK, nr) +#define DSB_TRIG_PATT_ATTR(nr) \ + tpdm_simple_dataset_rw(xpr##nr, \ + DSB_TRIG_PATT, nr) + +#define DSB_TRIG_PATT_MASK_ATTR(nr) \ + tpdm_simple_dataset_rw(xpmr##nr, \ + DSB_TRIG_PATT_MASK, nr) + /** * struct dsb_dataset - specifics associated to dsb dataset * @mode: DSB programming mode * @edge_ctrl_idx Index number of the edge control * @edge_ctrl: Save value for edge control * @edge_ctrl_mask: Save value for edge control mask + * @trig_patt: Save value for trigger pattern + * @trig_patt_mask: Save value for trigger pattern mask * @trig_ts: Enable/Disable trigger timestamp. * @trig_type: Enable/Disable trigger type. */ @@ -112,6 +136,8 @@ struct dsb_dataset { u32 edge_ctrl_idx; u32 edge_ctrl[TPDM_DSB_MAX_EDCR]; u32 edge_ctrl_mask[TPDM_DSB_MAX_EDCMR]; + u32 trig_patt[TPDM_DSB_MAX_PATT]; + u32 trig_patt_mask[TPDM_DSB_MAX_PATT]; bool trig_ts; bool trig_type; }; @@ -141,6 +167,8 @@ struct tpdm_drvdata { enum dataset_mem { DSB_EDGE_CTRL, DSB_EDGE_CTRL_MASK, + DSB_TRIG_PATT, + DSB_TRIG_PATT_MASK, }; /** From 949a4f5b66d29cb8cd2fa06b5c96a94b09fbe304 Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:44 +0800 Subject: [PATCH 221/515] coresight-tpdm: Add nodes for timestamp request Add nodes to configure the timestamp request based on input pattern match. Each TPDM that support DSB subunit has maximum of n(n<7) TPR registers to configure value for timestamp request based on input pattern match. Eight 32 bit registers providing DSB interface timestamp request pattern match comparison. And each TPDM that support DSB subunit has maximum of m(m<7) TPMR registers to configure pattern mask for timestamp request. Eight 32 bit registers providing DSB interface timestamp request pattern match mask generation. Add nodes to enable/disable pattern timestamp and set pattern timestamp type. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-12-git-send-email-quic_taozha@quicinc.com --- .../testing/sysfs-bus-coresight-devices-tpdm | 40 ++++- drivers/hwtracing/coresight/coresight-tpdm.c | 155 +++++++++++++++++- drivers/hwtracing/coresight/coresight-tpdm.h | 24 +++ 3 files changed, 211 insertions(+), 8 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index 2252e4706a90dd..1f20a3f7df7dff 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -123,4 +123,42 @@ KernelVersion 6.7 Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) Description: (RW) Set/Get the mask of the trigger pattern for the DSB - subunit TPDM. \ No newline at end of file + subunit TPDM. + +What: /sys/bus/coresight/devices//dsb_patt/tpr[0:7] +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the value of the pattern for the DSB subunit TPDM. + +What: /sys/bus/coresight/devices//dsb_patt/tpmr[0:7] +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the mask of the pattern for the DSB subunit TPDM. + +What: /sys/bus/coresight/devices//dsb_patt/enable_ts +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (Write) Set the pattern timestamp of DSB tpdm. Read + the pattern timestamp of DSB tpdm. + + Accepts only one of the 2 values - 0 or 1. + 0 : Disable DSB pattern timestamp. + 1 : Enable DSB pattern timestamp. + +What: /sys/bus/coresight/devices//dsb_patt/set_type +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (Write) Set the pattern type of DSB tpdm. Read + the pattern type of DSB tpdm. + + Accepts only one of the 2 values - 0 or 1. + 0 : Set the DSB pattern type to value. + 1 : Set the DSB pattern type to toggle. diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index e04c41f8326565..693b90c82f3a03 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -51,6 +51,16 @@ static ssize_t tpdm_simple_dataset_show(struct device *dev, return -EINVAL; return sysfs_emit(buf, "0x%x\n", drvdata->dsb->trig_patt_mask[tpdm_attr->idx]); + case DSB_PATT: + if (tpdm_attr->idx >= TPDM_DSB_MAX_PATT) + return -EINVAL; + return sysfs_emit(buf, "0x%x\n", + drvdata->dsb->patt_val[tpdm_attr->idx]); + case DSB_PATT_MASK: + if (tpdm_attr->idx >= TPDM_DSB_MAX_PATT) + return -EINVAL; + return sysfs_emit(buf, "0x%x\n", + drvdata->dsb->patt_mask[tpdm_attr->idx]); } return -EINVAL; } @@ -85,6 +95,18 @@ static ssize_t tpdm_simple_dataset_store(struct device *dev, else ret = -EINVAL; break; + case DSB_PATT: + if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) + drvdata->dsb->patt_val[tpdm_attr->idx] = val; + else + ret = -EINVAL; + break; + case DSB_PATT_MASK: + if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) + drvdata->dsb->patt_mask[tpdm_attr->idx] = val; + else + ret = -EINVAL; + break; default: ret = -EINVAL; } @@ -141,6 +163,36 @@ static void set_dsb_mode(struct tpdm_drvdata *drvdata, u32 *val) *val &= ~TPDM_DSB_CR_MODE; } +static void set_dsb_tier(struct tpdm_drvdata *drvdata) +{ + u32 val; + + val = readl_relaxed(drvdata->base + TPDM_DSB_TIER); + + /* Clear all relevant fields */ + val &= ~(TPDM_DSB_TIER_PATT_TSENAB | TPDM_DSB_TIER_PATT_TYPE | + TPDM_DSB_TIER_XTRIG_TSENAB); + + /* Set pattern timestamp type and enablement */ + if (drvdata->dsb->patt_ts) { + val |= TPDM_DSB_TIER_PATT_TSENAB; + if (drvdata->dsb->patt_type) + val |= TPDM_DSB_TIER_PATT_TYPE; + else + val &= ~TPDM_DSB_TIER_PATT_TYPE; + } else { + val &= ~TPDM_DSB_TIER_PATT_TSENAB; + } + + /* Set trigger timestamp */ + if (drvdata->dsb->trig_ts) + val |= TPDM_DSB_TIER_XTRIG_TSENAB; + else + val &= ~TPDM_DSB_TIER_XTRIG_TSENAB; + + writel_relaxed(val, drvdata->base + TPDM_DSB_TIER); +} + static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) { u32 val, i; @@ -152,18 +204,17 @@ static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) writel_relaxed(drvdata->dsb->edge_ctrl_mask[i], drvdata->base + TPDM_DSB_EDCMR(i)); for (i = 0; i < TPDM_DSB_MAX_PATT; i++) { + writel_relaxed(drvdata->dsb->patt_val[i], + drvdata->base + TPDM_DSB_TPR(i)); + writel_relaxed(drvdata->dsb->patt_mask[i], + drvdata->base + TPDM_DSB_TPMR(i)); writel_relaxed(drvdata->dsb->trig_patt[i], drvdata->base + TPDM_DSB_XPR(i)); writel_relaxed(drvdata->dsb->trig_patt_mask[i], drvdata->base + TPDM_DSB_XPMR(i)); } - val = readl_relaxed(drvdata->base + TPDM_DSB_TIER); - /* Set trigger timestamp */ - if (drvdata->dsb->trig_ts) - val |= TPDM_DSB_TIER_XTRIG_TSENAB; - else - val &= ~TPDM_DSB_TIER_XTRIG_TSENAB; - writel_relaxed(val, drvdata->base + TPDM_DSB_TIER); + + set_dsb_tier(drvdata); val = readl_relaxed(drvdata->base + TPDM_DSB_CR); /* Set the mode of DSB dataset */ @@ -483,6 +534,67 @@ static ssize_t ctrl_mask_store(struct device *dev, } static DEVICE_ATTR_WO(ctrl_mask); +static ssize_t enable_ts_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", + (unsigned int)drvdata->dsb->patt_ts); +} + +/* + * value 1: Enable/Disable DSB pattern timestamp + */ +static ssize_t enable_ts_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if ((kstrtoul(buf, 0, &val)) || (val & ~1UL)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + drvdata->dsb->patt_ts = !!val; + spin_unlock(&drvdata->spinlock); + return size; +} +static DEVICE_ATTR_RW(enable_ts); + +static ssize_t set_type_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", + (unsigned int)drvdata->dsb->patt_type); +} + +/* + * value 1: Set DSB pattern type + */ +static ssize_t set_type_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if ((kstrtoul(buf, 0, &val)) || (val & ~1UL)) + return -EINVAL; + + spin_lock(&drvdata->spinlock); + drvdata->dsb->patt_type = val; + spin_unlock(&drvdata->spinlock); + return size; +} +static DEVICE_ATTR_RW(set_type); + static ssize_t dsb_trig_type_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -605,6 +717,28 @@ static struct attribute *tpdm_dsb_trig_patt_attrs[] = { NULL, }; +static struct attribute *tpdm_dsb_patt_attrs[] = { + DSB_PATT_ATTR(0), + DSB_PATT_ATTR(1), + DSB_PATT_ATTR(2), + DSB_PATT_ATTR(3), + DSB_PATT_ATTR(4), + DSB_PATT_ATTR(5), + DSB_PATT_ATTR(6), + DSB_PATT_ATTR(7), + DSB_PATT_MASK_ATTR(0), + DSB_PATT_MASK_ATTR(1), + DSB_PATT_MASK_ATTR(2), + DSB_PATT_MASK_ATTR(3), + DSB_PATT_MASK_ATTR(4), + DSB_PATT_MASK_ATTR(5), + DSB_PATT_MASK_ATTR(6), + DSB_PATT_MASK_ATTR(7), + &dev_attr_enable_ts.attr, + &dev_attr_set_type.attr, + NULL, +}; + static struct attribute *tpdm_dsb_attrs[] = { &dev_attr_dsb_mode.attr, &dev_attr_dsb_trig_ts.attr, @@ -629,11 +763,18 @@ static struct attribute_group tpdm_dsb_trig_patt_grp = { .name = "dsb_trig_patt", }; +static struct attribute_group tpdm_dsb_patt_grp = { + .attrs = tpdm_dsb_patt_attrs, + .is_visible = tpdm_dsb_is_visible, + .name = "dsb_patt", +}; + static const struct attribute_group *tpdm_attr_grps[] = { &tpdm_attr_grp, &tpdm_dsb_attr_grp, &tpdm_dsb_edge_grp, &tpdm_dsb_trig_patt_grp, + &tpdm_dsb_patt_grp, NULL, }; diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h index 2cf7bdbdbb15b1..891979db111ac6 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.h +++ b/drivers/hwtracing/coresight/coresight-tpdm.h @@ -12,6 +12,8 @@ /* DSB Subunit Registers */ #define TPDM_DSB_CR (0x780) #define TPDM_DSB_TIER (0x784) +#define TPDM_DSB_TPR(n) (0x788 + (n * 4)) +#define TPDM_DSB_TPMR(n) (0x7A8 + (n * 4)) #define TPDM_DSB_XPR(n) (0x7C8 + (n * 4)) #define TPDM_DSB_XPMR(n) (0x7E8 + (n * 4)) #define TPDM_DSB_EDCR(n) (0x808 + (n * 4)) @@ -28,8 +30,12 @@ /* Data bits for DSB test mode */ #define TPDM_DSB_CR_TEST_MODE GENMASK(10, 9) +/* Enable bit for DSB subunit pattern timestamp */ +#define TPDM_DSB_TIER_PATT_TSENAB BIT(0) /* Enable bit for DSB subunit trigger timestamp */ #define TPDM_DSB_TIER_XTRIG_TSENAB BIT(1) +/* Bit for DSB subunit pattern type */ +#define TPDM_DSB_TIER_PATT_TYPE BIT(2) /* DSB programming modes */ /* DSB mode bits mask */ @@ -120,14 +126,26 @@ tpdm_simple_dataset_rw(xpmr##nr, \ DSB_TRIG_PATT_MASK, nr) +#define DSB_PATT_ATTR(nr) \ + tpdm_simple_dataset_rw(tpr##nr, \ + DSB_PATT, nr) + +#define DSB_PATT_MASK_ATTR(nr) \ + tpdm_simple_dataset_rw(tpmr##nr, \ + DSB_PATT_MASK, nr) + /** * struct dsb_dataset - specifics associated to dsb dataset * @mode: DSB programming mode * @edge_ctrl_idx Index number of the edge control * @edge_ctrl: Save value for edge control * @edge_ctrl_mask: Save value for edge control mask + * @patt_val: Save value for pattern + * @patt_mask: Save value for pattern mask * @trig_patt: Save value for trigger pattern * @trig_patt_mask: Save value for trigger pattern mask + * @patt_ts: Enable/Disable pattern timestamp + * @patt_type: Set pattern type * @trig_ts: Enable/Disable trigger timestamp. * @trig_type: Enable/Disable trigger type. */ @@ -136,8 +154,12 @@ struct dsb_dataset { u32 edge_ctrl_idx; u32 edge_ctrl[TPDM_DSB_MAX_EDCR]; u32 edge_ctrl_mask[TPDM_DSB_MAX_EDCMR]; + u32 patt_val[TPDM_DSB_MAX_PATT]; + u32 patt_mask[TPDM_DSB_MAX_PATT]; u32 trig_patt[TPDM_DSB_MAX_PATT]; u32 trig_patt_mask[TPDM_DSB_MAX_PATT]; + bool patt_ts; + bool patt_type; bool trig_ts; bool trig_type; }; @@ -169,6 +191,8 @@ enum dataset_mem { DSB_EDGE_CTRL_MASK, DSB_TRIG_PATT, DSB_TRIG_PATT_MASK, + DSB_PATT, + DSB_PATT_MASK, }; /** From 20dab0f44ac8bfe5b9cecd85adeab8e6228ccd52 Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:45 +0800 Subject: [PATCH 222/515] dt-bindings: arm: Add support for DSB MSR register Add property "qcom,dsb-msrs-num" to support DSB(Discrete Single Bit) MSR(mux select register) for TPDM. It specifies the number of MSR registers supported by the DSB TDPM. Signed-off-by: Tao Zhang Acked-by: Rob Herring Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-13-git-send-email-quic_taozha@quicinc.com --- .../devicetree/bindings/arm/qcom,coresight-tpdm.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml b/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml index e19fc375d494ea..61ddc3b5b247b0 100644 --- a/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml +++ b/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml @@ -52,6 +52,15 @@ properties: $ref: /schemas/types.yaml#/definitions/uint8 enum: [32, 64] + qcom,dsb-msrs-num: + description: + Specifies the number of DSB(Discrete Single Bit) MSR(mux select register) + registers supported by the monitor. If this property is not configured + or set to 0, it means this DSB TPDM doesn't support MSR. + $ref: /schemas/types.yaml#/definitions/uint32 + minimum: 0 + maximum: 32 + clocks: maxItems: 1 @@ -86,6 +95,7 @@ examples: reg = <0x0684c000 0x1000>; qcom,dsb-element-size = /bits/ 8 <32>; + qcom,dsb-msrs-num = <16>; clocks = <&aoss_qmp>; clock-names = "apb_pclk"; From 90a7371cb08d7e542fa4f283c881973bba09f23b Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 28 Sep 2023 14:29:46 +0800 Subject: [PATCH 223/515] coresight-tpdm: Add nodes for dsb msr support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the nodes for DSB subunit MSR(mux select register) support. The TPDM MSR (mux select register) interface is an optional interface and associated bank of registers per TPDM subunit. The intent of mux select registers is to control muxing structures driving the TPDM’s’ various subunit interfaces. Signed-off-by: Tao Zhang Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/1695882586-10306-14-git-send-email-quic_taozha@quicinc.com --- .../testing/sysfs-bus-coresight-devices-tpdm | 8 ++ drivers/hwtracing/coresight/coresight-tpdm.c | 85 +++++++++++++++++++ drivers/hwtracing/coresight/coresight-tpdm.h | 12 +++ 3 files changed, 105 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index 1f20a3f7df7dff..f07218e788439d 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -162,3 +162,11 @@ Description: Accepts only one of the 2 values - 0 or 1. 0 : Set the DSB pattern type to value. 1 : Set the DSB pattern type to toggle. + +What: /sys/bus/coresight/devices//dsb_msr/msr[0:31] +Date: March 2023 +KernelVersion 6.7 +Contact: Jinlong Mao (QUIC) , Tao Zhang (QUIC) +Description: + (RW) Set/Get the MSR(mux select register) for the DSB subunit + TPDM. diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index 693b90c82f3a03..b25284e06395fc 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -61,6 +61,11 @@ static ssize_t tpdm_simple_dataset_show(struct device *dev, return -EINVAL; return sysfs_emit(buf, "0x%x\n", drvdata->dsb->patt_mask[tpdm_attr->idx]); + case DSB_MSR: + if (tpdm_attr->idx >= drvdata->dsb_msr_num) + return -EINVAL; + return sysfs_emit(buf, "0x%x\n", + drvdata->dsb->msr[tpdm_attr->idx]); } return -EINVAL; } @@ -107,6 +112,12 @@ static ssize_t tpdm_simple_dataset_store(struct device *dev, else ret = -EINVAL; break; + case DSB_MSR: + if (tpdm_attr->idx < drvdata->dsb_msr_num) + drvdata->dsb->msr[tpdm_attr->idx] = val; + else + ret = -EINVAL; + break; default: ret = -EINVAL; } @@ -132,6 +143,22 @@ static umode_t tpdm_dsb_is_visible(struct kobject *kobj, return 0; } +static umode_t tpdm_dsb_msr_is_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + struct device *dev = kobj_to_dev(kobj); + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); + struct device_attribute *dev_attr = + container_of(attr, struct device_attribute, attr); + struct tpdm_dataset_attribute *tpdm_attr = + container_of(dev_attr, struct tpdm_dataset_attribute, attr); + + if (tpdm_attr->idx < drvdata->dsb_msr_num) + return attr->mode; + + return 0; +} + static void tpdm_reset_datasets(struct tpdm_drvdata *drvdata) { if (tpdm_has_dsb_dataset(drvdata)) { @@ -193,6 +220,15 @@ static void set_dsb_tier(struct tpdm_drvdata *drvdata) writel_relaxed(val, drvdata->base + TPDM_DSB_TIER); } +static void set_dsb_msr(struct tpdm_drvdata *drvdata) +{ + int i; + + for (i = 0; i < drvdata->dsb_msr_num; i++) + writel_relaxed(drvdata->dsb->msr[i], + drvdata->base + TPDM_DSB_MSR(i)); +} + static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) { u32 val, i; @@ -216,6 +252,8 @@ static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata) set_dsb_tier(drvdata); + set_dsb_msr(drvdata); + val = readl_relaxed(drvdata->base + TPDM_DSB_CR); /* Set the mode of DSB dataset */ set_dsb_mode(drvdata, &val); @@ -739,6 +777,42 @@ static struct attribute *tpdm_dsb_patt_attrs[] = { NULL, }; +static struct attribute *tpdm_dsb_msr_attrs[] = { + DSB_MSR_ATTR(0), + DSB_MSR_ATTR(1), + DSB_MSR_ATTR(2), + DSB_MSR_ATTR(3), + DSB_MSR_ATTR(4), + DSB_MSR_ATTR(5), + DSB_MSR_ATTR(6), + DSB_MSR_ATTR(7), + DSB_MSR_ATTR(8), + DSB_MSR_ATTR(9), + DSB_MSR_ATTR(10), + DSB_MSR_ATTR(11), + DSB_MSR_ATTR(12), + DSB_MSR_ATTR(13), + DSB_MSR_ATTR(14), + DSB_MSR_ATTR(15), + DSB_MSR_ATTR(16), + DSB_MSR_ATTR(17), + DSB_MSR_ATTR(18), + DSB_MSR_ATTR(19), + DSB_MSR_ATTR(20), + DSB_MSR_ATTR(21), + DSB_MSR_ATTR(22), + DSB_MSR_ATTR(23), + DSB_MSR_ATTR(24), + DSB_MSR_ATTR(25), + DSB_MSR_ATTR(26), + DSB_MSR_ATTR(27), + DSB_MSR_ATTR(28), + DSB_MSR_ATTR(29), + DSB_MSR_ATTR(30), + DSB_MSR_ATTR(31), + NULL, +}; + static struct attribute *tpdm_dsb_attrs[] = { &dev_attr_dsb_mode.attr, &dev_attr_dsb_trig_ts.attr, @@ -769,12 +843,19 @@ static struct attribute_group tpdm_dsb_patt_grp = { .name = "dsb_patt", }; +static struct attribute_group tpdm_dsb_msr_grp = { + .attrs = tpdm_dsb_msr_attrs, + .is_visible = tpdm_dsb_msr_is_visible, + .name = "dsb_msr", +}; + static const struct attribute_group *tpdm_attr_grps[] = { &tpdm_attr_grp, &tpdm_dsb_attr_grp, &tpdm_dsb_edge_grp, &tpdm_dsb_trig_patt_grp, &tpdm_dsb_patt_grp, + &tpdm_dsb_msr_grp, NULL, }; @@ -809,6 +890,10 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id) if (ret) return ret; + if (drvdata && tpdm_has_dsb_dataset(drvdata)) + of_property_read_u32(drvdata->dev->of_node, + "qcom,dsb_msr_num", &drvdata->dsb_msr_num); + /* Set up coresight component description */ desc.name = coresight_alloc_device_name(&tpdm_devs, dev); if (!desc.name) diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h index 891979db111ac6..4115b2a17b8d8a 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.h +++ b/drivers/hwtracing/coresight/coresight-tpdm.h @@ -18,6 +18,7 @@ #define TPDM_DSB_XPMR(n) (0x7E8 + (n * 4)) #define TPDM_DSB_EDCR(n) (0x808 + (n * 4)) #define TPDM_DSB_EDCMR(n) (0x848 + (n * 4)) +#define TPDM_DSB_MSR(n) (0x980 + (n * 4)) /* Enable bit for DSB subunit */ #define TPDM_DSB_CR_ENA BIT(0) @@ -90,6 +91,8 @@ #define TPDM_DSB_MAX_EDCMR 8 /* MAX number of DSB pattern */ #define TPDM_DSB_MAX_PATT 8 +/* MAX number of DSB MSR */ +#define TPDM_DSB_MAX_MSR 32 #define tpdm_simple_dataset_ro(name, mem, idx) \ (&((struct tpdm_dataset_attribute[]) { \ @@ -134,6 +137,10 @@ tpdm_simple_dataset_rw(tpmr##nr, \ DSB_PATT_MASK, nr) +#define DSB_MSR_ATTR(nr) \ + tpdm_simple_dataset_rw(msr##nr, \ + DSB_MSR, nr) + /** * struct dsb_dataset - specifics associated to dsb dataset * @mode: DSB programming mode @@ -144,6 +151,7 @@ * @patt_mask: Save value for pattern mask * @trig_patt: Save value for trigger pattern * @trig_patt_mask: Save value for trigger pattern mask + * @msr Save value for MSR * @patt_ts: Enable/Disable pattern timestamp * @patt_type: Set pattern type * @trig_ts: Enable/Disable trigger timestamp. @@ -158,6 +166,7 @@ struct dsb_dataset { u32 patt_mask[TPDM_DSB_MAX_PATT]; u32 trig_patt[TPDM_DSB_MAX_PATT]; u32 trig_patt_mask[TPDM_DSB_MAX_PATT]; + u32 msr[TPDM_DSB_MAX_MSR]; bool patt_ts; bool patt_type; bool trig_ts; @@ -173,6 +182,7 @@ struct dsb_dataset { * @enable: enable status of the component. * @datasets: The datasets types present of the TPDM. * @dsb Specifics associated to TPDM DSB. + * @dsb_msr_num Number of MSR supported by DSB TPDM */ struct tpdm_drvdata { @@ -183,6 +193,7 @@ struct tpdm_drvdata { bool enable; unsigned long datasets; struct dsb_dataset *dsb; + u32 dsb_msr_num; }; /* Enumerate members of various datasets */ @@ -193,6 +204,7 @@ enum dataset_mem { DSB_TRIG_PATT_MASK, DSB_PATT, DSB_PATT_MASK, + DSB_MSR, }; /** From 6531358e6bee656fe869a8f26472c40bc337d816 Mon Sep 17 00:00:00 2001 From: Charles Han Date: Mon, 18 Sep 2023 11:13:09 +0800 Subject: [PATCH 224/515] Documentation: RCU: Remove repeated word in comments Remove the repeated word "of" in comments. Signed-off-by: Charles Han Signed-off-by: Paul E. McKenney --- Documentation/RCU/torture.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/RCU/torture.rst b/Documentation/RCU/torture.rst index b3b6dfa85248ea..49e7beea6ae151 100644 --- a/Documentation/RCU/torture.rst +++ b/Documentation/RCU/torture.rst @@ -185,7 +185,7 @@ argument. Not all changes require that all scenarios be run. For example, a change to Tree SRCU might run only the SRCU-N and SRCU-P scenarios using the --configs argument to kvm.sh as follows: "--configs 'SRCU-N SRCU-P'". -Large systems can run multiple copies of of the full set of scenarios, +Large systems can run multiple copies of the full set of scenarios, for example, a system with 448 hardware threads can run five instances of the full set concurrently. To make this happen:: From 1dab3fdb2aa94a24ef641c31519ad29a16df9825 Mon Sep 17 00:00:00 2001 From: Philipp Stanner Date: Wed, 20 Sep 2023 11:22:12 +0200 Subject: [PATCH 225/515] rculist.h: docs: Fix wrong function summary The brief summary in the docstring for function list_next_or_null_rcu() states that the function is supposed to provide the "first" member of a list, whereas in truth it returns the next member. Change the docstring so it describes what the function actually does. Signed-off-by: Philipp Stanner Signed-off-by: Paul E. McKenney --- include/linux/rculist.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/rculist.h b/include/linux/rculist.h index d29740be4833e2..3dc1e58865f77b 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h @@ -355,7 +355,7 @@ static inline void list_splice_tail_init_rcu(struct list_head *list, }) /** - * list_next_or_null_rcu - get the first element from a list + * list_next_or_null_rcu - get the next element from a list * @head: the head for the list. * @ptr: the list head to take the next element from. * @type: the type of the struct this is embedded in. From 31996ac8011632340bdd91658d1702afdfdad74d Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Tue, 3 Oct 2023 10:30:01 -0700 Subject: [PATCH 226/515] doc: Clarify RCU Tasks reader/updater checklist Currently, the reader/updater compatibility rules for the three RCU Tasks flavors are squished together in a single paragraph, which can result in confusion. This commit therefore splits them out into a list, clearly showing the distinction between these flavors. Link: https://lore.kernel.org/all/20231002211936.5948253e@gandalf.local.home/ Reported-by: Steven Rostedt Signed-off-by: Paul E. McKenney Reviewed-by: Mathieu Desnoyers Reviewed-by: Steven Rostedt (Google) --- Documentation/RCU/checklist.rst | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Documentation/RCU/checklist.rst b/Documentation/RCU/checklist.rst index bd3c58c44befdd..c432899aff22e6 100644 --- a/Documentation/RCU/checklist.rst +++ b/Documentation/RCU/checklist.rst @@ -241,15 +241,22 @@ over a rather long period of time, but improvements are always welcome! srcu_struct. The rules for the expedited RCU grace-period-wait primitives are the same as for their non-expedited counterparts. - If the updater uses call_rcu_tasks() or synchronize_rcu_tasks(), - then the readers must refrain from executing voluntary - context switches, that is, from blocking. If the updater uses - call_rcu_tasks_trace() or synchronize_rcu_tasks_trace(), then - the corresponding readers must use rcu_read_lock_trace() and - rcu_read_unlock_trace(). If an updater uses call_rcu_tasks_rude() - or synchronize_rcu_tasks_rude(), then the corresponding readers - must use anything that disables preemption, for example, - preempt_disable() and preempt_enable(). + Similarly, it is necssary to correctly use the RCU Tasks flavors: + + a. If the updater uses synchronize_rcu_tasks() or + call_rcu_tasks(), then the readers must refrain from + executing voluntary context switches, that is, from + blocking. + + b. If the updater uses call_rcu_tasks_trace() + or synchronize_rcu_tasks_trace(), then the + corresponding readers must use rcu_read_lock_trace() + and rcu_read_unlock_trace(). + + c. If an updater uses call_rcu_tasks_rude() or + synchronize_rcu_tasks_rude(), then the corresponding + readers must use anything that disables preemption, + for example, preempt_disable() and preempt_enable(). Mixing things up will result in confusion and broken kernels, and has even resulted in an exploitable security issue. Therefore, From 7ce039a9d624779ee40f3c7925c3d62855fd8e0d Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Tue, 10 Oct 2023 09:52:19 -0700 Subject: [PATCH 227/515] locktorture: Increase Hamming distance between call_rcu_chain and rcu_call_chains One letter difference is really not enough, so this commit changes call_rcu_chain to call_rcu_chain_list. Reported-by: Dan Carpenter Signed-off-by: Paul E. McKenney --- kernel/locking/locktorture.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c index 69d3cd2cfc3baf..415d81e6ce7072 100644 --- a/kernel/locking/locktorture.c +++ b/kernel/locking/locktorture.c @@ -124,7 +124,7 @@ struct call_rcu_chain { struct rcu_head crc_rh; bool crc_stop; }; -struct call_rcu_chain *call_rcu_chain; +struct call_rcu_chain *call_rcu_chain_list; /* Forward reference. */ static void lock_torture_cleanup(void); @@ -1074,12 +1074,12 @@ static int call_rcu_chain_init(void) if (call_rcu_chains <= 0) return 0; - call_rcu_chain = kcalloc(call_rcu_chains, sizeof(*call_rcu_chain), GFP_KERNEL); - if (!call_rcu_chain) + call_rcu_chain_list = kcalloc(call_rcu_chains, sizeof(*call_rcu_chain_list), GFP_KERNEL); + if (!call_rcu_chain_list) return -ENOMEM; for (i = 0; i < call_rcu_chains; i++) { - call_rcu_chain[i].crc_stop = false; - call_rcu(&call_rcu_chain[i].crc_rh, call_rcu_chain_cb); + call_rcu_chain_list[i].crc_stop = false; + call_rcu(&call_rcu_chain_list[i].crc_rh, call_rcu_chain_cb); } return 0; } @@ -1089,13 +1089,13 @@ static void call_rcu_chain_cleanup(void) { int i; - if (!call_rcu_chain) + if (!call_rcu_chain_list) return; for (i = 0; i < call_rcu_chains; i++) - smp_store_release(&call_rcu_chain[i].crc_stop, true); + smp_store_release(&call_rcu_chain_list[i].crc_stop, true); rcu_barrier(); - kfree(call_rcu_chain); - call_rcu_chain = NULL; + kfree(call_rcu_chain_list); + call_rcu_chain_list = NULL; } static void lock_torture_cleanup(void) From 5d573c1be83ef7b319e27701baf54ee603322cd0 Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Wed, 11 Oct 2023 09:45:54 -0700 Subject: [PATCH 228/515] rcu-tasks: Mark RCU Tasks accesses to current->rcu_tasks_idle_cpu The task_struct structure's ->rcu_tasks_idle_cpu can be concurrently read and written from the RCU Tasks grace-period kthread and from the CPU on which the task_struct structure's task is running. This commit therefore marks the accesses appropriately. Reported-by: Boqun Feng Signed-off-by: Paul E. McKenney --- kernel/rcu/tasks.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h index 1fa631168594d1..bf5f178fe72325 100644 --- a/kernel/rcu/tasks.h +++ b/kernel/rcu/tasks.h @@ -949,7 +949,7 @@ static void check_holdout_task(struct task_struct *t, t->rcu_tasks_nvcsw != READ_ONCE(t->nvcsw) || !READ_ONCE(t->on_rq) || (IS_ENABLED(CONFIG_NO_HZ_FULL) && - !is_idle_task(t) && t->rcu_tasks_idle_cpu >= 0)) { + !is_idle_task(t) && READ_ONCE(t->rcu_tasks_idle_cpu) >= 0)) { WRITE_ONCE(t->rcu_tasks_holdout, false); list_del_init(&t->rcu_tasks_holdout_list); put_task_struct(t); @@ -967,7 +967,7 @@ static void check_holdout_task(struct task_struct *t, t, ".I"[is_idle_task(t)], "N."[cpu < 0 || !tick_nohz_full_cpu(cpu)], t->rcu_tasks_nvcsw, t->nvcsw, t->rcu_tasks_holdout, - t->rcu_tasks_idle_cpu, cpu); + data_race(t->rcu_tasks_idle_cpu), cpu); sched_show_task(t); } From 75707783c13b48c94ae449b18566f25f6f453a09 Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Wed, 4 Oct 2023 01:29:01 +0200 Subject: [PATCH 229/515] srcu: Remove superfluous callbacks advancing from srcu_start_gp() Callbacks advancing on SRCU must be performed on two specific places: 1) On enqueue time in order to make room for the acceleration of the new callback. 2) On invocation time in order to move the callbacks ready to invoke. Any other callback advancing callsite is needless. Remove the remaining one in srcu_gp_start(). Co-developed-by: Yong He Co-developed-by: Joel Fernandes Co-developed-by: Neeraj upadhyay Signed-off-by: Frederic Weisbecker Signed-off-by: Paul E. McKenney --- kernel/rcu/srcutree.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c index 560e99ec53335c..e9356a10362612 100644 --- a/kernel/rcu/srcutree.c +++ b/kernel/rcu/srcutree.c @@ -772,20 +772,10 @@ EXPORT_SYMBOL_GPL(__srcu_read_unlock_nmisafe); */ static void srcu_gp_start(struct srcu_struct *ssp) { - struct srcu_data *sdp; int state; - if (smp_load_acquire(&ssp->srcu_sup->srcu_size_state) < SRCU_SIZE_WAIT_BARRIER) - sdp = per_cpu_ptr(ssp->sda, get_boot_cpu_id()); - else - sdp = this_cpu_ptr(ssp->sda); lockdep_assert_held(&ACCESS_PRIVATE(ssp->srcu_sup, lock)); WARN_ON_ONCE(ULONG_CMP_GE(ssp->srcu_sup->srcu_gp_seq, ssp->srcu_sup->srcu_gp_seq_needed)); - spin_lock_rcu_node(sdp); /* Interrupts already disabled. */ - rcu_segcblist_advance(&sdp->srcu_cblist, - rcu_seq_current(&ssp->srcu_sup->srcu_gp_seq)); - WARN_ON_ONCE(!rcu_segcblist_segempty(&sdp->srcu_cblist, RCU_NEXT_TAIL)); - spin_unlock_rcu_node(sdp); /* Interrupts remain disabled. */ WRITE_ONCE(ssp->srcu_sup->srcu_gp_start, jiffies); WRITE_ONCE(ssp->srcu_sup->srcu_n_exp_nodelay, 0); smp_mb(); /* Order prior store to ->srcu_gp_seq_needed vs. GP start. */ From ede93531d7af5d0eed95ae3e4647146d2b3c2fa8 Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Wed, 4 Oct 2023 01:29:02 +0200 Subject: [PATCH 230/515] srcu: No need to advance/accelerate if no callback enqueued While in grace period start, there is nothing to accelerate and therefore no need to advance the callbacks either if no callback is to be enqueued. Spare these needless operations in this case. Signed-off-by: Frederic Weisbecker Signed-off-by: Paul E. McKenney --- kernel/rcu/srcutree.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c index e9356a10362612..2bfc8ed1eed286 100644 --- a/kernel/rcu/srcutree.c +++ b/kernel/rcu/srcutree.c @@ -1261,9 +1261,11 @@ static unsigned long srcu_gp_start_if_needed(struct srcu_struct *ssp, * period (gp_num = X + 8). So acceleration fails. */ s = rcu_seq_snap(&ssp->srcu_sup->srcu_gp_seq); - rcu_segcblist_advance(&sdp->srcu_cblist, - rcu_seq_current(&ssp->srcu_sup->srcu_gp_seq)); - WARN_ON_ONCE(!rcu_segcblist_accelerate(&sdp->srcu_cblist, s) && rhp); + if (rhp) { + rcu_segcblist_advance(&sdp->srcu_cblist, + rcu_seq_current(&ssp->srcu_sup->srcu_gp_seq)); + WARN_ON_ONCE(!rcu_segcblist_accelerate(&sdp->srcu_cblist, s)); + } if (ULONG_CMP_LT(sdp->srcu_gp_seq_needed, s)) { sdp->srcu_gp_seq_needed = s; needgp = true; From 5df10099418f139bbf2f4e0d7b9a8727e76274ec Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Wed, 4 Oct 2023 01:29:03 +0200 Subject: [PATCH 231/515] srcu: Explain why callbacks invocations can't run concurrently If an SRCU barrier is queued while callbacks are running and a new callbacks invocator for the same sdp were to run concurrently, the RCU barrier might execute too early. As this requirement is non-obvious, make sure to keep a record. Signed-off-by: Frederic Weisbecker Signed-off-by: Paul E. McKenney --- kernel/rcu/srcutree.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c index 2bfc8ed1eed286..0351a4e83529e3 100644 --- a/kernel/rcu/srcutree.c +++ b/kernel/rcu/srcutree.c @@ -1715,6 +1715,11 @@ static void srcu_invoke_callbacks(struct work_struct *work) WARN_ON_ONCE(!rcu_segcblist_segempty(&sdp->srcu_cblist, RCU_NEXT_TAIL)); rcu_segcblist_advance(&sdp->srcu_cblist, rcu_seq_current(&ssp->srcu_sup->srcu_gp_seq)); + /* + * Although this function is theoretically re-entrant, concurrent + * callbacks invocation is disallowed to avoid executing an SRCU barrier + * too early. + */ if (sdp->srcu_cblist_invoking || !rcu_segcblist_ready_cbs(&sdp->srcu_cblist)) { spin_unlock_irq_rcu_node(sdp); @@ -1745,6 +1750,7 @@ static void srcu_invoke_callbacks(struct work_struct *work) sdp->srcu_cblist_invoking = false; more = rcu_segcblist_ready_cbs(&sdp->srcu_cblist); spin_unlock_irq_rcu_node(sdp); + /* An SRCU barrier or callbacks from previous nesting work pending */ if (more) srcu_schedule_cbs_sdp(sdp, 0); } From 845333e5f0f3ac6a24d26a8341271d921a0d5e86 Mon Sep 17 00:00:00 2001 From: Bagas Sanjaya Date: Tue, 17 Oct 2023 16:56:08 +0700 Subject: [PATCH 232/515] Documentation: ABI: coresight-tpdm: Fix Bit[3] description indentation Stephen Rothwell reported htmldocs warnings when merging coresight tree: Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm:48: ERROR: Unexpected indentation. Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm:48: WARNING: Block quote ends without a blank line; unexpected unindent. Fix indentation alignment for Bit[3] list entry in dsb_mode description to silence above warnings. Fixes: 535d80d3c10fff ("coresight-tpdm: Add node to set dsb programming mode") Reported-by: Stephen Rothwell Closes: https://lore.kernel.org/linux-next/20231017143324.75387a21@canb.auug.org.au/ Signed-off-by: Bagas Sanjaya Link: https://lore.kernel.org/r/20231017095608.136277-1-bagasdotme@gmail.com Signed-off-by: Suzuki K Poulose --- Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm index f07218e788439d..4dd49b159543b6 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm @@ -54,8 +54,8 @@ Description: Accepts the value needs to be greater than 0. What data bits do is listed below. Bit[0:1] : Test mode control bit for choosing the inputs. - Bit[3] : Set to 0 for low performance mode. - Set to 1 for high performance mode. + Bit[3] : Set to 0 for low performance mode. Set to 1 for high + performance mode. Bit[4:8] : Select byte lane for high performance mode. What: /sys/bus/coresight/devices//dsb_edge/ctrl_idx From 4669551e797a2685c44a4151996d9c992e44a3f4 Mon Sep 17 00:00:00 2001 From: Yicong Yang Date: Tue, 10 Oct 2023 16:47:27 +0800 Subject: [PATCH 233/515] hwtracing: hisi_ptt: Disable interrupt after trace end On trace end we disable the hardware but leave the interrupt unmasked. Mask the interrupt to make the process reverse to the start. No actual issue since hardware should send no interrupt after disabled. Signed-off-by: Yicong Yang Acked-by: Jonathan Cameron Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20231010084731.30450-2-yangyicong@huawei.com --- drivers/hwtracing/ptt/hisi_ptt.c | 4 ++++ drivers/hwtracing/ptt/hisi_ptt.h | 1 + 2 files changed, 5 insertions(+) diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c index 49ea1b0f748903..428cca54217e74 100644 --- a/drivers/hwtracing/ptt/hisi_ptt.c +++ b/drivers/hwtracing/ptt/hisi_ptt.c @@ -183,6 +183,10 @@ static void hisi_ptt_wait_dma_reset_done(struct hisi_ptt *hisi_ptt) static void hisi_ptt_trace_end(struct hisi_ptt *hisi_ptt) { writel(0, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); + + /* Mask the interrupt on the end */ + writel(HISI_PTT_TRACE_INT_MASK_ALL, hisi_ptt->iobase + HISI_PTT_TRACE_INT_MASK); + hisi_ptt->trace_ctrl.started = false; } diff --git a/drivers/hwtracing/ptt/hisi_ptt.h b/drivers/hwtracing/ptt/hisi_ptt.h index e17f045d7e7259..46030aa880811d 100644 --- a/drivers/hwtracing/ptt/hisi_ptt.h +++ b/drivers/hwtracing/ptt/hisi_ptt.h @@ -47,6 +47,7 @@ #define HISI_PTT_TRACE_INT_STAT 0x0890 #define HISI_PTT_TRACE_INT_STAT_MASK GENMASK(3, 0) #define HISI_PTT_TRACE_INT_MASK 0x0894 +#define HISI_PTT_TRACE_INT_MASK_ALL GENMASK(3, 0) #define HISI_PTT_TUNING_INT_STAT 0x0898 #define HISI_PTT_TUNING_INT_STAT_MASK BIT(0) #define HISI_PTT_TRACE_WR_STS 0x08a0 From e8b7d8718c512c4d6ee5c4ab23ed9a80b9420735 Mon Sep 17 00:00:00 2001 From: Yicong Yang Date: Tue, 10 Oct 2023 16:47:28 +0800 Subject: [PATCH 234/515] hwtracing: hisi_ptt: Handle the interrupt in hardirq context Handle the trace interrupt in the hardirq context, make sure the irq core won't threaded it by declaring IRQF_NO_THREAD and userspace won't balance it by declaring IRQF_NOBALANCING. Otherwise we may violate the synchronization requirements of the perf core, referenced to the change of arm-ccn PMU commit 0811ef7e2f54 ("bus: arm-ccn: fix PMU interrupt flags"). In the interrupt handler we mainly doing 2 things: - Copy the data from the local DMA buffer to the AUX buffer - Commit the data in the AUX buffer Signed-off-by: Yicong Yang Acked-by: Jonathan Cameron [ Fixed commit description to suppress checkpatch warning ] Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20231010084731.30450-3-yangyicong@huawei.com --- drivers/hwtracing/ptt/hisi_ptt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c index 428cca54217e74..3041238a6e540f 100644 --- a/drivers/hwtracing/ptt/hisi_ptt.c +++ b/drivers/hwtracing/ptt/hisi_ptt.c @@ -346,9 +346,9 @@ static int hisi_ptt_register_irq(struct hisi_ptt *hisi_ptt) return ret; hisi_ptt->trace_irq = pci_irq_vector(pdev, HISI_PTT_TRACE_DMA_IRQ); - ret = devm_request_threaded_irq(&pdev->dev, hisi_ptt->trace_irq, - NULL, hisi_ptt_isr, 0, - DRV_NAME, hisi_ptt); + ret = devm_request_irq(&pdev->dev, hisi_ptt->trace_irq, hisi_ptt_isr, + IRQF_NOBALANCING | IRQF_NO_THREAD, DRV_NAME, + hisi_ptt); if (ret) { pci_err(pdev, "failed to request irq %d, ret = %d\n", hisi_ptt->trace_irq, ret); From 7a527d4d9273bdd4f355b728fd46d703f33c1d1d Mon Sep 17 00:00:00 2001 From: Yicong Yang Date: Tue, 10 Oct 2023 16:47:29 +0800 Subject: [PATCH 235/515] hwtracing: hisi_ptt: Optimize the trace data committing In the current implementation, there're 4*4MiB trace buffer and hardware will fill the buffer one by one. The driver will get notified if one buffer is full and then copy data to the AUX buffer. If there's no enough room for the next trace buffer, we'll commit the AUX buffer to the perf core and try to apply a new one. In a typical configuration the AUX buffer will be 16MiB, so we'll commit the data after the whole AUX buffer is occupied. Then the driver cannot apply a new AUX buffer immediately until the committed data is consumed by userspace and then there's room in the AUX buffer again. This patch tries to optimize this by commit the data after one single trace buffer is filled. Since there's still room in the AUX buffer, driver can apply a new one without failure and don't need to wait for the userspace to consume the data. Signed-off-by: Yicong Yang Acked-by: Jonathan Cameron Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20231010084731.30450-4-yangyicong@huawei.com --- drivers/hwtracing/ptt/hisi_ptt.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c index 3041238a6e540f..4f355df8da2312 100644 --- a/drivers/hwtracing/ptt/hisi_ptt.c +++ b/drivers/hwtracing/ptt/hisi_ptt.c @@ -274,15 +274,14 @@ static int hisi_ptt_update_aux(struct hisi_ptt *hisi_ptt, int index, bool stop) buf->pos += size; /* - * Just commit the traced data if we're going to stop. Otherwise if the - * resident AUX buffer cannot contain the data of next trace buffer, - * apply a new one. + * Always commit the data to the AUX buffer in time to make sure + * userspace got enough time to consume the data. + * + * If we're not going to stop, apply a new one and check whether + * there's enough room for the next trace. */ - if (stop) { - perf_aux_output_end(handle, buf->pos); - } else if (buf->length - buf->pos < HISI_PTT_TRACE_BUF_SIZE) { - perf_aux_output_end(handle, buf->pos); - + perf_aux_output_end(handle, size); + if (!stop) { buf = perf_aux_output_begin(handle, event); if (!buf) return -EINVAL; From 7d52e2cfef91fc504b4ea7df88fb680fb0118cee Mon Sep 17 00:00:00 2001 From: Yicong Yang Date: Tue, 10 Oct 2023 16:47:30 +0800 Subject: [PATCH 236/515] hwtracing: hisi_ptt: Don't try to attach a task PTT is an uncore PMU and shouldn't be attached to any task. Block the usage in pmu::event_init(). Signed-off-by: Yicong Yang Acked-by: Jonathan Cameron Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20231010084731.30450-5-yangyicong@huawei.com --- drivers/hwtracing/ptt/hisi_ptt.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c index 4f355df8da2312..62a444f5228e38 100644 --- a/drivers/hwtracing/ptt/hisi_ptt.c +++ b/drivers/hwtracing/ptt/hisi_ptt.c @@ -1003,6 +1003,9 @@ static int hisi_ptt_pmu_event_init(struct perf_event *event) return -EOPNOTSUPP; } + if (event->attach_state & PERF_ATTACH_TASK) + return -EOPNOTSUPP; + if (event->attr.type != hisi_ptt->hisi_ptt_pmu.type) return -ENOENT; From 4708eada8bd63931e18f6f7b9755cb38053b9435 Mon Sep 17 00:00:00 2001 From: Junhao He Date: Tue, 10 Oct 2023 16:47:31 +0800 Subject: [PATCH 237/515] hwtracing: hisi_ptt: Add dummy callback pmu::read() When start trace with perf option "-C $cpu" and immediately stop it with SIGTERM or others, the perf core will invoke pmu::read() while the driver doesn't implement it. Add a dummy pmu::read() to avoid any issues. Fixes: ff0de066b463 ("hwtracing: hisi_ptt: Add trace function support for HiSilicon PCIe Tune and Trace device") Signed-off-by: Junhao He Signed-off-by: Yicong Yang Acked-by: Jonathan Cameron Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20231010084731.30450-6-yangyicong@huawei.com --- drivers/hwtracing/ptt/hisi_ptt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c index 62a444f5228e38..c1b5fd2b89741d 100644 --- a/drivers/hwtracing/ptt/hisi_ptt.c +++ b/drivers/hwtracing/ptt/hisi_ptt.c @@ -1184,6 +1184,10 @@ static void hisi_ptt_pmu_del(struct perf_event *event, int flags) hisi_ptt_pmu_stop(event, PERF_EF_UPDATE); } +static void hisi_ptt_pmu_read(struct perf_event *event) +{ +} + static void hisi_ptt_remove_cpuhp_instance(void *hotplug_node) { cpuhp_state_remove_instance_nocalls(hisi_ptt_pmu_online, hotplug_node); @@ -1227,6 +1231,7 @@ static int hisi_ptt_register_pmu(struct hisi_ptt *hisi_ptt) .stop = hisi_ptt_pmu_stop, .add = hisi_ptt_pmu_add, .del = hisi_ptt_pmu_del, + .read = hisi_ptt_pmu_read, }; reg = readl(hisi_ptt->iobase + HISI_PTT_LOCATION); From 08e489759306a80cc2265d9334468bf5fc1cc7a2 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Tue, 17 Oct 2023 23:54:54 +0200 Subject: [PATCH 238/515] soc: document merges Signed-off-by: Arnd Bergmann --- arch/arm/arm-soc-for-next-contents.txt | 127 +++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 arch/arm/arm-soc-for-next-contents.txt diff --git a/arch/arm/arm-soc-for-next-contents.txt b/arch/arm/arm-soc-for-next-contents.txt new file mode 100644 index 00000000000000..ab7fa72ad9b988 --- /dev/null +++ b/arch/arm/arm-soc-for-next-contents.txt @@ -0,0 +1,127 @@ +soc/arm + patch + MAINTAINERS: Add entry for AMD PENSANDO + arm64: Add config for AMD Pensando SoC platforms + +soc/dt + patch + dt-bindings: arm: add AMD Pensando boards + arm64: dts: Add AMD Pensando Elba SoC support + ux500/dt + git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik tags/ux500-dts-for-armsoc + renesas/dt-bindings + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dt-bindings-for-v6.7-tag1 + renesas/dt + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dts-for-v6.7-tag1 + dts/cleanup-arm64 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt tags/dt64-cleanup-6.7 + dts/cleanup-arm32 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt tags/dt-cleanup-6.7 + samsung/dt64 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt64-6.7 + exynos/dt +samsung/dt + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt-6.7 + ixp4xx/dt + git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik tags/ixp4xx-for-soc-v6.7 + at91/dt + https://git.kernel.org/pub/scm/linux/kernel/git/at91/linux tags/at91-dt-6.7 + omap/dt + git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap tags/omap-for-v6.7/dt-signed + sti/dt + git://git.kernel.org/pub/scm/linux/kernel/git/pchotard/sti tags/sti-dt-for-v6.7-round1 + renesas/dt-bindings-2 + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dt-bindings-for-v6.7-tag2 + renesas/dt-2 + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dts-for-v6.7-tag2 + tegra/dt-bindings + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-dt-bindings + tegra/dt + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-arm-dt + tegra/dt64 + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-arm64-dt + sunxi/dt + https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux tags/sunxi-dt-for-6.7-1 + riscv/dt + https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-dt-for-v6.6-final + imx/dt-bindings + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-bindings-6.7 + imx/dt + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-dt-6.7 + imx/dt64 + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-dt64-6.7 + qcom/dt64 + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-arm64-for-6.7 + qcom/dt + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-dts-for-6.7 + aspeed/dt + git://git.kernel.org/pub/scm/linux/kernel/git/joel/bmc tags/aspeed-6.7-devicetree + amlogic/dt64 + https://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux tags/amlogic-arm64-dt-for-v6.7 + stm32/dt + git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32 tags/stm32-dt-for-v6.7-1 + +soc/drivers + patch + soc: samsung: exynos-chipid: Convert to platform remove callback returning void + drivers/soc-cleanup + https://git.pengutronix.de/git/ukl/linux tags/platform-remove-void-soc-for-6.7-rc + renesas/drivers + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-drivers-for-v6.7-tag1 + mediatek/drivers + https://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux tags/v6.6-next-soc + vexpress/drivers + git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux tags/vexpress-update-6.7 + firmware/scmi + git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux tags/scmi-updates-6.7 + firmware/ffa + git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux tags/ffa-updates-6.7 + tegra/soc + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-soc + tegra/firmware + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-firmware + tegra/memory + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-memory + aspeed/soc-driver + git://git.kernel.org/pub/scm/linux/kernel/git/joel/bmc tags/aspeed-6.7-soc + drivers/memory + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl tags/memory-controller-drv-6.7 + meson/firmware + https://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux tags/amlogic-drivers-for-v6.7 + riscv/drivers + https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-soc-for-v6.7 + +soc/defconfig + patch + ARM: defconfig: cleanup orphaned CONFIGs + renesas/defconfig + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-arm-defconfig-for-v6.7-tag1 + renesas/defconfig-2 + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-arm-defconfig-for-v6.7-tag2 + imx/defconfig + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-defconfig-6.7 + qcom/defconfig + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-arm64-defconfig-for-6.7 + aspeed/defconfig + git://git.kernel.org/pub/scm/linux/kernel/git/joel/bmc tags/aspeed-6.7-defconfig + samsung/defconfig + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-defconfig-6.7 + amlogic/defconfig + https://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux tags/amlogic-defconfig-for-v6.7 + +soc/late + +arm/fixes + (1531309aa2092a96c092fa662863ffa53da3ba93) + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-fixes-for-v6.6-tag2 + (1558b1a8dd388f5fcc3abc1e24de854a295044c3) + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-fixes-6.6-2 + qcom/dt-fixes + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-arm64-fixes-for-6.6 + riscv/dt + https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-dt-for-v6.6-final + patch + riscv: dts: thead: set dma-noncoherent to soc bus + (8cd79b729e746cb167f1563d015a93fc0a079899) + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.6-rockchip-dtsfixes1 + From 07d46cb22109c407b1cc0655984ed93aa85cd54f Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Sat, 14 Oct 2023 19:54:35 +0900 Subject: [PATCH 239/515] kbuild: unify vdso_install rules Currently, there is no standard implementation for vdso_install, leading to various issues: 1. Code duplication Many architectures duplicate similar code just for copying files to the install destination. Some architectures (arm, sparc, x86) create build-id symlinks, introducing more code duplication. 2. Unintended updates of in-tree build artifacts The vdso_install rule depends on the vdso files to install. It may update in-tree build artifacts. This can be problematic, as explained in commit 19514fc665ff ("arm, kbuild: make "make install" not depend on vmlinux"). 3. Broken code in some architectures Makefile code is often copied from one architecture to another without proper adaptation. 'make vdso_install' for parisc does not work. 'make vdso_install' for s390 installs vdso64, but not vdso32. To address these problems, this commit introduces a generic vdso_install rule. Architectures that support vdso_install need to define vdso-install-y in arch/*/Makefile. vdso-install-y lists the files to install. For example, arch/x86/Makefile looks like this: vdso-install-$(CONFIG_X86_64) += arch/x86/entry/vdso/vdso64.so.dbg vdso-install-$(CONFIG_X86_X32_ABI) += arch/x86/entry/vdso/vdsox32.so.dbg vdso-install-$(CONFIG_X86_32) += arch/x86/entry/vdso/vdso32.so.dbg vdso-install-$(CONFIG_IA32_EMULATION) += arch/x86/entry/vdso/vdso32.so.dbg These files will be installed to $(MODLIB)/vdso/ with the .dbg suffix, if exists, stripped away. vdso-install-y can optionally take the second field after the colon separator. This is needed because some architectures install a vdso file as a different base name. The following is a snippet from arch/arm64/Makefile. vdso-install-$(CONFIG_COMPAT_VDSO) += arch/arm64/kernel/vdso32/vdso.so.dbg:vdso32.so This will rename vdso.so.dbg to vdso32.so during installation. If such architectures change their implementation so that the base names match, this workaround will go away. Signed-off-by: Masahiro Yamada Acked-by: Sven Schnelle # s390 Reviewed-by: Nicolas Schier Reviewed-by: Guo Ren Acked-by: Helge Deller # parisc --- Makefile | 9 ++++++ arch/arm/Makefile | 7 +--- arch/arm/vdso/Makefile | 25 -------------- arch/arm64/Makefile | 9 ++---- arch/arm64/kernel/vdso/Makefile | 10 ------ arch/arm64/kernel/vdso32/Makefile | 10 ------ arch/loongarch/Makefile | 4 +-- arch/loongarch/vdso/Makefile | 10 ------ arch/parisc/Makefile | 8 ++--- arch/riscv/Makefile | 9 ++---- arch/riscv/kernel/compat_vdso/Makefile | 10 ------ arch/riscv/kernel/vdso/Makefile | 10 ------ arch/s390/Makefile | 6 ++-- arch/s390/kernel/vdso32/Makefile | 10 ------ arch/s390/kernel/vdso64/Makefile | 10 ------ arch/sparc/Makefile | 5 ++- arch/sparc/vdso/Makefile | 27 ---------------- arch/x86/Makefile | 7 ++-- arch/x86/entry/vdso/Makefile | 27 ---------------- scripts/Makefile.vdsoinst | 45 ++++++++++++++++++++++++++ 20 files changed, 73 insertions(+), 185 deletions(-) create mode 100644 scripts/Makefile.vdsoinst diff --git a/Makefile b/Makefile index 3de6dd959bd19d..1ae5d5180f207b 100644 --- a/Makefile +++ b/Makefile @@ -1317,6 +1317,14 @@ scripts_unifdef: scripts_basic quiet_cmd_install = INSTALL $(INSTALL_PATH) cmd_install = unset sub_make_done; $(srctree)/scripts/install.sh +# --------------------------------------------------------------------------- +# vDSO install + +PHONY += vdso_install +vdso_install: export INSTALL_FILES = $(vdso-install-y) +vdso_install: + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vdsoinst + # --------------------------------------------------------------------------- # Tools @@ -1560,6 +1568,7 @@ help: @echo '* vmlinux - Build the bare kernel' @echo '* modules - Build all modules' @echo ' modules_install - Install all modules to INSTALL_MOD_PATH (default: /)' + @echo ' vdso_install - Install unstripped vdso to INSTALL_MOD_PATH (default: /)' @echo ' dir/ - Build all files in dir and below' @echo ' dir/file.[ois] - Build specified target only' @echo ' dir/file.ll - Build the LLVM assembly file' diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 547e5856eaa0d3..5ba42f69f8ce0c 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -304,11 +304,7 @@ $(INSTALL_TARGETS): KBUILD_IMAGE = $(boot)/$(patsubst %install,%Image,$@) $(INSTALL_TARGETS): $(call cmd,install) -PHONY += vdso_install -vdso_install: -ifeq ($(CONFIG_VDSO),y) - $(Q)$(MAKE) $(build)=arch/arm/vdso $@ -endif +vdso-install-$(CONFIG_VDSO) += arch/arm/vdso/vdso.so.dbg # My testing targets (bypasses dependencies) bp:; $(Q)$(MAKE) $(build)=$(boot) $(boot)/bootpImage @@ -331,7 +327,6 @@ define archhelp echo ' Install using (your) ~/bin/$(INSTALLKERNEL) or' echo ' (distribution) /sbin/$(INSTALLKERNEL) or' echo ' install to $$(INSTALL_PATH) and run lilo' - echo ' vdso_install - Install unstripped vdso.so to $$(INSTALL_MOD_PATH)/vdso' echo echo ' multi_v7_lpae_defconfig - multi_v7_defconfig with CONFIG_ARM_LPAE enabled' endef diff --git a/arch/arm/vdso/Makefile b/arch/arm/vdso/Makefile index 515ca33b854c1a..d761bd2e2f4072 100644 --- a/arch/arm/vdso/Makefile +++ b/arch/arm/vdso/Makefile @@ -63,28 +63,3 @@ quiet_cmd_vdsold_and_vdso_check = LD $@ quiet_cmd_vdsomunge = MUNGE $@ cmd_vdsomunge = $(objtree)/$(obj)/vdsomunge $< $@ - -# -# Install the unstripped copy of vdso.so.dbg. If our toolchain -# supports build-id, install .build-id links as well. -# -# Cribbed from arch/x86/vdso/Makefile. -# -quiet_cmd_vdso_install = INSTALL $< -define cmd_vdso_install - cp $< "$(MODLIB)/vdso/vdso.so"; \ - if readelf -n $< | grep -q 'Build ID'; then \ - buildid=`readelf -n $< |grep 'Build ID' |sed -e 's/^.*Build ID: \(.*\)$$/\1/'`; \ - first=`echo $$buildid | cut -b-2`; \ - last=`echo $$buildid | cut -b3-`; \ - mkdir -p "$(MODLIB)/vdso/.build-id/$$first"; \ - ln -sf "../../vdso.so" "$(MODLIB)/vdso/.build-id/$$first/$$last.debug"; \ - fi -endef - -$(MODLIB)/vdso: FORCE - @mkdir -p $(MODLIB)/vdso - -PHONY += vdso_install -vdso_install: $(obj)/vdso.so.dbg $(MODLIB)/vdso - $(call cmd,vdso_install) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 2d49aea0ff67a8..4bd85cc0d32bfa 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -169,12 +169,6 @@ install: KBUILD_IMAGE := $(boot)/Image install zinstall: $(call cmd,install) -PHONY += vdso_install -vdso_install: - $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso $@ - $(if $(CONFIG_COMPAT_VDSO), \ - $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso32 $@) - archprepare: $(Q)$(MAKE) $(build)=arch/arm64/tools kapi ifeq ($(CONFIG_ARM64_ERRATUM_843419),y) @@ -205,6 +199,9 @@ ifdef CONFIG_COMPAT_VDSO endif endif +vdso-install-y += arch/arm64/kernel/vdso/vdso.so.dbg +vdso-install-$(CONFIG_COMPAT_VDSO) += arch/arm64/kernel/vdso32/vdso.so.dbg:vdso32.so + include $(srctree)/scripts/Makefile.defconf PHONY += virtconfig diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile index fe7a53c6781f15..8818287f10955c 100644 --- a/arch/arm64/kernel/vdso/Makefile +++ b/arch/arm64/kernel/vdso/Makefile @@ -78,13 +78,3 @@ include/generated/vdso-offsets.h: $(obj)/vdso.so.dbg FORCE # Actual build commands quiet_cmd_vdsold_and_vdso_check = LD $@ cmd_vdsold_and_vdso_check = $(cmd_ld); $(cmd_vdso_check) - -# Install commands for the unstripped file -quiet_cmd_vdso_install = INSTALL $@ - cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ - -vdso.so: $(obj)/vdso.so.dbg - @mkdir -p $(MODLIB)/vdso - $(call cmd,vdso_install) - -vdso_install: vdso.so diff --git a/arch/arm64/kernel/vdso32/Makefile b/arch/arm64/kernel/vdso32/Makefile index 2f73e5bca213f8..1f911a76c5af39 100644 --- a/arch/arm64/kernel/vdso32/Makefile +++ b/arch/arm64/kernel/vdso32/Makefile @@ -172,13 +172,3 @@ gen-vdsosym := $(srctree)/$(src)/../vdso/gen_vdso_offsets.sh quiet_cmd_vdsosym = VDSOSYM $@ # The AArch64 nm should be able to read an AArch32 binary cmd_vdsosym = $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@ - -# Install commands for the unstripped file -quiet_cmd_vdso_install = INSTALL32 $@ - cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/vdso32.so - -vdso.so: $(obj)/vdso.so.dbg - @mkdir -p $(MODLIB)/vdso - $(call cmd,vdso_install) - -vdso_install: vdso.so diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile index fb0fada43197e4..b86f2ff3165928 100644 --- a/arch/loongarch/Makefile +++ b/arch/loongarch/Makefile @@ -136,9 +136,7 @@ vdso_prepare: prepare0 $(Q)$(MAKE) $(build)=arch/loongarch/vdso include/generated/vdso-offsets.h endif -PHONY += vdso_install -vdso_install: - $(Q)$(MAKE) $(build)=arch/loongarch/vdso $@ +vdso-install-y += arch/loongarch/vdso/vdso.so.dbg all: $(notdir $(KBUILD_IMAGE)) diff --git a/arch/loongarch/vdso/Makefile b/arch/loongarch/vdso/Makefile index 5c97d146332821..c74c9921304f22 100644 --- a/arch/loongarch/vdso/Makefile +++ b/arch/loongarch/vdso/Makefile @@ -83,13 +83,3 @@ $(obj)/vdso.so: $(obj)/vdso.so.dbg FORCE obj-y += vdso.o $(obj)/vdso.o : $(obj)/vdso.so - -# install commands for the unstripped file -quiet_cmd_vdso_install = INSTALL $@ - cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ - -vdso.so: $(obj)/vdso.so.dbg - @mkdir -p $(MODLIB)/vdso - $(call cmd,vdso_install) - -vdso_install: vdso.so diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile index 968ebe17494c5f..920db57b6b4cc8 100644 --- a/arch/parisc/Makefile +++ b/arch/parisc/Makefile @@ -177,12 +177,8 @@ vdso_prepare: prepare0 $(Q)$(MAKE) $(build)=arch/parisc/kernel/vdso32 include/generated/vdso32-offsets.h endif -PHONY += vdso_install - -vdso_install: - $(Q)$(MAKE) $(build)=arch/parisc/kernel/vdso $@ - $(if $(CONFIG_COMPAT_VDSO), \ - $(Q)$(MAKE) $(build)=arch/parisc/kernel/vdso32 $@) +vdso-install-y += arch/parisc/kernel/vdso32/vdso32.so +vdso-install-$(CONFIG_64BIT) += arch/parisc/kernel/vdso64/vdso64.so install: KBUILD_IMAGE := vmlinux zinstall: KBUILD_IMAGE := vmlinuz diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile index 1329e060c5482d..18a47b4d679581 100644 --- a/arch/riscv/Makefile +++ b/arch/riscv/Makefile @@ -131,12 +131,6 @@ endif libs-y += arch/riscv/lib/ libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a -PHONY += vdso_install -vdso_install: - $(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@ - $(if $(CONFIG_COMPAT),$(Q)$(MAKE) \ - $(build)=arch/riscv/kernel/compat_vdso compat_$@) - ifeq ($(KBUILD_EXTMOD),) ifeq ($(CONFIG_MMU),y) prepare: vdso_prepare @@ -148,6 +142,9 @@ vdso_prepare: prepare0 endif endif +vdso-install-y += arch/riscv/kernel/vdso/vdso.so.dbg +vdso-install-$(CONFIG_COMPAT) += arch/riscv/kernel/compat_vdso/compat_vdso.so.dbg:../compat_vdso/compat_vdso.so + ifneq ($(CONFIG_XIP_KERNEL),y) ifeq ($(CONFIG_RISCV_M_MODE)$(CONFIG_ARCH_CANAAN),yy) KBUILD_IMAGE := $(boot)/loader.bin diff --git a/arch/riscv/kernel/compat_vdso/Makefile b/arch/riscv/kernel/compat_vdso/Makefile index b86e5e2c3aea94..62fa393b2eb2ea 100644 --- a/arch/riscv/kernel/compat_vdso/Makefile +++ b/arch/riscv/kernel/compat_vdso/Makefile @@ -76,13 +76,3 @@ quiet_cmd_compat_vdsold = VDSOLD $@ # actual build commands quiet_cmd_compat_vdsoas = VDSOAS $@ cmd_compat_vdsoas = $(COMPAT_CC) $(a_flags) $(COMPAT_CC_FLAGS) -c -o $@ $< - -# install commands for the unstripped file -quiet_cmd_compat_vdso_install = INSTALL $@ - cmd_compat_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/compat_vdso/$@ - -compat_vdso.so: $(obj)/compat_vdso.so.dbg - @mkdir -p $(MODLIB)/compat_vdso - $(call cmd,compat_vdso_install) - -compat_vdso_install: compat_vdso.so diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile index 6b1dba11bf6dcd..e8aa7c38000755 100644 --- a/arch/riscv/kernel/vdso/Makefile +++ b/arch/riscv/kernel/vdso/Makefile @@ -73,13 +73,3 @@ quiet_cmd_vdsold = VDSOLD $@ cmd_vdsold = $(LD) $(ld_flags) -T $(filter-out FORCE,$^) -o $@.tmp && \ $(OBJCOPY) $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ && \ rm $@.tmp - -# install commands for the unstripped file -quiet_cmd_vdso_install = INSTALL $@ - cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ - -vdso.so: $(obj)/vdso.so.dbg - @mkdir -p $(MODLIB)/vdso - $(call cmd,vdso_install) - -vdso_install: vdso.so diff --git a/arch/s390/Makefile b/arch/s390/Makefile index a53a36ee0731bb..73873e4516866a 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile @@ -138,9 +138,6 @@ bzImage: vmlinux zfcpdump: $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ -vdso_install: - $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@ - archheaders: $(Q)$(MAKE) $(build)=$(syscalls) uapi @@ -160,6 +157,9 @@ vdso_prepare: prepare0 $(if $(CONFIG_COMPAT),$(Q)$(MAKE) \ $(build)=arch/s390/kernel/vdso32 include/generated/vdso32-offsets.h) +vdso-install-y += arch/s390/kernel/vdso64/vdso64.so.dbg +vdso-install-$(CONFIG_COMPAT) += arch/s390/kernel/vdso32/vdso32.so.dbg + ifdef CONFIG_EXPOLINE_EXTERN modules_prepare: expoline_prepare expoline_prepare: scripts diff --git a/arch/s390/kernel/vdso32/Makefile b/arch/s390/kernel/vdso32/Makefile index 23e868b79a6c99..caec7db6f96684 100644 --- a/arch/s390/kernel/vdso32/Makefile +++ b/arch/s390/kernel/vdso32/Makefile @@ -61,16 +61,6 @@ quiet_cmd_vdso32as = VDSO32A $@ quiet_cmd_vdso32cc = VDSO32C $@ cmd_vdso32cc = $(CC) $(c_flags) -c -o $@ $< -# install commands for the unstripped file -quiet_cmd_vdso_install = INSTALL $@ - cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ - -vdso32.so: $(obj)/vdso32.so.dbg - @mkdir -p $(MODLIB)/vdso - $(call cmd,vdso_install) - -vdso_install: vdso32.so - # Generate VDSO offsets using helper script gen-vdsosym := $(srctree)/$(src)/gen_vdso_offsets.sh quiet_cmd_vdsosym = VDSOSYM $@ diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile index fc1c6ff8178f59..e3c9085f8fa72b 100644 --- a/arch/s390/kernel/vdso64/Makefile +++ b/arch/s390/kernel/vdso64/Makefile @@ -70,16 +70,6 @@ quiet_cmd_vdso64as = VDSO64A $@ quiet_cmd_vdso64cc = VDSO64C $@ cmd_vdso64cc = $(CC) $(c_flags) -c -o $@ $< -# install commands for the unstripped file -quiet_cmd_vdso_install = INSTALL $@ - cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ - -vdso64.so: $(obj)/vdso64.so.dbg - @mkdir -p $(MODLIB)/vdso - $(call cmd,vdso_install) - -vdso_install: vdso64.so - # Generate VDSO offsets using helper script gen-vdsosym := $(srctree)/$(src)/gen_vdso_offsets.sh quiet_cmd_vdsosym = VDSOSYM $@ diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile index 7417345c6639a3..5f60359361312e 100644 --- a/arch/sparc/Makefile +++ b/arch/sparc/Makefile @@ -76,9 +76,8 @@ install: archheaders: $(Q)$(MAKE) $(build)=arch/sparc/kernel/syscalls all -PHONY += vdso_install -vdso_install: - $(Q)$(MAKE) $(build)=arch/sparc/vdso $@ +vdso-install-$(CONFIG_SPARC64) += arch/sparc/vdso/vdso64.so.dbg +vdso-install-$(CONFIG_COMPAT) += arch/sparc/vdso/vdso32.so.dbg # This is the image used for packaging KBUILD_IMAGE := $(boot)/zImage diff --git a/arch/sparc/vdso/Makefile b/arch/sparc/vdso/Makefile index 77d7b9032158c7..d08c3a0443f3a7 100644 --- a/arch/sparc/vdso/Makefile +++ b/arch/sparc/vdso/Makefile @@ -116,30 +116,3 @@ quiet_cmd_vdso = VDSO $@ VDSO_LDFLAGS = -shared --hash-style=both --build-id=sha1 -Bsymbolic GCOV_PROFILE := n - -# -# Install the unstripped copies of vdso*.so. If our toolchain supports -# build-id, install .build-id links as well. -# -quiet_cmd_vdso_install = INSTALL $(@:install_%=%) -define cmd_vdso_install - cp $< "$(MODLIB)/vdso/$(@:install_%=%)"; \ - if readelf -n $< |grep -q 'Build ID'; then \ - buildid=`readelf -n $< |grep 'Build ID' |sed -e 's/^.*Build ID: \(.*\)$$/\1/'`; \ - first=`echo $$buildid | cut -b-2`; \ - last=`echo $$buildid | cut -b3-`; \ - mkdir -p "$(MODLIB)/vdso/.build-id/$$first"; \ - ln -sf "../../$(@:install_%=%)" "$(MODLIB)/vdso/.build-id/$$first/$$last.debug"; \ - fi -endef - -vdso_img_insttargets := $(vdso_img_sodbg:%.dbg=install_%) - -$(MODLIB)/vdso: FORCE - @mkdir -p $(MODLIB)/vdso - -$(vdso_img_insttargets): install_%: $(obj)/%.dbg $(MODLIB)/vdso FORCE - $(call cmd,vdso_install) - -PHONY += vdso_install $(vdso_img_insttargets) -vdso_install: $(vdso_img_insttargets) FORCE diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 5bfe5caaa444b3..3ff53a2d4ff084 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -291,9 +291,10 @@ PHONY += install install: $(call cmd,install) -PHONY += vdso_install -vdso_install: - $(Q)$(MAKE) $(build)=arch/x86/entry/vdso $@ +vdso-install-$(CONFIG_X86_64) += arch/x86/entry/vdso/vdso64.so.dbg +vdso-install-$(CONFIG_X86_X32_ABI) += arch/x86/entry/vdso/vdsox32.so.dbg +vdso-install-$(CONFIG_X86_32) += arch/x86/entry/vdso/vdso32.so.dbg +vdso-install-$(CONFIG_IA32_EMULATION) += arch/x86/entry/vdso/vdso32.so.dbg archprepare: checkbin checkbin: diff --git a/arch/x86/entry/vdso/Makefile b/arch/x86/entry/vdso/Makefile index 6a1821bd7d5e9b..c197efd829228c 100644 --- a/arch/x86/entry/vdso/Makefile +++ b/arch/x86/entry/vdso/Makefile @@ -190,31 +190,4 @@ GCOV_PROFILE := n quiet_cmd_vdso_and_check = VDSO $@ cmd_vdso_and_check = $(cmd_vdso); $(cmd_vdso_check) -# -# Install the unstripped copies of vdso*.so. If our toolchain supports -# build-id, install .build-id links as well. -# -quiet_cmd_vdso_install = INSTALL $(@:install_%=%) -define cmd_vdso_install - cp $< "$(MODLIB)/vdso/$(@:install_%=%)"; \ - if readelf -n $< |grep -q 'Build ID'; then \ - buildid=`readelf -n $< |grep 'Build ID' |sed -e 's/^.*Build ID: \(.*\)$$/\1/'`; \ - first=`echo $$buildid | cut -b-2`; \ - last=`echo $$buildid | cut -b3-`; \ - mkdir -p "$(MODLIB)/vdso/.build-id/$$first"; \ - ln -sf "../../$(@:install_%=%)" "$(MODLIB)/vdso/.build-id/$$first/$$last.debug"; \ - fi -endef - -vdso_img_insttargets := $(vdso_img_sodbg:%.dbg=install_%) - -$(MODLIB)/vdso: FORCE - @mkdir -p $(MODLIB)/vdso - -$(vdso_img_insttargets): install_%: $(obj)/%.dbg $(MODLIB)/vdso - $(call cmd,vdso_install) - -PHONY += vdso_install $(vdso_img_insttargets) -vdso_install: $(vdso_img_insttargets) - clean-files := vdso32.so vdso32.so.dbg vdso64* vdso-image-*.c vdsox32.so* diff --git a/scripts/Makefile.vdsoinst b/scripts/Makefile.vdsoinst new file mode 100644 index 00000000000000..1022d9fdd976d8 --- /dev/null +++ b/scripts/Makefile.vdsoinst @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: GPL-2.0-only +# ========================================================================== +# Install unstripped copies of vDSO +# ========================================================================== + +PHONY := __default +__default: + @: + +include $(srctree)/scripts/Kbuild.include + +install-dir := $(MODLIB)/vdso + +define gen_install_rules + +src := $$(firstword $$(subst :,$(space),$(1))) +dest := $(install-dir)/$$(or $$(word 2,$$(subst :,$(space),$(1))),$$(patsubst %.dbg,%,$$(notdir $(1)))) + +__default: $$(dest) +$$(dest): $$(src) FORCE + $$(call cmd,install) + +# Some architectures create .build-id symlinks +ifneq ($(filter arm sparc x86, $(SRCARCH)),) +link := $(install-dir)/.build-id/$$(shell $(READELF) -n $$(src) | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p') + +__default: $$(link) +$$(link): $$(dest) FORCE + $$(call cmd,symlink) +endif + +endef + +$(foreach x, $(sort $(INSTALL_FILES)), $(eval $(call gen_install_rules,$(x)))) + +quiet_cmd_install = INSTALL $@ + cmd_install = mkdir -p $(dir $@); cp $< $@ + +quiet_cmd_symlink = SYMLINK $@ + cmd_symlink = mkdir -p $(dir $@); ln -sf --relative $< $@ + +PHONY += FORCE +FORCE: + +.PHONY: $(PHONY) From 7715d094a5c3c7b1faab280643d3ad42551c2d6a Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Sat, 14 Oct 2023 19:54:36 +0900 Subject: [PATCH 240/515] kbuild: unify no-compiler-targets and no-sync-config-targets Now that vdso_install does not depend on any in-tree build artifact, it no longer needs a compiler, making no-compiler-targets the same as no-sync-config-targets. Signed-off-by: Masahiro Yamada Reviewed-by: Nicolas Schier --- Makefile | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 1ae5d5180f207b..fed9a6cc3665c3 100644 --- a/Makefile +++ b/Makefile @@ -277,10 +277,6 @@ no-dot-config-targets := $(clean-targets) \ $(version_h) headers headers_% archheaders archscripts \ %asm-generic kernelversion %src-pkg dt_binding_check \ outputmakefile rustavailable rustfmt rustfmtcheck -# Installation targets should not require compiler. Unfortunately, vdso_install -# is an exception where build artifacts may be updated. This must be fixed. -no-compiler-targets := $(no-dot-config-targets) install dtbs_install \ - headers_install modules_install modules_sign kernelrelease image_name no-sync-config-targets := $(no-dot-config-targets) %install modules_sign kernelrelease \ image_name single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.rsi %.s %.symtypes %/ @@ -288,7 +284,6 @@ single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.rsi %.s %.symtypes % config-build := mixed-build := need-config := 1 -need-compiler := 1 may-sync-config := 1 single-build := @@ -298,18 +293,14 @@ ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) endif endif -ifneq ($(filter $(no-compiler-targets), $(MAKECMDGOALS)),) - ifeq ($(filter-out $(no-compiler-targets), $(MAKECMDGOALS)),) - need-compiler := - endif -endif - ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),) ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),) may-sync-config := endif endif +need-compiler := $(may-sync-config) + ifneq ($(KBUILD_EXTMOD),) may-sync-config := endif From 4138246fc35b8113e4f24acbdaeac7c19da36b22 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Wed, 18 Oct 2023 17:29:09 +0200 Subject: [PATCH 241/515] soc: document merges Signed-off-by: Arnd Bergmann --- arch/arm/arm-soc-for-next-contents.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/arm/arm-soc-for-next-contents.txt b/arch/arm/arm-soc-for-next-contents.txt index ab7fa72ad9b988..e761342312d98f 100644 --- a/arch/arm/arm-soc-for-next-contents.txt +++ b/arch/arm/arm-soc-for-next-contents.txt @@ -2,6 +2,8 @@ soc/arm patch MAINTAINERS: Add entry for AMD PENSANDO arm64: Add config for AMD Pensando SoC platforms + renesas/arm + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-arm-soc-for-v6.7-tag1 soc/dt patch @@ -60,6 +62,14 @@ samsung/dt https://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux tags/amlogic-arm64-dt-for-v6.7 stm32/dt git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32 tags/stm32-dt-for-v6.7-1 + patch + arm/arm64: dts: Removed undocumented and unused "pl022,hierarchy" property + riscv/dt-2 + https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-dt-for-v6.7 + rockchip/dt64 + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts64-1 + rockchip/dt + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts32-1 soc/drivers patch @@ -90,6 +100,8 @@ soc/drivers https://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux tags/amlogic-drivers-for-v6.7 riscv/drivers https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-soc-for-v6.7 + qcom/drivers + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-drivers-for-6.7 soc/defconfig patch @@ -124,4 +136,6 @@ arm/fixes riscv: dts: thead: set dma-noncoherent to soc bus (8cd79b729e746cb167f1563d015a93fc0a079899) git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.6-rockchip-dtsfixes1 + omap/fixes + git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap tags/omap-fixes-audio-clock-and-modem-signed From 955a8eadad211fe8b6f912f5695cc44efc5ea8cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= Date: Mon, 3 Jul 2023 16:25:14 +0200 Subject: [PATCH 242/515] mlx5_vdpa: offer VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Offer this backend feature as mlx5 is compatible with it. It allows it to do live migration with CVQ, dynamically switching between passthrough and shadow virtqueue. Signed-off-by: Eugenio Pérez Message-Id: <20230703142514.363256-1-eperezma@redhat.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/net/mlx5_vnet.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index 946488b8989f4b..3cc2b6263c5429 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -2539,6 +2540,11 @@ static void unregister_link_notifier(struct mlx5_vdpa_net *ndev) flush_workqueue(ndev->mvdev.wq); } +static u64 mlx5_vdpa_get_backend_features(const struct vdpa_device *vdpa) +{ + return BIT_ULL(VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK); +} + static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features) { struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev); @@ -3192,6 +3198,7 @@ static const struct vdpa_config_ops mlx5_vdpa_ops = { .get_vq_align = mlx5_vdpa_get_vq_align, .get_vq_group = mlx5_vdpa_get_vq_group, .get_device_features = mlx5_vdpa_get_device_features, + .get_backend_features = mlx5_vdpa_get_backend_features, .set_driver_features = mlx5_vdpa_set_driver_features, .get_driver_features = mlx5_vdpa_get_driver_features, .set_config_cb = mlx5_vdpa_set_config_cb, From b58c6d797e3b605495c84d1ff569c529c393694f Mon Sep 17 00:00:00 2001 From: Xueshi Hu Date: Sun, 13 Aug 2023 22:07:09 +0800 Subject: [PATCH 243/515] virtio-balloon: correct the comment of virtballoon_migratepage() After commit 68f2736a8583 ("mm: Convert all PageMovable users to movable_operations"), the execution path has been changed to move_to_new_folio movable_operations->migrate_page balloon_page_migrate balloon_page_migrate->balloon_page_migrate balloon_page_migrate Correct the outdated comment. Signed-off-by: Xueshi Hu Message-Id: <20230813140709.835536-1-xueshi.hu@smartx.com> Signed-off-by: Michael S. Tsirkin Reviewed-by: David Hildenbrand Reviewed-by: Xuan Zhuo --- drivers/virtio/virtio_balloon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 2d5d252ef41972..8dff9d2bbe5d4a 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -745,7 +745,7 @@ static void report_free_page_func(struct work_struct *work) * 2) update the host about the old page removed from vb->pages list; * * This function preforms the balloon page migration task. - * Called through balloon_mapping->a_ops->migratepage + * Called through movable_operations->migrate_page */ static int virtballoon_migratepage(struct balloon_dev_info *vb_dev_info, struct page *newpage, struct page *page, enum migrate_mode mode) From d1c21974942e78ea54926c71baca2349a7cd7196 Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Mon, 25 Sep 2023 19:06:51 +0300 Subject: [PATCH 244/515] MAINTAINERS: Add myself as mlx5_vdpa driver As Eli Cohen moved to other work, I'll be the contact point for mlx5_vdpa. Acked-by: Jason Wang Signed-off-by: Dragos Tatulea Message-Id: <20230925160654.1558627-1-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- MAINTAINERS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 7a7bd8bd80e9f2..b90faef3e37dfd 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13665,6 +13665,12 @@ F: drivers/infiniband/hw/mlx5/ F: include/linux/mlx5/ F: include/uapi/rdma/mlx5-abi.h +MELLANOX MLX5 VDPA DRIVER +M: Dragos Tatulea +L: virtualization@lists.linux-foundation.org +S: Supported +F: drivers/vdpa/mlx5/ + MELLANOX MLXCPLD I2C AND MUX DRIVER M: Vadim Pasternak M: Michael Shych From 6e04dea630fd66d5f20ad3b710d30e9729555a01 Mon Sep 17 00:00:00 2001 From: "Shawn.Shao" Date: Mon, 21 Aug 2023 09:15:35 +0800 Subject: [PATCH 245/515] vdpa: Update sysfs ABI documentation Fix the wrong drivers_autoprobe path name in the document Signed-off-by: Shawn.Shao Message-Id: <20230821011535.1117-1-shawn.shao@jaguarmicro.com> Signed-off-by: Michael S. Tsirkin Acked-by: Jason Wang --- Documentation/ABI/testing/sysfs-bus-vdpa | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-vdpa b/Documentation/ABI/testing/sysfs-bus-vdpa index 28a6111202ba15..4da53878bff6b8 100644 --- a/Documentation/ABI/testing/sysfs-bus-vdpa +++ b/Documentation/ABI/testing/sysfs-bus-vdpa @@ -1,4 +1,4 @@ -What: /sys/bus/vdpa/driver_autoprobe +What: /sys/bus/vdpa/drivers_autoprobe Date: March 2020 Contact: virtualization@lists.linux-foundation.org Description: @@ -17,7 +17,7 @@ Description: Writing a device name to this file will cause the kernel binds devices to a compatible driver. - This can be useful when /sys/bus/vdpa/driver_autoprobe is + This can be useful when /sys/bus/vdpa/drivers_autoprobe is disabled. What: /sys/bus/vdpa/drivers/.../bind From 7725bfe7eb6ed7039f783d01d495b3637c384713 Mon Sep 17 00:00:00 2001 From: Shannon Nelson Date: Mon, 11 Sep 2023 14:31:04 -0700 Subject: [PATCH 246/515] virtio: kdoc for struct virtio_pci_modern_device MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Finally following up to Simon's suggestion for some kdoc attention on struct virtio_pci_modern_device. Link: https://lore.kernel.org/netdev/ZE%2FQS0lnUvxFacjf@corigine.com/ Cc: Simon Horman Signed-off-by: Shannon Nelson Acked-by: Eugenio Pérez Message-Id: <20230911213104.14391-1-shannon.nelson@amd.com> Signed-off-by: Michael S. Tsirkin Acked-by: Jason Wang --- include/linux/virtio_pci_modern.h | 34 ++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h index 067ac1d789bcb6..a38c729d197347 100644 --- a/include/linux/virtio_pci_modern.h +++ b/include/linux/virtio_pci_modern.h @@ -12,37 +12,47 @@ struct virtio_pci_modern_common_cfg { __le16 queue_reset; /* read-write */ }; +/** + * struct virtio_pci_modern_device - info for modern PCI virtio + * @pci_dev: Ptr to the PCI device struct + * @common: Position of the common capability in the PCI config + * @device: Device-specific data (non-legacy mode) + * @notify_base: Base of vq notifications (non-legacy mode) + * @notify_pa: Physical base of vq notifications + * @isr: Where to read and clear interrupt + * @notify_len: So we can sanity-check accesses + * @device_len: So we can sanity-check accesses + * @notify_map_cap: Capability for when we need to map notifications per-vq + * @notify_offset_multiplier: Multiply queue_notify_off by this value + * (non-legacy mode). + * @modern_bars: Bitmask of BARs + * @id: Device and vendor id + * @device_id_check: Callback defined before vp_modern_probe() to be used to + * verify the PCI device is a vendor's expected device rather + * than the standard virtio PCI device + * Returns the found device id or ERRNO + * @dma_mask: Optional mask instead of the traditional DMA_BIT_MASK(64), + * for vendor devices with DMA space address limitations + */ struct virtio_pci_modern_device { struct pci_dev *pci_dev; struct virtio_pci_common_cfg __iomem *common; - /* Device-specific data (non-legacy mode) */ void __iomem *device; - /* Base of vq notifications (non-legacy mode). */ void __iomem *notify_base; - /* Physical base of vq notifications */ resource_size_t notify_pa; - /* Where to read and clear interrupt */ u8 __iomem *isr; - /* So we can sanity-check accesses. */ size_t notify_len; size_t device_len; - /* Capability for when we need to map notifications per-vq. */ int notify_map_cap; - /* Multiply queue_notify_off by this value. (non-legacy mode). */ u32 notify_offset_multiplier; - int modern_bars; - struct virtio_device_id id; - /* optional check for vendor virtio device, returns dev_id or -ERRNO */ int (*device_id_check)(struct pci_dev *pdev); - - /* optional mask for devices with limited DMA space */ u64 dma_mask; }; From b4a4df8a4da6c18e44c187586ed51fd55b8e8d92 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Thu, 28 Sep 2023 14:18:33 +0200 Subject: [PATCH 247/515] vhost-scsi: Spelling s/preceeding/preceding/g Fix a misspelling of "preceding". Signed-off-by: Geert Uytterhoeven Message-Id: Signed-off-by: Michael S. Tsirkin Reviewed-by: Simon Horman Reviewed-by: Stefan Hajnoczi --- drivers/vhost/scsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index abef0619c7901a..2d689181bafef2 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -1158,7 +1158,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) /* * Set prot_iter to data_iter and truncate it to * prot_bytes, and advance data_iter past any - * preceeding prot_bytes that may be present. + * preceding prot_bytes that may be present. * * Also fix up the exp_data_len to reflect only the * actual data payload length. From 2408de41f48c1a42c6bf3285dce5b8ad3140af46 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Oct 2023 16:30:44 +0200 Subject: [PATCH 248/515] vduse: make vduse_class constant Now that the driver core allows for struct class to be in read-only memory, we should make all 'class' structures declared at build time placing them into read-only memory, instead of having to be dynamically allocated at runtime. Cc: "Michael S. Tsirkin" Cc: Jason Wang Cc: Xuan Zhuo Cc: Xie Yongji Signed-off-by: Greg Kroah-Hartman Message-Id: <2023100643-tricolor-citizen-6c2d@gregkh> Signed-off-by: Michael S. Tsirkin Reviewed-by: Xie Yongji Acked-by: Jason Wang --- drivers/vdpa/vdpa_user/vduse_dev.c | 40 ++++++++++++++++-------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c index df7869537ef146..0ddd4b8abecb30 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -134,7 +134,6 @@ static DEFINE_MUTEX(vduse_lock); static DEFINE_IDR(vduse_idr); static dev_t vduse_major; -static struct class *vduse_class; static struct cdev vduse_ctrl_cdev; static struct cdev vduse_cdev; static struct workqueue_struct *vduse_irq_wq; @@ -1528,6 +1527,16 @@ static const struct kobj_type vq_type = { .default_groups = vq_groups, }; +static char *vduse_devnode(const struct device *dev, umode_t *mode) +{ + return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev)); +} + +static const struct class vduse_class = { + .name = "vduse", + .devnode = vduse_devnode, +}; + static void vduse_dev_deinit_vqs(struct vduse_dev *dev) { int i; @@ -1638,7 +1647,7 @@ static int vduse_destroy_dev(char *name) mutex_unlock(&dev->lock); vduse_dev_reset(dev); - device_destroy(vduse_class, MKDEV(MAJOR(vduse_major), dev->minor)); + device_destroy(&vduse_class, MKDEV(MAJOR(vduse_major), dev->minor)); idr_remove(&vduse_idr, dev->minor); kvfree(dev->config); vduse_dev_deinit_vqs(dev); @@ -1805,7 +1814,7 @@ static int vduse_create_dev(struct vduse_dev_config *config, dev->minor = ret; dev->msg_timeout = VDUSE_MSG_DEFAULT_TIMEOUT; - dev->dev = device_create_with_groups(vduse_class, NULL, + dev->dev = device_create_with_groups(&vduse_class, NULL, MKDEV(MAJOR(vduse_major), dev->minor), dev, vduse_dev_groups, "%s", config->name); if (IS_ERR(dev->dev)) { @@ -1821,7 +1830,7 @@ static int vduse_create_dev(struct vduse_dev_config *config, return 0; err_vqs: - device_destroy(vduse_class, MKDEV(MAJOR(vduse_major), dev->minor)); + device_destroy(&vduse_class, MKDEV(MAJOR(vduse_major), dev->minor)); err_dev: idr_remove(&vduse_idr, dev->minor); err_idr: @@ -1934,11 +1943,6 @@ static const struct file_operations vduse_ctrl_fops = { .llseek = noop_llseek, }; -static char *vduse_devnode(const struct device *dev, umode_t *mode) -{ - return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev)); -} - struct vduse_mgmt_dev { struct vdpa_mgmt_dev mgmt_dev; struct device dev; @@ -2082,11 +2086,9 @@ static int vduse_init(void) int ret; struct device *dev; - vduse_class = class_create("vduse"); - if (IS_ERR(vduse_class)) - return PTR_ERR(vduse_class); - - vduse_class->devnode = vduse_devnode; + ret = class_register(&vduse_class); + if (ret) + return ret; ret = alloc_chrdev_region(&vduse_major, 0, VDUSE_DEV_MAX, "vduse"); if (ret) @@ -2099,7 +2101,7 @@ static int vduse_init(void) if (ret) goto err_ctrl_cdev; - dev = device_create(vduse_class, NULL, vduse_major, NULL, "control"); + dev = device_create(&vduse_class, NULL, vduse_major, NULL, "control"); if (IS_ERR(dev)) { ret = PTR_ERR(dev); goto err_device; @@ -2141,13 +2143,13 @@ static int vduse_init(void) err_wq: cdev_del(&vduse_cdev); err_cdev: - device_destroy(vduse_class, vduse_major); + device_destroy(&vduse_class, vduse_major); err_device: cdev_del(&vduse_ctrl_cdev); err_ctrl_cdev: unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX); err_chardev_region: - class_destroy(vduse_class); + class_unregister(&vduse_class); return ret; } module_init(vduse_init); @@ -2159,10 +2161,10 @@ static void vduse_exit(void) destroy_workqueue(vduse_irq_bound_wq); destroy_workqueue(vduse_irq_wq); cdev_del(&vduse_cdev); - device_destroy(vduse_class, vduse_major); + device_destroy(&vduse_class, vduse_major); cdev_del(&vduse_ctrl_cdev); unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX); - class_destroy(vduse_class); + class_unregister(&vduse_class); } module_exit(vduse_exit); From e3700b4cbd82478e30827101227c802369712edd Mon Sep 17 00:00:00 2001 From: Xuan Zhuo Date: Tue, 10 Oct 2023 11:11:17 +0800 Subject: [PATCH 249/515] virtio: add definition of VIRTIO_F_NOTIF_CONFIG_DATA feature bit This patch adds the definition of VIRTIO_F_NOTIF_CONFIG_DATA feature bit in the relevant header file. This feature indicates that the driver uses the data provided by the device as a virtqueue identifier in available buffer notifications. It comes from here: https://github.com/oasis-tcs/virtio-spec/issues/89 Signed-off-by: Xuan Zhuo Message-Id: <20231010031120.81272-2-xuanzhuo@linux.alibaba.com> Signed-off-by: Michael S. Tsirkin Acked-by: Jason Wang --- include/uapi/linux/virtio_config.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/uapi/linux/virtio_config.h b/include/uapi/linux/virtio_config.h index 2c712c65416535..8881aea60f6f11 100644 --- a/include/uapi/linux/virtio_config.h +++ b/include/uapi/linux/virtio_config.h @@ -105,6 +105,11 @@ */ #define VIRTIO_F_NOTIFICATION_DATA 38 +/* This feature indicates that the driver uses the data provided by the device + * as a virtqueue identifier in available buffer notifications. + */ +#define VIRTIO_F_NOTIF_CONFIG_DATA 39 + /* * This feature indicates that the driver can reset a queue individually. */ From 505b0614ce27945957201273d35f51b7341eb017 Mon Sep 17 00:00:00 2001 From: Xuan Zhuo Date: Tue, 10 Oct 2023 11:11:20 +0800 Subject: [PATCH 250/515] virtio_pci: add build offset check for the new common cfg items Add checks to the check_offsets(void) for queue_notify_data and queue_reset. Signed-off-by: Xuan Zhuo Acked-by: Jason Wang Message-Id: <20231010031120.81272-5-xuanzhuo@linux.alibaba.com> Signed-off-by: Michael S. Tsirkin --- drivers/virtio/virtio_pci_modern_dev.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c index 9cb601e16688dc..d312443d656902 100644 --- a/drivers/virtio/virtio_pci_modern_dev.c +++ b/drivers/virtio/virtio_pci_modern_dev.c @@ -203,6 +203,10 @@ static inline void check_offsets(void) offsetof(struct virtio_pci_common_cfg, queue_used_lo)); BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_USEDHI != offsetof(struct virtio_pci_common_cfg, queue_used_hi)); + BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_NDATA != + offsetof(struct virtio_pci_modern_common_cfg, queue_notify_data)); + BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_RESET != + offsetof(struct virtio_pci_modern_common_cfg, queue_reset)); } /* From a9be99a9259dd5a23786fe9dbde15d58013901ef Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Thu, 28 Sep 2023 19:45:12 +0300 Subject: [PATCH 251/515] vdpa/mlx5: Expose descriptor group mkey hw capability Necessary for improved live migration flow. Actual support will be added in a downstream patch. Reviewed-by: Gal Pressman Signed-off-by: Dragos Tatulea Link: https://lore.kernel.org/r/20230928164550.980832-3-dtatulea@nvidia.com Signed-off-by: Leon Romanovsky Signed-off-by: Michael S. Tsirkin --- include/linux/mlx5/mlx5_ifc.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h index fc3db401f8a287..3388007c645f05 100644 --- a/include/linux/mlx5/mlx5_ifc.h +++ b/include/linux/mlx5/mlx5_ifc.h @@ -1231,7 +1231,13 @@ struct mlx5_ifc_virtio_emulation_cap_bits { u8 max_emulated_devices[0x8]; u8 max_num_virtio_queues[0x18]; - u8 reserved_at_a0[0x60]; + u8 reserved_at_a0[0x20]; + + u8 reserved_at_c0[0x13]; + u8 desc_group_mkey_supported[0x1]; + u8 reserved_at_d4[0xc]; + + u8 reserved_at_e0[0x20]; u8 umem_1_buffer_param_a[0x20]; From 52c973d7008b5544548dd2cce4391bd9d019745c Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Wed, 18 Oct 2023 20:14:41 +0300 Subject: [PATCH 252/515] vdpa: introduce dedicated descriptor group for virtqueue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In some cases, the access to the virtqueue's descriptor area, device and driver areas (precluding indirect descriptor table in guest memory) may have to be confined to a different address space than where its buffers reside. Without loss of simplicity and generality with already established terminology, let's fold up these 3 areas and call them as a whole as descriptor table group, or descriptor group for short. Specifically, in case of split virtqueues, descriptor group consists of regions for Descriptor Table, Available Ring and Used Ring; for packed virtqueues layout, descriptor group contains Descriptor Ring, Driver and Device Event Suppression structures. The group ID for a dedicated descriptor group can be obtained through a new .get_vq_desc_group() op. If driver implements this op, it means that the descriptor, device and driver areas of the virtqueue may reside in a dedicated group than where its buffers reside, a.k.a the default virtqueue group through the .get_vq_group() op. In principle, the descriptor group may or may not have same group ID as the default group. Even if the descriptor group has a different ID, meaning the vq's descriptor group areas can optionally move to a separate address space than where guest memory resides, the descriptor group may still start from a default address space, same as where its buffers reside. To move the descriptor group to a different address space, .set_group_asid() has to be called to change the ASID binding for the group, which is no different than what needs to be done on any other virtqueue group. On the other hand, the .reset() semantics also applies on descriptor table group, meaning the device reset will clear all ASID bindings and move all virtqueue groups including descriptor group back to the default address space, i.e. in ASID 0. QEMU's shadow virtqueue is going to utilize dedicated descriptor group to speed up map and unmap operations, yielding tremendous downtime reduction by avoiding the full and slow remap cycle in SVQ switching. Signed-off-by: Si-Wei Liu Acked-by: Eugenio Pérez Acked-by: Jason Wang Message-Id: <20231018171456.1624030-4-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- include/linux/vdpa.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index 0e652026b776f8..d376309b99cf4e 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h @@ -204,6 +204,16 @@ struct vdpa_map_file { * @vdev: vdpa device * @idx: virtqueue index * Returns u32: group id for this virtqueue + * @get_vq_desc_group: Get the group id for the descriptor table of + * a specific virtqueue (optional) + * @vdev: vdpa device + * @idx: virtqueue index + * Returns u32: group id for the descriptor table + * portion of this virtqueue. Could be different + * than the one from @get_vq_group, in which case + * the access to the descriptor table can be + * confined to a separate asid, isolating from + * the virtqueue's buffer address access. * @get_device_features: Get virtio features supported by the device * @vdev: vdpa device * Returns the virtio features support by the @@ -360,6 +370,7 @@ struct vdpa_config_ops { /* Device ops */ u32 (*get_vq_align)(struct vdpa_device *vdev); u32 (*get_vq_group)(struct vdpa_device *vdev, u16 idx); + u32 (*get_vq_desc_group)(struct vdpa_device *vdev, u16 idx); u64 (*get_device_features)(struct vdpa_device *vdev); u64 (*get_backend_features)(const struct vdpa_device *vdev); int (*set_driver_features)(struct vdpa_device *vdev, u64 features); From 0aebe59c5d6969d18064c3e2fe3940f9d97be423 Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Wed, 18 Oct 2023 20:14:42 +0300 Subject: [PATCH 253/515] vhost-vdpa: introduce descriptor group backend feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Userspace knows if the device has dedicated descriptor group or not by checking this feature bit. It's only exposed if the vdpa driver backend implements the .get_vq_desc_group() operation callback. Userspace trying to negotiate this feature when it or the dependent _F_IOTLB_ASID feature hasn't been exposed will result in an error. Signed-off-by: Si-Wei Liu Acked-by: Eugenio Pérez Acked-by: Jason Wang Message-Id: <20231018171456.1624030-5-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vhost/vdpa.c | 17 +++++++++++++++++ include/uapi/linux/vhost_types.h | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index 78379ffd23363d..2f21798a37ee01 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -389,6 +389,14 @@ static bool vhost_vdpa_can_resume(const struct vhost_vdpa *v) return ops->resume; } +static bool vhost_vdpa_has_desc_group(const struct vhost_vdpa *v) +{ + struct vdpa_device *vdpa = v->vdpa; + const struct vdpa_config_ops *ops = vdpa->config; + + return ops->get_vq_desc_group; +} + static long vhost_vdpa_get_features(struct vhost_vdpa *v, u64 __user *featurep) { struct vdpa_device *vdpa = v->vdpa; @@ -690,6 +698,7 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, if (copy_from_user(&features, featurep, sizeof(features))) return -EFAULT; if (features & ~(VHOST_VDPA_BACKEND_FEATURES | + BIT_ULL(VHOST_BACKEND_F_DESC_ASID) | BIT_ULL(VHOST_BACKEND_F_SUSPEND) | BIT_ULL(VHOST_BACKEND_F_RESUME) | BIT_ULL(VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK))) @@ -700,6 +709,12 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, if ((features & BIT_ULL(VHOST_BACKEND_F_RESUME)) && !vhost_vdpa_can_resume(v)) return -EOPNOTSUPP; + if ((features & BIT_ULL(VHOST_BACKEND_F_DESC_ASID)) && + !(features & BIT_ULL(VHOST_BACKEND_F_IOTLB_ASID))) + return -EINVAL; + if ((features & BIT_ULL(VHOST_BACKEND_F_DESC_ASID)) && + !vhost_vdpa_has_desc_group(v)) + return -EOPNOTSUPP; vhost_set_backend_features(&v->vdev, features); return 0; } @@ -753,6 +768,8 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, features |= BIT_ULL(VHOST_BACKEND_F_SUSPEND); if (vhost_vdpa_can_resume(v)) features |= BIT_ULL(VHOST_BACKEND_F_RESUME); + if (vhost_vdpa_has_desc_group(v)) + features |= BIT_ULL(VHOST_BACKEND_F_DESC_ASID); features |= vhost_vdpa_get_backend_features(v); if (copy_to_user(featurep, &features, sizeof(features))) r = -EFAULT; diff --git a/include/uapi/linux/vhost_types.h b/include/uapi/linux/vhost_types.h index 2d827d22cd99d2..18ad6ae7ab5c6a 100644 --- a/include/uapi/linux/vhost_types.h +++ b/include/uapi/linux/vhost_types.h @@ -185,5 +185,10 @@ struct vhost_vdpa_iova_range { * DRIVER_OK */ #define VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK 0x6 +/* Device may expose the virtqueue's descriptor area, driver area and + * device area to a different group for ASID binding than where its + * buffers may reside. Requires VHOST_BACKEND_F_IOTLB_ASID. + */ +#define VHOST_BACKEND_F_DESC_ASID 0x7 #endif From cf4c1857deceb11555c90785441b50c97f568c67 Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Wed, 18 Oct 2023 20:14:43 +0300 Subject: [PATCH 254/515] vhost-vdpa: uAPI to get dedicated descriptor group id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With _F_DESC_ASID backend feature, the device can now support the VHOST_VDPA_GET_VRING_DESC_GROUP ioctl, and it may expose the descriptor table (including avail and used ring) in a different group than the buffers it contains. This new uAPI will fetch the group ID of the descriptor table. Signed-off-by: Si-Wei Liu Acked-by: Eugenio Pérez Acked-by: Jason Wang Message-Id: <20231018171456.1624030-6-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vhost/vdpa.c | 10 ++++++++++ include/uapi/linux/vhost.h | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index 2f21798a37ee01..851535f57b9589 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -613,6 +613,16 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, else if (copy_to_user(argp, &s, sizeof(s))) return -EFAULT; return 0; + case VHOST_VDPA_GET_VRING_DESC_GROUP: + if (!vhost_vdpa_has_desc_group(v)) + return -EOPNOTSUPP; + s.index = idx; + s.num = ops->get_vq_desc_group(vdpa, idx); + if (s.num >= vdpa->ngroups) + return -EIO; + else if (copy_to_user(argp, &s, sizeof(s))) + return -EFAULT; + return 0; case VHOST_VDPA_SET_GROUP_ASID: if (copy_from_user(&s, argp, sizeof(s))) return -EFAULT; diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h index f5c48b61ab6224..649560c685f13b 100644 --- a/include/uapi/linux/vhost.h +++ b/include/uapi/linux/vhost.h @@ -219,4 +219,12 @@ */ #define VHOST_VDPA_RESUME _IO(VHOST_VIRTIO, 0x7E) +/* Get the group for the descriptor table including driver & device areas + * of a virtqueue: read index, write group in num. + * The virtqueue index is stored in the index field of vhost_vring_state. + * The group ID of the descriptor table for this specific virtqueue + * is returned via num field of vhost_vring_state. + */ +#define VHOST_VDPA_GET_VRING_DESC_GROUP _IOWR(VHOST_VIRTIO, 0x7F, \ + struct vhost_vring_state) #endif From 5059e6ede8446e8b42a04e511f0ebe7966fb3bab Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:44 +0300 Subject: [PATCH 255/515] vdpa/mlx5: Create helper function for dma mappings Necessary for upcoming cvq separation from mr allocation. Acked-by: Jason Wang Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-7-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 1 + drivers/vdpa/mlx5/core/mr.c | 5 +++++ drivers/vdpa/mlx5/net/mlx5_vnet.c | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index ca56242972b3af..3748f027cfe92e 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -120,6 +120,7 @@ int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid); void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev); void mlx5_vdpa_destroy_mr_asid(struct mlx5_vdpa_dev *mvdev, unsigned int asid); +int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev); #define mlx5_vdpa_warn(__dev, format, ...) \ dev_warn((__dev)->mdev->device, "%s:%d:(pid %d) warning: " format, __func__, __LINE__, \ diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 5a1971fcd87b10..7bd0883b8b25d2 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -619,3 +619,8 @@ int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *io return err; } + +int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev) +{ + return mlx5_vdpa_create_mr(mvdev, NULL, 0); +} diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index 3cc2b6263c5429..10bd5934b3cf6f 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -2886,7 +2886,7 @@ static int mlx5_vdpa_reset(struct vdpa_device *vdev) ++mvdev->generation; if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) { - if (mlx5_vdpa_create_mr(mvdev, NULL, 0)) + if (mlx5_vdpa_create_dma_mr(mvdev)) mlx5_vdpa_warn(mvdev, "create MR failed\n"); } up_write(&ndev->reslock); @@ -3492,7 +3492,7 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name, goto err_mpfs; if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) { - err = mlx5_vdpa_create_mr(mvdev, NULL, 0); + err = mlx5_vdpa_create_dma_mr(mvdev); if (err) goto err_res; } From ef72e58b6bfa2742ff85c5ce06e745c189c4dfca Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:45 +0300 Subject: [PATCH 256/515] vdpa/mlx5: Decouple cvq iotlb handling from hw mapping code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The handling of the cvq iotlb is currently coupled with the creation and destruction of the hardware mkeys (mr). This patch moves cvq iotlb handling into its own function and shifts it to a scope that is not related to mr handling. As cvq handling is just a prune_iotlb + dup_iotlb cycle, put it all in the same "update" function. Finally, the destruction path is handled by directly pruning the iotlb. After this move is done the ASID mr code can be collapsed into a single function. Acked-by: Jason Wang Acked-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-8-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 3 ++ drivers/vdpa/mlx5/core/mr.c | 57 +++++++++++------------------- drivers/vdpa/mlx5/net/mlx5_vnet.c | 7 ++-- 3 files changed, 28 insertions(+), 39 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index 3748f027cfe92e..554899a80241d3 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -120,6 +120,9 @@ int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid); void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev); void mlx5_vdpa_destroy_mr_asid(struct mlx5_vdpa_dev *mvdev, unsigned int asid); +int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, + struct vhost_iotlb *iotlb, + unsigned int asid); int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev); #define mlx5_vdpa_warn(__dev, format, ...) \ diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 7bd0883b8b25d2..fcb6ae32e9ed5b 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -489,14 +489,6 @@ static void destroy_user_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr } } -static void _mlx5_vdpa_destroy_cvq_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) -{ - if (mvdev->group2asid[MLX5_VDPA_CVQ_GROUP] != asid) - return; - - prune_iotlb(mvdev); -} - static void _mlx5_vdpa_destroy_dvq_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) { struct mlx5_vdpa_mr *mr = &mvdev->mr; @@ -522,25 +514,14 @@ void mlx5_vdpa_destroy_mr_asid(struct mlx5_vdpa_dev *mvdev, unsigned int asid) mutex_lock(&mr->mkey_mtx); _mlx5_vdpa_destroy_dvq_mr(mvdev, asid); - _mlx5_vdpa_destroy_cvq_mr(mvdev, asid); mutex_unlock(&mr->mkey_mtx); } void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev) { - mlx5_vdpa_destroy_mr_asid(mvdev, mvdev->group2asid[MLX5_VDPA_CVQ_GROUP]); mlx5_vdpa_destroy_mr_asid(mvdev, mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]); -} - -static int _mlx5_vdpa_create_cvq_mr(struct mlx5_vdpa_dev *mvdev, - struct vhost_iotlb *iotlb, - unsigned int asid) -{ - if (mvdev->group2asid[MLX5_VDPA_CVQ_GROUP] != asid) - return 0; - - return dup_iotlb(mvdev, iotlb); + prune_iotlb(mvdev); } static int _mlx5_vdpa_create_dvq_mr(struct mlx5_vdpa_dev *mvdev, @@ -572,22 +553,7 @@ static int _mlx5_vdpa_create_dvq_mr(struct mlx5_vdpa_dev *mvdev, static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid) { - int err; - - err = _mlx5_vdpa_create_dvq_mr(mvdev, iotlb, asid); - if (err) - return err; - - err = _mlx5_vdpa_create_cvq_mr(mvdev, iotlb, asid); - if (err) - goto out_err; - - return 0; - -out_err: - _mlx5_vdpa_destroy_dvq_mr(mvdev, asid); - - return err; + return _mlx5_vdpa_create_dvq_mr(mvdev, iotlb, asid); } int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, @@ -620,7 +586,24 @@ int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *io return err; } +int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, + struct vhost_iotlb *iotlb, + unsigned int asid) +{ + if (mvdev->group2asid[MLX5_VDPA_CVQ_GROUP] != asid) + return 0; + + prune_iotlb(mvdev); + return dup_iotlb(mvdev, iotlb); +} + int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev) { - return mlx5_vdpa_create_mr(mvdev, NULL, 0); + int err; + + err = mlx5_vdpa_create_mr(mvdev, NULL, 0); + if (err) + return err; + + return mlx5_vdpa_update_cvq_iotlb(mvdev, NULL, 0); } diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index 10bd5934b3cf6f..a1858702434774 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -2934,10 +2934,13 @@ static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, return err; } - if (change_map) + if (change_map) { err = mlx5_vdpa_change_map(mvdev, iotlb, asid); + if (err) + return err; + } - return err; + return mlx5_vdpa_update_cvq_iotlb(mvdev, iotlb, asid); } static int mlx5_vdpa_set_map(struct vdpa_device *vdev, unsigned int asid, From f67ad6c541f93ede799dc4cbcdb5569e0d3cd93d Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:46 +0300 Subject: [PATCH 257/515] vdpa/mlx5: Take cvq iotlb lock during refresh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The reslock is taken while refresh is called but iommu_lock is more specific to this resource. So take the iommu_lock during cvq iotlb refresh. Based on Eugenio's patch [0]. [0] https://lore.kernel.org/lkml/20230112142218.725622-4-eperezma@redhat.com/ Acked-by: Jason Wang Suggested-by: Eugenio Pérez Reviewed-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-9-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mr.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index fcb6ae32e9ed5b..587300e7c18e31 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -590,11 +590,19 @@ int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid) { + int err; + if (mvdev->group2asid[MLX5_VDPA_CVQ_GROUP] != asid) return 0; + spin_lock(&mvdev->cvq.iommu_lock); + prune_iotlb(mvdev); - return dup_iotlb(mvdev, iotlb); + err = dup_iotlb(mvdev, iotlb); + + spin_unlock(&mvdev->cvq.iommu_lock); + + return err; } int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev) From a650b1cb26512287b0d03bef296d6693990ed748 Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:47 +0300 Subject: [PATCH 258/515] vdpa/mlx5: Collapse "dvq" mr add/delete functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that the cvq code is out of mlx5_vdpa_create/destroy_mr, the "dvq" functions can be folded into their callers. Having "dvq" in the naming will no longer be accurate in the downstream patches. Acked-by: Jason Wang Acked-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-10-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mr.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 587300e7c18e31..fde00497f4adb6 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -489,7 +489,7 @@ static void destroy_user_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr } } -static void _mlx5_vdpa_destroy_dvq_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) +static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) { struct mlx5_vdpa_mr *mr = &mvdev->mr; @@ -513,7 +513,7 @@ void mlx5_vdpa_destroy_mr_asid(struct mlx5_vdpa_dev *mvdev, unsigned int asid) mutex_lock(&mr->mkey_mtx); - _mlx5_vdpa_destroy_dvq_mr(mvdev, asid); + _mlx5_vdpa_destroy_mr(mvdev, asid); mutex_unlock(&mr->mkey_mtx); } @@ -524,9 +524,9 @@ void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev) prune_iotlb(mvdev); } -static int _mlx5_vdpa_create_dvq_mr(struct mlx5_vdpa_dev *mvdev, - struct vhost_iotlb *iotlb, - unsigned int asid) +static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, + struct vhost_iotlb *iotlb, + unsigned int asid) { struct mlx5_vdpa_mr *mr = &mvdev->mr; int err; @@ -550,12 +550,6 @@ static int _mlx5_vdpa_create_dvq_mr(struct mlx5_vdpa_dev *mvdev, return 0; } -static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, - struct vhost_iotlb *iotlb, unsigned int asid) -{ - return _mlx5_vdpa_create_dvq_mr(mvdev, iotlb, asid); -} - int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid) { From 39f7c1237ae572dc0ecf96c20d61e65580fd4b73 Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:48 +0300 Subject: [PATCH 259/515] vdpa/mlx5: Rename mr destroy functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make mlx5_destroy_mr symmetric to mlx5_create_mr. Acked-by: Jason Wang Acked-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-11-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 4 ++-- drivers/vdpa/mlx5/core/mr.c | 6 +++--- drivers/vdpa/mlx5/net/mlx5_vnet.c | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index 554899a80241d3..e1e6e7aba50efb 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -118,8 +118,8 @@ int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *io bool *change_map, unsigned int asid); int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid); -void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev); -void mlx5_vdpa_destroy_mr_asid(struct mlx5_vdpa_dev *mvdev, unsigned int asid); +void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev); +void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid); int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid); diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index fde00497f4adb6..00dcce190a1fd3 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -507,7 +507,7 @@ static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid mr->initialized = false; } -void mlx5_vdpa_destroy_mr_asid(struct mlx5_vdpa_dev *mvdev, unsigned int asid) +void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) { struct mlx5_vdpa_mr *mr = &mvdev->mr; @@ -518,9 +518,9 @@ void mlx5_vdpa_destroy_mr_asid(struct mlx5_vdpa_dev *mvdev, unsigned int asid) mutex_unlock(&mr->mkey_mtx); } -void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev) +void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev) { - mlx5_vdpa_destroy_mr_asid(mvdev, mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]); + mlx5_vdpa_destroy_mr(mvdev, mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]); prune_iotlb(mvdev); } diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index a1858702434774..9b7eeaf60013f5 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -2690,7 +2690,7 @@ static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, goto err_mr; teardown_driver(ndev); - mlx5_vdpa_destroy_mr_asid(mvdev, asid); + mlx5_vdpa_destroy_mr(mvdev, asid); err = mlx5_vdpa_create_mr(mvdev, iotlb, asid); if (err) goto err_mr; @@ -2706,7 +2706,7 @@ static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, return 0; err_setup: - mlx5_vdpa_destroy_mr_asid(mvdev, asid); + mlx5_vdpa_destroy_mr(mvdev, asid); err_mr: return err; } @@ -2847,7 +2847,7 @@ static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status) err_driver: unregister_link_notifier(ndev); err_setup: - mlx5_vdpa_destroy_mr(&ndev->mvdev); + mlx5_vdpa_destroy_mr_resources(&ndev->mvdev); ndev->mvdev.status |= VIRTIO_CONFIG_S_FAILED; err_clear: up_write(&ndev->reslock); @@ -2874,7 +2874,7 @@ static int mlx5_vdpa_reset(struct vdpa_device *vdev) unregister_link_notifier(ndev); teardown_driver(ndev); clear_vqs_ready(ndev); - mlx5_vdpa_destroy_mr(&ndev->mvdev); + mlx5_vdpa_destroy_mr_resources(&ndev->mvdev); ndev->mvdev.status = 0; ndev->mvdev.suspended = false; ndev->cur_num_vqs = 0; @@ -2994,7 +2994,7 @@ static void mlx5_vdpa_free(struct vdpa_device *vdev) ndev = to_mlx5_vdpa_ndev(mvdev); free_resources(ndev); - mlx5_vdpa_destroy_mr(mvdev); + mlx5_vdpa_destroy_mr_resources(mvdev); if (!is_zero_ether_addr(ndev->config.mac)) { pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev)); mlx5_mpfs_del_mac(pfmdev, ndev->config.mac); @@ -3525,7 +3525,7 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name, err_res2: free_resources(ndev); err_mr: - mlx5_vdpa_destroy_mr(mvdev); + mlx5_vdpa_destroy_mr_resources(mvdev); err_res: mlx5_vdpa_free_resources(&ndev->mvdev); err_mpfs: From 119c68eeeabf7d181de841df813a3f30d3df60d0 Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:49 +0300 Subject: [PATCH 260/515] vdpa/mlx5: Allow creation/deletion of any given mr struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adapts the mr creation/deletion code to be able to work with any given mr struct pointer. All the APIs are adapted to take an extra parameter for the mr. mlx5_vdpa_create/delete_mr doesn't need a ASID parameter anymore. The check is done in the caller instead (mlx5_set_map). This change is needed for a followup patch which will introduce an additional mr for the vq descriptor data. Signed-off-by: Dragos Tatulea Acked-by: Eugenio Pérez Acked-by: Jason Wang Message-Id: <20231018171456.1624030-12-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 8 +++-- drivers/vdpa/mlx5/core/mr.c | 53 ++++++++++++++---------------- drivers/vdpa/mlx5/net/mlx5_vnet.c | 10 ++++-- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index e1e6e7aba50efb..01d4ee58ccb1f2 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -116,10 +116,12 @@ int mlx5_vdpa_create_mkey(struct mlx5_vdpa_dev *mvdev, u32 *mkey, u32 *in, int mlx5_vdpa_destroy_mkey(struct mlx5_vdpa_dev *mvdev, u32 mkey); int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, bool *change_map, unsigned int asid); -int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, - unsigned int asid); +int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *mr, + struct vhost_iotlb *iotlb); void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev); -void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid); +void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *mr); int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid); diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 00dcce190a1fd3..6f29e8eaabb10a 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -301,10 +301,13 @@ static void unmap_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct sg_free_table(&mr->sg_head); } -static int add_direct_chain(struct mlx5_vdpa_dev *mvdev, u64 start, u64 size, u8 perm, +static int add_direct_chain(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *mr, + u64 start, + u64 size, + u8 perm, struct vhost_iotlb *iotlb) { - struct mlx5_vdpa_mr *mr = &mvdev->mr; struct mlx5_vdpa_direct_mr *dmr; struct mlx5_vdpa_direct_mr *n; LIST_HEAD(tmp); @@ -354,9 +357,10 @@ static int add_direct_chain(struct mlx5_vdpa_dev *mvdev, u64 start, u64 size, u8 * indirect memory key that provides access to the enitre address space given * by iotlb. */ -static int create_user_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb) +static int create_user_mr(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *mr, + struct vhost_iotlb *iotlb) { - struct mlx5_vdpa_mr *mr = &mvdev->mr; struct mlx5_vdpa_direct_mr *dmr; struct mlx5_vdpa_direct_mr *n; struct vhost_iotlb_map *map; @@ -384,7 +388,7 @@ static int create_user_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb LOG_MAX_KLM_SIZE); mr->num_klms += nnuls; } - err = add_direct_chain(mvdev, ps, pe - ps, pperm, iotlb); + err = add_direct_chain(mvdev, mr, ps, pe - ps, pperm, iotlb); if (err) goto err_chain; } @@ -393,7 +397,7 @@ static int create_user_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb pperm = map->perm; } } - err = add_direct_chain(mvdev, ps, pe - ps, pperm, iotlb); + err = add_direct_chain(mvdev, mr, ps, pe - ps, pperm, iotlb); if (err) goto err_chain; @@ -489,13 +493,8 @@ static void destroy_user_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr } } -static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) +static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr) { - struct mlx5_vdpa_mr *mr = &mvdev->mr; - - if (mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP] != asid) - return; - if (!mr->initialized) return; @@ -507,38 +506,33 @@ static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid mr->initialized = false; } -void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) +void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *mr) { - struct mlx5_vdpa_mr *mr = &mvdev->mr; - mutex_lock(&mr->mkey_mtx); - _mlx5_vdpa_destroy_mr(mvdev, asid); + _mlx5_vdpa_destroy_mr(mvdev, mr); mutex_unlock(&mr->mkey_mtx); } void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev) { - mlx5_vdpa_destroy_mr(mvdev, mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]); + mlx5_vdpa_destroy_mr(mvdev, &mvdev->mr); prune_iotlb(mvdev); } static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, - struct vhost_iotlb *iotlb, - unsigned int asid) + struct mlx5_vdpa_mr *mr, + struct vhost_iotlb *iotlb) { - struct mlx5_vdpa_mr *mr = &mvdev->mr; int err; - if (mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP] != asid) - return 0; - if (mr->initialized) return 0; if (iotlb) - err = create_user_mr(mvdev, iotlb); + err = create_user_mr(mvdev, mr, iotlb); else err = create_dma_mr(mvdev, mr); @@ -550,13 +544,14 @@ static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, return 0; } -int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, - unsigned int asid) +int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *mr, + struct vhost_iotlb *iotlb) { int err; mutex_lock(&mvdev->mr.mkey_mtx); - err = _mlx5_vdpa_create_mr(mvdev, iotlb, asid); + err = _mlx5_vdpa_create_mr(mvdev, mr, iotlb); mutex_unlock(&mvdev->mr.mkey_mtx); return err; } @@ -574,7 +569,7 @@ int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *io *change_map = true; } if (!*change_map) - err = _mlx5_vdpa_create_mr(mvdev, iotlb, asid); + err = _mlx5_vdpa_create_mr(mvdev, mr, iotlb); mutex_unlock(&mr->mkey_mtx); return err; @@ -603,7 +598,7 @@ int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev) { int err; - err = mlx5_vdpa_create_mr(mvdev, NULL, 0); + err = mlx5_vdpa_create_mr(mvdev, &mvdev->mr, NULL); if (err) return err; diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index 9b7eeaf60013f5..8c61f0eeba5000 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -2690,8 +2690,8 @@ static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, goto err_mr; teardown_driver(ndev); - mlx5_vdpa_destroy_mr(mvdev, asid); - err = mlx5_vdpa_create_mr(mvdev, iotlb, asid); + mlx5_vdpa_destroy_mr(mvdev, &mvdev->mr); + err = mlx5_vdpa_create_mr(mvdev, &mvdev->mr, iotlb); if (err) goto err_mr; @@ -2706,7 +2706,7 @@ static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, return 0; err_setup: - mlx5_vdpa_destroy_mr(mvdev, asid); + mlx5_vdpa_destroy_mr(mvdev, &mvdev->mr); err_mr: return err; } @@ -2928,6 +2928,9 @@ static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, bool change_map; int err; + if (mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP] != asid) + goto end; + err = mlx5_vdpa_handle_set_map(mvdev, iotlb, &change_map, asid); if (err) { mlx5_vdpa_warn(mvdev, "set map failed(%d)\n", err); @@ -2940,6 +2943,7 @@ static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, return err; } +end: return mlx5_vdpa_update_cvq_iotlb(mvdev, iotlb, asid); } From f9fcb38e25ee6c7e0d2fe1b2a83ae4c0e6e3cca8 Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:50 +0300 Subject: [PATCH 261/515] vdpa/mlx5: Move mr mutex out of mr struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mutex is named like it is supposed to protect only the mkey but in reality it is a global lock for all mr resources. Shift the mutex to it's rightful location (struct mlx5_vdpa_dev) and give it a more appropriate name. Signed-off-by: Dragos Tatulea Acked-by: Eugenio Pérez Acked-by: Jason Wang Message-Id: <20231018171456.1624030-13-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 4 ++-- drivers/vdpa/mlx5/core/mr.c | 13 +++++++------ drivers/vdpa/mlx5/core/resources.c | 6 +++--- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index 01d4ee58ccb1f2..9c6ac42c21e1ea 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -34,8 +34,6 @@ struct mlx5_vdpa_mr { /* state of dvq mr */ bool initialized; - /* serialize mkey creation and destruction */ - struct mutex mkey_mtx; bool user_mr; }; @@ -94,6 +92,8 @@ struct mlx5_vdpa_dev { u32 generation; struct mlx5_vdpa_mr mr; + /* serialize mr access */ + struct mutex mr_mtx; struct mlx5_control_vq cvq; struct workqueue_struct *wq; unsigned int group2asid[MLX5_VDPA_NUMVQ_GROUPS]; diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 6f29e8eaabb10a..abd6a6fb122f8c 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -509,11 +509,11 @@ static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_ void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr) { - mutex_lock(&mr->mkey_mtx); + mutex_lock(&mvdev->mr_mtx); _mlx5_vdpa_destroy_mr(mvdev, mr); - mutex_unlock(&mr->mkey_mtx); + mutex_unlock(&mvdev->mr_mtx); } void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev) @@ -550,9 +550,10 @@ int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, { int err; - mutex_lock(&mvdev->mr.mkey_mtx); + mutex_lock(&mvdev->mr_mtx); err = _mlx5_vdpa_create_mr(mvdev, mr, iotlb); - mutex_unlock(&mvdev->mr.mkey_mtx); + mutex_unlock(&mvdev->mr_mtx); + return err; } @@ -563,14 +564,14 @@ int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *io int err = 0; *change_map = false; - mutex_lock(&mr->mkey_mtx); + mutex_lock(&mvdev->mr_mtx); if (mr->initialized) { mlx5_vdpa_info(mvdev, "memory map update\n"); *change_map = true; } if (!*change_map) err = _mlx5_vdpa_create_mr(mvdev, mr, iotlb); - mutex_unlock(&mr->mkey_mtx); + mutex_unlock(&mvdev->mr_mtx); return err; } diff --git a/drivers/vdpa/mlx5/core/resources.c b/drivers/vdpa/mlx5/core/resources.c index d5a59c9035fbed..5c5a41b64bfcd6 100644 --- a/drivers/vdpa/mlx5/core/resources.c +++ b/drivers/vdpa/mlx5/core/resources.c @@ -256,7 +256,7 @@ int mlx5_vdpa_alloc_resources(struct mlx5_vdpa_dev *mvdev) mlx5_vdpa_warn(mvdev, "resources already allocated\n"); return -EINVAL; } - mutex_init(&mvdev->mr.mkey_mtx); + mutex_init(&mvdev->mr_mtx); res->uar = mlx5_get_uars_page(mdev); if (IS_ERR(res->uar)) { err = PTR_ERR(res->uar); @@ -301,7 +301,7 @@ int mlx5_vdpa_alloc_resources(struct mlx5_vdpa_dev *mvdev) err_uctx: mlx5_put_uars_page(mdev, res->uar); err_uars: - mutex_destroy(&mvdev->mr.mkey_mtx); + mutex_destroy(&mvdev->mr_mtx); return err; } @@ -318,6 +318,6 @@ void mlx5_vdpa_free_resources(struct mlx5_vdpa_dev *mvdev) dealloc_pd(mvdev, res->pdn, res->uid); destroy_uctx(mvdev, res->uid); mlx5_put_uars_page(mvdev->mdev, res->uar); - mutex_destroy(&mvdev->mr.mkey_mtx); + mutex_destroy(&mvdev->mr_mtx); res->valid = false; } From 51f9574a33a5882a1fd45412aed44b79042c6dfd Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:51 +0300 Subject: [PATCH 262/515] vdpa/mlx5: Improve mr update flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current flow for updating an mr works directly on mvdev->mr which makes it cumbersome to handle multiple new mr structs. This patch makes the flow more straightforward by having mlx5_vdpa_create_mr return a new mr which will update the old mr (if any). The old mr will be deleted and unlinked from mvdev. For the case when the iotlb is empty (not NULL), the old mr will be cleared. This change paves the way for adding mrs for different ASIDs. The initialized bool is no longer needed as mr is now a pointer in the mlx5_vdpa_dev struct which will be NULL when not initialized. Acked-by: Eugenio Pérez Acked-by: Jason Wang Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-14-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 14 +++-- drivers/vdpa/mlx5/core/mr.c | 87 ++++++++++++++++-------------- drivers/vdpa/mlx5/net/mlx5_vnet.c | 53 +++++++++--------- 3 files changed, 82 insertions(+), 72 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index 9c6ac42c21e1ea..bbe4335106bd26 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -31,8 +31,6 @@ struct mlx5_vdpa_mr { struct list_head head; unsigned long num_directs; unsigned long num_klms; - /* state of dvq mr */ - bool initialized; bool user_mr; }; @@ -91,7 +89,7 @@ struct mlx5_vdpa_dev { u16 max_idx; u32 generation; - struct mlx5_vdpa_mr mr; + struct mlx5_vdpa_mr *mr; /* serialize mr access */ struct mutex mr_mtx; struct mlx5_control_vq cvq; @@ -114,14 +112,14 @@ void mlx5_vdpa_free_resources(struct mlx5_vdpa_dev *mvdev); int mlx5_vdpa_create_mkey(struct mlx5_vdpa_dev *mvdev, u32 *mkey, u32 *in, int inlen); int mlx5_vdpa_destroy_mkey(struct mlx5_vdpa_dev *mvdev, u32 mkey); -int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, - bool *change_map, unsigned int asid); -int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, - struct mlx5_vdpa_mr *mr, - struct vhost_iotlb *iotlb); +struct mlx5_vdpa_mr *mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, + struct vhost_iotlb *iotlb); void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev); void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr); +void mlx5_vdpa_update_mr(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *mr, + unsigned int asid); int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid); diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index abd6a6fb122f8c..00eff5a07152d0 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -495,30 +495,51 @@ static void destroy_user_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr) { - if (!mr->initialized) - return; - if (mr->user_mr) destroy_user_mr(mvdev, mr); else destroy_dma_mr(mvdev, mr); - - mr->initialized = false; } void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr) { + if (!mr) + return; + mutex_lock(&mvdev->mr_mtx); _mlx5_vdpa_destroy_mr(mvdev, mr); + if (mvdev->mr == mr) + mvdev->mr = NULL; + + mutex_unlock(&mvdev->mr_mtx); + + kfree(mr); +} + +void mlx5_vdpa_update_mr(struct mlx5_vdpa_dev *mvdev, + struct mlx5_vdpa_mr *new_mr, + unsigned int asid) +{ + struct mlx5_vdpa_mr *old_mr = mvdev->mr; + + mutex_lock(&mvdev->mr_mtx); + + mvdev->mr = new_mr; + if (old_mr) { + _mlx5_vdpa_destroy_mr(mvdev, old_mr); + kfree(old_mr); + } + mutex_unlock(&mvdev->mr_mtx); + } void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev) { - mlx5_vdpa_destroy_mr(mvdev, &mvdev->mr); + mlx5_vdpa_destroy_mr(mvdev, mvdev->mr); prune_iotlb(mvdev); } @@ -528,52 +549,36 @@ static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, { int err; - if (mr->initialized) - return 0; - if (iotlb) err = create_user_mr(mvdev, mr, iotlb); else err = create_dma_mr(mvdev, mr); - if (err) - return err; - - mr->initialized = true; - - return 0; + return err; } -int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, - struct mlx5_vdpa_mr *mr, - struct vhost_iotlb *iotlb) +struct mlx5_vdpa_mr *mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, + struct vhost_iotlb *iotlb) { + struct mlx5_vdpa_mr *mr; int err; + mr = kzalloc(sizeof(*mr), GFP_KERNEL); + if (!mr) + return ERR_PTR(-ENOMEM); + mutex_lock(&mvdev->mr_mtx); err = _mlx5_vdpa_create_mr(mvdev, mr, iotlb); mutex_unlock(&mvdev->mr_mtx); - return err; -} - -int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, - bool *change_map, unsigned int asid) -{ - struct mlx5_vdpa_mr *mr = &mvdev->mr; - int err = 0; + if (err) + goto out_err; - *change_map = false; - mutex_lock(&mvdev->mr_mtx); - if (mr->initialized) { - mlx5_vdpa_info(mvdev, "memory map update\n"); - *change_map = true; - } - if (!*change_map) - err = _mlx5_vdpa_create_mr(mvdev, mr, iotlb); - mutex_unlock(&mvdev->mr_mtx); + return mr; - return err; +out_err: + kfree(mr); + return ERR_PTR(err); } int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, @@ -597,11 +602,13 @@ int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev) { - int err; + struct mlx5_vdpa_mr *mr; - err = mlx5_vdpa_create_mr(mvdev, &mvdev->mr, NULL); - if (err) - return err; + mr = mlx5_vdpa_create_mr(mvdev, NULL); + if (IS_ERR(mr)) + return PTR_ERR(mr); + + mlx5_vdpa_update_mr(mvdev, mr, 0); return mlx5_vdpa_update_cvq_iotlb(mvdev, NULL, 0); } diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index 8c61f0eeba5000..eba9c99baecaef 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -914,7 +914,7 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr); MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr); MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr); - MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr.mkey); + MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr->mkey); MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id); MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size); MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id); @@ -2679,7 +2679,7 @@ static void restore_channels_info(struct mlx5_vdpa_net *ndev) } static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, - struct vhost_iotlb *iotlb, unsigned int asid) + struct mlx5_vdpa_mr *new_mr, unsigned int asid) { struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev); int err; @@ -2687,27 +2687,18 @@ static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, suspend_vqs(ndev); err = save_channels_info(ndev); if (err) - goto err_mr; + return err; teardown_driver(ndev); - mlx5_vdpa_destroy_mr(mvdev, &mvdev->mr); - err = mlx5_vdpa_create_mr(mvdev, &mvdev->mr, iotlb); - if (err) - goto err_mr; + + mlx5_vdpa_update_mr(mvdev, new_mr, asid); if (!(mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK) || mvdev->suspended) - goto err_mr; + return 0; restore_channels_info(ndev); err = setup_driver(mvdev); - if (err) - goto err_setup; - - return 0; -err_setup: - mlx5_vdpa_destroy_mr(mvdev, &mvdev->mr); -err_mr: return err; } @@ -2925,26 +2916,40 @@ static u32 mlx5_vdpa_get_generation(struct vdpa_device *vdev) static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid) { - bool change_map; + struct mlx5_vdpa_mr *new_mr; int err; if (mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP] != asid) goto end; - err = mlx5_vdpa_handle_set_map(mvdev, iotlb, &change_map, asid); - if (err) { - mlx5_vdpa_warn(mvdev, "set map failed(%d)\n", err); - return err; + if (vhost_iotlb_itree_first(iotlb, 0, U64_MAX)) { + new_mr = mlx5_vdpa_create_mr(mvdev, iotlb); + if (IS_ERR(new_mr)) { + err = PTR_ERR(new_mr); + mlx5_vdpa_warn(mvdev, "create map failed(%d)\n", err); + return err; + } + } else { + /* Empty iotlbs don't have an mr but will clear the previous mr. */ + new_mr = NULL; } - if (change_map) { - err = mlx5_vdpa_change_map(mvdev, iotlb, asid); - if (err) - return err; + if (!mvdev->mr) { + mlx5_vdpa_update_mr(mvdev, new_mr, asid); + } else { + err = mlx5_vdpa_change_map(mvdev, new_mr, asid); + if (err) { + mlx5_vdpa_warn(mvdev, "change map failed(%d)\n", err); + goto out_err; + } } end: return mlx5_vdpa_update_cvq_iotlb(mvdev, iotlb, asid); + +out_err: + mlx5_vdpa_destroy_mr(mvdev, new_mr); + return err; } static int mlx5_vdpa_set_map(struct vdpa_device *vdev, unsigned int asid, From c5c0b1c62ddfa9fa42fd21420e882cb2d53a2f8f Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:52 +0300 Subject: [PATCH 263/515] vdpa/mlx5: Introduce mr for vq descriptor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce the vq descriptor group and mr per ASID. Until now .set_map on ASID 1 was only updating the cvq iotlb. From now on it also creates a mkey for it. The current patch doesn't use it but follow-up patches will add hardware support for mapping the vq descriptors. Acked-by: Jason Wang Acked-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-15-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 5 +++-- drivers/vdpa/mlx5/core/mr.c | 14 +++++++++----- drivers/vdpa/mlx5/net/mlx5_vnet.c | 20 +++++++++++++------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index bbe4335106bd26..ae09296f427039 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -70,11 +70,12 @@ struct mlx5_vdpa_wq_ent { enum { MLX5_VDPA_DATAVQ_GROUP, MLX5_VDPA_CVQ_GROUP, + MLX5_VDPA_DATAVQ_DESC_GROUP, MLX5_VDPA_NUMVQ_GROUPS }; enum { - MLX5_VDPA_NUM_AS = MLX5_VDPA_NUMVQ_GROUPS + MLX5_VDPA_NUM_AS = 2 }; struct mlx5_vdpa_dev { @@ -89,7 +90,7 @@ struct mlx5_vdpa_dev { u16 max_idx; u32 generation; - struct mlx5_vdpa_mr *mr; + struct mlx5_vdpa_mr *mr[MLX5_VDPA_NUM_AS]; /* serialize mr access */ struct mutex mr_mtx; struct mlx5_control_vq cvq; diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 00eff5a07152d0..3dee6d9bed6b50 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -511,8 +511,10 @@ void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, _mlx5_vdpa_destroy_mr(mvdev, mr); - if (mvdev->mr == mr) - mvdev->mr = NULL; + for (int i = 0; i < MLX5_VDPA_NUM_AS; i++) { + if (mvdev->mr[i] == mr) + mvdev->mr[i] = NULL; + } mutex_unlock(&mvdev->mr_mtx); @@ -523,11 +525,11 @@ void mlx5_vdpa_update_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *new_mr, unsigned int asid) { - struct mlx5_vdpa_mr *old_mr = mvdev->mr; + struct mlx5_vdpa_mr *old_mr = mvdev->mr[asid]; mutex_lock(&mvdev->mr_mtx); - mvdev->mr = new_mr; + mvdev->mr[asid] = new_mr; if (old_mr) { _mlx5_vdpa_destroy_mr(mvdev, old_mr); kfree(old_mr); @@ -539,7 +541,9 @@ void mlx5_vdpa_update_mr(struct mlx5_vdpa_dev *mvdev, void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev) { - mlx5_vdpa_destroy_mr(mvdev, mvdev->mr); + for (int i = 0; i < MLX5_VDPA_NUM_AS; i++) + mlx5_vdpa_destroy_mr(mvdev, mvdev->mr[i]); + prune_iotlb(mvdev); } diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index eba9c99baecaef..bf74840aa6fcfc 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -862,6 +862,8 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque { int inlen = MLX5_ST_SZ_BYTES(create_virtio_net_q_in); u32 out[MLX5_ST_SZ_DW(create_virtio_net_q_out)] = {}; + struct mlx5_vdpa_dev *mvdev = &ndev->mvdev; + struct mlx5_vdpa_mr *vq_mr; void *obj_context; u16 mlx_features; void *cmd_hdr; @@ -914,7 +916,9 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr); MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr); MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr); - MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr->mkey); + vq_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]]; + if (vq_mr) + MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, vq_mr->mkey); MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id); MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size); MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id); @@ -2679,7 +2683,8 @@ static void restore_channels_info(struct mlx5_vdpa_net *ndev) } static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, - struct mlx5_vdpa_mr *new_mr, unsigned int asid) + struct mlx5_vdpa_mr *new_mr, + unsigned int asid) { struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev); int err; @@ -2698,8 +2703,10 @@ static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev, restore_channels_info(ndev); err = setup_driver(mvdev); + if (err) + return err; - return err; + return 0; } /* reslock must be held for this function */ @@ -2919,8 +2926,8 @@ static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, struct mlx5_vdpa_mr *new_mr; int err; - if (mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP] != asid) - goto end; + if (asid >= MLX5_VDPA_NUM_AS) + return -EINVAL; if (vhost_iotlb_itree_first(iotlb, 0, U64_MAX)) { new_mr = mlx5_vdpa_create_mr(mvdev, iotlb); @@ -2934,7 +2941,7 @@ static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, new_mr = NULL; } - if (!mvdev->mr) { + if (!mvdev->mr[asid]) { mlx5_vdpa_update_mr(mvdev, new_mr, asid); } else { err = mlx5_vdpa_change_map(mvdev, new_mr, asid); @@ -2944,7 +2951,6 @@ static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, } } -end: return mlx5_vdpa_update_cvq_iotlb(mvdev, iotlb, asid); out_err: From 27e74c63f35e6defda9d2ddecd004c03d6da76b9 Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:53 +0300 Subject: [PATCH 264/515] vdpa/mlx5: Enable hw support for vq descriptor mapping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vq descriptor mappings are supported in hardware by filling in an additional mkey which contains the descriptor mappings to the hw vq. A previous patch in this series added support for hw mkey (mr) creation for ASID 1. This patch fills in both the vq data and vq descriptor mkeys based on group ASID mapping. The feature is signaled to the vdpa core through the presence of the .get_vq_desc_group op. Acked-by: Jason Wang Acked-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-16-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/net/mlx5_vnet.c | 24 +++++++++++++++++++++++- include/linux/mlx5/mlx5_ifc_vdpa.h | 7 ++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index bf74840aa6fcfc..767c5dd14a0535 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -864,6 +864,7 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque u32 out[MLX5_ST_SZ_DW(create_virtio_net_q_out)] = {}; struct mlx5_vdpa_dev *mvdev = &ndev->mvdev; struct mlx5_vdpa_mr *vq_mr; + struct mlx5_vdpa_mr *vq_desc_mr; void *obj_context; u16 mlx_features; void *cmd_hdr; @@ -919,6 +920,11 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque vq_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]]; if (vq_mr) MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, vq_mr->mkey); + + vq_desc_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP]]; + if (vq_desc_mr && MLX5_CAP_DEV_VDPA_EMULATION(mvdev->mdev, desc_group_mkey_supported)) + MLX5_SET(virtio_q, vq_ctx, desc_group_mkey, vq_desc_mr->mkey); + MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id); MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size); MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id); @@ -2306,6 +2312,16 @@ static u32 mlx5_vdpa_get_vq_group(struct vdpa_device *vdev, u16 idx) return MLX5_VDPA_DATAVQ_GROUP; } +static u32 mlx5_vdpa_get_vq_desc_group(struct vdpa_device *vdev, u16 idx) +{ + struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev); + + if (is_ctrl_vq_idx(mvdev, idx)) + return MLX5_VDPA_CVQ_GROUP; + + return MLX5_VDPA_DATAVQ_DESC_GROUP; +} + static u64 mlx_to_vritio_features(u16 dev_features) { u64 result = 0; @@ -3215,6 +3231,7 @@ static const struct vdpa_config_ops mlx5_vdpa_ops = { .get_vq_irq = mlx5_get_vq_irq, .get_vq_align = mlx5_vdpa_get_vq_align, .get_vq_group = mlx5_vdpa_get_vq_group, + .get_vq_desc_group = mlx5_vdpa_get_vq_desc_group, /* Op disabled if not supported. */ .get_device_features = mlx5_vdpa_get_device_features, .get_backend_features = mlx5_vdpa_get_backend_features, .set_driver_features = mlx5_vdpa_set_driver_features, @@ -3314,6 +3331,7 @@ struct mlx5_vdpa_mgmtdev { struct vdpa_mgmt_dev mgtdev; struct mlx5_adev *madev; struct mlx5_vdpa_net *ndev; + struct vdpa_config_ops vdpa_ops; }; static int config_func_mtu(struct mlx5_core_dev *mdev, u16 mtu) @@ -3427,7 +3445,7 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name, max_vqs = 2; } - ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops, + ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mgtdev->vdpa_ops, MLX5_VDPA_NUMVQ_GROUPS, MLX5_VDPA_NUM_AS, name, false); if (IS_ERR(ndev)) return PTR_ERR(ndev); @@ -3600,6 +3618,10 @@ static int mlx5v_probe(struct auxiliary_device *adev, MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues) + 1; mgtdev->mgtdev.supported_features = get_supported_features(mdev); mgtdev->madev = madev; + mgtdev->vdpa_ops = mlx5_vdpa_ops; + + if (!MLX5_CAP_DEV_VDPA_EMULATION(mdev, desc_group_mkey_supported)) + mgtdev->vdpa_ops.get_vq_desc_group = NULL; err = vdpa_mgmtdev_register(&mgtdev->mgtdev); if (err) diff --git a/include/linux/mlx5/mlx5_ifc_vdpa.h b/include/linux/mlx5/mlx5_ifc_vdpa.h index 9becdc3fa5034b..b86d51a855f670 100644 --- a/include/linux/mlx5/mlx5_ifc_vdpa.h +++ b/include/linux/mlx5/mlx5_ifc_vdpa.h @@ -74,7 +74,11 @@ struct mlx5_ifc_virtio_q_bits { u8 reserved_at_320[0x8]; u8 pd[0x18]; - u8 reserved_at_340[0xc0]; + u8 reserved_at_340[0x20]; + + u8 desc_group_mkey[0x20]; + + u8 reserved_at_380[0x80]; }; struct mlx5_ifc_virtio_net_q_object_bits { @@ -141,6 +145,7 @@ enum { MLX5_VIRTQ_MODIFY_MASK_STATE = (u64)1 << 0, MLX5_VIRTQ_MODIFY_MASK_DIRTY_BITMAP_PARAMS = (u64)1 << 3, MLX5_VIRTQ_MODIFY_MASK_DIRTY_BITMAP_DUMP_ENABLE = (u64)1 << 4, + MLX5_VIRTQ_MODIFY_MASK_DESC_GROUP_MKEY = (u64)1 << 14, }; enum { From bc14151b70dcede797b881316b16ddf9f616d6ea Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:54 +0300 Subject: [PATCH 265/515] vdpa/mlx5: Make iotlb helper functions more generic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit They will be used in a follow-up patch. For dup_iotlb, avoid the src == dst case. This is an error. Acked-by: Jason Wang Acked-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-17-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mr.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 3dee6d9bed6b50..4a3df865df40b2 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -454,20 +454,23 @@ static void destroy_dma_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr) mlx5_vdpa_destroy_mkey(mvdev, mr->mkey); } -static int dup_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *src) +static int dup_iotlb(struct vhost_iotlb *dst, struct vhost_iotlb *src) { struct vhost_iotlb_map *map; u64 start = 0, last = ULLONG_MAX; int err; + if (dst == src) + return -EINVAL; + if (!src) { - err = vhost_iotlb_add_range(mvdev->cvq.iotlb, start, last, start, VHOST_ACCESS_RW); + err = vhost_iotlb_add_range(dst, start, last, start, VHOST_ACCESS_RW); return err; } for (map = vhost_iotlb_itree_first(src, start, last); map; map = vhost_iotlb_itree_next(map, start, last)) { - err = vhost_iotlb_add_range(mvdev->cvq.iotlb, map->start, map->last, + err = vhost_iotlb_add_range(dst, map->start, map->last, map->addr, map->perm); if (err) return err; @@ -475,9 +478,9 @@ static int dup_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *src) return 0; } -static void prune_iotlb(struct mlx5_vdpa_dev *mvdev) +static void prune_iotlb(struct vhost_iotlb *iotlb) { - vhost_iotlb_del_range(mvdev->cvq.iotlb, 0, ULLONG_MAX); + vhost_iotlb_del_range(iotlb, 0, ULLONG_MAX); } static void destroy_user_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr) @@ -544,7 +547,7 @@ void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev) for (int i = 0; i < MLX5_VDPA_NUM_AS; i++) mlx5_vdpa_destroy_mr(mvdev, mvdev->mr[i]); - prune_iotlb(mvdev); + prune_iotlb(mvdev->cvq.iotlb); } static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, @@ -596,8 +599,8 @@ int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, spin_lock(&mvdev->cvq.iommu_lock); - prune_iotlb(mvdev); - err = dup_iotlb(mvdev, iotlb); + prune_iotlb(mvdev->cvq.iotlb); + err = dup_iotlb(mvdev->cvq.iotlb, iotlb); spin_unlock(&mvdev->cvq.iommu_lock); From 1fcc6eaf5907e2b16c33a55cd6cf529a9abd0db4 Mon Sep 17 00:00:00 2001 From: Dragos Tatulea Date: Wed, 18 Oct 2023 20:14:55 +0300 Subject: [PATCH 266/515] vdpa/mlx5: Update cvq iotlb mapping on ASID change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For the following sequence: - cvq group is in ASID 0 - .set_map(1, cvq_iotlb) - .set_group_asid(cvq_group, 1) ... the cvq mapping from ASID 0 will be used. This is not always correct behaviour. This patch adds support for the above mentioned flow by saving the iotlb on each .set_map and updating the cvq iotlb with it on a cvq group change. Acked-by: Jason Wang Acked-by: Eugenio Pérez Signed-off-by: Dragos Tatulea Message-Id: <20231018171456.1624030-18-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 2 ++ drivers/vdpa/mlx5/core/mr.c | 26 ++++++++++++++++++++++++++ drivers/vdpa/mlx5/net/mlx5_vnet.c | 9 ++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index ae09296f427039..db988ced5a5da1 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -32,6 +32,8 @@ struct mlx5_vdpa_mr { unsigned long num_directs; unsigned long num_klms; + struct vhost_iotlb *iotlb; + bool user_mr; }; diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 4a3df865df40b2..66530e28f32711 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -502,6 +502,8 @@ static void _mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_ destroy_user_mr(mvdev, mr); else destroy_dma_mr(mvdev, mr); + + vhost_iotlb_free(mr->iotlb); } void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev, @@ -561,6 +563,30 @@ static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, else err = create_dma_mr(mvdev, mr); + if (err) + return err; + + mr->iotlb = vhost_iotlb_alloc(0, 0); + if (!mr->iotlb) { + err = -ENOMEM; + goto err_mr; + } + + err = dup_iotlb(mr->iotlb, iotlb); + if (err) + goto err_iotlb; + + return 0; + +err_iotlb: + vhost_iotlb_free(mr->iotlb); + +err_mr: + if (iotlb) + destroy_user_mr(mvdev, mr); + else + destroy_dma_mr(mvdev, mr); + return err; } diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index 767c5dd14a0535..f4516a2d5bb0dd 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -3209,12 +3209,19 @@ static int mlx5_set_group_asid(struct vdpa_device *vdev, u32 group, unsigned int asid) { struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev); + int err = 0; if (group >= MLX5_VDPA_NUMVQ_GROUPS) return -EINVAL; mvdev->group2asid[group] = asid; - return 0; + + mutex_lock(&mvdev->mr_mtx); + if (group == MLX5_VDPA_CVQ_GROUP && mvdev->mr[asid]) + err = mlx5_vdpa_update_cvq_iotlb(mvdev, mvdev->mr[asid]->iotlb, asid); + mutex_unlock(&mvdev->mr_mtx); + + return err; } static const struct vdpa_config_ops mlx5_vdpa_ops = { From 28f028cea96d28101a8658b2b9e49c84be875284 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 18 Oct 2023 17:29:24 +0200 Subject: [PATCH 267/515] fs: Avoid grabbing sb->s_umount under bdev->bd_holder_lock The implementation of bdev holder operations such as fs_bdev_mark_dead() and fs_bdev_sync() grab sb->s_umount semaphore under bdev->bd_holder_lock. This is problematic because it leads to disk->open_mutex -> sb->s_umount lock ordering which is counterintuitive (usually we grab higher level (e.g. filesystem) locks first and lower level (e.g. block layer) locks later) and indeed makes lockdep complain about possible locking cycles whenever we open a block device while holding sb->s_umount semaphore. Implement a function bdev_super_lock_shared() which safely transitions from holding bdev->bd_holder_lock to holding sb->s_umount on alive superblock without introducing the problematic lock dependency. We use this function fs_bdev_sync() and fs_bdev_mark_dead(). Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20231018152924.3858-1-jack@suse.cz Link: https://lore.kernel.org/r/20231017184823.1383356-1-hch@lst.de Reviewed-by: Christoph Hellwig Signed-off-by: Christian Brauner --- block/bdev.c | 5 +++-- block/ioctl.c | 5 +++-- fs/super.c | 50 ++++++++++++++++++++++++++++++++------------------ 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/block/bdev.c b/block/bdev.c index 4628dcb1da8a58..9838085102b3c5 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -1012,9 +1012,10 @@ void bdev_mark_dead(struct block_device *bdev, bool surprise) mutex_lock(&bdev->bd_holder_lock); if (bdev->bd_holder_ops && bdev->bd_holder_ops->mark_dead) bdev->bd_holder_ops->mark_dead(bdev, surprise); - else + else { + mutex_unlock(&bdev->bd_holder_lock); sync_blockdev(bdev); - mutex_unlock(&bdev->bd_holder_lock); + } invalidate_bdev(bdev); } diff --git a/block/ioctl.c b/block/ioctl.c index 5d356c96435204..4160f4e6bd5b4b 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -370,9 +370,10 @@ static int blkdev_flushbuf(struct block_device *bdev, unsigned cmd, mutex_lock(&bdev->bd_holder_lock); if (bdev->bd_holder_ops && bdev->bd_holder_ops->sync) bdev->bd_holder_ops->sync(bdev); - else + else { + mutex_unlock(&bdev->bd_holder_lock); sync_blockdev(bdev); - mutex_unlock(&bdev->bd_holder_lock); + } invalidate_bdev(bdev); return 0; diff --git a/fs/super.c b/fs/super.c index 26b96191e9b3ca..799b8db1931ede 100644 --- a/fs/super.c +++ b/fs/super.c @@ -1419,32 +1419,47 @@ EXPORT_SYMBOL(sget_dev); #ifdef CONFIG_BLOCK /* - * Lock a super block that the callers holds a reference to. + * Lock the superblock that is holder of the bdev. Returns the superblock + * pointer if we successfully locked the superblock and it is alive. Otherwise + * we return NULL and just unlock bdev->bd_holder_lock. * - * The caller needs to ensure that the super_block isn't being freed while - * calling this function, e.g. by holding a lock over the call to this function - * and the place that clears the pointer to the superblock used by this function - * before freeing the superblock. + * The function must be called with bdev->bd_holder_lock and releases it. */ -static bool super_lock_shared_active(struct super_block *sb) +static struct super_block *bdev_super_lock_shared(struct block_device *bdev) + __releases(&bdev->bd_holder_lock) { - bool born = super_lock_shared(sb); + struct super_block *sb = bdev->bd_holder; + bool born; + + lockdep_assert_held(&bdev->bd_holder_lock); + lockdep_assert_not_held(&sb->s_umount); + + /* Make sure sb doesn't go away from under us */ + spin_lock(&sb_lock); + sb->s_count++; + spin_unlock(&sb_lock); + mutex_unlock(&bdev->bd_holder_lock); + born = super_lock_shared(sb); if (!born || !sb->s_root || !(sb->s_flags & SB_ACTIVE)) { super_unlock_shared(sb); - return false; + put_super(sb); + return NULL; } - return true; + /* + * The superblock is active and we hold s_umount, we can drop our + * temporary reference now. + */ + put_super(sb); + return sb; } static void fs_bdev_mark_dead(struct block_device *bdev, bool surprise) { - struct super_block *sb = bdev->bd_holder; - - /* bd_holder_lock ensures that the sb isn't freed */ - lockdep_assert_held(&bdev->bd_holder_lock); + struct super_block *sb; - if (!super_lock_shared_active(sb)) + sb = bdev_super_lock_shared(bdev); + if (!sb) return; if (!surprise) @@ -1459,11 +1474,10 @@ static void fs_bdev_mark_dead(struct block_device *bdev, bool surprise) static void fs_bdev_sync(struct block_device *bdev) { - struct super_block *sb = bdev->bd_holder; - - lockdep_assert_held(&bdev->bd_holder_lock); + struct super_block *sb; - if (!super_lock_shared_active(sb)) + sb = bdev_super_lock_shared(bdev); + if (!sb) return; sync_filesystem(sb); super_unlock_shared(sb); From 8a300dd4535563137d2d088c5a1524e538dadc24 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Tue, 17 Oct 2023 20:48:19 +0200 Subject: [PATCH 268/515] block: simplify bdev_del_partition() BLKPG_DEL_PARTITION refuses to delete partitions that still have openers, i.e., that has an elevated @bdev->bd_openers count. If a device is claimed by setting @bdev->bd_holder and @bdev->bd_holder_ops @bdev->bd_openers and @bdev->bd_holders are incremented. @bdev->bd_openers is effectively guaranteed to be >= @bdev->bd_holders. So as long as @bdev->bd_openers isn't zero we know that this partition is still in active use and that there might still be @bdev->bd_holder and @bdev->bd_holder_ops set. The only current example is @fs_holder_ops for filesystems. But that means bdev_mark_dead() which calls into bdev->bd_holder_ops->mark_dead::fs_bdev_mark_dead() is a nop. As long as there's an elevated @bdev->bd_openers count we can't delete the partition and if there isn't an elevated @bdev->bd_openers count then there's no @bdev->bd_holder or @bdev->bd_holder_ops. So simply open-code what we need to do. This gets rid of one more instance where we acquire s_umount under @disk->open_mutex. Link: https://lore.kernel.org/r/20231016-fototermin-umriss-59f1ea6c1fe6@brauner Reviewed-by: Christoph Hellwig Reviewed-by: Jan Kara Reviewed-by: Jens Axboe Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20231017184823.1383356-2-hch@lst.de Reviewed-by: Ming Lei Signed-off-by: Christian Brauner --- block/partitions/core.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/block/partitions/core.c b/block/partitions/core.c index e137a87f4db0d3..b0585536b407a5 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -485,7 +485,18 @@ int bdev_del_partition(struct gendisk *disk, int partno) if (atomic_read(&part->bd_openers)) goto out_unlock; - delete_partition(part); + /* + * We verified that @part->bd_openers is zero above and so + * @part->bd_holder{_ops} can't be set. And since we hold + * @disk->open_mutex the device can't be claimed by anyone. + * + * So no need to call @part->bd_holder_ops->mark_dead() here. + * Just delete the partition and invalidate it. + */ + + remove_inode_hash(part->bd_inode); + invalidate_bdev(part); + drop_partition(part); ret = 0; out_unlock: mutex_unlock(&disk->open_mutex); From bb8ab7335bd2f55706fd09f5ce431207a746d99a Mon Sep 17 00:00:00 2001 From: Chris Morgan Date: Wed, 18 Oct 2023 10:33:55 -0500 Subject: [PATCH 269/515] clk: rockchip: rk3568: Add PLL rate for 292.5MHz Add support for a PLL rate of 292.5MHz so that the Powkiddy RGB30 panel can run at a requested 60hz (59.96, close enough). I have confirmed this rate fits with all the constraints listed in the TRM for the VPLL (as an integer PLL) in Part 1 "Chapter 2 Clock & Reset Unit (CRU)." Signed-off-by: Chris Morgan Link: https://lore.kernel.org/r/20231018153357.343142-2-macroalpha82@gmail.com Signed-off-by: Heiko Stuebner --- drivers/clk/rockchip/clk-rk3568.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c index 16dabe2b9c47f4..db713e1526cdc3 100644 --- a/drivers/clk/rockchip/clk-rk3568.c +++ b/drivers/clk/rockchip/clk-rk3568.c @@ -72,6 +72,7 @@ static struct rockchip_pll_rate_table rk3568_pll_rates[] = { RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0), RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0), RK3036_PLL_RATE(297000000, 2, 99, 4, 1, 1, 0), + RK3036_PLL_RATE(292500000, 1, 195, 4, 4, 1, 0), RK3036_PLL_RATE(241500000, 2, 161, 4, 2, 1, 0), RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0), RK3036_PLL_RATE(200000000, 1, 100, 3, 4, 1, 0), From ccf59682a0287b81015dc1939203fac70b818c6b Mon Sep 17 00:00:00 2001 From: Chris Morgan Date: Wed, 18 Oct 2023 11:18:46 -0500 Subject: [PATCH 270/515] clk: rockchip: rk3568: Add PLL rate for 115.2MHz Add support for a PLL rate of 115.2MHz so that the Powkiddy RK2023 panel can run at a requested 60hz (59.99, close enough). I have confirmed this rate fits with all the constraints listed in the TRM for the VPLL (as an integer PLL) in Part 1 "Chapter 2 Clock & Reset Unit (CRU)." Signed-off-by: Chris Morgan Link: https://lore.kernel.org/r/20231018161848.346947-4-macroalpha82@gmail.com Signed-off-by: Heiko Stuebner --- drivers/clk/rockchip/clk-rk3568.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c index db713e1526cdc3..bfbcbb7443272b 100644 --- a/drivers/clk/rockchip/clk-rk3568.c +++ b/drivers/clk/rockchip/clk-rk3568.c @@ -79,6 +79,7 @@ static struct rockchip_pll_rate_table rk3568_pll_rates[] = { RK3036_PLL_RATE(148500000, 1, 99, 4, 4, 1, 0), RK3036_PLL_RATE(135000000, 2, 45, 4, 1, 1, 0), RK3036_PLL_RATE(119000000, 3, 119, 4, 2, 1, 0), + RK3036_PLL_RATE(115200000, 1, 24, 5, 1, 1, 0), RK3036_PLL_RATE(108000000, 2, 45, 5, 1, 1, 0), RK3036_PLL_RATE(101000000, 1, 101, 6, 4, 1, 0), RK3036_PLL_RATE(100000000, 1, 150, 6, 6, 1, 0), From 3bd1c0c62bad8ea7f9cc6662e754f77ec8baa46e Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 18 Oct 2023 08:17:11 +0200 Subject: [PATCH 271/515] dt-bindings: soc: rockchip: grf: add rockchip,rk3588-pmugrf Add rockchip,rk3588-pmugrf compatible string. Acked-by: Conor Dooley Signed-off-by: Sascha Hauer Link: https://lore.kernel.org/r/20231018061714.3553817-24-s.hauer@pengutronix.de Signed-off-by: Heiko Stuebner --- Documentation/devicetree/bindings/soc/rockchip/grf.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/soc/rockchip/grf.yaml b/Documentation/devicetree/bindings/soc/rockchip/grf.yaml index e4fa6a07b4fa2c..1309bf5ae0cdd1 100644 --- a/Documentation/devicetree/bindings/soc/rockchip/grf.yaml +++ b/Documentation/devicetree/bindings/soc/rockchip/grf.yaml @@ -233,6 +233,7 @@ allOf: - rockchip,rk3399-grf - rockchip,rk3399-pmugrf - rockchip,rk3568-pmugrf + - rockchip,rk3588-pmugrf - rockchip,rv1108-grf - rockchip,rv1108-pmugrf From c8bc3398b0b2cc04bd1fff88923cf400df8b382d Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Tue, 17 Oct 2023 20:48:20 +0200 Subject: [PATCH 272/515] block: WARN_ON_ONCE() when we remove active partitions The logic for disk->open_partitions is: blkdev_get_by_*() -> bdev_is_partition() -> blkdev_get_part() -> blkdev_get_whole() // bdev_whole->bd_openers++ -> if (part->bd_openers == 0) disk->open_partitions++ part->bd_openers In other words, when we first claim/open a partition we increment disk->open_partitions and only when all part->bd_openers are closed will disk->open_partitions be zero. That should mean that disk->open_partitions is always > 0 as long as there's anyone that has an open partition. So the check for disk->open_partitions should mean that we can never remove an active partition that has a holder and holder ops set. Assert that in the code. The main disk isn't removed so that check doesn't work for disk->part0 which is what we want. After all we only care about partition not about the main disk. Link: https://lore.kernel.org/r/20231017184823.1383356-3-hch@lst.de Reviewed-by: Ming Lei Reviewed-by: Jan Kara Reviewed-by: Jens Axboe Signed-off-by: Christian Brauner --- block/partitions/core.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/block/partitions/core.c b/block/partitions/core.c index b0585536b407a5..f47ffcfdfcec22 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -274,17 +274,6 @@ void drop_partition(struct block_device *part) put_device(&part->bd_device); } -static void delete_partition(struct block_device *part) -{ - /* - * Remove the block device from the inode hash, so that it cannot be - * looked up any more even when openers still hold references. - */ - remove_inode_hash(part->bd_inode); - bdev_mark_dead(part, false); - drop_partition(part); -} - static ssize_t whole_disk_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -674,8 +663,23 @@ int bdev_disk_changed(struct gendisk *disk, bool invalidate) sync_blockdev(disk->part0); invalidate_bdev(disk->part0); - xa_for_each_start(&disk->part_tbl, idx, part, 1) - delete_partition(part); + xa_for_each_start(&disk->part_tbl, idx, part, 1) { + /* + * Remove the block device from the inode hash, so that + * it cannot be looked up any more even when openers + * still hold references. + */ + remove_inode_hash(part->bd_inode); + + /* + * If @disk->open_partitions isn't elevated but there's + * still an active holder of that block device things + * are broken. + */ + WARN_ON_ONCE(atomic_read(&part->bd_openers)); + invalidate_bdev(part); + drop_partition(part); + } clear_bit(GD_NEED_PART_SCAN, &disk->state); /* From 558fbd7f8c7340a7fc9707fa7512ee013a2d6a1b Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 17 Oct 2023 20:48:21 +0200 Subject: [PATCH 273/515] block: move bdev_mark_dead out of disk_check_media_change disk_check_media_change is mostly called from ->open where it makes little sense to mark the file system on the device as dead, as we are just opening it. So instead of calling bdev_mark_dead from disk_check_media_change move it into the few callers that are not in an open instance. This avoid calling into bdev_mark_dead and thus taking s_umount with open_mutex held. Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20231017184823.1383356-4-hch@lst.de Reviewed-by: Ming Lei Reviewed-by: Christian Brauner Reviewed-by: Jan Kara Reviewed-by: Jens Axboe Signed-off-by: Christian Brauner --- block/bdev.c | 9 ++++----- block/disk-events.c | 18 +++++++----------- drivers/block/ataflop.c | 4 +++- drivers/block/floppy.c | 4 +++- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/block/bdev.c b/block/bdev.c index 9838085102b3c5..2018d250e13109 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -1019,14 +1019,13 @@ void bdev_mark_dead(struct block_device *bdev, bool surprise) invalidate_bdev(bdev); } -#ifdef CONFIG_DASD_MODULE /* - * Drivers should not use this directly, but the DASD driver has historically - * had a shutdown to offline mode that doesn't actually remove the gendisk - * that otherwise looks a lot like a safe device removal. + * New drivers should not use this directly. There are some drivers however + * that needs this for historical reasons. For example, the DASD driver has + * historically had a shutdown to offline mode that doesn't actually remove the + * gendisk that otherwise looks a lot like a safe device removal. */ EXPORT_SYMBOL_GPL(bdev_mark_dead); -#endif void sync_bdevs(bool wait) { diff --git a/block/disk-events.c b/block/disk-events.c index 13c3372c465a39..2f697224386aa8 100644 --- a/block/disk-events.c +++ b/block/disk-events.c @@ -266,11 +266,8 @@ static unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask) * disk_check_media_change - check if a removable media has been changed * @disk: gendisk to check * - * Check whether a removable media has been changed, and attempt to free all - * dentries and inodes and invalidates all block device page cache entries in - * that case. - * - * Returns %true if the media has changed, or %false if not. + * Returns %true and marks the disk for a partition rescan whether a removable + * media has been changed, and %false if the media did not change. */ bool disk_check_media_change(struct gendisk *disk) { @@ -278,12 +275,11 @@ bool disk_check_media_change(struct gendisk *disk) events = disk_clear_events(disk, DISK_EVENT_MEDIA_CHANGE | DISK_EVENT_EJECT_REQUEST); - if (!(events & DISK_EVENT_MEDIA_CHANGE)) - return false; - - bdev_mark_dead(disk->part0, true); - set_bit(GD_NEED_PART_SCAN, &disk->state); - return true; + if (events & DISK_EVENT_MEDIA_CHANGE) { + set_bit(GD_NEED_PART_SCAN, &disk->state); + return true; + } + return false; } EXPORT_SYMBOL(disk_check_media_change); diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c index cd738cab725f39..50949207798d2a 100644 --- a/drivers/block/ataflop.c +++ b/drivers/block/ataflop.c @@ -1760,8 +1760,10 @@ static int fd_locked_ioctl(struct block_device *bdev, blk_mode_t mode, /* invalidate the buffer track to force a reread */ BufferDrive = -1; set_bit(drive, &fake_change); - if (disk_check_media_change(disk)) + if (disk_check_media_change(disk)) { + bdev_mark_dead(disk->part0, true); floppy_revalidate(disk); + } return 0; default: return -EINVAL; diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index ea4eb88a2e45f4..11114a5d9e5c46 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3215,8 +3215,10 @@ static int invalidate_drive(struct gendisk *disk) /* invalidate the buffer track to force a reread */ set_bit((long)disk->private_data, &fake_change); process_fd_request(); - if (disk_check_media_change(disk)) + if (disk_check_media_change(disk)) { + bdev_mark_dead(disk->part0, true); floppy_revalidate(disk); + } return 0; } From b55205a24d26077e647032d745d3d42918ea88da Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Tue, 17 Oct 2023 20:48:22 +0200 Subject: [PATCH 274/515] block: assert that we're not holding open_mutex over blk_report_disk_dead blk_report_disk_dead() has the following major callers: (1) del_gendisk() (2) blk_mark_disk_dead() Since del_gendisk() acquires disk->open_mutex it's clear that all callers are assumed to be called without disk->open_mutex held. In turn, blk_report_disk_dead() is called without disk->open_mutex held in del_gendisk(). All callers of blk_mark_disk_dead() call it without disk->open_mutex as well. Ensure that it is clear that blk_report_disk_dead() is called without disk->open_mutex on purpose by asserting it and a comment in the code. Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20231017184823.1383356-5-hch@lst.de Reviewed-by: Ming Lei Reviewed-by: Jan Kara Reviewed-by: Jens Axboe Signed-off-by: Christian Brauner --- block/genhd.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/block/genhd.c b/block/genhd.c index 4a16a424f57d4f..c9d06f72c587e8 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -559,6 +559,13 @@ static void blk_report_disk_dead(struct gendisk *disk, bool surprise) struct block_device *bdev; unsigned long idx; + /* + * On surprise disk removal, bdev_mark_dead() may call into file + * systems below. Make it clear that we're expecting to not hold + * disk->open_mutex. + */ + lockdep_assert_not_held(&disk->open_mutex); + rcu_read_lock(); xa_for_each(&disk->part_tbl, idx, bdev) { if (!kobject_get_unless_zero(&bdev->bd_device.kobj)) From 35851341db86f2258461744ee07e92364f5b7195 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Tue, 17 Oct 2023 20:48:23 +0200 Subject: [PATCH 275/515] fs: assert that open_mutex isn't held over holder ops With recent block level changes we should never be in a situation where we hold disk->open_mutex when calling into these helpers. So assert that in the code. Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20231017184823.1383356-6-hch@lst.de Reviewed-by: Ming Lei Reviewed-by: Jan Kara Reviewed-by: Jens Axboe Signed-off-by: Christian Brauner --- fs/super.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/super.c b/fs/super.c index 799b8db1931ede..c7b452e12e4c88 100644 --- a/fs/super.c +++ b/fs/super.c @@ -1433,6 +1433,7 @@ static struct super_block *bdev_super_lock_shared(struct block_device *bdev) lockdep_assert_held(&bdev->bd_holder_lock); lockdep_assert_not_held(&sb->s_umount); + lockdep_assert_not_held(&bdev->bd_disk->open_mutex); /* Make sure sb doesn't go away from under us */ spin_lock(&sb_lock); From 79ac81458fb58e1bac836450d6c68da1da9911d9 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Wed, 18 Oct 2023 12:26:20 +0200 Subject: [PATCH 276/515] porting: update locking requirements Now that s_umount is never taken under open_mutex update the documentation to say so. Link: https://lore.kernel.org/r/20231017184823.1383356-1-hch@lst.de Signed-off-by: Christian Brauner --- Documentation/filesystems/porting.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Documentation/filesystems/porting.rst b/Documentation/filesystems/porting.rst index 4d05b9862451ea..d69f59700a2335 100644 --- a/Documentation/filesystems/porting.rst +++ b/Documentation/filesystems/porting.rst @@ -1045,3 +1045,10 @@ filesystem type is now moved to a later point when the devices are closed: As this is a VFS level change it has no practical consequences for filesystems other than that all of them must use one of the provided kill_litter_super(), kill_anon_super(), or kill_block_super() helpers. + +--- + +**mandatory** + +Lock ordering has been changed so that s_umount ranks above open_mutex again. +All places where s_umount was taken under open_mutex have been fixed up. From 8f3a620c7830d7b50d32614d48c4b7df7205309a Mon Sep 17 00:00:00 2001 From: Chunyan Zhang Date: Fri, 13 Oct 2023 10:20:10 +0800 Subject: [PATCH 277/515] leds: sc27xx: Move mutex_init() down Move the mutex_init() to avoid redundant mutex_destroy() calls after that for each time the probe fails. Signed-off-by: Chunyan Zhang Reviewed-by: Baolin Wang Link: https://lore.kernel.org/r/20231013022010.854367-1-chunyan.zhang@unisoc.com Signed-off-by: Lee Jones --- drivers/leds/leds-sc27xx-bltc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/leds/leds-sc27xx-bltc.c b/drivers/leds/leds-sc27xx-bltc.c index af1f00a2f3288c..f04db793e8d61c 100644 --- a/drivers/leds/leds-sc27xx-bltc.c +++ b/drivers/leds/leds-sc27xx-bltc.c @@ -296,7 +296,6 @@ static int sc27xx_led_probe(struct platform_device *pdev) return -ENOMEM; platform_set_drvdata(pdev, priv); - mutex_init(&priv->lock); priv->base = base; priv->regmap = dev_get_regmap(dev->parent, NULL); if (!priv->regmap) { @@ -309,13 +308,11 @@ static int sc27xx_led_probe(struct platform_device *pdev) err = of_property_read_u32(child, "reg", ®); if (err) { of_node_put(child); - mutex_destroy(&priv->lock); return err; } if (reg >= SC27XX_LEDS_MAX || priv->leds[reg].active) { of_node_put(child); - mutex_destroy(&priv->lock); return -EINVAL; } @@ -323,6 +320,8 @@ static int sc27xx_led_probe(struct platform_device *pdev) priv->leds[reg].active = true; } + mutex_init(&priv->lock); + err = sc27xx_led_register(dev, priv); if (err) mutex_destroy(&priv->lock); From a775c69e55c92da187c6286a04088acc3827a73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Beh=C3=BAn?= Date: Mon, 16 Oct 2023 16:15:38 +0200 Subject: [PATCH 278/515] leds: turris-omnia: Fix brightness setting and trigger activating MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I have improperly refactored commits 4d5ed2621c24 ("leds: turris-omnia: Make set_brightness() more efficient") and aaf38273cf76 ("leds: turris-omnia: Support HW controlled mode via private trigger") after Lee requested a change in API semantics of the new functions I introduced in commit 28350bc0ac77 ("leds: turris-omnia: Do not use SMBUS calls"). Before the change, the function omnia_cmd_write_u8() returned 0 on success, and afterwards it returned a positive value (number of bytes written). The latter version was applied, but the following commits did not properly account for this change. This results in non-functional LED's .brightness_set_blocking() and trigger's .activate() methods. The main reasoning behind the semantics change was that read/write methods should return the number of read/written bytes on success. It was pointed to me [1] that this is not always true (for example the regmap API does not do so), and since the driver never uses this number of read/written bytes information, I decided to fix this issue by changing the functions to the original semantics (return 0 on success). [1] https://lore.kernel.org/linux-gpio/ZQnn+Gi0xVlsGCYA@smile.fi.intel.com/ Fixes: 28350bc0ac77 ("leds: turris-omnia: Do not use SMBUS calls") Signed-off-by: Marek Behún Link: https://lore.kernel.org/r/20231016141538.30037-1-kabel@kernel.org Signed-off-by: Lee Jones --- drivers/leds/leds-turris-omnia.c | 37 +++++++++++++++++--------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/drivers/leds/leds-turris-omnia.c b/drivers/leds/leds-turris-omnia.c index f27241896970a3..b443f8c989fa35 100644 --- a/drivers/leds/leds-turris-omnia.c +++ b/drivers/leds/leds-turris-omnia.c @@ -60,8 +60,11 @@ struct omnia_leds { static int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd, u8 val) { u8 buf[2] = { cmd, val }; + int ret; + + ret = i2c_master_send(client, buf, sizeof(buf)); - return i2c_master_send(client, buf, sizeof(buf)); + return ret < 0 ? ret : 0; } static int omnia_cmd_read_raw(struct i2c_adapter *adapter, u8 addr, u8 cmd, @@ -81,7 +84,7 @@ static int omnia_cmd_read_raw(struct i2c_adapter *adapter, u8 addr, u8 cmd, ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs)); if (likely(ret == ARRAY_SIZE(msgs))) - return len; + return 0; else if (ret < 0) return ret; else @@ -91,11 +94,11 @@ static int omnia_cmd_read_raw(struct i2c_adapter *adapter, u8 addr, u8 cmd, static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd) { u8 reply; - int ret; + int err; - ret = omnia_cmd_read_raw(client->adapter, client->addr, cmd, &reply, 1); - if (ret < 0) - return ret; + err = omnia_cmd_read_raw(client->adapter, client->addr, cmd, &reply, 1); + if (err) + return err; return reply; } @@ -236,7 +239,7 @@ static void omnia_hwtrig_deactivate(struct led_classdev *cdev) mutex_unlock(&leds->lock); - if (err < 0) + if (err) dev_err(cdev->dev, "Cannot put LED to software mode: %i\n", err); } @@ -302,7 +305,7 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, ret = omnia_cmd_write_u8(client, CMD_LED_MODE, CMD_LED_MODE_LED(led->reg) | CMD_LED_MODE_USER); - if (ret < 0) { + if (ret) { dev_err(dev, "Cannot set LED %pOF to software mode: %i\n", np, ret); return ret; @@ -311,7 +314,7 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led, /* disable the LED */ ret = omnia_cmd_write_u8(client, CMD_LED_STATE, CMD_LED_STATE_LED(led->reg)); - if (ret < 0) { + if (ret) { dev_err(dev, "Cannot set LED %pOF brightness: %i\n", np, ret); return ret; } @@ -364,7 +367,7 @@ static ssize_t brightness_store(struct device *dev, struct device_attribute *a, { struct i2c_client *client = to_i2c_client(dev); unsigned long brightness; - int ret; + int err; if (kstrtoul(buf, 10, &brightness)) return -EINVAL; @@ -372,9 +375,9 @@ static ssize_t brightness_store(struct device *dev, struct device_attribute *a, if (brightness > 100) return -EINVAL; - ret = omnia_cmd_write_u8(client, CMD_LED_SET_BRIGHTNESS, brightness); + err = omnia_cmd_write_u8(client, CMD_LED_SET_BRIGHTNESS, brightness); - return ret < 0 ? ret : count; + return err ?: count; } static DEVICE_ATTR_RW(brightness); @@ -403,7 +406,7 @@ static ssize_t gamma_correction_store(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct omnia_leds *leds = i2c_get_clientdata(client); bool val; - int ret; + int err; if (!leds->has_gamma_correction) return -EOPNOTSUPP; @@ -411,9 +414,9 @@ static ssize_t gamma_correction_store(struct device *dev, if (kstrtobool(buf, &val) < 0) return -EINVAL; - ret = omnia_cmd_write_u8(client, CMD_SET_GAMMA_CORRECTION, val); + err = omnia_cmd_write_u8(client, CMD_SET_GAMMA_CORRECTION, val); - return ret < 0 ? ret : count; + return err ?: count; } static DEVICE_ATTR_RW(gamma_correction); @@ -431,7 +434,7 @@ static int omnia_mcu_get_features(const struct i2c_client *client) err = omnia_cmd_read_raw(client->adapter, OMNIA_MCU_I2C_ADDR, CMD_GET_STATUS_WORD, &reply, sizeof(reply)); - if (err < 0) + if (err) return err; /* Check whether MCU firmware supports the CMD_GET_FEAUTRES command */ @@ -440,7 +443,7 @@ static int omnia_mcu_get_features(const struct i2c_client *client) err = omnia_cmd_read_raw(client->adapter, OMNIA_MCU_I2C_ADDR, CMD_GET_FEATURES, &reply, sizeof(reply)); - if (err < 0) + if (err) return err; return le16_to_cpu(reply); From 0e5bb700df6a6fe36d9487a4e0a82a4c7b1f7b4e Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 16 Oct 2023 18:30:51 +0300 Subject: [PATCH 279/515] leds: core: Refactor led_update_brightness() to use standard pattern The standard conditional pattern is to check for errors first and bail out if any. Refactor led_update_brightness() accordingly. While at it, drop unneeded assignment and return 0 unconditionally on success. Signed-off-by: Andy Shevchenko Acked-by: Denis Osterland-Heim Reviewed-by: Hans de Goede Link: https://lore.kernel.org/r/20231016153051.1409074-1-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/led-core.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c index 742595d923ee36..cedda8204c57d5 100644 --- a/drivers/leds/led-core.c +++ b/drivers/leds/led-core.c @@ -364,17 +364,17 @@ EXPORT_SYMBOL_GPL(led_set_brightness_sync); int led_update_brightness(struct led_classdev *led_cdev) { - int ret = 0; + int ret; if (led_cdev->brightness_get) { ret = led_cdev->brightness_get(led_cdev); - if (ret >= 0) { - led_cdev->brightness = ret; - return 0; - } + if (ret < 0) + return ret; + + led_cdev->brightness = ret; } - return ret; + return 0; } EXPORT_SYMBOL_GPL(led_update_brightness); From 04262082e2c203e6834bf65c7a46e2eadf212c66 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 16 Oct 2023 19:10:00 +0300 Subject: [PATCH 280/515] leds: gpio: Keep driver firmware interface agnostic The of.h is used as a proxy to mod_devicetable, replace former by latter. The commit 2d6180147e92 ("leds: gpio: Configure per-LED pin control") added yet another unneeded OF APIs. Replace with direct use of fwnode. Altogether this makes driver agnostic to the firmware interface in use. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231016161005.1471768-1-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/leds-gpio.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index a6597f0f3eb4d5..debadb48ceda37 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -11,8 +11,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -129,8 +129,8 @@ static int create_gpio_led(const struct gpio_led *template, ret = PTR_ERR(pinctrl); if (ret != -ENODEV) { dev_warn(led_dat->cdev.dev, - "Failed to select %pOF pinctrl: %d\n", - to_of_node(fwnode), ret); + "Failed to select %pfw pinctrl: %d\n", + fwnode, ret); } else { /* pinctrl-%d not present, not an error */ ret = 0; From 36d270892d4733439d3fd5b713ef07029aae1bf4 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 16 Oct 2023 19:10:01 +0300 Subject: [PATCH 281/515] leds: gpio: Utilise PTR_ERR_OR_ZERO() Avoid a boilerplate code by using PTR_ERR_OR_ZERO() in create_gpio_led(). Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231016161005.1471768-2-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/leds-gpio.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index debadb48ceda37..4071cb9eefecbc 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -125,16 +125,13 @@ static int create_gpio_led(const struct gpio_led *template, return ret; pinctrl = devm_pinctrl_get_select_default(led_dat->cdev.dev); - if (IS_ERR(pinctrl)) { - ret = PTR_ERR(pinctrl); - if (ret != -ENODEV) { - dev_warn(led_dat->cdev.dev, - "Failed to select %pfw pinctrl: %d\n", - fwnode, ret); - } else { - /* pinctrl-%d not present, not an error */ - ret = 0; - } + ret = PTR_ERR_OR_ZERO(pinctrl); + /* pinctrl-%d not present, not an error */ + if (ret == -ENODEV) + ret = 0; + if (ret) { + dev_warn(led_dat->cdev.dev, "Failed to select %pfw pinctrl: %d\n", + fwnode, ret); } return ret; From 4c5f908c04fda867c8130087a628a1bccec3fb05 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 16 Oct 2023 19:10:02 +0300 Subject: [PATCH 282/515] leds: gpio: Refactor code to use devm_gpiod_get_index_optional() Instead of checking for the specific error codes, replace devm_gpiod_get_index() with devm_gpiod_get_index_optional(). In this case we just return all errors to the caller and simply check for NULL in case if legacy GPIO is being used. As the result the code is easier to read and maintain. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231016161005.1471768-3-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/leds-gpio.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index 4071cb9eefecbc..7c9c6a93dfd729 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -218,13 +218,13 @@ static struct gpio_desc *gpio_led_get_gpiod(struct device *dev, int idx, * device, this will hit the board file, if any and get * the GPIO from there. */ - gpiod = devm_gpiod_get_index(dev, NULL, idx, GPIOD_OUT_LOW); - if (!IS_ERR(gpiod)) { + gpiod = devm_gpiod_get_index_optional(dev, NULL, idx, GPIOD_OUT_LOW); + if (IS_ERR(gpiod)) + return gpiod; + if (gpiod) { gpiod_set_consumer_name(gpiod, template->name); return gpiod; } - if (PTR_ERR(gpiod) != -ENOENT) - return gpiod; /* * This is the legacy code path for platform code that From 087da384361247adeb894dcb38fbbec8d4d53790 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 16 Oct 2023 19:10:03 +0300 Subject: [PATCH 283/515] leds: gpio: Move temporary variable for struct device to gpio_led_probe() Use temporary variable for struct device in gpio_led_probe() in order to make code neater. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231016161005.1471768-4-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/leds-gpio.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index 7c9c6a93dfd729..fd3f90f95fa244 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -142,9 +142,8 @@ struct gpio_leds_priv { struct gpio_led_data leds[] __counted_by(num_leds); }; -static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev) +static struct gpio_leds_priv *gpio_leds_create(struct device *dev) { - struct device *dev = &pdev->dev; struct fwnode_handle *child; struct gpio_leds_priv *priv; int count, ret; @@ -253,13 +252,13 @@ static struct gpio_desc *gpio_led_get_gpiod(struct device *dev, int idx, static int gpio_led_probe(struct platform_device *pdev) { - struct gpio_led_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct device *dev = &pdev->dev; + struct gpio_led_platform_data *pdata = dev_get_platdata(dev); struct gpio_leds_priv *priv; int i, ret = 0; if (pdata && pdata->num_leds) { - priv = devm_kzalloc(&pdev->dev, struct_size(priv, leds, pdata->num_leds), - GFP_KERNEL); + priv = devm_kzalloc(dev, struct_size(priv, leds, pdata->num_leds), GFP_KERNEL); if (!priv) return -ENOMEM; @@ -272,22 +271,20 @@ static int gpio_led_probe(struct platform_device *pdev) led_dat->gpiod = template->gpiod; else led_dat->gpiod = - gpio_led_get_gpiod(&pdev->dev, - i, template); + gpio_led_get_gpiod(dev, i, template); if (IS_ERR(led_dat->gpiod)) { - dev_info(&pdev->dev, "Skipping unavailable LED gpio %d (%s)\n", + dev_info(dev, "Skipping unavailable LED gpio %d (%s)\n", template->gpio, template->name); continue; } - ret = create_gpio_led(template, led_dat, - &pdev->dev, NULL, + ret = create_gpio_led(template, led_dat, dev, NULL, pdata->gpio_blink_set); if (ret < 0) return ret; } } else { - priv = gpio_leds_create(pdev); + priv = gpio_leds_create(dev); if (IS_ERR(priv)) return PTR_ERR(priv); } From cdae3873bb328fbc690722b76b67f00213c92ade Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 16 Oct 2023 19:10:04 +0300 Subject: [PATCH 284/515] leds: gpio: Remove unneeded assignment The initial ret is not used anywhere, drop the unneeded assignment. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231016161005.1471768-5-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/leds-gpio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index fd3f90f95fa244..d6e8298ffb3e6c 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -255,7 +255,7 @@ static int gpio_led_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct gpio_led_platform_data *pdata = dev_get_platdata(dev); struct gpio_leds_priv *priv; - int i, ret = 0; + int i, ret; if (pdata && pdata->num_leds) { priv = devm_kzalloc(dev, struct_size(priv, leds, pdata->num_leds), GFP_KERNEL); From 1f313de42c4ff9b590f00d747bab25adc0cb011c Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 16 Oct 2023 19:10:05 +0300 Subject: [PATCH 285/515] leds: gpio: Update headers Include headers which we are direct users of, no need to have proxies. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231016161005.1471768-6-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/leds/leds-gpio.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index d6e8298ffb3e6c..710c319ad312bf 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -6,17 +6,21 @@ * Raphael Assenat * Copyright (C) 2008 Freescale Semiconductor, Inc. */ +#include +#include #include #include #include -#include #include #include #include +#include #include #include #include #include +#include + #include "leds.h" struct gpio_led_data { From beeae824299ea6786b2f3fcf8a96796d048eae2c Mon Sep 17 00:00:00 2001 From: zhenwei pi Date: Mon, 4 Sep 2023 14:10:45 +0800 Subject: [PATCH 286/515] virtio-blk: fix implicit overflow on virtio_max_dma_size The following codes have an implicit conversion from size_t to u32: (u32)max_size = (size_t)virtio_max_dma_size(vdev); This may lead overflow, Ex (size_t)4G -> (u32)0. Once virtio_max_dma_size() has a larger size than U32_MAX, use U32_MAX instead. Signed-off-by: zhenwei pi Message-Id: <20230904061045.510460-1-pizhenwei@bytedance.com> Signed-off-by: Michael S. Tsirkin --- drivers/block/virtio_blk.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 1fe011676d070e..4a4b9bad551e8d 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -1313,6 +1313,7 @@ static int virtblk_probe(struct virtio_device *vdev) u16 min_io_size; u8 physical_block_exp, alignment_offset; unsigned int queue_depth; + size_t max_dma_size; if (!vdev->config->get) { dev_err(&vdev->dev, "%s failure: config access disabled\n", @@ -1411,7 +1412,8 @@ static int virtblk_probe(struct virtio_device *vdev) /* No real sector limit. */ blk_queue_max_hw_sectors(q, UINT_MAX); - max_size = virtio_max_dma_size(vdev); + max_dma_size = virtio_max_dma_size(vdev); + max_size = max_dma_size > U32_MAX ? U32_MAX : max_dma_size; /* Host can optionally specify maximum segment size and number of * segments. */ From dc9f4dd7eb5d25f1a4eb7ad46515685bc4c9828e Mon Sep 17 00:00:00 2001 From: Xuan Zhuo Date: Thu, 19 Oct 2023 11:49:02 +0800 Subject: [PATCH 287/515] virtio_pci: add check for common cfg size Some buggy devices, the common cfg size may not match the features. This patch checks the common cfg size for the features(VIRTIO_F_NOTIF_CONFIG_DATA, VIRTIO_F_RING_RESET). When the common cfg size does not match the corresponding feature, we fail the probe and print error message. Signed-off-by: Xuan Zhuo Acked-by: Jason Wang Message-Id: <20231019034902.7346-1-xuanzhuo@linux.alibaba.com> Signed-off-by: Michael S. Tsirkin --- drivers/virtio/virtio_pci_modern.c | 36 ++++++++++++++++++++++++++ drivers/virtio/virtio_pci_modern_dev.c | 2 +- include/linux/virtio_pci_modern.h | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c index d6bb68ba84e54b..ee6a386d250b16 100644 --- a/drivers/virtio/virtio_pci_modern.c +++ b/drivers/virtio/virtio_pci_modern.c @@ -39,6 +39,39 @@ static void vp_transport_features(struct virtio_device *vdev, u64 features) __virtio_set_bit(vdev, VIRTIO_F_RING_RESET); } +static int __vp_check_common_size_one_feature(struct virtio_device *vdev, u32 fbit, + u32 offset, const char *fname) +{ + struct virtio_pci_device *vp_dev = to_vp_device(vdev); + + if (!__virtio_test_bit(vdev, fbit)) + return 0; + + if (likely(vp_dev->mdev.common_len >= offset)) + return 0; + + dev_err(&vdev->dev, + "virtio: common cfg size(%zu) does not match the feature %s\n", + vp_dev->mdev.common_len, fname); + + return -EINVAL; +} + +#define vp_check_common_size_one_feature(vdev, fbit, field) \ + __vp_check_common_size_one_feature(vdev, fbit, \ + offsetofend(struct virtio_pci_modern_common_cfg, field), #fbit) + +static int vp_check_common_size(struct virtio_device *vdev) +{ + if (vp_check_common_size_one_feature(vdev, VIRTIO_F_NOTIF_CONFIG_DATA, queue_notify_data)) + return -EINVAL; + + if (vp_check_common_size_one_feature(vdev, VIRTIO_F_RING_RESET, queue_reset)) + return -EINVAL; + + return 0; +} + /* virtio config->finalize_features() implementation */ static int vp_finalize_features(struct virtio_device *vdev) { @@ -57,6 +90,9 @@ static int vp_finalize_features(struct virtio_device *vdev) return -EINVAL; } + if (vp_check_common_size(vdev)) + return -EINVAL; + vp_modern_set_features(&vp_dev->mdev, vdev->features); return 0; diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c index d312443d656902..e2a1fe7bb66cc9 100644 --- a/drivers/virtio/virtio_pci_modern_dev.c +++ b/drivers/virtio/virtio_pci_modern_dev.c @@ -296,7 +296,7 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev) mdev->common = vp_modern_map_capability(mdev, common, sizeof(struct virtio_pci_common_cfg), 4, 0, sizeof(struct virtio_pci_modern_common_cfg), - NULL, NULL); + &mdev->common_len, NULL); if (!mdev->common) goto err_map_common; mdev->isr = vp_modern_map_capability(mdev, isr, sizeof(u8), 1, diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h index a38c729d197347..d0f2797420f704 100644 --- a/include/linux/virtio_pci_modern.h +++ b/include/linux/virtio_pci_modern.h @@ -45,6 +45,7 @@ struct virtio_pci_modern_device { size_t notify_len; size_t device_len; + size_t common_len; int notify_map_cap; From dc64c3bb2b11945b512b4d020302ea86cf1324ed Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:42 -0700 Subject: [PATCH 288/515] net/socket: Break down __sys_getsockopt Split __sys_getsockopt() into two functions by removing the core logic into a sub-function (do_sock_getsockopt()). This will avoid code duplication when doing the same operation in other callers, for instance. do_sock_getsockopt() will be called by io_uring getsockopt() command operation in the following patch. The same was done for the setsockopt pair. Suggested-by: Martin KaFai Lau Signed-off-by: Breno Leitao Acked-by: Jakub Kicinski Link: https://lore.kernel.org/r/20231016134750.1381153-5-leitao@debian.org Signed-off-by: Jens Axboe --- include/linux/bpf-cgroup.h | 2 +- include/net/sock.h | 4 +-- net/core/sock.c | 8 ----- net/socket.c | 64 ++++++++++++++++++++++++-------------- 4 files changed, 44 insertions(+), 34 deletions(-) diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h index cecfe8c99f280a..ffaca1ab5e8d1f 100644 --- a/include/linux/bpf-cgroup.h +++ b/include/linux/bpf-cgroup.h @@ -378,7 +378,7 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk, ({ \ int __ret = 0; \ if (cgroup_bpf_enabled(CGROUP_GETSOCKOPT)) \ - get_user(__ret, optlen); \ + copy_from_sockptr(&__ret, optlen, sizeof(int)); \ __ret; \ }) diff --git a/include/net/sock.h b/include/net/sock.h index 24fbf71823868b..cffb77aa71abd8 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1869,11 +1869,11 @@ int sock_setsockopt(struct socket *sock, int level, int op, sockptr_t optval, unsigned int optlen); int do_sock_setsockopt(struct socket *sock, bool compat, int level, int optname, sockptr_t optval, int optlen); +int do_sock_getsockopt(struct socket *sock, bool compat, int level, + int optname, sockptr_t optval, sockptr_t optlen); int sk_getsockopt(struct sock *sk, int level, int optname, sockptr_t optval, sockptr_t optlen); -int sock_getsockopt(struct socket *sock, int level, int op, - char __user *optval, int __user *optlen); int sock_gettstamp(struct socket *sock, void __user *userstamp, bool timeval, bool time32); struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len, diff --git a/net/core/sock.c b/net/core/sock.c index 16584e2dd6481a..223eed53fb7dfb 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2010,14 +2010,6 @@ int sk_getsockopt(struct sock *sk, int level, int optname, return 0; } -int sock_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) -{ - return sk_getsockopt(sock->sk, level, optname, - USER_SOCKPTR(optval), - USER_SOCKPTR(optlen)); -} - /* * Initialize an sk_lock. * diff --git a/net/socket.c b/net/socket.c index 63be25d762f6bc..eb69609580269f 100644 --- a/net/socket.c +++ b/net/socket.c @@ -2333,6 +2333,43 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname, INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level, int optname)); +int do_sock_getsockopt(struct socket *sock, bool compat, int level, + int optname, sockptr_t optval, sockptr_t optlen) +{ + int max_optlen __maybe_unused; + const struct proto_ops *ops; + int err; + + err = security_socket_getsockopt(sock, level, optname); + if (err) + return err; + + if (!compat) + max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen); + + ops = READ_ONCE(sock->ops); + if (level == SOL_SOCKET) { + err = sk_getsockopt(sock->sk, level, optname, optval, optlen); + } else if (unlikely(!ops->getsockopt)) { + err = -EOPNOTSUPP; + } else { + if (WARN_ONCE(optval.is_kernel || optlen.is_kernel, + "Invalid argument type")) + return -EOPNOTSUPP; + + err = ops->getsockopt(sock, level, optname, optval.user, + optlen.user); + } + + if (!compat) + err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname, + optval, optlen, max_optlen, + err); + + return err; +} +EXPORT_SYMBOL(do_sock_getsockopt); + /* * Get a socket option. Because we don't know the option lengths we have * to pass a user mode parameter for the protocols to sort out. @@ -2340,37 +2377,18 @@ INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level, int __sys_getsockopt(int fd, int level, int optname, char __user *optval, int __user *optlen) { - int max_optlen __maybe_unused; - const struct proto_ops *ops; int err, fput_needed; struct socket *sock; + bool compat; sock = sockfd_lookup_light(fd, &err, &fput_needed); if (!sock) return err; - err = security_socket_getsockopt(sock, level, optname); - if (err) - goto out_put; + compat = in_compat_syscall(); + err = do_sock_getsockopt(sock, compat, level, optname, + USER_SOCKPTR(optval), USER_SOCKPTR(optlen)); - if (!in_compat_syscall()) - max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen); - - ops = READ_ONCE(sock->ops); - if (level == SOL_SOCKET) - err = sock_getsockopt(sock, level, optname, optval, optlen); - else if (unlikely(!ops->getsockopt)) - err = -EOPNOTSUPP; - else - err = ops->getsockopt(sock, level, optname, optval, - optlen); - - if (!in_compat_syscall()) - err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname, - USER_SOCKPTR(optval), - USER_SOCKPTR(optlen), - max_optlen, err); -out_put: fput_light(sock->file, fput_needed); return err; } From d54a7eeb5f9dc1b44b10175391639d16994ca5e1 Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:43 -0700 Subject: [PATCH 289/515] io_uring/cmd: Pass compat mode in issue_flags Create a new flag to track if the operation is running compat mode. This basically check the context->compat and pass it to the issue_flags, so, it could be queried later in the callbacks. Signed-off-by: Breno Leitao Reviewed-by: Gabriel Krisman Bertazi Link: https://lore.kernel.org/r/20231016134750.1381153-6-leitao@debian.org Signed-off-by: Jens Axboe --- include/linux/io_uring.h | 1 + io_uring/uring_cmd.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/include/linux/io_uring.h b/include/linux/io_uring.h index b4391e0a9bc836..aefb73eeeebff4 100644 --- a/include/linux/io_uring.h +++ b/include/linux/io_uring.h @@ -23,6 +23,7 @@ enum io_uring_cmd_flags { /* set when uring wants to cancel a previously issued command */ IO_URING_F_CANCEL = (1 << 11), + IO_URING_F_COMPAT = (1 << 12), }; /* only top 8 bits of sqe->uring_cmd_flags for kernel internal use */ diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c index 00a5e5621a288a..4bedd633c08c94 100644 --- a/io_uring/uring_cmd.c +++ b/io_uring/uring_cmd.c @@ -175,6 +175,8 @@ int io_uring_cmd(struct io_kiocb *req, unsigned int issue_flags) issue_flags |= IO_URING_F_SQE128; if (ctx->flags & IORING_SETUP_CQE32) issue_flags |= IO_URING_F_CQE32; + if (ctx->compat) + issue_flags |= IO_URING_F_COMPAT; if (ctx->flags & IORING_SETUP_IOPOLL) { if (!file->f_op->uring_cmd_iopoll) return -EOPNOTSUPP; From ee54158fa8a165016ca6d7dd2a99d213d8cb9ef0 Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:44 -0700 Subject: [PATCH 290/515] tools headers: Grab copy of io_uring.h This file will be used by mini_uring.h and allow tests to run without the need of installing liburing to run the tests. This is needed to run io_uring tests in BPF, such as (tools/testing/selftests/bpf/prog_tests/sockopt.c). Signed-off-by: Breno Leitao Link: https://lore.kernel.org/r/20231016134750.1381153-7-leitao@debian.org Signed-off-by: Jens Axboe --- tools/include/uapi/linux/io_uring.h | 757 ++++++++++++++++++++++++++++ 1 file changed, 757 insertions(+) create mode 100644 tools/include/uapi/linux/io_uring.h diff --git a/tools/include/uapi/linux/io_uring.h b/tools/include/uapi/linux/io_uring.h new file mode 100644 index 00000000000000..f1c16f81774200 --- /dev/null +++ b/tools/include/uapi/linux/io_uring.h @@ -0,0 +1,757 @@ +/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT */ +/* + * Header file for the io_uring interface. + * + * Copyright (C) 2019 Jens Axboe + * Copyright (C) 2019 Christoph Hellwig + */ +#ifndef LINUX_IO_URING_H +#define LINUX_IO_URING_H + +#include +#include +/* + * this file is shared with liburing and that has to autodetect + * if linux/time_types.h is available or not, it can + * define UAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H + * if linux/time_types.h is not available + */ +#ifndef UAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * IO submission data structure (Submission Queue Entry) + */ +struct io_uring_sqe { + __u8 opcode; /* type of operation for this sqe */ + __u8 flags; /* IOSQE_ flags */ + __u16 ioprio; /* ioprio for the request */ + __s32 fd; /* file descriptor to do IO on */ + union { + __u64 off; /* offset into file */ + __u64 addr2; + struct { + __u32 cmd_op; + __u32 __pad1; + }; + }; + union { + __u64 addr; /* pointer to buffer or iovecs */ + __u64 splice_off_in; + struct { + __u32 level; + __u32 optname; + }; + }; + __u32 len; /* buffer size or number of iovecs */ + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; /* compatibility */ + __u32 poll32_events; /* word-reversed for BE */ + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + __u32 fadvise_advice; + __u32 splice_flags; + __u32 rename_flags; + __u32 unlink_flags; + __u32 hardlink_flags; + __u32 xattr_flags; + __u32 msg_ring_flags; + __u32 uring_cmd_flags; + __u32 waitid_flags; + __u32 futex_flags; + }; + __u64 user_data; /* data to be passed back at completion time */ + /* pack this to avoid bogus arm OABI complaints */ + union { + /* index into fixed buffers, if used */ + __u16 buf_index; + /* for grouped buffer selection */ + __u16 buf_group; + } __attribute__((packed)); + /* personality to use, if used */ + __u16 personality; + union { + __s32 splice_fd_in; + __u32 file_index; + __u32 optlen; + struct { + __u16 addr_len; + __u16 __pad3[1]; + }; + }; + union { + struct { + __u64 addr3; + __u64 __pad2[1]; + }; + __u64 optval; + /* + * If the ring is initialized with IORING_SETUP_SQE128, then + * this field is used for 80 bytes of arbitrary command data + */ + __u8 cmd[0]; + }; +}; + +/* + * If sqe->file_index is set to this for opcodes that instantiate a new + * direct descriptor (like openat/openat2/accept), then io_uring will allocate + * an available direct descriptor instead of having the application pass one + * in. The picked direct descriptor will be returned in cqe->res, or -ENFILE + * if the space is full. + */ +#define IORING_FILE_INDEX_ALLOC (~0U) + +enum { + IOSQE_FIXED_FILE_BIT, + IOSQE_IO_DRAIN_BIT, + IOSQE_IO_LINK_BIT, + IOSQE_IO_HARDLINK_BIT, + IOSQE_ASYNC_BIT, + IOSQE_BUFFER_SELECT_BIT, + IOSQE_CQE_SKIP_SUCCESS_BIT, +}; + +/* + * sqe->flags + */ +/* use fixed fileset */ +#define IOSQE_FIXED_FILE (1U << IOSQE_FIXED_FILE_BIT) +/* issue after inflight IO */ +#define IOSQE_IO_DRAIN (1U << IOSQE_IO_DRAIN_BIT) +/* links next sqe */ +#define IOSQE_IO_LINK (1U << IOSQE_IO_LINK_BIT) +/* like LINK, but stronger */ +#define IOSQE_IO_HARDLINK (1U << IOSQE_IO_HARDLINK_BIT) +/* always go async */ +#define IOSQE_ASYNC (1U << IOSQE_ASYNC_BIT) +/* select buffer from sqe->buf_group */ +#define IOSQE_BUFFER_SELECT (1U << IOSQE_BUFFER_SELECT_BIT) +/* don't post CQE if request succeeded */ +#define IOSQE_CQE_SKIP_SUCCESS (1U << IOSQE_CQE_SKIP_SUCCESS_BIT) + +/* + * io_uring_setup() flags + */ +#define IORING_SETUP_IOPOLL (1U << 0) /* io_context is polled */ +#define IORING_SETUP_SQPOLL (1U << 1) /* SQ poll thread */ +#define IORING_SETUP_SQ_AFF (1U << 2) /* sq_thread_cpu is valid */ +#define IORING_SETUP_CQSIZE (1U << 3) /* app defines CQ size */ +#define IORING_SETUP_CLAMP (1U << 4) /* clamp SQ/CQ ring sizes */ +#define IORING_SETUP_ATTACH_WQ (1U << 5) /* attach to existing wq */ +#define IORING_SETUP_R_DISABLED (1U << 6) /* start with ring disabled */ +#define IORING_SETUP_SUBMIT_ALL (1U << 7) /* continue submit on error */ +/* + * Cooperative task running. When requests complete, they often require + * forcing the submitter to transition to the kernel to complete. If this + * flag is set, work will be done when the task transitions anyway, rather + * than force an inter-processor interrupt reschedule. This avoids interrupting + * a task running in userspace, and saves an IPI. + */ +#define IORING_SETUP_COOP_TASKRUN (1U << 8) +/* + * If COOP_TASKRUN is set, get notified if task work is available for + * running and a kernel transition would be needed to run it. This sets + * IORING_SQ_TASKRUN in the sq ring flags. Not valid with COOP_TASKRUN. + */ +#define IORING_SETUP_TASKRUN_FLAG (1U << 9) +#define IORING_SETUP_SQE128 (1U << 10) /* SQEs are 128 byte */ +#define IORING_SETUP_CQE32 (1U << 11) /* CQEs are 32 byte */ +/* + * Only one task is allowed to submit requests + */ +#define IORING_SETUP_SINGLE_ISSUER (1U << 12) + +/* + * Defer running task work to get events. + * Rather than running bits of task work whenever the task transitions + * try to do it just before it is needed. + */ +#define IORING_SETUP_DEFER_TASKRUN (1U << 13) + +/* + * Application provides the memory for the rings + */ +#define IORING_SETUP_NO_MMAP (1U << 14) + +/* + * Register the ring fd in itself for use with + * IORING_REGISTER_USE_REGISTERED_RING; return a registered fd index rather + * than an fd. + */ +#define IORING_SETUP_REGISTERED_FD_ONLY (1U << 15) + +/* + * Removes indirection through the SQ index array. + */ +#define IORING_SETUP_NO_SQARRAY (1U << 16) + +enum io_uring_op { + IORING_OP_NOP, + IORING_OP_READV, + IORING_OP_WRITEV, + IORING_OP_FSYNC, + IORING_OP_READ_FIXED, + IORING_OP_WRITE_FIXED, + IORING_OP_POLL_ADD, + IORING_OP_POLL_REMOVE, + IORING_OP_SYNC_FILE_RANGE, + IORING_OP_SENDMSG, + IORING_OP_RECVMSG, + IORING_OP_TIMEOUT, + IORING_OP_TIMEOUT_REMOVE, + IORING_OP_ACCEPT, + IORING_OP_ASYNC_CANCEL, + IORING_OP_LINK_TIMEOUT, + IORING_OP_CONNECT, + IORING_OP_FALLOCATE, + IORING_OP_OPENAT, + IORING_OP_CLOSE, + IORING_OP_FILES_UPDATE, + IORING_OP_STATX, + IORING_OP_READ, + IORING_OP_WRITE, + IORING_OP_FADVISE, + IORING_OP_MADVISE, + IORING_OP_SEND, + IORING_OP_RECV, + IORING_OP_OPENAT2, + IORING_OP_EPOLL_CTL, + IORING_OP_SPLICE, + IORING_OP_PROVIDE_BUFFERS, + IORING_OP_REMOVE_BUFFERS, + IORING_OP_TEE, + IORING_OP_SHUTDOWN, + IORING_OP_RENAMEAT, + IORING_OP_UNLINKAT, + IORING_OP_MKDIRAT, + IORING_OP_SYMLINKAT, + IORING_OP_LINKAT, + IORING_OP_MSG_RING, + IORING_OP_FSETXATTR, + IORING_OP_SETXATTR, + IORING_OP_FGETXATTR, + IORING_OP_GETXATTR, + IORING_OP_SOCKET, + IORING_OP_URING_CMD, + IORING_OP_SEND_ZC, + IORING_OP_SENDMSG_ZC, + IORING_OP_READ_MULTISHOT, + IORING_OP_WAITID, + IORING_OP_FUTEX_WAIT, + IORING_OP_FUTEX_WAKE, + IORING_OP_FUTEX_WAITV, + + /* this goes last, obviously */ + IORING_OP_LAST, +}; + +/* + * sqe->uring_cmd_flags top 8bits aren't available for userspace + * IORING_URING_CMD_FIXED use registered buffer; pass this flag + * along with setting sqe->buf_index. + */ +#define IORING_URING_CMD_FIXED (1U << 0) +#define IORING_URING_CMD_MASK IORING_URING_CMD_FIXED + + +/* + * sqe->fsync_flags + */ +#define IORING_FSYNC_DATASYNC (1U << 0) + +/* + * sqe->timeout_flags + */ +#define IORING_TIMEOUT_ABS (1U << 0) +#define IORING_TIMEOUT_UPDATE (1U << 1) +#define IORING_TIMEOUT_BOOTTIME (1U << 2) +#define IORING_TIMEOUT_REALTIME (1U << 3) +#define IORING_LINK_TIMEOUT_UPDATE (1U << 4) +#define IORING_TIMEOUT_ETIME_SUCCESS (1U << 5) +#define IORING_TIMEOUT_MULTISHOT (1U << 6) +#define IORING_TIMEOUT_CLOCK_MASK (IORING_TIMEOUT_BOOTTIME | IORING_TIMEOUT_REALTIME) +#define IORING_TIMEOUT_UPDATE_MASK (IORING_TIMEOUT_UPDATE | IORING_LINK_TIMEOUT_UPDATE) +/* + * sqe->splice_flags + * extends splice(2) flags + */ +#define SPLICE_F_FD_IN_FIXED (1U << 31) /* the last bit of __u32 */ + +/* + * POLL_ADD flags. Note that since sqe->poll_events is the flag space, the + * command flags for POLL_ADD are stored in sqe->len. + * + * IORING_POLL_ADD_MULTI Multishot poll. Sets IORING_CQE_F_MORE if + * the poll handler will continue to report + * CQEs on behalf of the same SQE. + * + * IORING_POLL_UPDATE Update existing poll request, matching + * sqe->addr as the old user_data field. + * + * IORING_POLL_LEVEL Level triggered poll. + */ +#define IORING_POLL_ADD_MULTI (1U << 0) +#define IORING_POLL_UPDATE_EVENTS (1U << 1) +#define IORING_POLL_UPDATE_USER_DATA (1U << 2) +#define IORING_POLL_ADD_LEVEL (1U << 3) + +/* + * ASYNC_CANCEL flags. + * + * IORING_ASYNC_CANCEL_ALL Cancel all requests that match the given key + * IORING_ASYNC_CANCEL_FD Key off 'fd' for cancelation rather than the + * request 'user_data' + * IORING_ASYNC_CANCEL_ANY Match any request + * IORING_ASYNC_CANCEL_FD_FIXED 'fd' passed in is a fixed descriptor + * IORING_ASYNC_CANCEL_USERDATA Match on user_data, default for no other key + * IORING_ASYNC_CANCEL_OP Match request based on opcode + */ +#define IORING_ASYNC_CANCEL_ALL (1U << 0) +#define IORING_ASYNC_CANCEL_FD (1U << 1) +#define IORING_ASYNC_CANCEL_ANY (1U << 2) +#define IORING_ASYNC_CANCEL_FD_FIXED (1U << 3) +#define IORING_ASYNC_CANCEL_USERDATA (1U << 4) +#define IORING_ASYNC_CANCEL_OP (1U << 5) + +/* + * send/sendmsg and recv/recvmsg flags (sqe->ioprio) + * + * IORING_RECVSEND_POLL_FIRST If set, instead of first attempting to send + * or receive and arm poll if that yields an + * -EAGAIN result, arm poll upfront and skip + * the initial transfer attempt. + * + * IORING_RECV_MULTISHOT Multishot recv. Sets IORING_CQE_F_MORE if + * the handler will continue to report + * CQEs on behalf of the same SQE. + * + * IORING_RECVSEND_FIXED_BUF Use registered buffers, the index is stored in + * the buf_index field. + * + * IORING_SEND_ZC_REPORT_USAGE + * If set, SEND[MSG]_ZC should report + * the zerocopy usage in cqe.res + * for the IORING_CQE_F_NOTIF cqe. + * 0 is reported if zerocopy was actually possible. + * IORING_NOTIF_USAGE_ZC_COPIED if data was copied + * (at least partially). + */ +#define IORING_RECVSEND_POLL_FIRST (1U << 0) +#define IORING_RECV_MULTISHOT (1U << 1) +#define IORING_RECVSEND_FIXED_BUF (1U << 2) +#define IORING_SEND_ZC_REPORT_USAGE (1U << 3) + +/* + * cqe.res for IORING_CQE_F_NOTIF if + * IORING_SEND_ZC_REPORT_USAGE was requested + * + * It should be treated as a flag, all other + * bits of cqe.res should be treated as reserved! + */ +#define IORING_NOTIF_USAGE_ZC_COPIED (1U << 31) + +/* + * accept flags stored in sqe->ioprio + */ +#define IORING_ACCEPT_MULTISHOT (1U << 0) + +/* + * IORING_OP_MSG_RING command types, stored in sqe->addr + */ +enum { + IORING_MSG_DATA, /* pass sqe->len as 'res' and off as user_data */ + IORING_MSG_SEND_FD, /* send a registered fd to another ring */ +}; + +/* + * IORING_OP_MSG_RING flags (sqe->msg_ring_flags) + * + * IORING_MSG_RING_CQE_SKIP Don't post a CQE to the target ring. Not + * applicable for IORING_MSG_DATA, obviously. + */ +#define IORING_MSG_RING_CQE_SKIP (1U << 0) +/* Pass through the flags from sqe->file_index to cqe->flags */ +#define IORING_MSG_RING_FLAGS_PASS (1U << 1) + +/* + * IO completion data structure (Completion Queue Entry) + */ +struct io_uring_cqe { + __u64 user_data; /* sqe->data submission passed back */ + __s32 res; /* result code for this event */ + __u32 flags; + + /* + * If the ring is initialized with IORING_SETUP_CQE32, then this field + * contains 16-bytes of padding, doubling the size of the CQE. + */ + __u64 big_cqe[]; +}; + +/* + * cqe->flags + * + * IORING_CQE_F_BUFFER If set, the upper 16 bits are the buffer ID + * IORING_CQE_F_MORE If set, parent SQE will generate more CQE entries + * IORING_CQE_F_SOCK_NONEMPTY If set, more data to read after socket recv + * IORING_CQE_F_NOTIF Set for notification CQEs. Can be used to distinct + * them from sends. + */ +#define IORING_CQE_F_BUFFER (1U << 0) +#define IORING_CQE_F_MORE (1U << 1) +#define IORING_CQE_F_SOCK_NONEMPTY (1U << 2) +#define IORING_CQE_F_NOTIF (1U << 3) + +enum { + IORING_CQE_BUFFER_SHIFT = 16, +}; + +/* + * Magic offsets for the application to mmap the data it needs + */ +#define IORING_OFF_SQ_RING 0ULL +#define IORING_OFF_CQ_RING 0x8000000ULL +#define IORING_OFF_SQES 0x10000000ULL +#define IORING_OFF_PBUF_RING 0x80000000ULL +#define IORING_OFF_PBUF_SHIFT 16 +#define IORING_OFF_MMAP_MASK 0xf8000000ULL + +/* + * Filled with the offset for mmap(2) + */ +struct io_sqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 user_addr; +}; + +/* + * sq_ring->flags + */ +#define IORING_SQ_NEED_WAKEUP (1U << 0) /* needs io_uring_enter wakeup */ +#define IORING_SQ_CQ_OVERFLOW (1U << 1) /* CQ ring is overflown */ +#define IORING_SQ_TASKRUN (1U << 2) /* task should enter the kernel */ + +struct io_cqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u32 flags; + __u32 resv1; + __u64 user_addr; +}; + +/* + * cq_ring->flags + */ + +/* disable eventfd notifications */ +#define IORING_CQ_EVENTFD_DISABLED (1U << 0) + +/* + * io_uring_enter(2) flags + */ +#define IORING_ENTER_GETEVENTS (1U << 0) +#define IORING_ENTER_SQ_WAKEUP (1U << 1) +#define IORING_ENTER_SQ_WAIT (1U << 2) +#define IORING_ENTER_EXT_ARG (1U << 3) +#define IORING_ENTER_REGISTERED_RING (1U << 4) + +/* + * Passed in for io_uring_setup(2). Copied back with updated info on success + */ +struct io_uring_params { + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 wq_fd; + __u32 resv[3]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +/* + * io_uring_params->features flags + */ +#define IORING_FEAT_SINGLE_MMAP (1U << 0) +#define IORING_FEAT_NODROP (1U << 1) +#define IORING_FEAT_SUBMIT_STABLE (1U << 2) +#define IORING_FEAT_RW_CUR_POS (1U << 3) +#define IORING_FEAT_CUR_PERSONALITY (1U << 4) +#define IORING_FEAT_FAST_POLL (1U << 5) +#define IORING_FEAT_POLL_32BITS (1U << 6) +#define IORING_FEAT_SQPOLL_NONFIXED (1U << 7) +#define IORING_FEAT_EXT_ARG (1U << 8) +#define IORING_FEAT_NATIVE_WORKERS (1U << 9) +#define IORING_FEAT_RSRC_TAGS (1U << 10) +#define IORING_FEAT_CQE_SKIP (1U << 11) +#define IORING_FEAT_LINKED_FILE (1U << 12) +#define IORING_FEAT_REG_REG_RING (1U << 13) + +/* + * io_uring_register(2) opcodes and arguments + */ +enum { + IORING_REGISTER_BUFFERS = 0, + IORING_UNREGISTER_BUFFERS = 1, + IORING_REGISTER_FILES = 2, + IORING_UNREGISTER_FILES = 3, + IORING_REGISTER_EVENTFD = 4, + IORING_UNREGISTER_EVENTFD = 5, + IORING_REGISTER_FILES_UPDATE = 6, + IORING_REGISTER_EVENTFD_ASYNC = 7, + IORING_REGISTER_PROBE = 8, + IORING_REGISTER_PERSONALITY = 9, + IORING_UNREGISTER_PERSONALITY = 10, + IORING_REGISTER_RESTRICTIONS = 11, + IORING_REGISTER_ENABLE_RINGS = 12, + + /* extended with tagging */ + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, + + /* set/clear io-wq thread affinities */ + IORING_REGISTER_IOWQ_AFF = 17, + IORING_UNREGISTER_IOWQ_AFF = 18, + + /* set/get max number of io-wq workers */ + IORING_REGISTER_IOWQ_MAX_WORKERS = 19, + + /* register/unregister io_uring fd with the ring */ + IORING_REGISTER_RING_FDS = 20, + IORING_UNREGISTER_RING_FDS = 21, + + /* register ring based provide buffer group */ + IORING_REGISTER_PBUF_RING = 22, + IORING_UNREGISTER_PBUF_RING = 23, + + /* sync cancelation API */ + IORING_REGISTER_SYNC_CANCEL = 24, + + /* register a range of fixed file slots for automatic slot allocation */ + IORING_REGISTER_FILE_ALLOC_RANGE = 25, + + /* this goes last */ + IORING_REGISTER_LAST, + + /* flag added to the opcode to use a registered ring fd */ + IORING_REGISTER_USE_REGISTERED_RING = 1U << 31 +}; + +/* io-wq worker categories */ +enum { + IO_WQ_BOUND, + IO_WQ_UNBOUND, +}; + +/* deprecated, see struct io_uring_rsrc_update */ +struct io_uring_files_update { + __u32 offset; + __u32 resv; + __aligned_u64 /* __s32 * */ fds; +}; + +/* + * Register a fully sparse file space, rather than pass in an array of all + * -1 file descriptors. + */ +#define IORING_RSRC_REGISTER_SPARSE (1U << 0) + +struct io_uring_rsrc_register { + __u32 nr; + __u32 flags; + __u64 resv2; + __aligned_u64 data; + __aligned_u64 tags; +}; + +struct io_uring_rsrc_update { + __u32 offset; + __u32 resv; + __aligned_u64 data; +}; + +struct io_uring_rsrc_update2 { + __u32 offset; + __u32 resv; + __aligned_u64 data; + __aligned_u64 tags; + __u32 nr; + __u32 resv2; +}; + +/* Skip updating fd indexes set to this value in the fd table */ +#define IORING_REGISTER_FILES_SKIP (-2) + +#define IO_URING_OP_SUPPORTED (1U << 0) + +struct io_uring_probe_op { + __u8 op; + __u8 resv; + __u16 flags; /* IO_URING_OP_* flags */ + __u32 resv2; +}; + +struct io_uring_probe { + __u8 last_op; /* last opcode supported */ + __u8 ops_len; /* length of ops[] array below */ + __u16 resv; + __u32 resv2[3]; + struct io_uring_probe_op ops[]; +}; + +struct io_uring_restriction { + __u16 opcode; + union { + __u8 register_op; /* IORING_RESTRICTION_REGISTER_OP */ + __u8 sqe_op; /* IORING_RESTRICTION_SQE_OP */ + __u8 sqe_flags; /* IORING_RESTRICTION_SQE_FLAGS_* */ + }; + __u8 resv; + __u32 resv2[3]; +}; + +struct io_uring_buf { + __u64 addr; + __u32 len; + __u16 bid; + __u16 resv; +}; + +struct io_uring_buf_ring { + union { + /* + * To avoid spilling into more pages than we need to, the + * ring tail is overlaid with the io_uring_buf->resv field. + */ + struct { + __u64 resv1; + __u32 resv2; + __u16 resv3; + __u16 tail; + }; + __DECLARE_FLEX_ARRAY(struct io_uring_buf, bufs); + }; +}; + +/* + * Flags for IORING_REGISTER_PBUF_RING. + * + * IOU_PBUF_RING_MMAP: If set, kernel will allocate the memory for the ring. + * The application must not set a ring_addr in struct + * io_uring_buf_reg, instead it must subsequently call + * mmap(2) with the offset set as: + * IORING_OFF_PBUF_RING | (bgid << IORING_OFF_PBUF_SHIFT) + * to get a virtual mapping for the ring. + */ +enum { + IOU_PBUF_RING_MMAP = 1, +}; + +/* argument for IORING_(UN)REGISTER_PBUF_RING */ +struct io_uring_buf_reg { + __u64 ring_addr; + __u32 ring_entries; + __u16 bgid; + __u16 flags; + __u64 resv[3]; +}; + +/* + * io_uring_restriction->opcode values + */ +enum { + /* Allow an io_uring_register(2) opcode */ + IORING_RESTRICTION_REGISTER_OP = 0, + + /* Allow an sqe opcode */ + IORING_RESTRICTION_SQE_OP = 1, + + /* Allow sqe flags */ + IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, + + /* Require sqe flags (these flags must be set on each submission) */ + IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, + + IORING_RESTRICTION_LAST +}; + +struct io_uring_getevents_arg { + __u64 sigmask; + __u32 sigmask_sz; + __u32 pad; + __u64 ts; +}; + +/* + * Argument for IORING_REGISTER_SYNC_CANCEL + */ +struct io_uring_sync_cancel_reg { + __u64 addr; + __s32 fd; + __u32 flags; + struct __kernel_timespec timeout; + __u8 opcode; + __u8 pad[7]; + __u64 pad2[3]; +}; + +/* + * Argument for IORING_REGISTER_FILE_ALLOC_RANGE + * The range is specified as [off, off + len) + */ +struct io_uring_file_index_range { + __u32 off; + __u32 len; + __u64 resv; +}; + +struct io_uring_recvmsg_out { + __u32 namelen; + __u32 controllen; + __u32 payloadlen; + __u32 flags; +}; + +/* + * Argument for IORING_OP_URING_CMD when file is a socket + */ +enum { + SOCKET_URING_OP_SIOCINQ = 0, + SOCKET_URING_OP_SIOCOUTQ, + SOCKET_URING_OP_GETSOCKOPT, + SOCKET_URING_OP_SETSOCKOPT, +}; + +#ifdef __cplusplus +} +#endif + +#endif From 1429e50935ded61330cc756a4b89668e8bd97ec4 Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:45 -0700 Subject: [PATCH 291/515] selftests/net: Extract uring helpers to be reusable Instead of defining basic io_uring functions in the test case, move them to a common directory, so, other tests can use them. This simplify the test code and reuse the common liburing infrastructure. This is basically a copy of what we have in io_uring_zerocopy_tx with some minor improvements to make checkpatch happy. A follow-up test will use the same helpers in a BPF sockopt test. Signed-off-by: Breno Leitao Link: https://lore.kernel.org/r/20231016134750.1381153-8-leitao@debian.org Signed-off-by: Jens Axboe --- tools/include/io_uring/mini_liburing.h | 282 ++++++++++++++++++ tools/testing/selftests/net/Makefile | 1 + .../selftests/net/io_uring_zerocopy_tx.c | 268 +---------------- 3 files changed, 285 insertions(+), 266 deletions(-) create mode 100644 tools/include/io_uring/mini_liburing.h diff --git a/tools/include/io_uring/mini_liburing.h b/tools/include/io_uring/mini_liburing.h new file mode 100644 index 00000000000000..9ccb16074eb5e0 --- /dev/null +++ b/tools/include/io_uring/mini_liburing.h @@ -0,0 +1,282 @@ +/* SPDX-License-Identifier: MIT */ + +#include +#include +#include +#include +#include +#include + +struct io_sq_ring { + unsigned int *head; + unsigned int *tail; + unsigned int *ring_mask; + unsigned int *ring_entries; + unsigned int *flags; + unsigned int *array; +}; + +struct io_cq_ring { + unsigned int *head; + unsigned int *tail; + unsigned int *ring_mask; + unsigned int *ring_entries; + struct io_uring_cqe *cqes; +}; + +struct io_uring_sq { + unsigned int *khead; + unsigned int *ktail; + unsigned int *kring_mask; + unsigned int *kring_entries; + unsigned int *kflags; + unsigned int *kdropped; + unsigned int *array; + struct io_uring_sqe *sqes; + + unsigned int sqe_head; + unsigned int sqe_tail; + + size_t ring_sz; +}; + +struct io_uring_cq { + unsigned int *khead; + unsigned int *ktail; + unsigned int *kring_mask; + unsigned int *kring_entries; + unsigned int *koverflow; + struct io_uring_cqe *cqes; + + size_t ring_sz; +}; + +struct io_uring { + struct io_uring_sq sq; + struct io_uring_cq cq; + int ring_fd; +}; + +#if defined(__x86_64) || defined(__i386__) +#define read_barrier() __asm__ __volatile__("":::"memory") +#define write_barrier() __asm__ __volatile__("":::"memory") +#else +#define read_barrier() __sync_synchronize() +#define write_barrier() __sync_synchronize() +#endif + +static inline int io_uring_mmap(int fd, struct io_uring_params *p, + struct io_uring_sq *sq, struct io_uring_cq *cq) +{ + size_t size; + void *ptr; + int ret; + + sq->ring_sz = p->sq_off.array + p->sq_entries * sizeof(unsigned int); + ptr = mmap(0, sq->ring_sz, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQ_RING); + if (ptr == MAP_FAILED) + return -errno; + sq->khead = ptr + p->sq_off.head; + sq->ktail = ptr + p->sq_off.tail; + sq->kring_mask = ptr + p->sq_off.ring_mask; + sq->kring_entries = ptr + p->sq_off.ring_entries; + sq->kflags = ptr + p->sq_off.flags; + sq->kdropped = ptr + p->sq_off.dropped; + sq->array = ptr + p->sq_off.array; + + size = p->sq_entries * sizeof(struct io_uring_sqe); + sq->sqes = mmap(0, size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQES); + if (sq->sqes == MAP_FAILED) { + ret = -errno; +err: + munmap(sq->khead, sq->ring_sz); + return ret; + } + + cq->ring_sz = p->cq_off.cqes + p->cq_entries * sizeof(struct io_uring_cqe); + ptr = mmap(0, cq->ring_sz, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_CQ_RING); + if (ptr == MAP_FAILED) { + ret = -errno; + munmap(sq->sqes, p->sq_entries * sizeof(struct io_uring_sqe)); + goto err; + } + cq->khead = ptr + p->cq_off.head; + cq->ktail = ptr + p->cq_off.tail; + cq->kring_mask = ptr + p->cq_off.ring_mask; + cq->kring_entries = ptr + p->cq_off.ring_entries; + cq->koverflow = ptr + p->cq_off.overflow; + cq->cqes = ptr + p->cq_off.cqes; + return 0; +} + +static inline int io_uring_setup(unsigned int entries, + struct io_uring_params *p) +{ + return syscall(__NR_io_uring_setup, entries, p); +} + +static inline int io_uring_enter(int fd, unsigned int to_submit, + unsigned int min_complete, + unsigned int flags, sigset_t *sig) +{ + return syscall(__NR_io_uring_enter, fd, to_submit, min_complete, + flags, sig, _NSIG / 8); +} + +static inline int io_uring_queue_init(unsigned int entries, + struct io_uring *ring, + unsigned int flags) +{ + struct io_uring_params p; + int fd, ret; + + memset(ring, 0, sizeof(*ring)); + memset(&p, 0, sizeof(p)); + p.flags = flags; + + fd = io_uring_setup(entries, &p); + if (fd < 0) + return fd; + ret = io_uring_mmap(fd, &p, &ring->sq, &ring->cq); + if (!ret) + ring->ring_fd = fd; + else + close(fd); + return ret; +} + +/* Get a sqe */ +static inline struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring) +{ + struct io_uring_sq *sq = &ring->sq; + + if (sq->sqe_tail + 1 - sq->sqe_head > *sq->kring_entries) + return NULL; + return &sq->sqes[sq->sqe_tail++ & *sq->kring_mask]; +} + +static inline int io_uring_wait_cqe(struct io_uring *ring, + struct io_uring_cqe **cqe_ptr) +{ + struct io_uring_cq *cq = &ring->cq; + const unsigned int mask = *cq->kring_mask; + unsigned int head = *cq->khead; + int ret; + + *cqe_ptr = NULL; + do { + read_barrier(); + if (head != *cq->ktail) { + *cqe_ptr = &cq->cqes[head & mask]; + break; + } + ret = io_uring_enter(ring->ring_fd, 0, 1, + IORING_ENTER_GETEVENTS, NULL); + if (ret < 0) + return -errno; + } while (1); + + return 0; +} + +static inline int io_uring_submit(struct io_uring *ring) +{ + struct io_uring_sq *sq = &ring->sq; + const unsigned int mask = *sq->kring_mask; + unsigned int ktail, submitted, to_submit; + int ret; + + read_barrier(); + if (*sq->khead != *sq->ktail) { + submitted = *sq->kring_entries; + goto submit; + } + if (sq->sqe_head == sq->sqe_tail) + return 0; + + ktail = *sq->ktail; + to_submit = sq->sqe_tail - sq->sqe_head; + for (submitted = 0; submitted < to_submit; submitted++) { + read_barrier(); + sq->array[ktail++ & mask] = sq->sqe_head++ & mask; + } + if (!submitted) + return 0; + + if (*sq->ktail != ktail) { + write_barrier(); + *sq->ktail = ktail; + write_barrier(); + } +submit: + ret = io_uring_enter(ring->ring_fd, submitted, 0, + IORING_ENTER_GETEVENTS, NULL); + return ret < 0 ? -errno : ret; +} + +static inline void io_uring_queue_exit(struct io_uring *ring) +{ + struct io_uring_sq *sq = &ring->sq; + + munmap(sq->sqes, *sq->kring_entries * sizeof(struct io_uring_sqe)); + munmap(sq->khead, sq->ring_sz); + close(ring->ring_fd); +} + +/* Prepare and send the SQE */ +static inline void io_uring_prep_cmd(struct io_uring_sqe *sqe, int op, + int sockfd, + int level, int optname, + const void *optval, + int optlen) +{ + memset(sqe, 0, sizeof(*sqe)); + sqe->opcode = (__u8)IORING_OP_URING_CMD; + sqe->fd = sockfd; + sqe->cmd_op = op; + + sqe->level = level; + sqe->optname = optname; + sqe->optval = (unsigned long long)optval; + sqe->optlen = optlen; +} + +static inline int io_uring_register_buffers(struct io_uring *ring, + const struct iovec *iovecs, + unsigned int nr_iovecs) +{ + int ret; + + ret = syscall(__NR_io_uring_register, ring->ring_fd, + IORING_REGISTER_BUFFERS, iovecs, nr_iovecs); + return (ret < 0) ? -errno : ret; +} + +static inline void io_uring_prep_send(struct io_uring_sqe *sqe, int sockfd, + const void *buf, size_t len, int flags) +{ + memset(sqe, 0, sizeof(*sqe)); + sqe->opcode = (__u8)IORING_OP_SEND; + sqe->fd = sockfd; + sqe->addr = (unsigned long)buf; + sqe->len = len; + sqe->msg_flags = (__u32)flags; +} + +static inline void io_uring_prep_sendzc(struct io_uring_sqe *sqe, int sockfd, + const void *buf, size_t len, int flags, + unsigned int zc_flags) +{ + io_uring_prep_send(sqe, sockfd, buf, len, flags); + sqe->opcode = (__u8)IORING_OP_SEND_ZC; + sqe->ioprio = zc_flags; +} + +static inline void io_uring_cqe_seen(struct io_uring *ring) +{ + *(&ring->cq)->khead += 1; + write_barrier(); +} diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index 8b017070960d3f..f8d99837b9dcba 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -98,6 +98,7 @@ $(OUTPUT)/reuseport_bpf_numa: LDLIBS += -lnuma $(OUTPUT)/tcp_mmap: LDLIBS += -lpthread -lcrypto $(OUTPUT)/tcp_inq: LDLIBS += -lpthread $(OUTPUT)/bind_bhash: LDLIBS += -lpthread +$(OUTPUT)/io_uring_zerocopy_tx: CFLAGS += -I../../../include/ # Rules to generate bpf obj nat6to4.o CLANG ?= clang diff --git a/tools/testing/selftests/net/io_uring_zerocopy_tx.c b/tools/testing/selftests/net/io_uring_zerocopy_tx.c index 15428774017261..76e604e4810e12 100644 --- a/tools/testing/selftests/net/io_uring_zerocopy_tx.c +++ b/tools/testing/selftests/net/io_uring_zerocopy_tx.c @@ -36,6 +36,8 @@ #include #include +#include + #define NOTIF_TAG 0xfffffffULL #define NONZC_TAG 0 #define ZC_TAG 1 @@ -60,272 +62,6 @@ static struct sockaddr_storage cfg_dst_addr; static char payload[IP_MAXPACKET] __attribute__((aligned(4096))); -struct io_sq_ring { - unsigned *head; - unsigned *tail; - unsigned *ring_mask; - unsigned *ring_entries; - unsigned *flags; - unsigned *array; -}; - -struct io_cq_ring { - unsigned *head; - unsigned *tail; - unsigned *ring_mask; - unsigned *ring_entries; - struct io_uring_cqe *cqes; -}; - -struct io_uring_sq { - unsigned *khead; - unsigned *ktail; - unsigned *kring_mask; - unsigned *kring_entries; - unsigned *kflags; - unsigned *kdropped; - unsigned *array; - struct io_uring_sqe *sqes; - - unsigned sqe_head; - unsigned sqe_tail; - - size_t ring_sz; -}; - -struct io_uring_cq { - unsigned *khead; - unsigned *ktail; - unsigned *kring_mask; - unsigned *kring_entries; - unsigned *koverflow; - struct io_uring_cqe *cqes; - - size_t ring_sz; -}; - -struct io_uring { - struct io_uring_sq sq; - struct io_uring_cq cq; - int ring_fd; -}; - -#ifdef __alpha__ -# ifndef __NR_io_uring_setup -# define __NR_io_uring_setup 535 -# endif -# ifndef __NR_io_uring_enter -# define __NR_io_uring_enter 536 -# endif -# ifndef __NR_io_uring_register -# define __NR_io_uring_register 537 -# endif -#else /* !__alpha__ */ -# ifndef __NR_io_uring_setup -# define __NR_io_uring_setup 425 -# endif -# ifndef __NR_io_uring_enter -# define __NR_io_uring_enter 426 -# endif -# ifndef __NR_io_uring_register -# define __NR_io_uring_register 427 -# endif -#endif - -#if defined(__x86_64) || defined(__i386__) -#define read_barrier() __asm__ __volatile__("":::"memory") -#define write_barrier() __asm__ __volatile__("":::"memory") -#else - -#define read_barrier() __sync_synchronize() -#define write_barrier() __sync_synchronize() -#endif - -static int io_uring_setup(unsigned int entries, struct io_uring_params *p) -{ - return syscall(__NR_io_uring_setup, entries, p); -} - -static int io_uring_enter(int fd, unsigned int to_submit, - unsigned int min_complete, - unsigned int flags, sigset_t *sig) -{ - return syscall(__NR_io_uring_enter, fd, to_submit, min_complete, - flags, sig, _NSIG / 8); -} - -static int io_uring_register_buffers(struct io_uring *ring, - const struct iovec *iovecs, - unsigned nr_iovecs) -{ - int ret; - - ret = syscall(__NR_io_uring_register, ring->ring_fd, - IORING_REGISTER_BUFFERS, iovecs, nr_iovecs); - return (ret < 0) ? -errno : ret; -} - -static int io_uring_mmap(int fd, struct io_uring_params *p, - struct io_uring_sq *sq, struct io_uring_cq *cq) -{ - size_t size; - void *ptr; - int ret; - - sq->ring_sz = p->sq_off.array + p->sq_entries * sizeof(unsigned); - ptr = mmap(0, sq->ring_sz, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQ_RING); - if (ptr == MAP_FAILED) - return -errno; - sq->khead = ptr + p->sq_off.head; - sq->ktail = ptr + p->sq_off.tail; - sq->kring_mask = ptr + p->sq_off.ring_mask; - sq->kring_entries = ptr + p->sq_off.ring_entries; - sq->kflags = ptr + p->sq_off.flags; - sq->kdropped = ptr + p->sq_off.dropped; - sq->array = ptr + p->sq_off.array; - - size = p->sq_entries * sizeof(struct io_uring_sqe); - sq->sqes = mmap(0, size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQES); - if (sq->sqes == MAP_FAILED) { - ret = -errno; -err: - munmap(sq->khead, sq->ring_sz); - return ret; - } - - cq->ring_sz = p->cq_off.cqes + p->cq_entries * sizeof(struct io_uring_cqe); - ptr = mmap(0, cq->ring_sz, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_CQ_RING); - if (ptr == MAP_FAILED) { - ret = -errno; - munmap(sq->sqes, p->sq_entries * sizeof(struct io_uring_sqe)); - goto err; - } - cq->khead = ptr + p->cq_off.head; - cq->ktail = ptr + p->cq_off.tail; - cq->kring_mask = ptr + p->cq_off.ring_mask; - cq->kring_entries = ptr + p->cq_off.ring_entries; - cq->koverflow = ptr + p->cq_off.overflow; - cq->cqes = ptr + p->cq_off.cqes; - return 0; -} - -static int io_uring_queue_init(unsigned entries, struct io_uring *ring, - unsigned flags) -{ - struct io_uring_params p; - int fd, ret; - - memset(ring, 0, sizeof(*ring)); - memset(&p, 0, sizeof(p)); - p.flags = flags; - - fd = io_uring_setup(entries, &p); - if (fd < 0) - return fd; - ret = io_uring_mmap(fd, &p, &ring->sq, &ring->cq); - if (!ret) - ring->ring_fd = fd; - else - close(fd); - return ret; -} - -static int io_uring_submit(struct io_uring *ring) -{ - struct io_uring_sq *sq = &ring->sq; - const unsigned mask = *sq->kring_mask; - unsigned ktail, submitted, to_submit; - int ret; - - read_barrier(); - if (*sq->khead != *sq->ktail) { - submitted = *sq->kring_entries; - goto submit; - } - if (sq->sqe_head == sq->sqe_tail) - return 0; - - ktail = *sq->ktail; - to_submit = sq->sqe_tail - sq->sqe_head; - for (submitted = 0; submitted < to_submit; submitted++) { - read_barrier(); - sq->array[ktail++ & mask] = sq->sqe_head++ & mask; - } - if (!submitted) - return 0; - - if (*sq->ktail != ktail) { - write_barrier(); - *sq->ktail = ktail; - write_barrier(); - } -submit: - ret = io_uring_enter(ring->ring_fd, submitted, 0, - IORING_ENTER_GETEVENTS, NULL); - return ret < 0 ? -errno : ret; -} - -static inline void io_uring_prep_send(struct io_uring_sqe *sqe, int sockfd, - const void *buf, size_t len, int flags) -{ - memset(sqe, 0, sizeof(*sqe)); - sqe->opcode = (__u8) IORING_OP_SEND; - sqe->fd = sockfd; - sqe->addr = (unsigned long) buf; - sqe->len = len; - sqe->msg_flags = (__u32) flags; -} - -static inline void io_uring_prep_sendzc(struct io_uring_sqe *sqe, int sockfd, - const void *buf, size_t len, int flags, - unsigned zc_flags) -{ - io_uring_prep_send(sqe, sockfd, buf, len, flags); - sqe->opcode = (__u8) IORING_OP_SEND_ZC; - sqe->ioprio = zc_flags; -} - -static struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring) -{ - struct io_uring_sq *sq = &ring->sq; - - if (sq->sqe_tail + 1 - sq->sqe_head > *sq->kring_entries) - return NULL; - return &sq->sqes[sq->sqe_tail++ & *sq->kring_mask]; -} - -static int io_uring_wait_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr) -{ - struct io_uring_cq *cq = &ring->cq; - const unsigned mask = *cq->kring_mask; - unsigned head = *cq->khead; - int ret; - - *cqe_ptr = NULL; - do { - read_barrier(); - if (head != *cq->ktail) { - *cqe_ptr = &cq->cqes[head & mask]; - break; - } - ret = io_uring_enter(ring->ring_fd, 0, 1, - IORING_ENTER_GETEVENTS, NULL); - if (ret < 0) - return -errno; - } while (1); - - return 0; -} - -static inline void io_uring_cqe_seen(struct io_uring *ring) -{ - *(&ring->cq)->khead += 1; - write_barrier(); -} - static unsigned long gettimeofday_ms(void) { struct timeval tv; From a89262fabb715424d0b6c6155d07dfa562437c9d Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:46 -0700 Subject: [PATCH 292/515] io_uring/cmd: return -EOPNOTSUPP if net is disabled Protect io_uring_cmd_sock() to be called if CONFIG_NET is not set. If network is not enabled, but io_uring is, then we want to return -EOPNOTSUPP for any possible socket operation. This is helpful because io_uring_cmd_sock() can now call functions that only exits if CONFIG_NET is enabled without having #ifdef CONFIG_NET inside the function itself. Signed-off-by: Breno Leitao Link: https://lore.kernel.org/r/20231016134750.1381153-9-leitao@debian.org Signed-off-by: Jens Axboe --- io_uring/uring_cmd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c index 4bedd633c08c94..42694c07d8fdd6 100644 --- a/io_uring/uring_cmd.c +++ b/io_uring/uring_cmd.c @@ -214,6 +214,7 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, } EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed); +#if defined(CONFIG_NET) int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) { struct socket *sock = cmd->file->private_data; @@ -240,3 +241,4 @@ int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) } } EXPORT_SYMBOL_GPL(io_uring_cmd_sock); +#endif From 231b8758246eb56d7d1cd779338974118f3f1086 Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:47 -0700 Subject: [PATCH 293/515] io_uring/cmd: Introduce SOCKET_URING_OP_GETSOCKOPT Add support for getsockopt command (SOCKET_URING_OP_GETSOCKOPT), where level is SOL_SOCKET. This is leveraging the sockptr_t infrastructure, where a sockptr_t is either userspace or kernel space, and handled as such. Differently from the getsockopt(2), the optlen field is not a userspace pointers. In getsockopt(2), userspace provides optlen pointer, which is overwritten by the kernel. In this implementation, userspace passes a u32, and the new value is returned in cqe->res. I.e., optlen is not a pointer. Important to say that userspace needs to keep the pointer alive until the CQE is completed. Signed-off-by: Breno Leitao Reviewed-by: Gabriel Krisman Bertazi Link: https://lore.kernel.org/r/20231016134750.1381153-10-leitao@debian.org Signed-off-by: Jens Axboe --- include/uapi/linux/io_uring.h | 7 +++++++ io_uring/uring_cmd.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h index 425f64eee44eda..dcf7272463e9a7 100644 --- a/include/uapi/linux/io_uring.h +++ b/include/uapi/linux/io_uring.h @@ -43,6 +43,10 @@ struct io_uring_sqe { union { __u64 addr; /* pointer to buffer or iovecs */ __u64 splice_off_in; + struct { + __u32 level; + __u32 optname; + }; }; __u32 len; /* buffer size or number of iovecs */ union { @@ -80,6 +84,7 @@ struct io_uring_sqe { union { __s32 splice_fd_in; __u32 file_index; + __u32 optlen; struct { __u16 addr_len; __u16 __pad3[1]; @@ -90,6 +95,7 @@ struct io_uring_sqe { __u64 addr3; __u64 __pad2[1]; }; + __u64 optval; /* * If the ring is initialized with IORING_SETUP_SQE128, then * this field is used for 80 bytes of arbitrary command data @@ -736,6 +742,7 @@ struct io_uring_recvmsg_out { enum { SOCKET_URING_OP_SIOCINQ = 0, SOCKET_URING_OP_SIOCOUTQ, + SOCKET_URING_OP_GETSOCKOPT, }; #ifdef __cplusplus diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c index 42694c07d8fdd6..8b045830b0d9e1 100644 --- a/io_uring/uring_cmd.c +++ b/io_uring/uring_cmd.c @@ -214,6 +214,32 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, } EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed); +static inline int io_uring_cmd_getsockopt(struct socket *sock, + struct io_uring_cmd *cmd, + unsigned int issue_flags) +{ + bool compat = !!(issue_flags & IO_URING_F_COMPAT); + int optlen, optname, level, err; + void __user *optval; + + level = READ_ONCE(cmd->sqe->level); + if (level != SOL_SOCKET) + return -EOPNOTSUPP; + + optval = u64_to_user_ptr(READ_ONCE(cmd->sqe->optval)); + optname = READ_ONCE(cmd->sqe->optname); + optlen = READ_ONCE(cmd->sqe->optlen); + + err = do_sock_getsockopt(sock, compat, level, optname, + USER_SOCKPTR(optval), + KERNEL_SOCKPTR(&optlen)); + if (err) + return err; + + /* On success, return optlen */ + return optlen; +} + #if defined(CONFIG_NET) int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) { @@ -236,6 +262,8 @@ int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) if (ret) return ret; return arg; + case SOCKET_URING_OP_GETSOCKOPT: + return io_uring_cmd_getsockopt(sock, cmd, issue_flags); default: return -EOPNOTSUPP; } From 280822caa49568c22842aea1831474ed4be4cd65 Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:48 -0700 Subject: [PATCH 294/515] io_uring/cmd: Introduce SOCKET_URING_OP_SETSOCKOPT Add initial support for SOCKET_URING_OP_SETSOCKOPT. This new command is similar to setsockopt. This implementation leverages the function do_sock_setsockopt(), which is shared with the setsockopt() system call path. Important to say that userspace needs to keep the pointer's memory alive until the operation is completed. I.e, the memory could not be deallocated before the CQE is returned to userspace. Signed-off-by: Breno Leitao Reviewed-by: Gabriel Krisman Bertazi Link: https://lore.kernel.org/r/20231016134750.1381153-11-leitao@debian.org Signed-off-by: Jens Axboe --- include/uapi/linux/io_uring.h | 1 + io_uring/uring_cmd.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h index dcf7272463e9a7..0f7f6acd0e5abd 100644 --- a/include/uapi/linux/io_uring.h +++ b/include/uapi/linux/io_uring.h @@ -743,6 +743,7 @@ enum { SOCKET_URING_OP_SIOCINQ = 0, SOCKET_URING_OP_SIOCOUTQ, SOCKET_URING_OP_GETSOCKOPT, + SOCKET_URING_OP_SETSOCKOPT, }; #ifdef __cplusplus diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c index 8b045830b0d9e1..acbc2924ecd211 100644 --- a/io_uring/uring_cmd.c +++ b/io_uring/uring_cmd.c @@ -240,6 +240,25 @@ static inline int io_uring_cmd_getsockopt(struct socket *sock, return optlen; } +static inline int io_uring_cmd_setsockopt(struct socket *sock, + struct io_uring_cmd *cmd, + unsigned int issue_flags) +{ + bool compat = !!(issue_flags & IO_URING_F_COMPAT); + int optname, optlen, level; + void __user *optval; + sockptr_t optval_s; + + optval = u64_to_user_ptr(READ_ONCE(cmd->sqe->optval)); + optname = READ_ONCE(cmd->sqe->optname); + optlen = READ_ONCE(cmd->sqe->optlen); + level = READ_ONCE(cmd->sqe->level); + optval_s = USER_SOCKPTR(optval); + + return do_sock_setsockopt(sock, compat, level, optname, optval_s, + optlen); +} + #if defined(CONFIG_NET) int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) { @@ -264,6 +283,8 @@ int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) return arg; case SOCKET_URING_OP_GETSOCKOPT: return io_uring_cmd_getsockopt(sock, cmd, issue_flags); + case SOCKET_URING_OP_SETSOCKOPT: + return io_uring_cmd_setsockopt(sock, cmd, issue_flags); default: return -EOPNOTSUPP; } From 4d88e7a6e15378a7c5e4e6b72c145b772c28854c Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Mon, 16 Oct 2023 06:47:49 -0700 Subject: [PATCH 295/515] selftests/bpf/sockopt: Add io_uring support Expand the sockopt test to use also check for io_uring {g,s}etsockopt commands operations. This patch starts by marking each test if they support io_uring support or not. Right now, io_uring cmd getsockopt() has a limitation of only accepting level == SOL_SOCKET, otherwise it returns -EOPNOTSUPP. Since there aren't any test exercising getsockopt(level == SOL_SOCKET), this patch changes two tests to use level == SOL_SOCKET, they are "getsockopt: support smaller ctx->optlen" and "getsockopt: read ctx->optlen". There is no limitation for the setsockopt() part. Later, each test runs using regular {g,s}etsockopt systemcalls, and, if liburing is supported, execute the same test (again), but calling liburing {g,s}setsockopt commands. This patch also changes the level of two tests to use SOL_SOCKET for the following two tests. This is going to help to exercise the io_uring subsystem: * getsockopt: read ctx->optlen * getsockopt: support smaller ctx->optlen Signed-off-by: Breno Leitao Link: https://lore.kernel.org/r/20231016134750.1381153-12-leitao@debian.org Acked-by: Martin KaFai Lau Signed-off-by: Jens Axboe --- .../selftests/bpf/prog_tests/sockopt.c | 113 +++++++++++++++++- 1 file changed, 107 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/sockopt.c b/tools/testing/selftests/bpf/prog_tests/sockopt.c index 9e6a5e3ed4de55..5a4491d4edfe47 100644 --- a/tools/testing/selftests/bpf/prog_tests/sockopt.c +++ b/tools/testing/selftests/bpf/prog_tests/sockopt.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include "cgroup_helpers.h" static char bpf_log_buf[4096]; @@ -38,6 +39,7 @@ static struct sockopt_test { socklen_t get_optlen_ret; enum sockopt_test_error error; + bool io_uring_support; } tests[] = { /* ==================== getsockopt ==================== */ @@ -251,7 +253,9 @@ static struct sockopt_test { .attach_type = BPF_CGROUP_GETSOCKOPT, .expected_attach_type = BPF_CGROUP_GETSOCKOPT, + .get_level = SOL_SOCKET, .get_optlen = 64, + .io_uring_support = true, }, { .descr = "getsockopt: deny bigger ctx->optlen", @@ -276,6 +280,7 @@ static struct sockopt_test { .get_optlen = 64, .error = EFAULT_GETSOCKOPT, + .io_uring_support = true, }, { .descr = "getsockopt: ignore >PAGE_SIZE optlen", @@ -318,6 +323,7 @@ static struct sockopt_test { .get_optval = {}, /* the changes are ignored */ .get_optlen = PAGE_SIZE + 1, .error = EOPNOTSUPP_GETSOCKOPT, + .io_uring_support = true, }, { .descr = "getsockopt: support smaller ctx->optlen", @@ -337,8 +343,10 @@ static struct sockopt_test { .attach_type = BPF_CGROUP_GETSOCKOPT, .expected_attach_type = BPF_CGROUP_GETSOCKOPT, + .get_level = SOL_SOCKET, .get_optlen = 64, .get_optlen_ret = 32, + .io_uring_support = true, }, { .descr = "getsockopt: deny writing to ctx->optval", @@ -518,6 +526,7 @@ static struct sockopt_test { .set_level = 123, .set_optlen = 1, + .io_uring_support = true, }, { .descr = "setsockopt: allow changing ctx->level", @@ -572,6 +581,7 @@ static struct sockopt_test { .set_optname = 123, .set_optlen = 1, + .io_uring_support = true, }, { .descr = "setsockopt: allow changing ctx->optname", @@ -624,6 +634,7 @@ static struct sockopt_test { .expected_attach_type = BPF_CGROUP_SETSOCKOPT, .set_optlen = 64, + .io_uring_support = true, }, { .descr = "setsockopt: ctx->optlen == -1 is ok", @@ -640,6 +651,7 @@ static struct sockopt_test { .expected_attach_type = BPF_CGROUP_SETSOCKOPT, .set_optlen = 64, + .io_uring_support = true, }, { .descr = "setsockopt: deny ctx->optlen < 0 (except -1)", @@ -658,6 +670,7 @@ static struct sockopt_test { .set_optlen = 4, .error = EFAULT_SETSOCKOPT, + .io_uring_support = true, }, { .descr = "setsockopt: deny ctx->optlen > input optlen", @@ -675,6 +688,7 @@ static struct sockopt_test { .set_optlen = 64, .error = EFAULT_SETSOCKOPT, + .io_uring_support = true, }, { .descr = "setsockopt: ignore >PAGE_SIZE optlen", @@ -940,7 +954,89 @@ static int load_prog(const struct bpf_insn *insns, return fd; } -static int run_test(int cgroup_fd, struct sockopt_test *test) +/* Core function that handles io_uring ring initialization, + * sending SQE with sockopt command and waiting for the CQE. + */ +static int uring_sockopt(int op, int fd, int level, int optname, + const void *optval, socklen_t optlen) +{ + struct io_uring_cqe *cqe; + struct io_uring_sqe *sqe; + struct io_uring ring; + int err; + + err = io_uring_queue_init(1, &ring, 0); + if (!ASSERT_OK(err, "io_uring initialization")) + return err; + + sqe = io_uring_get_sqe(&ring); + if (!ASSERT_NEQ(sqe, NULL, "Get an SQE")) { + err = -1; + goto fail; + } + + io_uring_prep_cmd(sqe, op, fd, level, optname, optval, optlen); + + err = io_uring_submit(&ring); + if (!ASSERT_EQ(err, 1, "Submit SQE")) + goto fail; + + err = io_uring_wait_cqe(&ring, &cqe); + if (!ASSERT_OK(err, "Wait for CQE")) + goto fail; + + err = cqe->res; + +fail: + io_uring_queue_exit(&ring); + + return err; +} + +static int uring_setsockopt(int fd, int level, int optname, const void *optval, + socklen_t optlen) +{ + return uring_sockopt(SOCKET_URING_OP_SETSOCKOPT, fd, level, optname, + optval, optlen); +} + +static int uring_getsockopt(int fd, int level, int optname, void *optval, + socklen_t *optlen) +{ + int ret = uring_sockopt(SOCKET_URING_OP_GETSOCKOPT, fd, level, optname, + optval, *optlen); + if (ret < 0) + return ret; + + /* Populate optlen back to be compatible with systemcall interface, + * and simplify the test. + */ + *optlen = ret; + + return 0; +} + +/* Execute the setsocktopt operation */ +static int call_setsockopt(bool use_io_uring, int fd, int level, int optname, + const void *optval, socklen_t optlen) +{ + if (use_io_uring) + return uring_setsockopt(fd, level, optname, optval, optlen); + + return setsockopt(fd, level, optname, optval, optlen); +} + +/* Execute the getsocktopt operation */ +static int call_getsockopt(bool use_io_uring, int fd, int level, int optname, + void *optval, socklen_t *optlen) +{ + if (use_io_uring) + return uring_getsockopt(fd, level, optname, optval, optlen); + + return getsockopt(fd, level, optname, optval, optlen); +} + +static int run_test(int cgroup_fd, struct sockopt_test *test, bool use_io_uring) { int sock_fd, err, prog_fd; void *optval = NULL; @@ -980,8 +1076,9 @@ static int run_test(int cgroup_fd, struct sockopt_test *test) test->set_optlen = num_pages * sysconf(_SC_PAGESIZE) + remainder; } - err = setsockopt(sock_fd, test->set_level, test->set_optname, - test->set_optval, test->set_optlen); + err = call_setsockopt(use_io_uring, sock_fd, test->set_level, + test->set_optname, test->set_optval, + test->set_optlen); if (err) { if (errno == EPERM && test->error == EPERM_SETSOCKOPT) goto close_sock_fd; @@ -1008,8 +1105,8 @@ static int run_test(int cgroup_fd, struct sockopt_test *test) socklen_t expected_get_optlen = test->get_optlen_ret ?: test->get_optlen; - err = getsockopt(sock_fd, test->get_level, test->get_optname, - optval, &optlen); + err = call_getsockopt(use_io_uring, sock_fd, test->get_level, + test->get_optname, optval, &optlen); if (err) { if (errno == EOPNOTSUPP && test->error == EOPNOTSUPP_GETSOCKOPT) goto free_optval; @@ -1063,7 +1160,11 @@ void test_sockopt(void) if (!test__start_subtest(tests[i].descr)) continue; - ASSERT_OK(run_test(cgroup_fd, &tests[i]), tests[i].descr); + ASSERT_OK(run_test(cgroup_fd, &tests[i], false), + tests[i].descr); + if (tests[i].io_uring_support) + ASSERT_OK(run_test(cgroup_fd, &tests[i], true), + tests[i].descr); } close(cgroup_fd); From 7c7dac83656f87215f1c1ac0793b2635c05e3968 Mon Sep 17 00:00:00 2001 From: Ivan Mikhaylov Date: Sun, 15 Oct 2023 00:12:53 +0300 Subject: [PATCH 296/515] dt-bindings: adc: provide max34408/9 device tree binding document The hardware binding for i2c current monitoring device with overcurrent control. Signed-off-by: Ivan Mikhaylov Reviewed-by: Conor Dooley Link: https://lore.kernel.org/r/20231014211254.16719-2-fr0st61te@gmail.com Signed-off-by: Jonathan Cameron --- .../bindings/iio/adc/maxim,max34408.yaml | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml diff --git a/Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml b/Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml new file mode 100644 index 00000000000000..4cba856e8d4732 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml @@ -0,0 +1,139 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/adc/maxim,max34408.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Maxim MAX34408/MAX34409 current monitors with overcurrent control + +maintainers: + - Ivan Mikhaylov + +description: | + The MAX34408/MAX34409 are two- and four-channel current monitors that are + configured and monitored with a standard I2C/SMBus serial interface. Each + unidirectional current sensor offers precision high-side operation with a + low full-scale sense voltage. The devices automatically sequence through + two or four channels and collect the current-sense samples and average them + to reduce the effect of impulse noise. The raw ADC samples are compared to + user-programmable digital thresholds to indicate overcurrent conditions. + Overcurrent conditions trigger a hardware output to provide an immediate + indication to shut down any necessary external circuitry. + + Specifications about the devices can be found at: + https://www.analog.com/media/en/technical-documentation/data-sheets/MAX34408-MAX34409.pdf + +properties: + compatible: + enum: + - maxim,max34408 + - maxim,max34409 + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + powerdown-gpios: + description: + Shutdown Output. Open-drain output. This output transitions to high impedance + when any of the digital comparator thresholds are exceeded as long as the ENA + pin is high. + maxItems: 1 + + powerdown-status-gpios: + description: + SHTDN Enable Input. CMOS digital input. Connect to GND to clear the latch and + unconditionally deassert (force low) the SHTDN output and reset the shutdown + delay. Connect to VDD to enable normal latch operation of the SHTDN output. + maxItems: 1 + + vdd-supply: true + +patternProperties: + "^channel@[0-3]$": + $ref: adc.yaml + type: object + description: + Represents the internal channels of the ADC. + + properties: + reg: + items: + - minimum: 0 + maximum: 3 + + maxim,rsense-val-micro-ohms: + description: + Adjust the Rsense value to monitor higher or lower current levels for + input. + enum: [250, 500, 1000, 5000, 10000, 50000, 100000, 200000, 500000] + default: 1000 + + required: + - reg + - maxim,rsense-val-micro-ohms + + unevaluatedProperties: false + +required: + - compatible + - reg + +allOf: + - if: + properties: + compatible: + contains: + const: maxim,max34408 + then: + patternProperties: + "^channel@[2-3]$": false + "^channel@[0-1]$": + properties: + reg: + maximum: 1 + else: + patternProperties: + "^channel@[0-3]$": + properties: + reg: + maximum: 3 + +additionalProperties: false + +examples: + - | + #include + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + adc@1e { + compatible = "maxim,max34409"; + reg = <0x1e>; + powerdown-gpios = <&gpio0 1 GPIO_ACTIVE_LOW>; + powerdown-status-gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>; + + #address-cells = <1>; + #size-cells = <0>; + + channel@0 { + reg = <0x0>; + maxim,rsense-val-micro-ohms = <5000>; + }; + + channel@1 { + reg = <0x1>; + maxim,rsense-val-micro-ohms = <10000>; + }; + }; + }; From 953e58a54c495dc0e3851331a2f509b7aacaa51b Mon Sep 17 00:00:00 2001 From: Ivan Mikhaylov Date: Sun, 15 Oct 2023 00:12:54 +0300 Subject: [PATCH 297/515] iio: adc: Add driver support for MAX34408/9 The MAX34408/MAX34409 are two- and four-channel current monitors that are configured and monitored with a standard I2C/SMBus serial interface. Each unidirectional current sensor offers precision high-side operation with a low full-scale sense voltage. The devices automatically sequence through two or four channels and collect the current-sense samples and average them to reduce the effect of impulse noise. The raw ADC samples are compared to user-programmable digital thresholds to indicate overcurrent conditions. Overcurrent conditions trigger a hardware output to provide an immediate indication to shut down any necessary external circuitry. Add as ADC driver which only supports current monitoring for now. Link: https://www.analog.com/media/en/technical-documentation/data-sheets/MAX34408-MAX34409.pdf Signed-off-by: Ivan Mikhaylov Link: https://lore.kernel.org/r/20231014211254.16719-3-fr0st61te@gmail.com Signed-off-by: Jonathan Cameron --- drivers/iio/adc/Kconfig | 11 ++ drivers/iio/adc/Makefile | 1 + drivers/iio/adc/max34408.c | 276 +++++++++++++++++++++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 drivers/iio/adc/max34408.c diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 35f9867da12c39..1e2b7a2c67c6b4 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -745,6 +745,17 @@ config MAX1363 To compile this driver as a module, choose M here: the module will be called max1363. +config MAX34408 + tristate "Maxim max34408/max344089 ADC driver" + depends on I2C + help + Say yes here to build support for Maxim max34408/max34409 current sense + monitor with 8-bits ADC interface with overcurrent delay/threshold and + shutdown delay. + + To compile this driver as a module, choose M here: the module will be + called max34408. + config MAX77541_ADC tristate "Analog Devices MAX77541 ADC driver" depends on MFD_MAX77541 diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index bee11d442af450..c0803383a7ccb2 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -68,6 +68,7 @@ obj-$(CONFIG_MAX11205) += max11205.o obj-$(CONFIG_MAX11410) += max11410.o obj-$(CONFIG_MAX1241) += max1241.o obj-$(CONFIG_MAX1363) += max1363.o +obj-$(CONFIG_MAX34408) += max34408.o obj-$(CONFIG_MAX77541_ADC) += max77541-adc.o obj-$(CONFIG_MAX9611) += max9611.o obj-$(CONFIG_MCP320X) += mcp320x.o diff --git a/drivers/iio/adc/max34408.c b/drivers/iio/adc/max34408.c new file mode 100644 index 00000000000000..6c2ea2bc52c6f1 --- /dev/null +++ b/drivers/iio/adc/max34408.c @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * IIO driver for Maxim MAX34409/34408 ADC, 4-Channels/2-Channels, 8bits, I2C + * + * Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/MAX34408-MAX34409.pdf + * + * TODO: ALERT interrupt, Overcurrent delay, Shutdown delay + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define MAX34408_STATUS_REG 0x0 +#define MAX34408_CONTROL_REG 0x1 +#define MAX34408_OCDELAY_REG 0x2 +#define MAX34408_SDDELAY_REG 0x3 + +#define MAX34408_ADC1_REG 0x4 +#define MAX34408_ADC2_REG 0x5 +/* ADC3 & ADC4 always returns 0x0 on 34408 */ +#define MAX34409_ADC3_REG 0x6 +#define MAX34409_ADC4_REG 0x7 + +#define MAX34408_OCT1_REG 0x8 +#define MAX34408_OCT2_REG 0x9 +#define MAX34409_OCT3_REG 0xA +#define MAX34409_OCT4_REG 0xB + +#define MAX34408_DID_REG 0xC +#define MAX34408_DCYY_REG 0xD +#define MAX34408_DCWW_REG 0xE + +/* Bit masks for status register */ +#define MAX34408_STATUS_OC_MSK GENMASK(1, 0) +#define MAX34409_STATUS_OC_MSK GENMASK(3, 0) +#define MAX34408_STATUS_SHTDN BIT(4) +#define MAX34408_STATUS_ENA BIT(5) + +/* Bit masks for control register */ +#define MAX34408_CONTROL_AVG0 BIT(0) +#define MAX34408_CONTROL_AVG1 BIT(1) +#define MAX34408_CONTROL_AVG2 BIT(2) +#define MAX34408_CONTROL_ALERT BIT(3) + +#define MAX34408_DEFAULT_AVG 0x4 + +/* Bit masks for over current delay */ +#define MAX34408_OCDELAY_OCD_MSK GENMASK(6, 0) +#define MAX34408_OCDELAY_RESET BIT(7) + +/* Bit masks for shutdown delay */ +#define MAX34408_SDDELAY_SHD_MSK GENMASK(6, 0) +#define MAX34408_SDDELAY_RESET BIT(7) + +#define MAX34408_DEFAULT_RSENSE 1000 + +/** + * struct max34408_data - max34408/max34409 specific data. + * @regmap: device register map. + * @dev: max34408 device. + * @lock: lock for protecting access to device hardware registers, mostly + * for read modify write cycles for control registers. + * @input_rsense: Rsense values in uOhm, will be overwritten by + * values from channel nodes. + */ +struct max34408_data { + struct regmap *regmap; + struct device *dev; + struct mutex lock; + u32 input_rsense[4]; +}; + +static const struct regmap_config max34408_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .max_register = MAX34408_DCWW_REG, +}; + +struct max34408_adc_model_data { + const char *model_name; + const struct iio_chan_spec *channels; + const int num_channels; +}; + +#define MAX34008_CHANNEL(_index, _address) \ + { \ + .type = IIO_CURRENT, \ + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ + BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_OFFSET), \ + .channel = (_index), \ + .address = (_address), \ + .indexed = 1, \ + } + +static const struct iio_chan_spec max34408_channels[] = { + MAX34008_CHANNEL(0, MAX34408_ADC1_REG), + MAX34008_CHANNEL(1, MAX34408_ADC2_REG), +}; + +static const struct iio_chan_spec max34409_channels[] = { + MAX34008_CHANNEL(0, MAX34408_ADC1_REG), + MAX34008_CHANNEL(1, MAX34408_ADC2_REG), + MAX34008_CHANNEL(2, MAX34409_ADC3_REG), + MAX34008_CHANNEL(3, MAX34409_ADC4_REG), +}; + +static int max34408_read_adc_avg(struct max34408_data *max34408, + const struct iio_chan_spec *chan, int *val) +{ + unsigned int ctrl; + int rc; + + guard(mutex)(&max34408->lock); + rc = regmap_read(max34408->regmap, MAX34408_CONTROL_REG, (u32 *)&ctrl); + if (rc) + return rc; + + /* set averaging (0b100) default values*/ + rc = regmap_write(max34408->regmap, MAX34408_CONTROL_REG, + MAX34408_DEFAULT_AVG); + if (rc) { + dev_err(max34408->dev, + "Error (%d) writing control register\n", rc); + return rc; + } + + rc = regmap_read(max34408->regmap, chan->address, val); + if (rc) + return rc; + + /* back to old values */ + rc = regmap_write(max34408->regmap, MAX34408_CONTROL_REG, ctrl); + if (rc) + dev_err(max34408->dev, + "Error (%d) writing control register\n", rc); + + return rc; +} + +static int max34408_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int *val, int *val2, long mask) +{ + struct max34408_data *max34408 = iio_priv(indio_dev); + int rc; + + switch (mask) { + case IIO_CHAN_INFO_RAW: + rc = max34408_read_adc_avg(max34408, chan, val); + if (rc) + return rc; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + /* + * calcluate current for 8bit ADC with Rsense + * value. + * 10 mV * 1000 / Rsense uOhm = max current + * (max current * adc val * 1000) / (2^8 - 1) mA + */ + *val = 10000 / max34408->input_rsense[chan->channel]; + *val2 = 8; + return IIO_VAL_FRACTIONAL_LOG2; + default: + return -EINVAL; + } +} + +static const struct iio_info max34408_info = { + .read_raw = max34408_read_raw, +}; + +static const struct max34408_adc_model_data max34408_model_data = { + .model_name = "max34408", + .channels = max34408_channels, + .num_channels = 2, +}; + +static const struct max34408_adc_model_data max34409_model_data = { + .model_name = "max34409", + .channels = max34409_channels, + .num_channels = 4, +}; + +static int max34408_probe(struct i2c_client *client) +{ + const struct max34408_adc_model_data *model_data; + struct device *dev = &client->dev; + struct max34408_data *max34408; + struct fwnode_handle *node; + struct iio_dev *indio_dev; + struct regmap *regmap; + int rc, i = 0; + + model_data = i2c_get_match_data(client); + if (!model_data) + return -EINVAL; + + regmap = devm_regmap_init_i2c(client, &max34408_regmap_config); + if (IS_ERR(regmap)) { + dev_err_probe(dev, PTR_ERR(regmap), + "regmap_init failed\n"); + return PTR_ERR(regmap); + } + + indio_dev = devm_iio_device_alloc(dev, sizeof(*max34408)); + if (!indio_dev) + return -ENOMEM; + + max34408 = iio_priv(indio_dev); + max34408->regmap = regmap; + max34408->dev = dev; + mutex_init(&max34408->lock); + + device_for_each_child_node(dev, node) { + fwnode_property_read_u32(node, "maxim,rsense-val-micro-ohms", + &max34408->input_rsense[i]); + i++; + } + + /* disable ALERT and averaging */ + rc = regmap_write(max34408->regmap, MAX34408_CONTROL_REG, 0x0); + if (rc) + return rc; + + indio_dev->channels = model_data->channels; + indio_dev->num_channels = model_data->num_channels; + indio_dev->name = model_data->model_name; + + indio_dev->info = &max34408_info; + indio_dev->modes = INDIO_DIRECT_MODE; + + return devm_iio_device_register(dev, indio_dev); +} + +static const struct of_device_id max34408_of_match[] = { + { + .compatible = "maxim,max34408", + .data = &max34408_model_data, + }, + { + .compatible = "maxim,max34409", + .data = &max34409_model_data, + }, + {} +}; +MODULE_DEVICE_TABLE(of, max34408_of_match); + +static const struct i2c_device_id max34408_id[] = { + { "max34408", (kernel_ulong_t)&max34408_model_data }, + { "max34409", (kernel_ulong_t)&max34409_model_data }, + {} +}; +MODULE_DEVICE_TABLE(i2c, max34408_id); + +static struct i2c_driver max34408_driver = { + .driver = { + .name = "max34408", + .of_match_table = max34408_of_match, + }, + .probe = max34408_probe, + .id_table = max34408_id, +}; +module_i2c_driver(max34408_driver); + +MODULE_AUTHOR("Ivan Mikhaylov "); +MODULE_DESCRIPTION("Maxim MAX34408/34409 ADC driver"); +MODULE_LICENSE("GPL"); From 77583938740ef908ab04132ab080d75ea16dd761 Mon Sep 17 00:00:00 2001 From: Jagath Jog J Date: Fri, 13 Oct 2023 09:18:07 +0530 Subject: [PATCH 298/515] dt-bindings: iio: imu: Add Bosch BMI323 Add devicetree description document for Bosch BMI323, a 6-Axis IMU. Signed-off-by: Jagath Jog J Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20231013034808.8948-2-jagathjog1996@gmail.com Signed-off-by: Jonathan Cameron --- .../bindings/iio/imu/bosch,bmi323.yaml | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml diff --git a/Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml b/Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml new file mode 100644 index 00000000000000..64ef26e1966964 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml @@ -0,0 +1,77 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/imu/bosch,bmi323.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Bosch BMI323 6-Axis IMU + +maintainers: + - Jagath Jog J + +description: + BMI323 is a 6-axis inertial measurement unit that supports acceleration and + gyroscopic measurements with hardware fifo buffering. Sensor also provides + events information such as motion, steps, orientation, single and double + tap detection. + +properties: + compatible: + const: bosch,bmi323 + + reg: + maxItems: 1 + + vdd-supply: true + vddio-supply: true + + interrupts: + minItems: 1 + maxItems: 2 + + interrupt-names: + minItems: 1 + maxItems: 2 + items: + enum: + - INT1 + - INT2 + + drive-open-drain: + description: + set if the specified interrupt pin should be configured as + open drain. If not set, defaults to push-pull. + + mount-matrix: + description: + an optional 3x3 mounting rotation matrix. + +required: + - compatible + - reg + - vdd-supply + - vddio-supply + +allOf: + - $ref: /schemas/spi/spi-peripheral-props.yaml# + +unevaluatedProperties: false + +examples: + - | + // Example for I2C + #include + i2c { + #address-cells = <1>; + #size-cells = <0>; + + imu@68 { + compatible = "bosch,bmi323"; + reg = <0x68>; + vddio-supply = <&vddio>; + vdd-supply = <&vdd>; + interrupt-parent = <&gpio1>; + interrupts = <29 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "INT1"; + }; + }; From b512c767e7bcef308ee5b038405debf9baa9c579 Mon Sep 17 00:00:00 2001 From: Jagath Jog J Date: Fri, 13 Oct 2023 09:18:08 +0530 Subject: [PATCH 299/515] iio: imu: Add driver for BMI323 IMU The Bosch BMI323 is a 6-axis low-power IMU that provide measurements for acceleration, angular rate, and temperature. This sensor includes motion-triggered interrupt features, such as a step counter, tap detection, and activity/inactivity interrupt capabilities. The driver supports various functionalities, including data ready, FIFO data handling, and events such as tap detection, step counting, and activity interrupts. Signed-off-by: Jagath Jog J Link: https://lore.kernel.org/r/20231013034808.8948-3-jagathjog1996@gmail.com Signed-off-by: Jonathan Cameron --- Documentation/ABI/testing/sysfs-bus-iio | 18 + MAINTAINERS | 7 + drivers/iio/imu/Kconfig | 1 + drivers/iio/imu/Makefile | 1 + drivers/iio/imu/bmi323/Kconfig | 33 + drivers/iio/imu/bmi323/Makefile | 7 + drivers/iio/imu/bmi323/bmi323.h | 209 +++ drivers/iio/imu/bmi323/bmi323_core.c | 2139 +++++++++++++++++++++++ drivers/iio/imu/bmi323/bmi323_i2c.c | 121 ++ drivers/iio/imu/bmi323/bmi323_spi.c | 92 + 10 files changed, 2628 insertions(+) create mode 100644 drivers/iio/imu/bmi323/Kconfig create mode 100644 drivers/iio/imu/bmi323/Makefile create mode 100644 drivers/iio/imu/bmi323/bmi323.h create mode 100644 drivers/iio/imu/bmi323/bmi323_core.c create mode 100644 drivers/iio/imu/bmi323/bmi323_i2c.c create mode 100644 drivers/iio/imu/bmi323/bmi323_spi.c diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio index 19cde14f386929..0eadc08c3a139d 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio @@ -2254,3 +2254,21 @@ Description: If a label is defined for this event add that to the event specific attributes. This is useful for userspace to be able to better identify an individual event. + +What: /sys/.../events/in_accel_gesture_tap_wait_timeout +KernelVersion: 6.7 +Contact: linux-iio@vger.kernel.org +Description: + Enable tap gesture confirmation with timeout. + +What: /sys/.../events/in_accel_gesture_tap_wait_dur +KernelVersion: 6.7 +Contact: linux-iio@vger.kernel.org +Description: + Timeout value in seconds for tap gesture confirmation. + +What: /sys/.../events/in_accel_gesture_tap_wait_dur_available +KernelVersion: 6.7 +Contact: linux-iio@vger.kernel.org +Description: + List of available timeout value for tap gesture confirmation. diff --git a/MAINTAINERS b/MAINTAINERS index eac660dd6adb83..784cd80f5166f8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3612,6 +3612,13 @@ S: Maintained F: Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml F: drivers/iio/accel/bma400* +BOSCH SENSORTEC BMI323 IMU IIO DRIVER +M: Jagath Jog J +L: linux-iio@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/iio/imu/bosch,bma400.yaml +F: drivers/iio/imu/bmi323/ + BPF JIT for ARM M: Shubham Bansal L: bpf@vger.kernel.org diff --git a/drivers/iio/imu/Kconfig b/drivers/iio/imu/Kconfig index c2f97629e9cdb6..52a155ff325047 100644 --- a/drivers/iio/imu/Kconfig +++ b/drivers/iio/imu/Kconfig @@ -53,6 +53,7 @@ config ADIS16480 ADIS16485, ADIS16488 inertial sensors. source "drivers/iio/imu/bmi160/Kconfig" +source "drivers/iio/imu/bmi323/Kconfig" source "drivers/iio/imu/bno055/Kconfig" config FXOS8700 diff --git a/drivers/iio/imu/Makefile b/drivers/iio/imu/Makefile index 6eb61203472229..7e2d7d5c3b7bc7 100644 --- a/drivers/iio/imu/Makefile +++ b/drivers/iio/imu/Makefile @@ -15,6 +15,7 @@ adis_lib-$(CONFIG_IIO_ADIS_LIB_BUFFER) += adis_buffer.o obj-$(CONFIG_IIO_ADIS_LIB) += adis_lib.o obj-y += bmi160/ +obj-y += bmi323/ obj-y += bno055/ obj-$(CONFIG_FXOS8700) += fxos8700_core.o diff --git a/drivers/iio/imu/bmi323/Kconfig b/drivers/iio/imu/bmi323/Kconfig new file mode 100644 index 00000000000000..ab37b285393c11 --- /dev/null +++ b/drivers/iio/imu/bmi323/Kconfig @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# BMI323 IMU driver +# + +config BMI323 + tristate + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER + +config BMI323_I2C + tristate "Bosch BMI323 I2C driver" + depends on I2C + select BMI323 + select REGMAP_I2C + help + Enable support for the Bosch BMI323 6-Axis IMU connected to I2C + interface. + + This driver can also be built as a module. If so, the module will be + called bmi323_i2c. + +config BMI323_SPI + tristate "Bosch BMI323 SPI driver" + depends on SPI + select BMI323 + select REGMAP_SPI + help + Enable support for the Bosch BMI323 6-Axis IMU connected to SPI + interface. + + This driver can also be built as a module. If so, the module will be + called bmi323_spi. diff --git a/drivers/iio/imu/bmi323/Makefile b/drivers/iio/imu/bmi323/Makefile new file mode 100644 index 00000000000000..a6a6dc0207c95c --- /dev/null +++ b/drivers/iio/imu/bmi323/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for Bosch BMI323 IMU +# +obj-$(CONFIG_BMI323) += bmi323_core.o +obj-$(CONFIG_BMI323_I2C) += bmi323_i2c.o +obj-$(CONFIG_BMI323_SPI) += bmi323_spi.o diff --git a/drivers/iio/imu/bmi323/bmi323.h b/drivers/iio/imu/bmi323/bmi323.h new file mode 100644 index 00000000000000..dff126d4165839 --- /dev/null +++ b/drivers/iio/imu/bmi323/bmi323.h @@ -0,0 +1,209 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * IIO driver for Bosch BMI323 6-Axis IMU + * + * Copyright (C) 2023, Jagath Jog J + */ + +#ifndef _BMI323_H_ +#define _BMI323_H_ + +#include +#include +#include + +#define BMI323_I2C_DUMMY 2 +#define BMI323_SPI_DUMMY 1 + +/* Register map */ + +#define BMI323_CHIP_ID_REG 0x00 +#define BMI323_CHIP_ID_VAL 0x0043 +#define BMI323_CHIP_ID_MSK GENMASK(7, 0) +#define BMI323_ERR_REG 0x01 +#define BMI323_STATUS_REG 0x02 +#define BMI323_STATUS_POR_MSK BIT(0) + +/* Accelero/Gyro/Temp data registers */ +#define BMI323_ACCEL_X_REG 0x03 +#define BMI323_GYRO_X_REG 0x06 +#define BMI323_TEMP_REG 0x09 +#define BMI323_ALL_CHAN_MSK GENMASK(5, 0) + +/* Status registers */ +#define BMI323_STATUS_INT1_REG 0x0D +#define BMI323_STATUS_INT2_REG 0x0E +#define BMI323_STATUS_NOMOTION_MSK BIT(0) +#define BMI323_STATUS_MOTION_MSK BIT(1) +#define BMI323_STATUS_STP_WTR_MSK BIT(5) +#define BMI323_STATUS_TAP_MSK BIT(8) +#define BMI323_STATUS_ERROR_MSK BIT(10) +#define BMI323_STATUS_TMP_DRDY_MSK BIT(11) +#define BMI323_STATUS_GYR_DRDY_MSK BIT(12) +#define BMI323_STATUS_ACC_DRDY_MSK BIT(13) +#define BMI323_STATUS_ACC_GYR_DRDY_MSK GENMASK(13, 12) +#define BMI323_STATUS_FIFO_WTRMRK_MSK BIT(14) +#define BMI323_STATUS_FIFO_FULL_MSK BIT(15) + +/* Feature registers */ +#define BMI323_FEAT_IO0_REG 0x10 +#define BMI323_FEAT_IO0_XYZ_NOMOTION_MSK GENMASK(2, 0) +#define BMI323_FEAT_IO0_XYZ_MOTION_MSK GENMASK(5, 3) +#define BMI323_FEAT_XYZ_MSK GENMASK(2, 0) +#define BMI323_FEAT_IO0_STP_CNT_MSK BIT(9) +#define BMI323_FEAT_IO0_S_TAP_MSK BIT(12) +#define BMI323_FEAT_IO0_D_TAP_MSK BIT(13) +#define BMI323_FEAT_IO1_REG 0x11 +#define BMI323_FEAT_IO1_ERR_MSK GENMASK(3, 0) +#define BMI323_FEAT_IO2_REG 0x12 +#define BMI323_FEAT_IO_STATUS_REG 0x14 +#define BMI323_FEAT_IO_STATUS_MSK BIT(0) +#define BMI323_FEAT_ENG_POLL 2000 +#define BMI323_FEAT_ENG_TIMEOUT 10000 + +/* FIFO registers */ +#define BMI323_FIFO_FILL_LEVEL_REG 0x15 +#define BMI323_FIFO_DATA_REG 0x16 + +/* Accelero/Gyro config registers */ +#define BMI323_ACC_CONF_REG 0x20 +#define BMI323_GYRO_CONF_REG 0x21 +#define BMI323_ACC_GYRO_CONF_MODE_MSK GENMASK(14, 12) +#define BMI323_ACC_GYRO_CONF_ODR_MSK GENMASK(3, 0) +#define BMI323_ACC_GYRO_CONF_SCL_MSK GENMASK(6, 4) +#define BMI323_ACC_GYRO_CONF_BW_MSK BIT(7) +#define BMI323_ACC_GYRO_CONF_AVG_MSK GENMASK(10, 8) + +/* FIFO registers */ +#define BMI323_FIFO_WTRMRK_REG 0x35 +#define BMI323_FIFO_CONF_REG 0x36 +#define BMI323_FIFO_CONF_STP_FUL_MSK BIT(0) +#define BMI323_FIFO_CONF_ACC_GYR_EN_MSK GENMASK(10, 9) +#define BMI323_FIFO_ACC_GYR_MSK GENMASK(1, 0) +#define BMI323_FIFO_CTRL_REG 0x37 +#define BMI323_FIFO_FLUSH_MSK BIT(0) + +/* Interrupt pin config registers */ +#define BMI323_IO_INT_CTR_REG 0x38 +#define BMI323_IO_INT1_LVL_MSK BIT(0) +#define BMI323_IO_INT1_OD_MSK BIT(1) +#define BMI323_IO_INT1_OP_EN_MSK BIT(2) +#define BMI323_IO_INT1_LVL_OD_OP_MSK GENMASK(2, 0) +#define BMI323_IO_INT2_LVL_MSK BIT(8) +#define BMI323_IO_INT2_OD_MSK BIT(9) +#define BMI323_IO_INT2_OP_EN_MSK BIT(10) +#define BMI323_IO_INT2_LVL_OD_OP_MSK GENMASK(10, 8) +#define BMI323_IO_INT_CONF_REG 0x39 +#define BMI323_IO_INT_LTCH_MSK BIT(0) +#define BMI323_INT_MAP1_REG 0x3A +#define BMI323_INT_MAP2_REG 0x3B +#define BMI323_NOMOTION_MSK GENMASK(1, 0) +#define BMI323_MOTION_MSK GENMASK(3, 2) +#define BMI323_STEP_CNT_MSK GENMASK(11, 10) +#define BMI323_TAP_MSK GENMASK(1, 0) +#define BMI323_TMP_DRDY_MSK GENMASK(7, 6) +#define BMI323_GYR_DRDY_MSK GENMASK(9, 8) +#define BMI323_ACC_DRDY_MSK GENMASK(11, 10) +#define BMI323_FIFO_WTRMRK_MSK GENMASK(13, 12) +#define BMI323_FIFO_FULL_MSK GENMASK(15, 14) + +/* Feature registers */ +#define BMI323_FEAT_CTRL_REG 0x40 +#define BMI323_FEAT_ENG_EN_MSK BIT(0) +#define BMI323_FEAT_DATA_ADDR 0x41 +#define BMI323_FEAT_DATA_TX 0x42 +#define BMI323_FEAT_DATA_STATUS 0x43 +#define BMI323_FEAT_DATA_TX_RDY_MSK BIT(1) +#define BMI323_FEAT_EVNT_EXT_REG 0x47 +#define BMI323_FEAT_EVNT_EXT_S_MSK BIT(3) +#define BMI323_FEAT_EVNT_EXT_D_MSK BIT(4) + +#define BMI323_CMD_REG 0x7E +#define BMI323_RST_VAL 0xDEAF +#define BMI323_CFG_RES_REG 0x7F + +/* Extended registers */ +#define BMI323_GEN_SET1_REG 0x02 +#define BMI323_GEN_SET1_MODE_MSK BIT(0) +#define BMI323_GEN_HOLD_DUR_MSK GENMASK(4, 1) + +/* Any Motion/No Motion config registers */ +#define BMI323_ANYMO1_REG 0x05 +#define BMI323_NOMO1_REG 0x08 +#define BMI323_MO2_OFFSET 0x01 +#define BMI323_MO3_OFFSET 0x02 +#define BMI323_MO1_REF_UP_MSK BIT(12) +#define BMI323_MO1_SLOPE_TH_MSK GENMASK(11, 0) +#define BMI323_MO2_HYSTR_MSK GENMASK(9, 0) +#define BMI323_MO3_DURA_MSK GENMASK(12, 0) + +/* Step counter config registers */ +#define BMI323_STEP_SC1_REG 0x10 +#define BMI323_STEP_SC1_WTRMRK_MSK GENMASK(9, 0) +#define BMI323_STEP_SC1_RST_CNT_MSK BIT(10) +#define BMI323_STEP_SC1_REG 0x10 +#define BMI323_STEP_LEN 2 + +/* Tap gesture config registers */ +#define BMI323_TAP1_REG 0x1E +#define BMI323_TAP1_AXIS_SEL_MSK GENMASK(1, 0) +#define BMI323_AXIS_XYZ_MSK GENMASK(1, 0) +#define BMI323_TAP1_TIMOUT_MSK BIT(2) +#define BMI323_TAP1_MAX_PEAKS_MSK GENMASK(5, 3) +#define BMI323_TAP1_MODE_MSK GENMASK(7, 6) +#define BMI323_TAP2_REG 0x1F +#define BMI323_TAP2_THRES_MSK GENMASK(9, 0) +#define BMI323_TAP2_MAX_DUR_MSK GENMASK(15, 10) +#define BMI323_TAP3_REG 0x20 +#define BMI323_TAP3_QUIET_TIM_MSK GENMASK(15, 12) +#define BMI323_TAP3_QT_BW_TAP_MSK GENMASK(11, 8) +#define BMI323_TAP3_QT_AFT_GES_MSK GENMASK(15, 12) + +#define BMI323_MOTION_THRES_SCALE 512 +#define BMI323_MOTION_HYSTR_SCALE 512 +#define BMI323_MOTION_DURAT_SCALE 50 +#define BMI323_TAP_THRES_SCALE 512 +#define BMI323_DUR_BW_TAP_SCALE 200 +#define BMI323_QUITE_TIM_GES_SCALE 25 +#define BMI323_MAX_GES_DUR_SCALE 25 + +/* + * The formula to calculate temperature in C. + * See datasheet section 6.1.1, Register Map Overview + * + * T_C = (temp_raw / 512) + 23 + */ +#define BMI323_TEMP_OFFSET 11776 +#define BMI323_TEMP_SCALE 1953125 + +/* + * The BMI323 features a FIFO with a capacity of 2048 bytes. Each frame + * consists of accelerometer (X, Y, Z) data and gyroscope (X, Y, Z) data, + * totaling 6 words or 12 bytes. The FIFO buffer can hold a total of + * 170 frames. + * + * If a watermark interrupt is configured for 170 frames, the interrupt will + * trigger when the FIFO reaches 169 frames, so limit the maximum watermark + * level to 169 frames. In terms of data, 169 frames would equal 1014 bytes, + * which is approximately 2 frames before the FIFO reaches its full capacity. + * See datasheet section 5.7.3 FIFO Buffer Interrupts + */ +#define BMI323_BYTES_PER_SAMPLE 2 +#define BMI323_FIFO_LENGTH_IN_BYTES 2048 +#define BMI323_FIFO_FRAME_LENGTH 6 +#define BMI323_FIFO_FULL_IN_FRAMES \ + ((BMI323_FIFO_LENGTH_IN_BYTES / \ + (BMI323_BYTES_PER_SAMPLE * BMI323_FIFO_FRAME_LENGTH)) - 1) +#define BMI323_FIFO_FULL_IN_WORDS \ + (BMI323_FIFO_FULL_IN_FRAMES * BMI323_FIFO_FRAME_LENGTH) + +#define BMI323_INT_MICRO_TO_RAW(val, val2, scale) ((val) * (scale) + \ + ((val2) * (scale)) / MEGA) + +#define BMI323_RAW_TO_MICRO(raw, scale) ((((raw) % (scale)) * MEGA) / scale) + +struct device; +int bmi323_core_probe(struct device *dev); +extern const struct regmap_config bmi323_regmap_config; + +#endif diff --git a/drivers/iio/imu/bmi323/bmi323_core.c b/drivers/iio/imu/bmi323/bmi323_core.c new file mode 100644 index 00000000000000..0bd5dedd9a6358 --- /dev/null +++ b/drivers/iio/imu/bmi323/bmi323_core.c @@ -0,0 +1,2139 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * IIO core driver for Bosch BMI323 6-Axis IMU. + * + * Copyright (C) 2023, Jagath Jog J + * + * Datasheet: https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmi323-ds000.pdf + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "bmi323.h" + +enum bmi323_sensor_type { + BMI323_ACCEL, + BMI323_GYRO, + BMI323_SENSORS_CNT, +}; + +enum bmi323_opr_mode { + ACC_GYRO_MODE_DISABLE = 0x00, + GYRO_DRIVE_MODE_ENABLED = 0x01, + ACC_GYRO_MODE_DUTYCYCLE = 0x03, + ACC_GYRO_MODE_CONTINOUS = 0x04, + ACC_GYRO_MODE_HIGH_PERF = 0x07, +}; + +enum bmi323_state { + BMI323_IDLE, + BMI323_BUFFER_DRDY_TRIGGERED, + BMI323_BUFFER_FIFO, +}; + +enum bmi323_irq_pin { + BMI323_IRQ_DISABLED, + BMI323_IRQ_INT1, + BMI323_IRQ_INT2, +}; + +enum bmi323_3db_bw { + BMI323_BW_ODR_BY_2, + BMI323_BW_ODR_BY_4, +}; + +enum bmi323_scan { + BMI323_ACCEL_X, + BMI323_ACCEL_Y, + BMI323_ACCEL_Z, + BMI323_GYRO_X, + BMI323_GYRO_Y, + BMI323_GYRO_Z, + BMI323_CHAN_MAX +}; + +struct bmi323_hw { + u8 data; + u8 config; + const int (*scale_table)[2]; + int scale_table_len; +}; + +/* + * The accelerometer supports +-2G/4G/8G/16G ranges, and the resolution of + * each sample is 16 bits, signed. + * At +-8G the scale can calculated by + * ((8 + 8) * 9.80665 / (2^16 - 1)) * 10^6 = 2394.23819 scale in micro + * + */ +static const int bmi323_accel_scale[][2] = { + { 0, 598 }, + { 0, 1197 }, + { 0, 2394 }, + { 0, 4788 }, +}; + +static const int bmi323_gyro_scale[][2] = { + { 0, 66 }, + { 0, 133 }, + { 0, 266 }, + { 0, 532 }, + { 0, 1065 }, +}; + +static const int bmi323_accel_gyro_avrg[] = {0, 2, 4, 8, 16, 32, 64}; + +static const struct bmi323_hw bmi323_hw[2] = { + [BMI323_ACCEL] = { + .data = BMI323_ACCEL_X_REG, + .config = BMI323_ACC_CONF_REG, + .scale_table = bmi323_accel_scale, + .scale_table_len = ARRAY_SIZE(bmi323_accel_scale), + }, + [BMI323_GYRO] = { + .data = BMI323_GYRO_X_REG, + .config = BMI323_GYRO_CONF_REG, + .scale_table = bmi323_gyro_scale, + .scale_table_len = ARRAY_SIZE(bmi323_gyro_scale), + }, +}; + +struct bmi323_data { + struct device *dev; + struct regmap *regmap; + struct iio_mount_matrix orientation; + enum bmi323_irq_pin irq_pin; + struct iio_trigger *trig; + bool drdy_trigger_enabled; + enum bmi323_state state; + s64 fifo_tstamp, old_fifo_tstamp; + u32 odrns[BMI323_SENSORS_CNT]; + u32 odrhz[BMI323_SENSORS_CNT]; + unsigned int feature_events; + + /* + * Lock to protect the members of device's private data from concurrent + * access and also to serialize the access of extended registers. + * See bmi323_write_ext_reg(..) for more info. + */ + struct mutex mutex; + int watermark; + __le16 fifo_buff[BMI323_FIFO_FULL_IN_WORDS] __aligned(IIO_DMA_MINALIGN); + struct { + __le16 channels[BMI323_CHAN_MAX]; + s64 ts __aligned(8); + } buffer; + __le16 steps_count[BMI323_STEP_LEN]; +}; + +static const struct iio_mount_matrix * +bmi323_get_mount_matrix(const struct iio_dev *idev, + const struct iio_chan_spec *chan) +{ + struct bmi323_data *data = iio_priv(idev); + + return &data->orientation; +} + +static const struct iio_chan_spec_ext_info bmi323_ext_info[] = { + IIO_MOUNT_MATRIX(IIO_SHARED_BY_TYPE, bmi323_get_mount_matrix), + { } +}; + +static const struct iio_event_spec bmi323_step_wtrmrk_event = { + .type = IIO_EV_TYPE_CHANGE, + .dir = IIO_EV_DIR_NONE, + .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) | + BIT(IIO_EV_INFO_VALUE), +}; + +static const struct iio_event_spec bmi323_accel_event[] = { + { + .type = IIO_EV_TYPE_MAG, + .dir = IIO_EV_DIR_FALLING, + .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_PERIOD) | + BIT(IIO_EV_INFO_HYSTERESIS) | + BIT(IIO_EV_INFO_ENABLE), + }, + { + .type = IIO_EV_TYPE_MAG, + .dir = IIO_EV_DIR_RISING, + .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_PERIOD) | + BIT(IIO_EV_INFO_HYSTERESIS) | + BIT(IIO_EV_INFO_ENABLE), + }, + { + .type = IIO_EV_TYPE_GESTURE, + .dir = IIO_EV_DIR_SINGLETAP, + .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) | + BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_RESET_TIMEOUT), + }, + { + .type = IIO_EV_TYPE_GESTURE, + .dir = IIO_EV_DIR_DOUBLETAP, + .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) | + BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_RESET_TIMEOUT) | + BIT(IIO_EV_INFO_TAP2_MIN_DELAY), + }, +}; + +#define BMI323_ACCEL_CHANNEL(_type, _axis, _index) { \ + .type = _type, \ + .modified = 1, \ + .channel2 = IIO_MOD_##_axis, \ + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ + .info_mask_shared_by_type_available = \ + BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ + .scan_index = _index, \ + .scan_type = { \ + .sign = 's', \ + .realbits = 16, \ + .storagebits = 16, \ + .endianness = IIO_LE, \ + }, \ + .ext_info = bmi323_ext_info, \ + .event_spec = bmi323_accel_event, \ + .num_event_specs = ARRAY_SIZE(bmi323_accel_event), \ +} + +#define BMI323_GYRO_CHANNEL(_type, _axis, _index) { \ + .type = _type, \ + .modified = 1, \ + .channel2 = IIO_MOD_##_axis, \ + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ + .info_mask_shared_by_type_available = \ + BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ + .scan_index = _index, \ + .scan_type = { \ + .sign = 's', \ + .realbits = 16, \ + .storagebits = 16, \ + .endianness = IIO_LE, \ + }, \ + .ext_info = bmi323_ext_info, \ +} + +static const struct iio_chan_spec bmi323_channels[] = { + BMI323_ACCEL_CHANNEL(IIO_ACCEL, X, BMI323_ACCEL_X), + BMI323_ACCEL_CHANNEL(IIO_ACCEL, Y, BMI323_ACCEL_Y), + BMI323_ACCEL_CHANNEL(IIO_ACCEL, Z, BMI323_ACCEL_Z), + BMI323_GYRO_CHANNEL(IIO_ANGL_VEL, X, BMI323_GYRO_X), + BMI323_GYRO_CHANNEL(IIO_ANGL_VEL, Y, BMI323_GYRO_Y), + BMI323_GYRO_CHANNEL(IIO_ANGL_VEL, Z, BMI323_GYRO_Z), + { + .type = IIO_TEMP, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_OFFSET) | + BIT(IIO_CHAN_INFO_SCALE), + .scan_index = -1, + }, + { + .type = IIO_STEPS, + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | + BIT(IIO_CHAN_INFO_ENABLE), + .scan_index = -1, + .event_spec = &bmi323_step_wtrmrk_event, + .num_event_specs = 1, + + }, + IIO_CHAN_SOFT_TIMESTAMP(BMI323_CHAN_MAX), +}; + +static const int bmi323_acc_gyro_odr[][2] = { + { 0, 781250 }, + { 1, 562500 }, + { 3, 125000 }, + { 6, 250000 }, + { 12, 500000 }, + { 25, 0 }, + { 50, 0 }, + { 100, 0 }, + { 200, 0 }, + { 400, 0 }, + { 800, 0 }, +}; + +static const int bmi323_acc_gyro_odrns[] = { + 1280 * MEGA, + 640 * MEGA, + 320 * MEGA, + 160 * MEGA, + 80 * MEGA, + 40 * MEGA, + 20 * MEGA, + 10 * MEGA, + 5 * MEGA, + 2500 * KILO, + 1250 * KILO, +}; + +static enum bmi323_sensor_type bmi323_iio_to_sensor(enum iio_chan_type iio_type) +{ + switch (iio_type) { + case IIO_ACCEL: + return BMI323_ACCEL; + case IIO_ANGL_VEL: + return BMI323_GYRO; + default: + return -EINVAL; + } +} + +static int bmi323_set_mode(struct bmi323_data *data, + enum bmi323_sensor_type sensor, + enum bmi323_opr_mode mode) +{ + guard(mutex)(&data->mutex); + return regmap_update_bits(data->regmap, bmi323_hw[sensor].config, + BMI323_ACC_GYRO_CONF_MODE_MSK, + FIELD_PREP(BMI323_ACC_GYRO_CONF_MODE_MSK, + mode)); +} + +/* + * When writing data to extended register there must be no communication to + * any other register before write transaction is complete. + * See datasheet section 6.2 Extended Register Map Description. + */ +static int bmi323_write_ext_reg(struct bmi323_data *data, unsigned int ext_addr, + unsigned int ext_data) +{ + int ret, feature_status; + + ret = regmap_read(data->regmap, BMI323_FEAT_DATA_STATUS, + &feature_status); + if (ret) + return ret; + + if (!FIELD_GET(BMI323_FEAT_DATA_TX_RDY_MSK, feature_status)) + return -EBUSY; + + ret = regmap_write(data->regmap, BMI323_FEAT_DATA_ADDR, ext_addr); + if (ret) + return ret; + + return regmap_write(data->regmap, BMI323_FEAT_DATA_TX, ext_data); +} + +/* + * When reading data from extended register there must be no communication to + * any other register before read transaction is complete. + * See datasheet section 6.2 Extended Register Map Description. + */ +static int bmi323_read_ext_reg(struct bmi323_data *data, unsigned int ext_addr, + unsigned int *ext_data) +{ + int ret, feature_status; + + ret = regmap_read(data->regmap, BMI323_FEAT_DATA_STATUS, + &feature_status); + if (ret) + return ret; + + if (!FIELD_GET(BMI323_FEAT_DATA_TX_RDY_MSK, feature_status)) + return -EBUSY; + + ret = regmap_write(data->regmap, BMI323_FEAT_DATA_ADDR, ext_addr); + if (ret) + return ret; + + return regmap_read(data->regmap, BMI323_FEAT_DATA_TX, ext_data); +} + +static int bmi323_update_ext_reg(struct bmi323_data *data, + unsigned int ext_addr, + unsigned int mask, unsigned int ext_data) +{ + unsigned int value; + int ret; + + ret = bmi323_read_ext_reg(data, ext_addr, &value); + if (ret) + return ret; + + set_mask_bits(&value, mask, ext_data); + + return bmi323_write_ext_reg(data, ext_addr, value); +} + +static int bmi323_get_error_status(struct bmi323_data *data) +{ + int error, ret; + + guard(mutex)(&data->mutex); + ret = regmap_read(data->regmap, BMI323_ERR_REG, &error); + if (ret) + return ret; + + if (error) + dev_err(data->dev, "Sensor error 0x%x\n", error); + + return error; +} + +static int bmi323_feature_engine_events(struct bmi323_data *data, + const unsigned int event_mask, + bool state) +{ + unsigned int value; + int ret; + + ret = regmap_read(data->regmap, BMI323_FEAT_IO0_REG, &value); + if (ret) + return ret; + + /* Register must be cleared before changing an active config */ + ret = regmap_write(data->regmap, BMI323_FEAT_IO0_REG, 0); + if (ret) + return ret; + + if (state) + value |= event_mask; + else + value &= ~event_mask; + + ret = regmap_write(data->regmap, BMI323_FEAT_IO0_REG, value); + if (ret) + return ret; + + return regmap_write(data->regmap, BMI323_FEAT_IO_STATUS_REG, + BMI323_FEAT_IO_STATUS_MSK); +} + +static int bmi323_step_wtrmrk_en(struct bmi323_data *data, int state) +{ + enum bmi323_irq_pin step_irq; + int ret; + + guard(mutex)(&data->mutex); + if (!FIELD_GET(BMI323_FEAT_IO0_STP_CNT_MSK, data->feature_events)) + return -EINVAL; + + if (state) + step_irq = data->irq_pin; + else + step_irq = BMI323_IRQ_DISABLED; + + ret = bmi323_update_ext_reg(data, BMI323_STEP_SC1_REG, + BMI323_STEP_SC1_WTRMRK_MSK, + FIELD_PREP(BMI323_STEP_SC1_WTRMRK_MSK, + state ? 1 : 0)); + if (ret) + return ret; + + return regmap_update_bits(data->regmap, BMI323_INT_MAP1_REG, + BMI323_STEP_CNT_MSK, + FIELD_PREP(BMI323_STEP_CNT_MSK, step_irq)); +} + +static int bmi323_motion_config_reg(enum iio_event_direction dir) +{ + switch (dir) { + case IIO_EV_DIR_RISING: + return BMI323_ANYMO1_REG; + case IIO_EV_DIR_FALLING: + return BMI323_NOMO1_REG; + default: + return -EINVAL; + } +} + +static int bmi323_motion_event_en(struct bmi323_data *data, + enum iio_event_direction dir, int state) +{ + unsigned int state_value = state ? BMI323_FEAT_XYZ_MSK : 0; + int config, ret, msk, raw, field_value; + enum bmi323_irq_pin motion_irq; + int irq_msk, irq_field_val; + + if (state) + motion_irq = data->irq_pin; + else + motion_irq = BMI323_IRQ_DISABLED; + + switch (dir) { + case IIO_EV_DIR_RISING: + msk = BMI323_FEAT_IO0_XYZ_MOTION_MSK; + raw = 512; + config = BMI323_ANYMO1_REG; + irq_msk = BMI323_MOTION_MSK; + irq_field_val = FIELD_PREP(BMI323_MOTION_MSK, motion_irq); + field_value = FIELD_PREP(BMI323_FEAT_IO0_XYZ_MOTION_MSK, + state_value); + break; + case IIO_EV_DIR_FALLING: + msk = BMI323_FEAT_IO0_XYZ_NOMOTION_MSK; + raw = 0; + config = BMI323_NOMO1_REG; + irq_msk = BMI323_NOMOTION_MSK; + irq_field_val = FIELD_PREP(BMI323_NOMOTION_MSK, motion_irq); + field_value = FIELD_PREP(BMI323_FEAT_IO0_XYZ_NOMOTION_MSK, + state_value); + break; + default: + return -EINVAL; + } + + guard(mutex)(&data->mutex); + ret = bmi323_feature_engine_events(data, msk, state); + if (ret) + return ret; + + ret = bmi323_update_ext_reg(data, config, + BMI323_MO1_REF_UP_MSK, + FIELD_PREP(BMI323_MO1_REF_UP_MSK, 0)); + if (ret) + return ret; + + /* Set initial value to avoid interrupts while enabling*/ + ret = bmi323_update_ext_reg(data, config, + BMI323_MO1_SLOPE_TH_MSK, + FIELD_PREP(BMI323_MO1_SLOPE_TH_MSK, raw)); + if (ret) + return ret; + + ret = regmap_update_bits(data->regmap, BMI323_INT_MAP1_REG, irq_msk, + irq_field_val); + if (ret) + return ret; + + set_mask_bits(&data->feature_events, msk, field_value); + + return 0; +} + +static int bmi323_tap_event_en(struct bmi323_data *data, + enum iio_event_direction dir, int state) +{ + enum bmi323_irq_pin tap_irq; + int ret, tap_enabled; + + guard(mutex)(&data->mutex); + + if (data->odrhz[BMI323_ACCEL] < 200) { + dev_err(data->dev, "Invalid accelrometer parameter\n"); + return -EINVAL; + } + + switch (dir) { + case IIO_EV_DIR_SINGLETAP: + ret = bmi323_feature_engine_events(data, + BMI323_FEAT_IO0_S_TAP_MSK, + state); + if (ret) + return ret; + + set_mask_bits(&data->feature_events, BMI323_FEAT_IO0_S_TAP_MSK, + FIELD_PREP(BMI323_FEAT_IO0_S_TAP_MSK, state)); + break; + case IIO_EV_DIR_DOUBLETAP: + ret = bmi323_feature_engine_events(data, + BMI323_FEAT_IO0_D_TAP_MSK, + state); + if (ret) + return ret; + + set_mask_bits(&data->feature_events, BMI323_FEAT_IO0_D_TAP_MSK, + FIELD_PREP(BMI323_FEAT_IO0_D_TAP_MSK, state)); + break; + default: + return -EINVAL; + } + + tap_enabled = FIELD_GET(BMI323_FEAT_IO0_S_TAP_MSK | + BMI323_FEAT_IO0_D_TAP_MSK, + data->feature_events); + + if (tap_enabled) + tap_irq = data->irq_pin; + else + tap_irq = BMI323_IRQ_DISABLED; + + ret = regmap_update_bits(data->regmap, BMI323_INT_MAP2_REG, + BMI323_TAP_MSK, + FIELD_PREP(BMI323_TAP_MSK, tap_irq)); + if (ret) + return ret; + + if (!state) + return 0; + + ret = bmi323_update_ext_reg(data, BMI323_TAP1_REG, + BMI323_TAP1_MAX_PEAKS_MSK, + FIELD_PREP(BMI323_TAP1_MAX_PEAKS_MSK, + 0x04)); + if (ret) + return ret; + + ret = bmi323_update_ext_reg(data, BMI323_TAP1_REG, + BMI323_TAP1_AXIS_SEL_MSK, + FIELD_PREP(BMI323_TAP1_AXIS_SEL_MSK, + BMI323_AXIS_XYZ_MSK)); + if (ret) + return ret; + + return bmi323_update_ext_reg(data, BMI323_TAP1_REG, + BMI323_TAP1_TIMOUT_MSK, + FIELD_PREP(BMI323_TAP1_TIMOUT_MSK, + 0)); +} + +static ssize_t in_accel_gesture_tap_wait_dur_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bmi323_data *data = iio_priv(indio_dev); + unsigned int reg_value, raw; + int ret, val[2]; + + scoped_guard(mutex, &data->mutex) { + ret = bmi323_read_ext_reg(data, BMI323_TAP2_REG, ®_value); + if (ret) + return ret; + } + + raw = FIELD_GET(BMI323_TAP2_MAX_DUR_MSK, reg_value); + val[0] = raw / BMI323_MAX_GES_DUR_SCALE; + val[1] = BMI323_RAW_TO_MICRO(raw, BMI323_MAX_GES_DUR_SCALE); + + return iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(val), + val); +} + +static ssize_t in_accel_gesture_tap_wait_dur_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bmi323_data *data = iio_priv(indio_dev); + int ret, val_int, val_fract, raw; + + ret = iio_str_to_fixpoint(buf, 100000, &val_int, &val_fract); + if (ret) + return ret; + + raw = BMI323_INT_MICRO_TO_RAW(val_int, val_fract, + BMI323_MAX_GES_DUR_SCALE); + if (!in_range(raw, 0, 64)) + return -EINVAL; + + guard(mutex)(&data->mutex); + ret = bmi323_update_ext_reg(data, BMI323_TAP2_REG, + BMI323_TAP2_MAX_DUR_MSK, + FIELD_PREP(BMI323_TAP2_MAX_DUR_MSK, raw)); + if (ret) + return ret; + + return len; +} + +/* + * Maximum duration from first tap within the second tap is expected to happen. + * This timeout is applicable only if gesture_tap_wait_timeout is enabled. + */ +static IIO_DEVICE_ATTR_RW(in_accel_gesture_tap_wait_dur, 0); + +static ssize_t in_accel_gesture_tap_wait_timeout_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bmi323_data *data = iio_priv(indio_dev); + unsigned int reg_value, raw; + int ret; + + scoped_guard(mutex, &data->mutex) { + ret = bmi323_read_ext_reg(data, BMI323_TAP1_REG, ®_value); + if (ret) + return ret; + } + + raw = FIELD_GET(BMI323_TAP1_TIMOUT_MSK, reg_value); + + return iio_format_value(buf, IIO_VAL_INT, 1, &raw); +} + +static ssize_t in_accel_gesture_tap_wait_timeout_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t len) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bmi323_data *data = iio_priv(indio_dev); + bool val; + int ret; + + ret = kstrtobool(buf, &val); + if (ret) + return ret; + + guard(mutex)(&data->mutex); + ret = bmi323_update_ext_reg(data, BMI323_TAP1_REG, + BMI323_TAP1_TIMOUT_MSK, + FIELD_PREP(BMI323_TAP1_TIMOUT_MSK, val)); + if (ret) + return ret; + + return len; +} + +/* Enable/disable gesture confirmation with wait time */ +static IIO_DEVICE_ATTR_RW(in_accel_gesture_tap_wait_timeout, 0); + +static IIO_CONST_ATTR(in_accel_gesture_tap_wait_dur_available, + "[0.0 0.04 2.52]"); + +static IIO_CONST_ATTR(in_accel_gesture_doubletap_tap2_min_delay_available, + "[0.005 0.005 0.075]"); + +static IIO_CONST_ATTR(in_accel_gesture_tap_reset_timeout_available, + "[0.04 0.04 0.6]"); + +static IIO_CONST_ATTR(in_accel_gesture_tap_value_available, "[0.0 0.002 1.99]"); + +static IIO_CONST_ATTR(in_accel_mag_value_available, "[0.0 0.002 7.99]"); + +static IIO_CONST_ATTR(in_accel_mag_period_available, "[0.0 0.02 162.0]"); + +static IIO_CONST_ATTR(in_accel_mag_hysteresis_available, "[0.0 0.002 1.99]"); + +static struct attribute *bmi323_event_attributes[] = { + &iio_const_attr_in_accel_gesture_tap_value_available.dev_attr.attr, + &iio_const_attr_in_accel_gesture_tap_reset_timeout_available.dev_attr.attr, + &iio_const_attr_in_accel_gesture_doubletap_tap2_min_delay_available.dev_attr.attr, + &iio_const_attr_in_accel_gesture_tap_wait_dur_available.dev_attr.attr, + &iio_dev_attr_in_accel_gesture_tap_wait_timeout.dev_attr.attr, + &iio_dev_attr_in_accel_gesture_tap_wait_dur.dev_attr.attr, + &iio_const_attr_in_accel_mag_value_available.dev_attr.attr, + &iio_const_attr_in_accel_mag_period_available.dev_attr.attr, + &iio_const_attr_in_accel_mag_hysteresis_available.dev_attr.attr, + NULL +}; + +static const struct attribute_group bmi323_event_attribute_group = { + .attrs = bmi323_event_attributes, +}; + +static int bmi323_write_event_config(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir, int state) +{ + struct bmi323_data *data = iio_priv(indio_dev); + + switch (type) { + case IIO_EV_TYPE_MAG: + return bmi323_motion_event_en(data, dir, state); + case IIO_EV_TYPE_GESTURE: + return bmi323_tap_event_en(data, dir, state); + case IIO_EV_TYPE_CHANGE: + return bmi323_step_wtrmrk_en(data, state); + default: + return -EINVAL; + } +} + +static int bmi323_read_event_config(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir) +{ + struct bmi323_data *data = iio_priv(indio_dev); + int ret, value, reg_val; + + guard(mutex)(&data->mutex); + + switch (chan->type) { + case IIO_ACCEL: + switch (dir) { + case IIO_EV_DIR_SINGLETAP: + ret = FIELD_GET(BMI323_FEAT_IO0_S_TAP_MSK, + data->feature_events); + break; + case IIO_EV_DIR_DOUBLETAP: + ret = FIELD_GET(BMI323_FEAT_IO0_D_TAP_MSK, + data->feature_events); + break; + case IIO_EV_DIR_RISING: + value = FIELD_GET(BMI323_FEAT_IO0_XYZ_MOTION_MSK, + data->feature_events); + ret = value ? 1 : 0; + break; + case IIO_EV_DIR_FALLING: + value = FIELD_GET(BMI323_FEAT_IO0_XYZ_NOMOTION_MSK, + data->feature_events); + ret = value ? 1 : 0; + break; + default: + ret = -EINVAL; + break; + } + return ret; + case IIO_STEPS: + ret = regmap_read(data->regmap, BMI323_INT_MAP1_REG, ®_val); + if (ret) + return ret; + + return FIELD_GET(BMI323_STEP_CNT_MSK, reg_val) ? 1 : 0; + default: + return -EINVAL; + } +} + +static int bmi323_write_event_value(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir, + enum iio_event_info info, + int val, int val2) +{ + struct bmi323_data *data = iio_priv(indio_dev); + unsigned int raw; + int reg; + + guard(mutex)(&data->mutex); + + switch (type) { + case IIO_EV_TYPE_GESTURE: + switch (info) { + case IIO_EV_INFO_VALUE: + if (!in_range(val, 0, 2)) + return -EINVAL; + + raw = BMI323_INT_MICRO_TO_RAW(val, val2, + BMI323_TAP_THRES_SCALE); + + return bmi323_update_ext_reg(data, BMI323_TAP2_REG, + BMI323_TAP2_THRES_MSK, + FIELD_PREP(BMI323_TAP2_THRES_MSK, + raw)); + case IIO_EV_INFO_RESET_TIMEOUT: + if (val || !in_range(val2, 40000, 560001)) + return -EINVAL; + + raw = BMI323_INT_MICRO_TO_RAW(val, val2, + BMI323_QUITE_TIM_GES_SCALE); + + return bmi323_update_ext_reg(data, BMI323_TAP3_REG, + BMI323_TAP3_QT_AFT_GES_MSK, + FIELD_PREP(BMI323_TAP3_QT_AFT_GES_MSK, + raw)); + case IIO_EV_INFO_TAP2_MIN_DELAY: + if (val || !in_range(val2, 5000, 70001)) + return -EINVAL; + + raw = BMI323_INT_MICRO_TO_RAW(val, val2, + BMI323_DUR_BW_TAP_SCALE); + + return bmi323_update_ext_reg(data, BMI323_TAP3_REG, + BMI323_TAP3_QT_BW_TAP_MSK, + FIELD_PREP(BMI323_TAP3_QT_BW_TAP_MSK, + raw)); + default: + return -EINVAL; + } + case IIO_EV_TYPE_MAG: + reg = bmi323_motion_config_reg(dir); + if (reg < 0) + return -EINVAL; + + switch (info) { + case IIO_EV_INFO_VALUE: + if (!in_range(val, 0, 8)) + return -EINVAL; + + raw = BMI323_INT_MICRO_TO_RAW(val, val2, + BMI323_MOTION_THRES_SCALE); + + return bmi323_update_ext_reg(data, reg, + BMI323_MO1_SLOPE_TH_MSK, + FIELD_PREP(BMI323_MO1_SLOPE_TH_MSK, + raw)); + case IIO_EV_INFO_PERIOD: + if (!in_range(val, 0, 163)) + return -EINVAL; + + raw = BMI323_INT_MICRO_TO_RAW(val, val2, + BMI323_MOTION_DURAT_SCALE); + + return bmi323_update_ext_reg(data, + reg + BMI323_MO3_OFFSET, + BMI323_MO3_DURA_MSK, + FIELD_PREP(BMI323_MO3_DURA_MSK, + raw)); + case IIO_EV_INFO_HYSTERESIS: + if (!in_range(val, 0, 2)) + return -EINVAL; + + raw = BMI323_INT_MICRO_TO_RAW(val, val2, + BMI323_MOTION_HYSTR_SCALE); + + return bmi323_update_ext_reg(data, + reg + BMI323_MO2_OFFSET, + BMI323_MO2_HYSTR_MSK, + FIELD_PREP(BMI323_MO2_HYSTR_MSK, + raw)); + default: + return -EINVAL; + } + case IIO_EV_TYPE_CHANGE: + if (!in_range(val, 0, 20461)) + return -EINVAL; + + raw = val / 20; + return bmi323_update_ext_reg(data, BMI323_STEP_SC1_REG, + BMI323_STEP_SC1_WTRMRK_MSK, + FIELD_PREP(BMI323_STEP_SC1_WTRMRK_MSK, + raw)); + default: + return -EINVAL; + } +} + +static int bmi323_read_event_value(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir, + enum iio_event_info info, + int *val, int *val2) +{ + struct bmi323_data *data = iio_priv(indio_dev); + unsigned int raw, reg_value; + int ret, reg; + + guard(mutex)(&data->mutex); + + switch (type) { + case IIO_EV_TYPE_GESTURE: + switch (info) { + case IIO_EV_INFO_VALUE: + ret = bmi323_read_ext_reg(data, BMI323_TAP2_REG, + ®_value); + if (ret) + return ret; + + raw = FIELD_GET(BMI323_TAP2_THRES_MSK, reg_value); + *val = raw / BMI323_TAP_THRES_SCALE; + *val2 = BMI323_RAW_TO_MICRO(raw, BMI323_TAP_THRES_SCALE); + return IIO_VAL_INT_PLUS_MICRO; + case IIO_EV_INFO_RESET_TIMEOUT: + ret = bmi323_read_ext_reg(data, BMI323_TAP3_REG, + ®_value); + if (ret) + return ret; + + raw = FIELD_GET(BMI323_TAP3_QT_AFT_GES_MSK, reg_value); + *val = 0; + *val2 = BMI323_RAW_TO_MICRO(raw, + BMI323_QUITE_TIM_GES_SCALE); + return IIO_VAL_INT_PLUS_MICRO; + case IIO_EV_INFO_TAP2_MIN_DELAY: + ret = bmi323_read_ext_reg(data, BMI323_TAP3_REG, + ®_value); + if (ret) + return ret; + + raw = FIELD_GET(BMI323_TAP3_QT_BW_TAP_MSK, reg_value); + *val = 0; + *val2 = BMI323_RAW_TO_MICRO(raw, + BMI323_DUR_BW_TAP_SCALE); + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } + case IIO_EV_TYPE_MAG: + reg = bmi323_motion_config_reg(dir); + if (reg < 0) + return -EINVAL; + + switch (info) { + case IIO_EV_INFO_VALUE: + ret = bmi323_read_ext_reg(data, reg, ®_value); + if (ret) + return ret; + + raw = FIELD_GET(BMI323_MO1_SLOPE_TH_MSK, reg_value); + *val = raw / BMI323_MOTION_THRES_SCALE; + *val2 = BMI323_RAW_TO_MICRO(raw, + BMI323_MOTION_THRES_SCALE); + return IIO_VAL_INT_PLUS_MICRO; + case IIO_EV_INFO_PERIOD: + ret = bmi323_read_ext_reg(data, + reg + BMI323_MO3_OFFSET, + ®_value); + if (ret) + return ret; + + raw = FIELD_GET(BMI323_MO3_DURA_MSK, reg_value); + *val = raw / BMI323_MOTION_DURAT_SCALE; + *val2 = BMI323_RAW_TO_MICRO(raw, + BMI323_MOTION_DURAT_SCALE); + return IIO_VAL_INT_PLUS_MICRO; + case IIO_EV_INFO_HYSTERESIS: + ret = bmi323_read_ext_reg(data, + reg + BMI323_MO2_OFFSET, + ®_value); + if (ret) + return ret; + + raw = FIELD_GET(BMI323_MO2_HYSTR_MSK, reg_value); + *val = raw / BMI323_MOTION_HYSTR_SCALE; + *val2 = BMI323_RAW_TO_MICRO(raw, + BMI323_MOTION_HYSTR_SCALE); + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } + case IIO_EV_TYPE_CHANGE: + ret = bmi323_read_ext_reg(data, BMI323_STEP_SC1_REG, + ®_value); + if (ret) + return ret; + + raw = FIELD_GET(BMI323_STEP_SC1_WTRMRK_MSK, reg_value); + *val = raw * 20; + return IIO_VAL_INT; + default: + return -EINVAL; + } +} + +static int __bmi323_fifo_flush(struct iio_dev *indio_dev) +{ + struct bmi323_data *data = iio_priv(indio_dev); + int i, ret, fifo_lvl, frame_count, bit, index; + __le16 *frame, *pchannels; + u64 sample_period; + s64 tstamp; + + guard(mutex)(&data->mutex); + ret = regmap_read(data->regmap, BMI323_FIFO_FILL_LEVEL_REG, &fifo_lvl); + if (ret) + return ret; + + fifo_lvl = min(fifo_lvl, BMI323_FIFO_FULL_IN_WORDS); + + frame_count = fifo_lvl / BMI323_FIFO_FRAME_LENGTH; + if (!frame_count) + return -EINVAL; + + if (fifo_lvl % BMI323_FIFO_FRAME_LENGTH) + dev_warn(data->dev, "Bad FIFO alignment\n"); + + /* + * Approximate timestamps for each of the sample based on the sampling + * frequency, timestamp for last sample and number of samples. + */ + if (data->old_fifo_tstamp) { + sample_period = data->fifo_tstamp - data->old_fifo_tstamp; + do_div(sample_period, frame_count); + } else { + sample_period = data->odrns[BMI323_ACCEL]; + } + + tstamp = data->fifo_tstamp - (frame_count - 1) * sample_period; + + ret = regmap_noinc_read(data->regmap, BMI323_FIFO_DATA_REG, + &data->fifo_buff[0], + fifo_lvl * BMI323_BYTES_PER_SAMPLE); + if (ret) + return ret; + + for (i = 0; i < frame_count; i++) { + frame = &data->fifo_buff[i * BMI323_FIFO_FRAME_LENGTH]; + pchannels = &data->buffer.channels[0]; + + index = 0; + for_each_set_bit(bit, indio_dev->active_scan_mask, + BMI323_CHAN_MAX) + pchannels[index++] = frame[bit]; + + iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, + tstamp); + + tstamp += sample_period; + } + + return frame_count; +} + +static int bmi323_set_watermark(struct iio_dev *indio_dev, unsigned int val) +{ + struct bmi323_data *data = iio_priv(indio_dev); + + val = min(val, (u32)BMI323_FIFO_FULL_IN_FRAMES); + + guard(mutex)(&data->mutex); + data->watermark = val; + + return 0; +} + +static int bmi323_fifo_disable(struct bmi323_data *data) +{ + int ret; + + guard(mutex)(&data->mutex); + ret = regmap_write(data->regmap, BMI323_FIFO_CONF_REG, 0); + if (ret) + return ret; + + ret = regmap_update_bits(data->regmap, BMI323_INT_MAP2_REG, + BMI323_FIFO_WTRMRK_MSK, + FIELD_PREP(BMI323_FIFO_WTRMRK_MSK, 0)); + if (ret) + return ret; + + data->fifo_tstamp = 0; + data->state = BMI323_IDLE; + + return 0; +} + +static int bmi323_buffer_predisable(struct iio_dev *indio_dev) +{ + struct bmi323_data *data = iio_priv(indio_dev); + + if (iio_device_get_current_mode(indio_dev) == INDIO_BUFFER_TRIGGERED) + return 0; + + return bmi323_fifo_disable(data); +} + +static int bmi323_update_watermark(struct bmi323_data *data) +{ + int wtrmrk; + + wtrmrk = data->watermark * BMI323_FIFO_FRAME_LENGTH; + + return regmap_write(data->regmap, BMI323_FIFO_WTRMRK_REG, wtrmrk); +} + +static int bmi323_fifo_enable(struct bmi323_data *data) +{ + int ret; + + guard(mutex)(&data->mutex); + ret = regmap_update_bits(data->regmap, BMI323_FIFO_CONF_REG, + BMI323_FIFO_CONF_ACC_GYR_EN_MSK, + FIELD_PREP(BMI323_FIFO_CONF_ACC_GYR_EN_MSK, + BMI323_FIFO_ACC_GYR_MSK)); + if (ret) + return ret; + + ret = regmap_update_bits(data->regmap, BMI323_INT_MAP2_REG, + BMI323_FIFO_WTRMRK_MSK, + FIELD_PREP(BMI323_FIFO_WTRMRK_MSK, + data->irq_pin)); + if (ret) + return ret; + + ret = bmi323_update_watermark(data); + if (ret) + return ret; + + ret = regmap_write(data->regmap, BMI323_FIFO_CTRL_REG, + BMI323_FIFO_FLUSH_MSK); + if (ret) + return ret; + + data->state = BMI323_BUFFER_FIFO; + + return 0; +} + +static int bmi323_buffer_preenable(struct iio_dev *indio_dev) +{ + struct bmi323_data *data = iio_priv(indio_dev); + + guard(mutex)(&data->mutex); + /* + * When the ODR of the accelerometer and gyroscope do not match, the + * maximum ODR value between the accelerometer and gyroscope is used + * for FIFO and the signal with lower ODR will insert dummy frame. + * So allow buffer read only when ODR's of accelero and gyro are equal. + * See datasheet section 5.7 "FIFO Data Buffering". + */ + if (data->odrns[BMI323_ACCEL] != data->odrns[BMI323_GYRO]) { + dev_err(data->dev, "Accelero and Gyro ODR doesn't match\n"); + return -EINVAL; + } + + return 0; +} + +static int bmi323_buffer_postenable(struct iio_dev *indio_dev) +{ + struct bmi323_data *data = iio_priv(indio_dev); + + if (iio_device_get_current_mode(indio_dev) == INDIO_BUFFER_TRIGGERED) + return 0; + + return bmi323_fifo_enable(data); +} + +static ssize_t hwfifo_watermark_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bmi323_data *data = iio_priv(indio_dev); + int wm; + + scoped_guard(mutex, &data->mutex) + wm = data->watermark; + + return sysfs_emit(buf, "%d\n", wm); +} +static IIO_DEVICE_ATTR_RO(hwfifo_watermark, 0); + +static ssize_t hwfifo_enabled_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bmi323_data *data = iio_priv(indio_dev); + bool state; + + scoped_guard(mutex, &data->mutex) + state = data->state == BMI323_BUFFER_FIFO; + + return sysfs_emit(buf, "%d\n", state); +} +static IIO_DEVICE_ATTR_RO(hwfifo_enabled, 0); + +static const struct iio_dev_attr *bmi323_fifo_attributes[] = { + &iio_dev_attr_hwfifo_watermark, + &iio_dev_attr_hwfifo_enabled, + NULL +}; + +static const struct iio_buffer_setup_ops bmi323_buffer_ops = { + .preenable = bmi323_buffer_preenable, + .postenable = bmi323_buffer_postenable, + .predisable = bmi323_buffer_predisable, +}; + +static irqreturn_t bmi323_irq_thread_handler(int irq, void *private) +{ + struct iio_dev *indio_dev = private; + struct bmi323_data *data = iio_priv(indio_dev); + unsigned int status_addr, status, feature_event; + s64 timestamp = iio_get_time_ns(indio_dev); + int ret; + + if (data->irq_pin == BMI323_IRQ_INT1) + status_addr = BMI323_STATUS_INT1_REG; + else + status_addr = BMI323_STATUS_INT2_REG; + + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, status_addr, &status); + if (ret) + return IRQ_NONE; + } + + if (!status || FIELD_GET(BMI323_STATUS_ERROR_MSK, status)) + return IRQ_NONE; + + if (FIELD_GET(BMI323_STATUS_FIFO_WTRMRK_MSK, status)) { + data->old_fifo_tstamp = data->fifo_tstamp; + data->fifo_tstamp = iio_get_time_ns(indio_dev); + ret = __bmi323_fifo_flush(indio_dev); + if (ret < 0) + return IRQ_NONE; + } + + if (FIELD_GET(BMI323_STATUS_ACC_GYR_DRDY_MSK, status)) + iio_trigger_poll_nested(data->trig); + + if (FIELD_GET(BMI323_STATUS_MOTION_MSK, status)) + iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_OR_Y_OR_Z, + IIO_EV_TYPE_MAG, + IIO_EV_DIR_RISING), + timestamp); + + if (FIELD_GET(BMI323_STATUS_NOMOTION_MSK, status)) + iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_OR_Y_OR_Z, + IIO_EV_TYPE_MAG, + IIO_EV_DIR_FALLING), + timestamp); + + if (FIELD_GET(BMI323_STATUS_STP_WTR_MSK, status)) + iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_STEPS, 0, + IIO_NO_MOD, + IIO_EV_TYPE_CHANGE, + IIO_EV_DIR_NONE), + timestamp); + + if (FIELD_GET(BMI323_STATUS_TAP_MSK, status)) { + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, + BMI323_FEAT_EVNT_EXT_REG, + &feature_event); + if (ret) + return IRQ_NONE; + } + + if (FIELD_GET(BMI323_FEAT_EVNT_EXT_S_MSK, feature_event)) { + iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_OR_Y_OR_Z, + IIO_EV_TYPE_GESTURE, + IIO_EV_DIR_SINGLETAP), + timestamp); + } + + if (FIELD_GET(BMI323_FEAT_EVNT_EXT_D_MSK, feature_event)) + iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_OR_Y_OR_Z, + IIO_EV_TYPE_GESTURE, + IIO_EV_DIR_DOUBLETAP), + timestamp); + } + + return IRQ_HANDLED; +} + +static int bmi323_set_drdy_irq(struct bmi323_data *data, + enum bmi323_irq_pin irq_pin) +{ + int ret; + + ret = regmap_update_bits(data->regmap, BMI323_INT_MAP2_REG, + BMI323_GYR_DRDY_MSK, + FIELD_PREP(BMI323_GYR_DRDY_MSK, irq_pin)); + if (ret) + return ret; + + return regmap_update_bits(data->regmap, BMI323_INT_MAP2_REG, + BMI323_ACC_DRDY_MSK, + FIELD_PREP(BMI323_ACC_DRDY_MSK, irq_pin)); +} + +static int bmi323_data_rdy_trigger_set_state(struct iio_trigger *trig, + bool state) +{ + struct bmi323_data *data = iio_trigger_get_drvdata(trig); + enum bmi323_irq_pin irq_pin; + + guard(mutex)(&data->mutex); + + if (data->state == BMI323_BUFFER_FIFO) { + dev_warn(data->dev, "Can't set trigger when FIFO enabled\n"); + return -EBUSY; + } + + if (state) { + data->state = BMI323_BUFFER_DRDY_TRIGGERED; + irq_pin = data->irq_pin; + } else { + data->state = BMI323_IDLE; + irq_pin = BMI323_IRQ_DISABLED; + } + + return bmi323_set_drdy_irq(data, irq_pin); +} + +static const struct iio_trigger_ops bmi323_trigger_ops = { + .set_trigger_state = &bmi323_data_rdy_trigger_set_state, +}; + +static irqreturn_t bmi323_trigger_handler(int irq, void *p) +{ + struct iio_poll_func *pf = p; + struct iio_dev *indio_dev = pf->indio_dev; + struct bmi323_data *data = iio_priv(indio_dev); + int ret, bit, index = 0; + + /* Lock to protect the data->buffer */ + guard(mutex)(&data->mutex); + + if (*indio_dev->active_scan_mask == BMI323_ALL_CHAN_MSK) { + ret = regmap_bulk_read(data->regmap, BMI323_ACCEL_X_REG, + &data->buffer.channels, + ARRAY_SIZE(data->buffer.channels)); + if (ret) + return IRQ_NONE; + } else { + for_each_set_bit(bit, indio_dev->active_scan_mask, + BMI323_CHAN_MAX) { + ret = regmap_raw_read(data->regmap, + BMI323_ACCEL_X_REG + bit, + &data->buffer.channels[index++], + BMI323_BYTES_PER_SAMPLE); + if (ret) + return IRQ_NONE; + } + } + + iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, + iio_get_time_ns(indio_dev)); + + iio_trigger_notify_done(indio_dev->trig); + + return IRQ_HANDLED; +} + +static int bmi323_set_average(struct bmi323_data *data, + enum bmi323_sensor_type sensor, int avg) +{ + int raw = ARRAY_SIZE(bmi323_accel_gyro_avrg); + + while (raw--) + if (avg == bmi323_accel_gyro_avrg[raw]) + break; + if (raw < 0) + return -EINVAL; + + guard(mutex)(&data->mutex); + return regmap_update_bits(data->regmap, bmi323_hw[sensor].config, + BMI323_ACC_GYRO_CONF_AVG_MSK, + FIELD_PREP(BMI323_ACC_GYRO_CONF_AVG_MSK, + raw)); +} + +static int bmi323_get_average(struct bmi323_data *data, + enum bmi323_sensor_type sensor, int *avg) +{ + int ret, value, raw; + + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, bmi323_hw[sensor].config, &value); + if (ret) + return ret; + } + + raw = FIELD_GET(BMI323_ACC_GYRO_CONF_AVG_MSK, value); + *avg = bmi323_accel_gyro_avrg[raw]; + + return IIO_VAL_INT; +} + +static int bmi323_enable_steps(struct bmi323_data *data, int val) +{ + int ret; + + guard(mutex)(&data->mutex); + if (data->odrhz[BMI323_ACCEL] < 200) { + dev_err(data->dev, "Invalid accelrometer parameter\n"); + return -EINVAL; + } + + ret = bmi323_feature_engine_events(data, BMI323_FEAT_IO0_STP_CNT_MSK, + val ? 1 : 0); + if (ret) + return ret; + + set_mask_bits(&data->feature_events, BMI323_FEAT_IO0_STP_CNT_MSK, + FIELD_PREP(BMI323_FEAT_IO0_STP_CNT_MSK, val ? 1 : 0)); + + return 0; +} + +static int bmi323_read_steps(struct bmi323_data *data, int *val) +{ + int ret; + + guard(mutex)(&data->mutex); + if (!FIELD_GET(BMI323_FEAT_IO0_STP_CNT_MSK, data->feature_events)) + return -EINVAL; + + ret = regmap_bulk_read(data->regmap, BMI323_FEAT_IO2_REG, + data->steps_count, + ARRAY_SIZE(data->steps_count)); + if (ret) + return ret; + + *val = get_unaligned_le32(data->steps_count); + + return IIO_VAL_INT; +} + +static int bmi323_read_axis(struct bmi323_data *data, + struct iio_chan_spec const *chan, int *val) +{ + enum bmi323_sensor_type sensor; + unsigned int value; + u8 addr; + int ret; + + ret = bmi323_get_error_status(data); + if (ret) + return -EINVAL; + + sensor = bmi323_iio_to_sensor(chan->type); + addr = bmi323_hw[sensor].data + (chan->channel2 - IIO_MOD_X); + + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, addr, &value); + if (ret) + return ret; + } + + *val = sign_extend32(value, chan->scan_type.realbits - 1); + + return IIO_VAL_INT; +} + +static int bmi323_get_temp_data(struct bmi323_data *data, int *val) +{ + unsigned int value; + int ret; + + ret = bmi323_get_error_status(data); + if (ret) + return -EINVAL; + + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, BMI323_TEMP_REG, &value); + if (ret) + return ret; + } + + *val = sign_extend32(value, 15); + + return IIO_VAL_INT; +} + +static int bmi323_get_odr(struct bmi323_data *data, + enum bmi323_sensor_type sensor, int *odr, int *uodr) +{ + int ret, value, odr_raw; + + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, bmi323_hw[sensor].config, &value); + if (ret) + return ret; + } + + odr_raw = FIELD_GET(BMI323_ACC_GYRO_CONF_ODR_MSK, value); + *odr = bmi323_acc_gyro_odr[odr_raw - 1][0]; + *uodr = bmi323_acc_gyro_odr[odr_raw - 1][1]; + + return IIO_VAL_INT_PLUS_MICRO; +} + +static int bmi323_configure_power_mode(struct bmi323_data *data, + enum bmi323_sensor_type sensor, + int odr_index) +{ + enum bmi323_opr_mode mode; + + if (bmi323_acc_gyro_odr[odr_index][0] > 25) + mode = ACC_GYRO_MODE_CONTINOUS; + else + mode = ACC_GYRO_MODE_DUTYCYCLE; + + return bmi323_set_mode(data, sensor, mode); +} + +static int bmi323_set_odr(struct bmi323_data *data, + enum bmi323_sensor_type sensor, int odr, int uodr) +{ + int odr_raw, ret; + + odr_raw = ARRAY_SIZE(bmi323_acc_gyro_odr); + + while (odr_raw--) + if (odr == bmi323_acc_gyro_odr[odr_raw][0] && + uodr == bmi323_acc_gyro_odr[odr_raw][1]) + break; + if (odr_raw < 0) + return -EINVAL; + + ret = bmi323_configure_power_mode(data, sensor, odr_raw); + if (ret) + return -EINVAL; + + guard(mutex)(&data->mutex); + data->odrhz[sensor] = bmi323_acc_gyro_odr[odr_raw][0]; + data->odrns[sensor] = bmi323_acc_gyro_odrns[odr_raw]; + + odr_raw++; + + return regmap_update_bits(data->regmap, bmi323_hw[sensor].config, + BMI323_ACC_GYRO_CONF_ODR_MSK, + FIELD_PREP(BMI323_ACC_GYRO_CONF_ODR_MSK, + odr_raw)); +} + +static int bmi323_get_scale(struct bmi323_data *data, + enum bmi323_sensor_type sensor, int *val2) +{ + int ret, value, scale_raw; + + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, bmi323_hw[sensor].config, + &value); + if (ret) + return ret; + } + + scale_raw = FIELD_GET(BMI323_ACC_GYRO_CONF_SCL_MSK, value); + *val2 = bmi323_hw[sensor].scale_table[scale_raw][1]; + + return IIO_VAL_INT_PLUS_MICRO; +} + +static int bmi323_set_scale(struct bmi323_data *data, + enum bmi323_sensor_type sensor, int val, int val2) +{ + int scale_raw; + + scale_raw = bmi323_hw[sensor].scale_table_len; + + while (scale_raw--) + if (val == bmi323_hw[sensor].scale_table[scale_raw][0] && + val2 == bmi323_hw[sensor].scale_table[scale_raw][1]) + break; + if (scale_raw < 0) + return -EINVAL; + + guard(mutex)(&data->mutex); + return regmap_update_bits(data->regmap, bmi323_hw[sensor].config, + BMI323_ACC_GYRO_CONF_SCL_MSK, + FIELD_PREP(BMI323_ACC_GYRO_CONF_SCL_MSK, + scale_raw)); +} + +static int bmi323_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, int *type, int *length, + long mask) +{ + enum bmi323_sensor_type sensor; + + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + *type = IIO_VAL_INT_PLUS_MICRO; + *vals = (const int *)bmi323_acc_gyro_odr; + *length = ARRAY_SIZE(bmi323_acc_gyro_odr) * 2; + return IIO_AVAIL_LIST; + case IIO_CHAN_INFO_SCALE: + sensor = bmi323_iio_to_sensor(chan->type); + *type = IIO_VAL_INT_PLUS_MICRO; + *vals = (const int *)bmi323_hw[sensor].scale_table; + *length = bmi323_hw[sensor].scale_table_len * 2; + return IIO_AVAIL_LIST; + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + *type = IIO_VAL_INT; + *vals = (const int *)bmi323_accel_gyro_avrg; + *length = ARRAY_SIZE(bmi323_accel_gyro_avrg); + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } +} + +static int bmi323_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int val, + int val2, long mask) +{ + struct bmi323_data *data = iio_priv(indio_dev); + int ret; + + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + ret = iio_device_claim_direct_mode(indio_dev); + if (ret) + return ret; + + ret = bmi323_set_odr(data, bmi323_iio_to_sensor(chan->type), + val, val2); + iio_device_release_direct_mode(indio_dev); + return ret; + case IIO_CHAN_INFO_SCALE: + ret = iio_device_claim_direct_mode(indio_dev); + if (ret) + return ret; + + ret = bmi323_set_scale(data, bmi323_iio_to_sensor(chan->type), + val, val2); + iio_device_release_direct_mode(indio_dev); + return ret; + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + ret = iio_device_claim_direct_mode(indio_dev); + if (ret) + return ret; + + ret = bmi323_set_average(data, bmi323_iio_to_sensor(chan->type), + val); + + iio_device_release_direct_mode(indio_dev); + return ret; + case IIO_CHAN_INFO_ENABLE: + return bmi323_enable_steps(data, val); + case IIO_CHAN_INFO_PROCESSED: + scoped_guard(mutex, &data->mutex) { + if (val || !FIELD_GET(BMI323_FEAT_IO0_STP_CNT_MSK, + data->feature_events)) + return -EINVAL; + + /* Clear step counter value */ + ret = bmi323_update_ext_reg(data, BMI323_STEP_SC1_REG, + BMI323_STEP_SC1_RST_CNT_MSK, + FIELD_PREP(BMI323_STEP_SC1_RST_CNT_MSK, + 1)); + } + return ret; + default: + return -EINVAL; + } +} + +static int bmi323_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int *val, + int *val2, long mask) +{ + struct bmi323_data *data = iio_priv(indio_dev); + int ret; + + switch (mask) { + case IIO_CHAN_INFO_PROCESSED: + return bmi323_read_steps(data, val); + case IIO_CHAN_INFO_RAW: + switch (chan->type) { + case IIO_ACCEL: + case IIO_ANGL_VEL: + ret = iio_device_claim_direct_mode(indio_dev); + if (ret) + return ret; + + ret = bmi323_read_axis(data, chan, val); + + iio_device_release_direct_mode(indio_dev); + return ret; + case IIO_TEMP: + return bmi323_get_temp_data(data, val); + default: + return -EINVAL; + } + case IIO_CHAN_INFO_SAMP_FREQ: + return bmi323_get_odr(data, bmi323_iio_to_sensor(chan->type), + val, val2); + case IIO_CHAN_INFO_SCALE: + switch (chan->type) { + case IIO_ACCEL: + case IIO_ANGL_VEL: + *val = 0; + return bmi323_get_scale(data, + bmi323_iio_to_sensor(chan->type), + val2); + case IIO_TEMP: + *val = BMI323_TEMP_SCALE / MEGA; + *val2 = BMI323_TEMP_SCALE % MEGA; + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + return bmi323_get_average(data, + bmi323_iio_to_sensor(chan->type), + val); + case IIO_CHAN_INFO_OFFSET: + switch (chan->type) { + case IIO_TEMP: + *val = BMI323_TEMP_OFFSET; + return IIO_VAL_INT; + default: + return -EINVAL; + } + case IIO_CHAN_INFO_ENABLE: + scoped_guard(mutex, &data->mutex) + *val = FIELD_GET(BMI323_FEAT_IO0_STP_CNT_MSK, + data->feature_events); + return IIO_VAL_INT; + default: + return -EINVAL; + } +} + +static const struct iio_info bmi323_info = { + .read_raw = bmi323_read_raw, + .write_raw = bmi323_write_raw, + .read_avail = bmi323_read_avail, + .hwfifo_set_watermark = bmi323_set_watermark, + .write_event_config = bmi323_write_event_config, + .read_event_config = bmi323_read_event_config, + .write_event_value = bmi323_write_event_value, + .read_event_value = bmi323_read_event_value, + .event_attrs = &bmi323_event_attribute_group, +}; + +#define BMI323_SCAN_MASK_ACCEL_3AXIS \ + (BIT(BMI323_ACCEL_X) | BIT(BMI323_ACCEL_Y) | BIT(BMI323_ACCEL_Z)) + +#define BMI323_SCAN_MASK_GYRO_3AXIS \ + (BIT(BMI323_GYRO_X) | BIT(BMI323_GYRO_Y) | BIT(BMI323_GYRO_Z)) + +static const unsigned long bmi323_avail_scan_masks[] = { + /* 3-axis accel */ + BMI323_SCAN_MASK_ACCEL_3AXIS, + /* 3-axis gyro */ + BMI323_SCAN_MASK_GYRO_3AXIS, + /* 3-axis accel + 3-axis gyro */ + BMI323_SCAN_MASK_ACCEL_3AXIS | BMI323_SCAN_MASK_GYRO_3AXIS, + 0 +}; + +static int bmi323_int_pin_config(struct bmi323_data *data, + enum bmi323_irq_pin irq_pin, + bool active_high, bool open_drain, bool latch) +{ + unsigned int mask, field_value; + int ret; + + ret = regmap_update_bits(data->regmap, BMI323_IO_INT_CONF_REG, + BMI323_IO_INT_LTCH_MSK, + FIELD_PREP(BMI323_IO_INT_LTCH_MSK, latch)); + if (ret) + return ret; + + ret = bmi323_update_ext_reg(data, BMI323_GEN_SET1_REG, + BMI323_GEN_HOLD_DUR_MSK, + FIELD_PREP(BMI323_GEN_HOLD_DUR_MSK, 0)); + if (ret) + return ret; + + switch (irq_pin) { + case BMI323_IRQ_INT1: + mask = BMI323_IO_INT1_LVL_OD_OP_MSK; + + field_value = FIELD_PREP(BMI323_IO_INT1_LVL_MSK, active_high) | + FIELD_PREP(BMI323_IO_INT1_OD_MSK, open_drain) | + FIELD_PREP(BMI323_IO_INT1_OP_EN_MSK, 1); + break; + case BMI323_IRQ_INT2: + mask = BMI323_IO_INT2_LVL_OD_OP_MSK; + + field_value = FIELD_PREP(BMI323_IO_INT2_LVL_MSK, active_high) | + FIELD_PREP(BMI323_IO_INT2_OD_MSK, open_drain) | + FIELD_PREP(BMI323_IO_INT2_OP_EN_MSK, 1); + break; + default: + return -EINVAL; + } + + return regmap_update_bits(data->regmap, BMI323_IO_INT_CTR_REG, mask, + field_value); +} + +static int bmi323_trigger_probe(struct bmi323_data *data, + struct iio_dev *indio_dev) +{ + bool open_drain, active_high, latch; + struct fwnode_handle *fwnode; + enum bmi323_irq_pin irq_pin; + int ret, irq, irq_type; + struct irq_data *desc; + + fwnode = dev_fwnode(data->dev); + if (!fwnode) + return -ENODEV; + + irq = fwnode_irq_get_byname(fwnode, "INT1"); + if (irq > 0) { + irq_pin = BMI323_IRQ_INT1; + } else { + irq = fwnode_irq_get_byname(fwnode, "INT2"); + if (irq < 0) + return 0; + + irq_pin = BMI323_IRQ_INT2; + } + + desc = irq_get_irq_data(irq); + if (!desc) + return dev_err_probe(data->dev, -EINVAL, + "Could not find IRQ %d\n", irq); + + irq_type = irqd_get_trigger_type(desc); + switch (irq_type) { + case IRQF_TRIGGER_RISING: + latch = false; + active_high = true; + break; + case IRQF_TRIGGER_HIGH: + latch = true; + active_high = true; + break; + case IRQF_TRIGGER_FALLING: + latch = false; + active_high = false; + break; + case IRQF_TRIGGER_LOW: + latch = true; + active_high = false; + break; + default: + return dev_err_probe(data->dev, -EINVAL, + "Invalid interrupt type 0x%x specified\n", + irq_type); + } + + open_drain = fwnode_property_read_bool(fwnode, "drive-open-drain"); + + ret = bmi323_int_pin_config(data, irq_pin, active_high, open_drain, + latch); + if (ret) + return dev_err_probe(data->dev, ret, + "Failed to configure irq line\n"); + + data->trig = devm_iio_trigger_alloc(data->dev, "%s-trig-%d", + indio_dev->name, irq_pin); + if (!data->trig) + return -ENOMEM; + + data->trig->ops = &bmi323_trigger_ops; + iio_trigger_set_drvdata(data->trig, data); + + ret = devm_request_threaded_irq(data->dev, irq, NULL, + bmi323_irq_thread_handler, + IRQF_ONESHOT, "bmi323-int", indio_dev); + if (ret) + return dev_err_probe(data->dev, ret, "Failed to request IRQ\n"); + + ret = devm_iio_trigger_register(data->dev, data->trig); + if (ret) + return dev_err_probe(data->dev, ret, + "Trigger registration failed\n"); + + data->irq_pin = irq_pin; + + return 0; +} + +static int bmi323_feature_engine_enable(struct bmi323_data *data, bool en) +{ + unsigned int feature_status; + int ret; + + if (!en) + return regmap_write(data->regmap, BMI323_FEAT_CTRL_REG, 0); + + ret = regmap_write(data->regmap, BMI323_FEAT_IO2_REG, 0x012c); + if (ret) + return ret; + + ret = regmap_write(data->regmap, BMI323_FEAT_IO_STATUS_REG, + BMI323_FEAT_IO_STATUS_MSK); + if (ret) + return ret; + + ret = regmap_write(data->regmap, BMI323_FEAT_CTRL_REG, + BMI323_FEAT_ENG_EN_MSK); + if (ret) + return ret; + + /* + * It takes around 4 msec to enable the Feature engine, so check + * the status of the feature engine every 2 msec for a maximum + * of 5 trials. + */ + ret = regmap_read_poll_timeout(data->regmap, BMI323_FEAT_IO1_REG, + feature_status, + FIELD_GET(BMI323_FEAT_IO1_ERR_MSK, + feature_status) == 1, + BMI323_FEAT_ENG_POLL, + BMI323_FEAT_ENG_TIMEOUT); + if (ret) + return dev_err_probe(data->dev, -EINVAL, + "Failed to enable feature engine\n"); + + return 0; +} + +static void bmi323_disable(void *data_ptr) +{ + struct bmi323_data *data = data_ptr; + + bmi323_set_mode(data, BMI323_ACCEL, ACC_GYRO_MODE_DISABLE); + bmi323_set_mode(data, BMI323_GYRO, ACC_GYRO_MODE_DISABLE); +} + +static int bmi323_set_bw(struct bmi323_data *data, + enum bmi323_sensor_type sensor, enum bmi323_3db_bw bw) +{ + return regmap_update_bits(data->regmap, bmi323_hw[sensor].config, + BMI323_ACC_GYRO_CONF_BW_MSK, + FIELD_PREP(BMI323_ACC_GYRO_CONF_BW_MSK, bw)); +} + +static int bmi323_init(struct bmi323_data *data) +{ + int ret, val; + + /* + * Perform soft reset to make sure the device is in a known state after + * start up. A delay of 1.5 ms is required after reset. + * See datasheet section 5.17 "Soft Reset". + */ + ret = regmap_write(data->regmap, BMI323_CMD_REG, BMI323_RST_VAL); + if (ret) + return ret; + + usleep_range(1500, 2000); + + /* + * Dummy read is required to enable SPI interface after reset. + * See datasheet section 7.2.1 "Protocol Selection". + */ + regmap_read(data->regmap, BMI323_CHIP_ID_REG, &val); + + ret = regmap_read(data->regmap, BMI323_STATUS_REG, &val); + if (ret) + return ret; + + if (!FIELD_GET(BMI323_STATUS_POR_MSK, val)) + return dev_err_probe(data->dev, -EINVAL, + "Sensor initialization error\n"); + + ret = regmap_read(data->regmap, BMI323_CHIP_ID_REG, &val); + if (ret) + return ret; + + if (FIELD_GET(BMI323_CHIP_ID_MSK, val) != BMI323_CHIP_ID_VAL) + return dev_err_probe(data->dev, -EINVAL, "Chip ID mismatch\n"); + + ret = bmi323_feature_engine_enable(data, true); + if (ret) + return ret; + + ret = regmap_read(data->regmap, BMI323_ERR_REG, &val); + if (ret) + return ret; + + if (val) + return dev_err_probe(data->dev, -EINVAL, + "Sensor power error = 0x%x\n", val); + + /* + * Set the Bandwidth coefficient which defines the 3 dB cutoff + * frequency in relation to the ODR. + */ + ret = bmi323_set_bw(data, BMI323_ACCEL, BMI323_BW_ODR_BY_2); + if (ret) + return ret; + + ret = bmi323_set_bw(data, BMI323_GYRO, BMI323_BW_ODR_BY_2); + if (ret) + return ret; + + ret = bmi323_set_odr(data, BMI323_ACCEL, 25, 0); + if (ret) + return ret; + + ret = bmi323_set_odr(data, BMI323_GYRO, 25, 0); + if (ret) + return ret; + + return devm_add_action_or_reset(data->dev, bmi323_disable, data); +} + +int bmi323_core_probe(struct device *dev) +{ + static const char * const regulator_names[] = { "vdd", "vddio" }; + struct iio_dev *indio_dev; + struct bmi323_data *data; + struct regmap *regmap; + int ret; + + regmap = dev_get_regmap(dev, NULL); + if (!regmap) + return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n"); + + indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); + if (!indio_dev) + return dev_err_probe(dev, -ENOMEM, + "Failed to allocate device\n"); + + ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names), + regulator_names); + if (ret) + return dev_err_probe(dev, ret, "Failed to enable regulators\n"); + + data = iio_priv(indio_dev); + data->dev = dev; + data->regmap = regmap; + mutex_init(&data->mutex); + + ret = bmi323_init(data); + if (ret) + return -EINVAL; + + ret = iio_read_mount_matrix(dev, &data->orientation); + if (ret) + return ret; + + indio_dev->name = "bmi323-imu"; + indio_dev->info = &bmi323_info; + indio_dev->channels = bmi323_channels; + indio_dev->num_channels = ARRAY_SIZE(bmi323_channels); + indio_dev->available_scan_masks = bmi323_avail_scan_masks; + indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE; + dev_set_drvdata(data->dev, indio_dev); + + ret = bmi323_trigger_probe(data, indio_dev); + if (ret) + return -EINVAL; + + ret = devm_iio_triggered_buffer_setup_ext(data->dev, indio_dev, + &iio_pollfunc_store_time, + bmi323_trigger_handler, + IIO_BUFFER_DIRECTION_IN, + &bmi323_buffer_ops, + bmi323_fifo_attributes); + if (ret) + return dev_err_probe(data->dev, ret, + "Failed to setup trigger buffer\n"); + + ret = devm_iio_device_register(data->dev, indio_dev); + if (ret) + return dev_err_probe(data->dev, ret, + "Unable to register iio device\n"); + + return 0; +} +EXPORT_SYMBOL_NS_GPL(bmi323_core_probe, IIO_BMI323); + +MODULE_DESCRIPTION("Bosch BMI323 IMU driver"); +MODULE_AUTHOR("Jagath Jog J "); +MODULE_LICENSE("GPL"); diff --git a/drivers/iio/imu/bmi323/bmi323_i2c.c b/drivers/iio/imu/bmi323/bmi323_i2c.c new file mode 100644 index 00000000000000..0008e186367d64 --- /dev/null +++ b/drivers/iio/imu/bmi323/bmi323_i2c.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * I2C driver for Bosch BMI323 6-Axis IMU. + * + * Copyright (C) 2023, Jagath Jog J + */ + +#include +#include +#include +#include + +#include "bmi323.h" + +struct bmi323_i2c_priv { + struct i2c_client *i2c; + u8 i2c_rx_buffer[BMI323_FIFO_LENGTH_IN_BYTES + BMI323_I2C_DUMMY]; +}; + +/* + * From BMI323 datasheet section 4: Notes on the Serial Interface Support. + * Each I2C register read operation requires to read two dummy bytes before + * the actual payload. + */ +static int bmi323_regmap_i2c_read(void *context, const void *reg_buf, + size_t reg_size, void *val_buf, + size_t val_size) +{ + struct bmi323_i2c_priv *priv = context; + struct i2c_msg msgs[2]; + int ret; + + msgs[0].addr = priv->i2c->addr; + msgs[0].flags = priv->i2c->flags; + msgs[0].len = reg_size; + msgs[0].buf = (u8 *)reg_buf; + + msgs[1].addr = priv->i2c->addr; + msgs[1].len = val_size + BMI323_I2C_DUMMY; + msgs[1].buf = priv->i2c_rx_buffer; + msgs[1].flags = priv->i2c->flags | I2C_M_RD; + + ret = i2c_transfer(priv->i2c->adapter, msgs, ARRAY_SIZE(msgs)); + if (ret < 0) + return -EIO; + + memcpy(val_buf, priv->i2c_rx_buffer + BMI323_I2C_DUMMY, val_size); + + return 0; +} + +static int bmi323_regmap_i2c_write(void *context, const void *data, + size_t count) +{ + struct bmi323_i2c_priv *priv = context; + u8 reg; + + reg = *(u8 *)data; + return i2c_smbus_write_i2c_block_data(priv->i2c, reg, + count - sizeof(u8), + data + sizeof(u8)); +} + +static struct regmap_bus bmi323_regmap_bus = { + .read = bmi323_regmap_i2c_read, + .write = bmi323_regmap_i2c_write, +}; + +const struct regmap_config bmi323_i2c_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + .max_register = BMI323_CFG_RES_REG, + .val_format_endian = REGMAP_ENDIAN_LITTLE, +}; + +static int bmi323_i2c_probe(struct i2c_client *i2c) +{ + struct device *dev = &i2c->dev; + struct bmi323_i2c_priv *priv; + struct regmap *regmap; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->i2c = i2c; + regmap = devm_regmap_init(dev, &bmi323_regmap_bus, priv, + &bmi323_i2c_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), + "Failed to initialize I2C Regmap\n"); + + return bmi323_core_probe(dev); +} + +static const struct i2c_device_id bmi323_i2c_ids[] = { + { "bmi323" }, + { } +}; +MODULE_DEVICE_TABLE(i2c, bmi323_i2c_ids); + +static const struct of_device_id bmi323_of_i2c_match[] = { + { .compatible = "bosch,bmi323" }, + { } +}; +MODULE_DEVICE_TABLE(of, bmi323_of_i2c_match); + +static struct i2c_driver bmi323_i2c_driver = { + .driver = { + .name = "bmi323", + .of_match_table = bmi323_of_i2c_match, + }, + .probe = bmi323_i2c_probe, + .id_table = bmi323_i2c_ids, +}; +module_i2c_driver(bmi323_i2c_driver); + +MODULE_DESCRIPTION("Bosch BMI323 IMU driver"); +MODULE_AUTHOR("Jagath Jog J "); +MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS(IIO_BMI323); diff --git a/drivers/iio/imu/bmi323/bmi323_spi.c b/drivers/iio/imu/bmi323/bmi323_spi.c new file mode 100644 index 00000000000000..6dc3352dd71432 --- /dev/null +++ b/drivers/iio/imu/bmi323/bmi323_spi.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * SPI driver for Bosch BMI323 6-Axis IMU. + * + * Copyright (C) 2023, Jagath Jog J + */ + +#include +#include +#include +#include + +#include "bmi323.h" + +/* + * From BMI323 datasheet section 4: Notes on the Serial Interface Support. + * Each SPI register read operation requires to read one dummy byte before + * the actual payload. + */ +static int bmi323_regmap_spi_read(void *context, const void *reg_buf, + size_t reg_size, void *val_buf, + size_t val_size) +{ + struct spi_device *spi = context; + + return spi_write_then_read(spi, reg_buf, reg_size, val_buf, val_size); +} + +static int bmi323_regmap_spi_write(void *context, const void *data, + size_t count) +{ + struct spi_device *spi = context; + u8 *data_buff = (u8 *)data; + + data_buff[1] = data_buff[0]; + return spi_write(spi, data_buff + 1, count - 1); +} + +static struct regmap_bus bmi323_regmap_bus = { + .read = bmi323_regmap_spi_read, + .write = bmi323_regmap_spi_write, +}; + +const struct regmap_config bmi323_spi_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + .pad_bits = 8, + .read_flag_mask = BIT(7), + .max_register = BMI323_CFG_RES_REG, + .val_format_endian = REGMAP_ENDIAN_LITTLE, +}; + +static int bmi323_spi_probe(struct spi_device *spi) +{ + struct device *dev = &spi->dev; + struct regmap *regmap; + + regmap = devm_regmap_init(dev, &bmi323_regmap_bus, dev, + &bmi323_spi_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), + "Failed to initialize SPI Regmap\n"); + + return bmi323_core_probe(dev); +} + +static const struct spi_device_id bmi323_spi_ids[] = { + { "bmi323" }, + { } +}; +MODULE_DEVICE_TABLE(spi, bmi323_spi_ids); + +static const struct of_device_id bmi323_of_spi_match[] = { + { .compatible = "bosch,bmi323" }, + { } +}; +MODULE_DEVICE_TABLE(of, bmi323_of_spi_match); + +static struct spi_driver bmi323_spi_driver = { + .driver = { + .name = "bmi323", + .of_match_table = bmi323_of_spi_match, + }, + .probe = bmi323_spi_probe, + .id_table = bmi323_spi_ids, +}; +module_spi_driver(bmi323_spi_driver); + +MODULE_DESCRIPTION("Bosch BMI323 IMU driver"); +MODULE_AUTHOR("Jagath Jog J "); +MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS(IIO_BMI323); From f7e158802defd77852d3f63b7504e699c6d74982 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Mon, 16 Oct 2023 08:54:22 -0500 Subject: [PATCH 300/515] iio: resolver: ad2s1210: add support for adi,fixed-mode It is possible to use the AD2S1210 with hardwired mode pins (A0 and A1). According to the devicetree bindings, in this case the adi,fixed-mode property will specify which of the 3 possible modes the mode pins are hardwired for and the gpio-modes property is not allowed. This adds support for the case where the mode pins are hardwired for config mode. In this configuration, the position and value must be read from the config register. The case of hardwired position or velocity mode is not supported as there would be no way to configure the device. Signed-off-by: David Lechner Reviewed-by: Nuno Sa Link: https://lore.kernel.org/r/20231016135423.16808-1-dlechner@baylibre.com Signed-off-by: Jonathan Cameron --- drivers/iio/resolver/ad2s1210.c | 150 +++++++++++++++++++++++++------- 1 file changed, 119 insertions(+), 31 deletions(-) diff --git a/drivers/iio/resolver/ad2s1210.c b/drivers/iio/resolver/ad2s1210.c index 1bd1b950e7cc53..8646389ec88de5 100644 --- a/drivers/iio/resolver/ad2s1210.c +++ b/drivers/iio/resolver/ad2s1210.c @@ -141,7 +141,7 @@ struct ad2s1210_state { struct spi_device *sdev; /** GPIO pin connected to SAMPLE line. */ struct gpio_desc *sample_gpio; - /** GPIO pins connected to A0 and A1 lines. */ + /** GPIO pins connected to A0 and A1 lines (optional). */ struct gpio_descs *mode_gpios; /** Used to access config registers. */ struct regmap *regmap; @@ -149,6 +149,8 @@ struct ad2s1210_state { unsigned long clkin_hz; /** Available raw hysteresis values based on resolution. */ int hysteresis_available[2]; + /* adi,fixed-mode property - only valid when mode_gpios == NULL. */ + enum ad2s1210_mode fixed_mode; /** The selected resolution */ enum ad2s1210_resolution resolution; /** Copy of fault register from the previous read. */ @@ -175,6 +177,9 @@ static int ad2s1210_set_mode(struct ad2s1210_state *st, enum ad2s1210_mode mode) struct gpio_descs *gpios = st->mode_gpios; DECLARE_BITMAP(bitmap, 2); + if (!gpios) + return mode == st->fixed_mode ? 0 : -EOPNOTSUPP; + bitmap[0] = mode; return gpiod_set_array_value(gpios->ndescs, gpios->desc, gpios->info, @@ -276,7 +281,8 @@ static int ad2s1210_regmap_reg_read(void *context, unsigned int reg, * parity error. The fault register is read-only and the D7 bit means * something else there. */ - if (reg != AD2S1210_REG_FAULT && st->rx[1] & AD2S1210_ADDRESS_DATA) + if ((reg > AD2S1210_REG_VELOCITY_LSB && reg != AD2S1210_REG_FAULT) + && st->rx[1] & AD2S1210_ADDRESS_DATA) return -EBADMSG; *val = st->rx[1]; @@ -450,21 +456,53 @@ static int ad2s1210_single_conversion(struct iio_dev *indio_dev, ad2s1210_toggle_sample_line(st); timestamp = iio_get_time_ns(indio_dev); - switch (chan->type) { - case IIO_ANGL: - ret = ad2s1210_set_mode(st, MOD_POS); - break; - case IIO_ANGL_VEL: - ret = ad2s1210_set_mode(st, MOD_VEL); - break; - default: - return -EINVAL; + if (st->fixed_mode == MOD_CONFIG) { + unsigned int reg_val; + + switch (chan->type) { + case IIO_ANGL: + ret = regmap_bulk_read(st->regmap, + AD2S1210_REG_POSITION_MSB, + &st->sample.raw, 2); + if (ret < 0) + return ret; + + break; + case IIO_ANGL_VEL: + ret = regmap_bulk_read(st->regmap, + AD2S1210_REG_VELOCITY_MSB, + &st->sample.raw, 2); + if (ret < 0) + return ret; + + break; + default: + return -EINVAL; + } + + ret = regmap_read(st->regmap, AD2S1210_REG_FAULT, ®_val); + if (ret < 0) + return ret; + + st->sample.fault = reg_val; + } else { + switch (chan->type) { + case IIO_ANGL: + ret = ad2s1210_set_mode(st, MOD_POS); + break; + case IIO_ANGL_VEL: + ret = ad2s1210_set_mode(st, MOD_VEL); + break; + default: + return -EINVAL; + } + if (ret < 0) + return ret; + + ret = spi_read(st->sdev, &st->sample, 3); + if (ret < 0) + return ret; } - if (ret < 0) - return ret; - ret = spi_read(st->sdev, &st->sample, 3); - if (ret < 0) - return ret; switch (chan->type) { case IIO_ANGL: @@ -1252,27 +1290,53 @@ static irqreturn_t ad2s1210_trigger_handler(int irq, void *p) ad2s1210_toggle_sample_line(st); if (test_bit(0, indio_dev->active_scan_mask)) { - ret = ad2s1210_set_mode(st, MOD_POS); - if (ret < 0) - goto error_ret; - - ret = spi_read(st->sdev, &st->sample, 3); - if (ret < 0) - goto error_ret; + if (st->fixed_mode == MOD_CONFIG) { + ret = regmap_bulk_read(st->regmap, + AD2S1210_REG_POSITION_MSB, + &st->sample.raw, 2); + if (ret < 0) + goto error_ret; + } else { + ret = ad2s1210_set_mode(st, MOD_POS); + if (ret < 0) + goto error_ret; + + ret = spi_read(st->sdev, &st->sample, 3); + if (ret < 0) + goto error_ret; + } memcpy(&st->scan.chan[chan++], &st->sample.raw, 2); } if (test_bit(1, indio_dev->active_scan_mask)) { - ret = ad2s1210_set_mode(st, MOD_VEL); - if (ret < 0) - goto error_ret; + if (st->fixed_mode == MOD_CONFIG) { + ret = regmap_bulk_read(st->regmap, + AD2S1210_REG_VELOCITY_MSB, + &st->sample.raw, 2); + if (ret < 0) + goto error_ret; + } else { + ret = ad2s1210_set_mode(st, MOD_VEL); + if (ret < 0) + goto error_ret; + + ret = spi_read(st->sdev, &st->sample, 3); + if (ret < 0) + goto error_ret; + } - ret = spi_read(st->sdev, &st->sample, 3); + memcpy(&st->scan.chan[chan++], &st->sample.raw, 2); + } + + if (st->fixed_mode == MOD_CONFIG) { + unsigned int reg_val; + + ret = regmap_read(st->regmap, AD2S1210_REG_FAULT, ®_val); if (ret < 0) - goto error_ret; + return ret; - memcpy(&st->scan.chan[chan++], &st->sample.raw, 2); + st->sample.fault = reg_val; } ad2s1210_push_events(indio_dev, st->sample.fault, pf->timestamp); @@ -1299,9 +1363,24 @@ static const struct iio_info ad2s1210_info = { static int ad2s1210_setup_properties(struct ad2s1210_state *st) { struct device *dev = &st->sdev->dev; + const char *str_val; u32 val; int ret; + ret = device_property_read_string(dev, "adi,fixed-mode", &str_val); + if (ret == -EINVAL) + st->fixed_mode = -1; + else if (ret < 0) + return dev_err_probe(dev, ret, + "failed to read adi,fixed-mode property\n"); + else { + if (strcmp(str_val, "config")) + return dev_err_probe(dev, -EINVAL, + "only adi,fixed-mode=\"config\" is supported\n"); + + st->fixed_mode = MOD_CONFIG; + } + ret = device_property_read_u32(dev, "assigned-resolution-bits", &val); if (ret < 0) return dev_err_probe(dev, ret, @@ -1357,12 +1436,21 @@ static int ad2s1210_setup_gpios(struct ad2s1210_state *st) "failed to request sample GPIO\n"); /* both pins high means that we start in config mode */ - st->mode_gpios = devm_gpiod_get_array(dev, "mode", GPIOD_OUT_HIGH); + st->mode_gpios = devm_gpiod_get_array_optional(dev, "mode", + GPIOD_OUT_HIGH); if (IS_ERR(st->mode_gpios)) return dev_err_probe(dev, PTR_ERR(st->mode_gpios), "failed to request mode GPIOs\n"); - if (st->mode_gpios->ndescs != 2) + if (!st->mode_gpios && st->fixed_mode == -1) + return dev_err_probe(dev, -EINVAL, + "must specify either adi,fixed-mode or mode-gpios\n"); + + if (st->mode_gpios && st->fixed_mode != -1) + return dev_err_probe(dev, -EINVAL, + "must specify only one of adi,fixed-mode or mode-gpios\n"); + + if (st->mode_gpios && st->mode_gpios->ndescs != 2) return dev_err_probe(dev, -EINVAL, "requires exactly 2 mode-gpios\n"); From e472085650daa489597c3ed1510b470f63f9f15d Mon Sep 17 00:00:00 2001 From: David Lechner Date: Mon, 16 Oct 2023 10:43:09 -0500 Subject: [PATCH 301/515] iio: resolver: ad2s1210: add reset gpio support This adds support for the optional reset gpio to the ad2s1210 resolver driver. If the gpio is present in the device tree, it is toggled during driver probe before the reset of the device initialization. As per the devicetree bindings, it is expected for the gpio to configured as active low. Suggested-by: Michael Hennerich Signed-off-by: David Lechner Acked-by: Michael Hennerich Link: https://lore.kernel.org/r/20231016154311.38547-1-dlechner@baylibre.com Signed-off-by: Jonathan Cameron --- drivers/iio/resolver/ad2s1210.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/iio/resolver/ad2s1210.c b/drivers/iio/resolver/ad2s1210.c index 8646389ec88de5..a414eef12e5e31 100644 --- a/drivers/iio/resolver/ad2s1210.c +++ b/drivers/iio/resolver/ad2s1210.c @@ -1426,6 +1426,7 @@ static int ad2s1210_setup_gpios(struct ad2s1210_state *st) { struct device *dev = &st->sdev->dev; struct gpio_descs *resolution_gpios; + struct gpio_desc *reset_gpio; DECLARE_BITMAP(bitmap, 2); int ret; @@ -1481,6 +1482,17 @@ static int ad2s1210_setup_gpios(struct ad2s1210_state *st) "failed to set resolution gpios\n"); } + /* If the optional reset GPIO is present, toggle it to do a hard reset. */ + reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(reset_gpio)) + return dev_err_probe(dev, PTR_ERR(reset_gpio), + "failed to request reset GPIO\n"); + + if (reset_gpio) { + udelay(10); + gpiod_set_value(reset_gpio, 0); + } + return 0; } From 9732d649d9b9ee2640a15c10a861abf87ff58f58 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 8 Aug 2023 19:27:55 +0300 Subject: [PATCH 302/515] device property: Use fwnode_property_string_array_count() Use fwnode_property_string_array_count() instead of open coded variant. Signed-off-by: Andy Shevchenko Acked-by: Rafael J. Wysocki Link: https://lore.kernel.org/r/20230808162800.61651-2-andriy.shevchenko@linux.intel.com Signed-off-by: Jonathan Cameron --- drivers/base/property.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/base/property.c b/drivers/base/property.c index 8c40abed785247..3bb9505f1631a4 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -473,7 +473,7 @@ int fwnode_property_match_string(const struct fwnode_handle *fwnode, const char **values; int nval, ret; - nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0); + nval = fwnode_property_string_array_count(fwnode, propname); if (nval < 0) return nval; From de135d707e0bba400f14737c3b9846e34f445c0f Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 8 Aug 2023 19:27:56 +0300 Subject: [PATCH 303/515] device property: Add fwnode_property_match_property_string() Sometimes the users want to match the single value string property against an array of predefined strings. Create a helper for them. Signed-off-by: Andy Shevchenko Acked-by: Rafael J. Wysocki Link: https://lore.kernel.org/r/20230808162800.61651-3-andriy.shevchenko@linux.intel.com Signed-off-by: Jonathan Cameron --- drivers/base/property.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/property.h | 12 ++++++++++++ 2 files changed, 47 insertions(+) diff --git a/drivers/base/property.c b/drivers/base/property.c index 3bb9505f1631a4..8f8e2a6816bc00 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -498,6 +498,41 @@ int fwnode_property_match_string(const struct fwnode_handle *fwnode, } EXPORT_SYMBOL_GPL(fwnode_property_match_string); +/** + * fwnode_property_match_property_string - find a property string value in an array and return index + * @fwnode: Firmware node to get the property of + * @propname: Name of the property holding the string value + * @array: String array to search in + * @n: Size of the @array + * + * Find a property string value in a given @array and if it is found return + * the index back. + * + * Return: index, starting from %0, if the string value was found in the @array (success), + * %-ENOENT when the string value was not found in the @array, + * %-EINVAL if given arguments are not valid, + * %-ENODATA if the property does not have a value, + * %-EPROTO or %-EILSEQ if the property is not a string, + * %-ENXIO if no suitable firmware interface is present. + */ +int fwnode_property_match_property_string(const struct fwnode_handle *fwnode, + const char *propname, const char * const *array, size_t n) +{ + const char *string; + int ret; + + ret = fwnode_property_read_string(fwnode, propname, &string); + if (ret) + return ret; + + ret = match_string(array, n, string); + if (ret < 0) + ret = -ENOENT; + + return ret; +} +EXPORT_SYMBOL_GPL(fwnode_property_match_property_string); + /** * fwnode_property_get_reference_args() - Find a reference with arguments * @fwnode: Firmware node where to look for the reference diff --git a/include/linux/property.h b/include/linux/property.h index 8c3c6685a2ae37..11f3ad6814f257 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -97,6 +97,18 @@ static inline bool device_is_compatible(const struct device *dev, const char *co return fwnode_device_is_compatible(dev_fwnode(dev), compat); } +int fwnode_property_match_property_string(const struct fwnode_handle *fwnode, + const char *propname, + const char * const *array, size_t n); + +static inline +int device_property_match_property_string(const struct device *dev, + const char *propname, + const char * const *array, size_t n) +{ + return fwnode_property_match_property_string(dev_fwnode(dev), propname, array, n); +} + int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, const char *prop, const char *nargs_prop, unsigned int nargs, unsigned int index, From 3f6e7aa4b8e0dbab5e9fec0bb25d0f0732cba083 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 8 Aug 2023 19:27:57 +0300 Subject: [PATCH 304/515] iio: frequency: adf4377: Switch to device_property_match_property_string() Replace open coded device_property_match_property_string(). Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230808162800.61651-4-andriy.shevchenko@linux.intel.com Signed-off-by: Jonathan Cameron --- drivers/iio/frequency/adf4377.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/drivers/iio/frequency/adf4377.c b/drivers/iio/frequency/adf4377.c index 26abecbd51e066..9284c13f1abb34 100644 --- a/drivers/iio/frequency/adf4377.c +++ b/drivers/iio/frequency/adf4377.c @@ -870,7 +870,6 @@ static const struct iio_chan_spec adf4377_channels[] = { static int adf4377_properties_parse(struct adf4377_state *st) { struct spi_device *spi = st->spi; - const char *str; int ret; st->clkin = devm_clk_get_enabled(&spi->dev, "ref_in"); @@ -896,16 +895,13 @@ static int adf4377_properties_parse(struct adf4377_state *st) return dev_err_probe(&spi->dev, PTR_ERR(st->gpio_enclk2), "failed to get the CE GPIO\n"); - ret = device_property_read_string(&spi->dev, "adi,muxout-select", &str); - if (ret) { - st->muxout_select = ADF4377_MUXOUT_HIGH_Z; - } else { - ret = match_string(adf4377_muxout_modes, ARRAY_SIZE(adf4377_muxout_modes), str); - if (ret < 0) - return ret; - + ret = device_property_match_property_string(&spi->dev, "adi,muxout-select", + adf4377_muxout_modes, + ARRAY_SIZE(adf4377_muxout_modes)); + if (ret >= 0) st->muxout_select = ret; - } + else + st->muxout_select = ADF4377_MUXOUT_HIGH_Z; return 0; } From 7cd37d414e24cbad11b2e458082e9a5a6a879385 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 8 Aug 2023 19:27:58 +0300 Subject: [PATCH 305/515] iio: frequency: admv1014: Switch to device_property_match_property_string() Replace open coded device_property_match_property_string(). Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230808162800.61651-5-andriy.shevchenko@linux.intel.com Signed-off-by: Jonathan Cameron --- drivers/iio/frequency/admv1014.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/drivers/iio/frequency/admv1014.c b/drivers/iio/frequency/admv1014.c index bb5e1feef42bfc..b46b73b89eb715 100644 --- a/drivers/iio/frequency/admv1014.c +++ b/drivers/iio/frequency/admv1014.c @@ -710,7 +710,6 @@ static int admv1014_init(struct admv1014_state *st) static int admv1014_properties_parse(struct admv1014_state *st) { - const char *str; unsigned int i; struct spi_device *spi = st->spi; int ret; @@ -719,27 +718,21 @@ static int admv1014_properties_parse(struct admv1014_state *st) st->p1db_comp = device_property_read_bool(&spi->dev, "adi,p1db-compensation-enable"); - ret = device_property_read_string(&spi->dev, "adi,input-mode", &str); - if (ret) { - st->input_mode = ADMV1014_IQ_MODE; - } else { - ret = match_string(input_mode_names, ARRAY_SIZE(input_mode_names), str); - if (ret < 0) - return ret; - + ret = device_property_match_property_string(&spi->dev, "adi,input-mode", + input_mode_names, + ARRAY_SIZE(input_mode_names)); + if (ret >= 0) st->input_mode = ret; - } - - ret = device_property_read_string(&spi->dev, "adi,quad-se-mode", &str); - if (ret) { - st->quad_se_mode = ADMV1014_SE_MODE_POS; - } else { - ret = match_string(quad_se_mode_names, ARRAY_SIZE(quad_se_mode_names), str); - if (ret < 0) - return ret; + else + st->input_mode = ADMV1014_IQ_MODE; + ret = device_property_match_property_string(&spi->dev, "adi,quad-se-mode", + quad_se_mode_names, + ARRAY_SIZE(quad_se_mode_names)); + if (ret >= 0) st->quad_se_mode = ADMV1014_SE_MODE_POS + (ret * 3); - } + else + st->quad_se_mode = ADMV1014_SE_MODE_POS; for (i = 0; i < ADMV1014_NUM_REGULATORS; ++i) st->regulators[i].supply = admv1014_reg_name[i]; From 1fce47a2789bc38f452091f6cc5fe44d426438d6 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 8 Aug 2023 19:27:59 +0300 Subject: [PATCH 306/515] iio: magnetometer: tmag5273: Switch to device_property_match_property_string() Replace open coded device_property_match_property_string(). Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230808162800.61651-6-andriy.shevchenko@linux.intel.com Signed-off-by: Jonathan Cameron --- drivers/iio/magnetometer/tmag5273.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/drivers/iio/magnetometer/tmag5273.c b/drivers/iio/magnetometer/tmag5273.c index c5e5c4ad681e64..bcd989d650591d 100644 --- a/drivers/iio/magnetometer/tmag5273.c +++ b/drivers/iio/magnetometer/tmag5273.c @@ -497,17 +497,13 @@ static int tmag5273_set_operating_mode(struct tmag5273_data *data, static void tmag5273_read_device_property(struct tmag5273_data *data) { struct device *dev = data->dev; - const char *str; int ret; data->angle_measurement = TMAG5273_ANGLE_EN_X_Y; - ret = device_property_read_string(dev, "ti,angle-measurement", &str); - if (ret) - return; - - ret = match_string(tmag5273_angle_names, - ARRAY_SIZE(tmag5273_angle_names), str); + ret = device_property_match_property_string(dev, "ti,angle-measurement", + tmag5273_angle_names, + ARRAY_SIZE(tmag5273_angle_names)); if (ret >= 0) data->angle_measurement = ret; } From 89e2233386a5670d15908628b63e611cb03b0d03 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 8 Aug 2023 19:28:00 +0300 Subject: [PATCH 307/515] iio: proximity: sx9324: Switch to device_property_match_property_string() Replace open coded device_property_match_property_string(). Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230808162800.61651-7-andriy.shevchenko@linux.intel.com Signed-off-by: Jonathan Cameron --- drivers/iio/proximity/sx9324.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/iio/proximity/sx9324.c b/drivers/iio/proximity/sx9324.c index 438f9c9aba6eaf..ac2ed2da21ccc9 100644 --- a/drivers/iio/proximity/sx9324.c +++ b/drivers/iio/proximity/sx9324.c @@ -888,7 +888,6 @@ sx9324_get_default_reg(struct device *dev, int idx, char prop[] = SX9324_PROXRAW_DEF; u32 start = 0, raw = 0, pos = 0; int ret, count, ph, pin; - const char *res; memcpy(reg_def, &sx9324_default_regs[idx], sizeof(*reg_def)); @@ -915,24 +914,21 @@ sx9324_get_default_reg(struct device *dev, int idx, reg_def->def = raw; break; case SX9324_REG_AFE_CTRL0: - ret = device_property_read_string(dev, - "semtech,cs-idle-sleep", &res); - if (!ret) - ret = match_string(sx9324_csidle, ARRAY_SIZE(sx9324_csidle), res); + ret = device_property_match_property_string(dev, "semtech,cs-idle-sleep", + sx9324_csidle, + ARRAY_SIZE(sx9324_csidle)); if (ret >= 0) { reg_def->def &= ~SX9324_REG_AFE_CTRL0_CSIDLE_MASK; reg_def->def |= ret << SX9324_REG_AFE_CTRL0_CSIDLE_SHIFT; } - ret = device_property_read_string(dev, - "semtech,int-comp-resistor", &res); - if (ret) - break; - ret = match_string(sx9324_rints, ARRAY_SIZE(sx9324_rints), res); - if (ret < 0) - break; - reg_def->def &= ~SX9324_REG_AFE_CTRL0_RINT_MASK; - reg_def->def |= ret << SX9324_REG_AFE_CTRL0_RINT_SHIFT; + ret = device_property_match_property_string(dev, "semtech,int-comp-resistor", + sx9324_rints, + ARRAY_SIZE(sx9324_rints)); + if (ret >= 0) { + reg_def->def &= ~SX9324_REG_AFE_CTRL0_RINT_MASK; + reg_def->def |= ret << SX9324_REG_AFE_CTRL0_RINT_SHIFT; + } break; case SX9324_REG_AFE_CTRL4: case SX9324_REG_AFE_CTRL7: From cfe01a6be1bb2c3ff6bd173904b42310da5893d5 Mon Sep 17 00:00:00 2001 From: Gao Xiang Date: Sat, 21 Oct 2023 10:01:37 +0800 Subject: [PATCH 308/515] erofs: don't warn MicroLZMA format anymore The LZMA algorithm support has been landed for more than one year since Linux 5.16. Besides, the new XZ Utils 5.4 has been available in most Linux distributions. Signed-off-by: Gao Xiang Link: https://lore.kernel.org/r/20231021020137.1646959-1-hsiangkao@linux.alibaba.com --- fs/erofs/Kconfig | 7 ++----- fs/erofs/decompressor_lzma.c | 2 -- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/fs/erofs/Kconfig b/fs/erofs/Kconfig index f6dc961e6c2bc5..e540648dedc280 100644 --- a/fs/erofs/Kconfig +++ b/fs/erofs/Kconfig @@ -91,13 +91,10 @@ config EROFS_FS_ZIP_LZMA select XZ_DEC_MICROLZMA help Saying Y here includes support for reading EROFS file systems - containing LZMA compressed data, specifically called microLZMA. it - gives better compression ratios than the LZ4 algorithm, at the + containing LZMA compressed data, specifically called microLZMA. It + gives better compression ratios than the default LZ4 format, at the expense of more CPU overhead. - LZMA support is an experimental feature for now and so most file - systems will be readable without selecting this option. - If unsure, say N. config EROFS_FS_ZIP_DEFLATE diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c index dee10d22ada96e..5f413f19a06461 100644 --- a/fs/erofs/decompressor_lzma.c +++ b/fs/erofs/decompressor_lzma.c @@ -96,8 +96,6 @@ int z_erofs_load_lzma_config(struct super_block *sb, return -EINVAL; } - erofs_info(sb, "EXPERIMENTAL MicroLZMA in use. Use at your own risk!"); - /* in case 2 z_erofs_load_lzma_config() race to avoid deadlock */ mutex_lock(&lzma_resize_mutex); From c388da1dad59dc24801b61bc63539cab6cd83e23 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Fri, 13 Oct 2023 14:13:50 +0200 Subject: [PATCH 309/515] ext4: properly sync file size update after O_SYNC direct IO Gao Xiang has reported that on ext4 O_SYNC direct IO does not properly sync file size update and thus if we crash at unfortunate moment, the file can have smaller size although O_SYNC IO has reported successful completion. The problem happens because update of on-disk inode size is handled in ext4_dio_write_iter() *after* iomap_dio_rw() (and thus dio_complete() in particular) has returned and generic_file_sync() gets called by dio_complete(). Fix the problem by handling on-disk inode size update directly in our ->end_io completion handler. References: https://lore.kernel.org/all/02d18236-26ef-09b0-90ad-030c4fe3ee20@linux.alibaba.com Reported-by: Gao Xiang CC: stable@vger.kernel.org Fixes: 378f32bab371 ("ext4: introduce direct I/O write using iomap infrastructure") Signed-off-by: Jan Kara Tested-by: Joseph Qi Reviewed-by: "Ritesh Harjani (IBM)" Link: https://lore.kernel.org/r/20231013121350.26872-1-jack@suse.cz Signed-off-by: Theodore Ts'o --- fs/ext4/file.c | 153 +++++++++++++++++++++---------------------------- 1 file changed, 65 insertions(+), 88 deletions(-) diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 747c0378122daa..0166bb9ca160bd 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -306,80 +306,38 @@ static ssize_t ext4_buffered_write_iter(struct kiocb *iocb, } static ssize_t ext4_handle_inode_extension(struct inode *inode, loff_t offset, - ssize_t written, size_t count) + ssize_t count) { handle_t *handle; - bool truncate = false; - u8 blkbits = inode->i_blkbits; - ext4_lblk_t written_blk, end_blk; - int ret; - - /* - * Note that EXT4_I(inode)->i_disksize can get extended up to - * inode->i_size while the I/O was running due to writeback of delalloc - * blocks. But, the code in ext4_iomap_alloc() is careful to use - * zeroed/unwritten extents if this is possible; thus we won't leave - * uninitialized blocks in a file even if we didn't succeed in writing - * as much as we intended. - */ - WARN_ON_ONCE(i_size_read(inode) < EXT4_I(inode)->i_disksize); - if (offset + count <= EXT4_I(inode)->i_disksize) { - /* - * We need to ensure that the inode is removed from the orphan - * list if it has been added prematurely, due to writeback of - * delalloc blocks. - */ - if (!list_empty(&EXT4_I(inode)->i_orphan) && inode->i_nlink) { - handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); - - if (IS_ERR(handle)) { - ext4_orphan_del(NULL, inode); - return PTR_ERR(handle); - } - - ext4_orphan_del(handle, inode); - ext4_journal_stop(handle); - } - - return written; - } - - if (written < 0) - goto truncate; + lockdep_assert_held_write(&inode->i_rwsem); handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); - if (IS_ERR(handle)) { - written = PTR_ERR(handle); - goto truncate; - } + if (IS_ERR(handle)) + return PTR_ERR(handle); - if (ext4_update_inode_size(inode, offset + written)) { - ret = ext4_mark_inode_dirty(handle, inode); + if (ext4_update_inode_size(inode, offset + count)) { + int ret = ext4_mark_inode_dirty(handle, inode); if (unlikely(ret)) { - written = ret; ext4_journal_stop(handle); - goto truncate; + return ret; } } - /* - * We may need to truncate allocated but not written blocks beyond EOF. - */ - written_blk = ALIGN(offset + written, 1 << blkbits); - end_blk = ALIGN(offset + count, 1 << blkbits); - if (written_blk < end_blk && ext4_can_truncate(inode)) - truncate = true; - - /* - * Remove the inode from the orphan list if it has been extended and - * everything went OK. - */ - if (!truncate && inode->i_nlink) + if (inode->i_nlink) ext4_orphan_del(handle, inode); ext4_journal_stop(handle); - if (truncate) { -truncate: + return count; +} + +/* + * Clean up the inode after DIO or DAX extending write has completed and the + * inode size has been updated using ext4_handle_inode_extension(). + */ +static void ext4_inode_extension_cleanup(struct inode *inode, ssize_t count) +{ + lockdep_assert_held_write(&inode->i_rwsem); + if (count < 0) { ext4_truncate_failed_write(inode); /* * If the truncate operation failed early, then the inode may @@ -388,9 +346,28 @@ static ssize_t ext4_handle_inode_extension(struct inode *inode, loff_t offset, */ if (inode->i_nlink) ext4_orphan_del(NULL, inode); + return; } + /* + * If i_disksize got extended due to writeback of delalloc blocks while + * the DIO was running we could fail to cleanup the orphan list in + * ext4_handle_inode_extension(). Do it now. + */ + if (!list_empty(&EXT4_I(inode)->i_orphan) && inode->i_nlink) { + handle_t *handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); - return written; + if (IS_ERR(handle)) { + /* + * The write has successfully completed. Not much to + * do with the error here so just cleanup the orphan + * list and hope for the best. + */ + ext4_orphan_del(NULL, inode); + return; + } + ext4_orphan_del(handle, inode); + ext4_journal_stop(handle); + } } static int ext4_dio_write_end_io(struct kiocb *iocb, ssize_t size, @@ -399,31 +376,22 @@ static int ext4_dio_write_end_io(struct kiocb *iocb, ssize_t size, loff_t pos = iocb->ki_pos; struct inode *inode = file_inode(iocb->ki_filp); + if (!error && size && flags & IOMAP_DIO_UNWRITTEN) + error = ext4_convert_unwritten_extents(NULL, inode, pos, size); if (error) return error; - - if (size && flags & IOMAP_DIO_UNWRITTEN) { - error = ext4_convert_unwritten_extents(NULL, inode, pos, size); - if (error < 0) - return error; - } /* - * If we are extending the file, we have to update i_size here before - * page cache gets invalidated in iomap_dio_rw(). Otherwise racing - * buffered reads could zero out too much from page cache pages. Update - * of on-disk size will happen later in ext4_dio_write_iter() where - * we have enough information to also perform orphan list handling etc. - * Note that we perform all extending writes synchronously under - * i_rwsem held exclusively so i_size update is safe here in that case. - * If the write was not extending, we cannot see pos > i_size here - * because operations reducing i_size like truncate wait for all - * outstanding DIO before updating i_size. + * Note that EXT4_I(inode)->i_disksize can get extended up to + * inode->i_size while the I/O was running due to writeback of delalloc + * blocks. But the code in ext4_iomap_alloc() is careful to use + * zeroed/unwritten extents if this is possible; thus we won't leave + * uninitialized blocks in a file even if we didn't succeed in writing + * as much as we intended. */ - pos += size; - if (pos > i_size_read(inode)) - i_size_write(inode, pos); - - return 0; + WARN_ON_ONCE(i_size_read(inode) < READ_ONCE(EXT4_I(inode)->i_disksize)); + if (pos + size <= READ_ONCE(EXT4_I(inode)->i_disksize)) + return size; + return ext4_handle_inode_extension(inode, pos, size); } static const struct iomap_dio_ops ext4_dio_write_ops = { @@ -608,9 +576,16 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from) dio_flags, NULL, 0); if (ret == -ENOTBLK) ret = 0; - - if (extend) - ret = ext4_handle_inode_extension(inode, offset, ret, count); + if (extend) { + /* + * We always perform extending DIO write synchronously so by + * now the IO is completed and ext4_handle_inode_extension() + * was called. Cleanup the inode in case of error or race with + * writeback of delalloc blocks. + */ + WARN_ON_ONCE(ret == -EIOCBQUEUED); + ext4_inode_extension_cleanup(inode, ret); + } out: if (ilock_shared) @@ -691,8 +666,10 @@ ext4_dax_write_iter(struct kiocb *iocb, struct iov_iter *from) ret = dax_iomap_rw(iocb, from, &ext4_iomap_ops); - if (extend) - ret = ext4_handle_inode_extension(inode, offset, ret, count); + if (extend) { + ret = ext4_handle_inode_extension(inode, offset, ret); + ext4_inode_extension_cleanup(inode, ret); + } out: inode_unlock(inode); if (ret > 0) From 51bcdcbb8ec2d67194ef1668f9981f68de1a86fd Mon Sep 17 00:00:00 2001 From: Matti Vaittinen Date: Thu, 19 Oct 2023 16:23:56 +0300 Subject: [PATCH 310/515] iio: kx022a: Fix acceleration value scaling The IIO ABI mandates acceleration values from accelerometer to be emitted in m/s^2. The KX022A was emitting values in micro m/s^2. Fix driver to report the correct scale values. Signed-off-by: Matti Vaittinen Reported-by: Jagath Jog J Fixes: 7c1d1677b322 ("iio: accel: Support Kionix/ROHM KX022A accelerometer") Tested-by: Jagath Jog J Link: https://lore.kernel.org/r/ZTEt7NqfDHPOkm8j@dc78bmyyyyyyyyyyyyydt-3.rev.dnainternet.fi Cc: Signed-off-by: Jonathan Cameron --- drivers/iio/accel/kionix-kx022a.c | 37 ++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/drivers/iio/accel/kionix-kx022a.c b/drivers/iio/accel/kionix-kx022a.c index 4ea3c6718ed49d..971fc60efef01b 100644 --- a/drivers/iio/accel/kionix-kx022a.c +++ b/drivers/iio/accel/kionix-kx022a.c @@ -273,17 +273,17 @@ static const unsigned int kx022a_odrs[] = { * (range / 2^bits) * g = (range / 2^bits) * 9.80665 m/s^2 * => KX022A uses 16 bit (HiRes mode - assume the low 8 bits are zeroed * in low-power mode(?) ) - * => +/-2G => 4 / 2^16 * 9,80665 * 10^6 (to scale to micro) - * => +/-2G - 598.550415 - * +/-4G - 1197.10083 - * +/-8G - 2394.20166 - * +/-16G - 4788.40332 + * => +/-2G => 4 / 2^16 * 9,80665 + * => +/-2G - 0.000598550415 + * +/-4G - 0.00119710083 + * +/-8G - 0.00239420166 + * +/-16G - 0.00478840332 */ static const int kx022a_scale_table[][2] = { - { 598, 550415 }, - { 1197, 100830 }, - { 2394, 201660 }, - { 4788, 403320 }, + { 0, 598550 }, + { 0, 1197101 }, + { 0, 2394202 }, + { 0, 4788403 }, }; static int kx022a_read_avail(struct iio_dev *indio_dev, @@ -302,7 +302,7 @@ static int kx022a_read_avail(struct iio_dev *indio_dev, *vals = (const int *)kx022a_scale_table; *length = ARRAY_SIZE(kx022a_scale_table) * ARRAY_SIZE(kx022a_scale_table[0]); - *type = IIO_VAL_INT_PLUS_MICRO; + *type = IIO_VAL_INT_PLUS_NANO; return IIO_AVAIL_LIST; default: return -EINVAL; @@ -366,6 +366,20 @@ static int kx022a_turn_on_unlock(struct kx022a_data *data) return ret; } +static int kx022a_write_raw_get_fmt(struct iio_dev *idev, + struct iio_chan_spec const *chan, + long mask) +{ + switch (mask) { + case IIO_CHAN_INFO_SCALE: + return IIO_VAL_INT_PLUS_NANO; + case IIO_CHAN_INFO_SAMP_FREQ: + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } +} + static int kx022a_write_raw(struct iio_dev *idev, struct iio_chan_spec const *chan, int val, int val2, long mask) @@ -510,7 +524,7 @@ static int kx022a_read_raw(struct iio_dev *idev, kx022a_reg2scale(regval, val, val2); - return IIO_VAL_INT_PLUS_MICRO; + return IIO_VAL_INT_PLUS_NANO; } return -EINVAL; @@ -712,6 +726,7 @@ static int kx022a_fifo_flush(struct iio_dev *idev, unsigned int samples) static const struct iio_info kx022a_info = { .read_raw = &kx022a_read_raw, .write_raw = &kx022a_write_raw, + .write_raw_get_fmt = &kx022a_write_raw_get_fmt, .read_avail = &kx022a_read_avail, .validate_trigger = iio_validate_own_trigger, From 07ab480161171a81fa92bf518606cff4ee9ccdd6 Mon Sep 17 00:00:00 2001 From: Gao Xiang Date: Sun, 22 Oct 2023 21:09:57 +0800 Subject: [PATCH 311/515] erofs: simplify compression configuration parser Move erofs_load_compr_cfgs() into decompressor.c as well as introduce a callback instead of a hard-coded switch for each algorithm for simplicity. Signed-off-by: Gao Xiang Link: https://lore.kernel.org/r/20231022130957.11398-1-xiang@kernel.org --- fs/erofs/compress.h | 6 +++ fs/erofs/decompressor.c | 62 ++++++++++++++++++++++++++-- fs/erofs/decompressor_deflate.c | 5 ++- fs/erofs/decompressor_lzma.c | 4 +- fs/erofs/internal.h | 38 +---------------- fs/erofs/super.c | 72 ++++----------------------------- 6 files changed, 79 insertions(+), 108 deletions(-) diff --git a/fs/erofs/compress.h b/fs/erofs/compress.h index 349c3316ae6bbb..279933e007d217 100644 --- a/fs/erofs/compress.h +++ b/fs/erofs/compress.h @@ -21,6 +21,8 @@ struct z_erofs_decompress_req { }; struct z_erofs_decompressor { + int (*config)(struct super_block *sb, struct erofs_super_block *dsb, + void *data, int size); int (*decompress)(struct z_erofs_decompress_req *rq, struct page **pagepool); char *name; @@ -92,6 +94,10 @@ int z_erofs_fixup_insize(struct z_erofs_decompress_req *rq, const char *padbuf, extern const struct z_erofs_decompressor erofs_decompressors[]; /* prototypes for specific algorithms */ +int z_erofs_load_lzma_config(struct super_block *sb, + struct erofs_super_block *dsb, void *data, int size); +int z_erofs_load_deflate_config(struct super_block *sb, + struct erofs_super_block *dsb, void *data, int size); int z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq, struct page **pagepool); int z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c index 332ec5f74002b8..e75edc8f17539b 100644 --- a/fs/erofs/decompressor.c +++ b/fs/erofs/decompressor.c @@ -24,11 +24,11 @@ struct z_erofs_lz4_decompress_ctx { unsigned int oend; }; -int z_erofs_load_lz4_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_lz4_cfgs *lz4, int size) +static int z_erofs_load_lz4_config(struct super_block *sb, + struct erofs_super_block *dsb, void *data, int size) { struct erofs_sb_info *sbi = EROFS_SB(sb); + struct z_erofs_lz4_cfgs *lz4 = data; u16 distance; if (lz4) { @@ -370,19 +370,75 @@ const struct z_erofs_decompressor erofs_decompressors[] = { .name = "interlaced" }, [Z_EROFS_COMPRESSION_LZ4] = { + .config = z_erofs_load_lz4_config, .decompress = z_erofs_lz4_decompress, .name = "lz4" }, #ifdef CONFIG_EROFS_FS_ZIP_LZMA [Z_EROFS_COMPRESSION_LZMA] = { + .config = z_erofs_load_lzma_config, .decompress = z_erofs_lzma_decompress, .name = "lzma" }, #endif #ifdef CONFIG_EROFS_FS_ZIP_DEFLATE [Z_EROFS_COMPRESSION_DEFLATE] = { + .config = z_erofs_load_deflate_config, .decompress = z_erofs_deflate_decompress, .name = "deflate" }, #endif }; + +int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb) +{ + struct erofs_sb_info *sbi = EROFS_SB(sb); + struct erofs_buf buf = __EROFS_BUF_INITIALIZER; + unsigned int algs, alg; + erofs_off_t offset; + int size, ret = 0; + + if (!erofs_sb_has_compr_cfgs(sbi)) { + sbi->available_compr_algs = Z_EROFS_COMPRESSION_LZ4; + return z_erofs_load_lz4_config(sb, dsb, NULL, 0); + } + + sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs); + if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) { + erofs_err(sb, "unidentified algorithms %x, please upgrade kernel", + sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS); + return -EOPNOTSUPP; + } + + erofs_init_metabuf(&buf, sb); + offset = EROFS_SUPER_OFFSET + sbi->sb_size; + alg = 0; + for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) { + void *data; + + if (!(algs & 1)) + continue; + + data = erofs_read_metadata(sb, &buf, &offset, &size); + if (IS_ERR(data)) { + ret = PTR_ERR(data); + break; + } + + if (alg >= ARRAY_SIZE(erofs_decompressors) || + !erofs_decompressors[alg].config) { + erofs_err(sb, "algorithm %d isn't enabled on this kernel", + alg); + ret = -EOPNOTSUPP; + } else { + ret = erofs_decompressors[alg].config(sb, + dsb, data, size); + } + + kfree(data); + if (ret) + break; + } + erofs_put_metabuf(&buf); + return ret; +} diff --git a/fs/erofs/decompressor_deflate.c b/fs/erofs/decompressor_deflate.c index 19e5bdeb30b606..0e1946a6bda58c 100644 --- a/fs/erofs/decompressor_deflate.c +++ b/fs/erofs/decompressor_deflate.c @@ -77,9 +77,10 @@ int __init z_erofs_deflate_init(void) } int z_erofs_load_deflate_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_deflate_cfgs *dfl, int size) + struct erofs_super_block *dsb, void *data, int size) { + struct z_erofs_deflate_cfgs *dfl = data; + if (!dfl || size < sizeof(struct z_erofs_deflate_cfgs)) { erofs_err(sb, "invalid deflate cfgs, size=%u", size); return -EINVAL; diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c index 5f413f19a06461..852dd8eac5dfd8 100644 --- a/fs/erofs/decompressor_lzma.c +++ b/fs/erofs/decompressor_lzma.c @@ -72,10 +72,10 @@ int __init z_erofs_lzma_init(void) } int z_erofs_load_lzma_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_lzma_cfgs *lzma, int size) + struct erofs_super_block *dsb, void *data, int size) { static DEFINE_MUTEX(lzma_resize_mutex); + struct z_erofs_lzma_cfgs *lzma = data; unsigned int dict_size, i; struct z_erofs_lzma *strm, *head = NULL; int err; diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 4ff88d0dd980fb..d8de61350dc05d 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -469,9 +469,6 @@ int __init z_erofs_init_zip_subsystem(void); void z_erofs_exit_zip_subsystem(void); int erofs_try_to_free_all_cached_pages(struct erofs_sb_info *sbi, struct erofs_workgroup *egrp); -int z_erofs_load_lz4_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_lz4_cfgs *lz4, int len); int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map, int flags); void *erofs_get_pcpubuf(unsigned int requiredpages); @@ -480,6 +477,7 @@ int erofs_pcpubuf_growsize(unsigned int nrpages); void __init erofs_pcpubuf_init(void); void erofs_pcpubuf_exit(void); int erofs_init_managed_cache(struct super_block *sb); +int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb); #else static inline void erofs_shrinker_register(struct super_block *sb) {} static inline void erofs_shrinker_unregister(struct super_block *sb) {} @@ -487,16 +485,6 @@ static inline int erofs_init_shrinker(void) { return 0; } static inline void erofs_exit_shrinker(void) {} static inline int z_erofs_init_zip_subsystem(void) { return 0; } static inline void z_erofs_exit_zip_subsystem(void) {} -static inline int z_erofs_load_lz4_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_lz4_cfgs *lz4, int len) -{ - if (lz4 || dsb->u1.lz4_max_distance) { - erofs_err(sb, "lz4 algorithm isn't enabled"); - return -EINVAL; - } - return 0; -} static inline void erofs_pcpubuf_init(void) {} static inline void erofs_pcpubuf_exit(void) {} static inline int erofs_init_managed_cache(struct super_block *sb) { return 0; } @@ -505,41 +493,17 @@ static inline int erofs_init_managed_cache(struct super_block *sb) { return 0; } #ifdef CONFIG_EROFS_FS_ZIP_LZMA int __init z_erofs_lzma_init(void); void z_erofs_lzma_exit(void); -int z_erofs_load_lzma_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_lzma_cfgs *lzma, int size); #else static inline int z_erofs_lzma_init(void) { return 0; } static inline int z_erofs_lzma_exit(void) { return 0; } -static inline int z_erofs_load_lzma_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_lzma_cfgs *lzma, int size) { - if (lzma) { - erofs_err(sb, "lzma algorithm isn't enabled"); - return -EINVAL; - } - return 0; -} #endif /* !CONFIG_EROFS_FS_ZIP_LZMA */ #ifdef CONFIG_EROFS_FS_ZIP_DEFLATE int __init z_erofs_deflate_init(void); void z_erofs_deflate_exit(void); -int z_erofs_load_deflate_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_deflate_cfgs *dfl, int size); #else static inline int z_erofs_deflate_init(void) { return 0; } static inline int z_erofs_deflate_exit(void) { return 0; } -static inline int z_erofs_load_deflate_config(struct super_block *sb, - struct erofs_super_block *dsb, - struct z_erofs_deflate_cfgs *dfl, int size) { - if (dfl) { - erofs_err(sb, "deflate algorithm isn't enabled"); - return -EINVAL; - } - return 0; -} #endif /* !CONFIG_EROFS_FS_ZIP_DEFLATE */ #ifdef CONFIG_EROFS_FS_ONDEMAND diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 3700af9ee17332..cc44fb2e001e6f 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -156,68 +156,15 @@ void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf, return buffer; } -#ifdef CONFIG_EROFS_FS_ZIP -static int erofs_load_compr_cfgs(struct super_block *sb, - struct erofs_super_block *dsb) +#ifndef CONFIG_EROFS_FS_ZIP +static int z_erofs_parse_cfgs(struct super_block *sb, + struct erofs_super_block *dsb) { - struct erofs_sb_info *sbi = EROFS_SB(sb); - struct erofs_buf buf = __EROFS_BUF_INITIALIZER; - unsigned int algs, alg; - erofs_off_t offset; - int size, ret = 0; - - sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs); - if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) { - erofs_err(sb, "try to load compressed fs with unsupported algorithms %x", - sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS); - return -EINVAL; - } - - erofs_init_metabuf(&buf, sb); - offset = EROFS_SUPER_OFFSET + sbi->sb_size; - alg = 0; - for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) { - void *data; - - if (!(algs & 1)) - continue; - - data = erofs_read_metadata(sb, &buf, &offset, &size); - if (IS_ERR(data)) { - ret = PTR_ERR(data); - break; - } + if (!dsb->u1.available_compr_algs) + return 0; - switch (alg) { - case Z_EROFS_COMPRESSION_LZ4: - ret = z_erofs_load_lz4_config(sb, dsb, data, size); - break; - case Z_EROFS_COMPRESSION_LZMA: - ret = z_erofs_load_lzma_config(sb, dsb, data, size); - break; - case Z_EROFS_COMPRESSION_DEFLATE: - ret = z_erofs_load_deflate_config(sb, dsb, data, size); - break; - default: - DBG_BUGON(1); - ret = -EFAULT; - } - kfree(data); - if (ret) - break; - } - erofs_put_metabuf(&buf); - return ret; -} -#else -static int erofs_load_compr_cfgs(struct super_block *sb, - struct erofs_super_block *dsb) -{ - if (dsb->u1.available_compr_algs) { - erofs_err(sb, "try to load compressed fs when compression is disabled"); - return -EINVAL; - } - return 0; + erofs_err(sb, "compression disabled, unable to mount compressed EROFS"); + return -EOPNOTSUPP; } #endif @@ -406,10 +353,7 @@ static int erofs_read_superblock(struct super_block *sb) } /* parse on-disk compression configurations */ - if (erofs_sb_has_compr_cfgs(sbi)) - ret = erofs_load_compr_cfgs(sb, dsb); - else - ret = z_erofs_load_lz4_config(sb, dsb, NULL, 0); + ret = z_erofs_parse_cfgs(sb, dsb); if (ret < 0) goto out; From 94c1894b83e606349c21b1b1e66a5f62d55121a1 Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Sat, 21 Oct 2023 02:25:13 -0700 Subject: [PATCH 312/515] vdpa: introduce .reset_map operation callback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some device specific IOMMU parent drivers have long standing bogus behavior that mistakenly clean up the maps during .reset. By definition, this is violation to the on-chip IOMMU ops (i.e. .set_map, or .dma_map & .dma_unmap) in those offending drivers, as the removal of internal maps is completely agnostic to the upper layer, causing inconsistent view between the userspace and the kernel. Some userspace app like QEMU gets around of this brokenness by proactively removing and adding back all the maps around vdpa device reset, but such workaround actually penalize other well-behaved driver setup, where vdpa reset always comes with the associated mapping cost, especially for kernel vDPA devices (use_va=false) that have high cost on pinning. It's imperative to rectify this behavior and remove the problematic code from all those non-compliant parent drivers. The reason why a separate .reset_map op is introduced is because this allows a simple on-chip IOMMU model without exposing too much device implementation detail to the upper vdpa layer. The .dma_map/unmap or .set_map driver API is meant to be used to manipulate the IOTLB mappings, and has been abstracted in a way similar to how a real IOMMU device maps or unmaps pages for certain memory ranges. However, apart from this there also exists other mapping needs, in which case 1:1 passthrough mapping has to be used by other users (read virtio-vdpa). To ease parent/vendor driver implementation and to avoid abusing DMA ops in an unexpacted way, these on-chip IOMMU devices can start with 1:1 passthrough mapping mode initially at the time of creation. Then the .reset_map op can be used to switch iotlb back to this initial state without having to expose a complex two-dimensional IOMMU device model. The .reset_map is not a MUST for every parent that implements the .dma_map or .set_map API, because device may work with DMA ops directly by implement their own to manipulate system memory mappings, so don't have to use .reset_map to achieve a simple IOMMU device model for 1:1 passthrough mapping. Signed-off-by: Si-Wei Liu Acked-by: Eugenio Pérez Acked-by: Jason Wang Message-Id: <1697880319-4937-2-git-send-email-si-wei.liu@oracle.com> Signed-off-by: Michael S. Tsirkin --- include/linux/vdpa.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index d376309b99cf4e..26ae6ae1eac38a 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h @@ -327,6 +327,15 @@ struct vdpa_map_file { * @iova: iova to be unmapped * @size: size of the area * Returns integer: success (0) or error (< 0) + * @reset_map: Reset device memory mapping to the default + * state (optional) + * Needed for devices that are using device + * specific DMA translation and prefer mapping + * to be decoupled from the virtio life cycle, + * i.e. device .reset op does not reset mapping + * @vdev: vdpa device + * @asid: address space identifier + * Returns integer: success (0) or error (< 0) * @get_vq_dma_dev: Get the dma device for a specific * virtqueue (optional) * @vdev: vdpa device @@ -405,6 +414,7 @@ struct vdpa_config_ops { u64 iova, u64 size, u64 pa, u32 perm, void *opaque); int (*dma_unmap)(struct vdpa_device *vdev, unsigned int asid, u64 iova, u64 size); + int (*reset_map)(struct vdpa_device *vdev, unsigned int asid); int (*set_group_asid)(struct vdpa_device *vdev, unsigned int group, unsigned int asid); struct device *(*get_vq_dma_dev)(struct vdpa_device *vdev, u16 idx); From 8ba283ed8c19ec5adb18e25d902e97c4f1e50a42 Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Sat, 21 Oct 2023 02:25:14 -0700 Subject: [PATCH 313/515] vhost-vdpa: reset vendor specific mapping to initial state in .release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Devices with on-chip IOMMU or vendor specific IOTLB implementation may need to restore iotlb mapping to the initial or default state using the .reset_map op, as it's desirable for some parent devices to not work with DMA ops and maintain a simple IOMMU model with .reset_map. In particular, device reset should not cause mapping to go away on such IOTLB model, so persistent mapping is implied across reset. Before the userspace process using vhost-vdpa is gone, give it a chance to reset iotlb back to the initial state in vhost_vdpa_cleanup(). Signed-off-by: Si-Wei Liu Acked-by: Eugenio Pérez Message-Id: <1697880319-4937-3-git-send-email-si-wei.liu@oracle.com> Signed-off-by: Michael S. Tsirkin --- drivers/vhost/vdpa.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index 851535f57b9589..c6bfe9bdde4227 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -131,6 +131,15 @@ static struct vhost_vdpa_as *vhost_vdpa_find_alloc_as(struct vhost_vdpa *v, return vhost_vdpa_alloc_as(v, asid); } +static void vhost_vdpa_reset_map(struct vhost_vdpa *v, u32 asid) +{ + struct vdpa_device *vdpa = v->vdpa; + const struct vdpa_config_ops *ops = vdpa->config; + + if (ops->reset_map) + ops->reset_map(vdpa, asid); +} + static int vhost_vdpa_remove_as(struct vhost_vdpa *v, u32 asid) { struct vhost_vdpa_as *as = asid_to_as(v, asid); @@ -140,6 +149,14 @@ static int vhost_vdpa_remove_as(struct vhost_vdpa *v, u32 asid) hlist_del(&as->hash_link); vhost_vdpa_iotlb_unmap(v, &as->iotlb, 0ULL, 0ULL - 1, asid); + /* + * Devices with vendor specific IOMMU may need to restore + * iotlb to the initial or default state, which cannot be + * cleaned up in the all range unmap call above. Give them + * a chance to clean up or reset the map to the desired + * state. + */ + vhost_vdpa_reset_map(v, asid); kfree(as); return 0; From 1a0fe01e10098081c561e33bc5185c01654c545a Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Sat, 21 Oct 2023 02:25:15 -0700 Subject: [PATCH 314/515] vhost-vdpa: introduce IOTLB_PERSIST backend feature bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Userspace needs this feature flag to distinguish if vhost-vdpa iotlb in the kernel can be trusted to persist IOTLB mapping across vDPA reset. Without it, userspace has no way to tell apart if it's running on an older kernel, which could silently drop all iotlb mapping across vDPA reset, especially with broken parent driver implementation for the .reset driver op. The broken driver may incorrectly drop all mappings of its own as part of .reset, which inadvertently ends up with corrupted mapping state between vhost-vdpa userspace and the kernel. As a workaround, to make the mapping behaviour predictable across reset, userspace has to pro-actively remove all mappings before vDPA reset, and then restore all the mappings afterwards. This workaround is done unconditionally on top of all parent drivers today, due to the parent driver implementation issue and no means to differentiate. This workaround had been utilized in QEMU since day one when the corresponding vhost-vdpa userspace backend came to the world. There are 3 cases that backend may claim this feature bit on for: - parent device that has to work with platform IOMMU - parent device with on-chip IOMMU that has the expected .reset_map support in driver - parent device with vendor specific IOMMU implementation with persistent IOTLB mapping already that has to specifically declare this backend feature The reason why .reset_map is being one of the pre-condition for persistent iotlb is because without it, vhost-vdpa can't switch back iotlb to the initial state later on, especially for the on-chip IOMMU case which starts with identity mapping at device creation. virtio-vdpa requires on-chip IOMMU to perform 1:1 passthrough translation from PA to IOVA as-is to begin with, and .reset_map is the only means to turn back iotlb to the identity mapping mode after vhost-vdpa is gone. The difference in behavior did not matter as QEMU unmaps all the memory unregistering the memory listener at vhost_vdpa_dev_start( started = false), but the backend acknowledging this feature flag allows QEMU to make sure it is safe to skip this unmap & map in the case of vhost stop & start cycle. In that sense, this feature flag is actually a signal for userspace to know that the driver bug has been solved. Not offering it indicates that userspace cannot trust the kernel will retain the maps. Signed-off-by: Si-Wei Liu Acked-by: Eugenio Pérez Message-Id: <1697880319-4937-4-git-send-email-si-wei.liu@oracle.com> Signed-off-by: Michael S. Tsirkin --- drivers/vhost/vdpa.c | 15 +++++++++++++++ include/uapi/linux/vhost_types.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index c6bfe9bdde4227..acc7c74ba7d6ae 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -439,6 +439,15 @@ static u64 vhost_vdpa_get_backend_features(const struct vhost_vdpa *v) return ops->get_backend_features(vdpa); } +static bool vhost_vdpa_has_persistent_map(const struct vhost_vdpa *v) +{ + struct vdpa_device *vdpa = v->vdpa; + const struct vdpa_config_ops *ops = vdpa->config; + + return (!ops->set_map && !ops->dma_map) || ops->reset_map || + vhost_vdpa_get_backend_features(v) & BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST); +} + static long vhost_vdpa_set_features(struct vhost_vdpa *v, u64 __user *featurep) { struct vdpa_device *vdpa = v->vdpa; @@ -726,6 +735,7 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, return -EFAULT; if (features & ~(VHOST_VDPA_BACKEND_FEATURES | BIT_ULL(VHOST_BACKEND_F_DESC_ASID) | + BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST) | BIT_ULL(VHOST_BACKEND_F_SUSPEND) | BIT_ULL(VHOST_BACKEND_F_RESUME) | BIT_ULL(VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK))) @@ -742,6 +752,9 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, if ((features & BIT_ULL(VHOST_BACKEND_F_DESC_ASID)) && !vhost_vdpa_has_desc_group(v)) return -EOPNOTSUPP; + if ((features & BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST)) && + !vhost_vdpa_has_persistent_map(v)) + return -EOPNOTSUPP; vhost_set_backend_features(&v->vdev, features); return 0; } @@ -797,6 +810,8 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, features |= BIT_ULL(VHOST_BACKEND_F_RESUME); if (vhost_vdpa_has_desc_group(v)) features |= BIT_ULL(VHOST_BACKEND_F_DESC_ASID); + if (vhost_vdpa_has_persistent_map(v)) + features |= BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST); features |= vhost_vdpa_get_backend_features(v); if (copy_to_user(featurep, &features, sizeof(features))) r = -EFAULT; diff --git a/include/uapi/linux/vhost_types.h b/include/uapi/linux/vhost_types.h index 18ad6ae7ab5c6a..d7656908f7305f 100644 --- a/include/uapi/linux/vhost_types.h +++ b/include/uapi/linux/vhost_types.h @@ -190,5 +190,7 @@ struct vhost_vdpa_iova_range { * buffers may reside. Requires VHOST_BACKEND_F_IOTLB_ASID. */ #define VHOST_BACKEND_F_DESC_ASID 0x7 +/* IOTLB don't flush memory mapping across device reset */ +#define VHOST_BACKEND_F_IOTLB_PERSIST 0x8 #endif From b1dcb53ea7575cc3fb606d58adb8a3e67a4d0890 Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Sat, 21 Oct 2023 02:25:16 -0700 Subject: [PATCH 315/515] vdpa: introduce .compat_reset operation callback Some device specific IOMMU parent drivers have long standing bogus behaviour that mistakenly clean up the maps during .reset. By definition, this is violation to the on-chip IOMMU ops (i.e. .set_map, or .dma_map & .dma_unmap) in those offending drivers, as the removal of internal maps is completely agnostic to the upper layer, causing inconsistent view between the userspace and the kernel. Some userspace app like QEMU gets around of this brokenness by proactively removing and adding back all the maps around vdpa device reset, but such workaround actually penaltize other well-behaved driver setup, where vdpa reset always comes with the associated mapping cost, especially for kernel vDPA devices (use_va=false) that have high cost on pinning. It's imperative to rectify this behaviour and remove the problematic code from all those non-compliant parent drivers. However, we cannot unconditionally remove the bogus map-cleaning code from the buggy .reset implementation, as there might exist userspace apps that already rely on the behaviour on some setup. Introduce a .compat_reset driver op to keep compatibility with older userspace. New and well behaved parent driver should not bother to implement such op, but only those drivers that are doing or used to do non-compliant map-cleaning reset will have to. Signed-off-by: Si-Wei Liu Message-Id: <1697880319-4937-5-git-send-email-si-wei.liu@oracle.com> Signed-off-by: Michael S. Tsirkin --- include/linux/vdpa.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index 26ae6ae1eac38a..6b8cbf75712dfc 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h @@ -252,6 +252,17 @@ struct vdpa_map_file { * @reset: Reset device * @vdev: vdpa device * Returns integer: success (0) or error (< 0) + * @compat_reset: Reset device with compatibility quirks to + * accommodate older userspace. Only needed by + * parent driver which used to have bogus reset + * behaviour, and has to maintain such behaviour + * for compatibility with older userspace. + * Historically compliant driver only has to + * implement .reset, Historically non-compliant + * driver should implement both. + * @vdev: vdpa device + * @flags: compatibility quirks for reset + * Returns integer: success (0) or error (< 0) * @suspend: Suspend the device (optional) * @vdev: vdpa device * Returns integer: success (0) or error (< 0) @@ -393,6 +404,8 @@ struct vdpa_config_ops { u8 (*get_status)(struct vdpa_device *vdev); void (*set_status)(struct vdpa_device *vdev, u8 status); int (*reset)(struct vdpa_device *vdev); + int (*compat_reset)(struct vdpa_device *vdev, u32 flags); +#define VDPA_RESET_F_CLEAN_MAP 1 int (*suspend)(struct vdpa_device *vdev); int (*resume)(struct vdpa_device *vdev); size_t (*get_config_size)(struct vdpa_device *vdev); From e9faeb2bac1eca9ce59757a471474f7f5e480b47 Mon Sep 17 00:00:00 2001 From: Steve French Date: Sun, 8 Oct 2023 23:11:38 -0500 Subject: [PATCH 316/515] SMB3: clarify some of the unused CreateOption flags Update comments to show flags which should be not set (zero). See MS-SMB2 section 2.2.13 Signed-off-by: Steve French --- fs/smb/common/smb2pdu.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h index 319fb9ffc6a032..b875abc653e1a4 100644 --- a/fs/smb/common/smb2pdu.h +++ b/fs/smb/common/smb2pdu.h @@ -1097,16 +1097,23 @@ struct smb2_change_notify_rsp { #define FILE_WRITE_THROUGH_LE cpu_to_le32(0x00000002) #define FILE_SEQUENTIAL_ONLY_LE cpu_to_le32(0x00000004) #define FILE_NO_INTERMEDIATE_BUFFERING_LE cpu_to_le32(0x00000008) +/* FILE_SYNCHRONOUS_IO_ALERT_LE cpu_to_le32(0x00000010) should be zero, ignored */ +/* FILE_SYNCHRONOUS_IO_NONALERT cpu_to_le32(0x00000020) should be zero, ignored */ #define FILE_NON_DIRECTORY_FILE_LE cpu_to_le32(0x00000040) #define FILE_COMPLETE_IF_OPLOCKED_LE cpu_to_le32(0x00000100) #define FILE_NO_EA_KNOWLEDGE_LE cpu_to_le32(0x00000200) +/* FILE_OPEN_REMOTE_INSTANcE cpu_to_le32(0x00000400) should be zero, ignored */ #define FILE_RANDOM_ACCESS_LE cpu_to_le32(0x00000800) -#define FILE_DELETE_ON_CLOSE_LE cpu_to_le32(0x00001000) +#define FILE_DELETE_ON_CLOSE_LE cpu_to_le32(0x00001000) /* MBZ */ #define FILE_OPEN_BY_FILE_ID_LE cpu_to_le32(0x00002000) #define FILE_OPEN_FOR_BACKUP_INTENT_LE cpu_to_le32(0x00004000) #define FILE_NO_COMPRESSION_LE cpu_to_le32(0x00008000) +/* FILE_OPEN_REQUIRING_OPLOCK cpu_to_le32(0x00010000) should be zero, ignored */ +/* FILE_DISALLOW_EXCLUSIVE cpu_to_le32(0x00020000) should be zero, ignored */ +/* FILE_RESERVE_OPFILTER cpu_to_le32(0x00100000) MBZ */ #define FILE_OPEN_REPARSE_POINT_LE cpu_to_le32(0x00200000) #define FILE_OPEN_NO_RECALL_LE cpu_to_le32(0x00400000) +/* #define FILE_OPEN_FOR_FREE_SPACE_QUERY cpu_to_le32(0x00800000) should be zero, ignored */ #define CREATE_OPTIONS_MASK_LE cpu_to_le32(0x00FFFFFF) #define FILE_READ_RIGHTS_LE (FILE_READ_DATA_LE | FILE_READ_EA_LE \ From 089a8d7be7a225cc90ed98b596aa8ec61a70accd Mon Sep 17 00:00:00 2001 From: Steve French Date: Sun, 8 Oct 2023 23:04:01 -0500 Subject: [PATCH 317/515] Add definition for new smb3.1.1 command type Add structs and defines for new SMB3.1.1 command, server to client notification. See MS-SMB2 section 2.2.44 Signed-off-by: Steve French --- fs/smb/common/smb2pdu.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h index b875abc653e1a4..8a469929cf621b 100644 --- a/fs/smb/common/smb2pdu.h +++ b/fs/smb/common/smb2pdu.h @@ -34,6 +34,7 @@ #define SMB2_QUERY_INFO_HE 0x0010 #define SMB2_SET_INFO_HE 0x0011 #define SMB2_OPLOCK_BREAK_HE 0x0012 +#define SMB2_SERVER_TO_CLIENT_NOTIFICATION 0x0013 /* The same list in little endian */ #define SMB2_NEGOTIATE cpu_to_le16(SMB2_NEGOTIATE_HE) @@ -411,6 +412,7 @@ struct smb2_tree_disconnect_rsp { #define SMB2_GLOBAL_CAP_PERSISTENT_HANDLES 0x00000010 /* New to SMB3 */ #define SMB2_GLOBAL_CAP_DIRECTORY_LEASING 0x00000020 /* New to SMB3 */ #define SMB2_GLOBAL_CAP_ENCRYPTION 0x00000040 /* New to SMB3 */ +#define SMB2_GLOBAL_CAP_NOTIFICATIONS 0x00000080 /* New to SMB3.1.1 */ /* Internal types */ #define SMB2_NT_FIND 0x00100000 #define SMB2_LARGE_FILES 0x00200000 @@ -981,6 +983,19 @@ struct smb2_change_notify_rsp { __u8 Buffer[]; /* array of file notify structs */ } __packed; +/* + * SMB2_SERVER_TO_CLIENT_NOTIFICATION: See MS-SMB2 section 2.2.44 + */ + +#define SMB2_NOTIFY_SESSION_CLOSED 0x0000 + +struct smb2_server_client_notification { + struct smb2_hdr hdr; + __le16 StructureSize; + __u16 Reserved; /* MBZ */ + __le32 NotificationType; + __u8 NotificationBuffer[4]; /* MBZ */ +} __packed; /* * SMB2_CREATE See MS-SMB2 section 2.2.13 From ee8abd6ce1da7fe3f3b7d15b1bca18d420945b62 Mon Sep 17 00:00:00 2001 From: Marco Pagani Date: Wed, 18 Oct 2023 18:38:13 +0200 Subject: [PATCH 318/515] fpga: disable KUnit test suites when module support is enabled The fpga core currently assumes that all manager, bridge, and region devices have a parent device associated with a driver that can be used to take the module's refcount. This behavior causes the fpga test suites to crash with a null-ptr-deref since parent fake devices do not have a driver. This patch disables all fpga KUnit test suites when loadable module support is enabled until the fpga core is fixed. Test suites can still be run using the KUnit default UML kernel. Fixes: ccbc1c302115 ("fpga: add an initial KUnit suite for the FPGA Manager") Signed-off-by: Marco Pagani Acked-by: Xu Yilun Link: https://lore.kernel.org/r/20231018163814.100803-1-marpagan@redhat.com Signed-off-by: Xu Yilun --- drivers/fpga/tests/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/fpga/tests/Kconfig b/drivers/fpga/tests/Kconfig index e4a64815f16d63..d4e55204c09267 100644 --- a/drivers/fpga/tests/Kconfig +++ b/drivers/fpga/tests/Kconfig @@ -1,6 +1,6 @@ config FPGA_KUNIT_TESTS - tristate "KUnit test for the FPGA subsystem" if !KUNIT_ALL_TESTS - depends on FPGA && FPGA_REGION && FPGA_BRIDGE && KUNIT=y + bool "KUnit test for the FPGA subsystem" if !KUNIT_ALL_TESTS + depends on FPGA=y && FPGA_REGION=y && FPGA_BRIDGE=y && KUNIT=y && MODULES=n default KUNIT_ALL_TESTS help This builds unit tests for the FPGA subsystem From 9221d5ecebf055a5791d3e1a7f25e7d8bdbf1ff2 Mon Sep 17 00:00:00 2001 From: Russ Weight Date: Thu, 28 Sep 2023 09:47:53 -0700 Subject: [PATCH 319/515] fpga: m10bmc-sec: Change contact for secure update driver Change the maintainer for the Intel MAX10 BMC Secure Update driver from Russ Weight to Peter Colberg. Update the ABI documentation contact information as well. Signed-off-by: Russ Weight Acked-by: Peter Colberg Link: https://lore.kernel.org/r/20230928164753.278684-1-russell.h.weight@intel.com Signed-off-by: Xu Yilun --- .../testing/sysfs-driver-intel-m10-bmc-sec-update | 14 +++++++------- MAINTAINERS | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update b/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update index 0a41afe0ab4cbe..9051695d221170 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update +++ b/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update @@ -1,7 +1,7 @@ What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/sr_root_entry_hash Date: Sep 2022 KernelVersion: 5.20 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns the root entry hash for the static region if one is programmed, else it returns the string: "hash not programmed". This file is only @@ -11,7 +11,7 @@ Description: Read only. Returns the root entry hash for the static What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/pr_root_entry_hash Date: Sep 2022 KernelVersion: 5.20 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns the root entry hash for the partial reconfiguration region if one is programmed, else it returns the string: "hash not programmed". This file @@ -21,7 +21,7 @@ Description: Read only. Returns the root entry hash for the partial What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/bmc_root_entry_hash Date: Sep 2022 KernelVersion: 5.20 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns the root entry hash for the BMC image if one is programmed, else it returns the string: "hash not programmed". This file is only visible if the @@ -31,7 +31,7 @@ Description: Read only. Returns the root entry hash for the BMC image What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/sr_canceled_csks Date: Sep 2022 KernelVersion: 5.20 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns a list of indices for canceled code signing keys for the static region. The standard bitmap list format is used (e.g. "1,2-6,9"). @@ -39,7 +39,7 @@ Description: Read only. Returns a list of indices for canceled code What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/pr_canceled_csks Date: Sep 2022 KernelVersion: 5.20 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns a list of indices for canceled code signing keys for the partial reconfiguration region. The standard bitmap list format is used (e.g. "1,2-6,9"). @@ -47,7 +47,7 @@ Description: Read only. Returns a list of indices for canceled code What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/bmc_canceled_csks Date: Sep 2022 KernelVersion: 5.20 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns a list of indices for canceled code signing keys for the BMC. The standard bitmap list format is used (e.g. "1,2-6,9"). @@ -55,7 +55,7 @@ Description: Read only. Returns a list of indices for canceled code What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/flash_count Date: Sep 2022 KernelVersion: 5.20 -Contact: Russ Weight +Contact: Peter Colberg Description: Read only. Returns number of times the secure update staging area has been flashed. Format: "%u". diff --git a/MAINTAINERS b/MAINTAINERS index b19995690904aa..6f627a12ef9fda 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10700,7 +10700,7 @@ F: drivers/mfd/intel-m10-bmc* F: include/linux/mfd/intel-m10-bmc.h INTEL MAX10 BMC SECURE UPDATES -M: Russ Weight +M: Peter Colberg L: linux-fpga@vger.kernel.org S: Maintained F: Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update From 03d4bf9ff34abbb24f4fbc674f2dcd057ebff309 Mon Sep 17 00:00:00 2001 From: Jinjie Ruan Date: Sat, 7 Oct 2023 17:43:21 +0800 Subject: [PATCH 320/515] fpga: Fix memory leak for fpga_region_test_class_find() fpga_region_class_find() in fpga_region_test_class_find() will call get_device() if the data is matched, which will increment refcount for dev->kobj, so it should call put_device() to decrement refcount for dev->kobj to free the region, because fpga_region_unregister() will call fpga_region_dev_release() only when the refcount for dev->kobj is zero but fpga_region_test_init() call device_register() in fpga_region_register_full(), which also increment refcount. So call put_device() after calling fpga_region_class_find() in fpga_region_test_class_find(). After applying this patch, the following memory leak is never detected. unreferenced object 0xffff88810c8ef000 (size 1024): comm "kunit_try_catch", pid 1875, jiffies 4294715298 (age 836.836s) hex dump (first 32 bytes): b8 d1 fb 05 81 88 ff ff 08 f0 8e 0c 81 88 ff ff ................ 08 f0 8e 0c 81 88 ff ff 00 00 00 00 00 00 00 00 ................ backtrace: [] kmalloc_trace+0x27/0xa0 [] fpga_region_register_full+0x51/0x430 [fpga_region] [] 0xffffffffa0228e47 [] kunit_try_run_case+0xdd/0x250 [] kunit_generic_run_threadfn_adapter+0x4a/0x90 [] kthread+0x2b5/0x380 [] ret_from_fork+0x2d/0x70 [] ret_from_fork_asm+0x11/0x20 unreferenced object 0xffff888105fbd1b8 (size 8): comm "kunit_try_catch", pid 1875, jiffies 4294715298 (age 836.836s) hex dump (first 8 bytes): 72 65 67 69 6f 6e 30 00 region0. backtrace: [] __kmalloc_node_track_caller+0x53/0x150 [] kvasprintf+0xb0/0x130 [] kobject_set_name_vargs+0x41/0x110 [] dev_set_name+0xab/0xe0 [] fpga_region_register_full+0x312/0x430 [fpga_region] [] 0xffffffffa0228e47 [] kunit_try_run_case+0xdd/0x250 [] kunit_generic_run_threadfn_adapter+0x4a/0x90 [] kthread+0x2b5/0x380 [] ret_from_fork+0x2d/0x70 [] ret_from_fork_asm+0x11/0x20 unreferenced object 0xffff88810b3b8a00 (size 256): comm "kunit_try_catch", pid 1875, jiffies 4294715298 (age 836.836s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 08 8a 3b 0b 81 88 ff ff ..........;..... 08 8a 3b 0b 81 88 ff ff e0 ac 04 83 ff ff ff ff ..;............. backtrace: [] kmalloc_trace+0x27/0xa0 [] device_add+0xa2a/0x15e0 [] fpga_region_register_full+0x321/0x430 [fpga_region] [] 0xffffffffa0228e47 [] kunit_try_run_case+0xdd/0x250 [] kunit_generic_run_threadfn_adapter+0x4a/0x90 [] kthread+0x2b5/0x380 [] ret_from_fork+0x2d/0x70 [] ret_from_fork_asm+0x11/0x20 Fixes: 64a5f972c93d ("fpga: add an initial KUnit suite for the FPGA Region") Signed-off-by: Jinjie Ruan Reviewed-by: Marco Pagani Acked-by: Xu Yilun Link: https://lore.kernel.org/r/20231007094321.3447084-1-ruanjinjie@huawei.com [yilun.xu@intel.com: slightly changes the commit message] Signed-off-by: Xu Yilun --- drivers/fpga/tests/fpga-region-test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/fpga/tests/fpga-region-test.c b/drivers/fpga/tests/fpga-region-test.c index 9f9d50ee78710b..baab07e3fc5967 100644 --- a/drivers/fpga/tests/fpga-region-test.c +++ b/drivers/fpga/tests/fpga-region-test.c @@ -93,6 +93,8 @@ static void fpga_region_test_class_find(struct kunit *test) region = fpga_region_class_find(NULL, &ctx->region_pdev->dev, fake_region_match); KUNIT_EXPECT_PTR_EQ(test, region, ctx->region); + + put_device(®ion->dev); } /* From f778cbadda547222f71ec6d65e80167673038414 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Sun, 22 Oct 2023 00:06:41 +0200 Subject: [PATCH 321/515] gfs2: Two quota=account mode fixes Make sure we don't skip accounting for quota changes with the quota=account mount option. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/quota.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 41d0232532a031..d0d01d4856215f 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -1083,8 +1083,7 @@ int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid) u32 x; int error; - if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON && - sdp->sd_args.ar_quota != GFS2_QUOTA_QUIET) + if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) return 0; error = gfs2_quota_hold(ip, uid, gid); @@ -1285,8 +1284,7 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change, u32 x; struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); - if ((sdp->sd_args.ar_quota != GFS2_QUOTA_ON && - sdp->sd_args.ar_quota != GFS2_QUOTA_QUIET) || + if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF || gfs2_assert_warn(sdp, change)) return; if (ip->i_diskflags & GFS2_DIF_SYSTEM) From 48fdc4092aa2f42f222b2dca85757b2ff868f2ad Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Tue, 3 Oct 2023 17:29:23 +0200 Subject: [PATCH 322/515] mfd: qcom-spmi-pmic: Fix reference leaks in revid helper The Qualcomm SPMI PMIC revid implementation is broken in multiple ways. First, it totally ignores struct device_node reference counting and leaks references to the parent bus node as well as each child it iterates over using an open-coded for_each_child_of_node(). Second, it leaks references to each spmi device on the bus that it iterates over by failing to drop the reference taken by the spmi_device_from_of() helper. Fix the struct device_node leaks by reimplementing the lookup using for_each_child_of_node() and adding the missing reference count decrements. Fix the sibling struct device leaks by dropping the unnecessary lookups of devices with the wrong USID. Note that this still leaves one struct device reference leak in case a base device is found but it is not the parent of the device used for the lookup. This will be addressed in a follow-on patch. Fixes: e9c11c6e3a0e ("mfd: qcom-spmi-pmic: expose the PMIC revid information to clients") Cc: stable@vger.kernel.org # 6.0 Signed-off-by: Johan Hovold Acked-by: Caleb Connolly Link: https://lore.kernel.org/r/20231003152927.15000-2-johan+linaro@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/qcom-spmi-pmic.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/drivers/mfd/qcom-spmi-pmic.c b/drivers/mfd/qcom-spmi-pmic.c index 7e2cd79d17ebf8..47738f7e492ca9 100644 --- a/drivers/mfd/qcom-spmi-pmic.c +++ b/drivers/mfd/qcom-spmi-pmic.c @@ -81,7 +81,7 @@ static struct spmi_device *qcom_pmic_get_base_usid(struct device *dev) struct spmi_device *sdev; struct qcom_spmi_dev *ctx; struct device_node *spmi_bus; - struct device_node *other_usid = NULL; + struct device_node *child; int function_parent_usid, ret; u32 pmic_addr; @@ -105,28 +105,34 @@ static struct spmi_device *qcom_pmic_get_base_usid(struct device *dev) * device for USID 2. */ spmi_bus = of_get_parent(sdev->dev.of_node); - do { - other_usid = of_get_next_child(spmi_bus, other_usid); - - ret = of_property_read_u32_index(other_usid, "reg", 0, &pmic_addr); - if (ret) - return ERR_PTR(ret); + sdev = ERR_PTR(-ENODATA); + for_each_child_of_node(spmi_bus, child) { + ret = of_property_read_u32_index(child, "reg", 0, &pmic_addr); + if (ret) { + of_node_put(child); + sdev = ERR_PTR(ret); + break; + } - sdev = spmi_device_from_of(other_usid); if (pmic_addr == function_parent_usid - (ctx->num_usids - 1)) { - if (!sdev) + sdev = spmi_device_from_of(child); + if (!sdev) { /* * If the base USID for this PMIC hasn't probed yet * but the secondary USID has, then we need to defer * the function driver so that it will attempt to * probe again when the base USID is ready. */ - return ERR_PTR(-EPROBE_DEFER); - return sdev; + sdev = ERR_PTR(-EPROBE_DEFER); + } + of_node_put(child); + break; } - } while (other_usid->sibling); + } + + of_node_put(spmi_bus); - return ERR_PTR(-ENODATA); + return sdev; } static int pmic_spmi_load_revid(struct regmap *map, struct device *dev, From cd37c1cbd58fddc108445ace57446d74a2cbfb31 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Tue, 3 Oct 2023 17:29:24 +0200 Subject: [PATCH 323/515] mfd: qcom-spmi-pmic: Fix revid implementation The Qualcomm SPMI PMIC revid implementation is broken in multiple ways. First, it assumes that just because the sibling base device has been registered that means that it is also bound to a driver, which may not be the case (e.g. due to probe deferral or asynchronous probe). This could trigger a NULL-pointer dereference when attempting to access the driver data of the unbound device. Second, it accesses driver data of a sibling device directly and without any locking, which means that the driver data may be freed while it is being accessed (e.g. on driver unbind). Third, it leaks a struct device reference to the sibling device which is looked up using the spmi_device_from_of() every time a function (child) device is calling the revid function (e.g. on probe). Fix this mess by reimplementing the revid lookup so that it is done only at probe of the PMIC device; the base device fetches the revid info from the hardware, while any secondary SPMI device fetches the information from the base device and caches it so that it can be accessed safely from its children. If the base device has not been probed yet then probe of a secondary device is deferred. Fixes: e9c11c6e3a0e ("mfd: qcom-spmi-pmic: expose the PMIC revid information to clients") Cc: stable@vger.kernel.org # 6.0 Signed-off-by: Johan Hovold Acked-by: Caleb Connolly Link: https://lore.kernel.org/r/20231003152927.15000-3-johan+linaro@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/qcom-spmi-pmic.c | 69 +++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/drivers/mfd/qcom-spmi-pmic.c b/drivers/mfd/qcom-spmi-pmic.c index 47738f7e492ca9..8e449cff5cec40 100644 --- a/drivers/mfd/qcom-spmi-pmic.c +++ b/drivers/mfd/qcom-spmi-pmic.c @@ -30,6 +30,8 @@ struct qcom_spmi_dev { struct qcom_spmi_pmic pmic; }; +static DEFINE_MUTEX(pmic_spmi_revid_lock); + #define N_USIDS(n) ((void *)n) static const struct of_device_id pmic_spmi_id_table[] = { @@ -76,24 +78,21 @@ static const struct of_device_id pmic_spmi_id_table[] = { * * This only supports PMICs with 1 or 2 USIDs. */ -static struct spmi_device *qcom_pmic_get_base_usid(struct device *dev) +static struct spmi_device *qcom_pmic_get_base_usid(struct spmi_device *sdev, struct qcom_spmi_dev *ctx) { - struct spmi_device *sdev; - struct qcom_spmi_dev *ctx; struct device_node *spmi_bus; struct device_node *child; int function_parent_usid, ret; u32 pmic_addr; - sdev = to_spmi_device(dev); - ctx = dev_get_drvdata(&sdev->dev); - /* * Quick return if the function device is already in the base * USID. This will always be hit for PMICs with only 1 USID. */ - if (sdev->usid % ctx->num_usids == 0) + if (sdev->usid % ctx->num_usids == 0) { + get_device(&sdev->dev); return sdev; + } function_parent_usid = sdev->usid; @@ -118,10 +117,8 @@ static struct spmi_device *qcom_pmic_get_base_usid(struct device *dev) sdev = spmi_device_from_of(child); if (!sdev) { /* - * If the base USID for this PMIC hasn't probed yet - * but the secondary USID has, then we need to defer - * the function driver so that it will attempt to - * probe again when the base USID is ready. + * If the base USID for this PMIC hasn't been + * registered yet then we need to defer. */ sdev = ERR_PTR(-EPROBE_DEFER); } @@ -135,6 +132,35 @@ static struct spmi_device *qcom_pmic_get_base_usid(struct device *dev) return sdev; } +static int pmic_spmi_get_base_revid(struct spmi_device *sdev, struct qcom_spmi_dev *ctx) +{ + struct qcom_spmi_dev *base_ctx; + struct spmi_device *base; + int ret = 0; + + base = qcom_pmic_get_base_usid(sdev, ctx); + if (IS_ERR(base)) + return PTR_ERR(base); + + /* + * Copy revid info from base device if it has probed and is still + * bound to its driver. + */ + mutex_lock(&pmic_spmi_revid_lock); + base_ctx = spmi_device_get_drvdata(base); + if (!base_ctx) { + ret = -EPROBE_DEFER; + goto out_unlock; + } + memcpy(&ctx->pmic, &base_ctx->pmic, sizeof(ctx->pmic)); +out_unlock: + mutex_unlock(&pmic_spmi_revid_lock); + + put_device(&base->dev); + + return ret; +} + static int pmic_spmi_load_revid(struct regmap *map, struct device *dev, struct qcom_spmi_pmic *pmic) { @@ -210,11 +236,7 @@ const struct qcom_spmi_pmic *qcom_pmic_get(struct device *dev) if (!of_match_device(pmic_spmi_id_table, dev->parent)) return ERR_PTR(-EINVAL); - sdev = qcom_pmic_get_base_usid(dev->parent); - - if (IS_ERR(sdev)) - return ERR_CAST(sdev); - + sdev = to_spmi_device(dev->parent); spmi = dev_get_drvdata(&sdev->dev); return &spmi->pmic; @@ -249,16 +271,31 @@ static int pmic_spmi_probe(struct spmi_device *sdev) ret = pmic_spmi_load_revid(regmap, &sdev->dev, &ctx->pmic); if (ret < 0) return ret; + } else { + ret = pmic_spmi_get_base_revid(sdev, ctx); + if (ret) + return ret; } + + mutex_lock(&pmic_spmi_revid_lock); spmi_device_set_drvdata(sdev, ctx); + mutex_unlock(&pmic_spmi_revid_lock); return devm_of_platform_populate(&sdev->dev); } +static void pmic_spmi_remove(struct spmi_device *sdev) +{ + mutex_lock(&pmic_spmi_revid_lock); + spmi_device_set_drvdata(sdev, NULL); + mutex_unlock(&pmic_spmi_revid_lock); +} + MODULE_DEVICE_TABLE(of, pmic_spmi_id_table); static struct spmi_driver pmic_spmi_driver = { .probe = pmic_spmi_probe, + .remove = pmic_spmi_remove, .driver = { .name = "pmic-spmi", .of_match_table = pmic_spmi_id_table, From 83c63849d36a89d02ee9c77f0bafc8654c7f924c Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Tue, 3 Oct 2023 17:29:25 +0200 Subject: [PATCH 324/515] mfd: qcom-spmi-pmic: Switch to EXPORT_SYMBOL_GPL() Switch to using EXPORT_SYMBOL_GPL() for the revid helper as there is no reason not to use it. Signed-off-by: Johan Hovold Reviewed-by: Konrad Dybcio Acked-by: Caleb Connolly Link: https://lore.kernel.org/r/20231003152927.15000-4-johan+linaro@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/qcom-spmi-pmic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/qcom-spmi-pmic.c b/drivers/mfd/qcom-spmi-pmic.c index 8e449cff5cec40..ee55f09da3ba5d 100644 --- a/drivers/mfd/qcom-spmi-pmic.c +++ b/drivers/mfd/qcom-spmi-pmic.c @@ -241,7 +241,7 @@ const struct qcom_spmi_pmic *qcom_pmic_get(struct device *dev) return &spmi->pmic; } -EXPORT_SYMBOL(qcom_pmic_get); +EXPORT_SYMBOL_GPL(qcom_pmic_get); static const struct regmap_config spmi_regmap_config = { .reg_bits = 16, From 1c4b6e32637f4f462bae3aea4f960144ae755dd5 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 14 Oct 2023 22:54:14 +0200 Subject: [PATCH 325/515] mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs Commit 9e86b2ad4c11 changed the channel used for HPDET detection (headphones vs lineout detection) from being hardcoded to ARIZONA_ACCDET_MODE_HPL (HP left channel) to it being configurable through arizona_pdata.hpdet_channel the DT/OF parsing added for filling arizona_pdata on devicetree platforms ensures that arizona_pdata.hpdet_channel gets set to ARIZONA_ACCDET_MODE_HPL when not specified in the devicetree-node. But on ACPI platforms where arizona_pdata is filled by arizona_spi_acpi_probe() arizona_pdata.hpdet_channel was not getting set, causing it to default to 0 aka ARIZONA_ACCDET_MODE_MIC. This causes headphones to get misdetected as line-out on some models. Fix this by setting hpdet_channel = ARIZONA_ACCDET_MODE_HPL. Fixes: e933836744a2 ("mfd: arizona: Add support for ACPI enumeration of WM5102 connected over SPI") Signed-off-by: Hans de Goede Link: https://lore.kernel.org/r/20231014205414.59415-1-hdegoede@redhat.com Signed-off-by: Lee Jones --- drivers/mfd/arizona-spi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/mfd/arizona-spi.c b/drivers/mfd/arizona-spi.c index 02cf4f3e91d767..de5d894ac04af8 100644 --- a/drivers/mfd/arizona-spi.c +++ b/drivers/mfd/arizona-spi.c @@ -159,6 +159,9 @@ static int arizona_spi_acpi_probe(struct arizona *arizona) arizona->pdata.micd_ranges = arizona_micd_aosp_ranges; arizona->pdata.num_micd_ranges = ARRAY_SIZE(arizona_micd_aosp_ranges); + /* Use left headphone speaker for HP vs line-out detection */ + arizona->pdata.hpdet_channel = ARIZONA_ACCDET_MODE_HPL; + return 0; } From 7f8774dc7ffdca4fc2ce47a2b03368ec0173ecb3 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Tue, 17 Oct 2023 15:35:36 -0500 Subject: [PATCH 326/515] mfd: motorola-cpcap: Drop unnecessary of_match_device() call If probe is reached, we've already matched the device and in the case of DT matching, the struct device_node pointer will be set. Therefore, there is no need to call of_match_device() in probe. Signed-off-by: Rob Herring Link: https://lore.kernel.org/r/20231017203537.2700340-1-robh@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/motorola-cpcap.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c index a19691ba8d8b08..d8243b956f875d 100644 --- a/drivers/mfd/motorola-cpcap.c +++ b/drivers/mfd/motorola-cpcap.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include @@ -290,14 +290,9 @@ static const struct mfd_cell cpcap_mfd_devices[] = { static int cpcap_probe(struct spi_device *spi) { - const struct of_device_id *match; struct cpcap_ddata *cpcap; int ret; - match = of_match_device(cpcap_of_match, &spi->dev); - if (!match) - return -ENODEV; - cpcap = devm_kzalloc(&spi->dev, sizeof(*cpcap), GFP_KERNEL); if (!cpcap) return -ENOMEM; From 85d4ecf24a556dfb3ee6b80db3fa16b2b4677d77 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Tue, 17 Oct 2023 15:35:49 -0500 Subject: [PATCH 327/515] mfd: mc13xxx-spi/wm831x-spi: Use spi_get_device_match_data() Use preferred spi_get_device_match_data() instead of of_match_device() and spi_get_device_id() to get the driver match data. With this, adjust the includes to explicitly include the correct headers. Signed-off-by: Rob Herring Link: https://lore.kernel.org/r/20231017203550.2700601-1-robh@kernel.org Signed-off-by: Lee Jones tils.feedkeys.call.run(35) all.run(37) all.run(39) --- drivers/mfd/mc13xxx-spi.c | 14 ++------------ drivers/mfd/wm831x-spi.c | 16 ++++------------ 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/drivers/mfd/mc13xxx-spi.c b/drivers/mfd/mc13xxx-spi.c index f70d79aa5a8334..c973e2579bdfb6 100644 --- a/drivers/mfd/mc13xxx-spi.c +++ b/drivers/mfd/mc13xxx-spi.c @@ -8,13 +8,12 @@ */ #include +#include #include #include #include #include #include -#include -#include #include #include @@ -151,16 +150,7 @@ static int mc13xxx_spi_probe(struct spi_device *spi) return ret; } - if (spi->dev.of_node) { - const struct of_device_id *of_id = - of_match_device(mc13xxx_dt_ids, &spi->dev); - - mc13xxx->variant = of_id->data; - } else { - const struct spi_device_id *id_entry = spi_get_device_id(spi); - - mc13xxx->variant = (void *)id_entry->driver_data; - } + mc13xxx->variant = spi_get_device_match_data(spi); return mc13xxx_common_init(&spi->dev); } diff --git a/drivers/mfd/wm831x-spi.c b/drivers/mfd/wm831x-spi.c index 76be7ef5c9709c..54c87267917b9a 100644 --- a/drivers/mfd/wm831x-spi.c +++ b/drivers/mfd/wm831x-spi.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -21,21 +20,14 @@ static int wm831x_spi_probe(struct spi_device *spi) { struct wm831x_pdata *pdata = dev_get_platdata(&spi->dev); - const struct spi_device_id *id = spi_get_device_id(spi); - const struct of_device_id *of_id; struct wm831x *wm831x; enum wm831x_parent type; int ret; - if (spi->dev.of_node) { - of_id = of_match_device(wm831x_of_match, &spi->dev); - if (!of_id) { - dev_err(&spi->dev, "Failed to match device\n"); - return -ENODEV; - } - type = (uintptr_t)of_id->data; - } else { - type = (enum wm831x_parent)id->driver_data; + type = (uintptr_t)spi_get_device_match_data(spi); + if (!type) { + dev_err(&spi->dev, "Failed to match device\n"); + return -ENODEV; } wm831x = devm_kzalloc(&spi->dev, sizeof(struct wm831x), GFP_KERNEL); From 1e0c866887f4b703c65e61598340d1a8ef9c4c0f Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Tue, 17 Oct 2023 15:36:10 -0500 Subject: [PATCH 328/515] mfd: Use device_get_match_data() in a bunch of drivers Use preferred device_get_match_data() instead of of_match_device() to get the driver match data. With this, adjust the includes to explicitly include the correct headers. Reviewed-by: Chen-Yu Tsai Signed-off-by: Rob Herring Link: https://lore.kernel.org/r/20231017203612.2701060-1-robh@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/axp20x.c | 22 +++------------------- drivers/mfd/hi6421-pmic-core.c | 9 +++------ drivers/mfd/mxs-lradc.c | 9 ++------- drivers/mfd/qcom-spmi-pmic.c | 6 ++++-- drivers/mfd/qcom_rpm.c | 8 ++++---- drivers/mfd/tps65910.c | 11 ++--------- drivers/mfd/twl4030-power.c | 9 +++------ drivers/mfd/twl6030-irq.c | 10 +++++----- 8 files changed, 26 insertions(+), 58 deletions(-) diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index d93189b0230de6..deaa969bab4e19 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -22,7 +22,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -1131,27 +1132,10 @@ static int axp20x_power_off(struct sys_off_data *data) int axp20x_match_device(struct axp20x_dev *axp20x) { struct device *dev = axp20x->dev; - const struct acpi_device_id *acpi_id; - const struct of_device_id *of_id; const struct mfd_cell *cells_no_irq = NULL; int nr_cells_no_irq = 0; - if (dev->of_node) { - of_id = of_match_device(dev->driver->of_match_table, dev); - if (!of_id) { - dev_err(dev, "Unable to match OF ID\n"); - return -ENODEV; - } - axp20x->variant = (long)of_id->data; - } else { - acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev); - if (!acpi_id || !acpi_id->driver_data) { - dev_err(dev, "Unable to match ACPI ID and data\n"); - return -ENODEV; - } - axp20x->variant = (long)acpi_id->driver_data; - } - + axp20x->variant = (long)device_get_match_data(dev); switch (axp20x->variant) { case AXP152_ID: axp20x->nr_cells = ARRAY_SIZE(axp152_cells); diff --git a/drivers/mfd/hi6421-pmic-core.c b/drivers/mfd/hi6421-pmic-core.c index a6a890537a1e28..5af24a4383296a 100644 --- a/drivers/mfd/hi6421-pmic-core.c +++ b/drivers/mfd/hi6421-pmic-core.c @@ -15,8 +15,9 @@ #include #include #include -#include +#include #include +#include #include static const struct mfd_cell hi6421_devs[] = { @@ -50,16 +51,12 @@ MODULE_DEVICE_TABLE(of, of_hi6421_pmic_match); static int hi6421_pmic_probe(struct platform_device *pdev) { struct hi6421_pmic *pmic; - const struct of_device_id *id; const struct mfd_cell *subdevs; enum hi6421_type type; void __iomem *base; int n_subdevs, ret; - id = of_match_device(of_hi6421_pmic_match, &pdev->dev); - if (!id) - return -EINVAL; - type = (uintptr_t)id->data; + type = (uintptr_t)device_get_match_data(&pdev->dev); pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); if (!pmic) diff --git a/drivers/mfd/mxs-lradc.c b/drivers/mfd/mxs-lradc.c index 21f3033d6eb582..ec1b356562b9ad 100644 --- a/drivers/mfd/mxs-lradc.c +++ b/drivers/mfd/mxs-lradc.c @@ -16,8 +16,8 @@ #include #include #include -#include #include +#include #include #define ADC_CELL 0 @@ -125,7 +125,6 @@ MODULE_DEVICE_TABLE(of, mxs_lradc_dt_ids); static int mxs_lradc_probe(struct platform_device *pdev) { - const struct of_device_id *of_id; struct device *dev = &pdev->dev; struct device_node *node = dev->of_node; struct mxs_lradc *lradc; @@ -138,11 +137,7 @@ static int mxs_lradc_probe(struct platform_device *pdev) if (!lradc) return -ENOMEM; - of_id = of_match_device(mxs_lradc_dt_ids, &pdev->dev); - if (!of_id) - return -EINVAL; - - lradc->soc = (uintptr_t)of_id->data; + lradc->soc = (enum mxs_lradc_id)device_get_match_data(&pdev->dev); lradc->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(lradc->clk)) { diff --git a/drivers/mfd/qcom-spmi-pmic.c b/drivers/mfd/qcom-spmi-pmic.c index ee55f09da3ba5d..203b1e27a1ae3e 100644 --- a/drivers/mfd/qcom-spmi-pmic.c +++ b/drivers/mfd/qcom-spmi-pmic.c @@ -8,10 +8,12 @@ #include #include #include +#include +#include +#include #include #include #include -#include #include #define PMIC_REV2 0x101 @@ -264,7 +266,7 @@ static int pmic_spmi_probe(struct spmi_device *sdev) if (!ctx) return -ENOMEM; - ctx->num_usids = (uintptr_t)of_device_get_match_data(&sdev->dev); + ctx->num_usids = (uintptr_t)device_get_match_data(&sdev->dev); /* Only the first slave id for a PMIC contains this information */ if (sdev->usid % ctx->num_usids == 0) { diff --git a/drivers/mfd/qcom_rpm.c b/drivers/mfd/qcom_rpm.c index 086611322874d4..27446f43e3f3af 100644 --- a/drivers/mfd/qcom_rpm.c +++ b/drivers/mfd/qcom_rpm.c @@ -7,6 +7,8 @@ #include #include +#include +#include #include #include #include @@ -528,7 +530,6 @@ static irqreturn_t qcom_rpm_wakeup_interrupt(int irq, void *dev) static int qcom_rpm_probe(struct platform_device *pdev) { - const struct of_device_id *match; struct device_node *syscon_np; struct qcom_rpm *rpm; u32 fw_version[3]; @@ -570,10 +571,9 @@ static int qcom_rpm_probe(struct platform_device *pdev) if (irq_wakeup < 0) return irq_wakeup; - match = of_match_device(qcom_rpm_of_match, &pdev->dev); - if (!match) + rpm->data = device_get_match_data(&pdev->dev); + if (!rpm->data) return -ENODEV; - rpm->data = match->data; rpm->status_regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); if (IS_ERR(rpm->status_regs)) diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c index 307d30da274b14..8fb0384d5a8ed7 100644 --- a/drivers/mfd/tps65910.c +++ b/drivers/mfd/tps65910.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include static const struct resource rtc_resources[] = { { @@ -374,16 +374,9 @@ static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client, struct device_node *np = client->dev.of_node; struct tps65910_board *board_info; unsigned int prop; - const struct of_device_id *match; int ret; - match = of_match_device(tps65910_of_match, &client->dev); - if (!match) { - dev_err(&client->dev, "Failed to find matching dt id\n"); - return NULL; - } - - *chip_id = (unsigned long)match->data; + *chip_id = (unsigned long)device_get_match_data(&client->dev); board_info = devm_kzalloc(&client->dev, sizeof(*board_info), GFP_KERNEL); diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c index e35b0f788c504a..1595e9c76132d8 100644 --- a/drivers/mfd/twl4030-power.c +++ b/drivers/mfd/twl4030-power.c @@ -27,8 +27,8 @@ #include #include #include +#include #include -#include #include @@ -883,7 +883,6 @@ static int twl4030_power_probe(struct platform_device *pdev) { const struct twl4030_power_data *pdata = dev_get_platdata(&pdev->dev); struct device_node *node = pdev->dev.of_node; - const struct of_device_id *match; int err = 0; int err2 = 0; u8 val; @@ -904,10 +903,8 @@ static int twl4030_power_probe(struct platform_device *pdev) return err; } - match = of_match_device(of_match_ptr(twl4030_power_of_match), - &pdev->dev); - if (match && match->data) - pdata = match->data; + if (node) + pdata = device_get_match_data(&pdev->dev); if (pdata) { err = twl4030_power_configure_scripts(pdata); diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c index 3c03681c124c04..f9fce8408c2cf4 100644 --- a/drivers/mfd/twl6030-irq.c +++ b/drivers/mfd/twl6030-irq.c @@ -24,10 +24,10 @@ #include #include #include +#include #include #include #include -#include #include "twl-core.h" @@ -368,10 +368,10 @@ int twl6030_init_irq(struct device *dev, int irq_num) int nr_irqs; int status; u8 mask[3]; - const struct of_device_id *of_id; + const int *irq_tbl; - of_id = of_match_device(twl6030_of_match, dev); - if (!of_id || !of_id->data) { + irq_tbl = device_get_match_data(dev); + if (!irq_tbl) { dev_err(dev, "Unknown TWL device model\n"); return -EINVAL; } @@ -409,7 +409,7 @@ int twl6030_init_irq(struct device *dev, int irq_num) twl6030_irq->pm_nb.notifier_call = twl6030_irq_pm_notifier; atomic_set(&twl6030_irq->wakeirqs, 0); - twl6030_irq->irq_mapping_tbl = of_id->data; + twl6030_irq->irq_mapping_tbl = irq_tbl; twl6030_irq->irq_domain = irq_domain_add_linear(node, nr_irqs, From ff1b6dd21b25906ab62e76bf053f937fedac92cd Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Tue, 17 Oct 2023 15:36:02 -0500 Subject: [PATCH 329/515] mfd: Use i2c_get_match_data() in a selection of drivers Use preferred i2c_get_match_data() instead of of_match_device() and i2c driver_data to get the driver match data. With this, adjust the includes to explicitly include the correct headers. Signed-off-by: Rob Herring Reviewed-by: Chanwoo Choi Link: https://lore.kernel.org/r/20231017203603.2700864-1-robh@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/lochnagar-i2c.c | 9 ++------- drivers/mfd/lp87565.c | 9 +++------ drivers/mfd/max14577.c | 14 +++----------- drivers/mfd/rn5t618.c | 11 ++--------- drivers/mfd/wm831x-i2c.c | 16 ++++------------ drivers/mfd/wm8994-core.c | 11 +---------- 6 files changed, 15 insertions(+), 55 deletions(-) diff --git a/drivers/mfd/lochnagar-i2c.c b/drivers/mfd/lochnagar-i2c.c index 59092f839d6515..0b76fcccd0bda7 100644 --- a/drivers/mfd/lochnagar-i2c.c +++ b/drivers/mfd/lochnagar-i2c.c @@ -15,8 +15,8 @@ #include #include #include +#include #include -#include #include #include @@ -270,7 +270,6 @@ static int lochnagar_i2c_probe(struct i2c_client *i2c) { struct device *dev = &i2c->dev; const struct lochnagar_config *config = NULL; - const struct of_device_id *of_id; struct lochnagar *lochnagar; struct gpio_desc *reset, *present; unsigned int val; @@ -282,11 +281,7 @@ static int lochnagar_i2c_probe(struct i2c_client *i2c) if (!lochnagar) return -ENOMEM; - of_id = of_match_device(lochnagar_of_match, dev); - if (!of_id) - return -EINVAL; - - config = of_id->data; + config = i2c_get_match_data(i2c); lochnagar->dev = dev; mutex_init(&lochnagar->analogue_config_lock); diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c index 1b7f8349911d1b..08c62ddfb4f505 100644 --- a/drivers/mfd/lp87565.c +++ b/drivers/mfd/lp87565.c @@ -6,10 +6,11 @@ */ #include +#include #include #include +#include #include -#include #include #include @@ -46,7 +47,6 @@ MODULE_DEVICE_TABLE(of, of_lp87565_match_table); static int lp87565_probe(struct i2c_client *client) { struct lp87565 *lp87565; - const struct of_device_id *of_id; int ret; unsigned int otpid; @@ -89,10 +89,7 @@ static int lp87565_probe(struct i2c_client *client) } lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID; - - of_id = of_match_device(of_lp87565_match_table, &client->dev); - if (of_id) - lp87565->dev_type = (uintptr_t)of_id->data; + lp87565->dev_type = (uintptr_t)i2c_get_match_data(client); i2c_set_clientdata(client, lp87565); diff --git a/drivers/mfd/max14577.c b/drivers/mfd/max14577.c index 1f4f5002595c0a..8f7472c7600988 100644 --- a/drivers/mfd/max14577.c +++ b/drivers/mfd/max14577.c @@ -9,9 +9,10 @@ // This driver is based on max8997.c #include +#include +#include #include #include -#include #include #include #include @@ -357,7 +358,6 @@ static void max77836_remove(struct max14577 *max14577) static int max14577_i2c_probe(struct i2c_client *i2c) { - const struct i2c_device_id *id = i2c_client_get_device_id(i2c); struct max14577 *max14577; struct max14577_platform_data *pdata = dev_get_platdata(&i2c->dev); struct device_node *np = i2c->dev.of_node; @@ -397,15 +397,7 @@ static int max14577_i2c_probe(struct i2c_client *i2c) return ret; } - if (np) { - const struct of_device_id *of_id; - - of_id = of_match_device(max14577_dt_match, &i2c->dev); - if (of_id) - max14577->dev_type = (uintptr_t)of_id->data; - } else { - max14577->dev_type = id->driver_data; - } + max14577->dev_type = (enum maxim_device_type)i2c_get_match_data(i2c); max14577_print_dev_type(max14577); diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c index 0fe616b2db8e15..7336e6d8a00131 100644 --- a/drivers/mfd/rn5t618.c +++ b/drivers/mfd/rn5t618.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -179,22 +179,15 @@ MODULE_DEVICE_TABLE(of, rn5t618_of_match); static int rn5t618_i2c_probe(struct i2c_client *i2c) { - const struct of_device_id *of_id; struct rn5t618 *priv; int ret; - of_id = of_match_device(rn5t618_of_match, &i2c->dev); - if (!of_id) { - dev_err(&i2c->dev, "Failed to find matching DT ID\n"); - return -EINVAL; - } - priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; i2c_set_clientdata(i2c, priv); - priv->variant = (long)of_id->data; + priv->variant = (long)i2c_get_match_data(i2c); priv->irq = i2c->irq; priv->dev = &i2c->dev; diff --git a/drivers/mfd/wm831x-i2c.c b/drivers/mfd/wm831x-i2c.c index 694ddbbf037287..9bee007f9c99bd 100644 --- a/drivers/mfd/wm831x-i2c.c +++ b/drivers/mfd/wm831x-i2c.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include @@ -23,22 +22,15 @@ static int wm831x_i2c_probe(struct i2c_client *i2c) { - const struct i2c_device_id *id = i2c_client_get_device_id(i2c); struct wm831x_pdata *pdata = dev_get_platdata(&i2c->dev); - const struct of_device_id *of_id; struct wm831x *wm831x; enum wm831x_parent type; int ret; - if (i2c->dev.of_node) { - of_id = of_match_device(wm831x_of_match, &i2c->dev); - if (!of_id) { - dev_err(&i2c->dev, "Failed to match device\n"); - return -ENODEV; - } - type = (uintptr_t)of_id->data; - } else { - type = (enum wm831x_parent)id->driver_data; + type = (uintptr_t)i2c_get_match_data(i2c); + if (!type) { + dev_err(&i2c->dev, "Failed to match device\n"); + return -ENODEV; } wm831x = devm_kzalloc(&i2c->dev, sizeof(struct wm831x), GFP_KERNEL); diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index aba7af6881751a..d5ac066f9db404 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -612,8 +611,6 @@ MODULE_DEVICE_TABLE(of, wm8994_of_match); static int wm8994_i2c_probe(struct i2c_client *i2c) { - const struct i2c_device_id *id = i2c_client_get_device_id(i2c); - const struct of_device_id *of_id; struct wm8994 *wm8994; int ret; @@ -625,13 +622,7 @@ static int wm8994_i2c_probe(struct i2c_client *i2c) wm8994->dev = &i2c->dev; wm8994->irq = i2c->irq; - if (i2c->dev.of_node) { - of_id = of_match_device(wm8994_of_match, &i2c->dev); - if (of_id) - wm8994->type = (uintptr_t)of_id->data; - } else { - wm8994->type = id->driver_data; - } + wm8994->type = (enum wm8994_type)i2c_get_match_data(i2c); wm8994->regmap = devm_regmap_init_i2c(i2c, &wm8994_base_regmap_config); if (IS_ERR(wm8994->regmap)) { From b2dc298600663f1e5846d8bb79fd4b3f86eaf283 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Wed, 18 Oct 2023 06:37:50 +0300 Subject: [PATCH 330/515] fbdev: omapfb: Do not shadow error code from platform_get_irq() There is no point in shadowing the error codes from platform_get_irq(). Refactor omapfb_do_probe() accordingly. Signed-off-by: Andy Shevchenko Signed-off-by: Helge Deller --- drivers/video/fbdev/omap/omapfb_main.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/video/fbdev/omap/omapfb_main.c b/drivers/video/fbdev/omap/omapfb_main.c index 42c96f1cfc93c4..631076bf71f9d8 100644 --- a/drivers/video/fbdev/omap/omapfb_main.c +++ b/drivers/video/fbdev/omap/omapfb_main.c @@ -1643,17 +1643,16 @@ static int omapfb_do_probe(struct platform_device *pdev, r = -ENOMEM; goto cleanup; } - fbdev->int_irq = platform_get_irq(pdev, 0); - if (fbdev->int_irq < 0) { - r = -ENXIO; + + r = platform_get_irq(pdev, 0); + if (r < 0) goto cleanup; - } + fbdev->int_irq = r; - fbdev->ext_irq = platform_get_irq(pdev, 1); - if (fbdev->ext_irq < 0) { - r = -ENXIO; + r = platform_get_irq(pdev, 1); + if (r < 0) goto cleanup; - } + fbdev->ext_irq = r; init_state++; From b8c07d7518956fbd81527afd828866e226a2dd37 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Wed, 18 Oct 2023 06:47:25 +0300 Subject: [PATCH 331/515] fbdev: omapfb: Replace custom memparse() implementation Our library has memparse() for parsing numbers with respective suffixes suitable for memory sizes. Use it instead of custom implementation. Signed-off-by: Andy Shevchenko Signed-off-by: Helge Deller --- drivers/video/fbdev/omap/omapfb_main.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/drivers/video/fbdev/omap/omapfb_main.c b/drivers/video/fbdev/omap/omapfb_main.c index 631076bf71f9d8..694cf6318782bc 100644 --- a/drivers/video/fbdev/omap/omapfb_main.c +++ b/drivers/video/fbdev/omap/omapfb_main.c @@ -1856,20 +1856,13 @@ static int __init omapfb_setup(char *options) if (!strncmp(this_opt, "accel", 5)) def_accel = 1; else if (!strncmp(this_opt, "vram:", 5)) { + unsigned long long vram; char *suffix; - unsigned long vram; - vram = (simple_strtoul(this_opt + 5, &suffix, 0)); + + vram = memparse(this_opt + 5, &suffix); switch (suffix[0]) { case '\0': break; - case 'm': - case 'M': - vram *= 1024; - fallthrough; - case 'k': - case 'K': - vram *= 1024; - break; default: pr_debug("omapfb: invalid vram suffix %c\n", suffix[0]); From 147de49d6ead27fb3d6ac80857b1baffb897cca5 Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Sat, 21 Oct 2023 08:53:37 +0200 Subject: [PATCH 332/515] fbdev: offb: Simplify offb_init_fb() Turn a strcpy()+strncat()+'\0' into an equivalent snprintf(). Signed-off-by: Christophe JAILLET Signed-off-by: Helge Deller --- drivers/video/fbdev/offb.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/video/fbdev/offb.c b/drivers/video/fbdev/offb.c index dcb1b81d35db57..b421b46d88efca 100644 --- a/drivers/video/fbdev/offb.c +++ b/drivers/video/fbdev/offb.c @@ -423,11 +423,9 @@ static void offb_init_fb(struct platform_device *parent, const char *name, fix = &info->fix; var = &info->var; - if (name) { - strcpy(fix->id, "OFfb "); - strncat(fix->id, name, sizeof(fix->id) - sizeof("OFfb ")); - fix->id[sizeof(fix->id) - 1] = '\0'; - } else + if (name) + snprintf(fix->id, sizeof(fix->id), "OFfb %s", name); + else snprintf(fix->id, sizeof(fix->id), "OFfb %pOFn", dp); From c60ad18bbc17c89be471bc73f53c5d0e7a005470 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 17 Oct 2023 20:40:45 +0200 Subject: [PATCH 333/515] parisc: sba-iommu: Fix comment when calculating IOC number Signed-off-by: Helge Deller --- drivers/parisc/sba_iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 05e7103d1d407a..784037837f65e0 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c @@ -2007,7 +2007,7 @@ void * sba_get_iommu(struct parisc_device *pci_hba) struct parisc_device *sba_dev = parisc_parent(pci_hba); struct sba_device *sba = dev_get_drvdata(&sba_dev->dev); char t = sba_dev->id.hw_type; - int iocnum = (pci_hba->hw_path >> 3); /* rope # */ + int iocnum = (pci_hba->hw_path >> 3); /* IOC # */ WARN_ON((t != HPHW_IOA) && (t != HPHW_BCPORT)); From 42b36d35a411081e3ef745a6a00da2e15a558bf3 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 17 Oct 2023 20:45:58 +0200 Subject: [PATCH 334/515] parisc: Add some missing PDC functions and constants Signed-off-by: Helge Deller --- arch/parisc/include/uapi/asm/pdc.h | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/arch/parisc/include/uapi/asm/pdc.h b/arch/parisc/include/uapi/asm/pdc.h index 7a90070136e823..3c723a69393e5b 100644 --- a/arch/parisc/include/uapi/asm/pdc.h +++ b/arch/parisc/include/uapi/asm/pdc.h @@ -58,8 +58,8 @@ #define PDC_MODEL_NVA_SUPPORTED (0 << 4) #define PDC_MODEL_NVA_SLOW (1 << 4) #define PDC_MODEL_NVA_UNSUPPORTED (3 << 4) -#define PDC_MODEL_GET_BOOT__OP 8 /* returns boot test options */ -#define PDC_MODEL_SET_BOOT__OP 9 /* set boot test options */ +#define PDC_MODEL_FIRM_TEST_GET 8 /* returns boot test options */ +#define PDC_MODEL_FIRM_TEST_SET 9 /* set boot test options */ #define PDC_MODEL_GET_PLATFORM_INFO 10 /* returns platform info */ #define PDC_MODEL_GET_INSTALL_KERNEL 11 /* returns kernel for installation */ @@ -609,6 +609,12 @@ struct pdc_system_map_addr_info { /* PDC_SYSTEM_MAP/FIND_ADDRESS */ unsigned long mod_pgs; }; +struct pdc_relocate_info_block { /* PDC_RELOCATE_INFO */ + unsigned long pdc_size; + unsigned long pdc_alignment; + unsigned long pdc_address; +}; + struct pdc_initiator { /* PDC_INITIATOR */ int host_id; int factor; @@ -717,6 +723,23 @@ struct pdc_toc_pim_20 { struct pim_cpu_state_cf cpu_state; }; +/* for SpeedyBoot/firm_ctl funtionality */ +struct pdc_firm_test_get_rtn_block { /* PDC_MODEL/PDC_FIRM_TEST_GET */ + unsigned long current_tests; /* u_R_addr Raddr_ints[0] */ + unsigned long tests_supported; /* u_R_addr Raddr_ints[1] */ + unsigned long default_tests; /* u_R_addr Raddr_ints[2] */ +}; + +#define TORNADO_CPU_ID 0xB +#define PCXL_CPU_ID 0xD +#define PCXU_CPU_ID 0xE /* U and U+ for all but C-class with bug */ +#define VR_CPU_ID 0xF +#define PCXU_PLUS_CPU_ID 0x10 /* U+ only on C-class with bug */ +#define PCXW_CPU_ID 0x11 +#define PCXW_PLUS_CPU_ID 0x12 +#define PIRANHA_CPU_ID 0x13 +#define MAKO_CPU_ID 0x14 + #endif /* !defined(__ASSEMBLY__) */ #endif /* _UAPI_PARISC_PDC_H */ From ee7017adfe2e4b5bae55d9c8be5e8237ed65b74c Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 17 Oct 2023 21:00:11 +0200 Subject: [PATCH 335/515] parisc: Allow building uncompressed Linux kernel Add HAVE_KERNEL_UNCOMPRESSED flag and fix build in boot directory. Signed-off-by: Helge Deller --- arch/parisc/Kconfig | 1 + arch/parisc/boot/Makefile | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index a15ab147af2e07..9288c39dbf3903 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -25,6 +25,7 @@ config PARISC select INIT_ALL_POSSIBLE select BUG select BUILDTIME_TABLE_SORT + select HAVE_KERNEL_UNCOMPRESSED select HAVE_PCI select HAVE_PERF_EVENTS select HAVE_KERNEL_BZIP2 diff --git a/arch/parisc/boot/Makefile b/arch/parisc/boot/Makefile index b873ee4720cace..657f967240ee36 100644 --- a/arch/parisc/boot/Makefile +++ b/arch/parisc/boot/Makefile @@ -10,7 +10,7 @@ subdir- := compressed $(obj)/image: vmlinux FORCE $(call if_changed,objcopy) -$(obj)/bzImage: $(obj)/compressed/vmlinux FORCE +$(obj)/bzImage: $(if $(CONFIG_KERNEL_UNCOMPRESSED),$(objtree)/vmlinux,$(obj)/compressed/vmlinux) FORCE $(call if_changed,objcopy) $(obj)/compressed/vmlinux: FORCE From 3deddb4ce7887af81710d99b8b2ef178a266cab5 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 17 Oct 2023 22:19:53 +0200 Subject: [PATCH 336/515] parisc/power: Add power soft-off when running on qemu Signed-off-by: Helge Deller Cc: stable@vger.kernel.org # v6.0+ --- drivers/parisc/power.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index 6f5e5f0230d399..6ee0717e34eca0 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c @@ -197,6 +197,14 @@ static struct notifier_block parisc_panic_block = { .priority = INT_MAX, }; +/* qemu soft power-off function */ +static int qemu_power_off(struct sys_off_data *data) +{ + /* this turns the system off via SeaBIOS */ + *(int *)data->cb_data = 0; + pdc_soft_power_button(1); + return NOTIFY_DONE; +} static int __init power_init(void) { @@ -226,7 +234,13 @@ static int __init power_init(void) soft_power_reg); } - power_task = kthread_run(kpowerswd, (void*)soft_power_reg, KTHREAD_NAME); + power_task = NULL; + if (running_on_qemu && soft_power_reg) + register_sys_off_handler(SYS_OFF_MODE_POWER_OFF, SYS_OFF_PRIO_DEFAULT, + qemu_power_off, (void *)soft_power_reg); + else + power_task = kthread_run(kpowerswd, (void*)soft_power_reg, + KTHREAD_NAME); if (IS_ERR(power_task)) { printk(KERN_ERR DRIVER_NAME ": thread creation failed. Driver not loaded.\n"); pdc_soft_power_button(0); From 8e5df841f6a72943abf9489d686b4b8c81f55825 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 17 Oct 2023 22:33:30 +0200 Subject: [PATCH 337/515] parisc/power: Trivial whitespace cleanups and license update Signed-off-by: Helge Deller --- drivers/parisc/power.c | 51 +++++++++++------------------------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index 6ee0717e34eca0..539d8920c2029b 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c @@ -1,38 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ /* - * linux/drivers/parisc/power.c - * HP PARISC soft power switch support driver - * - * Copyright (c) 2001-2007 Helge Deller - * All rights reserved. - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL"). - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * HP PARISC soft power switch driver * + * Copyright (c) 2001-2023 Helge Deller * * HINT: * Support of the soft power switch button may be enabled or disabled at * runtime through the "/proc/sys/kernel/power" procfs entry. - */ + */ #include #include @@ -62,12 +37,12 @@ #define MFCPU_X(rDiagReg, t_ch, t_th, code) \ (DIAG_CODE(code) + ((rDiagReg)<<21) + ((t_ch)<<16) + ((t_th)<<0) ) - + #define MTCPU(dr, gr) MFCPU_X(dr, gr, 0, 0x12) /* move value of gr to dr[dr] */ #define MFCPU_C(dr, gr) MFCPU_X(dr, gr, 0, 0x30) /* for dr0 and dr8 only ! */ #define MFCPU_T(dr, gr) MFCPU_X(dr, 0, gr, 0xa0) /* all dr except dr0 and dr8 */ - -#define __getDIAG(dr) ( { \ + +#define __getDIAG(dr) ( { \ register unsigned long __res asm("r28");\ __asm__ __volatile__ ( \ ".word %1" : "=&r" (__res) : "i" (MFCPU_T(dr,28) ) \ @@ -85,7 +60,7 @@ static void process_shutdown(void) printk(KERN_ALERT KTHREAD_NAME ": Shutdown requested...\n"); shutdown_timer++; - + /* wait until the button was pressed for 1 second */ if (shutdown_timer == (POWERSWITCH_DOWN_SEC*POWERSWITCH_POLL_PER_SEC)) { static const char msg[] = "Shutting down..."; @@ -135,7 +110,7 @@ static int kpowerswd(void *param) button_not_pressed = (gsc_readl(soft_power_reg) & 0x1); } else { /* - * On gecko style machines (e.g. 712/xx and 715/xx) + * On gecko style machines (e.g. 712/xx and 715/xx) * the power switch status is stored in Bit 0 ("the highest bit") * of CPU diagnose register 25. * Warning: Some machines never reset the DIAG flag, even if @@ -161,7 +136,7 @@ static int kpowerswd(void *param) /* - * powerfail interruption handler (irq IRQ_FROM_REGION(CPU_IRQ_REGION)+2) + * powerfail interruption handler (irq IRQ_FROM_REGION(CPU_IRQ_REGION)+2) */ #if 0 static void powerfail_interrupt(int code, void *x) @@ -222,14 +197,14 @@ static int __init power_init(void) ret = pdc_soft_power_button(1); if (ret != PDC_OK) soft_power_reg = -1UL; - + switch (soft_power_reg) { case 0: printk(KERN_INFO DRIVER_NAME ": Gecko-style soft power switch enabled.\n"); break; - + case -1UL: printk(KERN_INFO DRIVER_NAME ": Soft power switch support not available.\n"); return -ENODEV; - + default: printk(KERN_INFO DRIVER_NAME ": Soft power switch at 0x%08lx enabled.\n", soft_power_reg); } From f59c804944330667156e238f2e963985d4bd3915 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Wed, 18 Oct 2023 19:47:29 +0200 Subject: [PATCH 338/515] parisc: Move parisc_narrow_firmware variable to header file Signed-off-by: Helge Deller --- arch/parisc/include/asm/processor.h | 1 + arch/parisc/kernel/setup.c | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h index ff6cbdb6903bca..c05d121cf5d0f2 100644 --- a/arch/parisc/include/asm/processor.h +++ b/arch/parisc/include/asm/processor.h @@ -287,6 +287,7 @@ extern int _parisc_requires_coherency; #endif extern int running_on_qemu; +extern int parisc_narrow_firmware; extern void __noreturn toc_intr(struct pt_regs *regs); extern void toc_handler(void); diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 2f434f2da18514..ace483b6f19adc 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c @@ -100,9 +100,6 @@ static void __init dma_ops_init(void) void __init setup_arch(char **cmdline_p) { -#ifdef CONFIG_64BIT - extern int parisc_narrow_firmware; -#endif unwind_init(); init_per_cpu(smp_processor_id()); /* Set Modes & Enable FP */ From 8e7d7158b97144201f15fbb0f5fafc39568430e8 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Wed, 18 Oct 2023 19:52:39 +0200 Subject: [PATCH 339/515] parisc/firmware: Use PDC constants for narrow/wide firmware PDC uses the PDC_MODEL_OS64 and PDC_MODEL_OS32 constants, so use those constants for the internal WIDE_FIRMWARE/NARROW_FIRMWARE too. Signed-off-by: Helge Deller --- arch/parisc/kernel/firmware.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 81078abec521a7..904ca3b9e7a715 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -78,12 +78,12 @@ static unsigned long pdc_result[NUM_PDC_RESULT] __aligned(8); static unsigned long pdc_result2[NUM_PDC_RESULT] __aligned(8); #ifdef CONFIG_64BIT -#define WIDE_FIRMWARE 0x1 -#define NARROW_FIRMWARE 0x2 +#define WIDE_FIRMWARE PDC_MODEL_OS64 +#define NARROW_FIRMWARE PDC_MODEL_OS32 -/* Firmware needs to be initially set to narrow to determine the +/* Firmware needs to be initially set to narrow to determine the * actual firmware width. */ -int parisc_narrow_firmware __ro_after_init = 2; +int parisc_narrow_firmware __ro_after_init = NARROW_FIRMWARE; #endif /* On most currently-supported platforms, IODC I/O calls are 32-bit calls @@ -166,10 +166,10 @@ void set_firmware_width_unlocked(void) if (pdc_result[0] != NARROW_FIRMWARE) parisc_narrow_firmware = 0; } - + /** * set_firmware_width - Determine if the firmware is wide or narrow. - * + * * This function must be called before any pdc_* function that uses the * convert_to_wide function. */ @@ -178,7 +178,7 @@ void set_firmware_width(void) unsigned long flags; /* already initialized? */ - if (parisc_narrow_firmware != 2) + if (parisc_narrow_firmware != NARROW_FIRMWARE) return; spin_lock_irqsave(&pdc_lock, flags); From 0770c4f8488eeb706c48408dd2985d673f6f2085 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Wed, 18 Oct 2023 19:24:14 +0200 Subject: [PATCH 340/515] parisc/agp: Use 64-bit LE values in SBA IOMMU PDIR table The PDIR table of the System Bus Adapter (SBA) I/O MMU uses 64-bit little-endian pointers. Signed-off-by: Helge Deller Cc: stable@vger.kernel.org # v6.4+ --- drivers/char/agp/parisc-agp.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c index c6f181702b9a7b..edbc4d33811776 100644 --- a/drivers/char/agp/parisc-agp.c +++ b/drivers/char/agp/parisc-agp.c @@ -38,7 +38,7 @@ static struct _parisc_agp_info { int lba_cap_offset; - u64 *gatt; + __le64 *gatt; u64 gatt_entries; u64 gart_base; @@ -104,7 +104,7 @@ parisc_agp_create_gatt_table(struct agp_bridge_data *bridge) int i; for (i = 0; i < info->gatt_entries; i++) { - info->gatt[i] = (unsigned long)agp_bridge->scratch_page; + info->gatt[i] = cpu_to_le64(agp_bridge->scratch_page); } return 0; @@ -158,9 +158,9 @@ parisc_agp_insert_memory(struct agp_memory *mem, off_t pg_start, int type) for (k = 0; k < info->io_pages_per_kpage; k++, j++, paddr += info->io_page_size) { - info->gatt[j] = + info->gatt[j] = cpu_to_le64( parisc_agp_mask_memory(agp_bridge, - paddr, type); + paddr, type)); asm_io_fdc(&info->gatt[j]); } } @@ -184,7 +184,7 @@ parisc_agp_remove_memory(struct agp_memory *mem, off_t pg_start, int type) io_pg_start = info->io_pages_per_kpage * pg_start; io_pg_count = info->io_pages_per_kpage * mem->page_count; for (i = io_pg_start; i < io_pg_count + io_pg_start; i++) { - info->gatt[i] = agp_bridge->scratch_page; + info->gatt[i] = cpu_to_le64(agp_bridge->scratch_page); } agp_bridge->driver->tlb_flush(mem); @@ -204,7 +204,8 @@ parisc_agp_mask_memory(struct agp_bridge_data *bridge, dma_addr_t addr, pa |= (ci >> PAGE_SHIFT) & 0xff;/* move CI (8 bits) into lowest byte */ pa |= SBA_PDIR_VALID_BIT; /* set "valid" bit */ - return cpu_to_le64(pa); + /* return native (big-endian) PDIR entry */ + return pa; } static void @@ -251,7 +252,8 @@ static int __init agp_ioc_init(void __iomem *ioc_regs) { struct _parisc_agp_info *info = &parisc_agp_info; - u64 iova_base, *io_pdir, io_tlb_ps; + u64 iova_base, io_tlb_ps; + __le64 *io_pdir; int io_tlb_shift; printk(KERN_INFO DRVPFX "IO PDIR shared with sba_iommu\n"); From a58d81b2cb5c75179e8691ae1d662f1504352070 Mon Sep 17 00:00:00 2001 From: "Russell King (Oracle)" Date: Fri, 20 Oct 2023 15:45:30 +0100 Subject: [PATCH 341/515] parisc: simplify smp_prepare_boot_cpu() smp_prepare_boot_cpu() reads the cpuid of the first CPU, printing a message to state which processor booted, and setting it online and present. This cpuid is retrieved from per_cpu(cpu_data, 0).cpuid, which is initialised in arch/parisc/kernel/processor.c:processor_probe() thusly: p = &per_cpu(cpu_data, cpuid); ... p->cpuid = cpuid; /* save CPU id */ Consequently, the cpuid retrieved seems to be guaranteed to also be zero, meaning that the message printed in this boils down to: pr_info("SMP: bootstrap CPU ID is 0\n"); Moreover, since kernel/cpu.c::boot_cpu_init() already sets CPU 0 to be present and online, there is no need to do this again in smp_prepare_boot_cpu(). Remove this code, and simplify the printk(). Signed-off-by: Russell King (Oracle) Signed-off-by: Helge Deller --- arch/parisc/kernel/smp.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 2019c1f04bd037..444154271f2370 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -404,13 +404,7 @@ static int smp_boot_one_cpu(int cpuid, struct task_struct *idle) void __init smp_prepare_boot_cpu(void) { - int bootstrap_processor = per_cpu(cpu_data, 0).cpuid; - - /* Setup BSP mappings */ - printk(KERN_INFO "SMP: bootstrap CPU ID is %d\n", bootstrap_processor); - - set_cpu_online(bootstrap_processor, true); - set_cpu_present(bootstrap_processor, true); + pr_info("SMP: bootstrap CPU ID is 0\n"); } From 5db52525bcbeb229096aab1ef4a40834dc2da0ea Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Wed, 18 Oct 2023 20:28:33 +0200 Subject: [PATCH 342/515] drm/radeon: Add flushing code for parisc architecture This adds the necessary flushing code to allow using a Radeon RV280 PCI card on a C8000 PA-RISC workstation. Signed-off-by: Helge Deller Cc: stable@vger.kernel.org --- drivers/gpu/drm/drm_cache.c | 2 ++ drivers/gpu/drm/radeon/r100.c | 6 ++++++ drivers/gpu/drm/radeon/radeon_ring.c | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/drivers/gpu/drm/drm_cache.c b/drivers/gpu/drm/drm_cache.c index 7051c9c909c280..a84eba2fb42927 100644 --- a/drivers/gpu/drm/drm_cache.c +++ b/drivers/gpu/drm/drm_cache.c @@ -174,6 +174,8 @@ drm_clflush_virt_range(void *addr, unsigned long length) if (wbinvd_on_all_cpus()) pr_err("Timed out waiting for cache flush\n"); +#elif defined(CONFIG_PARISC) + flush_kernel_dcache_range((unsigned long) addr, length); #else WARN_ONCE(1, "Architecture has no drm_cache.c support\n"); #endif diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index affa9e0309b274..f9941b93c276c7 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c @@ -642,6 +642,12 @@ void r100_hpd_fini(struct radeon_device *rdev) */ void r100_pci_gart_tlb_flush(struct radeon_device *rdev) { +#if defined(CONFIG_PARISC) + /* flush gtt[] gart table entries from r100_pci_gart_set_page() */ + dma_sync_single_for_device(&rdev->pdev->dev, rdev->gart.table_addr, + rdev->gart.table_size, DMA_TO_DEVICE); +#endif + /* TODO: can we do somethings here ? */ /* It seems hw only cache one entry so we should discard this * entry otherwise if first GPU GART read hit this entry it diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index e6534fa9f1fb54..645c466bd8c669 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -29,6 +29,7 @@ #include #include +#include #include "radeon.h" @@ -177,6 +178,10 @@ void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *ring, radeon_ring_write(ring, ring->nop); } mb(); + if (IS_ENABLED(CONFIG_PARISC)) + drm_clflush_virt_range((void *)&ring->ring[0], + ring->wptr * sizeof(uint32_t)); + /* If we are emitting the HDP flush via MMIO, we need to do it after * all CPU writes to VRAM finished. */ From 946a10e08b55c5e3a72d62935ef944bee564094c Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Fri, 20 Oct 2023 20:49:07 +0000 Subject: [PATCH 343/515] parisc: Add nop instructions after TLB inserts An excerpt from the PA8800 ERS states: * The PA8800 violates the seven instruction pipeline rule when performing TLB inserts or PxTLBE instructions with the PSW C bit on. The instruction will take effect by the 12th instruction after the insert or purge. I believe we have a problem with handling TLB misses. We don't fill the pipeline following TLB inserts. As a result, we likely fault again after returning from the interruption. The above statement indicates that we need at least seven instructions after the insert on pre PA8800 processors and we need 12 instructions on PA8800/PA8900 processors. Here we add macros and code to provide the required number instructions after a TLB insert. Signed-off-by: John David Anglin Suggested-by: Helge Deller Cc: stable@vger.kernel.org Signed-off-by: Helge Deller --- arch/parisc/kernel/entry.S | 81 ++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index ae03b8679696e7..cab1ec23e0d7a8 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S @@ -36,6 +36,24 @@ .level 2.0 #endif +/* + * We need seven instructions after a TLB insert for it to take effect. + * The PA8800/PA8900 processors are an exception and need 12 instructions. + * The RFI changes both IAOQ_Back and IAOQ_Front, so it counts as one. + */ +#ifdef CONFIG_64BIT +#define NUM_PIPELINE_INSNS 12 +#else +#define NUM_PIPELINE_INSNS 7 +#endif + + /* Insert num nops */ + .macro insert_nops num + .rept \num + nop + .endr + .endm + /* Get aligned page_table_lock address for this mm from cr28/tr4 */ .macro get_ptl reg mfctl %cr28,\reg @@ -415,24 +433,20 @@ 3: .endm - /* Release page_table_lock without reloading lock address. - We use an ordered store to ensure all prior accesses are - performed prior to releasing the lock. */ - .macro ptl_unlock0 spc,tmp,tmp2 + /* Release page_table_lock if for user space. We use an ordered + store to ensure all prior accesses are performed prior to + releasing the lock. Note stw may not be executed, so we + provide one extra nop when CONFIG_TLB_PTLOCK is defined. */ + .macro ptl_unlock spc,tmp,tmp2 #ifdef CONFIG_TLB_PTLOCK -98: ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2 +98: get_ptl \tmp + ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2 or,COND(=) %r0,\spc,%r0 stw,ma \tmp2,0(\tmp) 99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) -#endif - .endm - - /* Release page_table_lock. */ - .macro ptl_unlock1 spc,tmp,tmp2 -#ifdef CONFIG_TLB_PTLOCK -98: get_ptl \tmp - ptl_unlock0 \spc,\tmp,\tmp2 -99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) + insert_nops NUM_PIPELINE_INSNS - 4 +#else + insert_nops NUM_PIPELINE_INSNS - 1 #endif .endm @@ -1124,7 +1138,7 @@ dtlb_miss_20w: idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1133,6 +1147,7 @@ dtlb_check_alias_20w: idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1150,7 +1165,7 @@ nadtlb_miss_20w: idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1159,6 +1174,7 @@ nadtlb_check_alias_20w: idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1184,7 +1200,7 @@ dtlb_miss_11: mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1194,6 +1210,7 @@ dtlb_check_alias_11: idtlba pte,(va) idtlbp prot,(va) + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1217,7 +1234,7 @@ nadtlb_miss_11: mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1227,6 +1244,7 @@ nadtlb_check_alias_11: idtlba pte,(va) idtlbp prot,(va) + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1246,7 +1264,7 @@ dtlb_miss_20: idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1255,6 +1273,7 @@ dtlb_check_alias_20: idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1274,7 +1293,7 @@ nadtlb_miss_20: idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1283,6 +1302,7 @@ nadtlb_check_alias_20: idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1319,7 +1339,7 @@ itlb_miss_20w: iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1343,7 +1363,7 @@ naitlb_miss_20w: iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1352,6 +1372,7 @@ naitlb_check_alias_20w: iitlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1377,7 +1398,7 @@ itlb_miss_11: mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1401,7 +1422,7 @@ naitlb_miss_11: mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1411,6 +1432,7 @@ naitlb_check_alias_11: iitlba pte,(%sr0, va) iitlbp prot,(%sr0, va) + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1431,7 +1453,7 @@ itlb_miss_20: iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1451,7 +1473,7 @@ naitlb_miss_20: iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1460,6 +1482,7 @@ naitlb_check_alias_20: iitlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1481,7 +1504,7 @@ dbit_trap_20w: idtlbt pte,prot - ptl_unlock0 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop #else @@ -1507,7 +1530,7 @@ dbit_trap_11: mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock0 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1527,7 +1550,7 @@ dbit_trap_20: idtlbt pte,prot - ptl_unlock0 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop #endif From fd58345b97a0c92742f05fca8ee9c78b9ff2fd29 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Sun, 22 Oct 2023 11:48:11 +0200 Subject: [PATCH 344/515] parisc/pdc: Add width field to struct pdc_model PDC2.0 specifies the additional PSW-bit field. Signed-off-by: Helge Deller Cc: stable@vger.kernel.org --- arch/parisc/include/uapi/asm/pdc.h | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/parisc/include/uapi/asm/pdc.h b/arch/parisc/include/uapi/asm/pdc.h index 3c723a69393e5b..dff7b4e0d049a3 100644 --- a/arch/parisc/include/uapi/asm/pdc.h +++ b/arch/parisc/include/uapi/asm/pdc.h @@ -472,6 +472,7 @@ struct pdc_model { /* for PDC_MODEL */ unsigned long arch_rev; unsigned long pot_key; unsigned long curr_key; + unsigned long width; /* default of PSW_W bit (1=enabled) */ }; struct pdc_cache_cf { /* for PDC_CACHE (I/D-caches) */ From 1d11b153d23b5fd131d4ea125ff23c9e8ebc98ab Mon Sep 17 00:00:00 2001 From: Zhiquan Li Date: Mon, 23 Oct 2023 12:22:37 +0800 Subject: [PATCH 345/515] x86/mce: Mark fatal MCE's page as poison to avoid panic in the kdump kernel Memory errors don't happen very often, especially fatal ones. However, in large-scale scenarios such as data centers, that probability increases with the amount of machines present. When a fatal machine check happens, mce_panic() is called based on the severity grading of that error. The page containing the error is not marked as poison. However, when kexec is enabled, tools like makedumpfile understand when pages are marked as poison and do not touch them so as not to cause a fatal machine check exception again while dumping the previous kernel's memory. Therefore, mark the page containing the error as poisoned so that the kexec'ed kernel can avoid accessing the page. [ bp: Rewrite commit message and comment. ] Co-developed-by: Youquan Song Signed-off-by: Youquan Song Signed-off-by: Zhiquan Li Signed-off-by: Borislav Petkov (AMD) Reviewed-by: Naoya Horiguchi Link: https://lore.kernel.org/r/20231014051754.3759099-1-zhiquan1.li@intel.com --- arch/x86/kernel/cpu/mce/core.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c index 0214d4232346b9..a25e69277e8308 100644 --- a/arch/x86/kernel/cpu/mce/core.c +++ b/arch/x86/kernel/cpu/mce/core.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -233,6 +234,7 @@ static noinstr void mce_panic(const char *msg, struct mce *final, char *exp) struct llist_node *pending; struct mce_evt_llist *l; int apei_err = 0; + struct page *p; /* * Allow instrumentation around external facilities usage. Not that it @@ -286,6 +288,18 @@ static noinstr void mce_panic(const char *msg, struct mce *final, char *exp) if (!fake_panic) { if (panic_timeout == 0) panic_timeout = mca_cfg.panic_timeout; + + /* + * Kdump skips the poisoned page in order to avoid + * touching the error bits again. Poison the page even + * if the error is fatal and the machine is about to + * panic. + */ + if (kexec_crash_loaded()) { + p = pfn_to_online_page(final->addr >> PAGE_SHIFT); + if (final && (final->status & MCI_STATUS_ADDRV) && p) + SetPageHWPoison(p); + } panic(msg); } else pr_emerg(HW_ERR "Fake kernel panic: %s\n", msg); From 4282a6da4d8c11d6bfff004033dd5ee698b97614 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 20 Oct 2023 22:02:04 +0200 Subject: [PATCH 346/515] gfs2: Clean up gfs2_alloc_parms initializers When intializing a struct, all fields that are not explicitly mentioned are zeroed out already. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/file.c | 4 ++-- fs/gfs2/quota.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 5bc103b031e291..4b66efc1a82aa1 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -418,7 +418,7 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf) struct inode *inode = file_inode(vmf->vma->vm_file); struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_sbd *sdp = GFS2_SB(inode); - struct gfs2_alloc_parms ap = { .aflags = 0, }; + struct gfs2_alloc_parms ap = {}; u64 offset = page_offset(page); unsigned int data_blocks, ind_blocks, rblocks; vm_fault_t ret = VM_FAULT_LOCKED; @@ -1251,7 +1251,7 @@ static long __gfs2_fallocate(struct file *file, int mode, loff_t offset, loff_t struct inode *inode = file_inode(file); struct gfs2_sbd *sdp = GFS2_SB(inode); struct gfs2_inode *ip = GFS2_I(inode); - struct gfs2_alloc_parms ap = { .aflags = 0, }; + struct gfs2_alloc_parms ap = {}; unsigned int data_blocks = 0, ind_blocks = 0, rblocks; loff_t bytes, max_bytes, max_blks; int error; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index d0d01d4856215f..27f14ef4d346ad 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -909,7 +909,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) { struct gfs2_sbd *sdp = (*qda)->qd_sbd; struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode); - struct gfs2_alloc_parms ap = { .aflags = 0, }; + struct gfs2_alloc_parms ap = {}; unsigned int data_blocks, ind_blocks; struct gfs2_holder *ghs, i_gh; unsigned int qx, x; @@ -1741,7 +1741,7 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, if (gfs2_is_stuffed(ip)) alloc_required = 1; if (alloc_required) { - struct gfs2_alloc_parms ap = { .aflags = 0, }; + struct gfs2_alloc_parms ap = {}; gfs2_write_calc_reserv(ip, sizeof(struct gfs2_quota), &data_blocks, &ind_blocks); blocks = 1 + data_blocks + ind_blocks; From b653d916139330ffc940c43a4adcc1eb4d913f81 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 20 Oct 2023 21:02:59 +0200 Subject: [PATCH 347/515] gfs2: Clean up quota.c:print_message Function print_message() in quota.c doesn't return a meaningful return value. Turn it into a void function and stop abusing it for setting variable error to 0 in gfs2_quota_check(). Signed-off-by: Andreas Gruenbacher --- fs/gfs2/quota.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 27f14ef4d346ad..e72b5864a63ab6 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -1190,17 +1190,16 @@ void gfs2_quota_unlock(struct gfs2_inode *ip) #define MAX_LINE 256 -static int print_message(struct gfs2_quota_data *qd, char *type) +static void print_message(struct gfs2_quota_data *qd, char *type) { struct gfs2_sbd *sdp = qd->qd_sbd; - if (sdp->sd_args.ar_quota != GFS2_QUOTA_QUIET) + if (sdp->sd_args.ar_quota != GFS2_QUOTA_QUIET) { fs_info(sdp, "quota %s for %s %u\n", type, (qd->qd_id.type == USRQUOTA) ? "user" : "group", from_kqid(&init_user_ns, qd->qd_id)); - - return 0; + } } /** @@ -1270,7 +1269,8 @@ int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid, * HZ)) { quota_send_warning(qd->qd_id, sdp->sd_vfs->s_dev, QUOTA_NL_BSOFTWARN); - error = print_message(qd, "warning"); + print_message(qd, "warning"); + error = 0; qd->qd_last_warn = jiffies; } } From 26c239e3dafe8cce2dcc443fc17226c7454dc155 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 20 Oct 2023 01:32:15 +0200 Subject: [PATCH 348/515] gfs2: Add metapath_dibh helper Add a metapath_dibh() helper for extracting the inode's buffer head from a metapath. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/bmap.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 47d0f39feeb1fd..240f73e402d028 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -317,6 +317,12 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl, __be64 *start, __be64 *end) } } +static inline struct buffer_head * +metapath_dibh(struct metapath *mp) +{ + return mp->mp_bh[0]; +} + static int __fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, unsigned int x, unsigned int h) { @@ -659,7 +665,7 @@ static int __gfs2_iomap_alloc(struct inode *inode, struct iomap *iomap, { struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_sbd *sdp = GFS2_SB(inode); - struct buffer_head *dibh = mp->mp_bh[0]; + struct buffer_head *dibh = metapath_dibh(mp); u64 bn; unsigned n, i, blks, alloced = 0, iblks = 0, branch_start = 0; size_t dblks = iomap->length >> inode->i_blkbits; From 34abc0252d1923cdf82c2352409df490253c8814 Mon Sep 17 00:00:00 2001 From: Sebastian Reichel Date: Mon, 23 Oct 2023 15:12:20 +0200 Subject: [PATCH 349/515] dt-bindings: mfd: max8925: Convert to DT schema format Convert the binding to DT schema format. The sub-functions of this MFD device do not have their own compatible string and are thus described directly in the MFD binding document after being converted to YAML. Signed-off-by: Sebastian Reichel Reviewed-by: Rob Herring Link: https://lore.kernel.org/r/20231023131409.1796451-1-sebastian.reichel@collabora.com Signed-off-by: Lee Jones --- .../leds/backlight/max8925-backlight.txt | 10 -- .../devicetree/bindings/mfd/max8925.txt | 64 -------- .../bindings/mfd/maxim,max8925.yaml | 145 ++++++++++++++++++ .../bindings/power/supply/max8925_battery.txt | 18 --- 4 files changed, 145 insertions(+), 92 deletions(-) delete mode 100644 Documentation/devicetree/bindings/leds/backlight/max8925-backlight.txt delete mode 100644 Documentation/devicetree/bindings/mfd/max8925.txt create mode 100644 Documentation/devicetree/bindings/mfd/maxim,max8925.yaml delete mode 100644 Documentation/devicetree/bindings/power/supply/max8925_battery.txt diff --git a/Documentation/devicetree/bindings/leds/backlight/max8925-backlight.txt b/Documentation/devicetree/bindings/leds/backlight/max8925-backlight.txt deleted file mode 100644 index b4cffdaa41377a..00000000000000 --- a/Documentation/devicetree/bindings/leds/backlight/max8925-backlight.txt +++ /dev/null @@ -1,10 +0,0 @@ -88pm860x-backlight bindings - -Optional properties: - - maxim,max8925-dual-string: whether support dual string - -Example: - - backlights { - maxim,max8925-dual-string = <0>; - }; diff --git a/Documentation/devicetree/bindings/mfd/max8925.txt b/Documentation/devicetree/bindings/mfd/max8925.txt deleted file mode 100644 index 4f0dc6638e5e19..00000000000000 --- a/Documentation/devicetree/bindings/mfd/max8925.txt +++ /dev/null @@ -1,64 +0,0 @@ -* Maxim max8925 Power Management IC - -Required parent device properties: -- compatible : "maxim,max8925" -- reg : the I2C slave address for the max8925 chip -- interrupts : IRQ line for the max8925 chip -- interrupt-controller: describes the max8925 as an interrupt - controller (has its own domain) -- #interrupt-cells : should be 1. - - The cell is the max8925 local IRQ number - -Optional parent device properties: -- maxim,tsc-irq: there are 2 IRQ lines for max8925, one is indicated in - interrupts property, the other is indicated here. - -max8925 consists of a large and varied group of sub-devices: - -Device Supply Names Description ------- ------------ ----------- -max8925-onkey : : On key -max8925-rtc : : RTC -max8925-regulator : : Regulators -max8925-backlight : : Backlight -max8925-touch : : Touchscreen -max8925-power : : Charger - -Example: - - pmic: max8925@3c { - compatible = "maxim,max8925"; - reg = <0x3c>; - interrupts = <1>; - interrupt-parent = <&intcmux4>; - interrupt-controller; - #interrupt-cells = <1>; - maxim,tsc-irq = <0>; - - regulators { - SDV1 { - regulator-min-microvolt = <637500>; - regulator-max-microvolt = <1425000>; - regulator-boot-on; - regulator-always-on; - }; - - LDO1 { - regulator-min-microvolt = <750000>; - regulator-max-microvolt = <3900000>; - regulator-boot-on; - regulator-always-on; - }; - - }; - backlight { - maxim,max8925-dual-string = <0>; - }; - charger { - batt-detect = <0>; - topoff-threshold = <1>; - fast-charge = <7>; - no-temp-support = <0>; - no-insert-detect = <0>; - }; - }; diff --git a/Documentation/devicetree/bindings/mfd/maxim,max8925.yaml b/Documentation/devicetree/bindings/mfd/maxim,max8925.yaml new file mode 100644 index 00000000000000..86dd810851ab54 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/maxim,max8925.yaml @@ -0,0 +1,145 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/maxim,max8925.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: MAX8925 PMIC from Maxim Integrated. + +maintainers: + - Lee Jones + +properties: + compatible: + const: maxim,max8925 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + interrupt-controller: true + + "#interrupt-cells": + const: 1 + description: + The cell is the IRQ number + + maxim,tsc-irq: + description: second interrupt from max8925 + $ref: /schemas/types.yaml#/definitions/uint32 + + regulators: + type: object + + patternProperties: + "^SDV[1-3]$|^LDO[1-9]$|^LDO1[0-9]$|^LDO20$": + description: regulator configuration for SDV1-3 and LDO1-20 + $ref: /schemas/regulator/regulator.yaml + unevaluatedProperties: false + + additionalProperties: false + + backlight: + type: object + properties: + maxim,max8925-dual-string: + description: set to 1 to support dual string + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1] + default: 0 + + additionalProperties: false + + charger: + type: object + properties: + batt-detect: + description: set to 1 if battery detection via ID pin is supported + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1] + default: 0 + + topoff-threshold: + description: charging current in topoff mode, configures bits 5-6 in CHG_CNTL1 + $ref: /schemas/types.yaml#/definitions/uint32 + minimum: 0 + maximum: 3 + default: 0 + + fast-charge: + description: set charging current in fast mode, configures bits 0-3 in CHG_CNTL1 + $ref: /schemas/types.yaml#/definitions/uint32 + minimum: 0 + maximum: 7 + default: 0 + + no-temp-support: + description: set to 1 if temperature sensing is not supported + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1] + default: 0 + + no-insert-detect: + description: set to 1 if AC detection is not supported + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1] + default: 0 + + additionalProperties: false + +required: + - compatible + - reg + - interrupts + - interrupt-controller + - "#interrupt-cells" + - regulators + +additionalProperties: false + +examples: + - | + i2c { + #address-cells = <1>; + #size-cells = <0>; + + pmic@3c { + compatible = "maxim,max8925"; + reg = <0x3c>; + interrupts = <1>; + interrupt-parent = <&intcmux4>; + interrupt-controller; + #interrupt-cells = <1>; + maxim,tsc-irq = <0>; + + regulators { + SDV1 { + regulator-min-microvolt = <637500>; + regulator-max-microvolt = <1425000>; + regulator-boot-on; + regulator-always-on; + }; + + LDO1 { + regulator-min-microvolt = <750000>; + regulator-max-microvolt = <3900000>; + regulator-boot-on; + regulator-always-on; + }; + }; + + backlight { + maxim,max8925-dual-string = <0>; + }; + + charger { + batt-detect = <0>; + topoff-threshold = <1>; + fast-charge = <7>; + no-temp-support = <0>; + no-insert-detect = <0>; + }; + }; + }; diff --git a/Documentation/devicetree/bindings/power/supply/max8925_battery.txt b/Documentation/devicetree/bindings/power/supply/max8925_battery.txt deleted file mode 100644 index d7e3e0c0f71d88..00000000000000 --- a/Documentation/devicetree/bindings/power/supply/max8925_battery.txt +++ /dev/null @@ -1,18 +0,0 @@ -max8925-battery bindings -~~~~~~~~~~~~~~~~ - -Optional properties : - - batt-detect: whether support battery detect - - topoff-threshold: set charging current in topoff mode - - fast-charge: set charging current in fast mode - - no-temp-support: whether support temperature protection detect - - no-insert-detect: whether support insert detect - -Example: - charger { - batt-detect = <0>; - topoff-threshold = <1>; - fast-charge = <7>; - no-temp-support = <0>; - no-insert-detect = <0>; - }; From 81c940395b14e75f35fff2b6d72ec39e028ca92c Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:12 +0800 Subject: [PATCH 350/515] KVM: x86: Consolidate flags for __linearize() Consolidate @write and @fetch of __linearize() into a set of flags so that additional flags can be added without needing more/new boolean parameters, to precisely identify the access type. No functional change intended. Signed-off-by: Binbin Wu Reviewed-by: Chao Gao Acked-by: Kai Huang Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-2-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/emulate.c | 21 +++++++++++---------- arch/x86/kvm/kvm_emulate.h | 4 ++++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 2673cd5c46cb48..87ee1802166a2c 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -687,8 +687,8 @@ static unsigned insn_alignment(struct x86_emulate_ctxt *ctxt, unsigned size) static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, struct segmented_address addr, unsigned *max_size, unsigned size, - bool write, bool fetch, - enum x86emul_mode mode, ulong *linear) + enum x86emul_mode mode, ulong *linear, + unsigned int flags) { struct desc_struct desc; bool usable; @@ -717,11 +717,11 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, if (!usable) goto bad; /* code segment in protected mode or read-only data segment */ - if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8)) - || !(desc.type & 2)) && write) + if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8)) || !(desc.type & 2)) && + (flags & X86EMUL_F_WRITE)) goto bad; /* unreadable code segment */ - if (!fetch && (desc.type & 8) && !(desc.type & 2)) + if (!(flags & X86EMUL_F_FETCH) && (desc.type & 8) && !(desc.type & 2)) goto bad; lim = desc_limit_scaled(&desc); if (!(desc.type & 8) && (desc.type & 4)) { @@ -757,8 +757,8 @@ static int linearize(struct x86_emulate_ctxt *ctxt, ulong *linear) { unsigned max_size; - return __linearize(ctxt, addr, &max_size, size, write, false, - ctxt->mode, linear); + return __linearize(ctxt, addr, &max_size, size, ctxt->mode, linear, + write ? X86EMUL_F_WRITE : 0); } static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst) @@ -771,7 +771,8 @@ static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst) if (ctxt->op_bytes != sizeof(unsigned long)) addr.ea = dst & ((1UL << (ctxt->op_bytes << 3)) - 1); - rc = __linearize(ctxt, addr, &max_size, 1, false, true, ctxt->mode, &linear); + rc = __linearize(ctxt, addr, &max_size, 1, ctxt->mode, &linear, + X86EMUL_F_FETCH); if (rc == X86EMUL_CONTINUE) ctxt->_eip = addr.ea; return rc; @@ -907,8 +908,8 @@ static int __do_insn_fetch_bytes(struct x86_emulate_ctxt *ctxt, int op_size) * boundary check itself. Instead, we use max_size to check * against op_size. */ - rc = __linearize(ctxt, addr, &max_size, 0, false, true, ctxt->mode, - &linear); + rc = __linearize(ctxt, addr, &max_size, 0, ctxt->mode, &linear, + X86EMUL_F_FETCH); if (unlikely(rc != X86EMUL_CONTINUE)) return rc; diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h index be7aeb9b8ea3b1..e24c8ac7b9304c 100644 --- a/arch/x86/kvm/kvm_emulate.h +++ b/arch/x86/kvm/kvm_emulate.h @@ -88,6 +88,10 @@ struct x86_instruction_info { #define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */ #define X86EMUL_INTERCEPTED 6 /* Intercepted by nested VMCB/VMCS */ +/* x86-specific emulation flags */ +#define X86EMUL_F_WRITE BIT(0) +#define X86EMUL_F_FETCH BIT(1) + struct x86_emulate_ops { void (*vm_bugged)(struct x86_emulate_ctxt *ctxt); /* From 09bf42f3fe4eefe9ca1bf43789ddbe788f23b33f Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Mon, 23 Oct 2023 20:38:08 +0200 Subject: [PATCH 351/515] parisc: Show default CPU PSW.W setting as reported by PDC The last word shows the default PSW.W setting. Signed-off-by: Helge Deller --- arch/parisc/kernel/processor.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index 1fc89fa2c2d214..29e2750f86a410 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c @@ -242,9 +242,9 @@ void __init collect_boot_cpu_data(void) /* get CPU-Model Information... */ #define p ((unsigned long *)&boot_cpu_data.pdc.model) if (pdc_model_info(&boot_cpu_data.pdc.model) == PDC_OK) { - printk(KERN_INFO - "model %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8]); + printk(KERN_INFO + "model %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", + p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]); add_device_randomness(&boot_cpu_data.pdc.model, sizeof(boot_cpu_data.pdc.model)); From 7b78a3c9d50e5a0f0fe95352bec3a0f178440c9a Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Mon, 23 Oct 2023 21:25:13 +0200 Subject: [PATCH 352/515] soc: document merges Signed-off-by: Arnd Bergmann --- arch/arm/arm-soc-for-next-contents.txt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/arch/arm/arm-soc-for-next-contents.txt b/arch/arm/arm-soc-for-next-contents.txt index e761342312d98f..1b0b597e31cde8 100644 --- a/arch/arm/arm-soc-for-next-contents.txt +++ b/arch/arm/arm-soc-for-next-contents.txt @@ -21,8 +21,7 @@ soc/dt https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt tags/dt-cleanup-6.7 samsung/dt64 https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt64-6.7 - exynos/dt -samsung/dt + samsung/dt https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt-6.7 ixp4xx/dt git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik tags/ixp4xx-for-soc-v6.7 @@ -70,6 +69,18 @@ samsung/dt git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts64-1 rockchip/dt git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts32-1 + mediatek/dts64-2 + https://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux tags/v6.6-next-dts64.3 + (56bc311585206a8955de793301d4f84fb4ad2ee6) + https://git.kernel.org/pub/scm/linux/kernel/git/ti/linux tags/ti-k3-dt-for-v6.7 + marvell/dts + git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu tags/mvebu-dt64-6.7-1 + patch + arm64: dts: Update cache properties for socionext + riscv: dts: thead: convert isa detection to new properties + arm64: dts: socionext: add missing cache properties + (23e4a49943624dd83199989c852565a3ff760fa7) + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt64-6.7-2 soc/drivers patch @@ -102,6 +113,8 @@ soc/drivers https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-soc-for-v6.7 qcom/drivers https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-drivers-for-6.7 + rockchips/drivers + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-drivers1 soc/defconfig patch @@ -138,4 +151,6 @@ arm/fixes git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.6-rockchip-dtsfixes1 omap/fixes git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap tags/omap-fixes-audio-clock-and-modem-signed + (1122a9c2ebe02435014a0f40dcc50f4333286f0f) + git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu tags/mvebu-fixes-6.6-1 From 90532843aebfd3d2143420b5d66ffe0ab96816b9 Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:14 +0800 Subject: [PATCH 353/515] KVM: x86: Add an emulation flag for implicit system access Add an emulation flag X86EMUL_F_IMPLICIT to identify implicit system access in instruction emulation. Don't bother wiring up any usage at this point, as Linear Address Space Separation (LASS) will be the first "real" consumer of the flag and LASS support will require dedicated hooks, i.e. there aren't any existing calls where passing X86EMUL_F_IMPLICIT is meaningful. Add the IMPLICIT flag even though there's no imminent usage so that Linear Address Masking (LAM) support can reference the flag to document that addresses for implicit accesses aren't untagged. Signed-off-by: Binbin Wu Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-4-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/kvm_emulate.h | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h index e24c8ac7b9304c..65fc7ef5ca3da0 100644 --- a/arch/x86/kvm/kvm_emulate.h +++ b/arch/x86/kvm/kvm_emulate.h @@ -91,6 +91,7 @@ struct x86_instruction_info { /* x86-specific emulation flags */ #define X86EMUL_F_WRITE BIT(0) #define X86EMUL_F_FETCH BIT(1) +#define X86EMUL_F_IMPLICIT BIT(2) struct x86_emulate_ops { void (*vm_bugged)(struct x86_emulate_ctxt *ctxt); From 34b4ed7c1eaf78d88dcbb9a64afab47062e103be Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:15 +0800 Subject: [PATCH 354/515] KVM: x86: Add X86EMUL_F_INVLPG and pass it in em_invlpg() Add an emulation flag X86EMUL_F_INVLPG, which is used to identify an instruction that does TLB invalidation without true memory access. Only invlpg & invlpga implemented in emulator belong to this kind. invlpga doesn't need additional information for emulation. Just pass the flag to em_invlpg(). Linear Address Masking (LAM) and Linear Address Space Separation (LASS) don't apply to addresses that are inputs to TLB invalidation. The flag will be consumed to support LAM/LASS virtualization. Signed-off-by: Binbin Wu Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-5-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/emulate.c | 4 +++- arch/x86/kvm/kvm_emulate.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 87ee1802166a2c..ceec8c5f968740 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -3440,8 +3440,10 @@ static int em_invlpg(struct x86_emulate_ctxt *ctxt) { int rc; ulong linear; + unsigned int max_size; - rc = linearize(ctxt, ctxt->src.addr.mem, 1, false, &linear); + rc = __linearize(ctxt, ctxt->src.addr.mem, &max_size, 1, ctxt->mode, + &linear, X86EMUL_F_INVLPG); if (rc == X86EMUL_CONTINUE) ctxt->ops->invlpg(ctxt, linear); /* Disable writeback. */ diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h index 65fc7ef5ca3da0..8bd9b23543cc7a 100644 --- a/arch/x86/kvm/kvm_emulate.h +++ b/arch/x86/kvm/kvm_emulate.h @@ -92,6 +92,7 @@ struct x86_instruction_info { #define X86EMUL_F_WRITE BIT(0) #define X86EMUL_F_FETCH BIT(1) #define X86EMUL_F_IMPLICIT BIT(2) +#define X86EMUL_F_INVLPG BIT(3) struct x86_emulate_ops { void (*vm_bugged)(struct x86_emulate_ctxt *ctxt); From 8b83853c5c98771780e40ca6948821a395853dec Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:16 +0800 Subject: [PATCH 355/515] KVM: x86/mmu: Drop non-PA bits when getting GFN for guest's PGD Drop non-PA bits when getting GFN for guest's PGD with the maximum theoretical mask for guest MAXPHYADDR. Do it unconditionally because it's harmless for 32-bit guests, querying 64-bit mode would be more expensive, and for EPT the mask isn't tied to guest mode. Using PT_BASE_ADDR_MASK would be technically wrong (PAE paging has 64-bit elements _except_ for CR3, which has only 32 valid bits), it wouldn't matter in practice though. Opportunistically use GENMASK_ULL() to define __PT_BASE_ADDR_MASK. Signed-off-by: Binbin Wu Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-6-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 2 +- arch/x86/kvm/mmu/mmu_internal.h | 1 + arch/x86/kvm/mmu/paging_tmpl.h | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 5d3dc7119e57df..455720ad330757 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3774,7 +3774,7 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu) hpa_t root; root_pgd = kvm_mmu_get_guest_pgd(vcpu, mmu); - root_gfn = root_pgd >> PAGE_SHIFT; + root_gfn = (root_pgd & __PT_BASE_ADDR_MASK) >> PAGE_SHIFT; if (!kvm_vcpu_is_visible_gfn(vcpu, root_gfn)) { mmu->root.hpa = kvm_mmu_get_dummy_root(); diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h index decc1f1536694f..68f8564d85a99b 100644 --- a/arch/x86/kvm/mmu/mmu_internal.h +++ b/arch/x86/kvm/mmu/mmu_internal.h @@ -13,6 +13,7 @@ #endif /* Page table builder macros common to shadow (host) PTEs and guest PTEs. */ +#define __PT_BASE_ADDR_MASK GENMASK_ULL(51, 12) #define __PT_LEVEL_SHIFT(level, bits_per_level) \ (PAGE_SHIFT + ((level) - 1) * (bits_per_level)) #define __PT_INDEX(address, level, bits_per_level) \ diff --git a/arch/x86/kvm/mmu/paging_tmpl.h b/arch/x86/kvm/mmu/paging_tmpl.h index c85255073f6723..4d4e98fe4f3548 100644 --- a/arch/x86/kvm/mmu/paging_tmpl.h +++ b/arch/x86/kvm/mmu/paging_tmpl.h @@ -62,7 +62,7 @@ #endif /* Common logic, but per-type values. These also need to be undefined. */ -#define PT_BASE_ADDR_MASK ((pt_element_t)(((1ULL << 52) - 1) & ~(u64)(PAGE_SIZE-1))) +#define PT_BASE_ADDR_MASK ((pt_element_t)__PT_BASE_ADDR_MASK) #define PT_LVL_ADDR_MASK(lvl) __PT_LVL_ADDR_MASK(PT_BASE_ADDR_MASK, lvl, PT_LEVEL_BITS) #define PT_LVL_OFFSET_MASK(lvl) __PT_LVL_OFFSET_MASK(PT_BASE_ADDR_MASK, lvl, PT_LEVEL_BITS) #define PT_INDEX(addr, lvl) __PT_INDEX(addr, lvl, PT_LEVEL_BITS) From 82ba7169837ed0b0d0ceff24bf84b511a994483d Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:17 +0800 Subject: [PATCH 356/515] KVM: x86: Add & use kvm_vcpu_is_legal_cr3() to check CR3's legality Add and use kvm_vcpu_is_legal_cr3() to check CR3's legality to provide a clear distinction between CR3 and GPA checks. This will allow exempting bits from kvm_vcpu_is_legal_cr3() without affecting general GPA checks, e.g. for upcoming features that will use high bits in CR3 for feature enabling. No functional change intended. Signed-off-by: Binbin Wu Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-7-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/cpuid.h | 5 +++++ arch/x86/kvm/svm/nested.c | 4 ++-- arch/x86/kvm/vmx/nested.c | 4 ++-- arch/x86/kvm/x86.c | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index 0b90532b6e2614..5fd3f2d1ca148d 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -279,4 +279,9 @@ static __always_inline bool guest_can_use(struct kvm_vcpu *vcpu, vcpu->arch.governed_features.enabled); } +static inline bool kvm_vcpu_is_legal_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) +{ + return kvm_vcpu_is_legal_gpa(vcpu, cr3); +} + #endif diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index 3fea8c47679e68..90ca9489aab63e 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -311,7 +311,7 @@ static bool __nested_vmcb_check_save(struct kvm_vcpu *vcpu, if ((save->efer & EFER_LME) && (save->cr0 & X86_CR0_PG)) { if (CC(!(save->cr4 & X86_CR4_PAE)) || CC(!(save->cr0 & X86_CR0_PE)) || - CC(kvm_vcpu_is_illegal_gpa(vcpu, save->cr3))) + CC(!kvm_vcpu_is_legal_cr3(vcpu, save->cr3))) return false; } @@ -520,7 +520,7 @@ static void nested_svm_transition_tlb_flush(struct kvm_vcpu *vcpu) static int nested_svm_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3, bool nested_npt, bool reload_pdptrs) { - if (CC(kvm_vcpu_is_illegal_gpa(vcpu, cr3))) + if (CC(!kvm_vcpu_is_legal_cr3(vcpu, cr3))) return -EINVAL; if (reload_pdptrs && !nested_npt && is_pae_paging(vcpu) && diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index c5ec0ef51ff78f..db61cf8e3128fe 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -1085,7 +1085,7 @@ static int nested_vmx_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3, bool nested_ept, bool reload_pdptrs, enum vm_entry_failure_code *entry_failure_code) { - if (CC(kvm_vcpu_is_illegal_gpa(vcpu, cr3))) { + if (CC(!kvm_vcpu_is_legal_cr3(vcpu, cr3))) { *entry_failure_code = ENTRY_FAIL_DEFAULT; return -EINVAL; } @@ -2912,7 +2912,7 @@ static int nested_vmx_check_host_state(struct kvm_vcpu *vcpu, if (CC(!nested_host_cr0_valid(vcpu, vmcs12->host_cr0)) || CC(!nested_host_cr4_valid(vcpu, vmcs12->host_cr4)) || - CC(kvm_vcpu_is_illegal_gpa(vcpu, vmcs12->host_cr3))) + CC(!kvm_vcpu_is_legal_cr3(vcpu, vmcs12->host_cr3))) return -EINVAL; if (CC(is_noncanonical_address(vmcs12->host_ia32_sysenter_esp, vcpu)) || diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d632931fa545e4..9db5eff6e86c85 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1284,7 +1284,7 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) * stuff CR3, e.g. for RSM emulation, and there is no guarantee that * the current vCPU mode is accurate. */ - if (kvm_vcpu_is_illegal_gpa(vcpu, cr3)) + if (!kvm_vcpu_is_legal_cr3(vcpu, cr3)) return 1; if (is_pae_paging(vcpu) && !load_pdptrs(vcpu, cr3)) @@ -11599,7 +11599,7 @@ static bool kvm_is_valid_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) */ if (!(sregs->cr4 & X86_CR4_PAE) || !(sregs->efer & EFER_LMA)) return false; - if (kvm_vcpu_is_illegal_gpa(vcpu, sregs->cr3)) + if (!kvm_vcpu_is_legal_cr3(vcpu, sregs->cr3)) return false; } else { /* From 95df55ee42fe066f1b0650e70f7b7f84f40380e7 Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:18 +0800 Subject: [PATCH 357/515] KVM: x86: Remove kvm_vcpu_is_illegal_gpa() Remove kvm_vcpu_is_illegal_gpa() and use !kvm_vcpu_is_legal_gpa() instead. The "illegal" helper actually predates the "legal" helper, the only reason the "illegal" variant wasn't removed by commit 4bda0e97868a ("KVM: x86: Add a helper to check for a legal GPA") was to avoid code churn. Now that CR3 has a dedicated helper, there are fewer callers, and so the code churn isn't that much of a deterrent. No functional change intended. Signed-off-by: Binbin Wu Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-8-binbin.wu@linux.intel.com [sean: provide a bit of history in the changelog] Signed-off-by: Sean Christopherson --- arch/x86/kvm/cpuid.h | 5 ----- arch/x86/kvm/vmx/nested.c | 2 +- arch/x86/kvm/vmx/vmx.c | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index 5fd3f2d1ca148d..fa04a00090a263 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -47,11 +47,6 @@ static inline bool kvm_vcpu_is_legal_gpa(struct kvm_vcpu *vcpu, gpa_t gpa) return !(gpa & vcpu->arch.reserved_gpa_bits); } -static inline bool kvm_vcpu_is_illegal_gpa(struct kvm_vcpu *vcpu, gpa_t gpa) -{ - return !kvm_vcpu_is_legal_gpa(vcpu, gpa); -} - static inline bool kvm_vcpu_is_legal_aligned_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, gpa_t alignment) { diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index db61cf8e3128fe..51622878d6e445 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -2717,7 +2717,7 @@ static bool nested_vmx_check_eptp(struct kvm_vcpu *vcpu, u64 new_eptp) } /* Reserved bits should not be set */ - if (CC(kvm_vcpu_is_illegal_gpa(vcpu, new_eptp) || ((new_eptp >> 7) & 0x1f))) + if (CC(!kvm_vcpu_is_legal_gpa(vcpu, new_eptp) || ((new_eptp >> 7) & 0x1f))) return false; /* AD, if set, should be supported */ diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index be20a60047b1f2..9555c0f6a01815 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -5782,7 +5782,7 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu) * would also use advanced VM-exit information for EPT violations to * reconstruct the page fault error code. */ - if (unlikely(allow_smaller_maxphyaddr && kvm_vcpu_is_illegal_gpa(vcpu, gpa))) + if (unlikely(allow_smaller_maxphyaddr && !kvm_vcpu_is_legal_gpa(vcpu, gpa))) return kvm_emulate_instruction(vcpu, 0); return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0); From 7a747b6c84a1de00663fc68bb498edecd2df161c Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:19 +0800 Subject: [PATCH 358/515] KVM: x86: Introduce get_untagged_addr() in kvm_x86_ops and call it in emulator Introduce a new interface get_untagged_addr() to kvm_x86_ops to untag the metadata from linear address. Call the interface in linearization of instruction emulator for 64-bit mode. When enabled feature like Intel Linear Address Masking (LAM) or AMD Upper Address Ignore (UAI), linear addresses may be tagged with metadata that needs to be dropped prior to canonicality checks, i.e. the metadata is ignored. Introduce get_untagged_addr() to kvm_x86_ops to hide the vendor specific code, as sadly LAM and UAI have different semantics. Pass the emulator flags to allow vendor specific implementation to precisely identify the access type (LAM doesn't untag certain accesses). Signed-off-by: Binbin Wu Reviewed-by: Chao Gao Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-9-binbin.wu@linux.intel.com [sean: massage changelog] Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm-x86-ops.h | 1 + arch/x86/include/asm/kvm_host.h | 2 ++ arch/x86/kvm/emulate.c | 2 +- arch/x86/kvm/kvm_emulate.h | 3 +++ arch/x86/kvm/x86.c | 10 ++++++++++ 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-x86-ops.h index 26b628d84594b9..756791665117b9 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -135,6 +135,7 @@ KVM_X86_OP(msr_filter_changed) KVM_X86_OP(complete_emulated_msr) KVM_X86_OP(vcpu_deliver_sipi_vector) KVM_X86_OP_OPTIONAL_RET0(vcpu_get_apicv_inhibit_reasons); +KVM_X86_OP_OPTIONAL(get_untagged_addr) #undef KVM_X86_OP #undef KVM_X86_OP_OPTIONAL diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 394e1a31c02cac..30ce9431159841 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1762,6 +1762,8 @@ struct kvm_x86_ops { * Returns vCPU specific APICv inhibit reasons */ unsigned long (*vcpu_get_apicv_inhibit_reasons)(struct kvm_vcpu *vcpu); + + gva_t (*get_untagged_addr)(struct kvm_vcpu *vcpu, gva_t gva, unsigned int flags); }; struct kvm_x86_nested_ops { diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index ceec8c5f968740..e223043ef5b26f 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -701,7 +701,7 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, *max_size = 0; switch (mode) { case X86EMUL_MODE_PROT64: - *linear = la; + *linear = la = ctxt->ops->get_untagged_addr(ctxt, la, flags); va_bits = ctxt_virt_addr_bits(ctxt); if (!__is_canonical_address(la, va_bits)) goto bad; diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h index 8bd9b23543cc7a..e6d149825169dd 100644 --- a/arch/x86/kvm/kvm_emulate.h +++ b/arch/x86/kvm/kvm_emulate.h @@ -230,6 +230,9 @@ struct x86_emulate_ops { int (*leave_smm)(struct x86_emulate_ctxt *ctxt); void (*triple_fault)(struct x86_emulate_ctxt *ctxt); int (*set_xcr)(struct x86_emulate_ctxt *ctxt, u32 index, u64 xcr); + + gva_t (*get_untagged_addr)(struct x86_emulate_ctxt *ctxt, gva_t addr, + unsigned int flags); }; /* Type, address-of, and value of an instruction's operand. */ diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 9db5eff6e86c85..2b85d7cf780ddc 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8433,6 +8433,15 @@ static void emulator_vm_bugged(struct x86_emulate_ctxt *ctxt) kvm_vm_bugged(kvm); } +static gva_t emulator_get_untagged_addr(struct x86_emulate_ctxt *ctxt, + gva_t addr, unsigned int flags) +{ + if (!kvm_x86_ops.get_untagged_addr) + return addr; + + return static_call(kvm_x86_get_untagged_addr)(emul_to_vcpu(ctxt), addr, flags); +} + static const struct x86_emulate_ops emulate_ops = { .vm_bugged = emulator_vm_bugged, .read_gpr = emulator_read_gpr, @@ -8477,6 +8486,7 @@ static const struct x86_emulate_ops emulate_ops = { .leave_smm = emulator_leave_smm, .triple_fault = emulator_triple_fault, .set_xcr = emulator_set_xcr, + .get_untagged_addr = emulator_get_untagged_addr, }; static void toggle_interruptibility(struct kvm_vcpu *vcpu, u32 mask) From ef99001b30a842cae1f55c13d7ee0e51501bfebd Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:20 +0800 Subject: [PATCH 359/515] KVM: x86: Untag addresses for LAM emulation where applicable Stub in vmx_get_untagged_addr() and wire up calls from the emulator (via get_untagged_addr()) and "direct" calls from various VM-Exit handlers in VMX where LAM untagging is supposed to be applied. Defer implementing the guts of vmx_get_untagged_addr() to future patches purely to make the changes easier to consume. LAM is active only for 64-bit linear addresses and several types of accesses are exempted. - Cases need to untag address (handled in get_vmx_mem_address()) Operand(s) of VMX instructions and INVPCID. Operand(s) of SGX ENCLS. - Cases LAM doesn't apply to (no change needed) Operand of INVLPG. Linear address in INVPCID descriptor. Linear address in INVVPID descriptor. BASEADDR specified in SECS of ECREATE. Note: - LAM doesn't apply to write to control registers or MSRs - LAM masking is applied before walking page tables, i.e. the faulting linear address in CR2 doesn't contain the metadata. - The guest linear address saved in VMCS doesn't contain metadata. Signed-off-by: Binbin Wu Reviewed-by: Chao Gao Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-10-binbin.wu@linux.intel.com [sean: massage changelog] Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/nested.c | 5 +++++ arch/x86/kvm/vmx/sgx.c | 1 + arch/x86/kvm/vmx/vmx.c | 7 +++++++ arch/x86/kvm/vmx/vmx.h | 2 ++ arch/x86/kvm/x86.c | 4 ++++ 5 files changed, 19 insertions(+) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 51622878d6e445..4ba46e1b29d2b2 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -4980,6 +4980,7 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, else *ret = off; + *ret = vmx_get_untagged_addr(vcpu, *ret, 0); /* Long mode: #GP(0)/#SS(0) if the memory address is in a * non-canonical form. This is the only check on the memory * destination for long mode! @@ -5797,6 +5798,10 @@ static int handle_invvpid(struct kvm_vcpu *vcpu) vpid02 = nested_get_vpid02(vcpu); switch (type) { case VMX_VPID_EXTENT_INDIVIDUAL_ADDR: + /* + * LAM doesn't apply to addresses that are inputs to TLB + * invalidation. + */ if (!operand.vpid || is_noncanonical_address(operand.gla, vcpu)) return nested_vmx_fail(vcpu, diff --git a/arch/x86/kvm/vmx/sgx.c b/arch/x86/kvm/vmx/sgx.c index 3e822e58249753..6fef01e0536e50 100644 --- a/arch/x86/kvm/vmx/sgx.c +++ b/arch/x86/kvm/vmx/sgx.c @@ -37,6 +37,7 @@ static int sgx_get_encls_gva(struct kvm_vcpu *vcpu, unsigned long offset, if (!IS_ALIGNED(*gva, alignment)) { fault = true; } else if (likely(is_64_bit_mode(vcpu))) { + *gva = vmx_get_untagged_addr(vcpu, *gva, 0); fault = is_noncanonical_address(*gva, vcpu); } else { *gva &= 0xffffffff; diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 9555c0f6a01815..e46d25b2094a5f 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -8206,6 +8206,11 @@ static void vmx_vm_destroy(struct kvm *kvm) free_pages((unsigned long)kvm_vmx->pid_table, vmx_get_pid_table_order(kvm)); } +gva_t vmx_get_untagged_addr(struct kvm_vcpu *vcpu, gva_t gva, unsigned int flags) +{ + return gva; +} + static struct kvm_x86_ops vmx_x86_ops __initdata = { .name = KBUILD_MODNAME, @@ -8346,6 +8351,8 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = { .complete_emulated_msr = kvm_complete_insn_gp, .vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector, + + .get_untagged_addr = vmx_get_untagged_addr, }; static unsigned int vmx_handle_intel_pt_intr(void) diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h index c2130d2c8e24bb..45cee1a8bc0a41 100644 --- a/arch/x86/kvm/vmx/vmx.h +++ b/arch/x86/kvm/vmx/vmx.h @@ -420,6 +420,8 @@ void vmx_enable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type); u64 vmx_get_l2_tsc_offset(struct kvm_vcpu *vcpu); u64 vmx_get_l2_tsc_multiplier(struct kvm_vcpu *vcpu); +gva_t vmx_get_untagged_addr(struct kvm_vcpu *vcpu, gva_t gva, unsigned int flags); + static inline void vmx_set_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type, bool value) { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2b85d7cf780ddc..884b9aed61d7ec 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -13545,6 +13545,10 @@ int kvm_handle_invpcid(struct kvm_vcpu *vcpu, unsigned long type, gva_t gva) switch (type) { case INVPCID_TYPE_INDIV_ADDR: + /* + * LAM doesn't apply to addresses that are inputs to TLB + * invalidation. + */ if ((!pcid_enabled && (operand.pcid != 0)) || is_noncanonical_address(operand.gla, vcpu)) { kvm_inject_gp(vcpu, 0); From 4daea9a5183f0a8d0f9e6436146f6a39f9ffbdb6 Mon Sep 17 00:00:00 2001 From: Robert Hoo Date: Wed, 13 Sep 2023 20:42:21 +0800 Subject: [PATCH 360/515] KVM: x86: Virtualize LAM for supervisor pointer Add support to allow guests to set the new CR4 control bit for LAM and add implementation to get untagged address for supervisor pointers. LAM modifies the canonicality check applied to 64-bit linear addresses for data accesses, allowing software to use of the untranslated address bits for metadata and masks the metadata bits before using them as linear addresses to access memory. LAM uses CR4.LAM_SUP (bit 28) to configure and enable LAM for supervisor pointers. It also changes VMENTER to allow the bit to be set in VMCS's HOST_CR4 and GUEST_CR4 to support virtualization. Note CR4.LAM_SUP is allowed to be set even not in 64-bit mode, but it will not take effect since LAM only applies to 64-bit linear addresses. Move CR4.LAM_SUP out of CR4_RESERVED_BITS, its reservation depends on vcpu supporting LAM or not. Leave it intercepted to prevent guest from setting the bit if LAM is not exposed to guest as well as to avoid vmread every time when KVM fetches its value, with the expectation that guest won't toggle the bit frequently. Set CR4.LAM_SUP bit in the emulated IA32_VMX_CR4_FIXED1 MSR for guests to allow guests to enable LAM for supervisor pointers in nested VMX operation. Hardware is not required to do TLB flush when CR4.LAM_SUP toggled, KVM doesn't need to emulate TLB flush based on it. There's no other features or vmx_exec_controls connection, and no other code needed in {kvm,vmx}_set_cr4(). Skip address untag for instruction fetches (which includes branch targets), operand of INVLPG instructions, and implicit system accesses, all of which are not subject to untagging. Note, get_untagged_addr() isn't invoked for implicit system accesses as there is no reason to do so, but check the flag anyways for documentation purposes. Signed-off-by: Robert Hoo Co-developed-by: Binbin Wu Signed-off-by: Binbin Wu Reviewed-by: Chao Gao Reviewed-by: Kai Huang Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-11-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/vmx/vmx.c | 39 ++++++++++++++++++++++++++++++++- arch/x86/kvm/x86.h | 2 ++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 30ce9431159841..0493b42b5544a7 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -133,7 +133,8 @@ | X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR | X86_CR4_PCIDE \ | X86_CR4_OSXSAVE | X86_CR4_SMEP | X86_CR4_FSGSBASE \ | X86_CR4_OSXMMEXCPT | X86_CR4_LA57 | X86_CR4_VMXE \ - | X86_CR4_SMAP | X86_CR4_PKE | X86_CR4_UMIP)) + | X86_CR4_SMAP | X86_CR4_PKE | X86_CR4_UMIP \ + | X86_CR4_LAM_SUP)) #define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR) diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index e46d25b2094a5f..5f90f9f481a2ff 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -7674,6 +7674,9 @@ static void nested_vmx_cr_fixed1_bits_update(struct kvm_vcpu *vcpu) cr4_fixed1_update(X86_CR4_UMIP, ecx, feature_bit(UMIP)); cr4_fixed1_update(X86_CR4_LA57, ecx, feature_bit(LA57)); + entry = kvm_find_cpuid_entry_index(vcpu, 0x7, 1); + cr4_fixed1_update(X86_CR4_LAM_SUP, eax, feature_bit(LAM)); + #undef cr4_fixed1_update } @@ -8206,9 +8209,43 @@ static void vmx_vm_destroy(struct kvm *kvm) free_pages((unsigned long)kvm_vmx->pid_table, vmx_get_pid_table_order(kvm)); } +/* + * Note, the SDM states that the linear address is masked *after* the modified + * canonicality check, whereas KVM masks (untags) the address and then performs + * a "normal" canonicality check. Functionally, the two methods are identical, + * and when the masking occurs relative to the canonicality check isn't visible + * to software, i.e. KVM's behavior doesn't violate the SDM. + */ gva_t vmx_get_untagged_addr(struct kvm_vcpu *vcpu, gva_t gva, unsigned int flags) { - return gva; + int lam_bit; + + if (flags & (X86EMUL_F_FETCH | X86EMUL_F_IMPLICIT | X86EMUL_F_INVLPG)) + return gva; + + if (!is_64_bit_mode(vcpu)) + return gva; + + /* + * Bit 63 determines if the address should be treated as user address + * or a supervisor address. + */ + if (!(gva & BIT_ULL(63))) { + /* KVM doesn't yet virtualize LAM_U{48,57}. */ + return gva; + } else { + if (!kvm_is_cr4_bit_set(vcpu, X86_CR4_LAM_SUP)) + return gva; + + lam_bit = kvm_is_cr4_bit_set(vcpu, X86_CR4_LA57) ? 56 : 47; + } + + /* + * Untag the address by sign-extending the lam_bit, but NOT to bit 63. + * Bit 63 is retained from the raw virtual address so that untagging + * doesn't change a user access to a supervisor access, and vice versa. + */ + return (sign_extend64(gva, lam_bit) & ~BIT_ULL(63)) | (gva & BIT_ULL(63)); } static struct kvm_x86_ops vmx_x86_ops __initdata = { diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 5184fde1dc541a..2f7e1916665800 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -530,6 +530,8 @@ bool kvm_msr_allowed(struct kvm_vcpu *vcpu, u32 index, u32 type); __reserved_bits |= X86_CR4_VMXE; \ if (!__cpu_has(__c, X86_FEATURE_PCID)) \ __reserved_bits |= X86_CR4_PCIDE; \ + if (!__cpu_has(__c, X86_FEATURE_LAM)) \ + __reserved_bits |= X86_CR4_LAM_SUP; \ __reserved_bits; \ }) From 0cadc474eff091a832e58fe03118e2f1b4c12a4c Mon Sep 17 00:00:00 2001 From: Robert Hoo Date: Wed, 13 Sep 2023 20:42:22 +0800 Subject: [PATCH 361/515] KVM: x86: Virtualize LAM for user pointer Add support to allow guests to set the new CR3 control bits for Linear Address Masking (LAM) and add implementation to get untagged address for user pointers. LAM modifies the canonical check for 64-bit linear addresses, allowing software to use the masked/ignored address bits for metadata. Hardware masks off the metadata bits before using the linear addresses to access memory. LAM uses two new CR3 non-address bits, LAM_U48 (bit 62) and LAM_U57 (bit 61), to configure LAM for user pointers. LAM also changes VMENTER to allow both bits to be set in VMCS's HOST_CR3 and GUEST_CR3 for virtualization. When EPT is on, CR3 is not trapped by KVM and it's up to the guest to set any of the two LAM control bits. However, when EPT is off, the actual CR3 used by the guest is generated from the shadow MMU root which is different from the CR3 that is *set* by the guest, and KVM needs to manually apply any active control bits to VMCS's GUEST_CR3 based on the cached CR3 *seen* by the guest. KVM manually checks guest's CR3 to make sure it points to a valid guest physical address (i.e. to support smaller MAXPHYSADDR in the guest). Extend this check to allow the two LAM control bits to be set. After check, LAM bits of guest CR3 will be stripped off to extract guest physical address. In case of nested, for a guest which supports LAM, both VMCS12's HOST_CR3 and GUEST_CR3 are allowed to have the new LAM control bits set, i.e. when L0 enters L1 to emulate a VMEXIT from L2 to L1 or when L0 enters L2 directly. KVM also manually checks VMCS12's HOST_CR3 and GUEST_CR3 being valid physical address. Extend such check to allow the new LAM control bits too. Note, LAM doesn't have a global control bit to turn on/off LAM completely, but purely depends on hardware's CPUID to determine it can be enabled or not. That means, when EPT is on, even when KVM doesn't expose LAM to guest, the guest can still set LAM control bits in CR3 w/o causing problem. This is an unfortunate virtualization hole. KVM could choose to intercept CR3 in this case and inject fault but this would hurt performance when running a normal VM w/o LAM support. This is undesirable. Just choose to let the guest do such illegal thing as the worst case is guest being killed when KVM eventually find out such illegal behaviour and that the guest is misbehaving. Suggested-by: Sean Christopherson Signed-off-by: Robert Hoo Co-developed-by: Binbin Wu Signed-off-by: Binbin Wu Reviewed-by: Kai Huang Reviewed-by: Chao Gao Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-12-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/cpuid.h | 4 ++++ arch/x86/kvm/mmu.h | 9 +++++++++ arch/x86/kvm/vmx/vmx.c | 12 +++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index fa04a00090a263..e4bd59c15a2cac 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -276,6 +276,10 @@ static __always_inline bool guest_can_use(struct kvm_vcpu *vcpu, static inline bool kvm_vcpu_is_legal_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) { + if (kvm_cpu_cap_has(X86_FEATURE_LAM) && + guest_cpuid_has(vcpu, X86_FEATURE_LAM)) + cr3 &= ~(X86_CR3_LAM_U48 | X86_CR3_LAM_U57); + return kvm_vcpu_is_legal_gpa(vcpu, cr3); } diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h index bb8c86eefac047..580e2414b88c79 100644 --- a/arch/x86/kvm/mmu.h +++ b/arch/x86/kvm/mmu.h @@ -146,6 +146,15 @@ static inline unsigned long kvm_get_active_pcid(struct kvm_vcpu *vcpu) return kvm_get_pcid(vcpu, kvm_read_cr3(vcpu)); } +static inline unsigned long kvm_get_active_cr3_lam_bits(struct kvm_vcpu *vcpu) +{ + if (!kvm_cpu_cap_has(X86_FEATURE_LAM) || + !guest_cpuid_has(vcpu, X86_FEATURE_LAM)) + return 0; + + return kvm_read_cr3(vcpu) & (X86_CR3_LAM_U48 | X86_CR3_LAM_U57); +} + static inline void kvm_mmu_load_pgd(struct kvm_vcpu *vcpu) { u64 root_hpa = vcpu->arch.mmu->root.hpa; diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 5f90f9f481a2ff..bca97bddb60d2d 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -3400,7 +3400,8 @@ static void vmx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, update_guest_cr3 = false; vmx_ept_load_pdptrs(vcpu); } else { - guest_cr3 = root_hpa | kvm_get_active_pcid(vcpu); + guest_cr3 = root_hpa | kvm_get_active_pcid(vcpu) | + kvm_get_active_cr3_lam_bits(vcpu); } if (update_guest_cr3) @@ -8219,6 +8220,7 @@ static void vmx_vm_destroy(struct kvm *kvm) gva_t vmx_get_untagged_addr(struct kvm_vcpu *vcpu, gva_t gva, unsigned int flags) { int lam_bit; + unsigned long cr3_bits; if (flags & (X86EMUL_F_FETCH | X86EMUL_F_IMPLICIT | X86EMUL_F_INVLPG)) return gva; @@ -8231,8 +8233,12 @@ gva_t vmx_get_untagged_addr(struct kvm_vcpu *vcpu, gva_t gva, unsigned int flags * or a supervisor address. */ if (!(gva & BIT_ULL(63))) { - /* KVM doesn't yet virtualize LAM_U{48,57}. */ - return gva; + cr3_bits = kvm_get_active_cr3_lam_bits(vcpu); + if (!(cr3_bits & (X86_CR3_LAM_U57 | X86_CR3_LAM_U48))) + return gva; + + /* LAM_U48 is ignored if LAM_U57 is set. */ + lam_bit = cr3_bits & X86_CR3_LAM_U57 ? 56 : 47; } else { if (!kvm_is_cr4_bit_set(vcpu, X86_CR4_LAM_SUP)) return gva; From 6ef90ee226f103ad718500fbec1a5c1f22f5c833 Mon Sep 17 00:00:00 2001 From: Robert Hoo Date: Wed, 13 Sep 2023 20:42:23 +0800 Subject: [PATCH 362/515] KVM: x86: Advertise and enable LAM (user and supervisor) LAM is enumerated by CPUID.7.1:EAX.LAM[bit 26]. Advertise the feature to userspace and enable it as the final step after the LAM virtualization support for supervisor and user pointers. SGX LAM support is not advertised yet. SGX LAM support is enumerated in SGX's own CPUID and there's no hard requirement that it must be supported when LAM is reported in CPUID leaf 0x7. Signed-off-by: Robert Hoo Signed-off-by: Binbin Wu Reviewed-by: Jingqi Liu Reviewed-by: Chao Gao Reviewed-by: Kai Huang Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-13-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/cpuid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 464b23ac5f9301..b22825bd7c35f6 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -671,7 +671,7 @@ void kvm_set_cpu_caps(void) kvm_cpu_cap_mask(CPUID_7_1_EAX, F(AVX_VNNI) | F(AVX512_BF16) | F(CMPCCXADD) | F(FZRM) | F(FSRS) | F(FSRC) | - F(AMX_FP16) | F(AVX_IFMA) + F(AMX_FP16) | F(AVX_IFMA) | F(LAM) ); kvm_cpu_cap_init_kvm_defined(CPUID_7_1_EDX, From b291db54076331c60dedd025a1aa7d9198181167 Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Wed, 13 Sep 2023 20:42:24 +0800 Subject: [PATCH 363/515] KVM: x86: Use KVM-governed feature framework to track "LAM enabled" Use the governed feature framework to track if Linear Address Masking (LAM) is "enabled", i.e. if LAM can be used by the guest. Using the framework to avoid the relative expensive call guest_cpuid_has() during cr3 and vmexit handling paths for LAM. No functional change intended. Signed-off-by: Binbin Wu Tested-by: Xuelian Guo Link: https://lore.kernel.org/r/20230913124227.12574-14-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/cpuid.h | 3 +-- arch/x86/kvm/governed_features.h | 1 + arch/x86/kvm/mmu.h | 3 +-- arch/x86/kvm/vmx/vmx.c | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index e4bd59c15a2cac..856e3037e74f3f 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -276,8 +276,7 @@ static __always_inline bool guest_can_use(struct kvm_vcpu *vcpu, static inline bool kvm_vcpu_is_legal_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) { - if (kvm_cpu_cap_has(X86_FEATURE_LAM) && - guest_cpuid_has(vcpu, X86_FEATURE_LAM)) + if (guest_can_use(vcpu, X86_FEATURE_LAM)) cr3 &= ~(X86_CR3_LAM_U48 | X86_CR3_LAM_U57); return kvm_vcpu_is_legal_gpa(vcpu, cr3); diff --git a/arch/x86/kvm/governed_features.h b/arch/x86/kvm/governed_features.h index 423a73395c102c..ad463b1ed4e4a8 100644 --- a/arch/x86/kvm/governed_features.h +++ b/arch/x86/kvm/governed_features.h @@ -16,6 +16,7 @@ KVM_GOVERNED_X86_FEATURE(PAUSEFILTER) KVM_GOVERNED_X86_FEATURE(PFTHRESHOLD) KVM_GOVERNED_X86_FEATURE(VGIF) KVM_GOVERNED_X86_FEATURE(VNMI) +KVM_GOVERNED_X86_FEATURE(LAM) #undef KVM_GOVERNED_X86_FEATURE #undef KVM_GOVERNED_FEATURE diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h index 580e2414b88c79..60f21bb4c27b19 100644 --- a/arch/x86/kvm/mmu.h +++ b/arch/x86/kvm/mmu.h @@ -148,8 +148,7 @@ static inline unsigned long kvm_get_active_pcid(struct kvm_vcpu *vcpu) static inline unsigned long kvm_get_active_cr3_lam_bits(struct kvm_vcpu *vcpu) { - if (!kvm_cpu_cap_has(X86_FEATURE_LAM) || - !guest_cpuid_has(vcpu, X86_FEATURE_LAM)) + if (!guest_can_use(vcpu, X86_FEATURE_LAM)) return 0; return kvm_read_cr3(vcpu) & (X86_CR3_LAM_U48 | X86_CR3_LAM_U57); diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index bca97bddb60d2d..4c3a70f26b422a 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -7764,6 +7764,7 @@ static void vmx_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_XSAVES); kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_VMX); + kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_LAM); vmx_setup_uret_msrs(vmx); From 49c19389876002dc46d0c1344c056a6366745d07 Mon Sep 17 00:00:00 2001 From: "wuqiang.matt" Date: Mon, 23 Oct 2023 19:24:52 +0800 Subject: [PATCH 364/515] lib,kprobes: using try_cmpxchg_local in objpool_push The objpool_push can only happen on local cpu node, so only the local cpu can touch slot->tail and slot->last, which ensures the correctness of using cmpxchg without lock prefix (using try_cmpxchg_local instead of try_cmpxchg_acquire). Testing with IACA found the lock version of pop/push pair costs 16.46 cycles and local-push version costs 15.63 cycles. Kretprobe throughput is improved to 1.019 times of the lock version for x86_64 systems. OS: Debian 10 X86_64, Linux 6.6rc6 with freelist HW: XEON 8336C x 2, 64 cores/128 threads, DDR4 3200MT/s 1T 2T 4T 8T 16T lock: 29909085 59865637 119692073 239750369 478005250 local: 30297523 60532376 121147338 242598499 484620355 32T 48T 64T 96T 128T lock: 957553042 1435814086 1680872925 2043126796 2165424198 local: 968526317 1454991286 1861053557 2059530343 2171732306 Link: https://lore.kernel.org/all/20231023112452.6290-1-wuqiang.matt@bytedance.com/ Signed-off-by: wuqiang.matt Acked-by: Masami Hiramatsu (Google) Signed-off-by: Masami Hiramatsu (Google) --- lib/objpool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/objpool.c b/lib/objpool.c index ce0087f64400c2..a032701beccbd7 100644 --- a/lib/objpool.c +++ b/lib/objpool.c @@ -166,7 +166,7 @@ objpool_try_add_slot(void *obj, struct objpool_head *pool, int cpu) head = READ_ONCE(slot->head); /* fault caught: something must be wrong */ WARN_ON_ONCE(tail - head > pool->nr_objs); - } while (!try_cmpxchg_acquire(&slot->tail, &tail, tail + 1)); + } while (!try_cmpxchg_local(&slot->tail, &tail, tail + 1)); /* now the tail position is reserved for the given obj */ WRITE_ONCE(slot->entries[tail & slot->mask], obj); From 87d369243d1809b2544b7383e92b4c05836dde82 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Tue, 24 Oct 2023 11:57:15 +0100 Subject: [PATCH 365/515] firmware: arm_ffa: Declare ffa_bus_type structure in the header smatch reports: drivers/firmware/arm_ffa/bus.c:108:17: warning: symbol 'ffa_bus_type' was not declared. Should it be static? ffa_bus_type is exported to be useful in the FF-A driver. So this warning is not correct. However, declaring the ffa_bus_type structure in the header like many other bus_types do already removes this warning. So let us just do the same and get rid of the warning. Link: https://lore.kernel.org/r/20231024105715.2369638-1-sudeep.holla@arm.com Signed-off-by: Sudeep Holla --- include/linux/arm_ffa.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h index 1abedb5b2e48fa..3d0fde57ba90eb 100644 --- a/include/linux/arm_ffa.h +++ b/include/linux/arm_ffa.h @@ -209,6 +209,8 @@ bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; } #define module_ffa_driver(__ffa_driver) \ module_driver(__ffa_driver, ffa_register, ffa_unregister) +extern struct bus_type ffa_bus_type; + /* FFA transport related */ struct ffa_partition_info { u16 id; From dc57dbdf78287d525ffc214d6f76ed2278995e9a Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Thu, 5 Oct 2023 14:15:58 +0300 Subject: [PATCH 366/515] ima: annotate iint mutex to avoid lockdep false positive warnings It is not clear that IMA should be nested at all, but as long is it measures files both on overlayfs and on underlying fs, we need to annotate the iint mutex to avoid lockdep false positives related to IMA + overlayfs, same as overlayfs annotates the inode mutex. Reported-and-tested-by: syzbot+b42fe626038981fb7bfa@syzkaller.appspotmail.com Signed-off-by: Amir Goldstein Signed-off-by: Mimi Zohar --- security/integrity/iint.c | 48 ++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/security/integrity/iint.c b/security/integrity/iint.c index a462df827de2da..27ea19fb1f54c7 100644 --- a/security/integrity/iint.c +++ b/security/integrity/iint.c @@ -66,9 +66,32 @@ struct integrity_iint_cache *integrity_iint_find(struct inode *inode) return iint; } -static void iint_free(struct integrity_iint_cache *iint) +#define IMA_MAX_NESTING (FILESYSTEM_MAX_STACK_DEPTH+1) + +/* + * It is not clear that IMA should be nested at all, but as long is it measures + * files both on overlayfs and on underlying fs, we need to annotate the iint + * mutex to avoid lockdep false positives related to IMA + overlayfs. + * See ovl_lockdep_annotate_inode_mutex_key() for more details. + */ +static inline void iint_lockdep_annotate(struct integrity_iint_cache *iint, + struct inode *inode) +{ +#ifdef CONFIG_LOCKDEP + static struct lock_class_key iint_mutex_key[IMA_MAX_NESTING]; + + int depth = inode->i_sb->s_stack_depth; + + if (WARN_ON_ONCE(depth < 0 || depth >= IMA_MAX_NESTING)) + depth = 0; + + lockdep_set_class(&iint->mutex, &iint_mutex_key[depth]); +#endif +} + +static void iint_init_always(struct integrity_iint_cache *iint, + struct inode *inode) { - kfree(iint->ima_hash); iint->ima_hash = NULL; iint->version = 0; iint->flags = 0UL; @@ -80,6 +103,14 @@ static void iint_free(struct integrity_iint_cache *iint) iint->ima_creds_status = INTEGRITY_UNKNOWN; iint->evm_status = INTEGRITY_UNKNOWN; iint->measured_pcrs = 0; + mutex_init(&iint->mutex); + iint_lockdep_annotate(iint, inode); +} + +static void iint_free(struct integrity_iint_cache *iint) +{ + kfree(iint->ima_hash); + mutex_destroy(&iint->mutex); kmem_cache_free(iint_cache, iint); } @@ -104,6 +135,8 @@ struct integrity_iint_cache *integrity_inode_get(struct inode *inode) if (!iint) return NULL; + iint_init_always(iint, inode); + write_lock(&integrity_iint_lock); p = &integrity_iint_tree.rb_node; @@ -153,25 +186,18 @@ void integrity_inode_free(struct inode *inode) iint_free(iint); } -static void init_once(void *foo) +static void iint_init_once(void *foo) { struct integrity_iint_cache *iint = (struct integrity_iint_cache *) foo; memset(iint, 0, sizeof(*iint)); - iint->ima_file_status = INTEGRITY_UNKNOWN; - iint->ima_mmap_status = INTEGRITY_UNKNOWN; - iint->ima_bprm_status = INTEGRITY_UNKNOWN; - iint->ima_read_status = INTEGRITY_UNKNOWN; - iint->ima_creds_status = INTEGRITY_UNKNOWN; - iint->evm_status = INTEGRITY_UNKNOWN; - mutex_init(&iint->mutex); } static int __init integrity_iintcache_init(void) { iint_cache = kmem_cache_create("iint_cache", sizeof(struct integrity_iint_cache), - 0, SLAB_PANIC, init_once); + 0, SLAB_PANIC, iint_init_once); return 0; } DEFINE_LSM(integrity) = { From 66d7f1b80031c204c7dd5639a1a9f2b412354d8c Mon Sep 17 00:00:00 2001 From: Prasad Pandit Date: Sun, 22 Oct 2023 12:17:23 +0530 Subject: [PATCH 367/515] integrity: fix indentation of config attributes Fix indentation of config attributes. Attributes are generally indented with a leading tab(\t) character. Signed-off-by: Prasad Pandit Signed-off-by: Mimi Zohar --- security/integrity/Kconfig | 44 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/security/integrity/Kconfig b/security/integrity/Kconfig index 232191ee09e310..1e151e6a5d3fad 100644 --- a/security/integrity/Kconfig +++ b/security/integrity/Kconfig @@ -34,10 +34,10 @@ config INTEGRITY_ASYMMETRIC_KEYS bool "Enable asymmetric keys support" depends on INTEGRITY_SIGNATURE default n - select ASYMMETRIC_KEY_TYPE - select ASYMMETRIC_PUBLIC_KEY_SUBTYPE - select CRYPTO_RSA - select X509_CERTIFICATE_PARSER + select ASYMMETRIC_KEY_TYPE + select ASYMMETRIC_PUBLIC_KEY_SUBTYPE + select CRYPTO_RSA + select X509_CERTIFICATE_PARSER help This option enables digital signature verification using asymmetric keys. @@ -53,14 +53,14 @@ config INTEGRITY_TRUSTED_KEYRING keyring. config INTEGRITY_PLATFORM_KEYRING - bool "Provide keyring for platform/firmware trusted keys" - depends on INTEGRITY_ASYMMETRIC_KEYS - depends on SYSTEM_BLACKLIST_KEYRING - help - Provide a separate, distinct keyring for platform trusted keys, which - the kernel automatically populates during initialization from values - provided by the platform for verifying the kexec'ed kerned image - and, possibly, the initramfs signature. + bool "Provide keyring for platform/firmware trusted keys" + depends on INTEGRITY_ASYMMETRIC_KEYS + depends on SYSTEM_BLACKLIST_KEYRING + help + Provide a separate, distinct keyring for platform trusted keys, which + the kernel automatically populates during initialization from values + provided by the platform for verifying the kexec'ed kerned image + and, possibly, the initramfs signature. config INTEGRITY_MACHINE_KEYRING bool "Provide a keyring to which Machine Owner Keys may be added" @@ -71,10 +71,10 @@ config INTEGRITY_MACHINE_KEYRING select INTEGRITY_CA_MACHINE_KEYRING if LOAD_PPC_KEYS select INTEGRITY_CA_MACHINE_KEYRING_MAX if LOAD_PPC_KEYS help - If set, provide a keyring to which Machine Owner Keys (MOK) may - be added. This keyring shall contain just MOK keys. Unlike keys - in the platform keyring, keys contained in the .machine keyring will - be trusted within the kernel. + If set, provide a keyring to which Machine Owner Keys (MOK) may + be added. This keyring shall contain just MOK keys. Unlike keys + in the platform keyring, keys contained in the .machine keyring will + be trusted within the kernel. config INTEGRITY_CA_MACHINE_KEYRING bool "Enforce Machine Keyring CA Restrictions" @@ -99,14 +99,14 @@ config INTEGRITY_CA_MACHINE_KEYRING_MAX .platform keyring. config LOAD_UEFI_KEYS - depends on INTEGRITY_PLATFORM_KEYRING - depends on EFI - def_bool y + depends on INTEGRITY_PLATFORM_KEYRING + depends on EFI + def_bool y config LOAD_IPL_KEYS - depends on INTEGRITY_PLATFORM_KEYRING - depends on S390 - def_bool y + depends on INTEGRITY_PLATFORM_KEYRING + depends on S390 + def_bool y config LOAD_PPC_KEYS bool "Enable loading of platform and blacklisted keys for POWER" From b302f360831cb81a9eb525a3e729da5eabe0d0e9 Mon Sep 17 00:00:00 2001 From: Mimi Zohar Date: Sun, 15 Oct 2023 20:18:03 -0400 Subject: [PATCH 368/515] certs: Only allow certs signed by keys on the builtin keyring Originally the secondary trusted keyring provided a keyring to which extra keys may be added, provided those keys were not blacklisted and were vouched for by a key built into the kernel or already in the secondary trusted keyring. On systems with the machine keyring configured, additional keys may also be vouched for by a key on the machine keyring. Prevent loading additional certificates directly onto the secondary keyring, vouched for by keys on the machine keyring, yet allow these certificates to be loaded onto other trusted keyrings. Reviewed-by: Jarkko Sakkinen Signed-off-by: Mimi Zohar --- certs/Kconfig | 16 +++++++++++++++- crypto/asymmetric_keys/restrict.c | 4 ++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/certs/Kconfig b/certs/Kconfig index 1f109b0708778b..62036974367c49 100644 --- a/certs/Kconfig +++ b/certs/Kconfig @@ -88,7 +88,21 @@ config SECONDARY_TRUSTED_KEYRING help If set, provide a keyring to which extra keys may be added, provided those keys are not blacklisted and are vouched for by a key built - into the kernel or already in the secondary trusted keyring. + into the kernel, machine keyring (if configured), or already in the + secondary trusted keyring. + +config SECONDARY_TRUSTED_KEYRING_SIGNED_BY_BUILTIN + bool "Only allow additional certs signed by keys on the builtin trusted keyring" + depends on SECONDARY_TRUSTED_KEYRING + help + If set, only certificates signed by keys on the builtin trusted + keyring may be loaded onto the secondary trusted keyring. + + Note: The machine keyring, if configured, will be linked to the + secondary keyring. When enabling this option, it is recommended + to also configure INTEGRITY_CA_MACHINE_KEYRING_MAX to prevent + linking code signing keys with imputed trust to the secondary + trusted keyring. config SYSTEM_BLACKLIST_KEYRING bool "Provide system-wide ring of blacklisted keys" diff --git a/crypto/asymmetric_keys/restrict.c b/crypto/asymmetric_keys/restrict.c index 6b69ea40da2373..afcd4d101ac550 100644 --- a/crypto/asymmetric_keys/restrict.c +++ b/crypto/asymmetric_keys/restrict.c @@ -102,6 +102,10 @@ int restrict_link_by_signature(struct key *dest_keyring, if (use_builtin_keys && !test_bit(KEY_FLAG_BUILTIN, &key->flags)) ret = -ENOKEY; + else if (IS_BUILTIN(CONFIG_SECONDARY_TRUSTED_KEYRING_SIGNED_BY_BUILTIN) && + !strcmp(dest_keyring->description, ".secondary_trusted_keys") && + !test_bit(KEY_FLAG_BUILTIN, &key->flags)) + ret = -ENOKEY; else ret = verify_signature(key, sig); key_put(key); From dfaf653dc41557548b2e75e6cd837071f7c63289 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Mon, 23 Oct 2023 21:07:59 +0300 Subject: [PATCH 369/515] exportfs: make ->encode_fh() a mandatory method for NFS export export_operations ->encode_fh() no longer has a default implementation to encode FILEID_INO32_GEN* file handles. Rename the default helper for encoding FILEID_INO32_GEN* file handles to generic_encode_ino32_fh() and convert the filesystems that used the default implementation to use the generic helper explicitly. This is a step towards allowing filesystems to encode non-decodeable file handles for fanotify without having to implement any export_operations. Reviewed-by: Jan Kara Reviewed-by: Jeff Layton Acked-by: Chuck Lever Signed-off-by: Amir Goldstein Link: https://lore.kernel.org/r/20231023180801.2953446-3-amir73il@gmail.com Acked-by: Dave Kleikamp Signed-off-by: Christian Brauner --- Documentation/filesystems/nfs/exporting.rst | 7 ++----- Documentation/filesystems/porting.rst | 9 +++++++++ fs/affs/namei.c | 1 + fs/befs/linuxvfs.c | 1 + fs/efs/super.c | 1 + fs/erofs/super.c | 1 + fs/exportfs/expfs.c | 16 +++++++++------- fs/ext2/super.c | 1 + fs/ext4/super.c | 1 + fs/f2fs/super.c | 1 + fs/fat/nfs.c | 1 + fs/jffs2/super.c | 1 + fs/jfs/super.c | 1 + fs/ntfs/namei.c | 1 + fs/ntfs3/super.c | 1 + fs/smb/client/export.c | 11 +++++------ fs/squashfs/export.c | 1 + fs/ufs/super.c | 1 + include/linux/exportfs.h | 9 ++++++++- 19 files changed, 47 insertions(+), 19 deletions(-) diff --git a/Documentation/filesystems/nfs/exporting.rst b/Documentation/filesystems/nfs/exporting.rst index 4b30daee399af7..de64d2d002a204 100644 --- a/Documentation/filesystems/nfs/exporting.rst +++ b/Documentation/filesystems/nfs/exporting.rst @@ -122,12 +122,9 @@ are exportable by setting the s_export_op field in the struct super_block. This field must point to a "struct export_operations" struct which has the following members: - encode_fh (optional) + encode_fh (mandatory) Takes a dentry and creates a filehandle fragment which may later be used - to find or create a dentry for the same object. The default - implementation creates a filehandle fragment that encodes a 32bit inode - and generation number for the inode encoded, and if necessary the - same information for the parent. + to find or create a dentry for the same object. fh_to_dentry (mandatory) Given a filehandle fragment, this should find the implied object and diff --git a/Documentation/filesystems/porting.rst b/Documentation/filesystems/porting.rst index 4d05b9862451ea..9cc6cb27c4d58c 100644 --- a/Documentation/filesystems/porting.rst +++ b/Documentation/filesystems/porting.rst @@ -1045,3 +1045,12 @@ filesystem type is now moved to a later point when the devices are closed: As this is a VFS level change it has no practical consequences for filesystems other than that all of them must use one of the provided kill_litter_super(), kill_anon_super(), or kill_block_super() helpers. + +--- + +**mandatory** + +export_operations ->encode_fh() no longer has a default implementation to +encode FILEID_INO32_GEN* file handles. +Filesystems that used the default implementation may use the generic helper +generic_encode_ino32_fh() explicitly. diff --git a/fs/affs/namei.c b/fs/affs/namei.c index 2fe4a5832fcf47..d6b9758ee23dcb 100644 --- a/fs/affs/namei.c +++ b/fs/affs/namei.c @@ -568,6 +568,7 @@ static struct dentry *affs_fh_to_parent(struct super_block *sb, struct fid *fid, } const struct export_operations affs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = affs_fh_to_dentry, .fh_to_parent = affs_fh_to_parent, .get_parent = affs_get_parent, diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 9a16a51fbb88d4..410dcaffd5ab88 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c @@ -96,6 +96,7 @@ static const struct address_space_operations befs_symlink_aops = { }; static const struct export_operations befs_export_operations = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = befs_fh_to_dentry, .fh_to_parent = befs_fh_to_parent, .get_parent = befs_get_parent, diff --git a/fs/efs/super.c b/fs/efs/super.c index b287f47c165ba8..f17fdac76b2eea 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c @@ -123,6 +123,7 @@ static const struct super_operations efs_superblock_operations = { }; static const struct export_operations efs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = efs_fh_to_dentry, .fh_to_parent = efs_fh_to_parent, .get_parent = efs_get_parent, diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 3700af9ee17332..edbe07a2415627 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -626,6 +626,7 @@ static struct dentry *erofs_get_parent(struct dentry *child) } static const struct export_operations erofs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = erofs_fh_to_dentry, .fh_to_parent = erofs_fh_to_parent, .get_parent = erofs_get_parent, diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index 9ee205df8fa76f..8f883c4758f5fe 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c @@ -343,20 +343,21 @@ static int get_name(const struct path *path, char *name, struct dentry *child) } /** - * export_encode_fh - default export_operations->encode_fh function + * generic_encode_ino32_fh - generic export_operations->encode_fh function * @inode: the object to encode - * @fid: where to store the file handle fragment - * @max_len: maximum length to store there + * @fh: where to store the file handle fragment + * @max_len: maximum length to store there (in 4 byte units) * @parent: parent directory inode, if wanted * - * This default encode_fh function assumes that the 32 inode number + * This generic encode_fh function assumes that the 32 inode number * is suitable for locating an inode, and that the generation number * can be used to check that it is still valid. It places them in the * filehandle fragment where export_decode_fh expects to find them. */ -static int export_encode_fh(struct inode *inode, struct fid *fid, - int *max_len, struct inode *parent) +int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len, + struct inode *parent) { + struct fid *fid = (void *)fh; int len = *max_len; int type = FILEID_INO32_GEN; @@ -380,6 +381,7 @@ static int export_encode_fh(struct inode *inode, struct fid *fid, *max_len = len; return type; } +EXPORT_SYMBOL_GPL(generic_encode_ino32_fh); /** * exportfs_encode_inode_fh - encode a file handle from inode @@ -402,7 +404,7 @@ int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid, if (nop && nop->encode_fh) return nop->encode_fh(inode, fid->raw, max_len, parent); - return export_encode_fh(inode, fid, max_len, parent); + return -EOPNOTSUPP; } EXPORT_SYMBOL_GPL(exportfs_encode_inode_fh); diff --git a/fs/ext2/super.c b/fs/ext2/super.c index aaf3e3e88cb218..b9f158a34997aa 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -397,6 +397,7 @@ static struct dentry *ext2_fh_to_parent(struct super_block *sb, struct fid *fid, } static const struct export_operations ext2_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = ext2_fh_to_dentry, .fh_to_parent = ext2_fh_to_parent, .get_parent = ext2_get_parent, diff --git a/fs/ext4/super.c b/fs/ext4/super.c index dbebd8b3127e51..c44db191543752 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1646,6 +1646,7 @@ static const struct super_operations ext4_sops = { }; static const struct export_operations ext4_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = ext4_fh_to_dentry, .fh_to_parent = ext4_fh_to_parent, .get_parent = ext4_get_parent, diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index a8c8232852bb18..60cfa11f65bf38 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -3282,6 +3282,7 @@ static struct dentry *f2fs_fh_to_parent(struct super_block *sb, struct fid *fid, } static const struct export_operations f2fs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = f2fs_fh_to_dentry, .fh_to_parent = f2fs_fh_to_parent, .get_parent = f2fs_get_parent, diff --git a/fs/fat/nfs.c b/fs/fat/nfs.c index 3626eb585a983e..c52e63e10d35cd 100644 --- a/fs/fat/nfs.c +++ b/fs/fat/nfs.c @@ -279,6 +279,7 @@ static struct dentry *fat_get_parent(struct dentry *child_dir) } const struct export_operations fat_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = fat_fh_to_dentry, .fh_to_parent = fat_fh_to_parent, .get_parent = fat_get_parent, diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index 7ea37f49f1e18e..f99591a634b4dd 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c @@ -150,6 +150,7 @@ static struct dentry *jffs2_get_parent(struct dentry *child) } static const struct export_operations jffs2_export_ops = { + .encode_fh = generic_encode_ino32_fh, .get_parent = jffs2_get_parent, .fh_to_dentry = jffs2_fh_to_dentry, .fh_to_parent = jffs2_fh_to_parent, diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 2e2f7f6d36a09d..2cc2632f3c4792 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c @@ -896,6 +896,7 @@ static const struct super_operations jfs_super_operations = { }; static const struct export_operations jfs_export_operations = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = jfs_fh_to_dentry, .fh_to_parent = jfs_fh_to_parent, .get_parent = jfs_get_parent, diff --git a/fs/ntfs/namei.c b/fs/ntfs/namei.c index ab44f2db533be0..d7498ddc4a7214 100644 --- a/fs/ntfs/namei.c +++ b/fs/ntfs/namei.c @@ -384,6 +384,7 @@ static struct dentry *ntfs_fh_to_parent(struct super_block *sb, struct fid *fid, * and due to using iget() whereas NTFS needs ntfs_iget(). */ const struct export_operations ntfs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .get_parent = ntfs_get_parent, /* Find the parent of a given directory. */ .fh_to_dentry = ntfs_fh_to_dentry, diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index f763e3256ccc1b..9153dffde950c2 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -811,6 +811,7 @@ static int ntfs_nfs_commit_metadata(struct inode *inode) } static const struct export_operations ntfs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = ntfs_fh_to_dentry, .fh_to_parent = ntfs_fh_to_parent, .get_parent = ntfs3_get_parent, diff --git a/fs/smb/client/export.c b/fs/smb/client/export.c index 37c28415df1e02..d606e8cbcb7db2 100644 --- a/fs/smb/client/export.c +++ b/fs/smb/client/export.c @@ -41,13 +41,12 @@ static struct dentry *cifs_get_parent(struct dentry *dentry) } const struct export_operations cifs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .get_parent = cifs_get_parent, -/* Following five export operations are unneeded so far and can default: - .get_dentry = - .get_name = - .find_exported_dentry = - .decode_fh = - .encode_fs = */ +/* + * Following export operations are mandatory for NFS export support: + * .fh_to_dentry = + */ }; #endif /* CONFIG_CIFS_NFSD_EXPORT */ diff --git a/fs/squashfs/export.c b/fs/squashfs/export.c index 723763746238d8..62972f0ff8681c 100644 --- a/fs/squashfs/export.c +++ b/fs/squashfs/export.c @@ -173,6 +173,7 @@ __le64 *squashfs_read_inode_lookup_table(struct super_block *sb, const struct export_operations squashfs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = squashfs_fh_to_dentry, .fh_to_parent = squashfs_fh_to_parent, .get_parent = squashfs_get_parent diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 23377c1baed9e0..a480810cd4e359 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c @@ -137,6 +137,7 @@ static struct dentry *ufs_get_parent(struct dentry *child) } static const struct export_operations ufs_export_ops = { + .encode_fh = generic_encode_ino32_fh, .fh_to_dentry = ufs_fh_to_dentry, .fh_to_parent = ufs_fh_to_parent, .get_parent = ufs_get_parent, diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index 5b3c9f30b422ad..85bd027494e546 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -235,7 +235,7 @@ extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, static inline bool exportfs_can_encode_fid(const struct export_operations *nop) { - return nop; + return nop && nop->encode_fh; } static inline bool exportfs_can_decode_fh(const struct export_operations *nop) @@ -279,6 +279,13 @@ extern struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid, /* * Generic helpers for filesystems. */ +#ifdef CONFIG_EXPORTFS +int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len, + struct inode *parent); +#else +#define generic_encode_ino32_fh NULL +#endif + extern struct dentry *generic_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, int fh_type, struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen)); From 2560fa66d2acfa32fd4f653fa9b5c7fd5df0201e Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Mon, 23 Oct 2023 21:08:00 +0300 Subject: [PATCH 370/515] exportfs: define FILEID_INO64_GEN* file handle types Similar to the common FILEID_INO32* file handle types, define common FILEID_INO64* file handle types. The type values of FILEID_INO64_GEN and FILEID_INO64_GEN_PARENT are the values returned by fuse and xfs for 64bit ino encoded file handle types. Note that these type value are filesystem specific and they do not define a universal file handle format, for example: fuse encodes FILEID_INO64_GEN as [ino-hi32,ino-lo32,gen] and xfs encodes FILEID_INO64_GEN as [hostr-order-ino64,gen] (a.k.a xfs_fid64). The FILEID_INO64_GEN fhandle type is going to be used for file ids for fanotify from filesystems that do not support NFS export. Reviewed-by: Jan Kara Reviewed-by: Jeff Layton Signed-off-by: Amir Goldstein Link: https://lore.kernel.org/r/20231023180801.2953446-4-amir73il@gmail.com Signed-off-by: Christian Brauner --- fs/fuse/inode.c | 7 ++++--- include/linux/exportfs.h | 11 +++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 2e4eb7cf26fb33..e63f966698a5ac 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -1002,7 +1002,7 @@ static int fuse_encode_fh(struct inode *inode, u32 *fh, int *max_len, } *max_len = len; - return parent ? 0x82 : 0x81; + return parent ? FILEID_INO64_GEN_PARENT : FILEID_INO64_GEN; } static struct dentry *fuse_fh_to_dentry(struct super_block *sb, @@ -1010,7 +1010,8 @@ static struct dentry *fuse_fh_to_dentry(struct super_block *sb, { struct fuse_inode_handle handle; - if ((fh_type != 0x81 && fh_type != 0x82) || fh_len < 3) + if ((fh_type != FILEID_INO64_GEN && + fh_type != FILEID_INO64_GEN_PARENT) || fh_len < 3) return NULL; handle.nodeid = (u64) fid->raw[0] << 32; @@ -1024,7 +1025,7 @@ static struct dentry *fuse_fh_to_parent(struct super_block *sb, { struct fuse_inode_handle parent; - if (fh_type != 0x82 || fh_len < 6) + if (fh_type != FILEID_INO64_GEN_PARENT || fh_len < 6) return NULL; parent.nodeid = (u64) fid->raw[3] << 32; diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index 85bd027494e546..4119d3ee72eb18 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -98,6 +98,17 @@ enum fid_type { */ FILEID_FAT_WITH_PARENT = 0x72, + /* + * 64 bit inode number, 32 bit generation number. + */ + FILEID_INO64_GEN = 0x81, + + /* + * 64 bit inode number, 32 bit generation number, + * 64 bit parent inode number, 32 bit parent generation. + */ + FILEID_INO64_GEN_PARENT = 0x82, + /* * 128 bit child FID (struct lu_fid) * 128 bit parent FID (struct lu_fid) From 950f27681add416603f84dd82afdedb9ab85a4d1 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Mon, 23 Oct 2023 21:08:01 +0300 Subject: [PATCH 371/515] exportfs: support encoding non-decodeable file handles by default AT_HANDLE_FID was added as an API for name_to_handle_at() that request the encoding of a file id, which is not intended to be decoded. This file id is used by fanotify to describe objects in events. So far, overlayfs is the only filesystem that supports encoding non-decodeable file ids, by providing export_operations with an ->encode_fh() method and without a ->decode_fh() method. Add support for encoding non-decodeable file ids to all the filesystems that do not provide export_operations, by encoding a file id of type FILEID_INO64_GEN from { i_ino, i_generation }. A filesystem may that does not support NFS export, can opt-out of encoding non-decodeable file ids for fanotify by defining an empty export_operations struct (i.e. with a NULL ->encode_fh() method). This allows the use of fanotify events with file ids on filesystems like 9p which do not support NFS export to bring fanotify in feature parity with inotify on those filesystems. Note that fanotify also requires that the filesystems report a non-null fsid. Currently, many simple filesystems that have support for inotify (e.g. debugfs, tracefs, sysfs) report a null fsid, so can still not be used with fanotify in file id reporting mode. Reviewed-by: Jan Kara Reviewed-by: Jeff Layton Signed-off-by: Amir Goldstein Link: https://lore.kernel.org/r/20231023180801.2953446-5-amir73il@gmail.com Signed-off-by: Christian Brauner --- fs/exportfs/expfs.c | 32 +++++++++++++++++++++++++++++--- include/linux/exportfs.h | 10 +++++++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index 8f883c4758f5fe..7d9fdcc187b73e 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c @@ -383,6 +383,32 @@ int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len, } EXPORT_SYMBOL_GPL(generic_encode_ino32_fh); +#define FILEID_INO64_GEN_LEN 3 + +/** + * exportfs_encode_ino64_fid - encode non-decodeable 64bit ino file id + * @inode: the object to encode + * @fid: where to store the file handle fragment + * @max_len: maximum length to store there (in 4 byte units) + * + * This generic function is used to encode a non-decodeable file id for + * fanotify for filesystems that do not support NFS export. + */ +static int exportfs_encode_ino64_fid(struct inode *inode, struct fid *fid, + int *max_len) +{ + if (*max_len < FILEID_INO64_GEN_LEN) { + *max_len = FILEID_INO64_GEN_LEN; + return FILEID_INVALID; + } + + fid->i64.ino = inode->i_ino; + fid->i64.gen = inode->i_generation; + *max_len = FILEID_INO64_GEN_LEN; + + return FILEID_INO64_GEN; +} + /** * exportfs_encode_inode_fh - encode a file handle from inode * @inode: the object to encode @@ -401,10 +427,10 @@ int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid, if (!exportfs_can_encode_fh(nop, flags)) return -EOPNOTSUPP; - if (nop && nop->encode_fh) - return nop->encode_fh(inode, fid->raw, max_len, parent); + if (!nop && (flags & EXPORT_FH_FID)) + return exportfs_encode_ino64_fid(inode, fid, max_len); - return -EOPNOTSUPP; + return nop->encode_fh(inode, fid->raw, max_len, parent); } EXPORT_SYMBOL_GPL(exportfs_encode_inode_fh); diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index 4119d3ee72eb18..21bae8bfeef11a 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -134,7 +134,11 @@ struct fid { u32 parent_ino; u32 parent_gen; } i32; - struct { + struct { + u64 ino; + u32 gen; + } __packed i64; + struct { u32 block; u16 partref; u16 parent_partref; @@ -246,7 +250,7 @@ extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, static inline bool exportfs_can_encode_fid(const struct export_operations *nop) { - return nop && nop->encode_fh; + return !nop || nop->encode_fh; } static inline bool exportfs_can_decode_fh(const struct export_operations *nop) @@ -259,7 +263,7 @@ static inline bool exportfs_can_encode_fh(const struct export_operations *nop, { /* * If a non-decodeable file handle was requested, we only need to make - * sure that filesystem can encode file handles. + * sure that filesystem did not opt-out of encoding fid. */ if (fh_flags & EXPORT_FH_FID) return exportfs_can_encode_fid(nop); From 14673976a6584b1b04d1956f1c8d271cfeb8bb8c Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Mon, 23 Oct 2023 17:30:49 +0300 Subject: [PATCH 372/515] fs: report f_fsid from s_dev for "simple" filesystems There are many "simple" filesystems (*) that report null f_fsid in statfs(2). Those "simple" filesystems report sb->s_dev as the st_dev field of the stat syscalls for all inodes of the filesystem (**). In order to enable fanotify reporting of events with fsid on those "simple" filesystems, report the sb->s_dev number in f_fsid field of statfs(2). (*) For most of the "simple" filesystem refered to in this commit, the ->statfs() operation is simple_statfs(). Some of those fs assign the simple_statfs() method directly in their ->s_op struct and some assign it indirectly via a call to simple_fill_super() or to pseudo_fs_fill_super() with either custom or "simple" s_op. We also make the same change to efivarfs and hugetlbfs, although they do not use simple_statfs(), because they use the simple_* inode opreations (e.g. simple_lookup()). (**) For most of the "simple" filesystems, the ->getattr() method is not assigned, so stat() is implemented by generic_fillattr(). A few "simple" filesystem use the simple_getattr() method which also calls generic_fillattr() to fill most of the stat struct. The two exceptions are procfs and 9p. procfs implements several different ->getattr() methods, but they all end up calling generic_fillattr() to fill the st_dev field from sb->s_dev. 9p has more complicated ->getattr() methods, but they too, end up calling generic_fillattr() to fill the st_dev field from sb->s_dev. Note that 9p and kernfs also call simple_statfs() from custom ->statfs() methods which already fill the f_fsid field, but v9fs_statfs() calls simple_statfs() only in case f_fsid was not filled and kenrfs_statfs() overwrites f_fsid after calling simple_statfs(). Link: https://lore.kernel.org/r/20230919094820.g5bwharbmy2dq46w@quack3/ Signed-off-by: Amir Goldstein Link: https://lore.kernel.org/r/20231023143049.2944970-1-amir73il@gmail.com Reviewed-by: Jan Kara Signed-off-by: Christian Brauner --- fs/efivarfs/super.c | 2 ++ fs/hugetlbfs/inode.c | 2 ++ fs/libfs.c | 3 +++ 3 files changed, 7 insertions(+) diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c index 996271473609a0..2933090ad11f2a 100644 --- a/fs/efivarfs/super.c +++ b/fs/efivarfs/super.c @@ -30,6 +30,7 @@ static int efivarfs_statfs(struct dentry *dentry, struct kstatfs *buf) EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS; u64 storage_space, remaining_space, max_variable_size; + u64 id = huge_encode_dev(dentry->d_sb->s_dev); efi_status_t status; /* Some UEFI firmware does not implement QueryVariableInfo() */ @@ -53,6 +54,7 @@ static int efivarfs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_blocks = storage_space; buf->f_bfree = remaining_space; buf->f_type = dentry->d_sb->s_magic; + buf->f_fsid = u64_to_fsid(id); /* * In f_bavail we declare the free space that the kernel will allow writing diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 316c4cebd3f3de..c003a27be6fe55 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -1204,7 +1204,9 @@ static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf) { struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(dentry->d_sb); struct hstate *h = hstate_inode(d_inode(dentry)); + u64 id = huge_encode_dev(dentry->d_sb->s_dev); + buf->f_fsid = u64_to_fsid(id); buf->f_type = HUGETLBFS_MAGIC; buf->f_bsize = huge_page_size(h); if (sbinfo) { diff --git a/fs/libfs.c b/fs/libfs.c index 37f2d34ee090bd..8117b24b929dbd 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -41,6 +41,9 @@ EXPORT_SYMBOL(simple_getattr); int simple_statfs(struct dentry *dentry, struct kstatfs *buf) { + u64 id = huge_encode_dev(dentry->d_sb->s_dev); + + buf->f_fsid = u64_to_fsid(id); buf->f_type = dentry->d_sb->s_magic; buf->f_bsize = PAGE_SIZE; buf->f_namelen = NAME_MAX; From 3fa702baa02c30e9d90b2a2de72f87296a60008a Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 23 Oct 2023 16:26:23 -0700 Subject: [PATCH 373/515] Bluetooth: Fix not notifying when connection encryption changes Some layers such as SMP depend on getting notified about encryption changes immediately as they only allow certain PDU to be transmitted over an encrypted link which may cause SMP implementation to reject valid PDUs received thus causing pairing to fail when it shouldn't. Fixes: 7aca0ac4792e ("Bluetooth: Wait for HCI_OP_WRITE_AUTH_PAYLOAD_TO to complete") Signed-off-by: Luiz Augusto von Dentz --- net/bluetooth/hci_event.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 0849e0dafa951c..5b6fd625fc09c2 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -820,8 +820,6 @@ static u8 hci_cc_write_auth_payload_timeout(struct hci_dev *hdev, void *data, if (!rp->status) conn->auth_payload_timeout = get_unaligned_le16(sent + 2); - hci_encrypt_cfm(conn, 0); - unlock: hci_dev_unlock(hdev); @@ -3683,12 +3681,8 @@ static void hci_encrypt_change_evt(struct hci_dev *hdev, void *data, cp.handle = cpu_to_le16(conn->handle); cp.timeout = cpu_to_le16(hdev->auth_payload_timeout); if (hci_send_cmd(conn->hdev, HCI_OP_WRITE_AUTH_PAYLOAD_TO, - sizeof(cp), &cp)) { + sizeof(cp), &cp)) bt_dev_err(hdev, "write auth payload timeout failed"); - goto notify; - } - - goto unlock; } notify: From 0783375f2c56ca17719d5ec670e498dc661ea5c3 Mon Sep 17 00:00:00 2001 From: Iulia Tanasescu Date: Tue, 24 Oct 2023 13:57:35 +0300 Subject: [PATCH 374/515] Bluetooth: ISO: Allow binding a PA sync socket This makes it possible to bind a PA sync socket to a number of BISes before issuing the BIG Create Sync command. Signed-off-by: Iulia Tanasescu Signed-off-by: Luiz Augusto von Dentz --- net/bluetooth/iso.c | 67 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c index 07b80e97aead5d..e01b6abe36fbc7 100644 --- a/net/bluetooth/iso.c +++ b/net/bluetooth/iso.c @@ -792,27 +792,75 @@ static int iso_sock_bind_bc(struct socket *sock, struct sockaddr *addr, BT_DBG("sk %p bc_sid %u bc_num_bis %u", sk, sa->iso_bc->bc_sid, sa->iso_bc->bc_num_bis); - if (addr_len > sizeof(*sa) + sizeof(*sa->iso_bc)) + if (addr_len != sizeof(*sa) + sizeof(*sa->iso_bc)) return -EINVAL; bacpy(&iso_pi(sk)->dst, &sa->iso_bc->bc_bdaddr); + + /* Check if the address type is of LE type */ + if (!bdaddr_type_is_le(sa->iso_bc->bc_bdaddr_type)) + return -EINVAL; + iso_pi(sk)->dst_type = sa->iso_bc->bc_bdaddr_type; iso_pi(sk)->sync_handle = -1; + + if (sa->iso_bc->bc_sid > 0x0f) + return -EINVAL; + iso_pi(sk)->bc_sid = sa->iso_bc->bc_sid; + + if (sa->iso_bc->bc_num_bis > ISO_MAX_NUM_BIS) + return -EINVAL; + iso_pi(sk)->bc_num_bis = sa->iso_bc->bc_num_bis; - for (i = 0; i < iso_pi(sk)->bc_num_bis; i++) { + for (i = 0; i < iso_pi(sk)->bc_num_bis; i++) if (sa->iso_bc->bc_bis[i] < 0x01 || sa->iso_bc->bc_bis[i] > 0x1f) return -EINVAL; - memcpy(iso_pi(sk)->bc_bis, sa->iso_bc->bc_bis, - iso_pi(sk)->bc_num_bis); - } + memcpy(iso_pi(sk)->bc_bis, sa->iso_bc->bc_bis, + iso_pi(sk)->bc_num_bis); return 0; } +static int iso_sock_bind_pa_sk(struct sock *sk, struct sockaddr_iso *sa, + int addr_len) +{ + int err = 0; + + if (sk->sk_type != SOCK_SEQPACKET) { + err = -EINVAL; + goto done; + } + + if (addr_len != sizeof(*sa) + sizeof(*sa->iso_bc)) { + err = -EINVAL; + goto done; + } + + if (sa->iso_bc->bc_num_bis > ISO_MAX_NUM_BIS) { + err = -EINVAL; + goto done; + } + + iso_pi(sk)->bc_num_bis = sa->iso_bc->bc_num_bis; + + for (int i = 0; i < iso_pi(sk)->bc_num_bis; i++) + if (sa->iso_bc->bc_bis[i] < 0x01 || + sa->iso_bc->bc_bis[i] > 0x1f) { + err = -EINVAL; + goto done; + } + + memcpy(iso_pi(sk)->bc_bis, sa->iso_bc->bc_bis, + iso_pi(sk)->bc_num_bis); + +done: + return err; +} + static int iso_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) { @@ -828,6 +876,15 @@ static int iso_sock_bind(struct socket *sock, struct sockaddr *addr, lock_sock(sk); + /* Allow the user to bind a PA sync socket to a number + * of BISes to sync to. + */ + if (sk->sk_state == BT_CONNECT2 && + test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) { + err = iso_sock_bind_pa_sk(sk, sa, addr_len); + goto done; + } + if (sk->sk_state != BT_OPEN) { err = -EBADFD; goto done; From a09560a7b160381234a6f3a37a74968f9c75f666 Mon Sep 17 00:00:00 2001 From: Minda Chen Date: Wed, 2 Aug 2023 14:42:15 +0800 Subject: [PATCH 375/515] riscv: Using TOOLCHAIN_HAS_ZIHINTPAUSE marco replace zihintpause Actually it is a part of Conor's commit aae538cd03bc ("riscv: fix detection of toolchain Zihintpause support"). It is looks like a merge issue. Samuel's commit 0b1d60d6dd9e ("riscv: Fix build with CONFIG_CC_OPTIMIZE_FOR_SIZE=y") do not base on Conor's commit and revert to __riscv_zihintpause. So this patch can fix it. Signed-off-by: Minda Chen Fixes: 3c349eacc559 ("Merge patch "riscv: Fix build with CONFIG_CC_OPTIMIZE_FOR_SIZE=y"") Reviewed-by: Conor Dooley Link: https://lore.kernel.org/r/20230802064215.31111-1-minda.chen@starfivetech.com Cc: stable@vger.kernel.org Signed-off-by: Palmer Dabbelt --- arch/riscv/include/asm/vdso/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/riscv/include/asm/vdso/processor.h b/arch/riscv/include/asm/vdso/processor.h index 14f5d27783b858..96b65a5396dfcf 100644 --- a/arch/riscv/include/asm/vdso/processor.h +++ b/arch/riscv/include/asm/vdso/processor.h @@ -14,7 +14,7 @@ static inline void cpu_relax(void) __asm__ __volatile__ ("div %0, %0, zero" : "=r" (dummy)); #endif -#ifdef __riscv_zihintpause +#ifdef CONFIG_TOOLCHAIN_HAS_ZIHINTPAUSE /* * Reduce instruction retirement. * This assumes the PC changes. From d42469b616b1efe8bf57ddddefb7405a050deca0 Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Wed, 9 Aug 2023 11:10:23 +0800 Subject: [PATCH 376/515] riscv: mm: Update the comment of CONFIG_PAGE_OFFSET Since the commit 011f09d12052 set sv57 as default for CONFIG_64BIT, the comment of CONFIG_PAGE_OFFSET should be updated too. Fixes: 011f09d12052 ("riscv: mm: Set sv57 on defaultly") Signed-off-by: Song Shuai Link: https://lore.kernel.org/r/20230809031023.3575407-1-songshuaishuai@tinylab.org Cc: stable@vger.kernel.org Signed-off-by: Palmer Dabbelt --- arch/riscv/include/asm/page.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h index 5488ecc337b63f..57e887bfa34cb7 100644 --- a/arch/riscv/include/asm/page.h +++ b/arch/riscv/include/asm/page.h @@ -33,8 +33,8 @@ #define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) #endif /* - * By default, CONFIG_PAGE_OFFSET value corresponds to SV48 address space so - * define the PAGE_OFFSET value for SV39. + * By default, CONFIG_PAGE_OFFSET value corresponds to SV57 address space so + * define the PAGE_OFFSET value for SV48 and SV39. */ #define PAGE_OFFSET_L4 _AC(0xffffaf8000000000, UL) #define PAGE_OFFSET_L3 _AC(0xffffffd800000000, UL) From f6b2345eebbdebf278edcc9b58ca59ece7f86cd0 Mon Sep 17 00:00:00 2001 From: Nam Cao Date: Mon, 21 Aug 2023 16:57:09 +0200 Subject: [PATCH 377/515] riscv: put interrupt entries into .irqentry.text The interrupt entries are expected to be in the .irqentry.text section. For example, for kprobes to work properly, exception code cannot be probed; this is ensured by blacklisting addresses in the .irqentry.text section. Fixes: 7db91e57a0ac ("RISC-V: Task implementation") Signed-off-by: Nam Cao Link: https://lore.kernel.org/r/20230821145708.21270-1-namcaov@gmail.com Cc: stable@vger.kernel.org Signed-off-by: Palmer Dabbelt --- arch/riscv/kernel/entry.S | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S index 143a2bb3e69760..d7dd9030df3f88 100644 --- a/arch/riscv/kernel/entry.S +++ b/arch/riscv/kernel/entry.S @@ -14,6 +14,8 @@ #include #include + .section .irqentry.text, "ax" + SYM_CODE_START(handle_exception) /* * If coming from userspace, preserve the user thread pointer and load From 12606ba1d46b34a241eb3d0956727e5379f0f626 Mon Sep 17 00:00:00 2001 From: Manivannan Sadhasivam Date: Fri, 1 Sep 2023 13:05:02 +0530 Subject: [PATCH 378/515] bus: mhi: ep: Do not allocate event ring element on stack It is possible that the host controller driver would use DMA framework to write the event ring element. So avoid allocating event ring element on the stack as DMA cannot work on vmalloc memory. Cc: stable@vger.kernel.org Fixes: 961aeb689224 ("bus: mhi: ep: Add support for sending events to the host") Link: https://lore.kernel.org/r/20230901073502.69385-1-manivannan.sadhasivam@linaro.org Signed-off-by: Manivannan Sadhasivam --- drivers/bus/mhi/ep/main.c | 68 ++++++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/drivers/bus/mhi/ep/main.c b/drivers/bus/mhi/ep/main.c index 600881808982aa..e2513f5f47a617 100644 --- a/drivers/bus/mhi/ep/main.c +++ b/drivers/bus/mhi/ep/main.c @@ -71,45 +71,77 @@ static int mhi_ep_send_event(struct mhi_ep_cntrl *mhi_cntrl, u32 ring_idx, static int mhi_ep_send_completion_event(struct mhi_ep_cntrl *mhi_cntrl, struct mhi_ep_ring *ring, struct mhi_ring_element *tre, u32 len, enum mhi_ev_ccs code) { - struct mhi_ring_element event = {}; + struct mhi_ring_element *event; + int ret; + + event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL); + if (!event) + return -ENOMEM; - event.ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(*tre)); - event.dword[0] = MHI_TRE_EV_DWORD0(code, len); - event.dword[1] = MHI_TRE_EV_DWORD1(ring->ch_id, MHI_PKT_TYPE_TX_EVENT); + event->ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(*tre)); + event->dword[0] = MHI_TRE_EV_DWORD0(code, len); + event->dword[1] = MHI_TRE_EV_DWORD1(ring->ch_id, MHI_PKT_TYPE_TX_EVENT); - return mhi_ep_send_event(mhi_cntrl, ring->er_index, &event, MHI_TRE_DATA_GET_BEI(tre)); + ret = mhi_ep_send_event(mhi_cntrl, ring->er_index, event, MHI_TRE_DATA_GET_BEI(tre)); + kfree(event); + + return ret; } int mhi_ep_send_state_change_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_state state) { - struct mhi_ring_element event = {}; + struct mhi_ring_element *event; + int ret; + + event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL); + if (!event) + return -ENOMEM; - event.dword[0] = MHI_SC_EV_DWORD0(state); - event.dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_STATE_CHANGE_EVENT); + event->dword[0] = MHI_SC_EV_DWORD0(state); + event->dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_STATE_CHANGE_EVENT); - return mhi_ep_send_event(mhi_cntrl, 0, &event, 0); + ret = mhi_ep_send_event(mhi_cntrl, 0, event, 0); + kfree(event); + + return ret; } int mhi_ep_send_ee_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_ee_type exec_env) { - struct mhi_ring_element event = {}; + struct mhi_ring_element *event; + int ret; + + event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL); + if (!event) + return -ENOMEM; - event.dword[0] = MHI_EE_EV_DWORD0(exec_env); - event.dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_EE_EVENT); + event->dword[0] = MHI_EE_EV_DWORD0(exec_env); + event->dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_EE_EVENT); - return mhi_ep_send_event(mhi_cntrl, 0, &event, 0); + ret = mhi_ep_send_event(mhi_cntrl, 0, event, 0); + kfree(event); + + return ret; } static int mhi_ep_send_cmd_comp_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_ev_ccs code) { struct mhi_ep_ring *ring = &mhi_cntrl->mhi_cmd->ring; - struct mhi_ring_element event = {}; + struct mhi_ring_element *event; + int ret; + + event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL); + if (!event) + return -ENOMEM; - event.ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(struct mhi_ring_element)); - event.dword[0] = MHI_CC_EV_DWORD0(code); - event.dword[1] = MHI_CC_EV_DWORD1(MHI_PKT_TYPE_CMD_COMPLETION_EVENT); + event->ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(struct mhi_ring_element)); + event->dword[0] = MHI_CC_EV_DWORD0(code); + event->dword[1] = MHI_CC_EV_DWORD1(MHI_PKT_TYPE_CMD_COMPLETION_EVENT); - return mhi_ep_send_event(mhi_cntrl, 0, &event, 0); + ret = mhi_ep_send_event(mhi_cntrl, 0, event, 0); + kfree(event); + + return ret; } static int mhi_ep_process_cmd_ring(struct mhi_ep_ring *ring, struct mhi_ring_element *el) From fa55e63584f2c3c84e0c3acdace42544e1832cc2 Mon Sep 17 00:00:00 2001 From: Vegard Nossum Date: Sun, 22 Oct 2023 20:58:06 +0200 Subject: [PATCH 379/515] Documentation: coresight: fix `make refcheckdocs` warning This reference uses a glob pattern to match multiple files, but the asterisk was escaped as \* in order to not be interpreted by sphinx as reStructuredText markup. refcheckdocs/documentation-file-ref-check doesn't know about rST syntax and tries to interpret the \* literally (instead of as a glob). We can work around the warning by putting the Documentation reference inside double backticks (``..``), which allows us to not escape the asterisk. Fixes: c06475910b52 ("Documentation: coresight: Escape coresight bindings file wildcard") Cc: Mathieu Poirier Cc: Suzuki K Poulose Cc: Mike Leach Cc: Leo Yan Cc: Jonathan Corbet Cc: Rob Herring Cc: coresight@lists.linaro.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-next@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: Stephen Rothwell Cc: Bagas Sanjaya Signed-off-by: Vegard Nossum Reviewed-by: Bagas Sanjaya Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20231022185806.919434-1-vegard.nossum@oracle.com --- Documentation/trace/coresight/coresight.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/trace/coresight/coresight.rst b/Documentation/trace/coresight/coresight.rst index ce55adb80b82df..d4f93d6a2d6335 100644 --- a/Documentation/trace/coresight/coresight.rst +++ b/Documentation/trace/coresight/coresight.rst @@ -130,7 +130,7 @@ Misc: Device Tree Bindings -------------------- -See Documentation/devicetree/bindings/arm/arm,coresight-\*.yaml for details. +See ``Documentation/devicetree/bindings/arm/arm,coresight-*.yaml`` for details. As of this writing drivers for ITM, STMs and CTIs are not provided but are expected to be added as the solution matures. From 6aa2f7738c6d35474f588b3c8951129b1788663a Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 13 Oct 2023 19:20:02 +0200 Subject: [PATCH 380/515] cpufreq: qcom-nvmem: add support for IPQ8074 IPQ8074 comes in 3 families: * IPQ8070A/IPQ8071A (Acorn) up to 1.4GHz * IPQ8172/IPQ8173/IPQ8174 (Oak) up to 1.4GHz * IPQ8072A/IPQ8074A/IPQ8076A/IPQ8078A (Hawkeye) up to 2.2GHz So, in order to be able to share one OPP table lets add support for IPQ8074 family based of SMEM SoC ID-s as speedbin fuse is always 0 on IPQ8074. IPQ8074 compatible is blacklisted from DT platdev as the cpufreq device will get created by NVMEM CPUFreq driver. Signed-off-by: Robert Marko Acked-by: Konrad Dybcio [ Viresh: Fixed rebase conflict. ] Signed-off-by: Viresh Kumar --- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + drivers/cpufreq/qcom-cpufreq-nvmem.c | 48 ++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c index 11b3e34b76961e..07181913448f46 100644 --- a/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c @@ -182,6 +182,7 @@ static const struct of_device_id blocklist[] __initconst = { { .compatible = "qcom,ipq6018", }, { .compatible = "qcom,ipq8064", }, + { .compatible = "qcom,ipq8074", }, { .compatible = "qcom,apq8064", }, { .compatible = "qcom,msm8974", }, { .compatible = "qcom,msm8960", }, diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c index 15367ac08b2b8c..158c0e139185fe 100644 --- a/drivers/cpufreq/qcom-cpufreq-nvmem.c +++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c @@ -38,6 +38,11 @@ enum ipq806x_versions { #define IPQ6000_VERSION BIT(2) +enum ipq8074_versions { + IPQ8074_HAWKEYE_VERSION = 0, + IPQ8074_ACORN_VERSION, +}; + struct qcom_cpufreq_drv; struct qcom_cpufreq_match_data { @@ -338,6 +343,44 @@ static int qcom_cpufreq_ipq6018_name_version(struct device *cpu_dev, return 0; } +static int qcom_cpufreq_ipq8074_name_version(struct device *cpu_dev, + struct nvmem_cell *speedbin_nvmem, + char **pvs_name, + struct qcom_cpufreq_drv *drv) +{ + u32 msm_id; + int ret; + *pvs_name = NULL; + + ret = qcom_smem_get_soc_id(&msm_id); + if (ret) + return ret; + + switch (msm_id) { + case QCOM_ID_IPQ8070A: + case QCOM_ID_IPQ8071A: + case QCOM_ID_IPQ8172: + case QCOM_ID_IPQ8173: + case QCOM_ID_IPQ8174: + drv->versions = BIT(IPQ8074_ACORN_VERSION); + break; + case QCOM_ID_IPQ8072A: + case QCOM_ID_IPQ8074A: + case QCOM_ID_IPQ8076A: + case QCOM_ID_IPQ8078A: + drv->versions = BIT(IPQ8074_HAWKEYE_VERSION); + break; + default: + dev_err(cpu_dev, + "SoC ID %u is not part of IPQ8074 family, limiting to 1.4GHz!\n", + msm_id); + drv->versions = BIT(IPQ8074_ACORN_VERSION); + break; + } + + return 0; +} + static const char *generic_genpd_names[] = { "perf", NULL }; static const struct qcom_cpufreq_match_data match_data_kryo = { @@ -367,6 +410,10 @@ static const struct qcom_cpufreq_match_data match_data_ipq8064 = { .get_version = qcom_cpufreq_ipq8064_name_version, }; +static const struct qcom_cpufreq_match_data match_data_ipq8074 = { + .get_version = qcom_cpufreq_ipq8074_name_version, +}; + static int qcom_cpufreq_probe(struct platform_device *pdev) { struct qcom_cpufreq_drv *drv; @@ -496,6 +543,7 @@ static const struct of_device_id qcom_cpufreq_match_list[] __initconst = { { .compatible = "qcom,qcs404", .data = &match_data_qcs404 }, { .compatible = "qcom,ipq6018", .data = &match_data_ipq6018 }, { .compatible = "qcom,ipq8064", .data = &match_data_ipq8064 }, + { .compatible = "qcom,ipq8074", .data = &match_data_ipq8074 }, { .compatible = "qcom,apq8064", .data = &match_data_krait }, { .compatible = "qcom,msm8974", .data = &match_data_krait }, { .compatible = "qcom,msm8960", .data = &match_data_krait }, From 8b7fb96f861c17443b7e3a5c256897b72d4c205f Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Thu, 19 Oct 2023 18:57:23 +0200 Subject: [PATCH 381/515] dt-bindings: mfd: rk8xx: Deprecate rockchip,system-power-controller Deprecate support for this property in favor of standard system-power-controller one. Signed-off-by: Ondrej Jirman Reviewed-by: Rob Herring Reviewed-by: Sebastian Reichel Link: https://lore.kernel.org/r/20231019165732.3818789-2-megi@xff.cz Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml | 3 +++ Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml | 3 +++ Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml | 3 +++ Documentation/devicetree/bindings/mfd/rockchip,rk817.yaml | 3 +++ Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml | 3 +++ 5 files changed, 15 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml index af6cd1969c226f..44f8188360dd42 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml @@ -42,9 +42,12 @@ properties: rockchip,system-power-controller: type: boolean + deprecated: true description: Telling whether or not this PMIC is controlling the system power. + system-power-controller: true + wakeup-source: type: boolean description: diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml index 8a16d651c2a310..d2ac6fbd5ce698 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml @@ -37,9 +37,12 @@ properties: rockchip,system-power-controller: type: boolean + deprecated: true description: Telling whether or not this PMIC is controlling the system power. + system-power-controller: true + wakeup-source: type: boolean description: diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml index e922e0176ee7fa..839c0521f1e530 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk809.yaml @@ -37,9 +37,12 @@ properties: rockchip,system-power-controller: type: boolean + deprecated: true description: Telling whether or not this PMIC is controlling the system power. + system-power-controller: true + wakeup-source: type: boolean description: diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk817.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk817.yaml index 269fb85b20278c..92b1592e89422e 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk817.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk817.yaml @@ -38,9 +38,12 @@ properties: rockchip,system-power-controller: type: boolean + deprecated: true description: Telling whether or not this PMIC is controlling the system power. + system-power-controller: true + wakeup-source: type: boolean description: diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml index ee5bca6e75dfac..fd4b9de364aa91 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml @@ -37,9 +37,12 @@ properties: rockchip,system-power-controller: type: boolean + deprecated: true description: Telling whether or not this PMIC is controlling the system power. + system-power-controller: true + wakeup-source: type: boolean description: From 517dbecfeafa52c8ada4bd3585d9e8b005f7e542 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Thu, 19 Oct 2023 18:57:24 +0200 Subject: [PATCH 382/515] dt-bindings: mfd: rk806: Allow system-power-controller property Declare support for this property. Signed-off-by: Ondrej Jirman Reviewed-by: Rob Herring Reviewed-by: Sebastian Reichel Link: https://lore.kernel.org/r/20231019165732.3818789-3-megi@xff.cz Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/rockchip,rk806.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/rockchip,rk806.yaml b/Documentation/devicetree/bindings/mfd/rockchip,rk806.yaml index cf2500f2e9a0d9..3c2b06629b75ea 100644 --- a/Documentation/devicetree/bindings/mfd/rockchip,rk806.yaml +++ b/Documentation/devicetree/bindings/mfd/rockchip,rk806.yaml @@ -29,6 +29,8 @@ properties: '#gpio-cells': const: 2 + system-power-controller: true + vcc1-supply: description: The input supply for dcdc-reg1. From 4be7cc6f62beb8a56c2c8f9748a7e345a645c914 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Thu, 19 Oct 2023 18:57:25 +0200 Subject: [PATCH 383/515] mfd: rk8xx: Add support for standard system-power-controller property DT property rockchip,system-power-controller is now deprecated. Signed-off-by: Ondrej Jirman Reviewed-by: Sebastian Reichel Link: https://lore.kernel.org/r/20231019165732.3818789-4-megi@xff.cz Signed-off-by: Lee Jones --- drivers/mfd/rk8xx-core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/mfd/rk8xx-core.c b/drivers/mfd/rk8xx-core.c index 11a831e92da83a..a50a181b18e9af 100644 --- a/drivers/mfd/rk8xx-core.c +++ b/drivers/mfd/rk8xx-core.c @@ -685,7 +685,8 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap if (ret) return dev_err_probe(dev, ret, "failed to add MFD devices\n"); - if (device_property_read_bool(dev, "rockchip,system-power-controller")) { + if (device_property_read_bool(dev, "rockchip,system-power-controller") || + device_property_read_bool(dev, "system-power-controller")) { ret = devm_register_sys_off_handler(dev, SYS_OFF_MODE_POWER_OFF_PREPARE, SYS_OFF_PRIO_HIGH, &rk808_power_off, rk808); From 8dc3aab3c45eb0fba9202d2d6ad628cc7b59c17d Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Thu, 19 Oct 2023 18:57:26 +0200 Subject: [PATCH 384/515] mfd: rk8xx: Add support for RK806 power off Use DEV_OFF bit to power off the RK806 PMIC, when system-power-controller is used in DTS. Signed-off-by: Ondrej Jirman Reviewed-by: Sebastian Reichel Link: https://lore.kernel.org/r/20231019165732.3818789-5-megi@xff.cz Signed-off-by: Lee Jones --- drivers/mfd/rk8xx-core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/mfd/rk8xx-core.c b/drivers/mfd/rk8xx-core.c index a50a181b18e9af..c47164a3ec1da3 100644 --- a/drivers/mfd/rk8xx-core.c +++ b/drivers/mfd/rk8xx-core.c @@ -525,6 +525,10 @@ static int rk808_power_off(struct sys_off_data *data) reg = RK805_DEV_CTRL_REG; bit = DEV_OFF; break; + case RK806_ID: + reg = RK806_SYS_CFG3; + bit = DEV_OFF; + break; case RK808_ID: reg = RK808_DEVCTRL_REG, bit = DEV_OFF_RST; From 13f0ccb77e98cc82c04db2c5fab984865666285e Mon Sep 17 00:00:00 2001 From: Su Hui Date: Fri, 20 Oct 2023 17:19:31 +0800 Subject: [PATCH 385/515] leds: lp5521: Add an error check in lp5521_post_init_device lp55xx_write() can return an error code, add a check for this. Signed-off-by: Su Hui Link: https://lore.kernel.org/r/20231020091930.207870-1-suhui@nfschina.com Signed-off-by: Lee Jones --- drivers/leds/leds-lp5521.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/leds/leds-lp5521.c b/drivers/leds/leds-lp5521.c index 2ef19ad23b1d5f..f9c8b568b65254 100644 --- a/drivers/leds/leds-lp5521.c +++ b/drivers/leds/leds-lp5521.c @@ -301,6 +301,8 @@ static int lp5521_post_init_device(struct lp55xx_chip *chip) /* Set all PWMs to direct control mode */ ret = lp55xx_write(chip, LP5521_REG_OP_MODE, LP5521_CMD_DIRECT); + if (ret) + return ret; /* Update configuration for the clock setting */ val = LP5521_DEFAULT_CFG; From 2bad5bd2552a34b27dce2bbc3ab1bb50d85f5869 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Fri, 20 Oct 2023 09:22:51 -0500 Subject: [PATCH 386/515] dt-bindings: mfd: armltd: Move Arm board syscon's to separate schema The Arm Ltd board bindings are a bit unusual in that they define child nodes for various syscon's. The schemas are also incomplete as they lack constraints on having additional properties and some properties are missing. As the bindings for the different platforms only vary by compatibles, combine them into a single schema doc. Add the "arm,im-pd1-syscon" compatible which was not documented. Add "ranges", "#address-cells", and "#size-cells properties which were missing. With this, fix the error exposed in the register-bit-led binding. Signed-off-by: Rob Herring Reviewed-by: Linus Walleij Reviewed-by: Conor Dooley Link: https://lore.kernel.org/r/20231020142252.3113716-2-robh@kernel.org Signed-off-by: Lee Jones --- .../bindings/arm/arm,integrator.yaml | 39 ----------- .../devicetree/bindings/arm/arm,realview.yaml | 37 ---------- .../bindings/arm/arm,versatile.yaml | 40 +++-------- .../bindings/leds/register-bit-led.yaml | 2 +- .../mfd/arm,dev-platforms-syscon.yaml | 67 +++++++++++++++++++ 5 files changed, 76 insertions(+), 109 deletions(-) create mode 100644 Documentation/devicetree/bindings/mfd/arm,dev-platforms-syscon.yaml diff --git a/Documentation/devicetree/bindings/arm/arm,integrator.yaml b/Documentation/devicetree/bindings/arm/arm,integrator.yaml index 98ff5698ae1f1f..1bdbd1b7ee3815 100644 --- a/Documentation/devicetree/bindings/arm/arm,integrator.yaml +++ b/Documentation/devicetree/bindings/arm/arm,integrator.yaml @@ -40,45 +40,6 @@ properties: items: - const: arm,integrator-sp - core-module@10000000: - type: object - description: the root node in the Integrator platforms must contain - a core module child node. They are always at physical address - 0x10000000 in all the Integrator variants. - properties: - compatible: - items: - - const: arm,core-module-integrator - - const: syscon - - const: simple-mfd - reg: - maxItems: 1 - - required: - - compatible - - reg - -patternProperties: - "^syscon@[0-9a-f]+$": - description: All Integrator boards must provide a system controller as a - node in the root of the device tree. - type: object - properties: - compatible: - items: - - enum: - - arm,integrator-ap-syscon - - arm,integrator-cp-syscon - - arm,integrator-sp-syscon - - const: syscon - reg: - maxItems: 1 - - required: - - compatible - - reg - - required: - compatible - core-module@10000000 diff --git a/Documentation/devicetree/bindings/arm/arm,realview.yaml b/Documentation/devicetree/bindings/arm/arm,realview.yaml index 8d3ed2e4ed315c..d1bdee98f9af08 100644 --- a/Documentation/devicetree/bindings/arm/arm,realview.yaml +++ b/Documentation/devicetree/bindings/arm/arm,realview.yaml @@ -75,43 +75,6 @@ properties: type: object description: All RealView boards must provide a syscon system controller node inside the soc node. - properties: - compatible: - oneOf: - - items: - - const: arm,realview-eb11mp-revb-syscon - - const: arm,realview-eb-syscon - - const: syscon - - const: simple-mfd - - items: - - const: arm,realview-eb11mp-revc-syscon - - const: arm,realview-eb-syscon - - const: syscon - - const: simple-mfd - - items: - - const: arm,realview-eb-syscon - - const: syscon - - const: simple-mfd - - items: - - const: arm,realview-pb1176-syscon - - const: syscon - - const: simple-mfd - - items: - - const: arm,realview-pb11mp-syscon - - const: syscon - - const: simple-mfd - - items: - - const: arm,realview-pba8-syscon - - const: syscon - - const: simple-mfd - - items: - - const: arm,realview-pbx-syscon - - const: syscon - - const: simple-mfd - - required: - - compatible - - reg required: - compatible diff --git a/Documentation/devicetree/bindings/arm/arm,versatile.yaml b/Documentation/devicetree/bindings/arm/arm,versatile.yaml index 13e52ba9206018..7a3caf6af200a1 100644 --- a/Documentation/devicetree/bindings/arm/arm,versatile.yaml +++ b/Documentation/devicetree/bindings/arm/arm,versatile.yaml @@ -14,6 +14,14 @@ description: |+ with various pluggable interface boards, in essence the Versatile PB version is a superset of the Versatile AB version. + The root node in the Versatile platforms must contain a core module child + node. They are always at physical address 0x10000000 in all the Versatile + variants. + + When fitted with the IB2 Interface Board, the Versatile AB will present an + optional system controller node which controls the extra peripherals on the + interface board. + properties: $nodename: const: '/' @@ -32,38 +40,6 @@ properties: items: - const: arm,versatile-pb - core-module@10000000: - type: object - description: the root node in the Versatile platforms must contain - a core module child node. They are always at physical address - 0x10000000 in all the Versatile variants. - properties: - compatible: - items: - - const: arm,core-module-versatile - - const: syscon - - const: simple-mfd - reg: - maxItems: 1 - - required: - - compatible - - reg - -patternProperties: - "^syscon@[0-9a-f]+$": - type: object - description: When fitted with the IB2 Interface Board, the Versatile - AB will present an optional system controller node which controls the - extra peripherals on the interface board. - properties: - compatible: - contains: - const: arm,versatile-ib2-syscon - required: - - compatible - - reg - required: - compatible - core-module@10000000 diff --git a/Documentation/devicetree/bindings/leds/register-bit-led.yaml b/Documentation/devicetree/bindings/leds/register-bit-led.yaml index ed26ec19ecbd8e..20930d327ae999 100644 --- a/Documentation/devicetree/bindings/leds/register-bit-led.yaml +++ b/Documentation/devicetree/bindings/leds/register-bit-led.yaml @@ -60,7 +60,7 @@ examples: - | syscon@10000000 { - compatible = "arm,realview-pb1176-syscon", "syscon"; + compatible = "arm,realview-pb1176-syscon", "syscon", "simple-mfd"; reg = <0x10000000 0x1000>; #address-cells = <1>; #size-cells = <1>; diff --git a/Documentation/devicetree/bindings/mfd/arm,dev-platforms-syscon.yaml b/Documentation/devicetree/bindings/mfd/arm,dev-platforms-syscon.yaml new file mode 100644 index 00000000000000..46b164ae083157 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/arm,dev-platforms-syscon.yaml @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/arm,dev-platforms-syscon.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Arm Ltd Developer Platforms System Controllers + +maintainers: + - Linus Walleij + +description: + The Arm Ltd Integrator, Realview, and Versatile families of developer + platforms are contain various system controller blocks. Often these blocks + are part of a daughterboard or motherboard module. + +properties: + compatible: + oneOf: + - items: + - enum: + - arm,integrator-ap-syscon + - arm,integrator-cp-syscon + - arm,integrator-sp-syscon + - arm,im-pd1-syscon + - const: syscon + - items: + - enum: + - arm,core-module-integrator + - arm,integrator-ap-syscon + - arm,integrator-cp-syscon + - arm,integrator-sp-syscon + - arm,realview-eb-syscon + - arm,realview-pb1176-syscon + - arm,realview-pb11mp-syscon + - arm,realview-pba8-syscon + - arm,realview-pbx-syscon + - arm,versatile-ib2-syscon + - const: syscon + - const: simple-mfd + - items: + - enum: + - arm,realview-eb11mp-revb-syscon + - arm,realview-eb11mp-revc-syscon + - const: arm,realview-eb-syscon + - const: syscon + - const: simple-mfd + + reg: + maxItems: 1 + + ranges: true + + '#address-cells': + const: 1 + + '#size-cells': + const: 1 + +required: + - compatible + - reg + +additionalProperties: + type: object + +... From 81118680a9cf6b24ea7943e0a7b2a98bf8d2b676 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 20 Oct 2023 01:22:44 +0200 Subject: [PATCH 387/515] gfs2: Initialize metapaths outside of __gfs2_iomap_get Initialize metapaths outside of __gfs2_iomap_get(). This saves us from having to release the metapath in gfs2_iomap_begin_write() before calling __gfs2_iomap_get() a second time. Also gets rid of several instances where mp_aheight remains at 1 for stuffed inodes (which have a height of 0). In those cases, mp_aheight isn't being used, though. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/bmap.c | 55 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 240f73e402d028..0619bb855c6ca1 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -317,6 +317,25 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl, __be64 *start, __be64 *end) } } +/* + * init_metapath - initialize a metapath + * @mp: The metapath + * @inode: The inode + */ +static int +init_metapath(struct metapath *mp, struct inode *inode) +{ + struct gfs2_inode *ip = GFS2_I(inode); + struct buffer_head *dibh; + int ret; + + memset(mp, 0, sizeof(*mp)); + ret = gfs2_meta_inode_buffer(ip, &dibh); + if (!ret) + mp->mp_bh[0] = dibh; + return ret; +} + static inline struct buffer_head * metapath_dibh(struct metapath *mp) { @@ -849,10 +868,10 @@ static int __gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length, __be64 *ptr; sector_t lblock; sector_t lblock_stop; - int ret; + int ret = 0; int eob; u64 len; - struct buffer_head *dibh = NULL, *bh; + struct buffer_head *bh; u8 height; if (!length) @@ -860,12 +879,9 @@ static int __gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length, down_read(&ip->i_rw_mutex); - ret = gfs2_meta_inode_buffer(ip, &dibh); - if (ret) - goto unlock; - mp->mp_bh[0] = dibh; - if (gfs2_is_stuffed(ip)) { + struct buffer_head *dibh = metapath_dibh(mp); + if (flags & IOMAP_WRITE) { loff_t max_size = gfs2_max_stuffed_size(ip); @@ -1055,7 +1071,6 @@ static int gfs2_iomap_begin_write(struct inode *inode, loff_t pos, ret = gfs2_unstuff_dinode(ip); if (ret) goto out_trans_end; - release_metapath(mp); ret = __gfs2_iomap_get(inode, iomap->offset, iomap->length, flags, iomap, mp); if (ret) @@ -1097,13 +1112,16 @@ static int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length, struct iomap *srcmap) { struct gfs2_inode *ip = GFS2_I(inode); - struct metapath mp = { .mp_aheight = 1, }; + struct metapath mp; int ret; if (gfs2_is_jdata(ip)) iomap->flags |= IOMAP_F_BUFFER_HEAD; trace_gfs2_iomap_start(ip, pos, length, flags); + ret = init_metapath(&mp, inode); + if (ret) + goto out_unlock; ret = __gfs2_iomap_get(inode, pos, length, flags, iomap, &mp); if (ret) goto out_unlock; @@ -1409,9 +1427,12 @@ static int trunc_start(struct inode *inode, u64 newsize) int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length, struct iomap *iomap) { - struct metapath mp = { .mp_aheight = 1, }; + struct metapath mp; int ret; + ret = init_metapath(&mp, inode); + if (ret) + return ret; ret = __gfs2_iomap_get(inode, pos, length, 0, iomap, &mp); release_metapath(&mp); return ret; @@ -1420,9 +1441,12 @@ int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length, int gfs2_iomap_alloc(struct inode *inode, loff_t pos, loff_t length, struct iomap *iomap) { - struct metapath mp = { .mp_aheight = 1, }; + struct metapath mp; int ret; + ret = init_metapath(&mp, inode); + if (ret) + return ret; ret = __gfs2_iomap_get(inode, pos, length, IOMAP_WRITE, iomap, &mp); if (!ret && iomap->type == IOMAP_HOLE) ret = __gfs2_iomap_alloc(inode, iomap, &mp); @@ -1716,8 +1740,8 @@ static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length) { struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); u64 maxsize = sdp->sd_heightsize[ip->i_height]; - struct metapath mp = {}; - struct buffer_head *dibh, *bh; + struct metapath mp; + struct buffer_head *bh; struct gfs2_holder rd_gh; unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift; u64 lblock = (offset + (1 << bsize_shift) - 1) >> bsize_shift; @@ -1787,11 +1811,10 @@ static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length) } start_aligned = mp_h; - ret = gfs2_meta_inode_buffer(ip, &dibh); + ret = init_metapath(&mp, &ip->i_inode); if (ret) return ret; - mp.mp_bh[0] = dibh; ret = lookup_metapath(ip, &mp); if (ret) goto out_metapath; @@ -1944,6 +1967,8 @@ static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length) } if (btotal) { + struct buffer_head *dibh = metapath_dibh(&mp); + if (current->journal_info == NULL) { ret = gfs2_trans_begin(sdp, RES_DINODE + RES_STATFS + RES_QUOTA, 0); From 6810cfb7dacd670ef81bcea256ac34d3f28b174d Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Sat, 21 Oct 2023 00:40:07 +0200 Subject: [PATCH 388/515] gfs2: Get rid of gfs2_alloc_blocks generation parameter Get rid of the generation parameter of gfs2_alloc_blocks(): we only ever set the generation of the current inode while creating it, so do so directly. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/bmap.c | 4 ++-- fs/gfs2/dir.c | 2 +- fs/gfs2/inode.c | 2 +- fs/gfs2/rgrp.c | 12 +++++++----- fs/gfs2/rgrp.h | 2 +- fs/gfs2/xattr.c | 6 +++--- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 0619bb855c6ca1..8bf44832425524 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -106,7 +106,7 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page) and write it out to disk */ unsigned int n = 1; - error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL); + error = gfs2_alloc_blocks(ip, &block, &n, 0); if (error) goto out_brelse; if (isdir) { @@ -726,7 +726,7 @@ static int __gfs2_iomap_alloc(struct inode *inode, struct iomap *iomap, i = mp->mp_aheight; do { n = blks - alloced; - ret = gfs2_alloc_blocks(ip, &bn, &n, 0, NULL); + ret = gfs2_alloc_blocks(ip, &bn, &n, 0); if (ret) goto out; alloced += n; diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index 1a2afa88f8bea8..3a2a10d6d43d13 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c @@ -868,7 +868,7 @@ static struct gfs2_leaf *new_leaf(struct inode *inode, struct buffer_head **pbh, struct gfs2_dirent *dent; struct timespec64 tv = current_time(inode); - error = gfs2_alloc_blocks(ip, &bn, &n, 0, NULL); + error = gfs2_alloc_blocks(ip, &bn, &n, 0); if (error) return NULL; bh = gfs2_meta_new(ip->i_gl, bn); diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index ee5b07d296f748..54b449cd6201b8 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -417,7 +417,7 @@ static int alloc_dinode(struct gfs2_inode *ip, u32 flags, unsigned *dblocks) if (error) goto out_ipreserv; - error = gfs2_alloc_blocks(ip, &ip->i_no_addr, dblocks, 1, &ip->i_generation); + error = gfs2_alloc_blocks(ip, &ip->i_no_addr, dblocks, 1); if (error) goto out_trans_end; diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 9308190895c890..c2060203b98af8 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -2411,13 +2411,12 @@ static void gfs2_set_alloc_start(struct gfs2_rbm *rbm, * @bn: Used to return the starting block number * @nblocks: requested number of blocks/extent length (value/result) * @dinode: 1 if we're allocating a dinode block, else 0 - * @generation: the generation number of the inode * * Returns: 0 or error */ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks, - bool dinode, u64 *generation) + bool dinode) { struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); struct buffer_head *dibh; @@ -2477,10 +2476,13 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks, rbm.rgd->rd_free -= *nblocks; spin_unlock(&rbm.rgd->rd_rsspin); if (dinode) { + u64 generation; + rbm.rgd->rd_dinodes++; - *generation = rbm.rgd->rd_igeneration++; - if (*generation == 0) - *generation = rbm.rgd->rd_igeneration++; + generation = rbm.rgd->rd_igeneration++; + if (generation == 0) + generation = rbm.rgd->rd_igeneration++; + ip->i_generation = generation; } gfs2_trans_add_meta(rbm.rgd->rd_gl, rbm.rgd->rd_bits[0].bi_bh); diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h index 00b30cf893af23..507c914f039b01 100644 --- a/fs/gfs2/rgrp.h +++ b/fs/gfs2/rgrp.h @@ -42,7 +42,7 @@ extern int gfs2_inplace_reserve(struct gfs2_inode *ip, extern void gfs2_inplace_release(struct gfs2_inode *ip); extern int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *n, - bool dinode, u64 *generation); + bool dinode); extern void gfs2_rs_deltree(struct gfs2_blkreserv *rs); extern void gfs2_rs_delete(struct gfs2_inode *ip); diff --git a/fs/gfs2/xattr.c b/fs/gfs2/xattr.c index 4fea70c0fe3d17..2117011c8c5778 100644 --- a/fs/gfs2/xattr.c +++ b/fs/gfs2/xattr.c @@ -639,7 +639,7 @@ static int ea_alloc_blk(struct gfs2_inode *ip, struct buffer_head **bhp) u64 block; int error; - error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL); + error = gfs2_alloc_blocks(ip, &block, &n, 0); if (error) return error; gfs2_trans_remove_revoke(sdp, block, 1); @@ -701,7 +701,7 @@ static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea, int mh_size = sizeof(struct gfs2_meta_header); unsigned int n = 1; - error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL); + error = gfs2_alloc_blocks(ip, &block, &n, 0); if (error) return error; gfs2_trans_remove_revoke(sdp, block, 1); @@ -1002,7 +1002,7 @@ static int ea_set_block(struct gfs2_inode *ip, struct gfs2_ea_request *er, } else { u64 blk; unsigned int n = 1; - error = gfs2_alloc_blocks(ip, &blk, &n, 0, NULL); + error = gfs2_alloc_blocks(ip, &blk, &n, 0); if (error) return error; gfs2_trans_remove_revoke(sdp, blk, 1); From 48faa78a7210a559de832e9eef8c0b310953fdda Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Tue, 18 Jul 2023 15:49:08 +0200 Subject: [PATCH 389/515] gfs2: Minor gfs2_write_jdata_batch PAGE_SIZE cleanup In gfs2_write_jdata_batch(), to compute the number of blocks, compute the total size of the folio batch instead of the number of pages it contains. Not a functional change. Note that we don't currently allow mounting filesystems with a block size bigger than the page size. We could change that after converting the page cache to folios. The page cache would then only contain block-size or bigger folios, so rounding wouldn't become an issue here. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/aops.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 52fad5bcb0472e..494484427ee303 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -214,12 +214,12 @@ static int gfs2_write_jdata_batch(struct address_space *mapping, unsigned nrblocks; int i; int ret; - int nr_pages = 0; + size_t size = 0; int nr_folios = folio_batch_count(fbatch); for (i = 0; i < nr_folios; i++) - nr_pages += folio_nr_pages(fbatch->folios[i]); - nrblocks = nr_pages * (PAGE_SIZE >> inode->i_blkbits); + size += folio_size(fbatch->folios[i]); + nrblocks = size >> inode->i_blkbits; ret = gfs2_trans_begin(sdp, nrblocks, nrblocks); if (ret < 0) From 00696d4b4569447aeb3714aed041b784025fb917 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 21 Jul 2023 23:58:04 +0200 Subject: [PATCH 390/515] gfs2: Convert stuffed_readpage to folios Change stuffed_readpage() to take a folio instead of a page. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/aops.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 494484427ee303..98bc02f890d167 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -403,27 +403,27 @@ static int gfs2_jdata_writepages(struct address_space *mapping, } /** - * stuffed_readpage - Fill in a Linux page with stuffed file data + * stuffed_readpage - Fill in a Linux folio with stuffed file data * @ip: the inode - * @page: the page + * @folio: the folio * * Returns: errno */ -static int stuffed_readpage(struct gfs2_inode *ip, struct page *page) +static int stuffed_readpage(struct gfs2_inode *ip, struct folio *folio) { struct buffer_head *dibh; - u64 dsize = i_size_read(&ip->i_inode); - void *kaddr; + size_t i_size = i_size_read(&ip->i_inode); + void *data; int error; /* * Due to the order of unstuffing files and ->fault(), we can be - * asked for a zero page in the case of a stuffed file being extended, + * asked for a zero folio in the case of a stuffed file being extended, * so we need to supply one here. It doesn't happen often. */ - if (unlikely(page->index)) { - zero_user(page, 0, PAGE_SIZE); - SetPageUptodate(page); + if (unlikely(folio->index)) { + folio_zero_range(folio, 0, folio_size(folio)); + folio_mark_uptodate(folio); return 0; } @@ -431,13 +431,11 @@ static int stuffed_readpage(struct gfs2_inode *ip, struct page *page) if (error) return error; - kaddr = kmap_local_page(page); - memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize); - memset(kaddr + dsize, 0, PAGE_SIZE - dsize); - kunmap_local(kaddr); - flush_dcache_page(page); + data = dibh->b_data + sizeof(struct gfs2_dinode); + memcpy_to_folio(folio, 0, data, i_size); + folio_zero_range(folio, i_size, folio_size(folio) - i_size); brelse(dibh); - SetPageUptodate(page); + folio_mark_uptodate(folio); return 0; } @@ -458,7 +456,7 @@ static int gfs2_read_folio(struct file *file, struct folio *folio) (i_blocksize(inode) == PAGE_SIZE && !folio_buffers(folio))) { error = iomap_read_folio(folio, &gfs2_iomap_ops); } else if (gfs2_is_stuffed(ip)) { - error = stuffed_readpage(ip, &folio->page); + error = stuffed_readpage(ip, folio); folio_unlock(folio); } else { error = mpage_read_folio(folio, gfs2_block_map); From 628085f756f2501b0d00434d64fe1771744c1009 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Mon, 24 Jul 2023 20:53:14 +0200 Subject: [PATCH 391/515] gfs2: Convert gfs2_internal_read to folios Change gfs2_internal_read() to use folios. Convert sizes to size_t. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/aops.c | 34 ++++++++++++++++------------------ fs/gfs2/inode.h | 4 ++-- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 98bc02f890d167..23fc474046fbf5 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -477,31 +477,29 @@ static int gfs2_read_folio(struct file *file, struct folio *folio) * */ -int gfs2_internal_read(struct gfs2_inode *ip, char *buf, loff_t *pos, - unsigned size) +ssize_t gfs2_internal_read(struct gfs2_inode *ip, char *buf, loff_t *pos, + size_t size) { struct address_space *mapping = ip->i_inode.i_mapping; unsigned long index = *pos >> PAGE_SHIFT; - unsigned offset = *pos & (PAGE_SIZE - 1); - unsigned copied = 0; - unsigned amt; - struct page *page; + size_t copied = 0; do { - page = read_cache_page(mapping, index, gfs2_read_folio, NULL); - if (IS_ERR(page)) { - if (PTR_ERR(page) == -EINTR) + size_t offset, chunk; + struct folio *folio; + + folio = read_cache_folio(mapping, index, gfs2_read_folio, NULL); + if (IS_ERR(folio)) { + if (PTR_ERR(folio) == -EINTR) continue; - return PTR_ERR(page); + return PTR_ERR(folio); } - amt = size - copied; - if (offset + size > PAGE_SIZE) - amt = PAGE_SIZE - offset; - memcpy_from_page(buf + copied, page, offset, amt); - put_page(page); - copied += amt; - index++; - offset = 0; + offset = *pos + copied - folio_pos(folio); + chunk = min(size - copied, folio_size(folio) - offset); + memcpy_from_folio(buf + copied, folio, offset, chunk); + index = folio_next_index(folio); + folio_put(folio); + copied += chunk; } while(copied < size); (*pos) += size; return size; diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h index 908c739220b831..041b9336700250 100644 --- a/fs/gfs2/inode.h +++ b/fs/gfs2/inode.h @@ -13,8 +13,8 @@ #include "util.h" bool gfs2_release_folio(struct folio *folio, gfp_t gfp_mask); -extern int gfs2_internal_read(struct gfs2_inode *ip, - char *buf, loff_t *pos, unsigned size); +extern ssize_t gfs2_internal_read(struct gfs2_inode *ip, + char *buf, loff_t *pos, size_t size); extern void gfs2_set_aops(struct inode *inode); static inline int gfs2_is_stuffed(const struct gfs2_inode *ip) From 47c248e46dfd8609d5d1c996297ec91d8f44f2b7 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Wed, 26 Jul 2023 22:23:43 +0200 Subject: [PATCH 392/515] gfs2: Rename gfs2_lookup_{ simple => meta } Function gfs2_lookup_simple() is used for looking up inodes in the metadata directory tree, so rename it to gfs2_lookup_meta() to closer match its purpose. Clean the function up a little on the way. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/inode.c | 13 +++++++------ fs/gfs2/inode.h | 2 +- fs/gfs2/ops_fstype.c | 16 ++++++++-------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 54b449cd6201b8..79e96130ef9efd 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -265,17 +265,18 @@ struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr, } -struct inode *gfs2_lookup_simple(struct inode *dip, const char *name) +/** + * gfs2_lookup_meta - Look up an inode in a metadata directory + * @dip: The directory + * @name: The name of the inode + */ +struct inode *gfs2_lookup_meta(struct inode *dip, const char *name) { struct qstr qstr; struct inode *inode; + gfs2_str2qstr(&qstr, name); inode = gfs2_lookupi(dip, &qstr, 1); - /* gfs2_lookupi has inconsistent callers: vfs - * related routines expect NULL for no entry found, - * gfs2_lookup_simple callers expect ENOENT - * and do not check for NULL. - */ if (IS_ERR_OR_NULL(inode)) return inode ? inode : ERR_PTR(-ENOENT); diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h index 041b9336700250..aaf3cf42069171 100644 --- a/fs/gfs2/inode.h +++ b/fs/gfs2/inode.h @@ -99,7 +99,7 @@ extern struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name, int is_root); extern int gfs2_permission(struct mnt_idmap *idmap, struct inode *inode, int mask); -extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name); +extern struct inode *gfs2_lookup_meta(struct inode *dip, const char *name); extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf); extern int gfs2_open_common(struct inode *inode, struct file *file); extern loff_t gfs2_seek_data(struct file *file, loff_t offset); diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index ecca978419e87e..2fa9baf61c3fde 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -647,7 +647,7 @@ static int init_statfs(struct gfs2_sbd *sdp) struct gfs2_jdesc *jd; struct gfs2_inode *ip; - sdp->sd_statfs_inode = gfs2_lookup_simple(master, "statfs"); + sdp->sd_statfs_inode = gfs2_lookup_meta(master, "statfs"); if (IS_ERR(sdp->sd_statfs_inode)) { error = PTR_ERR(sdp->sd_statfs_inode); fs_err(sdp, "can't read in statfs inode: %d\n", error); @@ -656,7 +656,7 @@ static int init_statfs(struct gfs2_sbd *sdp) if (sdp->sd_args.ar_spectator) goto out; - pn = gfs2_lookup_simple(master, "per_node"); + pn = gfs2_lookup_meta(master, "per_node"); if (IS_ERR(pn)) { error = PTR_ERR(pn); fs_err(sdp, "can't find per_node directory: %d\n", error); @@ -673,7 +673,7 @@ static int init_statfs(struct gfs2_sbd *sdp) goto free_local; } sprintf(buf, "statfs_change%u", jd->jd_jid); - lsi->si_sc_inode = gfs2_lookup_simple(pn, buf); + lsi->si_sc_inode = gfs2_lookup_meta(pn, buf); if (IS_ERR(lsi->si_sc_inode)) { error = PTR_ERR(lsi->si_sc_inode); fs_err(sdp, "can't find local \"sc\" file#%u: %d\n", @@ -738,7 +738,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo) if (undo) goto fail_statfs; - sdp->sd_jindex = gfs2_lookup_simple(master, "jindex"); + sdp->sd_jindex = gfs2_lookup_meta(master, "jindex"); if (IS_ERR(sdp->sd_jindex)) { fs_err(sdp, "can't lookup journal index: %d\n", error); return PTR_ERR(sdp->sd_jindex); @@ -887,7 +887,7 @@ static int init_inodes(struct gfs2_sbd *sdp, int undo) goto fail; /* Read in the resource index inode */ - sdp->sd_rindex = gfs2_lookup_simple(master, "rindex"); + sdp->sd_rindex = gfs2_lookup_meta(master, "rindex"); if (IS_ERR(sdp->sd_rindex)) { error = PTR_ERR(sdp->sd_rindex); fs_err(sdp, "can't get resource index inode: %d\n", error); @@ -896,7 +896,7 @@ static int init_inodes(struct gfs2_sbd *sdp, int undo) sdp->sd_rindex_uptodate = 0; /* Read in the quota inode */ - sdp->sd_quota_inode = gfs2_lookup_simple(master, "quota"); + sdp->sd_quota_inode = gfs2_lookup_meta(master, "quota"); if (IS_ERR(sdp->sd_quota_inode)) { error = PTR_ERR(sdp->sd_quota_inode); fs_err(sdp, "can't get quota file inode: %d\n", error); @@ -940,7 +940,7 @@ static int init_per_node(struct gfs2_sbd *sdp, int undo) if (undo) goto fail_qc_gh; - pn = gfs2_lookup_simple(master, "per_node"); + pn = gfs2_lookup_meta(master, "per_node"); if (IS_ERR(pn)) { error = PTR_ERR(pn); fs_err(sdp, "can't find per_node directory: %d\n", error); @@ -948,7 +948,7 @@ static int init_per_node(struct gfs2_sbd *sdp, int undo) } sprintf(buf, "quota_change%u", sdp->sd_jdesc->jd_jid); - sdp->sd_qc_inode = gfs2_lookup_simple(pn, buf); + sdp->sd_qc_inode = gfs2_lookup_meta(pn, buf); if (IS_ERR(sdp->sd_qc_inode)) { error = PTR_ERR(sdp->sd_qc_inode); fs_err(sdp, "can't find local \"qc\" file: %d\n", error); From ac0c01f304141e4f6fed5042f21ad2cc0742ea0f Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Mon, 9 Oct 2023 18:49:31 +0200 Subject: [PATCH 393/515] gfs2: No longer use 'extern' in function declarations For non-static function declarations, external linkage is implied and the 'extern' keyword isn't needed. Some static checkers complain about the overuse of 'extern', so clean up all the function declarations. In addition, remove 'extern' from the definition of free_local_statfs_inodes(); it isn't needed there, either. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/acl.h | 8 ++-- fs/gfs2/aops.h | 6 +-- fs/gfs2/bmap.h | 38 ++++++++--------- fs/gfs2/dir.h | 38 ++++++++--------- fs/gfs2/glock.h | 100 ++++++++++++++++++++++----------------------- fs/gfs2/glops.h | 4 +- fs/gfs2/incore.h | 2 +- fs/gfs2/inode.h | 52 +++++++++++------------ fs/gfs2/log.h | 46 ++++++++++----------- fs/gfs2/lops.h | 22 +++++----- fs/gfs2/meta_io.h | 20 ++++----- fs/gfs2/quota.h | 35 ++++++++-------- fs/gfs2/recovery.h | 18 ++++---- fs/gfs2/rgrp.h | 85 +++++++++++++++++++------------------- fs/gfs2/super.c | 6 +-- fs/gfs2/super.h | 50 +++++++++++------------ fs/gfs2/trans.h | 24 +++++------ fs/gfs2/util.h | 8 ++-- fs/gfs2/xattr.h | 12 +++--- 19 files changed, 289 insertions(+), 285 deletions(-) diff --git a/fs/gfs2/acl.h b/fs/gfs2/acl.h index d4deb2b1995952..82f5b09c04e669 100644 --- a/fs/gfs2/acl.h +++ b/fs/gfs2/acl.h @@ -11,9 +11,9 @@ #define GFS2_ACL_MAX_ENTRIES(sdp) ((300 << (sdp)->sd_sb.sb_bsize_shift) >> 12) -extern struct posix_acl *gfs2_get_acl(struct inode *inode, int type, bool rcu); -extern int __gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type); -extern int gfs2_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, - struct posix_acl *acl, int type); +struct posix_acl *gfs2_get_acl(struct inode *inode, int type, bool rcu); +int __gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type); +int gfs2_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, + struct posix_acl *acl, int type); #endif /* __ACL_DOT_H__ */ diff --git a/fs/gfs2/aops.h b/fs/gfs2/aops.h index f08322ef41cfd3..a10c4334d24893 100644 --- a/fs/gfs2/aops.h +++ b/fs/gfs2/aops.h @@ -8,8 +8,8 @@ #include "incore.h" -extern void adjust_fs_space(struct inode *inode); -extern void gfs2_trans_add_databufs(struct gfs2_inode *ip, struct folio *folio, - size_t from, size_t len); +void adjust_fs_space(struct inode *inode); +void gfs2_trans_add_databufs(struct gfs2_inode *ip, struct folio *folio, + size_t from, size_t len); #endif /* __AOPS_DOT_H__ */ diff --git a/fs/gfs2/bmap.h b/fs/gfs2/bmap.h index e5b7d17131ed31..4e8b1e8ebdf390 100644 --- a/fs/gfs2/bmap.h +++ b/fs/gfs2/bmap.h @@ -46,24 +46,24 @@ static inline void gfs2_write_calc_reserv(const struct gfs2_inode *ip, extern const struct iomap_ops gfs2_iomap_ops; extern const struct iomap_writeback_ops gfs2_writeback_ops; -extern int gfs2_unstuff_dinode(struct gfs2_inode *ip); -extern int gfs2_block_map(struct inode *inode, sector_t lblock, - struct buffer_head *bh, int create); -extern int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length, - struct iomap *iomap); -extern int gfs2_iomap_alloc(struct inode *inode, loff_t pos, loff_t length, - struct iomap *iomap); -extern int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock, - unsigned int *extlen); -extern int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock, - unsigned *extlen, bool *new); -extern int gfs2_setattr_size(struct inode *inode, u64 size); -extern int gfs2_truncatei_resume(struct gfs2_inode *ip); -extern int gfs2_file_dealloc(struct gfs2_inode *ip); -extern int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, - unsigned int len); -extern int gfs2_map_journal_extents(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd); -extern void gfs2_free_journal_extents(struct gfs2_jdesc *jd); -extern int __gfs2_punch_hole(struct file *file, loff_t offset, loff_t length); +int gfs2_unstuff_dinode(struct gfs2_inode *ip); +int gfs2_block_map(struct inode *inode, sector_t lblock, + struct buffer_head *bh, int create); +int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length, + struct iomap *iomap); +int gfs2_iomap_alloc(struct inode *inode, loff_t pos, loff_t length, + struct iomap *iomap); +int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock, + unsigned int *extlen); +int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock, + unsigned *extlen, bool *new); +int gfs2_setattr_size(struct inode *inode, u64 size); +int gfs2_truncatei_resume(struct gfs2_inode *ip); +int gfs2_file_dealloc(struct gfs2_inode *ip); +int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, + unsigned int len); +int gfs2_map_journal_extents(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd); +void gfs2_free_journal_extents(struct gfs2_jdesc *jd); +int __gfs2_punch_hole(struct file *file, loff_t offset, loff_t length); #endif /* __BMAP_DOT_H__ */ diff --git a/fs/gfs2/dir.h b/fs/gfs2/dir.h index 5b76480c17c9e9..25a857c78b538b 100644 --- a/fs/gfs2/dir.h +++ b/fs/gfs2/dir.h @@ -23,32 +23,32 @@ struct gfs2_diradd { int save_loc; }; -extern struct inode *gfs2_dir_search(struct inode *dir, - const struct qstr *filename, - bool fail_on_exist); -extern int gfs2_dir_check(struct inode *dir, const struct qstr *filename, - const struct gfs2_inode *ip); -extern int gfs2_dir_add(struct inode *inode, const struct qstr *filename, - const struct gfs2_inode *ip, struct gfs2_diradd *da); +struct inode *gfs2_dir_search(struct inode *dir, + const struct qstr *filename, + bool fail_on_exist); +int gfs2_dir_check(struct inode *dir, const struct qstr *filename, + const struct gfs2_inode *ip); +int gfs2_dir_add(struct inode *inode, const struct qstr *filename, + const struct gfs2_inode *ip, struct gfs2_diradd *da); static inline void gfs2_dir_no_add(struct gfs2_diradd *da) { brelse(da->bh); da->bh = NULL; } -extern int gfs2_dir_del(struct gfs2_inode *dip, const struct dentry *dentry); -extern int gfs2_dir_read(struct inode *inode, struct dir_context *ctx, - struct file_ra_state *f_ra); -extern int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename, - const struct gfs2_inode *nip, unsigned int new_type); +int gfs2_dir_del(struct gfs2_inode *dip, const struct dentry *dentry); +int gfs2_dir_read(struct inode *inode, struct dir_context *ctx, + struct file_ra_state *f_ra); +int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename, + const struct gfs2_inode *nip, unsigned int new_type); -extern int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip); +int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip); -extern int gfs2_diradd_alloc_required(struct inode *dir, - const struct qstr *filename, - struct gfs2_diradd *da); -extern int gfs2_dir_get_new_buffer(struct gfs2_inode *ip, u64 block, - struct buffer_head **bhp); -extern void gfs2_dir_hash_inval(struct gfs2_inode *ip); +int gfs2_diradd_alloc_required(struct inode *dir, + const struct qstr *filename, + struct gfs2_diradd *da); +int gfs2_dir_get_new_buffer(struct gfs2_inode *ip, u64 block, + struct buffer_head **bhp); +void gfs2_dir_hash_inval(struct gfs2_inode *ip); static inline u32 gfs2_disk_hash(const char *data, int len) { diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h index 4daad53f9436c0..61197598abfd33 100644 --- a/fs/gfs2/glock.h +++ b/fs/gfs2/glock.h @@ -166,40 +166,40 @@ static inline struct address_space *gfs2_glock2aspace(struct gfs2_glock *gl) return NULL; } -extern int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, - const struct gfs2_glock_operations *glops, - int create, struct gfs2_glock **glp); -extern struct gfs2_glock *gfs2_glock_hold(struct gfs2_glock *gl); -extern void gfs2_glock_put(struct gfs2_glock *gl); -extern void gfs2_glock_queue_put(struct gfs2_glock *gl); - -extern void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, - u16 flags, struct gfs2_holder *gh, - unsigned long ip); +int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, + const struct gfs2_glock_operations *glops, + int create, struct gfs2_glock **glp); +struct gfs2_glock *gfs2_glock_hold(struct gfs2_glock *gl); +void gfs2_glock_put(struct gfs2_glock *gl); +void gfs2_glock_queue_put(struct gfs2_glock *gl); + +void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, + u16 flags, struct gfs2_holder *gh, + unsigned long ip); static inline void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags, struct gfs2_holder *gh) { __gfs2_holder_init(gl, state, flags, gh, _RET_IP_); } -extern void gfs2_holder_reinit(unsigned int state, u16 flags, - struct gfs2_holder *gh); -extern void gfs2_holder_uninit(struct gfs2_holder *gh); -extern int gfs2_glock_nq(struct gfs2_holder *gh); -extern int gfs2_glock_poll(struct gfs2_holder *gh); -extern int gfs2_instantiate(struct gfs2_holder *gh); -extern int gfs2_glock_holder_ready(struct gfs2_holder *gh); -extern int gfs2_glock_wait(struct gfs2_holder *gh); -extern int gfs2_glock_async_wait(unsigned int num_gh, struct gfs2_holder *ghs); -extern void gfs2_glock_dq(struct gfs2_holder *gh); -extern void gfs2_glock_dq_wait(struct gfs2_holder *gh); -extern void gfs2_glock_dq_uninit(struct gfs2_holder *gh); -extern int gfs2_glock_nq_num(struct gfs2_sbd *sdp, u64 number, - const struct gfs2_glock_operations *glops, - unsigned int state, u16 flags, - struct gfs2_holder *gh); -extern int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs); -extern void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs); -extern void gfs2_dump_glock(struct seq_file *seq, struct gfs2_glock *gl, +void gfs2_holder_reinit(unsigned int state, u16 flags, + struct gfs2_holder *gh); +void gfs2_holder_uninit(struct gfs2_holder *gh); +int gfs2_glock_nq(struct gfs2_holder *gh); +int gfs2_glock_poll(struct gfs2_holder *gh); +int gfs2_instantiate(struct gfs2_holder *gh); +int gfs2_glock_holder_ready(struct gfs2_holder *gh); +int gfs2_glock_wait(struct gfs2_holder *gh); +int gfs2_glock_async_wait(unsigned int num_gh, struct gfs2_holder *ghs); +void gfs2_glock_dq(struct gfs2_holder *gh); +void gfs2_glock_dq_wait(struct gfs2_holder *gh); +void gfs2_glock_dq_uninit(struct gfs2_holder *gh); +int gfs2_glock_nq_num(struct gfs2_sbd *sdp, u64 number, + const struct gfs2_glock_operations *glops, + unsigned int state, u16 flags, + struct gfs2_holder *gh); +int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs); +void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs); +void gfs2_dump_glock(struct seq_file *seq, struct gfs2_glock *gl, bool fsid); #define GLOCK_BUG_ON(gl,x) do { if (unlikely(x)) { \ gfs2_dump_glock(NULL, gl, true); \ @@ -213,7 +213,7 @@ extern void gfs2_dump_glock(struct seq_file *seq, struct gfs2_glock *gl, gfs2_assert_withdraw((gl)->gl_name.ln_sbd, (x)); } } \ while (0) -extern __printf(2, 3) +__printf(2, 3) void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...); /** @@ -241,27 +241,27 @@ static inline int gfs2_glock_nq_init(struct gfs2_glock *gl, return error; } -extern void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state); -extern void gfs2_glock_complete(struct gfs2_glock *gl, int ret); -extern bool gfs2_queue_try_to_evict(struct gfs2_glock *gl); -extern void gfs2_cancel_delete_work(struct gfs2_glock *gl); -extern void gfs2_flush_delete_work(struct gfs2_sbd *sdp); -extern void gfs2_gl_hash_clear(struct gfs2_sbd *sdp); -extern void gfs2_gl_dq_holders(struct gfs2_sbd *sdp); -extern void gfs2_glock_thaw(struct gfs2_sbd *sdp); -extern void gfs2_glock_add_to_lru(struct gfs2_glock *gl); -extern void gfs2_glock_free(struct gfs2_glock *gl); +void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state); +void gfs2_glock_complete(struct gfs2_glock *gl, int ret); +bool gfs2_queue_try_to_evict(struct gfs2_glock *gl); +void gfs2_cancel_delete_work(struct gfs2_glock *gl); +void gfs2_flush_delete_work(struct gfs2_sbd *sdp); +void gfs2_gl_hash_clear(struct gfs2_sbd *sdp); +void gfs2_gl_dq_holders(struct gfs2_sbd *sdp); +void gfs2_glock_thaw(struct gfs2_sbd *sdp); +void gfs2_glock_add_to_lru(struct gfs2_glock *gl); +void gfs2_glock_free(struct gfs2_glock *gl); -extern int __init gfs2_glock_init(void); -extern void gfs2_glock_exit(void); +int __init gfs2_glock_init(void); +void gfs2_glock_exit(void); -extern void gfs2_create_debugfs_file(struct gfs2_sbd *sdp); -extern void gfs2_delete_debugfs_file(struct gfs2_sbd *sdp); -extern void gfs2_register_debugfs(void); -extern void gfs2_unregister_debugfs(void); +void gfs2_create_debugfs_file(struct gfs2_sbd *sdp); +void gfs2_delete_debugfs_file(struct gfs2_sbd *sdp); +void gfs2_register_debugfs(void); +void gfs2_unregister_debugfs(void); -extern void glock_set_object(struct gfs2_glock *gl, void *object); -extern void glock_clear_object(struct gfs2_glock *gl, void *object); +void glock_set_object(struct gfs2_glock *gl, void *object); +void glock_clear_object(struct gfs2_glock *gl, void *object); extern const struct lm_lockops gfs2_dlm_ops; @@ -280,7 +280,7 @@ static inline bool gfs2_holder_queued(struct gfs2_holder *gh) return !list_empty(&gh->gh_list); } -extern void gfs2_inode_remember_delete(struct gfs2_glock *gl, u64 generation); -extern bool gfs2_inode_already_deleted(struct gfs2_glock *gl, u64 generation); +void gfs2_inode_remember_delete(struct gfs2_glock *gl, u64 generation); +bool gfs2_inode_already_deleted(struct gfs2_glock *gl, u64 generation); #endif /* __GLOCK_DOT_H__ */ diff --git a/fs/gfs2/glops.h b/fs/gfs2/glops.h index 695898afcaf1fb..9341423798df8c 100644 --- a/fs/gfs2/glops.h +++ b/fs/gfs2/glops.h @@ -22,7 +22,7 @@ extern const struct gfs2_glock_operations gfs2_quota_glops; extern const struct gfs2_glock_operations gfs2_journal_glops; extern const struct gfs2_glock_operations *gfs2_glops_list[]; -extern int gfs2_inode_metasync(struct gfs2_glock *gl); -extern void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync); +int gfs2_inode_metasync(struct gfs2_glock *gl); +void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync); #endif /* __GLOPS_DOT_H__ */ diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index a8c95c5293c6cf..95a334d64da2a3 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -863,7 +863,7 @@ static inline void gfs2_sbstats_inc(const struct gfs2_glock *gl, int which) preempt_enable(); } -extern struct gfs2_rgrpd *gfs2_glock2rgrp(struct gfs2_glock *gl); +struct gfs2_rgrpd *gfs2_glock2rgrp(struct gfs2_glock *gl); static inline unsigned gfs2_max_stuffed_size(const struct gfs2_inode *ip) { diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h index aaf3cf42069171..fd15d1c6b6fb1e 100644 --- a/fs/gfs2/inode.h +++ b/fs/gfs2/inode.h @@ -13,9 +13,9 @@ #include "util.h" bool gfs2_release_folio(struct folio *folio, gfp_t gfp_mask); -extern ssize_t gfs2_internal_read(struct gfs2_inode *ip, - char *buf, loff_t *pos, size_t size); -extern void gfs2_set_aops(struct inode *inode); +ssize_t gfs2_internal_read(struct gfs2_inode *ip, + char *buf, loff_t *pos, size_t size); +void gfs2_set_aops(struct inode *inode); static inline int gfs2_is_stuffed(const struct gfs2_inode *ip) { @@ -86,33 +86,33 @@ static inline int gfs2_check_internal_file_size(struct inode *inode, return -EIO; } -extern struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, - u64 no_addr, u64 no_formal_ino, - unsigned int blktype); -extern struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr, - u64 no_formal_ino, - unsigned int blktype); - -extern int gfs2_inode_refresh(struct gfs2_inode *ip); - -extern struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name, - int is_root); -extern int gfs2_permission(struct mnt_idmap *idmap, - struct inode *inode, int mask); -extern struct inode *gfs2_lookup_meta(struct inode *dip, const char *name); -extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf); -extern int gfs2_open_common(struct inode *inode, struct file *file); -extern loff_t gfs2_seek_data(struct file *file, loff_t offset); -extern loff_t gfs2_seek_hole(struct file *file, loff_t offset); +struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, + u64 no_addr, u64 no_formal_ino, + unsigned int blktype); +struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr, + u64 no_formal_ino, + unsigned int blktype); + +int gfs2_inode_refresh(struct gfs2_inode *ip); + +struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name, + int is_root); +int gfs2_permission(struct mnt_idmap *idmap, + struct inode *inode, int mask); +struct inode *gfs2_lookup_meta(struct inode *dip, const char *name); +void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf); +int gfs2_open_common(struct inode *inode, struct file *file); +loff_t gfs2_seek_data(struct file *file, loff_t offset); +loff_t gfs2_seek_hole(struct file *file, loff_t offset); extern const struct file_operations gfs2_file_fops_nolock; extern const struct file_operations gfs2_dir_fops_nolock; -extern int gfs2_fileattr_get(struct dentry *dentry, struct fileattr *fa); -extern int gfs2_fileattr_set(struct mnt_idmap *idmap, - struct dentry *dentry, struct fileattr *fa); -extern void gfs2_set_inode_flags(struct inode *inode); - +int gfs2_fileattr_get(struct dentry *dentry, struct fileattr *fa); +int gfs2_fileattr_set(struct mnt_idmap *idmap, + struct dentry *dentry, struct fileattr *fa); +void gfs2_set_inode_flags(struct inode *inode); + #ifdef CONFIG_GFS2_FS_LOCKING_DLM extern const struct file_operations gfs2_file_fops; extern const struct file_operations gfs2_dir_fops; diff --git a/fs/gfs2/log.h b/fs/gfs2/log.h index 653cffcbf86945..c27b05099c1e40 100644 --- a/fs/gfs2/log.h +++ b/fs/gfs2/log.h @@ -70,29 +70,29 @@ static inline void gfs2_ordered_add_inode(struct gfs2_inode *ip) } } -extern void gfs2_ordered_del_inode(struct gfs2_inode *ip); -extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct); -extern void gfs2_remove_from_ail(struct gfs2_bufdata *bd); -extern bool gfs2_log_is_empty(struct gfs2_sbd *sdp); -extern void gfs2_log_release_revokes(struct gfs2_sbd *sdp, unsigned int revokes); -extern void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks); -extern bool gfs2_log_try_reserve(struct gfs2_sbd *sdp, struct gfs2_trans *tr, - unsigned int *extra_revokes); -extern void gfs2_log_reserve(struct gfs2_sbd *sdp, struct gfs2_trans *tr, - unsigned int *extra_revokes); -extern void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, - u64 seq, u32 tail, u32 lblock, u32 flags, - blk_opf_t op_flags); -extern void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, - u32 type); -extern void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans); -extern void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc); -extern void log_flush_wait(struct gfs2_sbd *sdp); +void gfs2_ordered_del_inode(struct gfs2_inode *ip); +unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct); +void gfs2_remove_from_ail(struct gfs2_bufdata *bd); +bool gfs2_log_is_empty(struct gfs2_sbd *sdp); +void gfs2_log_release_revokes(struct gfs2_sbd *sdp, unsigned int revokes); +void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks); +bool gfs2_log_try_reserve(struct gfs2_sbd *sdp, struct gfs2_trans *tr, + unsigned int *extra_revokes); +void gfs2_log_reserve(struct gfs2_sbd *sdp, struct gfs2_trans *tr, + unsigned int *extra_revokes); +void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, + u64 seq, u32 tail, u32 lblock, u32 flags, + blk_opf_t op_flags); +void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, + u32 type); +void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans); +void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc); +void log_flush_wait(struct gfs2_sbd *sdp); -extern int gfs2_logd(void *data); -extern void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd); -extern void gfs2_glock_remove_revoke(struct gfs2_glock *gl); -extern void gfs2_flush_revokes(struct gfs2_sbd *sdp); -extern void gfs2_ail_drain(struct gfs2_sbd *sdp); +int gfs2_logd(void *data); +void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd); +void gfs2_glock_remove_revoke(struct gfs2_glock *gl); +void gfs2_flush_revokes(struct gfs2_sbd *sdp); +void gfs2_ail_drain(struct gfs2_sbd *sdp); #endif /* __LOG_DOT_H__ */ diff --git a/fs/gfs2/lops.h b/fs/gfs2/lops.h index 1412ffba1d4446..07890c7b145d8b 100644 --- a/fs/gfs2/lops.h +++ b/fs/gfs2/lops.h @@ -11,16 +11,18 @@ #include "incore.h" extern const struct gfs2_log_operations *gfs2_log_ops[]; -extern void gfs2_log_incr_head(struct gfs2_sbd *sdp); -extern u64 gfs2_log_bmap(struct gfs2_jdesc *jd, unsigned int lbn); -extern void gfs2_log_write(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, - struct page *page, unsigned size, unsigned offset, - u64 blkno); -extern void gfs2_log_submit_bio(struct bio **biop, blk_opf_t opf); -extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh); -extern int gfs2_find_jhead(struct gfs2_jdesc *jd, - struct gfs2_log_header_host *head, bool keep_cache); -extern void gfs2_drain_revokes(struct gfs2_sbd *sdp); + +void gfs2_log_incr_head(struct gfs2_sbd *sdp); +u64 gfs2_log_bmap(struct gfs2_jdesc *jd, unsigned int lbn); +void gfs2_log_write(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, + struct page *page, unsigned size, unsigned offset, + u64 blkno); +void gfs2_log_submit_bio(struct bio **biop, blk_opf_t opf); +void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh); +int gfs2_find_jhead(struct gfs2_jdesc *jd, + struct gfs2_log_header_host *head, bool keep_cache); +void gfs2_drain_revokes(struct gfs2_sbd *sdp); + static inline unsigned int buf_limit(struct gfs2_sbd *sdp) { return sdp->sd_ldptrs; diff --git a/fs/gfs2/meta_io.h b/fs/gfs2/meta_io.h index d0a58cdd433a90..831d988c2ceb74 100644 --- a/fs/gfs2/meta_io.h +++ b/fs/gfs2/meta_io.h @@ -50,21 +50,21 @@ static inline struct gfs2_sbd *gfs2_mapping2sbd(struct address_space *mapping) return inode->i_sb->s_fs_info; } -extern struct buffer_head *gfs2_meta_new(struct gfs2_glock *gl, u64 blkno); -extern int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags, - int rahead, struct buffer_head **bhp); -extern int gfs2_meta_wait(struct gfs2_sbd *sdp, struct buffer_head *bh); -extern struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, - int create); +struct buffer_head *gfs2_meta_new(struct gfs2_glock *gl, u64 blkno); +int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags, + int rahead, struct buffer_head **bhp); +int gfs2_meta_wait(struct gfs2_sbd *sdp, struct buffer_head *bh); +struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, + int create); enum { REMOVE_JDATA = 0, REMOVE_META = 1, }; -extern void gfs2_remove_from_journal(struct buffer_head *bh, int meta); -extern void gfs2_journal_wipe(struct gfs2_inode *ip, u64 bstart, u32 blen); -extern int gfs2_meta_buffer(struct gfs2_inode *ip, u32 mtype, u64 num, - struct buffer_head **bhp); +void gfs2_remove_from_journal(struct buffer_head *bh, int meta); +void gfs2_journal_wipe(struct gfs2_inode *ip, u64 bstart, u32 blen); +int gfs2_meta_buffer(struct gfs2_inode *ip, u32 mtype, u64 num, + struct buffer_head **bhp); static inline int gfs2_meta_inode_buffer(struct gfs2_inode *ip, struct buffer_head **bhp) diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h index 1429945215a039..e4a2fdb552cd78 100644 --- a/fs/gfs2/quota.h +++ b/fs/gfs2/quota.h @@ -15,27 +15,27 @@ struct gfs2_sbd; #define NO_UID_QUOTA_CHANGE INVALID_UID #define NO_GID_QUOTA_CHANGE INVALID_GID -extern int gfs2_qa_get(struct gfs2_inode *ip); -extern void gfs2_qa_put(struct gfs2_inode *ip); -extern int gfs2_quota_hold(struct gfs2_inode *ip, kuid_t uid, kgid_t gid); -extern void gfs2_quota_unhold(struct gfs2_inode *ip); +int gfs2_qa_get(struct gfs2_inode *ip); +void gfs2_qa_put(struct gfs2_inode *ip); +int gfs2_quota_hold(struct gfs2_inode *ip, kuid_t uid, kgid_t gid); +void gfs2_quota_unhold(struct gfs2_inode *ip); -extern int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid); -extern void gfs2_quota_unlock(struct gfs2_inode *ip); +int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid); +void gfs2_quota_unlock(struct gfs2_inode *ip); -extern int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid, - struct gfs2_alloc_parms *ap); -extern void gfs2_quota_change(struct gfs2_inode *ip, s64 change, - kuid_t uid, kgid_t gid); +int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid, + struct gfs2_alloc_parms *ap); +void gfs2_quota_change(struct gfs2_inode *ip, s64 change, + kuid_t uid, kgid_t gid); -extern int gfs2_quota_sync(struct super_block *sb, int type); -extern int gfs2_quota_refresh(struct gfs2_sbd *sdp, struct kqid qid); +int gfs2_quota_sync(struct super_block *sb, int type); +int gfs2_quota_refresh(struct gfs2_sbd *sdp, struct kqid qid); -extern int gfs2_quota_init(struct gfs2_sbd *sdp); -extern void gfs2_quota_cleanup(struct gfs2_sbd *sdp); -extern int gfs2_quotad(void *data); +int gfs2_quota_init(struct gfs2_sbd *sdp); +void gfs2_quota_cleanup(struct gfs2_sbd *sdp); +int gfs2_quotad(void *data); -extern void gfs2_wake_up_statfs(struct gfs2_sbd *sdp); +void gfs2_wake_up_statfs(struct gfs2_sbd *sdp); static inline int gfs2_quota_lock_check(struct gfs2_inode *ip, struct gfs2_alloc_parms *ap) @@ -62,6 +62,7 @@ static inline int gfs2_quota_lock_check(struct gfs2_inode *ip, extern const struct quotactl_ops gfs2_quotactl_ops; extern struct shrinker gfs2_qd_shrinker; extern struct list_lru gfs2_qd_lru; -extern void __init gfs2_quota_hash_init(void); + +void __init gfs2_quota_hash_init(void); #endif /* __QUOTA_DOT_H__ */ diff --git a/fs/gfs2/recovery.h b/fs/gfs2/recovery.h index 7a0c9d0b7503f0..6a0fd42e1120fc 100644 --- a/fs/gfs2/recovery.h +++ b/fs/gfs2/recovery.h @@ -17,18 +17,18 @@ static inline void gfs2_replay_incr_blk(struct gfs2_jdesc *jd, u32 *blk) *blk = 0; } -extern int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk, +int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk, struct buffer_head **bh); -extern int gfs2_revoke_add(struct gfs2_jdesc *jd, u64 blkno, unsigned int where); -extern int gfs2_revoke_check(struct gfs2_jdesc *jd, u64 blkno, unsigned int where); -extern void gfs2_revoke_clean(struct gfs2_jdesc *jd); +int gfs2_revoke_add(struct gfs2_jdesc *jd, u64 blkno, unsigned int where); +int gfs2_revoke_check(struct gfs2_jdesc *jd, u64 blkno, unsigned int where); +void gfs2_revoke_clean(struct gfs2_jdesc *jd); -extern int gfs2_recover_journal(struct gfs2_jdesc *gfs2_jd, bool wait); -extern void gfs2_recover_func(struct work_struct *work); -extern int __get_log_header(struct gfs2_sbd *sdp, - const struct gfs2_log_header *lh, unsigned int blkno, - struct gfs2_log_header_host *head); +int gfs2_recover_journal(struct gfs2_jdesc *gfs2_jd, bool wait); +void gfs2_recover_func(struct work_struct *work); +int __get_log_header(struct gfs2_sbd *sdp, + const struct gfs2_log_header *lh, unsigned int blkno, + struct gfs2_log_header_host *head); #endif /* __RECOVERY_DOT_H__ */ diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h index 507c914f039b01..8d20e99385db47 100644 --- a/fs/gfs2/rgrp.h +++ b/fs/gfs2/rgrp.h @@ -22,38 +22,38 @@ struct gfs2_rgrpd; struct gfs2_sbd; struct gfs2_holder; -extern void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd); +void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd); -extern struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk, bool exact); -extern struct gfs2_rgrpd *gfs2_rgrpd_get_first(struct gfs2_sbd *sdp); -extern struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd); +struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk, bool exact); +struct gfs2_rgrpd *gfs2_rgrpd_get_first(struct gfs2_sbd *sdp); +struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd); -extern void gfs2_clear_rgrpd(struct gfs2_sbd *sdp); -extern int gfs2_rindex_update(struct gfs2_sbd *sdp); -extern void gfs2_free_clones(struct gfs2_rgrpd *rgd); -extern int gfs2_rgrp_go_instantiate(struct gfs2_glock *gl); -extern void gfs2_rgrp_brelse(struct gfs2_rgrpd *rgd); +void gfs2_clear_rgrpd(struct gfs2_sbd *sdp); +int gfs2_rindex_update(struct gfs2_sbd *sdp); +void gfs2_free_clones(struct gfs2_rgrpd *rgd); +int gfs2_rgrp_go_instantiate(struct gfs2_glock *gl); +void gfs2_rgrp_brelse(struct gfs2_rgrpd *rgd); -extern struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip); +struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip); #define GFS2_AF_ORLOV 1 -extern int gfs2_inplace_reserve(struct gfs2_inode *ip, - struct gfs2_alloc_parms *ap); -extern void gfs2_inplace_release(struct gfs2_inode *ip); - -extern int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *n, - bool dinode); - -extern void gfs2_rs_deltree(struct gfs2_blkreserv *rs); -extern void gfs2_rs_delete(struct gfs2_inode *ip); -extern void __gfs2_free_blocks(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, - u64 bstart, u32 blen, int meta); -extern void gfs2_free_meta(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, - u64 bstart, u32 blen); -extern void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip); -extern void gfs2_unlink_di(struct inode *inode); -extern int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, - unsigned int type); +int gfs2_inplace_reserve(struct gfs2_inode *ip, + struct gfs2_alloc_parms *ap); +void gfs2_inplace_release(struct gfs2_inode *ip); + +int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *n, + bool dinode); + +void gfs2_rs_deltree(struct gfs2_blkreserv *rs); +void gfs2_rs_delete(struct gfs2_inode *ip); +void __gfs2_free_blocks(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, + u64 bstart, u32 blen, int meta); +void gfs2_free_meta(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, + u64 bstart, u32 blen); +void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip); +void gfs2_unlink_di(struct inode *inode); +int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, + unsigned int type); struct gfs2_rgrp_list { unsigned int rl_rgrps; @@ -62,18 +62,19 @@ struct gfs2_rgrp_list { struct gfs2_holder *rl_ghs; }; -extern void gfs2_rlist_add(struct gfs2_inode *ip, struct gfs2_rgrp_list *rlist, - u64 block); -extern void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist, - unsigned int state, u16 flags); -extern void gfs2_rlist_free(struct gfs2_rgrp_list *rlist); -extern u64 gfs2_ri_total(struct gfs2_sbd *sdp); -extern void gfs2_rgrp_dump(struct seq_file *seq, struct gfs2_rgrpd *rgd, - const char *fs_id_buf); -extern int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset, - struct buffer_head *bh, - const struct gfs2_bitmap *bi, unsigned minlen, u64 *ptrimmed); -extern int gfs2_fitrim(struct file *filp, void __user *argp); +void gfs2_rlist_add(struct gfs2_inode *ip, struct gfs2_rgrp_list *rlist, + u64 block); +void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist, + unsigned int state, u16 flags); +void gfs2_rlist_free(struct gfs2_rgrp_list *rlist); +u64 gfs2_ri_total(struct gfs2_sbd *sdp); +void gfs2_rgrp_dump(struct seq_file *seq, struct gfs2_rgrpd *rgd, + const char *fs_id_buf); +int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset, + struct buffer_head *bh, + const struct gfs2_bitmap *bi, unsigned minlen, + u64 *ptrimmed); +int gfs2_fitrim(struct file *filp, void __user *argp); /* This is how to tell if a reservation is in the rgrp tree: */ static inline bool gfs2_rs_active(const struct gfs2_blkreserv *rs) @@ -88,9 +89,9 @@ static inline int rgrp_contains_block(struct gfs2_rgrpd *rgd, u64 block) return first <= block && block < last; } -extern void check_and_update_goal(struct gfs2_inode *ip); +void check_and_update_goal(struct gfs2_inode *ip); -extern void rgrp_lock_local(struct gfs2_rgrpd *rgd); -extern void rgrp_unlock_local(struct gfs2_rgrpd *rgd); +void rgrp_lock_local(struct gfs2_rgrpd *rgd); +void rgrp_unlock_local(struct gfs2_rgrpd *rgd); #endif /* __RGRP_DOT_H__ */ diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index dd2720a5ca62f8..4dad30dd72fce4 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1566,7 +1566,7 @@ static void gfs2_free_inode(struct inode *inode) kmem_cache_free(gfs2_inode_cachep, GFS2_I(inode)); } -extern void free_local_statfs_inodes(struct gfs2_sbd *sdp) +void free_local_statfs_inodes(struct gfs2_sbd *sdp) { struct local_statfs_inode *lsi, *safe; @@ -1581,8 +1581,8 @@ extern void free_local_statfs_inodes(struct gfs2_sbd *sdp) } } -extern struct inode *find_local_statfs_inode(struct gfs2_sbd *sdp, - unsigned int index) +struct inode *find_local_statfs_inode(struct gfs2_sbd *sdp, + unsigned int index) { struct local_statfs_inode *lsi; diff --git a/fs/gfs2/super.h b/fs/gfs2/super.h index ab9c83106932db..e1f7ef9264468a 100644 --- a/fs/gfs2/super.h +++ b/fs/gfs2/super.h @@ -15,7 +15,7 @@ #define GFS2_FS_FORMAT_MIN (1801) #define GFS2_FS_FORMAT_MAX (1802) -extern void gfs2_lm_unmount(struct gfs2_sbd *sdp); +void gfs2_lm_unmount(struct gfs2_sbd *sdp); static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp) { @@ -26,33 +26,33 @@ static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp) return x; } -extern void gfs2_jindex_free(struct gfs2_sbd *sdp); +void gfs2_jindex_free(struct gfs2_sbd *sdp); -extern struct gfs2_jdesc *gfs2_jdesc_find(struct gfs2_sbd *sdp, unsigned int jid); -extern int gfs2_jdesc_check(struct gfs2_jdesc *jd); -extern int gfs2_lookup_in_master_dir(struct gfs2_sbd *sdp, char *filename, - struct gfs2_inode **ipp); +struct gfs2_jdesc *gfs2_jdesc_find(struct gfs2_sbd *sdp, unsigned int jid); +int gfs2_jdesc_check(struct gfs2_jdesc *jd); +int gfs2_lookup_in_master_dir(struct gfs2_sbd *sdp, char *filename, + struct gfs2_inode **ipp); -extern int gfs2_make_fs_rw(struct gfs2_sbd *sdp); -extern void gfs2_make_fs_ro(struct gfs2_sbd *sdp); -extern void gfs2_online_uevent(struct gfs2_sbd *sdp); -extern void gfs2_destroy_threads(struct gfs2_sbd *sdp); -extern int gfs2_statfs_init(struct gfs2_sbd *sdp); -extern void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free, - s64 dinodes); -extern void gfs2_statfs_change_in(struct gfs2_statfs_change_host *sc, - const void *buf); -extern void gfs2_statfs_change_out(const struct gfs2_statfs_change_host *sc, - void *buf); -extern void update_statfs(struct gfs2_sbd *sdp, struct buffer_head *m_bh); -extern int gfs2_statfs_sync(struct super_block *sb, int type); -extern void gfs2_freeze_func(struct work_struct *work); -extern void gfs2_thaw_freeze_initiator(struct super_block *sb); +int gfs2_make_fs_rw(struct gfs2_sbd *sdp); +void gfs2_make_fs_ro(struct gfs2_sbd *sdp); +void gfs2_online_uevent(struct gfs2_sbd *sdp); +void gfs2_destroy_threads(struct gfs2_sbd *sdp); +int gfs2_statfs_init(struct gfs2_sbd *sdp); +void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free, + s64 dinodes); +void gfs2_statfs_change_in(struct gfs2_statfs_change_host *sc, + const void *buf); +void gfs2_statfs_change_out(const struct gfs2_statfs_change_host *sc, + void *buf); +void update_statfs(struct gfs2_sbd *sdp, struct buffer_head *m_bh); +int gfs2_statfs_sync(struct super_block *sb, int type); +void gfs2_freeze_func(struct work_struct *work); +void gfs2_thaw_freeze_initiator(struct super_block *sb); -extern void free_local_statfs_inodes(struct gfs2_sbd *sdp); -extern struct inode *find_local_statfs_inode(struct gfs2_sbd *sdp, - unsigned int index); -extern void free_sbd(struct gfs2_sbd *sdp); +void free_local_statfs_inodes(struct gfs2_sbd *sdp); +struct inode *find_local_statfs_inode(struct gfs2_sbd *sdp, + unsigned int index); +void free_sbd(struct gfs2_sbd *sdp); extern struct file_system_type gfs2_fs_type; extern struct file_system_type gfs2meta_fs_type; diff --git a/fs/gfs2/trans.h b/fs/gfs2/trans.h index c76ad9a4c75a98..f8ce5302280d31 100644 --- a/fs/gfs2/trans.h +++ b/fs/gfs2/trans.h @@ -34,17 +34,17 @@ static inline unsigned int gfs2_rg_blocks(const struct gfs2_inode *ip, unsigned return rgd->rd_length; } -extern int __gfs2_trans_begin(struct gfs2_trans *tr, struct gfs2_sbd *sdp, - unsigned int blocks, unsigned int revokes, - unsigned long ip); -extern int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, - unsigned int revokes); - -extern void gfs2_trans_end(struct gfs2_sbd *sdp); -extern void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh); -extern void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh); -extern void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd); -extern void gfs2_trans_remove_revoke(struct gfs2_sbd *sdp, u64 blkno, unsigned int len); -extern void gfs2_trans_free(struct gfs2_sbd *sdp, struct gfs2_trans *tr); +int __gfs2_trans_begin(struct gfs2_trans *tr, struct gfs2_sbd *sdp, + unsigned int blocks, unsigned int revokes, + unsigned long ip); +int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, + unsigned int revokes); + +void gfs2_trans_end(struct gfs2_sbd *sdp); +void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh); +void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh); +void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd); +void gfs2_trans_remove_revoke(struct gfs2_sbd *sdp, u64 blkno, unsigned int len); +void gfs2_trans_free(struct gfs2_sbd *sdp, struct gfs2_trans *tr); #endif /* __TRANS_DOT_H__ */ diff --git a/fs/gfs2/util.h b/fs/gfs2/util.h index cdb839529175d8..11c9d59b688962 100644 --- a/fs/gfs2/util.h +++ b/fs/gfs2/util.h @@ -147,10 +147,10 @@ static inline void gfs2_metatype_set(struct buffer_head *bh, u16 type, int gfs2_io_error_i(struct gfs2_sbd *sdp, const char *function, char *file, unsigned int line); -extern int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, - bool verbose); -extern int gfs2_freeze_lock_shared(struct gfs2_sbd *sdp); -extern void gfs2_freeze_unlock(struct gfs2_holder *freeze_gh); +int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, + bool verbose); +int gfs2_freeze_lock_shared(struct gfs2_sbd *sdp); +void gfs2_freeze_unlock(struct gfs2_holder *freeze_gh); #define gfs2_io_error(sdp) \ gfs2_io_error_i((sdp), __func__, __FILE__, __LINE__) diff --git a/fs/gfs2/xattr.h b/fs/gfs2/xattr.h index 2aed9d7d483d5b..eb12eb7e37c194 100644 --- a/fs/gfs2/xattr.h +++ b/fs/gfs2/xattr.h @@ -50,14 +50,14 @@ struct gfs2_ea_location { struct gfs2_ea_header *el_prev; }; -extern int __gfs2_xattr_set(struct inode *inode, const char *name, - const void *value, size_t size, - int flags, int type); -extern ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size); -extern int gfs2_ea_dealloc(struct gfs2_inode *ip); +int __gfs2_xattr_set(struct inode *inode, const char *name, + const void *value, size_t size, + int flags, int type); +ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size); +int gfs2_ea_dealloc(struct gfs2_inode *ip); /* Exported to acl.c */ -extern int gfs2_xattr_acl_get(struct gfs2_inode *ip, const char *name, char **data); +int gfs2_xattr_acl_get(struct gfs2_inode *ip, const char *name, char **data); #endif /* __EATTR_DOT_H__ */ From 26ad55ecccd5bc18e421b83bbceff225d3605871 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Tue, 24 Oct 2023 10:55:35 +0300 Subject: [PATCH 394/515] gfs2: fs: derive f_fsid from s_uuid gfs2 already has optional persistent uuid. Use that uuid to report f_fsid in statfs(2), same as ext2/ext4/zonefs. This allows gfs2 to be monitored by fanotify filesystem watch. for example, with inotify-tools 4.23.8.0, the following command can be used to watch changes over entire filesystem: fsnotifywatch --filesystem /mnt/gfs2 Signed-off-by: Amir Goldstein Reviewed-by: Jan Kara Signed-off-by: Andreas Gruenbacher --- fs/gfs2/super.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 4dad30dd72fce4..726f062bc490ae 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1006,6 +1006,7 @@ static int gfs2_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_files = sc.sc_dinodes + sc.sc_free; buf->f_ffree = sc.sc_free; buf->f_namelen = GFS2_FNAMESIZE; + buf->f_fsid = uuid_to_fsid(sb->s_uuid.b); return 0; } From ca7384334d9bf741e2768d60887924671c4d9a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Tue, 18 Jul 2023 10:48:04 +0200 Subject: [PATCH 395/515] Revert "nvmem: add new config option" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 517f14d9cf3533d5ab4fded195ab6f80a92e378f. It seems that "no_of_node" config option was added to help mtd's case. DT nodes of MTD partitions (that are also NVMEM devices) may contain subnodes that SHOULD NOT be treated as NVMEM fixed cells. To prevent NVMEM core code from parsing them "no_of_node" was set to true and that made for_each_child_of_node() in NVMEM a no-op. With the introduction of "add_legacy_fixed_of_cells" config option things got more explicit. MTD subsystem simply tells NVMEM when to look for fixed cells and there is no need to hack "of_node" pointer anymore. Signed-off-by: Rafał Miłecki Reviewed-by: Miquel Raynal Signed-off-by: Srinivas Kandagatla --- drivers/mtd/mtdcore.c | 1 - drivers/nvmem/core.c | 2 +- include/linux/nvmem-provider.h | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 9bd661be3ae93d..08f6ddd27b2914 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -559,7 +559,6 @@ static int mtd_nvmem_add(struct mtd_info *mtd) config.read_only = true; config.root_only = true; config.ignore_wp = true; - config.no_of_node = !of_device_is_compatible(node, "nvmem-cells"); config.priv = mtd; mtd->nvmem = nvmem_register(&config); diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index eaf6a3fe8ca6d4..ed249d245dcdc5 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -935,7 +935,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->nkeepout = config->nkeepout; if (config->of_node) nvmem->dev.of_node = config->of_node; - else if (!config->no_of_node) + else nvmem->dev.of_node = config->dev->of_node; switch (config->id) { diff --git a/include/linux/nvmem-provider.h b/include/linux/nvmem-provider.h index dae26295e6bedf..37bb16a89d0cc0 100644 --- a/include/linux/nvmem-provider.h +++ b/include/linux/nvmem-provider.h @@ -88,7 +88,6 @@ struct nvmem_cell_info { * @read_only: Device is read-only. * @root_only: Device is accessibly to root only. * @of_node: If given, this will be used instead of the parent's of_node. - * @no_of_node: Device should not use the parent's of_node even if it's !NULL. * @reg_read: Callback to read data. * @reg_write: Callback to write data. * @size: Device size. @@ -120,7 +119,6 @@ struct nvmem_config { bool ignore_wp; struct nvmem_layout *layout; struct device_node *of_node; - bool no_of_node; nvmem_reg_read_t reg_read; nvmem_reg_write_t reg_write; int size; From 7db72c01ae2359dbab29f4a60cda49757cf84516 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Tue, 3 Oct 2023 17:29:26 +0200 Subject: [PATCH 396/515] spmi: document spmi_device_from_of() refcounting Add a comment documenting that the spmi_device_from_of() takes a reference to the embedded struct device that needs to be dropped after use. Signed-off-by: Johan Hovold Acked-by: Stephen Boyd Link: https://lore.kernel.org/r/20231003152927.15000-5-johan+linaro@kernel.org Signed-off-by: Lee Jones --- drivers/spmi/spmi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/spmi/spmi.c b/drivers/spmi/spmi.c index 7313d4c18a0433..ca2fd4d72fa6ad 100644 --- a/drivers/spmi/spmi.c +++ b/drivers/spmi/spmi.c @@ -392,6 +392,9 @@ static struct bus_type spmi_bus_type = { * * @np: device node * + * Takes a reference to the embedded struct device which needs to be dropped + * after use. + * * Returns the struct spmi_device associated with a device node or NULL. */ struct spmi_device *spmi_device_from_of(struct device_node *np) From 2a2aaed224d93093f4c94234c796ae3396bdceee Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Tue, 3 Oct 2023 17:29:27 +0200 Subject: [PATCH 397/515] spmi: rename spmi device lookup helper Rename the SPMI device helper which is used to lookup a device from its OF node as spmi_find_device_by_of_node() so that it reflects the implementation and matches how other helpers like this are named. This will specifically make it more clear that this is a lookup function which returns a reference counted structure. Signed-off-by: Johan Hovold Acked-by: Stephen Boyd Link: https://lore.kernel.org/r/20231003152927.15000-6-johan+linaro@kernel.org Signed-off-by: Lee Jones --- drivers/mfd/qcom-spmi-pmic.c | 2 +- drivers/spmi/spmi.c | 6 +++--- include/linux/spmi.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/mfd/qcom-spmi-pmic.c b/drivers/mfd/qcom-spmi-pmic.c index 203b1e27a1ae3e..4549fa9f7d4bca 100644 --- a/drivers/mfd/qcom-spmi-pmic.c +++ b/drivers/mfd/qcom-spmi-pmic.c @@ -116,7 +116,7 @@ static struct spmi_device *qcom_pmic_get_base_usid(struct spmi_device *sdev, str } if (pmic_addr == function_parent_usid - (ctx->num_usids - 1)) { - sdev = spmi_device_from_of(child); + sdev = spmi_find_device_by_of_node(child); if (!sdev) { /* * If the base USID for this PMIC hasn't been diff --git a/drivers/spmi/spmi.c b/drivers/spmi/spmi.c index ca2fd4d72fa6ad..93cd4a34debc78 100644 --- a/drivers/spmi/spmi.c +++ b/drivers/spmi/spmi.c @@ -388,7 +388,7 @@ static struct bus_type spmi_bus_type = { }; /** - * spmi_device_from_of() - get the associated SPMI device from a device node + * spmi_find_device_by_of_node() - look up an SPMI device from a device node * * @np: device node * @@ -397,7 +397,7 @@ static struct bus_type spmi_bus_type = { * * Returns the struct spmi_device associated with a device node or NULL. */ -struct spmi_device *spmi_device_from_of(struct device_node *np) +struct spmi_device *spmi_find_device_by_of_node(struct device_node *np) { struct device *dev = bus_find_device_by_of_node(&spmi_bus_type, np); @@ -405,7 +405,7 @@ struct spmi_device *spmi_device_from_of(struct device_node *np) return to_spmi_device(dev); return NULL; } -EXPORT_SYMBOL_GPL(spmi_device_from_of); +EXPORT_SYMBOL_GPL(spmi_find_device_by_of_node); /** * spmi_device_alloc() - Allocate a new SPMI device diff --git a/include/linux/spmi.h b/include/linux/spmi.h index eac1956a8727e0..2a4ce4144f9f1b 100644 --- a/include/linux/spmi.h +++ b/include/linux/spmi.h @@ -166,7 +166,7 @@ static inline void spmi_driver_unregister(struct spmi_driver *sdrv) struct device_node; -struct spmi_device *spmi_device_from_of(struct device_node *np); +struct spmi_device *spmi_find_device_by_of_node(struct device_node *np); int spmi_register_read(struct spmi_device *sdev, u8 addr, u8 *buf); int spmi_ext_register_read(struct spmi_device *sdev, u8 addr, u8 *buf, size_t len); From 41536c17303d087d7b18a5f6ba45b2c1d17f1483 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 24 Oct 2023 19:06:50 +0300 Subject: [PATCH 398/515] mfd: lpc_ich: Mark *_gpio_offsets data with const There is no reason why the GPIO resource offsets should not be const. Mark them accordingly and update a qualifier in struct lpc_ich_gpio_info definition. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20231024160650.3898959-1-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones --- drivers/mfd/lpc_ich.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c index ea5f01e07dafd5..73a0e7f9bd3116 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c @@ -139,7 +139,7 @@ struct lpc_ich_gpio_info { size_t nr_devices; struct resource **resources; size_t nr_resources; - resource_size_t *offsets; + const resource_size_t *offsets; }; #define APL_GPIO_NORTH 0 @@ -151,7 +151,7 @@ struct lpc_ich_gpio_info { #define APL_GPIO_NR_RESOURCES 4 /* Offset data for Apollo Lake GPIO controllers */ -static resource_size_t apl_gpio_offsets[APL_GPIO_NR_RESOURCES] = { +static const resource_size_t apl_gpio_offsets[APL_GPIO_NR_RESOURCES] = { [APL_GPIO_NORTH] = 0xc50000, [APL_GPIO_NORTHWEST] = 0xc40000, [APL_GPIO_WEST] = 0xc70000, @@ -233,7 +233,7 @@ static const struct lpc_ich_gpio_info apl_gpio_info = { #define DNV_GPIO_NR_RESOURCES 2 /* Offset data for Denverton GPIO controllers */ -static resource_size_t dnv_gpio_offsets[DNV_GPIO_NR_RESOURCES] = { +static const resource_size_t dnv_gpio_offsets[DNV_GPIO_NR_RESOURCES] = { [DNV_GPIO_NORTH] = 0xc20000, [DNV_GPIO_SOUTH] = 0xc50000, }; From e92e59bd74e0b0203ee92ec7410c96cc5089d4ea Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Tue, 24 Oct 2023 11:56:17 +0100 Subject: [PATCH 399/515] firmware: arm_ffa: Allow FF-A initialisation even when notification fails FF-A notifications are optional feature in the specification. Currently we allow to continue if the firmware reports no support for the notifications. However, we fail to continue and complete the FF-A driver initialisation if the notification setup fails for any reason. Let us allow the FF-A driver to complete the initialisation even if the notification fails to setup. We will just flag the error and continue to provide other features in the driver. Link: https://lore.kernel.org/r/20231024-ffa-notification-fixes-v1-1-d552c0ec260d@arm.com Tested-by: Jens Wiklander Signed-off-by: Sudeep Holla --- drivers/firmware/arm_ffa/driver.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 07b72c67924704..585632a444b46f 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -1390,20 +1390,20 @@ static void ffa_notifications_cleanup(void) } } -static int ffa_notifications_setup(void) +static void ffa_notifications_setup(void) { int ret, irq; ret = ffa_features(FFA_NOTIFICATION_BITMAP_CREATE, 0, NULL, NULL); if (ret) { - pr_err("Notifications not supported, continuing with it ..\n"); - return 0; + pr_info("Notifications not supported, continuing with it ..\n"); + return; } ret = ffa_notification_bitmap_create(); if (ret) { - pr_err("notification_bitmap_create error %d\n", ret); - return ret; + pr_info("Notification bitmap create error %d\n", ret); + return; } drv_info->bitmap_created = true; @@ -1426,10 +1426,10 @@ static int ffa_notifications_setup(void) ret = ffa_sched_recv_cb_update(drv_info->vm_id, ffa_self_notif_handle, drv_info, true); if (!ret) - return ret; + return; cleanup: + pr_info("Notification setup failed %d, not enabled\n", ret); ffa_notifications_cleanup(); - return ret; } static int __init ffa_init(void) @@ -1487,13 +1487,9 @@ static int __init ffa_init(void) ffa_set_up_mem_ops_native_flag(); - ret = ffa_notifications_setup(); - if (ret) - goto partitions_cleanup; + ffa_notifications_setup(); return 0; -partitions_cleanup: - ffa_partitions_cleanup(); free_pages: if (drv_info->tx_buffer) free_pages_exact(drv_info->tx_buffer, RXTX_BUFFER_SIZE); From 863b09c9d89584c0024003bff982b31f30bcb8df Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Tue, 24 Oct 2023 11:56:18 +0100 Subject: [PATCH 400/515] firmware: arm_ffa: Setup the partitions after the notification initialisation Currently the notifications are setup of the partitions are probed and FF-A devices are added on the FF-A bus. The FF-A driver probe can be called even before the FF-A notification setup happens which is wrong and may result in failure or misbehaviour in the FF-A partition device probe. In order to ensure the FF-A notifications are setup before the FF-A devices are probed, let us move the FF-A partition setup after the completion of FF-A notification setup. Link: https://lore.kernel.org/r/20231024-ffa-notification-fixes-v1-2-d552c0ec260d@arm.com Tested-by: Jens Wiklander Signed-off-by: Sudeep Holla --- drivers/firmware/arm_ffa/driver.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 585632a444b46f..69ad3add317550 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -1422,11 +1422,7 @@ static void ffa_notifications_setup(void) hash_init(drv_info->notifier_hash); mutex_init(&drv_info->notify_lock); - /* Register internal scheduling callback */ - ret = ffa_sched_recv_cb_update(drv_info->vm_id, ffa_self_notif_handle, - drv_info, true); - if (!ret) - return; + return; cleanup: pr_info("Notification setup failed %d, not enabled\n", ret); ffa_notifications_cleanup(); @@ -1483,12 +1479,17 @@ static int __init ffa_init(void) mutex_init(&drv_info->rx_lock); mutex_init(&drv_info->tx_lock); - ffa_setup_partitions(); - ffa_set_up_mem_ops_native_flag(); ffa_notifications_setup(); + ffa_setup_partitions(); + + ret = ffa_sched_recv_cb_update(drv_info->vm_id, ffa_self_notif_handle, + drv_info, true); + if (ret) + pr_info("Failed to register driver sched callback %d\n", ret); + return 0; free_pages: if (drv_info->tx_buffer) From 503e100a33823259dae8f58ad0838617ea97f5ec Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Tue, 24 Oct 2023 11:56:19 +0100 Subject: [PATCH 401/515] firmware: arm_ffa: Add checks for the notification enabled state We need to check if the FF-A notifications are enabled or not in all the notification operations that are accessible for the FF-A device from the FF-A driver. This helps to avoid making calls to the FF-A firmware even if the notification setup has failed. Link: https://lore.kernel.org/r/20231024-ffa-notification-fixes-v1-3-d552c0ec260d@arm.com Tested-by: Jens Wiklander Signed-off-by: Sudeep Holla --- drivers/firmware/arm_ffa/driver.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 69ad3add317550..1724a0cbb2cf9b 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -99,6 +99,7 @@ struct ffa_drv_info { void *tx_buffer; bool mem_ops_native; bool bitmap_created; + bool notif_enabled; unsigned int sched_recv_irq; unsigned int cpuhp_state; struct ffa_pcpu_irq __percpu *irq_pcpu; @@ -889,6 +890,8 @@ static int ffa_memory_lend(struct ffa_mem_ops_args *args) #define FFA_SECURE_PARTITION_ID_FLAG BIT(15) +#define ffa_notifications_disabled() (!drv_info->notif_enabled) + enum notify_type { NON_SECURE_VM, SECURE_PARTITION, @@ -908,6 +911,9 @@ static int ffa_sched_recv_cb_update(u16 part_id, ffa_sched_recv_cb callback, struct ffa_dev_part_info *partition; bool cb_valid; + if (ffa_notifications_disabled()) + return -EOPNOTSUPP; + partition = xa_load(&drv_info->partition_info, part_id); write_lock(&partition->rw_lock); @@ -1001,6 +1007,9 @@ static int ffa_notify_relinquish(struct ffa_device *dev, int notify_id) int rc; enum notify_type type = ffa_notify_type_get(dev->vm_id); + if (ffa_notifications_disabled()) + return -EOPNOTSUPP; + if (notify_id >= FFA_MAX_NOTIFICATIONS) return -EINVAL; @@ -1027,6 +1036,9 @@ static int ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu, u32 flags = 0; enum notify_type type = ffa_notify_type_get(dev->vm_id); + if (ffa_notifications_disabled()) + return -EOPNOTSUPP; + if (notify_id >= FFA_MAX_NOTIFICATIONS) return -EINVAL; @@ -1057,6 +1069,9 @@ static int ffa_notify_send(struct ffa_device *dev, int notify_id, { u32 flags = 0; + if (ffa_notifications_disabled()) + return -EOPNOTSUPP; + if (is_per_vcpu) flags |= (PER_VCPU_NOTIFICATION_FLAG | vcpu << 16); @@ -1388,6 +1403,7 @@ static void ffa_notifications_cleanup(void) ffa_notification_bitmap_destroy(); drv_info->bitmap_created = false; } + drv_info->notif_enabled = false; } static void ffa_notifications_setup(void) @@ -1422,6 +1438,7 @@ static void ffa_notifications_setup(void) hash_init(drv_info->notifier_hash); mutex_init(&drv_info->notify_lock); + drv_info->notif_enabled = true; return; cleanup: pr_info("Notification setup failed %d, not enabled\n", ret); From d9c657727a2e38b153244ddd89064b6ea7dba219 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Tue, 24 Oct 2023 11:56:20 +0100 Subject: [PATCH 402/515] firmware: arm_ffa: Fix FFA notifications cleanup path We allow the FF-A to be initialised successfully even when notification fails. When the notification fails, ffa_notifications_cleanup() gets called on the failure path. However, the driver information about the notifications like the irq, workqueues and cpu hotplug state for enabling and disabling percpu IRQ are not cleared. This may result in unexpected behaviour during CPU hotplug because of percpu IRQ being enabled and disabled or during the driver removal when ffa_notifications_cleanup() gets executed again. Fix the FFA notifications cleanup path by clearing all the notification related driver information. Link: https://lore.kernel.org/r/20231024-ffa-notification-fixes-v1-4-d552c0ec260d@arm.com Tested-by: Jens Wiklander Signed-off-by: Sudeep Holla --- drivers/firmware/arm_ffa/driver.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 1724a0cbb2cf9b..49ebdc2775ddc9 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -1326,8 +1326,10 @@ static int ffa_sched_recv_irq_map(void) static void ffa_sched_recv_irq_unmap(void) { - if (drv_info->sched_recv_irq) + if (drv_info->sched_recv_irq) { irq_dispose_mapping(drv_info->sched_recv_irq); + drv_info->sched_recv_irq = 0; + } } static int ffa_cpuhp_pcpu_irq_enable(unsigned int cpu) @@ -1344,17 +1346,23 @@ static int ffa_cpuhp_pcpu_irq_disable(unsigned int cpu) static void ffa_uninit_pcpu_irq(void) { - if (drv_info->cpuhp_state) + if (drv_info->cpuhp_state) { cpuhp_remove_state(drv_info->cpuhp_state); + drv_info->cpuhp_state = 0; + } - if (drv_info->notif_pcpu_wq) + if (drv_info->notif_pcpu_wq) { destroy_workqueue(drv_info->notif_pcpu_wq); + drv_info->notif_pcpu_wq = NULL; + } if (drv_info->sched_recv_irq) free_percpu_irq(drv_info->sched_recv_irq, drv_info->irq_pcpu); - if (drv_info->irq_pcpu) + if (drv_info->irq_pcpu) { free_percpu(drv_info->irq_pcpu); + drv_info->irq_pcpu = NULL; + } } static int ffa_init_pcpu_irq(unsigned int irq) From e9aec86e211ee493081e8934b8c821d660b417ee Mon Sep 17 00:00:00 2001 From: Nikita Travkin Date: Mon, 23 Oct 2023 11:20:32 +0500 Subject: [PATCH 403/515] dt-bindings: mfd: qcom,spmi-pmic: Add pm8916 vm-bms and lbc PM8916 (and probably some other similar pmics) have hardware blocks for battery monitoring and charging. Add patterns for respecive nodes so the devicetree for those blocks can be validated properly. Signed-off-by: Nikita Travkin Link: https://lore.kernel.org/r/20231023-pm8916-dtsi-bms-lbc-v2-1-343e3dbf423e@trvn.ru Signed-off-by: Lee Jones --- Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml index 9fa56860393069..49103e07032a54 100644 --- a/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml +++ b/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml @@ -134,9 +134,15 @@ patternProperties: type: object $ref: /schemas/sound/qcom,pm8916-wcd-analog-codec.yaml# + "^battery@[0-9a-f]+$": + type: object + oneOf: + - $ref: /schemas/power/supply/qcom,pm8916-bms-vm.yaml# + "^charger@[0-9a-f]+$": type: object oneOf: + - $ref: /schemas/power/supply/qcom,pm8916-lbc.yaml# - $ref: /schemas/power/supply/qcom,pm8941-charger.yaml# - $ref: /schemas/power/supply/qcom,pm8941-coincell.yaml# - $ref: /schemas/power/supply/qcom,pmi8998-charger.yaml# From 462e67783c2e6e040bba82c458137d9908121e1e Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Tue, 24 Oct 2023 15:14:57 +0300 Subject: [PATCH 404/515] freevxfs: derive f_fsid from bdev->bd_dev The majority of blockdev filesystems, which do not have a UUID in their on-disk format, derive f_fsid of statfs(2) from bdev->bd_dev. Use the same practice for freevxfs. This will allow reporting fanotify events with fanotify_event_info_fid. Signed-off-by: Amir Goldstein Link: https://lore.kernel.org/r/20231024121457.3014063-1-amir73il@gmail.com Reviewed-by: Christoph Hellwig Signed-off-by: Christian Brauner --- fs/freevxfs/vxfs_super.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c index 310d73e254df2c..e6e2a2185e7c5d 100644 --- a/fs/freevxfs/vxfs_super.c +++ b/fs/freevxfs/vxfs_super.c @@ -76,6 +76,7 @@ vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp) { struct vxfs_sb_info *infp = VXFS_SBI(dentry->d_sb); struct vxfs_sb *raw_sb = infp->vsi_raw; + u64 id = huge_encode_dev(dentry->d_sb->s_bdev->bd_dev); bufp->f_type = VXFS_SUPER_MAGIC; bufp->f_bsize = dentry->d_sb->s_blocksize; @@ -84,6 +85,7 @@ vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp) bufp->f_bavail = 0; bufp->f_files = 0; bufp->f_ffree = fs32_to_cpu(infp, raw_sb->vs_ifree); + bufp->f_fsid = u64_to_fsid(id); bufp->f_namelen = VXFS_NAMELEN; return 0; From 2658d946f2d4dc4302acd90ad2d13f2469d11718 Mon Sep 17 00:00:00 2001 From: Ferry Meng Date: Thu, 26 Oct 2023 10:16:26 +0800 Subject: [PATCH 405/515] erofs: get rid of ROOT_NID() Let's open code this helper for simplicity. Signed-off-by: Ferry Meng Reviewed-by: Gao Xiang Reviewed-by: Yue Hu Link: https://lore.kernel.org/r/20231026021627.23284-1-mengferry@linux.alibaba.com Signed-off-by: Gao Xiang --- fs/erofs/internal.h | 2 -- fs/erofs/super.c | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index d8de61350dc05d..9586674ba55cf8 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -228,8 +228,6 @@ struct erofs_buf { }; #define __EROFS_BUF_INITIALIZER ((struct erofs_buf){ .page = NULL }) -#define ROOT_NID(sb) ((sb)->root_nid) - #define erofs_blknr(sb, addr) ((addr) >> (sb)->s_blocksize_bits) #define erofs_blkoff(sb, addr) ((addr) & ((sb)->s_blocksize - 1)) #define erofs_pos(sb, blk) ((erofs_off_t)(blk) << (sb)->s_blocksize_bits) diff --git a/fs/erofs/super.c b/fs/erofs/super.c index cc44fb2e001e6f..b1518df3af0092 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -668,13 +668,13 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) xa_init(&sbi->managed_pslots); #endif - inode = erofs_iget(sb, ROOT_NID(sbi)); + inode = erofs_iget(sb, sbi->root_nid); if (IS_ERR(inode)) return PTR_ERR(inode); if (!S_ISDIR(inode->i_mode)) { erofs_err(sb, "rootino(nid %llu) is not a directory(i_mode %o)", - ROOT_NID(sbi), inode->i_mode); + sbi->root_nid, inode->i_mode); iput(inode); return -EINVAL; } @@ -704,7 +704,7 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) if (err) return err; - erofs_info(sb, "mounted with root inode @ nid %llu.", ROOT_NID(sbi)); + erofs_info(sb, "mounted with root inode @ nid %llu.", sbi->root_nid); return 0; } From 3120ee29695aece9fd3ff01747405f273604d96f Mon Sep 17 00:00:00 2001 From: Ferry Meng Date: Thu, 26 Oct 2023 10:16:27 +0800 Subject: [PATCH 406/515] erofs: tidy up redundant includes - Remove unused includes like and ; - Move common includes into "internal.h". Signed-off-by: Ferry Meng Reviewed-by: Gao Xiang Reviewed-by: Yue Hu Link: https://lore.kernel.org/r/20231026021627.23284-2-mengferry@linux.alibaba.com Signed-off-by: Gao Xiang --- fs/erofs/data.c | 2 -- fs/erofs/decompressor.c | 1 - fs/erofs/decompressor_deflate.c | 1 - fs/erofs/decompressor_lzma.c | 1 - fs/erofs/internal.h | 2 ++ fs/erofs/super.c | 3 --- 6 files changed, 2 insertions(+), 8 deletions(-) diff --git a/fs/erofs/data.c b/fs/erofs/data.c index 0c2c99c58b5e3a..ceb6c248bf40de 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -5,9 +5,7 @@ * Copyright (C) 2021, Alibaba Cloud */ #include "internal.h" -#include #include -#include #include void erofs_unmap_metabuf(struct erofs_buf *buf) diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c index e75edc8f17539b..021be5feb1bcf9 100644 --- a/fs/erofs/decompressor.c +++ b/fs/erofs/decompressor.c @@ -4,7 +4,6 @@ * https://www.huawei.com/ */ #include "compress.h" -#include #include #ifndef LZ4_DISTANCE_MAX /* history window size */ diff --git a/fs/erofs/decompressor_deflate.c b/fs/erofs/decompressor_deflate.c index 0e1946a6bda58c..daf3c1bdeab815 100644 --- a/fs/erofs/decompressor_deflate.c +++ b/fs/erofs/decompressor_deflate.c @@ -1,5 +1,4 @@ // SPDX-License-Identifier: GPL-2.0-or-later -#include #include #include "compress.h" diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c index 852dd8eac5dfd8..2dd14f99c1dc10 100644 --- a/fs/erofs/decompressor_lzma.c +++ b/fs/erofs/decompressor_lzma.c @@ -1,6 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include #include "compress.h" struct z_erofs_lzma { diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 9586674ba55cf8..00a2b392f44591 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -8,8 +8,10 @@ #define __EROFS_INTERNAL_H #include +#include #include #include +#include #include #include #include diff --git a/fs/erofs/super.c b/fs/erofs/super.c index b1518df3af0092..93aba02346aa0c 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -4,14 +4,11 @@ * https://www.huawei.com/ * Copyright (C) 2021, Alibaba Cloud */ -#include #include -#include #include #include #include #include -#include #include #include "xattr.h" From 90176c9830203f0cf705148884d448e2e012cb60 Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Sat, 21 Oct 2023 02:25:17 -0700 Subject: [PATCH 407/515] vhost-vdpa: clean iotlb map during reset for older userspace Using .compat_reset op from the previous patch, the buggy .reset behaviour can be kept as-is on older userspace apps, which don't ack the IOTLB_PERSIST backend feature. As this compatibility quirk is limited to those drivers that used to be buggy in the past, it won't affect change the behaviour or affect ABI on the setups with API compliant driver. The separation of .compat_reset from the regular .reset allows vhost-vdpa able to know which driver had broken behaviour before, so it can apply the corresponding compatibility quirk to the individual driver whenever needed. Compared to overloading the existing .reset with flags, .compat_reset won't cause any extra burden to the implementation of every compliant driver. [mst: squashed in two fixup commits] Message-Id: <1697880319-4937-6-git-send-email-si-wei.liu@oracle.com> Message-Id: <1698102863-21122-1-git-send-email-si-wei.liu@oracle.com> Reported-by: Dragos Tatulea Tested-by: Dragos Tatulea Message-Id: <1698275594-19204-1-git-send-email-si-wei.liu@oracle.com> Reported-by: Lei Yang Signed-off-by: Si-Wei Liu Signed-off-by: Michael S. Tsirkin --- drivers/vhost/vdpa.c | 20 ++++++++++++++++---- drivers/virtio/virtio_vdpa.c | 2 +- include/linux/vdpa.h | 7 +++++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index acc7c74ba7d6ae..30df5c58db73a8 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -227,13 +227,24 @@ static void vhost_vdpa_unsetup_vq_irq(struct vhost_vdpa *v, u16 qid) irq_bypass_unregister_producer(&vq->call_ctx.producer); } -static int vhost_vdpa_reset(struct vhost_vdpa *v) +static int _compat_vdpa_reset(struct vhost_vdpa *v) { struct vdpa_device *vdpa = v->vdpa; + u32 flags = 0; - v->in_batch = 0; + if (v->vdev.vqs) { + flags |= !vhost_backend_has_feature(v->vdev.vqs[0], + VHOST_BACKEND_F_IOTLB_PERSIST) ? + VDPA_RESET_F_CLEAN_MAP : 0; + } + + return vdpa_reset(vdpa, flags); +} - return vdpa_reset(vdpa); +static int vhost_vdpa_reset(struct vhost_vdpa *v) +{ + v->in_batch = 0; + return _compat_vdpa_reset(v); } static long vhost_vdpa_bind_mm(struct vhost_vdpa *v) @@ -312,7 +323,7 @@ static long vhost_vdpa_set_status(struct vhost_vdpa *v, u8 __user *statusp) vhost_vdpa_unsetup_vq_irq(v, i); if (status == 0) { - ret = vdpa_reset(vdpa); + ret = _compat_vdpa_reset(v); if (ret) return ret; } else @@ -1344,6 +1355,7 @@ static void vhost_vdpa_cleanup(struct vhost_vdpa *v) vhost_vdpa_free_domain(v); vhost_dev_cleanup(&v->vdev); kfree(v->vdev.vqs); + v->vdev.vqs = NULL; } static int vhost_vdpa_open(struct inode *inode, struct file *filep) diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c index 06ce6d8c2e0047..8d63e5923d245b 100644 --- a/drivers/virtio/virtio_vdpa.c +++ b/drivers/virtio/virtio_vdpa.c @@ -100,7 +100,7 @@ static void virtio_vdpa_reset(struct virtio_device *vdev) { struct vdpa_device *vdpa = vd_get_vdpa(vdev); - vdpa_reset(vdpa); + vdpa_reset(vdpa, 0); } static bool virtio_vdpa_notify(struct virtqueue *vq) diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index 6b8cbf75712dfc..db15ac07f8a6a4 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h @@ -519,14 +519,17 @@ static inline struct device *vdpa_get_dma_dev(struct vdpa_device *vdev) return vdev->dma_dev; } -static inline int vdpa_reset(struct vdpa_device *vdev) +static inline int vdpa_reset(struct vdpa_device *vdev, u32 flags) { const struct vdpa_config_ops *ops = vdev->config; int ret; down_write(&vdev->cf_lock); vdev->features_valid = false; - ret = ops->reset(vdev); + if (ops->compat_reset && flags) + ret = ops->compat_reset(vdev, flags); + else + ret = ops->reset(vdev); up_write(&vdev->cf_lock); return ret; } From 020ecd2966d3789b6344cb036438e60719de40d7 Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Sat, 21 Oct 2023 02:25:18 -0700 Subject: [PATCH 408/515] vdpa/mlx5: implement .reset_map driver op Since commit 6f5312f80183 ("vdpa/mlx5: Add support for running with virtio_vdpa"), mlx5_vdpa starts with preallocate 1:1 DMA MR at device creation time. This 1:1 DMA MR will be implicitly destroyed while the first .set_map call is invoked, in which case callers like vhost-vdpa will start to set up custom mappings. When the .reset callback is invoked, the custom mappings will be cleared and the 1:1 DMA MR will be re-created. In order to reduce excessive memory mapping cost in live migration, it is desirable to decouple the vhost-vdpa IOTLB abstraction from the virtio device life cycle, i.e. mappings can be kept around intact across virtio device reset. Leverage the .reset_map callback, which is meant to destroy the regular MR (including cvq mapping) on the given ASID and recreate the initial DMA mapping. That way, the device .reset op runs free from having to maintain and clean up memory mappings by itself. Additionally, implement .compat_reset to cater for older userspace, which may wish to see mapping to be cleared during reset. Co-developed-by: Dragos Tatulea Signed-off-by: Dragos Tatulea Signed-off-by: Si-Wei Liu Message-Id: <1697880319-4937-7-git-send-email-si-wei.liu@oracle.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/mlx5/core/mlx5_vdpa.h | 1 + drivers/vdpa/mlx5/core/mr.c | 17 +++++++++++++++++ drivers/vdpa/mlx5/net/mlx5_vnet.c | 27 ++++++++++++++++++++++++--- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index db988ced5a5da1..84547d998bcf3b 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -127,6 +127,7 @@ int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, unsigned int asid); int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev); +int mlx5_vdpa_reset_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid); #define mlx5_vdpa_warn(__dev, format, ...) \ dev_warn((__dev)->mdev->device, "%s:%d:(pid %d) warning: " format, __func__, __LINE__, \ diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 66530e28f32711..2197c46e563a1f 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -645,3 +645,20 @@ int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev) return mlx5_vdpa_update_cvq_iotlb(mvdev, NULL, 0); } + +int mlx5_vdpa_reset_mr(struct mlx5_vdpa_dev *mvdev, unsigned int asid) +{ + if (asid >= MLX5_VDPA_NUM_AS) + return -EINVAL; + + mlx5_vdpa_destroy_mr(mvdev, mvdev->mr[asid]); + + if (asid == 0 && MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) { + if (mlx5_vdpa_create_dma_mr(mvdev)) + mlx5_vdpa_warn(mvdev, "create DMA MR failed\n"); + } else { + mlx5_vdpa_update_cvq_iotlb(mvdev, NULL, asid); + } + + return 0; +} diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index f4516a2d5bb0dd..12ac3397f39b81 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -2876,7 +2876,7 @@ static void init_group_to_asid_map(struct mlx5_vdpa_dev *mvdev) mvdev->group2asid[i] = 0; } -static int mlx5_vdpa_reset(struct vdpa_device *vdev) +static int mlx5_vdpa_compat_reset(struct vdpa_device *vdev, u32 flags) { struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev); struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev); @@ -2888,7 +2888,8 @@ static int mlx5_vdpa_reset(struct vdpa_device *vdev) unregister_link_notifier(ndev); teardown_driver(ndev); clear_vqs_ready(ndev); - mlx5_vdpa_destroy_mr_resources(&ndev->mvdev); + if (flags & VDPA_RESET_F_CLEAN_MAP) + mlx5_vdpa_destroy_mr_resources(&ndev->mvdev); ndev->mvdev.status = 0; ndev->mvdev.suspended = false; ndev->cur_num_vqs = 0; @@ -2899,7 +2900,8 @@ static int mlx5_vdpa_reset(struct vdpa_device *vdev) init_group_to_asid_map(mvdev); ++mvdev->generation; - if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) { + if ((flags & VDPA_RESET_F_CLEAN_MAP) && + MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) { if (mlx5_vdpa_create_dma_mr(mvdev)) mlx5_vdpa_warn(mvdev, "create MR failed\n"); } @@ -2908,6 +2910,11 @@ static int mlx5_vdpa_reset(struct vdpa_device *vdev) return 0; } +static int mlx5_vdpa_reset(struct vdpa_device *vdev) +{ + return mlx5_vdpa_compat_reset(vdev, 0); +} + static size_t mlx5_vdpa_get_config_size(struct vdpa_device *vdev) { return sizeof(struct virtio_net_config); @@ -2987,6 +2994,18 @@ static int mlx5_vdpa_set_map(struct vdpa_device *vdev, unsigned int asid, return err; } +static int mlx5_vdpa_reset_map(struct vdpa_device *vdev, unsigned int asid) +{ + struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev); + struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev); + int err; + + down_write(&ndev->reslock); + err = mlx5_vdpa_reset_mr(mvdev, asid); + up_write(&ndev->reslock); + return err; +} + static struct device *mlx5_get_vq_dma_dev(struct vdpa_device *vdev, u16 idx) { struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev); @@ -3250,11 +3269,13 @@ static const struct vdpa_config_ops mlx5_vdpa_ops = { .get_status = mlx5_vdpa_get_status, .set_status = mlx5_vdpa_set_status, .reset = mlx5_vdpa_reset, + .compat_reset = mlx5_vdpa_compat_reset, .get_config_size = mlx5_vdpa_get_config_size, .get_config = mlx5_vdpa_get_config, .set_config = mlx5_vdpa_set_config, .get_generation = mlx5_vdpa_get_generation, .set_map = mlx5_vdpa_set_map, + .reset_map = mlx5_vdpa_reset_map, .set_group_asid = mlx5_set_group_asid, .get_vq_dma_dev = mlx5_get_vq_dma_dev, .free = mlx5_vdpa_free, From 276d5784878e21f0165974c58e47765ba211163c Mon Sep 17 00:00:00 2001 From: Si-Wei Liu Date: Sat, 21 Oct 2023 02:25:19 -0700 Subject: [PATCH 409/515] vdpa_sim: implement .reset_map support In order to reduce excessive memory mapping cost in live migration and VM reboot, it is desirable to decouple the vhost-vdpa IOTLB abstraction from the virtio device life cycle, i.e. mappings can be kept intact across virtio device reset. Leverage the .reset_map callback, which is meant to destroy the iotlb on the given ASID and recreate the 1:1 passthrough/identity mapping. To be consistent, the mapping on device creation is initiailized to passthrough/identity with PA 1:1 mapped as IOVA. With this the device .reset op doesn't have to maintain and clean up memory mappings by itself. Additionally, implement .compat_reset to cater for older userspace, which may wish to see mapping to be cleared during reset. Signed-off-by: Si-Wei Liu Tested-by: Stefano Garzarella Message-Id: <1697880319-4937-8-git-send-email-si-wei.liu@oracle.com> Signed-off-by: Michael S. Tsirkin --- drivers/vdpa/vdpa_sim/vdpa_sim.c | 52 ++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c index 76d41058add9a8..be2925d0d28368 100644 --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c @@ -139,7 +139,7 @@ static void vdpasim_vq_reset(struct vdpasim *vdpasim, vq->vring.notify = NULL; } -static void vdpasim_do_reset(struct vdpasim *vdpasim) +static void vdpasim_do_reset(struct vdpasim *vdpasim, u32 flags) { int i; @@ -151,11 +151,13 @@ static void vdpasim_do_reset(struct vdpasim *vdpasim) &vdpasim->iommu_lock); } - for (i = 0; i < vdpasim->dev_attr.nas; i++) { - vhost_iotlb_reset(&vdpasim->iommu[i]); - vhost_iotlb_add_range(&vdpasim->iommu[i], 0, ULONG_MAX, - 0, VHOST_MAP_RW); - vdpasim->iommu_pt[i] = true; + if (flags & VDPA_RESET_F_CLEAN_MAP) { + for (i = 0; i < vdpasim->dev_attr.nas; i++) { + vhost_iotlb_reset(&vdpasim->iommu[i]); + vhost_iotlb_add_range(&vdpasim->iommu[i], 0, ULONG_MAX, + 0, VHOST_MAP_RW); + vdpasim->iommu_pt[i] = true; + } } vdpasim->running = true; @@ -259,8 +261,12 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr, if (!vdpasim->iommu_pt) goto err_iommu; - for (i = 0; i < vdpasim->dev_attr.nas; i++) + for (i = 0; i < vdpasim->dev_attr.nas; i++) { vhost_iotlb_init(&vdpasim->iommu[i], max_iotlb_entries, 0); + vhost_iotlb_add_range(&vdpasim->iommu[i], 0, ULONG_MAX, 0, + VHOST_MAP_RW); + vdpasim->iommu_pt[i] = true; + } for (i = 0; i < dev_attr->nvqs; i++) vringh_set_iotlb(&vdpasim->vqs[i].vring, &vdpasim->iommu[0], @@ -480,18 +486,23 @@ static void vdpasim_set_status(struct vdpa_device *vdpa, u8 status) mutex_unlock(&vdpasim->mutex); } -static int vdpasim_reset(struct vdpa_device *vdpa) +static int vdpasim_compat_reset(struct vdpa_device *vdpa, u32 flags) { struct vdpasim *vdpasim = vdpa_to_sim(vdpa); mutex_lock(&vdpasim->mutex); vdpasim->status = 0; - vdpasim_do_reset(vdpasim); + vdpasim_do_reset(vdpasim, flags); mutex_unlock(&vdpasim->mutex); return 0; } +static int vdpasim_reset(struct vdpa_device *vdpa) +{ + return vdpasim_compat_reset(vdpa, 0); +} + static int vdpasim_suspend(struct vdpa_device *vdpa) { struct vdpasim *vdpasim = vdpa_to_sim(vdpa); @@ -637,6 +648,25 @@ static int vdpasim_set_map(struct vdpa_device *vdpa, unsigned int asid, return ret; } +static int vdpasim_reset_map(struct vdpa_device *vdpa, unsigned int asid) +{ + struct vdpasim *vdpasim = vdpa_to_sim(vdpa); + + if (asid >= vdpasim->dev_attr.nas) + return -EINVAL; + + spin_lock(&vdpasim->iommu_lock); + if (vdpasim->iommu_pt[asid]) + goto out; + vhost_iotlb_reset(&vdpasim->iommu[asid]); + vhost_iotlb_add_range(&vdpasim->iommu[asid], 0, ULONG_MAX, + 0, VHOST_MAP_RW); + vdpasim->iommu_pt[asid] = true; +out: + spin_unlock(&vdpasim->iommu_lock); + return 0; +} + static int vdpasim_bind_mm(struct vdpa_device *vdpa, struct mm_struct *mm) { struct vdpasim *vdpasim = vdpa_to_sim(vdpa); @@ -749,6 +779,7 @@ static const struct vdpa_config_ops vdpasim_config_ops = { .get_status = vdpasim_get_status, .set_status = vdpasim_set_status, .reset = vdpasim_reset, + .compat_reset = vdpasim_compat_reset, .suspend = vdpasim_suspend, .resume = vdpasim_resume, .get_config_size = vdpasim_get_config_size, @@ -759,6 +790,7 @@ static const struct vdpa_config_ops vdpasim_config_ops = { .set_group_asid = vdpasim_set_group_asid, .dma_map = vdpasim_dma_map, .dma_unmap = vdpasim_dma_unmap, + .reset_map = vdpasim_reset_map, .bind_mm = vdpasim_bind_mm, .unbind_mm = vdpasim_unbind_mm, .free = vdpasim_free, @@ -787,6 +819,7 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = { .get_status = vdpasim_get_status, .set_status = vdpasim_set_status, .reset = vdpasim_reset, + .compat_reset = vdpasim_compat_reset, .suspend = vdpasim_suspend, .resume = vdpasim_resume, .get_config_size = vdpasim_get_config_size, @@ -796,6 +829,7 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = { .get_iova_range = vdpasim_get_iova_range, .set_group_asid = vdpasim_set_group_asid, .set_map = vdpasim_set_map, + .reset_map = vdpasim_reset_map, .bind_mm = vdpasim_bind_mm, .unbind_mm = vdpasim_unbind_mm, .free = vdpasim_free, From b99df62818919b84e970eea5aec60b0dbc57da18 Mon Sep 17 00:00:00 2001 From: Conor Dooley Date: Tue, 24 Oct 2023 09:20:35 +0100 Subject: [PATCH 410/515] riscv: dts: sophgo: remove address-cells from intc node A recent submission [1] from Rob has added additionalProperties: false to the interrupt-controller child node of RISC-V cpus, highlighting that the new cv1800b DT has been incorrectly using #address-cells. It has no child nodes, so #address-cells is not needed. Remove it. Link: https://patchwork.kernel.org/project/linux-riscv/patch/20230915201946.4184468-1-robh@kernel.org/ [1] Fixes: c3dffa879cca ("riscv: dts: sophgo: add initial CV1800B SoC device tree") Reviewed-by: Jisheng Zhang Acked-by: Chen Wang Signed-off-by: Conor Dooley --- arch/riscv/boot/dts/sophgo/cv1800b.dtsi | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/riscv/boot/dts/sophgo/cv1800b.dtsi b/arch/riscv/boot/dts/sophgo/cv1800b.dtsi index df40e87ee06329..aec6401a467b02 100644 --- a/arch/riscv/boot/dts/sophgo/cv1800b.dtsi +++ b/arch/riscv/boot/dts/sophgo/cv1800b.dtsi @@ -34,7 +34,6 @@ cpu0_intc: interrupt-controller { compatible = "riscv,cpu-intc"; interrupt-controller; - #address-cells = <0>; #interrupt-cells = <1>; }; }; From 95962b0e8ca6f4fa3a99f6e03e541bb3bf896735 Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Fri, 20 Oct 2023 15:11:41 +0200 Subject: [PATCH 411/515] ARM: dts: usr8200: Fix phy registers The MV88E6060 switch has internal PHY registers at MDIO addresses 0x00..0x04. Tie each port to the corresponding PHY. Signed-off-by: Linus Walleij Link: https://lore.kernel.org/r/20231020-ixp4xx-usr8200-dtsfix-v1-1-3a8591dea259@linaro.org Signed-off-by: Arnd Bergmann --- .../ixp/intel-ixp42x-usrobotics-usr8200.dts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arch/arm/boot/dts/intel/ixp/intel-ixp42x-usrobotics-usr8200.dts b/arch/arm/boot/dts/intel/ixp/intel-ixp42x-usrobotics-usr8200.dts index 90fd51b36e7da2..2c89db34c8d889 100644 --- a/arch/arm/boot/dts/intel/ixp/intel-ixp42x-usrobotics-usr8200.dts +++ b/arch/arm/boot/dts/intel/ixp/intel-ixp42x-usrobotics-usr8200.dts @@ -165,6 +165,24 @@ #address-cells = <1>; #size-cells = <0>; + /* + * PHY 0..4 are internal to the MV88E6060 switch but appear + * as independent devices. + */ + phy0: ethernet-phy@0 { + reg = <0>; + }; + phy1: ethernet-phy@1 { + reg = <1>; + }; + phy2: ethernet-phy@2 { + reg = <2>; + }; + phy3: ethernet-phy@3 { + reg = <3>; + }; + + /* Altima AMI101L used by the WAN port */ phy9: ethernet-phy@9 { reg = <9>; }; @@ -181,21 +199,25 @@ port@0 { reg = <0>; label = "lan1"; + phy-handle = <&phy0>; }; port@1 { reg = <1>; label = "lan2"; + phy-handle = <&phy1>; }; port@2 { reg = <2>; label = "lan3"; + phy-handle = <&phy2>; }; port@3 { reg = <3>; label = "lan4"; + phy-handle = <&phy3>; }; port@5 { From bc4532e9cd3b060878eccabd836e8128a7793e38 Mon Sep 17 00:00:00 2001 From: Mimi Zohar Date: Wed, 18 Oct 2023 14:47:02 -0400 Subject: [PATCH 412/515] ima: detect changes to the backing overlay file Commit 18b44bc5a672 ("ovl: Always reevaluate the file signature for IMA") forced signature re-evaulation on every file access. Instead of always re-evaluating the file's integrity, detect a change to the backing file, by comparing the cached file metadata with the backing file's metadata. Verifying just the i_version has not changed is insufficient. In addition save and compare the i_ino and s_dev as well. Reviewed-by: Amir Goldstein Tested-by: Eric Snowberg Tested-by: Raul E Rangel Signed-off-by: Mimi Zohar --- fs/overlayfs/super.c | 2 +- security/integrity/ima/ima_api.c | 5 +++++ security/integrity/ima/ima_main.c | 16 +++++++++++++++- security/integrity/integrity.h | 2 ++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index 3fa2416264a4e6..c71d185980c08f 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -1489,7 +1489,7 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc) ovl_trusted_xattr_handlers; sb->s_fs_info = ofs; sb->s_flags |= SB_POSIXACL; - sb->s_iflags |= SB_I_SKIP_SYNC | SB_I_IMA_UNVERIFIABLE_SIGNATURE; + sb->s_iflags |= SB_I_SKIP_SYNC; err = -ENOMEM; root_dentry = ovl_get_root(sb, ctx->upper.dentry, oe); diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c index 452e80b541e544..597ea0c4d72f78 100644 --- a/security/integrity/ima/ima_api.c +++ b/security/integrity/ima/ima_api.c @@ -243,6 +243,7 @@ int ima_collect_measurement(struct integrity_iint_cache *iint, { const char *audit_cause = "failed"; struct inode *inode = file_inode(file); + struct inode *real_inode = d_real_inode(file_dentry(file)); const char *filename = file->f_path.dentry->d_name.name; struct ima_max_digest_data hash; struct kstat stat; @@ -302,6 +303,10 @@ int ima_collect_measurement(struct integrity_iint_cache *iint, iint->ima_hash = tmpbuf; memcpy(iint->ima_hash, &hash, length); iint->version = i_version; + if (real_inode != inode) { + iint->real_ino = real_inode->i_ino; + iint->real_dev = real_inode->i_sb->s_dev; + } /* Possibly temporary failure due to type of read (eg. O_DIRECT) */ if (!result) diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index 365db0e43d7c22..cc1217ac2c6faf 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "ima.h" @@ -207,7 +208,7 @@ static int process_measurement(struct file *file, const struct cred *cred, u32 secid, char *buf, loff_t size, int mask, enum ima_hooks func) { - struct inode *inode = file_inode(file); + struct inode *backing_inode, *inode = file_inode(file); struct integrity_iint_cache *iint = NULL; struct ima_template_desc *template_desc = NULL; char *pathbuf = NULL; @@ -284,6 +285,19 @@ static int process_measurement(struct file *file, const struct cred *cred, iint->measured_pcrs = 0; } + /* Detect and re-evaluate changes made to the backing file. */ + backing_inode = d_real_inode(file_dentry(file)); + if (backing_inode != inode && + (action & IMA_DO_MASK) && (iint->flags & IMA_DONE_MASK)) { + if (!IS_I_VERSION(backing_inode) || + backing_inode->i_sb->s_dev != iint->real_dev || + backing_inode->i_ino != iint->real_ino || + !inode_eq_iversion(backing_inode, iint->version)) { + iint->flags &= ~IMA_DONE_MASK; + iint->measured_pcrs = 0; + } + } + /* Determine if already appraised/measured based on bitmask * (IMA_MEASURE, IMA_MEASURED, IMA_XXXX_APPRAISE, IMA_XXXX_APPRAISED, * IMA_AUDIT, IMA_AUDITED) diff --git a/security/integrity/integrity.h b/security/integrity/integrity.h index d7553c93f5c0d0..9561db7cf6b42c 100644 --- a/security/integrity/integrity.h +++ b/security/integrity/integrity.h @@ -164,6 +164,8 @@ struct integrity_iint_cache { unsigned long flags; unsigned long measured_pcrs; unsigned long atomic_flags; + unsigned long real_ino; + dev_t real_dev; enum integrity_status ima_file_status:4; enum integrity_status ima_mmap_status:4; enum integrity_status ima_bprm_status:4; From 9b09f11320dba5cde5cccdb61b0f42f276e7abe7 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:46 -0700 Subject: [PATCH 413/515] LSM: Identify modules by more than name Create a struct lsm_id to contain identifying information about Linux Security Modules (LSMs). At inception this contains the name of the module and an identifier associated with the security module. Change the security_add_hooks() interface to use this structure. Change the individual modules to maintain their own struct lsm_id and pass it to security_add_hooks(). The values are for LSM identifiers are defined in a new UAPI header file linux/lsm.h. Each existing LSM has been updated to include it's LSMID in the lsm_id. The LSM ID values are sequential, with the oldest module LSM_ID_CAPABILITY being the lowest value and the existing modules numbered in the order they were included in the main line kernel. This is an arbitrary convention for assigning the values, but none better presents itself. The value 0 is defined as being invalid. The values 1-99 are reserved for any special case uses which may arise in the future. This may include attributes of the LSM infrastructure itself, possibly related to namespacing or network attribute management. A special range is identified for such attributes to help reduce confusion for developers unfamiliar with LSMs. LSM attribute values are defined for the attributes presented by modules that are available today. As with the LSM IDs, The value 0 is defined as being invalid. The values 1-99 are reserved for any special case uses which may arise in the future. Cc: linux-security-module Signed-off-by: Casey Schaufler Reviewed-by: Kees Cook Reviewed-by: Serge Hallyn Reviewed-by: Mickael Salaun Reviewed-by: John Johansen Signed-off-by: Kees Cook Nacked-by: Tetsuo Handa Signed-off-by: Paul Moore --- Documentation/userspace-api/index.rst | 1 + MAINTAINERS | 1 + include/linux/lsm_hooks.h | 16 +++++++- include/uapi/linux/lsm.h | 54 +++++++++++++++++++++++++++ security/apparmor/lsm.c | 8 +++- security/bpf/hooks.c | 9 ++++- security/commoncap.c | 8 +++- security/landlock/cred.c | 2 +- security/landlock/fs.c | 2 +- security/landlock/ptrace.c | 2 +- security/landlock/setup.c | 6 +++ security/landlock/setup.h | 1 + security/loadpin/loadpin.c | 9 ++++- security/lockdown/lockdown.c | 8 +++- security/safesetid/lsm.c | 9 ++++- security/security.c | 12 +++--- security/selinux/hooks.c | 9 ++++- security/smack/smack_lsm.c | 8 +++- security/tomoyo/tomoyo.c | 9 ++++- security/yama/yama_lsm.c | 8 +++- 20 files changed, 161 insertions(+), 21 deletions(-) create mode 100644 include/uapi/linux/lsm.h diff --git a/Documentation/userspace-api/index.rst b/Documentation/userspace-api/index.rst index 72a65db0c49889..b5fa29c077eb77 100644 --- a/Documentation/userspace-api/index.rst +++ b/Documentation/userspace-api/index.rst @@ -32,6 +32,7 @@ place where this information is gathered. sysfs-platform_profile vduse futex2 + lsm .. only:: subproject and html diff --git a/MAINTAINERS b/MAINTAINERS index 35977b269d5efb..b693e60750e62b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19308,6 +19308,7 @@ L: linux-security-module@vger.kernel.org (suggested Cc:) S: Supported W: http://kernsec.org/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git +F: include/uapi/linux/lsm.h F: security/ X: security/selinux/ diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index dcb5e5b5eb1352..7f0adb33caaae6 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -42,6 +42,18 @@ struct security_hook_heads { #undef LSM_HOOK } __randomize_layout; +/** + * struct lsm_id - Identify a Linux Security Module. + * @lsm: name of the LSM, must be approved by the LSM maintainers + * @id: LSM ID number from uapi/linux/lsm.h + * + * Contains the information that identifies the LSM. + */ +struct lsm_id { + const char *name; + u64 id; +}; + /* * Security module hook list structure. * For use with generic list macros for common operations. @@ -50,7 +62,7 @@ struct security_hook_list { struct hlist_node list; struct hlist_head *head; union security_list_options hook; - const char *lsm; + const struct lsm_id *lsmid; } __randomize_layout; /* @@ -104,7 +116,7 @@ extern struct security_hook_heads security_hook_heads; extern char *lsm_names; extern void security_add_hooks(struct security_hook_list *hooks, int count, - const char *lsm); + const struct lsm_id *lsmid); #define LSM_FLAG_LEGACY_MAJOR BIT(0) #define LSM_FLAG_EXCLUSIVE BIT(1) diff --git a/include/uapi/linux/lsm.h b/include/uapi/linux/lsm.h new file mode 100644 index 00000000000000..f27c9a9cc376c9 --- /dev/null +++ b/include/uapi/linux/lsm.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Linux Security Modules (LSM) - User space API + * + * Copyright (C) 2022 Casey Schaufler + * Copyright (C) 2022 Intel Corporation + */ + +#ifndef _UAPI_LINUX_LSM_H +#define _UAPI_LINUX_LSM_H + +/* + * ID tokens to identify Linux Security Modules (LSMs) + * + * These token values are used to uniquely identify specific LSMs + * in the kernel as well as in the kernel's LSM userspace API. + * + * A value of zero/0 is considered undefined and should not be used + * outside the kernel. Values 1-99 are reserved for potential + * future use. + */ +#define LSM_ID_UNDEF 0 +#define LSM_ID_CAPABILITY 100 +#define LSM_ID_SELINUX 101 +#define LSM_ID_SMACK 102 +#define LSM_ID_TOMOYO 103 +#define LSM_ID_IMA 104 +#define LSM_ID_APPARMOR 105 +#define LSM_ID_YAMA 106 +#define LSM_ID_LOADPIN 107 +#define LSM_ID_SAFESETID 108 +#define LSM_ID_LOCKDOWN 109 +#define LSM_ID_BPF 110 +#define LSM_ID_LANDLOCK 111 + +/* + * LSM_ATTR_XXX definitions identify different LSM attributes + * which are used in the kernel's LSM userspace API. Support + * for these attributes vary across the different LSMs. None + * are required. + * + * A value of zero/0 is considered undefined and should not be used + * outside the kernel. Values 1-99 are reserved for potential + * future use. + */ +#define LSM_ATTR_UNDEF 0 +#define LSM_ATTR_CURRENT 100 +#define LSM_ATTR_EXEC 101 +#define LSM_ATTR_FSCREATE 102 +#define LSM_ATTR_KEYCREATE 103 +#define LSM_ATTR_PREV 104 +#define LSM_ATTR_SOCKCREATE 105 + +#endif /* _UAPI_LINUX_LSM_H */ diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 108eccc5ada584..20b93501fbd142 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "include/apparmor.h" #include "include/apparmorfs.h" @@ -1215,6 +1216,11 @@ struct lsm_blob_sizes apparmor_blob_sizes __ro_after_init = { .lbs_task = sizeof(struct aa_task_ctx), }; +const struct lsm_id apparmor_lsmid = { + .name = "apparmor", + .id = LSM_ID_APPARMOR, +}; + static struct security_hook_list apparmor_hooks[] __ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, apparmor_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, apparmor_ptrace_traceme), @@ -1904,7 +1910,7 @@ static int __init apparmor_init(void) goto buffers_out; } security_add_hooks(apparmor_hooks, ARRAY_SIZE(apparmor_hooks), - "apparmor"); + &apparmor_lsmid); /* Report that AppArmor successfully initialized */ apparmor_initialized = 1; diff --git a/security/bpf/hooks.c b/security/bpf/hooks.c index cfaf1d0e6a5f51..91011e0c361ac0 100644 --- a/security/bpf/hooks.c +++ b/security/bpf/hooks.c @@ -5,6 +5,7 @@ */ #include #include +#include static struct security_hook_list bpf_lsm_hooks[] __ro_after_init = { #define LSM_HOOK(RET, DEFAULT, NAME, ...) \ @@ -15,9 +16,15 @@ static struct security_hook_list bpf_lsm_hooks[] __ro_after_init = { LSM_HOOK_INIT(task_free, bpf_task_storage_free), }; +const struct lsm_id bpf_lsmid = { + .name = "bpf", + .id = LSM_ID_BPF, +}; + static int __init bpf_lsm_init(void) { - security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), "bpf"); + security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), + &bpf_lsmid); pr_info("LSM support for eBPF active\n"); return 0; } diff --git a/security/commoncap.c b/security/commoncap.c index bc05211041979c..9aaad2c3e54afa 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -25,6 +25,7 @@ #include #include #include +#include /* * If a non-root user executes a setuid-root binary in @@ -1440,6 +1441,11 @@ int cap_mmap_file(struct file *file, unsigned long reqprot, #ifdef CONFIG_SECURITY +const struct lsm_id capability_lsmid = { + .name = "capability", + .id = LSM_ID_CAPABILITY, +}; + static struct security_hook_list capability_hooks[] __ro_after_init = { LSM_HOOK_INIT(capable, cap_capable), LSM_HOOK_INIT(settime, cap_settime), @@ -1464,7 +1470,7 @@ static struct security_hook_list capability_hooks[] __ro_after_init = { static int __init capability_init(void) { security_add_hooks(capability_hooks, ARRAY_SIZE(capability_hooks), - "capability"); + &capability_lsmid); return 0; } diff --git a/security/landlock/cred.c b/security/landlock/cred.c index 13dff2a3154513..786af18c4a1ca8 100644 --- a/security/landlock/cred.c +++ b/security/landlock/cred.c @@ -42,5 +42,5 @@ static struct security_hook_list landlock_hooks[] __ro_after_init = { __init void landlock_add_cred_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } diff --git a/security/landlock/fs.c b/security/landlock/fs.c index 1c0c198f6fdb85..db5ebecfbf02ef 100644 --- a/security/landlock/fs.c +++ b/security/landlock/fs.c @@ -1307,5 +1307,5 @@ static struct security_hook_list landlock_hooks[] __ro_after_init = { __init void landlock_add_fs_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } diff --git a/security/landlock/ptrace.c b/security/landlock/ptrace.c index 8a06d6c492bf3e..2bfc533d36e429 100644 --- a/security/landlock/ptrace.c +++ b/security/landlock/ptrace.c @@ -116,5 +116,5 @@ static struct security_hook_list landlock_hooks[] __ro_after_init = { __init void landlock_add_ptrace_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } diff --git a/security/landlock/setup.c b/security/landlock/setup.c index 0f6113528fa4a8..aab13750eddeb0 100644 --- a/security/landlock/setup.c +++ b/security/landlock/setup.c @@ -8,6 +8,7 @@ #include #include +#include #include "common.h" #include "cred.h" @@ -24,6 +25,11 @@ struct lsm_blob_sizes landlock_blob_sizes __ro_after_init = { .lbs_superblock = sizeof(struct landlock_superblock_security), }; +const struct lsm_id landlock_lsmid = { + .name = LANDLOCK_NAME, + .id = LSM_ID_LANDLOCK, +}; + static int __init landlock_init(void) { landlock_add_cred_hooks(); diff --git a/security/landlock/setup.h b/security/landlock/setup.h index 1daffab1ab4bda..c4252d46d49d48 100644 --- a/security/landlock/setup.h +++ b/security/landlock/setup.h @@ -14,5 +14,6 @@ extern bool landlock_initialized; extern struct lsm_blob_sizes landlock_blob_sizes; +extern const struct lsm_id landlock_lsmid; #endif /* _SECURITY_LANDLOCK_SETUP_H */ diff --git a/security/loadpin/loadpin.c b/security/loadpin/loadpin.c index a9d40456a06457..d682a851de58aa 100644 --- a/security/loadpin/loadpin.c +++ b/security/loadpin/loadpin.c @@ -20,6 +20,7 @@ #include #include #include +#include #define VERITY_DIGEST_FILE_HEADER "# LOADPIN_TRUSTED_VERITY_ROOT_DIGESTS" @@ -208,6 +209,11 @@ static int loadpin_load_data(enum kernel_load_data_id id, bool contents) return loadpin_check(NULL, (enum kernel_read_file_id) id); } +const struct lsm_id loadpin_lsmid = { + .name = "loadpin", + .id = LSM_ID_LOADPIN, +}; + static struct security_hook_list loadpin_hooks[] __ro_after_init = { LSM_HOOK_INIT(sb_free_security, loadpin_sb_free_security), LSM_HOOK_INIT(kernel_read_file, loadpin_read_file), @@ -259,7 +265,8 @@ static int __init loadpin_init(void) if (!register_sysctl("kernel/loadpin", loadpin_sysctl_table)) pr_notice("sysctl registration failed!\n"); #endif - security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), "loadpin"); + security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), + &loadpin_lsmid); return 0; } diff --git a/security/lockdown/lockdown.c b/security/lockdown/lockdown.c index 68d19632aeb725..cd84d8ea1dfbfa 100644 --- a/security/lockdown/lockdown.c +++ b/security/lockdown/lockdown.c @@ -13,6 +13,7 @@ #include #include #include +#include static enum lockdown_reason kernel_locked_down; @@ -75,6 +76,11 @@ static struct security_hook_list lockdown_hooks[] __ro_after_init = { LSM_HOOK_INIT(locked_down, lockdown_is_locked_down), }; +const struct lsm_id lockdown_lsmid = { + .name = "lockdown", + .id = LSM_ID_LOCKDOWN, +}; + static int __init lockdown_lsm_init(void) { #if defined(CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY) @@ -83,7 +89,7 @@ static int __init lockdown_lsm_init(void) lock_kernel_down("Kernel configuration", LOCKDOWN_CONFIDENTIALITY_MAX); #endif security_add_hooks(lockdown_hooks, ARRAY_SIZE(lockdown_hooks), - "lockdown"); + &lockdown_lsmid); return 0; } diff --git a/security/safesetid/lsm.c b/security/safesetid/lsm.c index 5be5894aa0ea02..f42d5af5ffb058 100644 --- a/security/safesetid/lsm.c +++ b/security/safesetid/lsm.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "lsm.h" /* Flag indicating whether initialization completed */ @@ -261,6 +262,11 @@ static int safesetid_task_fix_setgroups(struct cred *new, const struct cred *old return 0; } +const struct lsm_id safesetid_lsmid = { + .name = "safesetid", + .id = LSM_ID_SAFESETID, +}; + static struct security_hook_list safesetid_security_hooks[] = { LSM_HOOK_INIT(task_fix_setuid, safesetid_task_fix_setuid), LSM_HOOK_INIT(task_fix_setgid, safesetid_task_fix_setgid), @@ -271,7 +277,8 @@ static struct security_hook_list safesetid_security_hooks[] = { static int __init safesetid_security_init(void) { security_add_hooks(safesetid_security_hooks, - ARRAY_SIZE(safesetid_security_hooks), "safesetid"); + ARRAY_SIZE(safesetid_security_hooks), + &safesetid_lsmid); /* Report that SafeSetID successfully initialized */ safesetid_initialized = 1; diff --git a/security/security.c b/security/security.c index 23b129d482a7c8..ea69e83936fcba 100644 --- a/security/security.c +++ b/security/security.c @@ -513,17 +513,17 @@ static int lsm_append(const char *new, char **result) * security_add_hooks - Add a modules hooks to the hook lists. * @hooks: the hooks to add * @count: the number of hooks to add - * @lsm: the name of the security module + * @lsmid: the identification information for the security module * * Each LSM has to register its hooks with the infrastructure. */ void __init security_add_hooks(struct security_hook_list *hooks, int count, - const char *lsm) + const struct lsm_id *lsmid) { int i; for (i = 0; i < count; i++) { - hooks[i].lsm = lsm; + hooks[i].lsmid = lsmid; hlist_add_tail_rcu(&hooks[i].list, hooks[i].head); } @@ -532,7 +532,7 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count, * and fix this up afterwards. */ if (slab_is_available()) { - if (lsm_append(lsm, &lsm_names) < 0) + if (lsm_append(lsmid->name, &lsm_names) < 0) panic("%s - Cannot get early memory.\n", __func__); } } @@ -3817,7 +3817,7 @@ int security_getprocattr(struct task_struct *p, const char *lsm, struct security_hook_list *hp; hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsm)) + if (lsm != NULL && strcmp(lsm, hp->lsmid->name)) continue; return hp->hook.getprocattr(p, name, value); } @@ -3842,7 +3842,7 @@ int security_setprocattr(const char *lsm, const char *name, void *value, struct security_hook_list *hp; hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsm)) + if (lsm != NULL && strcmp(lsm, hp->lsmid->name)) continue; return hp->hook.setprocattr(name, value, size); } diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 2aa0e219d72177..82fabad1a831c2 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -92,6 +92,7 @@ #include #include #include +#include #include "avc.h" #include "objsec.h" @@ -6950,6 +6951,11 @@ static int selinux_uring_cmd(struct io_uring_cmd *ioucmd) } #endif /* CONFIG_IO_URING */ +const struct lsm_id selinux_lsmid = { + .name = "selinux", + .id = LSM_ID_SELINUX, +}; + /* * IMPORTANT NOTE: When adding new hooks, please be careful to keep this order: * 1. any hooks that don't belong to (2.) or (3.) below, @@ -7270,7 +7276,8 @@ static __init int selinux_init(void) hashtab_cache_init(); - security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), "selinux"); + security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), + &selinux_lsmid); if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) panic("SELinux: Unable to register AVC netcache callback\n"); diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 65130a791f5730..f73f9a2834eb7e 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "smack.h" #define TRANS_TRUE "TRUE" @@ -4933,6 +4934,11 @@ struct lsm_blob_sizes smack_blob_sizes __ro_after_init = { .lbs_xattr_count = SMACK_INODE_INIT_XATTRS, }; +const struct lsm_id smack_lsmid = { + .name = "smack", + .id = LSM_ID_SMACK, +}; + static struct security_hook_list smack_hooks[] __ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, smack_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme), @@ -5140,7 +5146,7 @@ static __init int smack_init(void) /* * Register with LSM */ - security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), "smack"); + security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), &smack_lsmid); smack_enabled = 1; pr_info("Smack: Initializing.\n"); diff --git a/security/tomoyo/tomoyo.c b/security/tomoyo/tomoyo.c index 25006fddc964b4..556f8daecb0729 100644 --- a/security/tomoyo/tomoyo.c +++ b/security/tomoyo/tomoyo.c @@ -6,6 +6,7 @@ */ #include +#include #include "common.h" /** @@ -542,6 +543,11 @@ static void tomoyo_task_free(struct task_struct *task) } } +const struct lsm_id tomoyo_lsmid = { + .name = "tomoyo", + .id = LSM_ID_TOMOYO, +}; + /* * tomoyo_security_ops is a "struct security_operations" which is used for * registering TOMOYO. @@ -595,7 +601,8 @@ static int __init tomoyo_init(void) struct tomoyo_task *s = tomoyo_task(current); /* register ourselves with the security framework */ - security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), "tomoyo"); + security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), + &tomoyo_lsmid); pr_info("TOMOYO Linux initialized\n"); s->domain_info = &tomoyo_kernel_domain; atomic_inc(&tomoyo_kernel_domain.users); diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c index 2503cf153d4ad8..5cdff292fcae8e 100644 --- a/security/yama/yama_lsm.c +++ b/security/yama/yama_lsm.c @@ -18,6 +18,7 @@ #include #include #include +#include #define YAMA_SCOPE_DISABLED 0 #define YAMA_SCOPE_RELATIONAL 1 @@ -421,6 +422,11 @@ static int yama_ptrace_traceme(struct task_struct *parent) return rc; } +const struct lsm_id yama_lsmid = { + .name = "yama", + .id = LSM_ID_YAMA, +}; + static struct security_hook_list yama_hooks[] __ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, yama_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, yama_ptrace_traceme), @@ -471,7 +477,7 @@ static inline void yama_init_sysctl(void) { } static int __init yama_init(void) { pr_info("Yama: becoming mindful.\n"); - security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), "yama"); + security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), &yama_lsmid); yama_init_sysctl(); return 0; } From a9fd3080aa638a95aeac67bc1afa6f60e1417e29 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:47 -0700 Subject: [PATCH 414/515] LSM: Maintain a table of LSM attribute data As LSMs are registered add their lsm_id pointers to a table. This will be used later for attribute reporting. Determine the number of possible security modules based on their respective CONFIG options. This allows the number to be known at build time. This allows data structures and tables to use the constant. Signed-off-by: Casey Schaufler Reviewed-by: Kees Cook Reviewed-by: Serge Hallyn Reviewed-by: Mickael Salaun Reviewed-by: John Johansen Signed-off-by: Paul Moore --- include/linux/security.h | 2 ++ security/security.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/linux/security.h b/include/linux/security.h index 5f16eecde00bc7..c1a6af37a53859 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -138,6 +138,8 @@ enum lockdown_reason { }; extern const char *const lockdown_reasons[LOCKDOWN_CONFIDENTIALITY_MAX+1]; +extern u32 lsm_active_cnt; +extern const struct lsm_id *lsm_idlist[]; /* These functions are in security/commoncap.c */ extern int cap_capable(const struct cred *cred, struct user_namespace *ns, diff --git a/security/security.c b/security/security.c index ea69e83936fcba..f71715a6f5dd30 100644 --- a/security/security.c +++ b/security/security.c @@ -34,6 +34,25 @@ /* How many LSMs were built into the kernel? */ #define LSM_COUNT (__end_lsm_info - __start_lsm_info) +/* + * How many LSMs are built into the kernel as determined at + * build time. Used to determine fixed array sizes. + * The capability module is accounted for by CONFIG_SECURITY + */ +#define LSM_CONFIG_COUNT ( \ + (IS_ENABLED(CONFIG_SECURITY) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_SELINUX) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_SMACK) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_TOMOYO) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_IMA) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_APPARMOR) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_YAMA) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_LOADPIN) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_SAFESETID) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_LOCKDOWN_LSM) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_BPF_LSM) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_LANDLOCK) ? 1 : 0)) + /* * These are descriptions of the reasons that can be passed to the * security_locked_down() LSM hook. Placing this array here allows @@ -245,6 +264,12 @@ static void __init initialize_lsm(struct lsm_info *lsm) } } +/* + * Current index to use while initializing the lsm id list. + */ +u32 lsm_active_cnt __ro_after_init; +const struct lsm_id *lsm_idlist[LSM_CONFIG_COUNT]; + /* Populate ordered LSMs list from comma-separated LSM name list. */ static void __init ordered_lsm_parse(const char *order, const char *origin) { @@ -522,6 +547,18 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count, { int i; + /* + * A security module may call security_add_hooks() more + * than once during initialization, and LSM initialization + * is serialized. Landlock is one such case. + * Look at the previous entry, if there is one, for duplication. + */ + if (lsm_active_cnt == 0 || lsm_idlist[lsm_active_cnt - 1] != lsmid) { + if (lsm_active_cnt >= LSM_CONFIG_COUNT) + panic("%s Too many LSMs registered.\n", __func__); + lsm_idlist[lsm_active_cnt++] = lsmid; + } + for (i = 0; i < count; i++) { hooks[i].lsmid = lsmid; hlist_add_tail_rcu(&hooks[i].list, hooks[i].head); From e415936ff7c67f3ac94a3c6c73483e97a88eb378 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:48 -0700 Subject: [PATCH 415/515] proc: Use lsmids instead of lsm names for attrs Use the LSM ID number instead of the LSM name to identify which security module's attibute data should be shown in /proc/self/attr. The security_[gs]etprocattr() functions have been changed to expect the LSM ID. The change from a string comparison to an integer comparison in these functions will provide a minor performance improvement. Cc: linux-fsdevel@vger.kernel.org Signed-off-by: Casey Schaufler Reviewed-by: Kees Cook Reviewed-by: Serge Hallyn Reviewed-by: Mickael Salaun Reviewed-by: John Johansen Signed-off-by: Paul Moore --- fs/proc/base.c | 29 +++++++++++++++-------------- fs/proc/internal.h | 2 +- include/linux/security.h | 11 +++++------ security/security.c | 15 +++++++-------- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index ffd54617c35478..97ce30528f7575 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -97,6 +97,7 @@ #include #include #include +#include #include #include "internal.h" #include "fd.h" @@ -146,10 +147,10 @@ struct pid_entry { NOD(NAME, (S_IFREG|(MODE)), \ NULL, &proc_single_file_operations, \ { .proc_show = show } ) -#define ATTR(LSM, NAME, MODE) \ +#define ATTR(LSMID, NAME, MODE) \ NOD(NAME, (S_IFREG|(MODE)), \ NULL, &proc_pid_attr_operations, \ - { .lsm = LSM }) + { .lsmid = LSMID }) /* * Count the number of hardlinks for the pid_entry table, excluding the . @@ -2730,7 +2731,7 @@ static ssize_t proc_pid_attr_read(struct file * file, char __user * buf, if (!task) return -ESRCH; - length = security_getprocattr(task, PROC_I(inode)->op.lsm, + length = security_getprocattr(task, PROC_I(inode)->op.lsmid, file->f_path.dentry->d_name.name, &p); put_task_struct(task); @@ -2788,7 +2789,7 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf, if (rv < 0) goto out_free; - rv = security_setprocattr(PROC_I(inode)->op.lsm, + rv = security_setprocattr(PROC_I(inode)->op.lsmid, file->f_path.dentry->d_name.name, page, count); mutex_unlock(¤t->signal->cred_guard_mutex); @@ -2837,27 +2838,27 @@ static const struct inode_operations proc_##LSM##_attr_dir_inode_ops = { \ #ifdef CONFIG_SECURITY_SMACK static const struct pid_entry smack_attr_dir_stuff[] = { - ATTR("smack", "current", 0666), + ATTR(LSM_ID_SMACK, "current", 0666), }; LSM_DIR_OPS(smack); #endif #ifdef CONFIG_SECURITY_APPARMOR static const struct pid_entry apparmor_attr_dir_stuff[] = { - ATTR("apparmor", "current", 0666), - ATTR("apparmor", "prev", 0444), - ATTR("apparmor", "exec", 0666), + ATTR(LSM_ID_APPARMOR, "current", 0666), + ATTR(LSM_ID_APPARMOR, "prev", 0444), + ATTR(LSM_ID_APPARMOR, "exec", 0666), }; LSM_DIR_OPS(apparmor); #endif static const struct pid_entry attr_dir_stuff[] = { - ATTR(NULL, "current", 0666), - ATTR(NULL, "prev", 0444), - ATTR(NULL, "exec", 0666), - ATTR(NULL, "fscreate", 0666), - ATTR(NULL, "keycreate", 0666), - ATTR(NULL, "sockcreate", 0666), + ATTR(LSM_ID_UNDEF, "current", 0666), + ATTR(LSM_ID_UNDEF, "prev", 0444), + ATTR(LSM_ID_UNDEF, "exec", 0666), + ATTR(LSM_ID_UNDEF, "fscreate", 0666), + ATTR(LSM_ID_UNDEF, "keycreate", 0666), + ATTR(LSM_ID_UNDEF, "sockcreate", 0666), #ifdef CONFIG_SECURITY_SMACK DIR("smack", 0555, proc_smack_attr_dir_inode_ops, proc_smack_attr_dir_ops), diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 9a8f32f21ff569..a71ac5379584ab 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -92,7 +92,7 @@ union proc_op { int (*proc_show)(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *task); - const char *lsm; + int lsmid; }; struct proc_inode { diff --git a/include/linux/security.h b/include/linux/security.h index c1a6af37a53859..3f79bc191a7c91 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -472,10 +472,9 @@ int security_sem_semctl(struct kern_ipc_perm *sma, int cmd); int security_sem_semop(struct kern_ipc_perm *sma, struct sembuf *sops, unsigned nsops, int alter); void security_d_instantiate(struct dentry *dentry, struct inode *inode); -int security_getprocattr(struct task_struct *p, const char *lsm, const char *name, +int security_getprocattr(struct task_struct *p, int lsmid, const char *name, char **value); -int security_setprocattr(const char *lsm, const char *name, void *value, - size_t size); +int security_setprocattr(int lsmid, const char *name, void *value, size_t size); int security_netlink_send(struct sock *sk, struct sk_buff *skb); int security_ismaclabel(const char *name); int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen); @@ -1339,14 +1338,14 @@ static inline void security_d_instantiate(struct dentry *dentry, struct inode *inode) { } -static inline int security_getprocattr(struct task_struct *p, const char *lsm, +static inline int security_getprocattr(struct task_struct *p, int lsmid, const char *name, char **value) { return -EINVAL; } -static inline int security_setprocattr(const char *lsm, char *name, - void *value, size_t size) +static inline int security_setprocattr(int lsmid, char *name, void *value, + size_t size) { return -EINVAL; } diff --git a/security/security.c b/security/security.c index f71715a6f5dd30..a3489c04b78314 100644 --- a/security/security.c +++ b/security/security.c @@ -3840,7 +3840,7 @@ EXPORT_SYMBOL(security_d_instantiate); /** * security_getprocattr() - Read an attribute for a task * @p: the task - * @lsm: LSM name + * @lsmid: LSM identification * @name: attribute name * @value: attribute value * @@ -3848,13 +3848,13 @@ EXPORT_SYMBOL(security_d_instantiate); * * Return: Returns the length of @value on success, a negative value otherwise. */ -int security_getprocattr(struct task_struct *p, const char *lsm, - const char *name, char **value) +int security_getprocattr(struct task_struct *p, int lsmid, const char *name, + char **value) { struct security_hook_list *hp; hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsmid->name)) + if (lsmid != 0 && lsmid != hp->lsmid->id) continue; return hp->hook.getprocattr(p, name, value); } @@ -3863,7 +3863,7 @@ int security_getprocattr(struct task_struct *p, const char *lsm, /** * security_setprocattr() - Set an attribute for a task - * @lsm: LSM name + * @lsmid: LSM identification * @name: attribute name * @value: attribute value * @size: attribute value size @@ -3873,13 +3873,12 @@ int security_getprocattr(struct task_struct *p, const char *lsm, * * Return: Returns bytes written on success, a negative value otherwise. */ -int security_setprocattr(const char *lsm, const char *name, void *value, - size_t size) +int security_setprocattr(int lsmid, const char *name, void *value, size_t size) { struct security_hook_list *hp; hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsmid->name)) + if (lsmid != 0 && lsmid != hp->lsmid->id) continue; return hp->hook.setprocattr(name, value, size); } From b76b7463da30d1aabeb27fa92907db0843591d22 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:49 -0700 Subject: [PATCH 416/515] LSM: syscalls for current process attributes Create a system call lsm_get_self_attr() to provide the security module maintained attributes of the current process. Create a system call lsm_set_self_attr() to set a security module maintained attribute of the current process. Historically these attributes have been exposed to user space via entries in procfs under /proc/self/attr. The attribute value is provided in a lsm_ctx structure. The structure identifies the size of the attribute, and the attribute value. The format of the attribute value is defined by the security module. A flags field is included for LSM specific information. It is currently unused and must be 0. The total size of the data, including the lsm_ctx structure and any padding, is maintained as well. struct lsm_ctx { __u64 id; __u64 flags; __u64 len; __u64 ctx_len; __u8 ctx[]; }; Two new LSM hooks are used to interface with the LSMs. security_getselfattr() collects the lsm_ctx values from the LSMs that support the hook, accounting for space requirements. security_setselfattr() identifies which LSM the attribute is intended for and passes it along. Signed-off-by: Casey Schaufler Reviewed-by: Kees Cook Reviewed-by: Serge Hallyn Reviewed-by: John Johansen Signed-off-by: Paul Moore --- Documentation/userspace-api/lsm.rst | 70 +++++++++++++ include/linux/lsm_hook_defs.h | 4 + include/linux/lsm_hooks.h | 1 + include/linux/security.h | 19 ++++ include/linux/syscalls.h | 5 + include/uapi/linux/lsm.h | 36 +++++++ kernel/sys_ni.c | 2 + security/Makefile | 1 + security/lsm_syscalls.c | 57 +++++++++++ security/security.c | 152 ++++++++++++++++++++++++++++ 10 files changed, 347 insertions(+) create mode 100644 Documentation/userspace-api/lsm.rst create mode 100644 security/lsm_syscalls.c diff --git a/Documentation/userspace-api/lsm.rst b/Documentation/userspace-api/lsm.rst new file mode 100644 index 00000000000000..f8499f3e2826bc --- /dev/null +++ b/Documentation/userspace-api/lsm.rst @@ -0,0 +1,70 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. Copyright (C) 2022 Casey Schaufler +.. Copyright (C) 2022 Intel Corporation + +===================================== +Linux Security Modules +===================================== + +:Author: Casey Schaufler +:Date: July 2023 + +Linux security modules (LSM) provide a mechanism to implement +additional access controls to the Linux security policies. + +The various security modules may support any of these attributes: + +``LSM_ATTR_CURRENT`` is the current, active security context of the +process. +The proc filesystem provides this value in ``/proc/self/attr/current``. +This is supported by the SELinux, Smack and AppArmor security modules. +Smack also provides this value in ``/proc/self/attr/smack/current``. +AppArmor also provides this value in ``/proc/self/attr/apparmor/current``. + +``LSM_ATTR_EXEC`` is the security context of the process at the time the +current image was executed. +The proc filesystem provides this value in ``/proc/self/attr/exec``. +This is supported by the SELinux and AppArmor security modules. +AppArmor also provides this value in ``/proc/self/attr/apparmor/exec``. + +``LSM_ATTR_FSCREATE`` is the security context of the process used when +creating file system objects. +The proc filesystem provides this value in ``/proc/self/attr/fscreate``. +This is supported by the SELinux security module. + +``LSM_ATTR_KEYCREATE`` is the security context of the process used when +creating key objects. +The proc filesystem provides this value in ``/proc/self/attr/keycreate``. +This is supported by the SELinux security module. + +``LSM_ATTR_PREV`` is the security context of the process at the time the +current security context was set. +The proc filesystem provides this value in ``/proc/self/attr/prev``. +This is supported by the SELinux and AppArmor security modules. +AppArmor also provides this value in ``/proc/self/attr/apparmor/prev``. + +``LSM_ATTR_SOCKCREATE`` is the security context of the process used when +creating socket objects. +The proc filesystem provides this value in ``/proc/self/attr/sockcreate``. +This is supported by the SELinux security module. + +Kernel interface +================ + +Set a security attribute of the current process +----------------------------------------------- + +.. kernel-doc:: security/lsm_syscalls.c + :identifiers: sys_lsm_set_self_attr + +Get the specified security attributes of the current process +------------------------------------------------------------ + +.. kernel-doc:: security/lsm_syscalls.c + :identifiers: sys_lsm_get_self_attr + +Additional documentation +======================== + +* Documentation/security/lsm.rst +* Documentation/security/lsm-development.rst diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h index ac962c4cb44b10..97233e6e2091f5 100644 --- a/include/linux/lsm_hook_defs.h +++ b/include/linux/lsm_hook_defs.h @@ -262,6 +262,10 @@ LSM_HOOK(int, 0, sem_semop, struct kern_ipc_perm *perm, struct sembuf *sops, LSM_HOOK(int, 0, netlink_send, struct sock *sk, struct sk_buff *skb) LSM_HOOK(void, LSM_RET_VOID, d_instantiate, struct dentry *dentry, struct inode *inode) +LSM_HOOK(int, -EOPNOTSUPP, getselfattr, unsigned int attr, + struct lsm_ctx __user *ctx, size_t *size, u32 flags) +LSM_HOOK(int, -EOPNOTSUPP, setselfattr, unsigned int attr, + struct lsm_ctx *ctx, size_t size, u32 flags) LSM_HOOK(int, -EINVAL, getprocattr, struct task_struct *p, const char *name, char **value) LSM_HOOK(int, -EINVAL, setprocattr, const char *name, void *value, size_t size) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 7f0adb33caaae6..a2ade0ffe9e7d2 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -25,6 +25,7 @@ #ifndef __LINUX_LSM_HOOKS_H #define __LINUX_LSM_HOOKS_H +#include #include #include #include diff --git a/include/linux/security.h b/include/linux/security.h index 3f79bc191a7c91..8831d7cf0a6b48 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -60,6 +60,7 @@ struct fs_parameter; enum fs_value_type; struct watch; struct watch_notification; +struct lsm_ctx; /* Default (no) options for the capable function */ #define CAP_OPT_NONE 0x0 @@ -472,6 +473,10 @@ int security_sem_semctl(struct kern_ipc_perm *sma, int cmd); int security_sem_semop(struct kern_ipc_perm *sma, struct sembuf *sops, unsigned nsops, int alter); void security_d_instantiate(struct dentry *dentry, struct inode *inode); +int security_getselfattr(unsigned int attr, struct lsm_ctx __user *ctx, + size_t __user *size, u32 flags); +int security_setselfattr(unsigned int attr, struct lsm_ctx __user *ctx, + size_t size, u32 flags); int security_getprocattr(struct task_struct *p, int lsmid, const char *name, char **value); int security_setprocattr(int lsmid, const char *name, void *value, size_t size); @@ -1338,6 +1343,20 @@ static inline void security_d_instantiate(struct dentry *dentry, struct inode *inode) { } +static inline int security_getselfattr(unsigned int attr, + struct lsm_ctx __user *ctx, + size_t __user *size, u32 flags) +{ + return -EOPNOTSUPP; +} + +static inline int security_setselfattr(unsigned int attr, + struct lsm_ctx __user *ctx, + size_t size, u32 flags) +{ + return -EOPNOTSUPP; +} + static inline int security_getprocattr(struct task_struct *p, int lsmid, const char *name, char **value) { diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 22bc6bc147f899..8637287bd39dfd 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -71,6 +71,7 @@ struct clone_args; struct open_how; struct mount_attr; struct landlock_ruleset_attr; +struct lsm_ctx; enum landlock_rule_type; struct cachestat_range; struct cachestat; @@ -940,6 +941,10 @@ asmlinkage long sys_cachestat(unsigned int fd, struct cachestat_range __user *cstat_range, struct cachestat __user *cstat, unsigned int flags); asmlinkage long sys_map_shadow_stack(unsigned long addr, unsigned long size, unsigned int flags); +asmlinkage long sys_lsm_get_self_attr(unsigned int attr, struct lsm_ctx *ctx, + size_t *size, __u32 flags); +asmlinkage long sys_lsm_set_self_attr(unsigned int attr, struct lsm_ctx *ctx, + size_t size, __u32 flags); /* * Architecture-specific system calls diff --git a/include/uapi/linux/lsm.h b/include/uapi/linux/lsm.h index f27c9a9cc376c9..eeda59a77c0264 100644 --- a/include/uapi/linux/lsm.h +++ b/include/uapi/linux/lsm.h @@ -9,6 +9,36 @@ #ifndef _UAPI_LINUX_LSM_H #define _UAPI_LINUX_LSM_H +#include +#include + +/** + * struct lsm_ctx - LSM context information + * @id: the LSM id number, see LSM_ID_XXX + * @flags: LSM specific flags + * @len: length of the lsm_ctx struct, @ctx and any other data or padding + * @ctx_len: the size of @ctx + * @ctx: the LSM context value + * + * The @len field MUST be equal to the size of the lsm_ctx struct + * plus any additional padding and/or data placed after @ctx. + * + * In all cases @ctx_len MUST be equal to the length of @ctx. + * If @ctx is a string value it should be nul terminated with + * @ctx_len equal to `strlen(@ctx) + 1`. Binary values are + * supported. + * + * The @flags and @ctx fields SHOULD only be interpreted by the + * LSM specified by @id; they MUST be set to zero/0 when not used. + */ +struct lsm_ctx { + __u64 id; + __u64 flags; + __u64 len; + __u64 ctx_len; + __u8 ctx[]; +}; + /* * ID tokens to identify Linux Security Modules (LSMs) * @@ -51,4 +81,10 @@ #define LSM_ATTR_PREV 104 #define LSM_ATTR_SOCKCREATE 105 +/* + * LSM_FLAG_XXX definitions identify special handling instructions + * for the API. + */ +#define LSM_FLAG_SINGLE 0x0001 + #endif /* _UAPI_LINUX_LSM_H */ diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index e137c1385c569e..f81f2468c0cef6 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c @@ -170,6 +170,8 @@ COND_SYSCALL(landlock_add_rule); COND_SYSCALL(landlock_restrict_self); COND_SYSCALL(fadvise64_64); COND_SYSCALL_COMPAT(fadvise64_64); +COND_SYSCALL(lsm_get_self_attr); +COND_SYSCALL(lsm_set_self_attr); /* CONFIG_MMU only */ COND_SYSCALL(swapon); diff --git a/security/Makefile b/security/Makefile index 18121f8f85cd7d..59f23849066500 100644 --- a/security/Makefile +++ b/security/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_KEYS) += keys/ # always enable default capabilities obj-y += commoncap.o +obj-$(CONFIG_SECURITY) += lsm_syscalls.o obj-$(CONFIG_MMU) += min_addr.o # Object file lists diff --git a/security/lsm_syscalls.c b/security/lsm_syscalls.c new file mode 100644 index 00000000000000..226ae80d9683cf --- /dev/null +++ b/security/lsm_syscalls.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * System calls implementing the Linux Security Module API. + * + * Copyright (C) 2022 Casey Schaufler + * Copyright (C) 2022 Intel Corporation + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * sys_lsm_set_self_attr - Set current task's security module attribute + * @attr: which attribute to set + * @ctx: the LSM contexts + * @size: size of @ctx + * @flags: reserved for future use + * + * Sets the calling task's LSM context. On success this function + * returns 0. If the attribute specified cannot be set a negative + * value indicating the reason for the error is returned. + */ +SYSCALL_DEFINE4(lsm_set_self_attr, unsigned int, attr, struct lsm_ctx __user *, + ctx, size_t, size, u32, flags) +{ + return security_setselfattr(attr, ctx, size, flags); +} + +/** + * sys_lsm_get_self_attr - Return current task's security module attributes + * @attr: which attribute to return + * @ctx: the user-space destination for the information, or NULL + * @size: pointer to the size of space available to receive the data + * @flags: special handling options. LSM_FLAG_SINGLE indicates that only + * attributes associated with the LSM identified in the passed @ctx be + * reported. + * + * Returns the calling task's LSM contexts. On success this + * function returns the number of @ctx array elements. This value + * may be zero if there are no LSM contexts assigned. If @size is + * insufficient to contain the return data -E2BIG is returned and + * @size is set to the minimum required size. In all other cases + * a negative value indicating the error is returned. + */ +SYSCALL_DEFINE4(lsm_get_self_attr, unsigned int, attr, struct lsm_ctx __user *, + ctx, size_t __user *, size, u32, flags) +{ + return security_getselfattr(attr, ctx, size, flags); +} diff --git a/security/security.c b/security/security.c index a3489c04b78314..0d179750d964b7 100644 --- a/security/security.c +++ b/security/security.c @@ -3837,6 +3837,158 @@ void security_d_instantiate(struct dentry *dentry, struct inode *inode) } EXPORT_SYMBOL(security_d_instantiate); +/* + * Please keep this in sync with it's counterpart in security/lsm_syscalls.c + */ + +/** + * security_getselfattr - Read an LSM attribute of the current process. + * @attr: which attribute to return + * @uctx: the user-space destination for the information, or NULL + * @size: pointer to the size of space available to receive the data + * @flags: special handling options. LSM_FLAG_SINGLE indicates that only + * attributes associated with the LSM identified in the passed @ctx be + * reported. + * + * A NULL value for @uctx can be used to get both the number of attributes + * and the size of the data. + * + * Returns the number of attributes found on success, negative value + * on error. @size is reset to the total size of the data. + * If @size is insufficient to contain the data -E2BIG is returned. + */ +int security_getselfattr(unsigned int attr, struct lsm_ctx __user *uctx, + size_t __user *size, u32 flags) +{ + struct security_hook_list *hp; + struct lsm_ctx lctx = { .id = LSM_ID_UNDEF, }; + u8 __user *base = (u8 __user *)uctx; + size_t total = 0; + size_t entrysize; + size_t left; + bool toobig = false; + bool single = false; + int count = 0; + int rc; + + if (attr == LSM_ATTR_UNDEF) + return -EINVAL; + if (size == NULL) + return -EINVAL; + if (get_user(left, size)) + return -EFAULT; + + if (flags) { + /* + * Only flag supported is LSM_FLAG_SINGLE + */ + if (flags != LSM_FLAG_SINGLE) + return -EINVAL; + if (uctx && copy_from_user(&lctx, uctx, sizeof(lctx))) + return -EFAULT; + /* + * If the LSM ID isn't specified it is an error. + */ + if (lctx.id == LSM_ID_UNDEF) + return -EINVAL; + single = true; + } + + /* + * In the usual case gather all the data from the LSMs. + * In the single case only get the data from the LSM specified. + */ + hlist_for_each_entry(hp, &security_hook_heads.getselfattr, list) { + if (single && lctx.id != hp->lsmid->id) + continue; + entrysize = left; + if (base) + uctx = (struct lsm_ctx __user *)(base + total); + rc = hp->hook.getselfattr(attr, uctx, &entrysize, flags); + if (rc == -EOPNOTSUPP) { + rc = 0; + continue; + } + if (rc == -E2BIG) { + toobig = true; + left = 0; + } else if (rc < 0) + return rc; + else + left -= entrysize; + + total += entrysize; + count += rc; + if (single) + break; + } + if (put_user(total, size)) + return -EFAULT; + if (toobig) + return -E2BIG; + if (count == 0) + return LSM_RET_DEFAULT(getselfattr); + return count; +} + +/* + * Please keep this in sync with it's counterpart in security/lsm_syscalls.c + */ + +/** + * security_setselfattr - Set an LSM attribute on the current process. + * @attr: which attribute to set + * @uctx: the user-space source for the information + * @size: the size of the data + * @flags: reserved for future use, must be 0 + * + * Set an LSM attribute for the current process. The LSM, attribute + * and new value are included in @uctx. + * + * Returns 0 on success, -EINVAL if the input is inconsistent, -EFAULT + * if the user buffer is inaccessible, E2BIG if size is too big, or an + * LSM specific failure. + */ +int security_setselfattr(unsigned int attr, struct lsm_ctx __user *uctx, + size_t size, u32 flags) +{ + struct security_hook_list *hp; + struct lsm_ctx *lctx; + int rc = LSM_RET_DEFAULT(setselfattr); + + if (flags) + return -EINVAL; + if (size < sizeof(*lctx)) + return -EINVAL; + if (size > PAGE_SIZE) + return -E2BIG; + + lctx = kmalloc(size, GFP_KERNEL); + if (lctx == NULL) + return -ENOMEM; + + if (copy_from_user(lctx, uctx, size)) { + rc = -EFAULT; + goto free_out; + } + + if (size < lctx->len || size < lctx->ctx_len + sizeof(*lctx) || + lctx->len < lctx->ctx_len + sizeof(*lctx)) { + rc = -EINVAL; + goto free_out; + } + + hlist_for_each_entry(hp, &security_hook_heads.setselfattr, list) + if ((hp->lsmid->id) == lctx->id) { + rc = hp->hook.setselfattr(attr, lctx, size, flags); + break; + } + +free_out: + kfree(lctx); + return rc; +} + /** * security_getprocattr() - Read an attribute for a task * @p: the task From 75388b05a0b4924dc340e4cf6e1f77d31c132193 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:50 -0700 Subject: [PATCH 417/515] LSM: Create lsm_list_modules system call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create a system call to report the list of Linux Security Modules that are active on the system. The list is provided as an array of LSM ID numbers. The calling application can use this list determine what LSM specific actions it might take. That might include choosing an output format, determining required privilege or bypassing security module specific behavior. Signed-off-by: Casey Schaufler Reviewed-by: Kees Cook Reviewed-by: Serge Hallyn Reviewed-by: John Johansen Reviewed-by: Mickaël Salaün Signed-off-by: Paul Moore --- Documentation/userspace-api/lsm.rst | 3 +++ include/linux/syscalls.h | 1 + kernel/sys_ni.c | 1 + security/lsm_syscalls.c | 39 +++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/Documentation/userspace-api/lsm.rst b/Documentation/userspace-api/lsm.rst index f8499f3e2826bc..a76da373841b26 100644 --- a/Documentation/userspace-api/lsm.rst +++ b/Documentation/userspace-api/lsm.rst @@ -63,6 +63,9 @@ Get the specified security attributes of the current process .. kernel-doc:: security/lsm_syscalls.c :identifiers: sys_lsm_get_self_attr +.. kernel-doc:: security/lsm_syscalls.c + :identifiers: sys_lsm_list_modules + Additional documentation ======================== diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 8637287bd39dfd..323ef5e2667dca 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -945,6 +945,7 @@ asmlinkage long sys_lsm_get_self_attr(unsigned int attr, struct lsm_ctx *ctx, size_t *size, __u32 flags); asmlinkage long sys_lsm_set_self_attr(unsigned int attr, struct lsm_ctx *ctx, size_t size, __u32 flags); +asmlinkage long sys_lsm_list_modules(u64 *ids, size_t *size, u32 flags); /* * Architecture-specific system calls diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index f81f2468c0cef6..738ca470fcceb7 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c @@ -172,6 +172,7 @@ COND_SYSCALL(fadvise64_64); COND_SYSCALL_COMPAT(fadvise64_64); COND_SYSCALL(lsm_get_self_attr); COND_SYSCALL(lsm_set_self_attr); +COND_SYSCALL(lsm_list_modules); /* CONFIG_MMU only */ COND_SYSCALL(swapon); diff --git a/security/lsm_syscalls.c b/security/lsm_syscalls.c index 226ae80d9683cf..329aaca5efc03e 100644 --- a/security/lsm_syscalls.c +++ b/security/lsm_syscalls.c @@ -55,3 +55,42 @@ SYSCALL_DEFINE4(lsm_get_self_attr, unsigned int, attr, struct lsm_ctx __user *, { return security_getselfattr(attr, ctx, size, flags); } + +/** + * sys_lsm_list_modules - Return a list of the active security modules + * @ids: the LSM module ids + * @size: pointer to size of @ids, updated on return + * @flags: reserved for future use, must be zero + * + * Returns a list of the active LSM ids. On success this function + * returns the number of @ids array elements. This value may be zero + * if there are no LSMs active. If @size is insufficient to contain + * the return data -E2BIG is returned and @size is set to the minimum + * required size. In all other cases a negative value indicating the + * error is returned. + */ +SYSCALL_DEFINE3(lsm_list_modules, u64 __user *, ids, size_t __user *, size, + u32, flags) +{ + size_t total_size = lsm_active_cnt * sizeof(*ids); + size_t usize; + int i; + + if (flags) + return -EINVAL; + + if (get_user(usize, size)) + return -EFAULT; + + if (put_user(total_size, size) != 0) + return -EFAULT; + + if (usize < total_size) + return -E2BIG; + + for (i = 0; i < lsm_active_cnt; i++) + if (put_user(lsm_idlist[i]->id, ids++)) + return -EFAULT; + + return lsm_active_cnt; +} From 6d54f25e4605ccbd4f725966acf979ad2556c82a Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:51 -0700 Subject: [PATCH 418/515] LSM: wireup Linux Security Module syscalls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wireup lsm_get_self_attr, lsm_set_self_attr and lsm_list_modules system calls. Signed-off-by: Casey Schaufler Reviewed-by: Kees Cook Acked-by: Geert Uytterhoeven Acked-by: Arnd Bergmann Cc: linux-api@vger.kernel.org Reviewed-by: Mickaël Salaün Signed-off-by: Paul Moore --- arch/alpha/kernel/syscalls/syscall.tbl | 3 +++ arch/arm/tools/syscall.tbl | 3 +++ arch/arm64/include/asm/unistd.h | 2 +- arch/arm64/include/asm/unistd32.h | 6 ++++++ arch/ia64/kernel/syscalls/syscall.tbl | 3 +++ arch/m68k/kernel/syscalls/syscall.tbl | 3 +++ arch/microblaze/kernel/syscalls/syscall.tbl | 3 +++ arch/mips/kernel/syscalls/syscall_n32.tbl | 3 +++ arch/mips/kernel/syscalls/syscall_n64.tbl | 3 +++ arch/mips/kernel/syscalls/syscall_o32.tbl | 3 +++ arch/parisc/kernel/syscalls/syscall.tbl | 3 +++ arch/powerpc/kernel/syscalls/syscall.tbl | 3 +++ arch/s390/kernel/syscalls/syscall.tbl | 3 +++ arch/sh/kernel/syscalls/syscall.tbl | 3 +++ arch/sparc/kernel/syscalls/syscall.tbl | 3 +++ arch/x86/entry/syscalls/syscall_32.tbl | 3 +++ arch/x86/entry/syscalls/syscall_64.tbl | 3 +++ arch/xtensa/kernel/syscalls/syscall.tbl | 3 +++ include/uapi/asm-generic/unistd.h | 9 ++++++++- tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl | 3 +++ tools/perf/arch/powerpc/entry/syscalls/syscall.tbl | 3 +++ tools/perf/arch/s390/entry/syscalls/syscall.tbl | 3 +++ tools/perf/arch/x86/entry/syscalls/syscall_64.tbl | 3 +++ 23 files changed, 75 insertions(+), 2 deletions(-) diff --git a/arch/alpha/kernel/syscalls/syscall.tbl b/arch/alpha/kernel/syscalls/syscall.tbl index ad37569d05072a..01f4d0889a36d3 100644 --- a/arch/alpha/kernel/syscalls/syscall.tbl +++ b/arch/alpha/kernel/syscalls/syscall.tbl @@ -492,3 +492,6 @@ 560 common set_mempolicy_home_node sys_ni_syscall 561 common cachestat sys_cachestat 562 common fchmodat2 sys_fchmodat2 +563 common lsm_get_self_attr sys_lsm_get_self_attr +564 common lsm_set_self_attr sys_lsm_set_self_attr +565 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/arm/tools/syscall.tbl b/arch/arm/tools/syscall.tbl index c572d6c3dee0fd..e12db7b9fb8ddb 100644 --- a/arch/arm/tools/syscall.tbl +++ b/arch/arm/tools/syscall.tbl @@ -466,3 +466,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index bd77253b62e01c..f33190f17ebb61 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -39,7 +39,7 @@ #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE + 5) #define __ARM_NR_COMPAT_END (__ARM_NR_COMPAT_BASE + 0x800) -#define __NR_compat_syscalls 453 +#define __NR_compat_syscalls 456 #endif #define __ARCH_WANT_SYS_CLONE diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 78b68311ec8192..557345b38893bd 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -911,6 +911,12 @@ __SYSCALL(__NR_set_mempolicy_home_node, sys_set_mempolicy_home_node) __SYSCALL(__NR_cachestat, sys_cachestat) #define __NR_fchmodat2 452 __SYSCALL(__NR_fchmodat2, sys_fchmodat2) +#define __NR_lsm_get_self_attr 453 +__SYSCALL(__NR_lsm_get_self_attr, sys_lsm_get_self_attr) +#define __NR_lsm_set_self_attr 454 +__SYSCALL(__NR_lsm_set_self_attr, sys_lsm_set_self_attr) +#define __NR_lsm_list_modules 455 +__SYSCALL(__NR_lsm_list_modules, sys_lsm_list_modules) /* * Please add new compat syscalls above this comment and update diff --git a/arch/ia64/kernel/syscalls/syscall.tbl b/arch/ia64/kernel/syscalls/syscall.tbl index 83d8609aec030f..b4f9746a36fbf1 100644 --- a/arch/ia64/kernel/syscalls/syscall.tbl +++ b/arch/ia64/kernel/syscalls/syscall.tbl @@ -373,3 +373,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/m68k/kernel/syscalls/syscall.tbl b/arch/m68k/kernel/syscalls/syscall.tbl index 259ceb125367d4..215547a7437486 100644 --- a/arch/m68k/kernel/syscalls/syscall.tbl +++ b/arch/m68k/kernel/syscalls/syscall.tbl @@ -452,3 +452,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/microblaze/kernel/syscalls/syscall.tbl b/arch/microblaze/kernel/syscalls/syscall.tbl index a3798c2637fd19..24174dc2045fd7 100644 --- a/arch/microblaze/kernel/syscalls/syscall.tbl +++ b/arch/microblaze/kernel/syscalls/syscall.tbl @@ -458,3 +458,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/syscalls/syscall_n32.tbl index 152034b8e0a0f3..dc3395c37b1ec4 100644 --- a/arch/mips/kernel/syscalls/syscall_n32.tbl +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl @@ -391,3 +391,6 @@ 450 n32 set_mempolicy_home_node sys_set_mempolicy_home_node 451 n32 cachestat sys_cachestat 452 n32 fchmodat2 sys_fchmodat2 +453 n32 lsm_get_self_attr sys_lsm_get_self_attr +454 n32 lsm_set_self_attr sys_lsm_set_self_attr +455 n32 lsm_list_modules sys_lsm_list_modules diff --git a/arch/mips/kernel/syscalls/syscall_n64.tbl b/arch/mips/kernel/syscalls/syscall_n64.tbl index cb5e757f6621c8..06cad00543e853 100644 --- a/arch/mips/kernel/syscalls/syscall_n64.tbl +++ b/arch/mips/kernel/syscalls/syscall_n64.tbl @@ -367,3 +367,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 n64 cachestat sys_cachestat 452 n64 fchmodat2 sys_fchmodat2 +453 n64 lsm_get_self_attr sys_lsm_get_self_attr +454 n64 lsm_set_self_attr sys_lsm_set_self_attr +455 n64 lsm_list_modules sys_lsm_list_modules diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/syscalls/syscall_o32.tbl index 1a646813afdca4..6ecc14091da365 100644 --- a/arch/mips/kernel/syscalls/syscall_o32.tbl +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl @@ -440,3 +440,6 @@ 450 o32 set_mempolicy_home_node sys_set_mempolicy_home_node 451 o32 cachestat sys_cachestat 452 o32 fchmodat2 sys_fchmodat2 +453 o32 lsm_get_self_attr sys_lsm_get_self_attr +454 032 lsm_set_self_attr sys_lsm_set_self_attr +455 o32 lsm_list_modules sys_lsm_list_modules diff --git a/arch/parisc/kernel/syscalls/syscall.tbl b/arch/parisc/kernel/syscalls/syscall.tbl index e97c175b56f965..5b321bb4637479 100644 --- a/arch/parisc/kernel/syscalls/syscall.tbl +++ b/arch/parisc/kernel/syscalls/syscall.tbl @@ -451,3 +451,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl index 20e50586e8a26c..491eea2f88ba8a 100644 --- a/arch/powerpc/kernel/syscalls/syscall.tbl +++ b/arch/powerpc/kernel/syscalls/syscall.tbl @@ -539,3 +539,6 @@ 450 nospu set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/syscalls/syscall.tbl index 0122cc156952cf..653400f8221173 100644 --- a/arch/s390/kernel/syscalls/syscall.tbl +++ b/arch/s390/kernel/syscalls/syscall.tbl @@ -455,3 +455,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules sys_lsm_list_modules diff --git a/arch/sh/kernel/syscalls/syscall.tbl b/arch/sh/kernel/syscalls/syscall.tbl index e90d585c4d3e73..a4bc4047858e66 100644 --- a/arch/sh/kernel/syscalls/syscall.tbl +++ b/arch/sh/kernel/syscalls/syscall.tbl @@ -455,3 +455,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/sparc/kernel/syscalls/syscall.tbl b/arch/sparc/kernel/syscalls/syscall.tbl index 4ed06c71c43fb7..b134ad689789ca 100644 --- a/arch/sparc/kernel/syscalls/syscall.tbl +++ b/arch/sparc/kernel/syscalls/syscall.tbl @@ -498,3 +498,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl index 2d0b1bd866ead6..e921e0d6c4b387 100644 --- a/arch/x86/entry/syscalls/syscall_32.tbl +++ b/arch/x86/entry/syscalls/syscall_32.tbl @@ -457,3 +457,6 @@ 450 i386 set_mempolicy_home_node sys_set_mempolicy_home_node 451 i386 cachestat sys_cachestat 452 i386 fchmodat2 sys_fchmodat2 +453 i386 lsm_get_self_attr sys_lsm_get_self_attr +454 i386 lsm_set_self_attr sys_lsm_set_self_attr +455 i386 lsm_list_modules sys_lsm_list_modules diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl index 1d6eee30eceb22..b70920626b8c66 100644 --- a/arch/x86/entry/syscalls/syscall_64.tbl +++ b/arch/x86/entry/syscalls/syscall_64.tbl @@ -375,6 +375,9 @@ 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 453 64 map_shadow_stack sys_map_shadow_stack +454 common lsm_get_self_attr sys_lsm_get_self_attr +455 common lsm_set_self_attr sys_lsm_set_self_attr +456 common lsm_list_modules sys_lsm_list_modules # # Due to a historical design error, certain syscalls are numbered differently diff --git a/arch/xtensa/kernel/syscalls/syscall.tbl b/arch/xtensa/kernel/syscalls/syscall.tbl index fc1a4f3c81d9b7..e1fe5ed7cad8d0 100644 --- a/arch/xtensa/kernel/syscalls/syscall.tbl +++ b/arch/xtensa/kernel/syscalls/syscall.tbl @@ -423,3 +423,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index abe087c53b4b04..f10906c71711f5 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -823,8 +823,15 @@ __SYSCALL(__NR_cachestat, sys_cachestat) #define __NR_fchmodat2 452 __SYSCALL(__NR_fchmodat2, sys_fchmodat2) +#define __NR_lsm_get_self_attr 453 +__SYSCALL(__NR_lsm_get_self_attr, sys_lsm_get_self_attr) +#define __NR_lsm_set_self_attr 454 +__SYSCALL(__NR_lsm_set_self_attr, sys_lsm_set_self_attr) +#define __NR_lsm_list_modules 455 +__SYSCALL(__NR_lsm_list_modules, sys_lsm_list_modules) + #undef __NR_syscalls -#define __NR_syscalls 453 +#define __NR_syscalls 456 /* * 32 bit systems traditionally used different diff --git a/tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl b/tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl index cb5e757f6621c8..06cad00543e853 100644 --- a/tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl +++ b/tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl @@ -367,3 +367,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 n64 cachestat sys_cachestat 452 n64 fchmodat2 sys_fchmodat2 +453 n64 lsm_get_self_attr sys_lsm_get_self_attr +454 n64 lsm_set_self_attr sys_lsm_set_self_attr +455 n64 lsm_list_modules sys_lsm_list_modules diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl index 20e50586e8a26c..491eea2f88ba8a 100644 --- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl @@ -539,3 +539,6 @@ 450 nospu set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules diff --git a/tools/perf/arch/s390/entry/syscalls/syscall.tbl b/tools/perf/arch/s390/entry/syscalls/syscall.tbl index 0122cc156952cf..b85a69869afea1 100644 --- a/tools/perf/arch/s390/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/s390/entry/syscalls/syscall.tbl @@ -455,3 +455,6 @@ 450 common set_mempolicy_home_node sys_set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 sys_fchmodat2 +453 common lsm_get_self_attr sys_lsm_get_self_attr sys_lsm_get_self_attr +454 common lsm_set_self_attr sys_lsm_set_self_attr sys_lsm_set_self_attr +455 common lsm_list_modules sys_lsm_list_modules sys_lsm_list_modules diff --git a/tools/perf/arch/x86/entry/syscalls/syscall_64.tbl b/tools/perf/arch/x86/entry/syscalls/syscall_64.tbl index 1d6eee30eceb22..b70920626b8c66 100644 --- a/tools/perf/arch/x86/entry/syscalls/syscall_64.tbl +++ b/tools/perf/arch/x86/entry/syscalls/syscall_64.tbl @@ -375,6 +375,9 @@ 451 common cachestat sys_cachestat 452 common fchmodat2 sys_fchmodat2 453 64 map_shadow_stack sys_map_shadow_stack +454 common lsm_get_self_attr sys_lsm_get_self_attr +455 common lsm_set_self_attr sys_lsm_set_self_attr +456 common lsm_list_modules sys_lsm_list_modules # # Due to a historical design error, certain syscalls are numbered differently From 5fb3ea7e67e2b7c168995012710cd1f0caa55157 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:52 -0700 Subject: [PATCH 419/515] LSM: Helpers for attribute names and filling lsm_ctx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add lsm_name_to_attr(), which translates a text string to a LSM_ATTR value if one is available. Add lsm_fill_user_ctx(), which fills a struct lsm_ctx, including the trailing attribute value. Both are used in module specific components of LSM system calls. Signed-off-by: Casey Schaufler Reviewed-by: John Johansen Reviewed-by: Serge Hallyn Reviewed-by: Mickaël Salaün Signed-off-by: Paul Moore --- include/linux/security.h | 14 ++++++++++++++ security/lsm_syscalls.c | 24 +++++++++++++++++++++++ security/security.c | 41 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/include/linux/security.h b/include/linux/security.h index 8831d7cf0a6b48..e567f910a1c27b 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -32,6 +32,7 @@ #include #include #include +#include struct linux_binprm; struct cred; @@ -264,6 +265,7 @@ int unregister_blocking_lsm_notifier(struct notifier_block *nb); /* prototypes */ extern int security_init(void); extern int early_security_init(void); +extern u64 lsm_name_to_attr(const char *name); /* Security operations */ int security_binder_set_context_mgr(const struct cred *mgr); @@ -490,6 +492,8 @@ int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen); int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen); int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); int security_locked_down(enum lockdown_reason what); +int lsm_fill_user_ctx(struct lsm_ctx __user *ctx, void *context, + size_t context_size, u64 id, u64 flags); #else /* CONFIG_SECURITY */ static inline int call_blocking_lsm_notifier(enum lsm_event event, void *data) @@ -507,6 +511,11 @@ static inline int unregister_blocking_lsm_notifier(struct notifier_block *nb) return 0; } +static inline u64 lsm_name_to_attr(const char *name) +{ + return LSM_ATTR_UNDEF; +} + static inline void security_free_mnt_opts(void **mnt_opts) { } @@ -1415,6 +1424,11 @@ static inline int security_locked_down(enum lockdown_reason what) { return 0; } +static inline int lsm_fill_user_ctx(struct lsm_ctx __user *ctx, void *context, + size_t context_size, u64 id, u64 flags) +{ + return -EOPNOTSUPP; +} #endif /* CONFIG_SECURITY */ #if defined(CONFIG_SECURITY) && defined(CONFIG_WATCH_QUEUE) diff --git a/security/lsm_syscalls.c b/security/lsm_syscalls.c index 329aaca5efc03e..5d391b1f7e6943 100644 --- a/security/lsm_syscalls.c +++ b/security/lsm_syscalls.c @@ -17,6 +17,30 @@ #include #include +/** + * lsm_name_to_attr - map an LSM attribute name to its ID + * @name: name of the attribute + * + * Returns the LSM attribute value associated with @name, or 0 if + * there is no mapping. + */ +u64 lsm_name_to_attr(const char *name) +{ + if (!strcmp(name, "current")) + return LSM_ATTR_CURRENT; + if (!strcmp(name, "exec")) + return LSM_ATTR_EXEC; + if (!strcmp(name, "fscreate")) + return LSM_ATTR_FSCREATE; + if (!strcmp(name, "keycreate")) + return LSM_ATTR_KEYCREATE; + if (!strcmp(name, "prev")) + return LSM_ATTR_PREV; + if (!strcmp(name, "sockcreate")) + return LSM_ATTR_SOCKCREATE; + return LSM_ATTR_UNDEF; +} + /** * sys_lsm_set_self_attr - Set current task's security module attribute * @attr: which attribute to set diff --git a/security/security.c b/security/security.c index 0d179750d964b7..9136a4c3b0bc66 100644 --- a/security/security.c +++ b/security/security.c @@ -771,6 +771,47 @@ static int lsm_superblock_alloc(struct super_block *sb) return 0; } +/** + * lsm_fill_user_ctx - Fill a user space lsm_ctx structure + * @ctx: an LSM context to be filled + * @context: the new context value + * @context_size: the size of the new context value + * @id: LSM id + * @flags: LSM defined flags + * + * Fill all of the fields in a user space lsm_ctx structure. + * Caller is assumed to have verified that @ctx has enough space + * for @context. + * + * Returns 0 on success, -EFAULT on a copyout error, -ENOMEM + * if memory can't be allocated. + */ +int lsm_fill_user_ctx(struct lsm_ctx __user *ctx, void *context, + size_t context_size, u64 id, u64 flags) +{ + struct lsm_ctx *lctx; + size_t locallen = struct_size(lctx, ctx, context_size); + int rc = 0; + + lctx = kzalloc(locallen, GFP_KERNEL); + if (lctx == NULL) + return -ENOMEM; + + lctx->id = id; + lctx->flags = flags; + lctx->ctx_len = context_size; + lctx->len = locallen; + + memcpy(lctx->ctx, context, context_size); + + if (copy_to_user(ctx, lctx, locallen)) + rc = -EFAULT; + + kfree(lctx); + + return rc; +} + /* * The default value of the LSM hook is defined in linux/lsm_hook_defs.h and * can be accessed with: From cf77d160eedb3b87fb88dc81668b70940595cad4 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:53 -0700 Subject: [PATCH 420/515] Smack: implement setselfattr and getselfattr hooks Implement Smack support for security_[gs]etselfattr. Refactor the setprocattr hook to avoid code duplication. Signed-off-by: Casey Schaufler Reviewed-by: John Johansen Signed-off-by: Paul Moore --- security/smack/smack_lsm.c | 95 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index f73f9a2834eb7e..12160d060cc133 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3626,6 +3626,46 @@ static void smack_d_instantiate(struct dentry *opt_dentry, struct inode *inode) return; } +/** + * smack_getselfattr - Smack current process attribute + * @attr: which attribute to fetch + * @ctx: buffer to receive the result + * @size: available size in, actual size out + * @flags: unused + * + * Fill the passed user space @ctx with the details of the requested + * attribute. + * + * Returns the number of attributes on success, an error code otherwise. + * There will only ever be one attribute. + */ +static int smack_getselfattr(unsigned int attr, struct lsm_ctx __user *ctx, + size_t *size, u32 flags) +{ + struct smack_known *skp = smk_of_current(); + int total; + int slen; + int rc; + + if (attr != LSM_ATTR_CURRENT) + return -EOPNOTSUPP; + + slen = strlen(skp->smk_known) + 1; + total = ALIGN(slen + sizeof(*ctx), 8); + if (total > *size) + rc = -E2BIG; + else if (ctx) + rc = lsm_fill_user_ctx(ctx, skp->smk_known, slen, LSM_ID_SMACK, + 0); + else + rc = 1; + + *size = total; + if (rc >= 0) + return 1; + return rc; +} + /** * smack_getprocattr - Smack process attribute access * @p: the object task @@ -3655,8 +3695,8 @@ static int smack_getprocattr(struct task_struct *p, const char *name, char **val } /** - * smack_setprocattr - Smack process attribute setting - * @name: the name of the attribute in /proc/.../attr + * do_setattr - Smack process attribute setting + * @attr: the ID of the attribute * @value: the value to set * @size: the size of the value * @@ -3665,7 +3705,7 @@ static int smack_getprocattr(struct task_struct *p, const char *name, char **val * * Returns the length of the smack label or an error code */ -static int smack_setprocattr(const char *name, void *value, size_t size) +static int do_setattr(u64 attr, void *value, size_t size) { struct task_smack *tsp = smack_cred(current_cred()); struct cred *new; @@ -3679,8 +3719,8 @@ static int smack_setprocattr(const char *name, void *value, size_t size) if (value == NULL || size == 0 || size >= SMK_LONGLABEL) return -EINVAL; - if (strcmp(name, "current") != 0) - return -EINVAL; + if (attr != LSM_ATTR_CURRENT) + return -EOPNOTSUPP; skp = smk_import_entry(value, size); if (IS_ERR(skp)) @@ -3719,6 +3759,49 @@ static int smack_setprocattr(const char *name, void *value, size_t size) return size; } +/** + * smack_setselfattr - Set a Smack process attribute + * @attr: which attribute to set + * @ctx: buffer containing the data + * @size: size of @ctx + * @flags: unused + * + * Fill the passed user space @ctx with the details of the requested + * attribute. + * + * Returns 0 on success, an error code otherwise. + */ +static int smack_setselfattr(unsigned int attr, struct lsm_ctx *ctx, + size_t size, u32 flags) +{ + int rc; + + rc = do_setattr(attr, ctx->ctx, ctx->ctx_len); + if (rc > 0) + return 0; + return rc; +} + +/** + * smack_setprocattr - Smack process attribute setting + * @name: the name of the attribute in /proc/.../attr + * @value: the value to set + * @size: the size of the value + * + * Sets the Smack value of the task. Only setting self + * is permitted and only with privilege + * + * Returns the length of the smack label or an error code + */ +static int smack_setprocattr(const char *name, void *value, size_t size) +{ + int attr = lsm_name_to_attr(name); + + if (attr != LSM_ATTR_UNDEF) + return do_setattr(attr, value, size); + return -EINVAL; +} + /** * smack_unix_stream_connect - Smack access on UDS * @sock: one sock @@ -5033,6 +5116,8 @@ static struct security_hook_list smack_hooks[] __ro_after_init = { LSM_HOOK_INIT(d_instantiate, smack_d_instantiate), + LSM_HOOK_INIT(getselfattr, smack_getselfattr), + LSM_HOOK_INIT(setselfattr, smack_setselfattr), LSM_HOOK_INIT(getprocattr, smack_getprocattr), LSM_HOOK_INIT(setprocattr, smack_setprocattr), From 3c3bda37ca1de42e2eed3b86cf9207f397bc5b6b Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:54 -0700 Subject: [PATCH 421/515] AppArmor: Add selfattr hooks Add hooks for setselfattr and getselfattr. These hooks are not very different from their setprocattr and getprocattr equivalents, and much of the code is shared. Signed-off-by: Casey Schaufler Acked-by: John Johansen Signed-off-by: Paul Moore --- security/apparmor/include/procattr.h | 2 +- security/apparmor/lsm.c | 91 ++++++++++++++++++++++++++-- security/apparmor/procattr.c | 10 +-- 3 files changed, 92 insertions(+), 11 deletions(-) diff --git a/security/apparmor/include/procattr.h b/security/apparmor/include/procattr.h index 31689437e0e1ec..03dbfdb2f2c09b 100644 --- a/security/apparmor/include/procattr.h +++ b/security/apparmor/include/procattr.h @@ -11,7 +11,7 @@ #ifndef __AA_PROCATTR_H #define __AA_PROCATTR_H -int aa_getprocattr(struct aa_label *label, char **string); +int aa_getprocattr(struct aa_label *label, char **string, bool newline); int aa_setprocattr_changehat(char *args, size_t size, int flags); #endif /* __AA_PROCATTR_H */ diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 20b93501fbd142..ac75e95e68a541 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -630,6 +630,55 @@ static int apparmor_sb_pivotroot(const struct path *old_path, return error; } +static int apparmor_getselfattr(unsigned int attr, struct lsm_ctx __user *lx, + size_t *size, u32 flags) +{ + int error = -ENOENT; + struct aa_task_ctx *ctx = task_ctx(current); + struct aa_label *label = NULL; + size_t total_len = 0; + char *value; + + switch (attr) { + case LSM_ATTR_CURRENT: + label = aa_get_newest_label(cred_label(current_cred())); + break; + case LSM_ATTR_PREV: + if (ctx->previous) + label = aa_get_newest_label(ctx->previous); + break; + case LSM_ATTR_EXEC: + if (ctx->onexec) + label = aa_get_newest_label(ctx->onexec); + break; + default: + error = -EOPNOTSUPP; + break; + } + + if (label) { + error = aa_getprocattr(label, &value, false); + if (error > 0) { + total_len = ALIGN(struct_size(lx, ctx, error), 8); + if (total_len > *size) + error = -E2BIG; + else if (lx) + error = lsm_fill_user_ctx(lx, value, error, + LSM_ID_APPARMOR, 0); + else + error = 1; + } + kfree(value); + } + + aa_put_label(label); + + *size = total_len; + if (error < 0) + return error; + return 1; +} + static int apparmor_getprocattr(struct task_struct *task, const char *name, char **value) { @@ -649,7 +698,7 @@ static int apparmor_getprocattr(struct task_struct *task, const char *name, error = -EINVAL; if (label) - error = aa_getprocattr(label, value); + error = aa_getprocattr(label, value, true); aa_put_label(label); put_cred(cred); @@ -657,8 +706,7 @@ static int apparmor_getprocattr(struct task_struct *task, const char *name, return error; } -static int apparmor_setprocattr(const char *name, void *value, - size_t size) +static int do_setattr(u64 attr, void *value, size_t size) { char *command, *largs = NULL, *args = value; size_t arg_size; @@ -689,7 +737,7 @@ static int apparmor_setprocattr(const char *name, void *value, goto out; arg_size = size - (args - (largs ? largs : (char *) value)); - if (strcmp(name, "current") == 0) { + if (attr == LSM_ATTR_CURRENT) { if (strcmp(command, "changehat") == 0) { error = aa_setprocattr_changehat(args, arg_size, AA_CHANGE_NOFLAGS); @@ -704,7 +752,7 @@ static int apparmor_setprocattr(const char *name, void *value, error = aa_change_profile(args, AA_CHANGE_STACK); } else goto fail; - } else if (strcmp(name, "exec") == 0) { + } else if (attr == LSM_ATTR_EXEC) { if (strcmp(command, "exec") == 0) error = aa_change_profile(args, AA_CHANGE_ONEXEC); else if (strcmp(command, "stack") == 0) @@ -724,13 +772,42 @@ static int apparmor_setprocattr(const char *name, void *value, fail: aad(&sa)->label = begin_current_label_crit_section(); - aad(&sa)->info = name; + if (attr == LSM_ATTR_CURRENT) + aad(&sa)->info = "current"; + else if (attr == LSM_ATTR_EXEC) + aad(&sa)->info = "exec"; + else + aad(&sa)->info = "invalid"; aad(&sa)->error = error = -EINVAL; aa_audit_msg(AUDIT_APPARMOR_DENIED, &sa, NULL); end_current_label_crit_section(aad(&sa)->label); goto out; } +static int apparmor_setselfattr(unsigned int attr, struct lsm_ctx *ctx, + size_t size, u32 flags) +{ + int rc; + + if (attr != LSM_ATTR_CURRENT && attr != LSM_ATTR_EXEC) + return -EOPNOTSUPP; + + rc = do_setattr(attr, ctx->ctx, ctx->ctx_len); + if (rc > 0) + return 0; + return rc; +} + +static int apparmor_setprocattr(const char *name, void *value, + size_t size) +{ + int attr = lsm_name_to_attr(name); + + if (attr) + return do_setattr(attr, value, size); + return -EINVAL; +} + /** * apparmor_bprm_committing_creds - do task cleanup on committing new creds * @bprm: binprm for the exec (NOT NULL) @@ -1253,6 +1330,8 @@ static struct security_hook_list apparmor_hooks[] __ro_after_init = { LSM_HOOK_INIT(file_lock, apparmor_file_lock), LSM_HOOK_INIT(file_truncate, apparmor_file_truncate), + LSM_HOOK_INIT(getselfattr, apparmor_getselfattr), + LSM_HOOK_INIT(setselfattr, apparmor_setselfattr), LSM_HOOK_INIT(getprocattr, apparmor_getprocattr), LSM_HOOK_INIT(setprocattr, apparmor_setprocattr), diff --git a/security/apparmor/procattr.c b/security/apparmor/procattr.c index 197d41f9c32b7b..e3857e3d7c6c26 100644 --- a/security/apparmor/procattr.c +++ b/security/apparmor/procattr.c @@ -20,6 +20,7 @@ * aa_getprocattr - Return the label information for @label * @label: the label to print label info about (NOT NULL) * @string: Returns - string containing the label info (NOT NULL) + * @newline: indicates that a newline should be added * * Requires: label != NULL && string != NULL * @@ -27,7 +28,7 @@ * * Returns: size of string placed in @string else error code on failure */ -int aa_getprocattr(struct aa_label *label, char **string) +int aa_getprocattr(struct aa_label *label, char **string, bool newline) { struct aa_ns *ns = labels_ns(label); struct aa_ns *current_ns = aa_get_current_ns(); @@ -57,11 +58,12 @@ int aa_getprocattr(struct aa_label *label, char **string) return len; } - (*string)[len] = '\n'; - (*string)[len + 1] = 0; + if (newline) + (*string)[len++] = '\n'; + (*string)[len] = 0; aa_put_ns(current_ns); - return len + 1; + return len; } /** From a6f4aa49e9d1edaa04c855cc633743a8e27436c4 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:55 -0700 Subject: [PATCH 422/515] SELinux: Add selfattr hooks Add hooks for setselfattr and getselfattr. These hooks are not very different from their setprocattr and getprocattr equivalents, and much of the code is shared. Cc: selinux@vger.kernel.org Signed-off-by: Casey Schaufler Signed-off-by: Paul Moore --- security/selinux/hooks.c | 134 +++++++++++++++++++++++++++++++-------- 1 file changed, 107 insertions(+), 27 deletions(-) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 82fabad1a831c2..8cf8850c69bd5f 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -6285,8 +6285,8 @@ static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode) inode_doinit_with_dentry(inode, dentry); } -static int selinux_getprocattr(struct task_struct *p, - const char *name, char **value) +static int selinux_lsm_getattr(unsigned int attr, struct task_struct *p, + char **value) { const struct task_security_struct *__tsec; u32 sid; @@ -6303,20 +6303,27 @@ static int selinux_getprocattr(struct task_struct *p, goto bad; } - if (!strcmp(name, "current")) + switch (attr) { + case LSM_ATTR_CURRENT: sid = __tsec->sid; - else if (!strcmp(name, "prev")) + break; + case LSM_ATTR_PREV: sid = __tsec->osid; - else if (!strcmp(name, "exec")) + break; + case LSM_ATTR_EXEC: sid = __tsec->exec_sid; - else if (!strcmp(name, "fscreate")) + break; + case LSM_ATTR_FSCREATE: sid = __tsec->create_sid; - else if (!strcmp(name, "keycreate")) + break; + case LSM_ATTR_KEYCREATE: sid = __tsec->keycreate_sid; - else if (!strcmp(name, "sockcreate")) + break; + case LSM_ATTR_SOCKCREATE: sid = __tsec->sockcreate_sid; - else { - error = -EINVAL; + break; + default: + error = -EOPNOTSUPP; goto bad; } rcu_read_unlock(); @@ -6334,7 +6341,7 @@ static int selinux_getprocattr(struct task_struct *p, return error; } -static int selinux_setprocattr(const char *name, void *value, size_t size) +static int selinux_lsm_setattr(u64 attr, void *value, size_t size) { struct task_security_struct *tsec; struct cred *new; @@ -6345,23 +6352,31 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) /* * Basic control over ability to set these attributes at all. */ - if (!strcmp(name, "exec")) + switch (attr) { + case LSM_ATTR_EXEC: error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS, PROCESS__SETEXEC, NULL); - else if (!strcmp(name, "fscreate")) + break; + case LSM_ATTR_FSCREATE: error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS, PROCESS__SETFSCREATE, NULL); - else if (!strcmp(name, "keycreate")) + break; + case LSM_ATTR_KEYCREATE: error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS, PROCESS__SETKEYCREATE, NULL); - else if (!strcmp(name, "sockcreate")) + break; + case LSM_ATTR_SOCKCREATE: error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS, PROCESS__SETSOCKCREATE, NULL); - else if (!strcmp(name, "current")) + break; + case LSM_ATTR_CURRENT: error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS, PROCESS__SETCURRENT, NULL); - else - error = -EINVAL; + break; + default: + error = -EOPNOTSUPP; + break; + } if (error) return error; @@ -6373,13 +6388,14 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) } error = security_context_to_sid(value, size, &sid, GFP_KERNEL); - if (error == -EINVAL && !strcmp(name, "fscreate")) { + if (error == -EINVAL && attr == LSM_ATTR_FSCREATE) { if (!has_cap_mac_admin(true)) { struct audit_buffer *ab; size_t audit_size; - /* We strip a nul only if it is at the end, otherwise the - * context contains a nul and we should audit that */ + /* We strip a nul only if it is at the end, + * otherwise the context contains a nul and + * we should audit that */ if (str[size - 1] == '\0') audit_size = size - 1; else @@ -6390,7 +6406,8 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) if (!ab) return error; audit_log_format(ab, "op=fscreate invalid_context="); - audit_log_n_untrustedstring(ab, value, audit_size); + audit_log_n_untrustedstring(ab, value, + audit_size); audit_log_end(ab); return error; @@ -6413,11 +6430,11 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) checks and may_create for the file creation checks. The operation will then fail if the context is not permitted. */ tsec = selinux_cred(new); - if (!strcmp(name, "exec")) { + if (attr == LSM_ATTR_EXEC) { tsec->exec_sid = sid; - } else if (!strcmp(name, "fscreate")) { + } else if (attr == LSM_ATTR_FSCREATE) { tsec->create_sid = sid; - } else if (!strcmp(name, "keycreate")) { + } else if (attr == LSM_ATTR_KEYCREATE) { if (sid) { error = avc_has_perm(mysid, sid, SECCLASS_KEY, KEY__CREATE, NULL); @@ -6425,9 +6442,9 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) goto abort_change; } tsec->keycreate_sid = sid; - } else if (!strcmp(name, "sockcreate")) { + } else if (attr == LSM_ATTR_SOCKCREATE) { tsec->sockcreate_sid = sid; - } else if (!strcmp(name, "current")) { + } else if (attr == LSM_ATTR_CURRENT) { error = -EINVAL; if (sid == 0) goto abort_change; @@ -6469,6 +6486,67 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) return error; } +static int selinux_getselfattr(unsigned int attr, struct lsm_ctx __user *ctx, + size_t *size, u32 flags) +{ + char *value; + size_t total_len; + int len; + int rc = 0; + + len = selinux_lsm_getattr(attr, current, &value); + if (len < 0) + return len; + + total_len = ALIGN(struct_size(ctx, ctx, len), 8); + + if (total_len > *size) + rc = -E2BIG; + else if (ctx) + rc = lsm_fill_user_ctx(ctx, value, len, LSM_ID_SELINUX, 0); + + kfree(value); + *size = total_len; + if (rc < 0) + return rc; + return 1; +} + +static int selinux_setselfattr(unsigned int attr, struct lsm_ctx *ctx, + size_t size, u32 flags) +{ + int rc; + + rc = selinux_lsm_setattr(attr, ctx->ctx, ctx->ctx_len); + if (rc > 0) + return 0; + return rc; +} + +static int selinux_getprocattr(struct task_struct *p, + const char *name, char **value) +{ + unsigned int attr = lsm_name_to_attr(name); + int rc; + + if (attr) { + rc = selinux_lsm_getattr(attr, p, value); + if (rc != -EOPNOTSUPP) + return rc; + } + + return -EINVAL; +} + +static int selinux_setprocattr(const char *name, void *value, size_t size) +{ + int attr = lsm_name_to_attr(name); + + if (attr) + return selinux_lsm_setattr(attr, value, size); + return -EINVAL; +} + static int selinux_ismaclabel(const char *name) { return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0); @@ -7097,6 +7175,8 @@ static struct security_hook_list selinux_hooks[] __ro_after_init = { LSM_HOOK_INIT(d_instantiate, selinux_d_instantiate), + LSM_HOOK_INIT(getselfattr, selinux_getselfattr), + LSM_HOOK_INIT(setselfattr, selinux_setselfattr), LSM_HOOK_INIT(getprocattr, selinux_getprocattr), LSM_HOOK_INIT(setprocattr, selinux_setprocattr), From a16107b1e79d17cb0c7a68f4a3c004986907a691 Mon Sep 17 00:00:00 2001 From: Casey Schaufler Date: Tue, 12 Sep 2023 13:56:56 -0700 Subject: [PATCH 423/515] LSM: selftests for Linux Security Module syscalls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add selftests for the three system calls supporting the LSM infrastructure. This set of tests is limited by the differences in access policy enforced by the existing security modules. Signed-off-by: Casey Schaufler Reviewed-by: Mickaël Salaün Tested-by: Mickaël Salaün Signed-off-by: Paul Moore --- MAINTAINERS | 1 + tools/testing/selftests/Makefile | 1 + tools/testing/selftests/lsm/.gitignore | 1 + tools/testing/selftests/lsm/Makefile | 17 ++ tools/testing/selftests/lsm/common.c | 89 ++++++ tools/testing/selftests/lsm/common.h | 33 +++ tools/testing/selftests/lsm/config | 3 + .../selftests/lsm/lsm_get_self_attr_test.c | 275 ++++++++++++++++++ .../selftests/lsm/lsm_list_modules_test.c | 140 +++++++++ .../selftests/lsm/lsm_set_self_attr_test.c | 74 +++++ 10 files changed, 634 insertions(+) create mode 100644 tools/testing/selftests/lsm/.gitignore create mode 100644 tools/testing/selftests/lsm/Makefile create mode 100644 tools/testing/selftests/lsm/common.c create mode 100644 tools/testing/selftests/lsm/common.h create mode 100644 tools/testing/selftests/lsm/config create mode 100644 tools/testing/selftests/lsm/lsm_get_self_attr_test.c create mode 100644 tools/testing/selftests/lsm/lsm_list_modules_test.c create mode 100644 tools/testing/selftests/lsm/lsm_set_self_attr_test.c diff --git a/MAINTAINERS b/MAINTAINERS index b693e60750e62b..9244f2536cdee7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19310,6 +19310,7 @@ W: http://kernsec.org/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git F: include/uapi/linux/lsm.h F: security/ +F: tools/testing/selftests/lsm/ X: security/selinux/ SELINUX SECURITY MODULE diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 42806add0114dd..fc589775ca4c92 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -42,6 +42,7 @@ TARGETS += landlock TARGETS += lib TARGETS += livepatch TARGETS += lkdtm +TARGETS += lsm TARGETS += membarrier TARGETS += memfd TARGETS += memory-hotplug diff --git a/tools/testing/selftests/lsm/.gitignore b/tools/testing/selftests/lsm/.gitignore new file mode 100644 index 00000000000000..bd68f6c3fd07ae --- /dev/null +++ b/tools/testing/selftests/lsm/.gitignore @@ -0,0 +1 @@ +/*_test diff --git a/tools/testing/selftests/lsm/Makefile b/tools/testing/selftests/lsm/Makefile new file mode 100644 index 00000000000000..3f80c0bc093de8 --- /dev/null +++ b/tools/testing/selftests/lsm/Makefile @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# First run: make -C ../../../.. headers_install + +CFLAGS += -Wall -O2 $(KHDR_INCLUDES) +LOCAL_HDRS += common.h + +TEST_GEN_PROGS := lsm_get_self_attr_test lsm_list_modules_test \ + lsm_set_self_attr_test + +include ../lib.mk + +$(OUTPUT)/lsm_get_self_attr_test: lsm_get_self_attr_test.c common.c +$(OUTPUT)/lsm_set_self_attr_test: lsm_set_self_attr_test.c common.c +$(OUTPUT)/lsm_list_modules_test: lsm_list_modules_test.c common.c + +EXTRA_CLEAN = $(OUTPUT)/common.o diff --git a/tools/testing/selftests/lsm/common.c b/tools/testing/selftests/lsm/common.c new file mode 100644 index 00000000000000..9ad258912646c8 --- /dev/null +++ b/tools/testing/selftests/lsm/common.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Linux Security Module infrastructure tests + * + * Copyright © 2023 Casey Schaufler + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include "common.h" + +#define PROCATTR "/proc/self/attr/" + +int read_proc_attr(const char *attr, char *value, size_t size) +{ + int fd; + int len; + char *path; + + len = strlen(PROCATTR) + strlen(attr) + 1; + path = calloc(len, 1); + if (path == NULL) + return -1; + sprintf(path, "%s%s", PROCATTR, attr); + + fd = open(path, O_RDONLY); + free(path); + + if (fd < 0) + return -1; + len = read(fd, value, size); + + close(fd); + + /* Ensure value is terminated */ + if (len <= 0 || len == size) + return -1; + value[len] = '\0'; + + path = strchr(value, '\n'); + if (path) + *path = '\0'; + + return 0; +} + +int read_sysfs_lsms(char *lsms, size_t size) +{ + FILE *fp; + size_t red; + + fp = fopen("/sys/kernel/security/lsm", "r"); + if (fp == NULL) + return -1; + red = fread(lsms, 1, size, fp); + fclose(fp); + + if (red <= 0 || red == size) + return -1; + lsms[red] = '\0'; + return 0; +} + +int attr_lsm_count(void) +{ + char *names = calloc(sysconf(_SC_PAGESIZE), 1); + int count = 0; + + if (!names) + return 0; + + if (read_sysfs_lsms(names, sysconf(_SC_PAGESIZE))) + return 0; + + if (strstr(names, "selinux")) + count++; + if (strstr(names, "smack")) + count++; + if (strstr(names, "apparmor")) + count++; + + return count; +} diff --git a/tools/testing/selftests/lsm/common.h b/tools/testing/selftests/lsm/common.h new file mode 100644 index 00000000000000..d404329e5eeb7d --- /dev/null +++ b/tools/testing/selftests/lsm/common.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Linux Security Module infrastructure tests + * + * Copyright © 2023 Casey Schaufler + */ + +#ifndef lsm_get_self_attr +static inline int lsm_get_self_attr(unsigned int attr, struct lsm_ctx *ctx, + size_t *size, __u32 flags) +{ + return syscall(__NR_lsm_get_self_attr, attr, ctx, size, flags); +} +#endif + +#ifndef lsm_set_self_attr +static inline int lsm_set_self_attr(unsigned int attr, struct lsm_ctx *ctx, + size_t size, __u32 flags) +{ + return syscall(__NR_lsm_set_self_attr, attr, ctx, size, flags); +} +#endif + +#ifndef lsm_list_modules +static inline int lsm_list_modules(__u64 *ids, size_t *size, __u32 flags) +{ + return syscall(__NR_lsm_list_modules, ids, size, flags); +} +#endif + +extern int read_proc_attr(const char *attr, char *value, size_t size); +extern int read_sysfs_lsms(char *lsms, size_t size); +int attr_lsm_count(void); diff --git a/tools/testing/selftests/lsm/config b/tools/testing/selftests/lsm/config new file mode 100644 index 00000000000000..1c0c4c020f9ca4 --- /dev/null +++ b/tools/testing/selftests/lsm/config @@ -0,0 +1,3 @@ +CONFIG_SYSFS=y +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y diff --git a/tools/testing/selftests/lsm/lsm_get_self_attr_test.c b/tools/testing/selftests/lsm/lsm_get_self_attr_test.c new file mode 100644 index 00000000000000..e0e313d9047a3d --- /dev/null +++ b/tools/testing/selftests/lsm/lsm_get_self_attr_test.c @@ -0,0 +1,275 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Linux Security Module infrastructure tests + * Tests for the lsm_get_self_attr system call + * + * Copyright © 2022 Casey Schaufler + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include "../kselftest_harness.h" +#include "common.h" + +static struct lsm_ctx *next_ctx(struct lsm_ctx *ctxp) +{ + void *vp; + + vp = (void *)ctxp + sizeof(*ctxp) + ctxp->ctx_len; + return (struct lsm_ctx *)vp; +} + +TEST(size_null_lsm_get_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + struct lsm_ctx *ctx = calloc(page_size, 1); + + ASSERT_NE(NULL, ctx); + errno = 0; + ASSERT_EQ(-1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, NULL, 0)); + ASSERT_EQ(EINVAL, errno); + + free(ctx); +} + +TEST(ctx_null_lsm_get_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + size_t size = page_size; + int rc; + + rc = lsm_get_self_attr(LSM_ATTR_CURRENT, NULL, &size, 0); + + if (attr_lsm_count()) { + ASSERT_NE(-1, rc); + ASSERT_NE(1, size); + } else { + ASSERT_EQ(-1, rc); + } +} + +TEST(size_too_small_lsm_get_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + struct lsm_ctx *ctx = calloc(page_size, 1); + size_t size = 1; + + ASSERT_NE(NULL, ctx); + errno = 0; + ASSERT_EQ(-1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size, 0)); + if (attr_lsm_count()) { + ASSERT_EQ(E2BIG, errno); + } else { + ASSERT_EQ(EOPNOTSUPP, errno); + } + ASSERT_NE(1, size); + + free(ctx); +} + +TEST(flags_zero_lsm_get_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + struct lsm_ctx *ctx = calloc(page_size, 1); + __u64 *syscall_lsms = calloc(page_size, 1); + size_t size; + int lsmcount; + int i; + + ASSERT_NE(NULL, ctx); + errno = 0; + size = page_size; + ASSERT_EQ(-1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size, + LSM_FLAG_SINGLE)); + ASSERT_EQ(EINVAL, errno); + ASSERT_EQ(page_size, size); + + lsmcount = syscall(__NR_lsm_list_modules, syscall_lsms, &size, 0); + ASSERT_LE(1, lsmcount); + ASSERT_NE(NULL, syscall_lsms); + + for (i = 0; i < lsmcount; i++) { + errno = 0; + size = page_size; + ctx->id = syscall_lsms[i]; + + if (syscall_lsms[i] == LSM_ID_SELINUX || + syscall_lsms[i] == LSM_ID_SMACK || + syscall_lsms[i] == LSM_ID_APPARMOR) { + ASSERT_EQ(1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, + &size, LSM_FLAG_SINGLE)); + } else { + ASSERT_EQ(-1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, + &size, + LSM_FLAG_SINGLE)); + } + } + + free(ctx); +} + +TEST(flags_overset_lsm_get_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + struct lsm_ctx *ctx = calloc(page_size, 1); + size_t size; + + ASSERT_NE(NULL, ctx); + + errno = 0; + size = page_size; + ASSERT_EQ(-1, lsm_get_self_attr(LSM_ATTR_CURRENT | LSM_ATTR_PREV, ctx, + &size, 0)); + ASSERT_EQ(EOPNOTSUPP, errno); + + errno = 0; + size = page_size; + ASSERT_EQ(-1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size, + LSM_FLAG_SINGLE | + (LSM_FLAG_SINGLE << 1))); + ASSERT_EQ(EINVAL, errno); + + free(ctx); +} + +TEST(basic_lsm_get_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + size_t size = page_size; + struct lsm_ctx *ctx = calloc(page_size, 1); + struct lsm_ctx *tctx = NULL; + __u64 *syscall_lsms = calloc(page_size, 1); + char *attr = calloc(page_size, 1); + int cnt_current = 0; + int cnt_exec = 0; + int cnt_fscreate = 0; + int cnt_keycreate = 0; + int cnt_prev = 0; + int cnt_sockcreate = 0; + int lsmcount; + int count; + int i; + + ASSERT_NE(NULL, ctx); + ASSERT_NE(NULL, syscall_lsms); + + lsmcount = syscall(__NR_lsm_list_modules, syscall_lsms, &size, 0); + ASSERT_LE(1, lsmcount); + + for (i = 0; i < lsmcount; i++) { + switch (syscall_lsms[i]) { + case LSM_ID_SELINUX: + cnt_current++; + cnt_exec++; + cnt_fscreate++; + cnt_keycreate++; + cnt_prev++; + cnt_sockcreate++; + break; + case LSM_ID_SMACK: + cnt_current++; + break; + case LSM_ID_APPARMOR: + cnt_current++; + cnt_exec++; + cnt_prev++; + break; + default: + break; + } + } + + if (cnt_current) { + size = page_size; + count = lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size, 0); + ASSERT_EQ(cnt_current, count); + tctx = ctx; + ASSERT_EQ(0, read_proc_attr("current", attr, page_size)); + ASSERT_EQ(0, strcmp((char *)tctx->ctx, attr)); + for (i = 1; i < count; i++) { + tctx = next_ctx(tctx); + ASSERT_NE(0, strcmp((char *)tctx->ctx, attr)); + } + } + if (cnt_exec) { + size = page_size; + count = lsm_get_self_attr(LSM_ATTR_EXEC, ctx, &size, 0); + ASSERT_GE(cnt_exec, count); + if (count > 0) { + tctx = ctx; + if (read_proc_attr("exec", attr, page_size) == 0) + ASSERT_EQ(0, strcmp((char *)tctx->ctx, attr)); + } + for (i = 1; i < count; i++) { + tctx = next_ctx(tctx); + ASSERT_NE(0, strcmp((char *)tctx->ctx, attr)); + } + } + if (cnt_fscreate) { + size = page_size; + count = lsm_get_self_attr(LSM_ATTR_FSCREATE, ctx, &size, 0); + ASSERT_GE(cnt_fscreate, count); + if (count > 0) { + tctx = ctx; + if (read_proc_attr("fscreate", attr, page_size) == 0) + ASSERT_EQ(0, strcmp((char *)tctx->ctx, attr)); + } + for (i = 1; i < count; i++) { + tctx = next_ctx(tctx); + ASSERT_NE(0, strcmp((char *)tctx->ctx, attr)); + } + } + if (cnt_keycreate) { + size = page_size; + count = lsm_get_self_attr(LSM_ATTR_KEYCREATE, ctx, &size, 0); + ASSERT_GE(cnt_keycreate, count); + if (count > 0) { + tctx = ctx; + if (read_proc_attr("keycreate", attr, page_size) == 0) + ASSERT_EQ(0, strcmp((char *)tctx->ctx, attr)); + } + for (i = 1; i < count; i++) { + tctx = next_ctx(tctx); + ASSERT_NE(0, strcmp((char *)tctx->ctx, attr)); + } + } + if (cnt_prev) { + size = page_size; + count = lsm_get_self_attr(LSM_ATTR_PREV, ctx, &size, 0); + ASSERT_GE(cnt_prev, count); + if (count > 0) { + tctx = ctx; + ASSERT_EQ(0, read_proc_attr("prev", attr, page_size)); + ASSERT_EQ(0, strcmp((char *)tctx->ctx, attr)); + for (i = 1; i < count; i++) { + tctx = next_ctx(tctx); + ASSERT_NE(0, strcmp((char *)tctx->ctx, attr)); + } + } + } + if (cnt_sockcreate) { + size = page_size; + count = lsm_get_self_attr(LSM_ATTR_SOCKCREATE, ctx, &size, 0); + ASSERT_GE(cnt_sockcreate, count); + if (count > 0) { + tctx = ctx; + if (read_proc_attr("sockcreate", attr, page_size) == 0) + ASSERT_EQ(0, strcmp((char *)tctx->ctx, attr)); + } + for (i = 1; i < count; i++) { + tctx = next_ctx(tctx); + ASSERT_NE(0, strcmp((char *)tctx->ctx, attr)); + } + } + + free(ctx); + free(attr); + free(syscall_lsms); +} + +TEST_HARNESS_MAIN diff --git a/tools/testing/selftests/lsm/lsm_list_modules_test.c b/tools/testing/selftests/lsm/lsm_list_modules_test.c new file mode 100644 index 00000000000000..445c02f09c740c --- /dev/null +++ b/tools/testing/selftests/lsm/lsm_list_modules_test.c @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Linux Security Module infrastructure tests + * Tests for the lsm_list_modules system call + * + * Copyright © 2022 Casey Schaufler + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include "../kselftest_harness.h" +#include "common.h" + +TEST(size_null_lsm_list_modules) +{ + const long page_size = sysconf(_SC_PAGESIZE); + __u64 *syscall_lsms = calloc(page_size, 1); + + ASSERT_NE(NULL, syscall_lsms); + errno = 0; + ASSERT_EQ(-1, lsm_list_modules(syscall_lsms, NULL, 0)); + ASSERT_EQ(EFAULT, errno); + + free(syscall_lsms); +} + +TEST(ids_null_lsm_list_modules) +{ + const long page_size = sysconf(_SC_PAGESIZE); + size_t size = page_size; + + errno = 0; + ASSERT_EQ(-1, lsm_list_modules(NULL, &size, 0)); + ASSERT_EQ(EFAULT, errno); + ASSERT_NE(1, size); +} + +TEST(size_too_small_lsm_list_modules) +{ + const long page_size = sysconf(_SC_PAGESIZE); + __u64 *syscall_lsms = calloc(page_size, 1); + size_t size = 1; + + ASSERT_NE(NULL, syscall_lsms); + errno = 0; + ASSERT_EQ(-1, lsm_list_modules(syscall_lsms, &size, 0)); + ASSERT_EQ(E2BIG, errno); + ASSERT_NE(1, size); + + free(syscall_lsms); +} + +TEST(flags_set_lsm_list_modules) +{ + const long page_size = sysconf(_SC_PAGESIZE); + __u64 *syscall_lsms = calloc(page_size, 1); + size_t size = page_size; + + ASSERT_NE(NULL, syscall_lsms); + errno = 0; + ASSERT_EQ(-1, lsm_list_modules(syscall_lsms, &size, 7)); + ASSERT_EQ(EINVAL, errno); + ASSERT_EQ(page_size, size); + + free(syscall_lsms); +} + +TEST(correct_lsm_list_modules) +{ + const long page_size = sysconf(_SC_PAGESIZE); + size_t size = page_size; + __u64 *syscall_lsms = calloc(page_size, 1); + char *sysfs_lsms = calloc(page_size, 1); + char *name; + char *cp; + int count; + int i; + + ASSERT_NE(NULL, sysfs_lsms); + ASSERT_NE(NULL, syscall_lsms); + ASSERT_EQ(0, read_sysfs_lsms(sysfs_lsms, page_size)); + + count = lsm_list_modules(syscall_lsms, &size, 0); + ASSERT_LE(1, count); + cp = sysfs_lsms; + for (i = 0; i < count; i++) { + switch (syscall_lsms[i]) { + case LSM_ID_CAPABILITY: + name = "capability"; + break; + case LSM_ID_SELINUX: + name = "selinux"; + break; + case LSM_ID_SMACK: + name = "smack"; + break; + case LSM_ID_TOMOYO: + name = "tomoyo"; + break; + case LSM_ID_IMA: + name = "ima"; + break; + case LSM_ID_APPARMOR: + name = "apparmor"; + break; + case LSM_ID_YAMA: + name = "yama"; + break; + case LSM_ID_LOADPIN: + name = "loadpin"; + break; + case LSM_ID_SAFESETID: + name = "safesetid"; + break; + case LSM_ID_LOCKDOWN: + name = "lockdown"; + break; + case LSM_ID_BPF: + name = "bpf"; + break; + case LSM_ID_LANDLOCK: + name = "landlock"; + break; + default: + name = "INVALID"; + break; + } + ASSERT_EQ(0, strncmp(cp, name, strlen(name))); + cp += strlen(name) + 1; + } + + free(sysfs_lsms); + free(syscall_lsms); +} + +TEST_HARNESS_MAIN diff --git a/tools/testing/selftests/lsm/lsm_set_self_attr_test.c b/tools/testing/selftests/lsm/lsm_set_self_attr_test.c new file mode 100644 index 00000000000000..e9712c6cf59620 --- /dev/null +++ b/tools/testing/selftests/lsm/lsm_set_self_attr_test.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Linux Security Module infrastructure tests + * Tests for the lsm_set_self_attr system call + * + * Copyright © 2022 Casey Schaufler + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include "../kselftest_harness.h" +#include "common.h" + +TEST(ctx_null_lsm_set_self_attr) +{ + ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT, NULL, + sizeof(struct lsm_ctx), 0)); +} + +TEST(size_too_small_lsm_set_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + struct lsm_ctx *ctx = calloc(page_size, 1); + size_t size = page_size; + + ASSERT_NE(NULL, ctx); + if (attr_lsm_count()) { + ASSERT_LE(1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size, + 0)); + } + ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT, ctx, 1, 0)); + + free(ctx); +} + +TEST(flags_zero_lsm_set_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + struct lsm_ctx *ctx = calloc(page_size, 1); + size_t size = page_size; + + ASSERT_NE(NULL, ctx); + if (attr_lsm_count()) { + ASSERT_LE(1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size, + 0)); + } + ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT, ctx, size, 1)); + + free(ctx); +} + +TEST(flags_overset_lsm_set_self_attr) +{ + const long page_size = sysconf(_SC_PAGESIZE); + char *ctx = calloc(page_size, 1); + size_t size = page_size; + struct lsm_ctx *tctx = (struct lsm_ctx *)ctx; + + ASSERT_NE(NULL, ctx); + if (attr_lsm_count()) { + ASSERT_LE(1, lsm_get_self_attr(LSM_ATTR_CURRENT, tctx, &size, + 0)); + } + ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT | LSM_ATTR_PREV, tctx, + size, 0)); + + free(ctx); +} + +TEST_HARNESS_MAIN From c99ad509f3e1bfa253a554eb56c7972807d93cd0 Mon Sep 17 00:00:00 2001 From: Paul Moore Date: Wed, 18 Oct 2023 17:41:41 -0400 Subject: [PATCH 424/515] lsm: drop LSM_ID_IMA When IMA becomes a proper LSM we will reintroduce an appropriate LSM ID, but drop it from the userspace API for now in an effort to put an end to debates around the naming of the LSM ID macro. Reviewed-by: Roberto Sassu Signed-off-by: Paul Moore --- include/uapi/linux/lsm.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/include/uapi/linux/lsm.h b/include/uapi/linux/lsm.h index eeda59a77c0264..f0386880a78ee6 100644 --- a/include/uapi/linux/lsm.h +++ b/include/uapi/linux/lsm.h @@ -54,14 +54,13 @@ struct lsm_ctx { #define LSM_ID_SELINUX 101 #define LSM_ID_SMACK 102 #define LSM_ID_TOMOYO 103 -#define LSM_ID_IMA 104 -#define LSM_ID_APPARMOR 105 -#define LSM_ID_YAMA 106 -#define LSM_ID_LOADPIN 107 -#define LSM_ID_SAFESETID 108 -#define LSM_ID_LOCKDOWN 109 -#define LSM_ID_BPF 110 -#define LSM_ID_LANDLOCK 111 +#define LSM_ID_APPARMOR 104 +#define LSM_ID_YAMA 105 +#define LSM_ID_LOADPIN 106 +#define LSM_ID_SAFESETID 107 +#define LSM_ID_LOCKDOWN 108 +#define LSM_ID_BPF 109 +#define LSM_ID_LANDLOCK 110 /* * LSM_ATTR_XXX definitions identify different LSM attributes From 0310640b00d2696dd5bf1f289e0c47263cf95f03 Mon Sep 17 00:00:00 2001 From: Roberto Sassu Date: Thu, 26 Oct 2023 11:02:59 +0200 Subject: [PATCH 425/515] lsm: don't yet account for IMA in LSM_CONFIG_COUNT calculation Since IMA is not yet an LSM, don't account for it in the LSM_CONFIG_COUNT calculation, used to limit how many LSMs can invoke security_add_hooks(). Signed-off-by: Roberto Sassu [PM: subject line tweak] Signed-off-by: Paul Moore --- security/security.c | 1 - 1 file changed, 1 deletion(-) diff --git a/security/security.c b/security/security.c index 9136a4c3b0bc66..504c31cbee6a3a 100644 --- a/security/security.c +++ b/security/security.c @@ -44,7 +44,6 @@ (IS_ENABLED(CONFIG_SECURITY_SELINUX) ? 1 : 0) + \ (IS_ENABLED(CONFIG_SECURITY_SMACK) ? 1 : 0) + \ (IS_ENABLED(CONFIG_SECURITY_TOMOYO) ? 1 : 0) + \ - (IS_ENABLED(CONFIG_IMA) ? 1 : 0) + \ (IS_ENABLED(CONFIG_SECURITY_APPARMOR) ? 1 : 0) + \ (IS_ENABLED(CONFIG_SECURITY_YAMA) ? 1 : 0) + \ (IS_ENABLED(CONFIG_SECURITY_LOADPIN) ? 1 : 0) + \ From c56a333324dc8e950118590f8b5e32d4ebeb9388 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Thu, 26 Oct 2023 18:41:12 +0200 Subject: [PATCH 426/515] soc: document merges Signed-off-by: Arnd Bergmann --- arch/arm/arm-soc-for-next-contents.txt | 115 ++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-) diff --git a/arch/arm/arm-soc-for-next-contents.txt b/arch/arm/arm-soc-for-next-contents.txt index 1b0b597e31cde8..a1069cdcf85d84 100644 --- a/arch/arm/arm-soc-for-next-contents.txt +++ b/arch/arm/arm-soc-for-next-contents.txt @@ -4,6 +4,8 @@ soc/arm arm64: Add config for AMD Pensando SoC platforms renesas/arm git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-arm-soc-for-v6.7-tag1 + patch + arm: debug: reuse the config DEBUG_OMAP2UART{1,2} for OMAP{3,4,5} soc/dt patch @@ -79,8 +81,16 @@ soc/dt arm64: dts: Update cache properties for socionext riscv: dts: thead: convert isa detection to new properties arm64: dts: socionext: add missing cache properties - (23e4a49943624dd83199989c852565a3ff760fa7) + samsung/dt-2 https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt64-6.7-2 + samsung/dt-3 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt-6.7-2 + broadcom/dt + https://github.com/Broadcom/stblinux tags/arm-soc/for-6.7/devicetree + ti/dt-2 + https://git.kernel.org/pub/scm/linux/kernel/git/ti/linux tags/ti-k3-dt-for-v6.7-part2 + rockchip/dt-2 + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts64-2 soc/drivers patch @@ -115,6 +125,14 @@ soc/drivers https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-drivers-for-6.7 rockchips/drivers git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-drivers1 + ti/drivers + https://git.kernel.org/pub/scm/linux/kernel/git/ti/linux tags/ti-driver-soc-for-v6.7 + mvebu/arm + git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu tags/mvebu-arm-6.7-1 + bcm/drivers + https://github.com/Broadcom/stblinux tags/arm-soc/for-6.7/drivers + qcom/drivers-2 + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-drivers-for-6.7-2 soc/defconfig patch @@ -133,6 +151,8 @@ soc/defconfig https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-defconfig-6.7 amlogic/defconfig https://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux tags/amlogic-defconfig-for-v6.7 + qcom/defconfig-2 + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-arm64-defconfig-for-6.7-2 soc/late @@ -153,4 +173,97 @@ arm/fixes git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap tags/omap-fixes-audio-clock-and-modem-signed (1122a9c2ebe02435014a0f40dcc50f4333286f0f) git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu tags/mvebu-fixes-6.6-1 + (9eab43facdadb7d00456c2657001ae2e5353c814) + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-fixes-for-v6.6-tag3 + +soc/dt-late + patch + dt-bindings: arm: add AMD Pensando boards + arm64: dts: Add AMD Pensando Elba SoC support + ux500/dt + git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik tags/ux500-dts-for-armsoc + renesas/dt-bindings + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dt-bindings-for-v6.7-tag1 + renesas/dt + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dts-for-v6.7-tag1 + dts/cleanup-arm64 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt tags/dt64-cleanup-6.7 + dts/cleanup-arm32 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt tags/dt-cleanup-6.7 + samsung/dt64 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt64-6.7 + samsung/dt + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt-6.7 + ixp4xx/dt + git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik tags/ixp4xx-for-soc-v6.7 + at91/dt + https://git.kernel.org/pub/scm/linux/kernel/git/at91/linux tags/at91-dt-6.7 + omap/dt + git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap tags/omap-for-v6.7/dt-signed + sti/dt + git://git.kernel.org/pub/scm/linux/kernel/git/pchotard/sti tags/sti-dt-for-v6.7-round1 + renesas/dt-bindings-2 + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dt-bindings-for-v6.7-tag2 + renesas/dt-2 + git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel tags/renesas-dts-for-v6.7-tag2 + tegra/dt-bindings + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-dt-bindings + tegra/dt + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-arm-dt + tegra/dt64 + git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux tags/tegra-for-6.7-arm64-dt + sunxi/dt + https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux tags/sunxi-dt-for-6.7-1 + riscv/dt + https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-dt-for-v6.6-final + imx/dt-bindings + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-bindings-6.7 + imx/dt + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-dt-6.7 + imx/dt64 + git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux tags/imx-dt64-6.7 + qcom/dt64 + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-arm64-for-6.7 + qcom/dt + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-dts-for-6.7 + aspeed/dt + git://git.kernel.org/pub/scm/linux/kernel/git/joel/bmc tags/aspeed-6.7-devicetree + amlogic/dt64 + https://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux tags/amlogic-arm64-dt-for-v6.7 + stm32/dt + git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32 tags/stm32-dt-for-v6.7-1 + patch + arm/arm64: dts: Removed undocumented and unused "pl022,hierarchy" property + riscv/dt-2 + https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux tags/riscv-dt-for-v6.7 + rockchip/dt64 + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts64-1 + rockchip/dt + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts32-1 + mediatek/dts64-2 + https://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux tags/v6.6-next-dts64.3 + (56bc311585206a8955de793301d4f84fb4ad2ee6) + https://git.kernel.org/pub/scm/linux/kernel/git/ti/linux tags/ti-k3-dt-for-v6.7 + marvell/dts + git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu tags/mvebu-dt64-6.7-1 + patch + arm64: dts: Update cache properties for socionext + riscv: dts: thead: convert isa detection to new properties + arm64: dts: socionext: add missing cache properties + samsung/dt-2 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt64-6.7-2 + samsung/dt-3 + https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux tags/samsung-dt-6.7-2 + broadcom/dt + https://github.com/Broadcom/stblinux tags/arm-soc/for-6.7/devicetree + ti/dt-2 + https://git.kernel.org/pub/scm/linux/kernel/git/ti/linux tags/ti-k3-dt-for-v6.7-part2 + rockchip/dt-2 + git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip tags/v6.7-rockchip-dts64-2 + qcom/dt-2 + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-arm64-for-6.7-2 + qcom/dt32-2 + https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux tags/qcom-dts-for-6.7-2 + patch + ARM: dts: usr8200: Fix phy registers From 8dc0f209a22d61aff4490e073981e89f7716c6cd Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:54:59 -0700 Subject: [PATCH 427/515] KVM: Tweak kvm_hva_range and hva_handler_t to allow reusing for gfn ranges Rework and rename "struct kvm_hva_range" into "kvm_mmu_notifier_range" so that the structure can be used to handle notifications that operate on gfn context, i.e. that aren't tied to a host virtual address. Rename the handler typedef too (arguably it should always have been gfn_handler_t). Practically speaking, this is a nop for 64-bit kernels as the only meaningful change is to store start+end as u64s instead of unsigned longs. Reviewed-by: Paolo Bonzini Reviewed-by: Xiaoyao Li Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 486800a7024b37..0524933856d423 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -541,18 +541,22 @@ static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn) return container_of(mn, struct kvm, mmu_notifier); } -typedef bool (*hva_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range); +typedef bool (*gfn_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range); typedef void (*on_lock_fn_t)(struct kvm *kvm, unsigned long start, unsigned long end); typedef void (*on_unlock_fn_t)(struct kvm *kvm); -struct kvm_hva_range { - unsigned long start; - unsigned long end; +struct kvm_mmu_notifier_range { + /* + * 64-bit addresses, as KVM notifiers can operate on host virtual + * addresses (unsigned long) and guest physical addresses (64-bit). + */ + u64 start; + u64 end; union kvm_mmu_notifier_arg arg; - hva_handler_t handler; + gfn_handler_t handler; on_lock_fn_t on_lock; on_unlock_fn_t on_unlock; bool flush_on_ret; @@ -581,7 +585,7 @@ static const union kvm_mmu_notifier_arg KVM_MMU_NOTIFIER_NO_ARG; node = interval_tree_iter_next(node, start, last)) \ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, - const struct kvm_hva_range *range) + const struct kvm_mmu_notifier_range *range) { bool ret = false, locked = false; struct kvm_gfn_range gfn_range; @@ -608,9 +612,9 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, unsigned long hva_start, hva_end; slot = container_of(node, struct kvm_memory_slot, hva_node[slots->node_idx]); - hva_start = max(range->start, slot->userspace_addr); - hva_end = min(range->end, slot->userspace_addr + - (slot->npages << PAGE_SHIFT)); + hva_start = max_t(unsigned long, range->start, slot->userspace_addr); + hva_end = min_t(unsigned long, range->end, + slot->userspace_addr + (slot->npages << PAGE_SHIFT)); /* * To optimize for the likely case where the address @@ -660,10 +664,10 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, unsigned long start, unsigned long end, union kvm_mmu_notifier_arg arg, - hva_handler_t handler) + gfn_handler_t handler) { struct kvm *kvm = mmu_notifier_to_kvm(mn); - const struct kvm_hva_range range = { + const struct kvm_mmu_notifier_range range = { .start = start, .end = end, .arg = arg, @@ -680,10 +684,10 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, static __always_inline int kvm_handle_hva_range_no_flush(struct mmu_notifier *mn, unsigned long start, unsigned long end, - hva_handler_t handler) + gfn_handler_t handler) { struct kvm *kvm = mmu_notifier_to_kvm(mn); - const struct kvm_hva_range range = { + const struct kvm_mmu_notifier_range range = { .start = start, .end = end, .handler = handler, @@ -771,7 +775,7 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, const struct mmu_notifier_range *range) { struct kvm *kvm = mmu_notifier_to_kvm(mn); - const struct kvm_hva_range hva_range = { + const struct kvm_mmu_notifier_range hva_range = { .start = range->start, .end = range->end, .handler = kvm_unmap_gfn_range, @@ -835,7 +839,7 @@ static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, const struct mmu_notifier_range *range) { struct kvm *kvm = mmu_notifier_to_kvm(mn); - const struct kvm_hva_range hva_range = { + const struct kvm_mmu_notifier_range hva_range = { .start = range->start, .end = range->end, .handler = (void *)kvm_null_fn, From 6a75a0a7e9d01d9446031efdb9ce432260be2246 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Thu, 21 Sep 2023 13:33:18 -0700 Subject: [PATCH 428/515] KVM: Assert that mmu_invalidate_in_progress *never* goes negative Move the assertion on the in-progress invalidation count from the primary MMU's notifier path to KVM's common notification path, i.e. assert that the count doesn't go negative even when the invalidation is coming from KVM itself. Opportunistically convert the assertion to a KVM_BUG_ON(), i.e. kill only the affected VM, not the entire kernel. A corrupted count is fatal to the VM, e.g. the non-zero (negative) count will cause mmu_invalidate_retry() to block any and all attempts to install new mappings. But it's far from guaranteed that an end() without a start() is fatal or even problematic to anything other than the target VM, e.g. the underlying bug could simply be a duplicate call to end(). And it's much more likely that a missed invalidation, i.e. a potential use-after-free, would manifest as no notification whatsoever, not an end() without a start(). Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 0524933856d423..5a97e6c7d9c20a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -833,6 +833,7 @@ void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, * in conjunction with the smp_rmb in mmu_invalidate_retry(). */ kvm->mmu_invalidate_in_progress--; + KVM_BUG_ON(kvm->mmu_invalidate_in_progress < 0, kvm); } static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, @@ -863,8 +864,6 @@ static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, */ if (wake) rcuwait_wake_up(&kvm->mn_memslots_update_rcuwait); - - BUG_ON(kvm->mmu_invalidate_in_progress < 0); } static int kvm_mmu_notifier_clear_flush_young(struct mmu_notifier *mn, From 07fa32fcbd91adc7c56511ec779eff2514305caf Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Fri, 27 Oct 2023 13:36:48 +0200 Subject: [PATCH 429/515] fbdev: stifb: Make the STI next font pointer a 32-bit signed offset The pointer to the next STI font is actually a signed 32-bit offset. With this change the 64-bit kernel will correctly subract the (signed 32-bit) offset instead of adding a (unsigned 32-bit) offset. It has no effect on 32-bit kernels. This fixes the stifb driver with a 64-bit kernel on qemu. Signed-off-by: Helge Deller Cc: stable@vger.kernel.org --- include/video/sticore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/video/sticore.h b/include/video/sticore.h index 945ad60463a189..012b5b46ad7d0b 100644 --- a/include/video/sticore.h +++ b/include/video/sticore.h @@ -232,7 +232,7 @@ struct sti_rom_font { u8 height; u8 font_type; /* language type */ u8 bytes_per_char; - u32 next_font; + s32 next_font; /* note: signed int */ u8 underline_height; u8 underline_pos; u8 res008[2]; From 9ec605adafbd4dbcb9720ee6c3a127d5444828ce Mon Sep 17 00:00:00 2001 From: Oliver Upton Date: Thu, 26 Oct 2023 20:53:06 +0000 Subject: [PATCH 430/515] KVM: arm64: Add tracepoint for MMIO accesses where ISV==0 It is a pretty well known fact that KVM does not support MMIO emulation without valid instruction syndrome information (ESR_EL2.ISV == 0). The current kvm_pr_unimpl() is pretty useless, as it contains zero context to relate the event to a vCPU. Replace it with a precise tracepoint that dumps the relevant context so the user can make sense of what the guest is doing. Acked-by: Zenghui Yu Acked-by: Marc Zyngier Link: https://lore.kernel.org/r/20231026205306.3045075-1-oliver.upton@linux.dev Signed-off-by: Oliver Upton --- arch/arm64/kvm/mmio.c | 4 +++- arch/arm64/kvm/trace_arm.h | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/mmio.c b/arch/arm64/kvm/mmio.c index 3dd38a151d2a68..200c8019a82a43 100644 --- a/arch/arm64/kvm/mmio.c +++ b/arch/arm64/kvm/mmio.c @@ -135,6 +135,9 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa) * volunteered to do so, and bail out otherwise. */ if (!kvm_vcpu_dabt_isvalid(vcpu)) { + trace_kvm_mmio_nisv(*vcpu_pc(vcpu), kvm_vcpu_get_esr(vcpu), + kvm_vcpu_get_hfar(vcpu), fault_ipa); + if (test_bit(KVM_ARCH_FLAG_RETURN_NISV_IO_ABORT_TO_USER, &vcpu->kvm->arch.flags)) { run->exit_reason = KVM_EXIT_ARM_NISV; @@ -143,7 +146,6 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa) return 0; } - kvm_pr_unimpl("Data abort outside memslots with no valid syndrome info\n"); return -ENOSYS; } diff --git a/arch/arm64/kvm/trace_arm.h b/arch/arm64/kvm/trace_arm.h index 8ad53104934dcd..c18c1a95831e1b 100644 --- a/arch/arm64/kvm/trace_arm.h +++ b/arch/arm64/kvm/trace_arm.h @@ -136,6 +136,31 @@ TRACE_EVENT(kvm_mmio_emulate, __entry->vcpu_pc, __entry->instr, __entry->cpsr) ); +TRACE_EVENT(kvm_mmio_nisv, + TP_PROTO(unsigned long vcpu_pc, unsigned long esr, + unsigned long far, unsigned long ipa), + TP_ARGS(vcpu_pc, esr, far, ipa), + + TP_STRUCT__entry( + __field( unsigned long, vcpu_pc ) + __field( unsigned long, esr ) + __field( unsigned long, far ) + __field( unsigned long, ipa ) + ), + + TP_fast_assign( + __entry->vcpu_pc = vcpu_pc; + __entry->esr = esr; + __entry->far = far; + __entry->ipa = ipa; + ), + + TP_printk("ipa %#016lx, esr %#016lx, far %#016lx, pc %#016lx", + __entry->ipa, __entry->esr, + __entry->far, __entry->vcpu_pc) +); + + TRACE_EVENT(kvm_set_way_flush, TP_PROTO(unsigned long vcpu_pc, bool cache), TP_ARGS(vcpu_pc, cache), From b3d87b87017d50cab1ea49fc6810c74584e00027 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Fri, 27 Oct 2023 19:32:54 +0200 Subject: [PATCH 431/515] dm crypt: don't allocate large compound pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It was reported that commit 5054e778fcd9cd29ddaa8109077cd235527e4f94 ("dm crypt: allocate compound pages if possible") causes intermittent freezes [1]. So far, it is not clear what is the root cause. It was reported that with the allocation order 3 or lower it works [1], so we restrict the order to 3 (that is PAGE_ALLOC_COSTLY_ORDER). [1] https://www.spinics.net/lists/dm-devel/msg56048.html Signed-off-by: Mikulas Patocka Reported-by: Marek Marczykowski-Górecki Tested-by: Marek Marczykowski-Górecki Cc: stable@vger.kernel.org # v6.5+ Fixes: 5054e778fcd9 ("dm crypt: allocate compound pages if possible") Signed-off-by: Mike Snitzer --- drivers/md/dm-crypt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 8a03b359073327..745e2c156ab1c2 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1678,7 +1678,7 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned int size) unsigned int nr_iovecs = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; gfp_t gfp_mask = GFP_NOWAIT | __GFP_HIGHMEM; unsigned int remaining_size; - unsigned int order = MAX_ORDER - 1; + unsigned int order = PAGE_ALLOC_COSTLY_ORDER; retry: if (unlikely(gfp_mask & __GFP_DIRECT_RECLAIM)) From ff6abbe856342d4a7d5c28a0f7e33838f9f0a873 Mon Sep 17 00:00:00 2001 From: Richard Weinberger Date: Sat, 21 Oct 2023 20:58:32 +0200 Subject: [PATCH 432/515] mtd: block2mtd: Add a valid holder to blkdev_put() Since commit 2736e8eeb0ccd ("block: use the holder as indication for exclusive opens") blkdev_put() requires a valid holder argument. So, do so also in block2mtd to unbreak bdev->bd_holder refcounting. Cc: Christoph Hellwig Cc: stable@vger.kernel.org Fixes: 2736e8eeb0ccd ("block: use the holder as indication for exclusive opens") Signed-off-by: Richard Weinberger Reviewed-by: Christoph Hellwig Signed-off-by: Miquel Raynal Link: https://lore.kernel.org/linux-mtd/20231021185832.25592-1-richard@nod.at --- drivers/mtd/devices/block2mtd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index be106dc20ff3cf..8c37650bbce450 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c @@ -209,7 +209,7 @@ static void block2mtd_free_device(struct block2mtd_dev *dev) if (dev->blkdev) { invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 0, -1); - blkdev_put(dev->blkdev, NULL); + blkdev_put(dev->blkdev, dev); } kfree(dev); From 6d09b47d34b58625f8011fdbc123b6625493e947 Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:00 -0700 Subject: [PATCH 433/515] KVM: Use gfn instead of hva for mmu_notifier_retry Currently in mmu_notifier invalidate path, hva range is recorded and then checked against by mmu_notifier_retry_hva() in the page fault handling path. However, for the to be introduced private memory, a page fault may not have a hva associated, checking gfn(gpa) makes more sense. For existing hva based shared memory, gfn is expected to also work. The only downside is when aliasing multiple gfns to a single hva, the current algorithm of checking multiple ranges could result in a much larger range being rejected. Such aliasing should be uncommon, so the impact is expected small. Suggested-by: Sean Christopherson Cc: Xu Yilun Signed-off-by: Chao Peng Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba [sean: convert vmx_set_apic_access_page_addr() to gfn-based API] Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 10 ++++++---- arch/x86/kvm/vmx/vmx.c | 11 +++++------ include/linux/kvm_host.h | 33 ++++++++++++++++++++------------ virt/kvm/kvm_main.c | 41 +++++++++++++++++++++++++++++++--------- 4 files changed, 64 insertions(+), 31 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index f7901cb4d2fa4b..d33657d61d803c 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3056,7 +3056,7 @@ static void direct_pte_prefetch(struct kvm_vcpu *vcpu, u64 *sptep) * * There are several ways to safely use this helper: * - * - Check mmu_invalidate_retry_hva() after grabbing the mapping level, before + * - Check mmu_invalidate_retry_gfn() after grabbing the mapping level, before * consuming it. In this case, mmu_lock doesn't need to be held during the * lookup, but it does need to be held while checking the MMU notifier. * @@ -4358,7 +4358,7 @@ static bool is_page_fault_stale(struct kvm_vcpu *vcpu, return true; return fault->slot && - mmu_invalidate_retry_hva(vcpu->kvm, fault->mmu_seq, fault->hva); + mmu_invalidate_retry_gfn(vcpu->kvm, fault->mmu_seq, fault->gfn); } static int direct_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) @@ -6245,7 +6245,9 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end) write_lock(&kvm->mmu_lock); - kvm_mmu_invalidate_begin(kvm, 0, -1ul); + kvm_mmu_invalidate_begin(kvm); + + kvm_mmu_invalidate_range_add(kvm, gfn_start, gfn_end); flush = kvm_rmap_zap_gfn_range(kvm, gfn_start, gfn_end); @@ -6255,7 +6257,7 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end) if (flush) kvm_flush_remote_tlbs_range(kvm, gfn_start, gfn_end - gfn_start); - kvm_mmu_invalidate_end(kvm, 0, -1ul); + kvm_mmu_invalidate_end(kvm); write_unlock(&kvm->mmu_lock); } diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 72e3943f36935c..6e502ba931416d 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -6757,10 +6757,10 @@ static void vmx_set_apic_access_page_addr(struct kvm_vcpu *vcpu) return; /* - * Grab the memslot so that the hva lookup for the mmu_notifier retry - * is guaranteed to use the same memslot as the pfn lookup, i.e. rely - * on the pfn lookup's validation of the memslot to ensure a valid hva - * is used for the retry check. + * Explicitly grab the memslot using KVM's internal slot ID to ensure + * KVM doesn't unintentionally grab a userspace memslot. It _should_ + * be impossible for userspace to create a memslot for the APIC when + * APICv is enabled, but paranoia won't hurt in this case. */ slot = id_to_memslot(slots, APIC_ACCESS_PAGE_PRIVATE_MEMSLOT); if (!slot || slot->flags & KVM_MEMSLOT_INVALID) @@ -6785,8 +6785,7 @@ static void vmx_set_apic_access_page_addr(struct kvm_vcpu *vcpu) return; read_lock(&vcpu->kvm->mmu_lock); - if (mmu_invalidate_retry_hva(kvm, mmu_seq, - gfn_to_hva_memslot(slot, gfn))) { + if (mmu_invalidate_retry_gfn(kvm, mmu_seq, gfn)) { kvm_make_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu); read_unlock(&vcpu->kvm->mmu_lock); goto out; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index fb6c6109fdcad6..11d0916883460b 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -787,8 +787,8 @@ struct kvm { struct mmu_notifier mmu_notifier; unsigned long mmu_invalidate_seq; long mmu_invalidate_in_progress; - unsigned long mmu_invalidate_range_start; - unsigned long mmu_invalidate_range_end; + gfn_t mmu_invalidate_range_start; + gfn_t mmu_invalidate_range_end; #endif struct list_head devices; u64 manual_dirty_log_protect; @@ -1392,10 +1392,9 @@ void kvm_mmu_free_memory_cache(struct kvm_mmu_memory_cache *mc); void *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc); #endif -void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, - unsigned long end); -void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, - unsigned long end); +void kvm_mmu_invalidate_begin(struct kvm *kvm); +void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end); +void kvm_mmu_invalidate_end(struct kvm *kvm); long kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); @@ -1970,9 +1969,9 @@ static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq) return 0; } -static inline int mmu_invalidate_retry_hva(struct kvm *kvm, +static inline int mmu_invalidate_retry_gfn(struct kvm *kvm, unsigned long mmu_seq, - unsigned long hva) + gfn_t gfn) { lockdep_assert_held(&kvm->mmu_lock); /* @@ -1981,10 +1980,20 @@ static inline int mmu_invalidate_retry_hva(struct kvm *kvm, * that might be being invalidated. Note that it may include some false * positives, due to shortcuts when handing concurrent invalidations. */ - if (unlikely(kvm->mmu_invalidate_in_progress) && - hva >= kvm->mmu_invalidate_range_start && - hva < kvm->mmu_invalidate_range_end) - return 1; + if (unlikely(kvm->mmu_invalidate_in_progress)) { + /* + * Dropping mmu_lock after bumping mmu_invalidate_in_progress + * but before updating the range is a KVM bug. + */ + if (WARN_ON_ONCE(kvm->mmu_invalidate_range_start == INVALID_GPA || + kvm->mmu_invalidate_range_end == INVALID_GPA)) + return 1; + + if (gfn >= kvm->mmu_invalidate_range_start && + gfn < kvm->mmu_invalidate_range_end) + return 1; + } + if (kvm->mmu_invalidate_seq != mmu_seq) return 1; return 0; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 5a97e6c7d9c20a..1a577a25de4777 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -543,9 +543,7 @@ static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn) typedef bool (*gfn_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range); -typedef void (*on_lock_fn_t)(struct kvm *kvm, unsigned long start, - unsigned long end); - +typedef void (*on_lock_fn_t)(struct kvm *kvm); typedef void (*on_unlock_fn_t)(struct kvm *kvm); struct kvm_mmu_notifier_range { @@ -637,7 +635,8 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, locked = true; KVM_MMU_LOCK(kvm); if (!IS_KVM_NULL_FN(range->on_lock)) - range->on_lock(kvm, range->start, range->end); + range->on_lock(kvm); + if (IS_KVM_NULL_FN(range->handler)) break; } @@ -742,16 +741,29 @@ static void kvm_mmu_notifier_change_pte(struct mmu_notifier *mn, kvm_handle_hva_range(mn, address, address + 1, arg, kvm_change_spte_gfn); } -void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, - unsigned long end) +void kvm_mmu_invalidate_begin(struct kvm *kvm) { + lockdep_assert_held_write(&kvm->mmu_lock); /* * The count increase must become visible at unlock time as no * spte can be established without taking the mmu_lock and * count is also read inside the mmu_lock critical section. */ kvm->mmu_invalidate_in_progress++; + if (likely(kvm->mmu_invalidate_in_progress == 1)) { + kvm->mmu_invalidate_range_start = INVALID_GPA; + kvm->mmu_invalidate_range_end = INVALID_GPA; + } +} + +void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end) +{ + lockdep_assert_held_write(&kvm->mmu_lock); + + WARN_ON_ONCE(!kvm->mmu_invalidate_in_progress); + + if (likely(kvm->mmu_invalidate_range_start == INVALID_GPA)) { kvm->mmu_invalidate_range_start = start; kvm->mmu_invalidate_range_end = end; } else { @@ -771,6 +783,12 @@ void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, } } +static bool kvm_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) +{ + kvm_mmu_invalidate_range_add(kvm, range->start, range->end); + return kvm_unmap_gfn_range(kvm, range); +} + static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, const struct mmu_notifier_range *range) { @@ -778,7 +796,7 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, const struct kvm_mmu_notifier_range hva_range = { .start = range->start, .end = range->end, - .handler = kvm_unmap_gfn_range, + .handler = kvm_mmu_unmap_gfn_range, .on_lock = kvm_mmu_invalidate_begin, .on_unlock = kvm_arch_guest_memory_reclaimed, .flush_on_ret = true, @@ -817,8 +835,7 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, return 0; } -void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, - unsigned long end) +void kvm_mmu_invalidate_end(struct kvm *kvm) { /* * This sequence increase will notify the kvm page fault that @@ -834,6 +851,12 @@ void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, */ kvm->mmu_invalidate_in_progress--; KVM_BUG_ON(kvm->mmu_invalidate_in_progress < 0, kvm); + + /* + * Assert that at least one range was added between start() and end(). + * Not adding a range isn't fatal, but it is a KVM bug. + */ + WARN_ON_ONCE(kvm->mmu_invalidate_range_start == INVALID_GPA); } static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, From 9cbf72e7fecfa17a7c96868e6134740ed76fb61d Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Thu, 21 Sep 2023 13:33:21 -0700 Subject: [PATCH 434/515] KVM: WARN if there are dangling MMU invalidations at VM destruction Add an assertion that there are no in-progress MMU invalidations when a VM is being destroyed, with the exception of the scenario where KVM unregisters its MMU notifier between an .invalidate_range_start() call and the corresponding .invalidate_range_end(). KVM can't detect unpaired calls from the mmu_notifier due to the above exception waiver, but the assertion can detect KVM bugs, e.g. such as the bug that *almost* escaped initial guest_memfd development. Link: https://lore.kernel.org/all/e397d30c-c6af-e68f-d18e-b4e3739c5389@linux.intel.com Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 1a577a25de4777..4dba682586ee60 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1356,9 +1356,16 @@ static void kvm_destroy_vm(struct kvm *kvm) * No threads can be waiting in kvm_swap_active_memslots() as the * last reference on KVM has been dropped, but freeing * memslots would deadlock without this manual intervention. + * + * If the count isn't unbalanced, i.e. KVM did NOT unregister its MMU + * notifier between a start() and end(), then there shouldn't be any + * in-progress invalidations. */ WARN_ON(rcuwait_active(&kvm->mn_memslots_update_rcuwait)); - kvm->mn_active_invalidate_count = 0; + if (kvm->mn_active_invalidate_count) + kvm->mn_active_invalidate_count = 0; + else + WARN_ON(kvm->mmu_invalidate_in_progress); #else kvm_flush_shadow_all(kvm); #endif From fc1f5ccd80203df186d24fdbb877477e6921fe4d Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:01 -0700 Subject: [PATCH 435/515] KVM: PPC: Drop dead code related to KVM_ARCH_WANT_MMU_NOTIFIER Assert that both KVM_ARCH_WANT_MMU_NOTIFIER and CONFIG_MMU_NOTIFIER are defined when KVM is enabled, and return '1' unconditionally for the CONFIG_KVM_BOOK3S_HV_POSSIBLE=n path. All flavors of PPC support for KVM select MMU_NOTIFIER, and KVM_ARCH_WANT_MMU_NOTIFIER is unconditionally defined by arch/powerpc/include/asm/kvm_host.h. Effectively dropping use of KVM_ARCH_WANT_MMU_NOTIFIER will simplify a future cleanup to turn KVM_ARCH_WANT_MMU_NOTIFIER into a Kconfig, i.e. will allow combining all of the #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) checks into a single #ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER without having to worry about PPC's "bare" usage of KVM_ARCH_WANT_MMU_NOTIFIER. Signed-off-by: Sean Christopherson --- arch/powerpc/kvm/powerpc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 7197c8256668b8..b0a512ede764f6 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -632,12 +632,13 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) break; #endif case KVM_CAP_SYNC_MMU: +#if !defined(CONFIG_MMU_NOTIFIER) || !defined(KVM_ARCH_WANT_MMU_NOTIFIER) + BUILD_BUG(); +#endif #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE r = hv_enabled; -#elif defined(KVM_ARCH_WANT_MMU_NOTIFIER) - r = 1; #else - r = 0; + r = 1; #endif break; #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE From 3e661cfa1e0a94ea5b48a5e945a9fa352a42bb5a Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:02 -0700 Subject: [PATCH 436/515] KVM: PPC: Return '1' unconditionally for KVM_CAP_SYNC_MMU Advertise that KVM's MMU is synchronized with the primary MMU for all flavors of PPC KVM support, i.e. advertise that the MMU is synchronized when CONFIG_KVM_BOOK3S_HV_POSSIBLE=y but the VM is not using hypervisor mode (a.k.a. PR VMs). PR VMs, via kvm_unmap_gfn_range_pr(), do the right thing for mmu_notifier invalidation events, and more tellingly, KVM returns '1' for KVM_CAP_SYNC_MMU when CONFIG_KVM_BOOK3S_HV_POSSIBLE=n and CONFIG_KVM_BOOK3S_PR_POSSIBLE=y, i.e. KVM already advertises a synchronized MMU for PR VMs, just not when CONFIG_KVM_BOOK3S_HV_POSSIBLE=y. Suggested-by: Paolo Bonzini Signed-off-by: Sean Christopherson --- arch/powerpc/kvm/powerpc.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index b0a512ede764f6..8d3ec483bc2b20 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -635,11 +635,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) #if !defined(CONFIG_MMU_NOTIFIER) || !defined(KVM_ARCH_WANT_MMU_NOTIFIER) BUILD_BUG(); #endif -#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE - r = hv_enabled; -#else r = 1; -#endif break; #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE case KVM_CAP_PPC_HTAB_FD: From 519320b1cd3f4ba275aeb092d1d00b93fb6676c4 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:03 -0700 Subject: [PATCH 437/515] KVM: Convert KVM_ARCH_WANT_MMU_NOTIFIER to CONFIG_KVM_GENERIC_MMU_NOTIFIER Convert KVM_ARCH_WANT_MMU_NOTIFIER into a Kconfig and select it where appropriate to effectively maintain existing behavior. Using a proper Kconfig will simplify building more functionality on top of KVM's mmu_notifier infrastructure. Add a forward declaration of kvm_gfn_range to kvm_types.h so that including arch/powerpc/include/asm/kvm_ppc.h's with CONFIG_KVM=n doesn't generate warnings due to kvm_gfn_range being undeclared. PPC defines hooks for PR vs. HV without guarding them via #ifdeffery, e.g. bool (*unmap_gfn_range)(struct kvm *kvm, struct kvm_gfn_range *range); bool (*age_gfn)(struct kvm *kvm, struct kvm_gfn_range *range); bool (*test_age_gfn)(struct kvm *kvm, struct kvm_gfn_range *range); bool (*set_spte_gfn)(struct kvm *kvm, struct kvm_gfn_range *range); Alternatively, PPC could forward declare kvm_gfn_range, but there's no good reason not to define it in common KVM. Acked-by: Anup Patel Signed-off-by: Sean Christopherson --- arch/arm64/include/asm/kvm_host.h | 2 -- arch/arm64/kvm/Kconfig | 2 +- arch/mips/include/asm/kvm_host.h | 2 -- arch/mips/kvm/Kconfig | 2 +- arch/powerpc/include/asm/kvm_host.h | 2 -- arch/powerpc/kvm/Kconfig | 8 ++++---- arch/powerpc/kvm/powerpc.c | 4 +--- arch/riscv/include/asm/kvm_host.h | 2 -- arch/riscv/kvm/Kconfig | 2 +- arch/x86/include/asm/kvm_host.h | 2 -- arch/x86/kvm/Kconfig | 2 +- include/linux/kvm_host.h | 6 +++--- include/linux/kvm_types.h | 1 + virt/kvm/Kconfig | 4 ++++ virt/kvm/kvm_main.c | 10 +++++----- 15 files changed, 22 insertions(+), 29 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index af06ccb7ee3433..9e046b64847aa5 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -921,8 +921,6 @@ int __kvm_arm_vcpu_get_events(struct kvm_vcpu *vcpu, int __kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu, struct kvm_vcpu_events *events); -#define KVM_ARCH_WANT_MMU_NOTIFIER - void kvm_arm_halt_guest(struct kvm *kvm); void kvm_arm_resume_guest(struct kvm *kvm); diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 83c1e09be42e5b..1a777715199fa8 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -22,7 +22,7 @@ menuconfig KVM bool "Kernel-based Virtual Machine (KVM) support" depends on HAVE_KVM select KVM_GENERIC_HARDWARE_ENABLING - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select PREEMPT_NOTIFIERS select HAVE_KVM_CPU_RELAX_INTERCEPT select KVM_MMIO diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h index 54a85f1d4f2c8d..179f320cc2313b 100644 --- a/arch/mips/include/asm/kvm_host.h +++ b/arch/mips/include/asm/kvm_host.h @@ -810,8 +810,6 @@ int kvm_mips_mkclean_gpa_pt(struct kvm *kvm, gfn_t start_gfn, gfn_t end_gfn); pgd_t *kvm_pgd_alloc(void); void kvm_mmu_free_memory_caches(struct kvm_vcpu *vcpu); -#define KVM_ARCH_WANT_MMU_NOTIFIER - /* Emulation */ enum emulation_result update_pc(struct kvm_vcpu *vcpu, u32 cause); int kvm_get_badinstr(u32 *opc, struct kvm_vcpu *vcpu, u32 *out); diff --git a/arch/mips/kvm/Kconfig b/arch/mips/kvm/Kconfig index a8cdba75f98dde..c04987d2ed2e3e 100644 --- a/arch/mips/kvm/Kconfig +++ b/arch/mips/kvm/Kconfig @@ -25,7 +25,7 @@ config KVM select HAVE_KVM_EVENTFD select HAVE_KVM_VCPU_ASYNC_IOCTL select KVM_MMIO - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select INTERVAL_TREE select KVM_GENERIC_HARDWARE_ENABLING help diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 14ee0dece8538b..4b5c3f2acf78f5 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -62,8 +62,6 @@ #include -#define KVM_ARCH_WANT_MMU_NOTIFIER - #define HPTEG_CACHE_NUM (1 << 15) #define HPTEG_HASH_BITS_PTE 13 #define HPTEG_HASH_BITS_PTE_LONG 12 diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index 902611954200df..b33358ee642440 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig @@ -42,7 +42,7 @@ config KVM_BOOK3S_64_HANDLER config KVM_BOOK3S_PR_POSSIBLE bool select KVM_MMIO - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER config KVM_BOOK3S_HV_POSSIBLE bool @@ -85,7 +85,7 @@ config KVM_BOOK3S_64_HV tristate "KVM for POWER7 and later using hypervisor mode in host" depends on KVM_BOOK3S_64 && PPC_POWERNV select KVM_BOOK3S_HV_POSSIBLE - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select CMA help Support running unmodified book3s_64 guest kernels in @@ -194,7 +194,7 @@ config KVM_E500V2 depends on !CONTEXT_TRACKING_USER select KVM select KVM_MMIO - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER help Support running unmodified E500 guest kernels in virtual machines on E500v2 host processors. @@ -211,7 +211,7 @@ config KVM_E500MC select KVM select KVM_MMIO select KVM_BOOKE_HV - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER help Support running unmodified E500MC/E5500/E6500 guest kernels in virtual machines on E500MC/E5500/E6500 host processors. diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 8d3ec483bc2b20..aac75c98a9565b 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -632,9 +632,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) break; #endif case KVM_CAP_SYNC_MMU: -#if !defined(CONFIG_MMU_NOTIFIER) || !defined(KVM_ARCH_WANT_MMU_NOTIFIER) - BUILD_BUG(); -#endif + BUILD_BUG_ON(!IS_ENABLED(CONFIG_KVM_GENERIC_MMU_NOTIFIER)); r = 1; break; #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE diff --git a/arch/riscv/include/asm/kvm_host.h b/arch/riscv/include/asm/kvm_host.h index 1ebf20dfbaa698..66ee9ff483e9ab 100644 --- a/arch/riscv/include/asm/kvm_host.h +++ b/arch/riscv/include/asm/kvm_host.h @@ -249,8 +249,6 @@ struct kvm_vcpu_arch { static inline void kvm_arch_sync_events(struct kvm *kvm) {} static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} -#define KVM_ARCH_WANT_MMU_NOTIFIER - #define KVM_RISCV_GSTAGE_TLB_MIN_ORDER 12 void kvm_riscv_local_hfence_gvma_vmid_gpa(unsigned long vmid, diff --git a/arch/riscv/kvm/Kconfig b/arch/riscv/kvm/Kconfig index dfc237d7875b53..ae2e05f050ece1 100644 --- a/arch/riscv/kvm/Kconfig +++ b/arch/riscv/kvm/Kconfig @@ -30,7 +30,7 @@ config KVM select KVM_GENERIC_HARDWARE_ENABLING select KVM_MMIO select KVM_XFER_TO_GUEST_WORK - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select PREEMPT_NOTIFIERS help Support hosting virtualized guest machines. diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 70d139406bc80d..31e84668014e88 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2129,8 +2129,6 @@ enum { # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, 0) #endif -#define KVM_ARCH_WANT_MMU_NOTIFIER - int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v); int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); int kvm_cpu_has_extint(struct kvm_vcpu *v); diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index ed90f148140dfe..091b74599c2275 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -24,7 +24,7 @@ config KVM depends on HIGH_RES_TIMERS depends on X86_LOCAL_APIC select PREEMPT_NOTIFIERS - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select HAVE_KVM_IRQCHIP select HAVE_KVM_PFNCACHE select HAVE_KVM_IRQFD diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 11d0916883460b..5faba69403ac49 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -253,7 +253,7 @@ bool kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); #endif -#ifdef KVM_ARCH_WANT_MMU_NOTIFIER +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER union kvm_mmu_notifier_arg { pte_t pte; }; @@ -783,7 +783,7 @@ struct kvm { struct hlist_head irq_ack_notifier_list; #endif -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER struct mmu_notifier mmu_notifier; unsigned long mmu_invalidate_seq; long mmu_invalidate_in_progress; @@ -1946,7 +1946,7 @@ extern const struct _kvm_stats_desc kvm_vm_stats_desc[]; extern const struct kvm_stats_header kvm_vcpu_stats_header; extern const struct _kvm_stats_desc kvm_vcpu_stats_desc[]; -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq) { if (unlikely(kvm->mmu_invalidate_in_progress)) diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h index 6f4737d5046a41..9d1f7835d8c139 100644 --- a/include/linux/kvm_types.h +++ b/include/linux/kvm_types.h @@ -6,6 +6,7 @@ struct kvm; struct kvm_async_pf; struct kvm_device_ops; +struct kvm_gfn_range; struct kvm_interrupt; struct kvm_irq_routing_table; struct kvm_memory_slot; diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 484d0873061ca5..ecae2914c97e48 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -92,3 +92,7 @@ config HAVE_KVM_PM_NOTIFIER config KVM_GENERIC_HARDWARE_ENABLING bool + +config KVM_GENERIC_MMU_NOTIFIER + select MMU_NOTIFIER + bool diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 4dba682586ee60..6e708017064d0a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -535,7 +535,7 @@ void kvm_destroy_vcpus(struct kvm *kvm) } EXPORT_SYMBOL_GPL(kvm_destroy_vcpus); -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn) { return container_of(mn, struct kvm, mmu_notifier); @@ -960,14 +960,14 @@ static int kvm_init_mmu_notifier(struct kvm *kvm) return mmu_notifier_register(&kvm->mmu_notifier, current->mm); } -#else /* !(CONFIG_MMU_NOTIFIER && KVM_ARCH_WANT_MMU_NOTIFIER) */ +#else /* !CONFIG_KVM_GENERIC_MMU_NOTIFIER */ static int kvm_init_mmu_notifier(struct kvm *kvm) { return 0; } -#endif /* CONFIG_MMU_NOTIFIER && KVM_ARCH_WANT_MMU_NOTIFIER */ +#endif /* CONFIG_KVM_GENERIC_MMU_NOTIFIER */ #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER static int kvm_pm_notifier_call(struct notifier_block *bl, @@ -1287,7 +1287,7 @@ static struct kvm *kvm_create_vm(unsigned long type, const char *fdname) out_err_no_debugfs: kvm_coalesced_mmio_free(kvm); out_no_coalesced_mmio: -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER if (kvm->mmu_notifier.ops) mmu_notifier_unregister(&kvm->mmu_notifier, current->mm); #endif @@ -1347,7 +1347,7 @@ static void kvm_destroy_vm(struct kvm *kvm) kvm->buses[i] = NULL; } kvm_coalesced_mmio_free(kvm); -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm); /* * At this point, pending calls to invalidate_range_start() From 8e555bf388af30a7b7a61acfb5dc32ff4d791e8a Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:04 -0700 Subject: [PATCH 438/515] KVM: Introduce KVM_SET_USER_MEMORY_REGION2 Introduce a "version 2" of KVM_SET_USER_MEMORY_REGION so that additional information can be supplied without setting userspace up to fail. The padding in the new kvm_userspace_memory_region2 structure will be used to pass a file descriptor in addition to the userspace_addr, i.e. allow userspace to point at a file descriptor and map memory into a guest that is NOT mapped into host userspace. Alternatively, KVM could simply add "struct kvm_userspace_memory_region2" without a new ioctl(), but as Paolo pointed out, adding a new ioctl() makes detection of bad flags a bit more robust, e.g. if the new fd field is guarded only by a flag and not a new ioctl(), then a userspace bug (setting a "bad" flag) would generate out-of-bounds access instead of an -EINVAL error. Cc: Jarkko Sakkinen Reviewed-by: Paolo Bonzini Reviewed-by: Xiaoyao Li Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 21 +++++++++++++++++++ arch/x86/kvm/x86.c | 2 +- include/linux/kvm_host.h | 4 ++-- include/uapi/linux/kvm.h | 13 ++++++++++++ virt/kvm/kvm_main.c | 38 +++++++++++++++++++++++++++------- 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 21a7578142a18b..ace984acc125a0 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6070,6 +6070,27 @@ writes to the CNTVCT_EL0 and CNTPCT_EL0 registers using the SET_ONE_REG interface. No error will be returned, but the resulting offset will not be applied. +4.139 KVM_SET_USER_MEMORY_REGION2 +--------------------------------- + +:Capability: KVM_CAP_USER_MEMORY2 +:Architectures: all +:Type: vm ioctl +:Parameters: struct kvm_userspace_memory_region2 (in) +:Returns: 0 on success, -1 on error + +:: + + struct kvm_userspace_memory_region2 { + __u32 slot; + __u32 flags; + __u64 guest_phys_addr; + __u64 memory_size; /* bytes */ + __u64 userspace_addr; /* start of the userspace allocated memory */ + }; + +See KVM_SET_USER_MEMORY_REGION. + 5. The kvm_run structure ======================== diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 41cce5031126a0..6409914428ca79 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12455,7 +12455,7 @@ void __user * __x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, } for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { - struct kvm_userspace_memory_region m; + struct kvm_userspace_memory_region2 m; m.slot = id | (i << 16); m.flags = 0; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 5faba69403ac49..4e741ff27af36f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1146,9 +1146,9 @@ enum kvm_mr_change { }; int kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem); + const struct kvm_userspace_memory_region2 *mem); int __kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem); + const struct kvm_userspace_memory_region2 *mem); void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot); void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen); int kvm_arch_prepare_memory_region(struct kvm *kvm, diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 13065dd96132da..bd1abe067f2879 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -95,6 +95,16 @@ struct kvm_userspace_memory_region { __u64 userspace_addr; /* start of the userspace allocated memory */ }; +/* for KVM_SET_USER_MEMORY_REGION2 */ +struct kvm_userspace_memory_region2 { + __u32 slot; + __u32 flags; + __u64 guest_phys_addr; + __u64 memory_size; + __u64 userspace_addr; + __u64 pad[16]; +}; + /* * The bit 0 ~ bit 15 of kvm_userspace_memory_region::flags are visible for * userspace, other bits are reserved for kvm internal use which are defined @@ -1192,6 +1202,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_COUNTER_OFFSET 227 #define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE 228 #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229 +#define KVM_CAP_USER_MEMORY2 230 #ifdef KVM_CAP_IRQ_ROUTING @@ -1473,6 +1484,8 @@ struct kvm_vfio_spapr_tce { struct kvm_userspace_memory_region) #define KVM_SET_TSS_ADDR _IO(KVMIO, 0x47) #define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO, 0x48, __u64) +#define KVM_SET_USER_MEMORY_REGION2 _IOW(KVMIO, 0x49, \ + struct kvm_userspace_memory_region2) /* enable ucontrol for s390 */ struct kvm_s390_ucas_mapping { diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 6e708017064d0a..3f5b7c2c5327d5 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1578,7 +1578,7 @@ static void kvm_replace_memslot(struct kvm *kvm, } } -static int check_memory_region_flags(const struct kvm_userspace_memory_region *mem) +static int check_memory_region_flags(const struct kvm_userspace_memory_region2 *mem) { u32 valid_flags = KVM_MEM_LOG_DIRTY_PAGES; @@ -1980,7 +1980,7 @@ static bool kvm_check_memslot_overlap(struct kvm_memslots *slots, int id, * Must be called holding kvm->slots_lock for write. */ int __kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem) + const struct kvm_userspace_memory_region2 *mem) { struct kvm_memory_slot *old, *new; struct kvm_memslots *slots; @@ -2084,7 +2084,7 @@ int __kvm_set_memory_region(struct kvm *kvm, EXPORT_SYMBOL_GPL(__kvm_set_memory_region); int kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem) + const struct kvm_userspace_memory_region2 *mem) { int r; @@ -2096,7 +2096,7 @@ int kvm_set_memory_region(struct kvm *kvm, EXPORT_SYMBOL_GPL(kvm_set_memory_region); static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, - struct kvm_userspace_memory_region *mem) + struct kvm_userspace_memory_region2 *mem) { if ((u16)mem->slot >= KVM_USER_MEM_SLOTS) return -EINVAL; @@ -4566,6 +4566,7 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) { switch (arg) { case KVM_CAP_USER_MEMORY: + case KVM_CAP_USER_MEMORY2: case KVM_CAP_DESTROY_MEMORY_REGION_WORKS: case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS: case KVM_CAP_INTERNAL_ERROR_DATA: @@ -4821,6 +4822,14 @@ static int kvm_vm_ioctl_get_stats_fd(struct kvm *kvm) return fd; } +#define SANITY_CHECK_MEM_REGION_FIELD(field) \ +do { \ + BUILD_BUG_ON(offsetof(struct kvm_userspace_memory_region, field) != \ + offsetof(struct kvm_userspace_memory_region2, field)); \ + BUILD_BUG_ON(sizeof_field(struct kvm_userspace_memory_region, field) != \ + sizeof_field(struct kvm_userspace_memory_region2, field)); \ +} while (0) + static long kvm_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) { @@ -4843,15 +4852,28 @@ static long kvm_vm_ioctl(struct file *filp, r = kvm_vm_ioctl_enable_cap_generic(kvm, &cap); break; } + case KVM_SET_USER_MEMORY_REGION2: case KVM_SET_USER_MEMORY_REGION: { - struct kvm_userspace_memory_region kvm_userspace_mem; + struct kvm_userspace_memory_region2 mem; + unsigned long size; + + if (ioctl == KVM_SET_USER_MEMORY_REGION) + size = sizeof(struct kvm_userspace_memory_region); + else + size = sizeof(struct kvm_userspace_memory_region2); + + /* Ensure the common parts of the two structs are identical. */ + SANITY_CHECK_MEM_REGION_FIELD(slot); + SANITY_CHECK_MEM_REGION_FIELD(flags); + SANITY_CHECK_MEM_REGION_FIELD(guest_phys_addr); + SANITY_CHECK_MEM_REGION_FIELD(memory_size); + SANITY_CHECK_MEM_REGION_FIELD(userspace_addr); r = -EFAULT; - if (copy_from_user(&kvm_userspace_mem, argp, - sizeof(kvm_userspace_mem))) + if (copy_from_user(&mem, argp, size)) goto out; - r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem); + r = kvm_vm_ioctl_set_memory_region(kvm, &mem); break; } case KVM_GET_DIRTY_LOG: { From 3291e34c99862c7037584add5305f82db52dc7ba Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:05 -0700 Subject: [PATCH 439/515] KVM: Add KVM_EXIT_MEMORY_FAULT exit to report faults to userspace Add a new KVM exit type to allow userspace to handle memory faults that KVM cannot resolve, but that userspace *may* be able to handle (without terminating the guest). KVM will initially use KVM_EXIT_MEMORY_FAULT to report implicit conversions between private and shared memory. With guest private memory, there will be two kind of memory conversions: - explicit conversion: happens when the guest explicitly calls into KVM to map a range (as private or shared) - implicit conversion: happens when the guest attempts to access a gfn that is configured in the "wrong" state (private vs. shared) On x86 (first architecture to support guest private memory), explicit conversions will be reported via KVM_EXIT_HYPERCALL+KVM_HC_MAP_GPA_RANGE, but reporting KVM_EXIT_HYPERCALL for implicit conversions is undesriable as there is (obviously) no hypercall, and there is no guarantee that the guest actually intends to convert between private and shared, i.e. what KVM thinks is an implicit conversion "request" could actually be the result of a guest code bug. KVM_EXIT_MEMORY_FAULT will be used to report memory faults that appear to be implicit conversions. Note! To allow for future possibilities where KVM reports KVM_EXIT_MEMORY_FAULT and fills run->memory_fault on _any_ unresolved fault, KVM returns "-EFAULT" (-1 with errno == EFAULT from userspace's perspective), not '0'! Due to historical baggage within KVM, exiting to userspace with '0' from deep callstacks, e.g. in emulation paths, is infeasible as doing so would require a near-complete overhaul of KVM, whereas KVM already propagates -errno return codes to userspace even when the -errno originated in a low level helper. Report the gpa+size instead of a single gfn even though the initial usage is expected to always report single pages. It's entirely possible, likely even, that KVM will someday support sub-page granularity faults, e.g. Intel's sub-page protection feature allows for additional protections at 128-byte granularity. Link: https://lore.kernel.org/all/20230908222905.1321305-5-amoorthy@google.com Link: https://lore.kernel.org/all/ZQ3AmLO2SYv3DszH@google.com Cc: Anish Moorthy Cc: David Matlack Suggested-by: Sean Christopherson Co-developed-by: Yu Zhang Signed-off-by: Yu Zhang Signed-off-by: Chao Peng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 41 ++++++++++++++++++++++++++++++++++ arch/x86/kvm/x86.c | 1 + include/linux/kvm_host.h | 11 +++++++++ include/uapi/linux/kvm.h | 8 +++++++ 4 files changed, 61 insertions(+) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index ace984acc125a0..86021653681009 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6723,6 +6723,26 @@ array field represents return values. The userspace should update the return values of SBI call before resuming the VCPU. For more details on RISC-V SBI spec refer, https://github.com/riscv/riscv-sbi-doc. +:: + + /* KVM_EXIT_MEMORY_FAULT */ + struct { + __u64 flags; + __u64 gpa; + __u64 size; + } memory; + +KVM_EXIT_MEMORY_FAULT indicates the vCPU has encountered a memory fault that +could not be resolved by KVM. The 'gpa' and 'size' (in bytes) describe the +guest physical address range [gpa, gpa + size) of the fault. The 'flags' field +describes properties of the faulting access that are likely pertinent. +Currently, no flags are defined. + +Note! KVM_EXIT_MEMORY_FAULT is unique among all KVM exit reasons in that it +accompanies a return code of '-1', not '0'! errno will always be set to EFAULT +or EHWPOISON when KVM exits with KVM_EXIT_MEMORY_FAULT, userspace should assume +kvm_run.exit_reason is stale/undefined for all other error numbers. + :: /* KVM_EXIT_NOTIFY */ @@ -7757,6 +7777,27 @@ This capability is aimed to mitigate the threat that malicious VMs can cause CPU stuck (due to event windows don't open up) and make the CPU unavailable to host or other VMs. +7.34 KVM_CAP_MEMORY_FAULT_INFO +------------------------------ + +:Architectures: x86 +:Returns: Informational only, -EINVAL on direct KVM_ENABLE_CAP. + +The presence of this capability indicates that KVM_RUN will fill +kvm_run.memory_fault if KVM cannot resolve a guest page fault VM-Exit, e.g. if +there is a valid memslot but no backing VMA for the corresponding host virtual +address. + +The information in kvm_run.memory_fault is valid if and only if KVM_RUN returns +an error with errno=EFAULT or errno=EHWPOISON *and* kvm_run.exit_reason is set +to KVM_EXIT_MEMORY_FAULT. + +Note: Userspaces which attempt to resolve memory faults so that they can retry +KVM_RUN are encouraged to guard against repeatedly receiving the same +error/annotated fault. + +See KVM_EXIT_MEMORY_FAULT for more information. + 8. Other capabilities. ====================== diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 6409914428ca79..ee3cd8c3c0ef3e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4518,6 +4518,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_ENABLE_CAP: case KVM_CAP_VM_DISABLE_NX_HUGE_PAGES: case KVM_CAP_IRQFD_RESAMPLE: + case KVM_CAP_MEMORY_FAULT_INFO: r = 1; break; case KVM_CAP_EXIT_HYPERCALL: diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4e741ff27af36f..96aa930536b16e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2327,4 +2327,15 @@ static inline void kvm_account_pgtable_pages(void *virt, int nr) /* Max number of entries allowed for each kvm dirty ring */ #define KVM_DIRTY_RING_MAX_ENTRIES 65536 +static inline void kvm_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, + gpa_t gpa, gpa_t size) +{ + vcpu->run->exit_reason = KVM_EXIT_MEMORY_FAULT; + vcpu->run->memory_fault.gpa = gpa; + vcpu->run->memory_fault.size = size; + + /* Flags are not (yet) defined or communicated to userspace. */ + vcpu->run->memory_fault.flags = 0; +} + #endif diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index bd1abe067f2879..7ae9987b48dd13 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -274,6 +274,7 @@ struct kvm_xen_exit { #define KVM_EXIT_RISCV_SBI 35 #define KVM_EXIT_RISCV_CSR 36 #define KVM_EXIT_NOTIFY 37 +#define KVM_EXIT_MEMORY_FAULT 38 /* For KVM_EXIT_INTERNAL_ERROR */ /* Emulate instruction failed. */ @@ -520,6 +521,12 @@ struct kvm_run { #define KVM_NOTIFY_CONTEXT_INVALID (1 << 0) __u32 flags; } notify; + /* KVM_EXIT_MEMORY_FAULT */ + struct { + __u64 flags; + __u64 gpa; + __u64 size; + } memory_fault; /* Fix the size of the union. */ char padding[256]; }; @@ -1203,6 +1210,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE 228 #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229 #define KVM_CAP_USER_MEMORY2 230 +#define KVM_CAP_MEMORY_FAULT_INFO 231 #ifdef KVM_CAP_IRQ_ROUTING From 6fdac598ecbe8234fb164e38d02921be512f62be Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:06 -0700 Subject: [PATCH 440/515] KVM: Add a dedicated mmu_notifier flag for reclaiming freed memory Handle AMD SEV's kvm_arch_guest_memory_reclaimed() hook by having __kvm_handle_hva_range() return whether or not an overlapping memslot was found, i.e. mmu_lock was acquired. Using the .on_unlock() hook works, but kvm_arch_guest_memory_reclaimed() needs to run after dropping mmu_lock, which makes .on_lock() and .on_unlock() asymmetrical. Use a small struct to return the tuple of the notifier-specific return, plus whether or not overlap was found. Because the iteration helpers are __always_inlined, practically speaking, the struct will never actually be returned from a function call (not to mention the size of the struct will be two bytes in practice). Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 53 +++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 3f5b7c2c5327d5..2bc04c8ae1f4f2 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -561,6 +561,19 @@ struct kvm_mmu_notifier_range { bool may_block; }; +/* + * The inner-most helper returns a tuple containing the return value from the + * arch- and action-specific handler, plus a flag indicating whether or not at + * least one memslot was found, i.e. if the handler found guest memory. + * + * Note, most notifiers are averse to booleans, so even though KVM tracks the + * return from arch code as a bool, outer helpers will cast it to an int. :-( + */ +typedef struct kvm_mmu_notifier_return { + bool ret; + bool found_memslot; +} kvm_mn_ret_t; + /* * Use a dedicated stub instead of NULL to indicate that there is no callback * function/handler. The compiler technically can't guarantee that a real @@ -582,22 +595,25 @@ static const union kvm_mmu_notifier_arg KVM_MMU_NOTIFIER_NO_ARG; node; \ node = interval_tree_iter_next(node, start, last)) \ -static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, - const struct kvm_mmu_notifier_range *range) +static __always_inline kvm_mn_ret_t __kvm_handle_hva_range(struct kvm *kvm, + const struct kvm_mmu_notifier_range *range) { - bool ret = false, locked = false; + struct kvm_mmu_notifier_return r = { + .ret = false, + .found_memslot = false, + }; struct kvm_gfn_range gfn_range; struct kvm_memory_slot *slot; struct kvm_memslots *slots; int i, idx; if (WARN_ON_ONCE(range->end <= range->start)) - return 0; + return r; /* A null handler is allowed if and only if on_lock() is provided. */ if (WARN_ON_ONCE(IS_KVM_NULL_FN(range->on_lock) && IS_KVM_NULL_FN(range->handler))) - return 0; + return r; idx = srcu_read_lock(&kvm->srcu); @@ -631,8 +647,8 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, gfn_range.end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, slot); gfn_range.slot = slot; - if (!locked) { - locked = true; + if (!r.found_memslot) { + r.found_memslot = true; KVM_MMU_LOCK(kvm); if (!IS_KVM_NULL_FN(range->on_lock)) range->on_lock(kvm); @@ -640,14 +656,14 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, if (IS_KVM_NULL_FN(range->handler)) break; } - ret |= range->handler(kvm, &gfn_range); + r.ret |= range->handler(kvm, &gfn_range); } } - if (range->flush_on_ret && ret) + if (range->flush_on_ret && r.ret) kvm_flush_remote_tlbs(kvm); - if (locked) { + if (r.found_memslot) { KVM_MMU_UNLOCK(kvm); if (!IS_KVM_NULL_FN(range->on_unlock)) range->on_unlock(kvm); @@ -655,8 +671,7 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, srcu_read_unlock(&kvm->srcu, idx); - /* The notifiers are averse to booleans. :-( */ - return (int)ret; + return r; } static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, @@ -677,7 +692,7 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, .may_block = false, }; - return __kvm_handle_hva_range(kvm, &range); + return __kvm_handle_hva_range(kvm, &range).ret; } static __always_inline int kvm_handle_hva_range_no_flush(struct mmu_notifier *mn, @@ -696,7 +711,7 @@ static __always_inline int kvm_handle_hva_range_no_flush(struct mmu_notifier *mn .may_block = false, }; - return __kvm_handle_hva_range(kvm, &range); + return __kvm_handle_hva_range(kvm, &range).ret; } static bool kvm_change_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range) @@ -798,7 +813,7 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, .end = range->end, .handler = kvm_mmu_unmap_gfn_range, .on_lock = kvm_mmu_invalidate_begin, - .on_unlock = kvm_arch_guest_memory_reclaimed, + .on_unlock = (void *)kvm_null_fn, .flush_on_ret = true, .may_block = mmu_notifier_range_blockable(range), }; @@ -830,7 +845,13 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, gfn_to_pfn_cache_invalidate_start(kvm, range->start, range->end, hva_range.may_block); - __kvm_handle_hva_range(kvm, &hva_range); + /* + * If one or more memslots were found and thus zapped, notify arch code + * that guest memory has been reclaimed. This needs to be done *after* + * dropping mmu_lock, as x86's reclaim path is slooooow. + */ + if (__kvm_handle_hva_range(kvm, &hva_range).found_memslot) + kvm_arch_guest_memory_reclaimed(kvm); return 0; } From 827ec94ca450d88a912c9b91489df126f5effa77 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:07 -0700 Subject: [PATCH 441/515] KVM: Drop .on_unlock() mmu_notifier hook Drop the .on_unlock() mmu_notifer hook now that it's no longer used for notifying arch code that memory has been reclaimed. Adding .on_unlock() and invoking it *after* dropping mmu_lock was a terrible idea, as doing so resulted in .on_lock() and .on_unlock() having divergent and asymmetric behavior, and set future developers up for failure, i.e. all but asked for bugs where KVM relied on using .on_unlock() to try to run a callback while holding mmu_lock. Opportunistically add a lockdep assertion in kvm_mmu_invalidate_end() to guard against future bugs of this nature. Reported-by: Isaku Yamahata Link: https://lore.kernel.org/all/20230802203119.GB2021422@ls.amr.corp.intel.com Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 2bc04c8ae1f4f2..cb9376833c1827 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -544,7 +544,6 @@ static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn) typedef bool (*gfn_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range); typedef void (*on_lock_fn_t)(struct kvm *kvm); -typedef void (*on_unlock_fn_t)(struct kvm *kvm); struct kvm_mmu_notifier_range { /* @@ -556,7 +555,6 @@ struct kvm_mmu_notifier_range { union kvm_mmu_notifier_arg arg; gfn_handler_t handler; on_lock_fn_t on_lock; - on_unlock_fn_t on_unlock; bool flush_on_ret; bool may_block; }; @@ -663,11 +661,8 @@ static __always_inline kvm_mn_ret_t __kvm_handle_hva_range(struct kvm *kvm, if (range->flush_on_ret && r.ret) kvm_flush_remote_tlbs(kvm); - if (r.found_memslot) { + if (r.found_memslot) KVM_MMU_UNLOCK(kvm); - if (!IS_KVM_NULL_FN(range->on_unlock)) - range->on_unlock(kvm); - } srcu_read_unlock(&kvm->srcu, idx); @@ -687,7 +682,6 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, .arg = arg, .handler = handler, .on_lock = (void *)kvm_null_fn, - .on_unlock = (void *)kvm_null_fn, .flush_on_ret = true, .may_block = false, }; @@ -706,7 +700,6 @@ static __always_inline int kvm_handle_hva_range_no_flush(struct mmu_notifier *mn .end = end, .handler = handler, .on_lock = (void *)kvm_null_fn, - .on_unlock = (void *)kvm_null_fn, .flush_on_ret = false, .may_block = false, }; @@ -813,7 +806,6 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, .end = range->end, .handler = kvm_mmu_unmap_gfn_range, .on_lock = kvm_mmu_invalidate_begin, - .on_unlock = (void *)kvm_null_fn, .flush_on_ret = true, .may_block = mmu_notifier_range_blockable(range), }; @@ -858,6 +850,8 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, void kvm_mmu_invalidate_end(struct kvm *kvm) { + lockdep_assert_held_write(&kvm->mmu_lock); + /* * This sequence increase will notify the kvm page fault that * the page that is going to be mapped in the spte could have @@ -889,7 +883,6 @@ static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, .end = range->end, .handler = (void *)kvm_null_fn, .on_lock = kvm_mmu_invalidate_end, - .on_unlock = (void *)kvm_null_fn, .flush_on_ret = false, .may_block = mmu_notifier_range_blockable(range), }; From 98d7f38ae816ca1b0b69052935ec4a2e2e95a894 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:08 -0700 Subject: [PATCH 442/515] KVM: Prepare for handling only shared mappings in mmu_notifier events Add flags to "struct kvm_gfn_range" to let notifier events target only shared and only private mappings, and write up the existing mmu_notifier events to be shared-only (private memory is never associated with a userspace virtual address, i.e. can't be reached via mmu_notifiers). Add two flags so that KVM can handle the three possibilities (shared, private, and shared+private) without needing something like a tri-state enum. Link: https://lore.kernel.org/all/ZJX0hk+KpQP0KUyB@google.com Signed-off-by: Sean Christopherson --- include/linux/kvm_host.h | 2 ++ virt/kvm/kvm_main.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 96aa930536b16e..89c1a991a3b89a 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -263,6 +263,8 @@ struct kvm_gfn_range { gfn_t start; gfn_t end; union kvm_mmu_notifier_arg arg; + bool only_private; + bool only_shared; bool may_block; }; bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index cb9376833c1827..302ccb87b4c1de 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -635,6 +635,13 @@ static __always_inline kvm_mn_ret_t __kvm_handle_hva_range(struct kvm *kvm, * the second or later invocation of the handler). */ gfn_range.arg = range->arg; + + /* + * HVA-based notifications aren't relevant to private + * mappings as they don't have a userspace mapping. + */ + gfn_range.only_private = false; + gfn_range.only_shared = true; gfn_range.may_block = range->may_block; /* From e82df88abb18ae36188473ad8bed6aa4058548b2 Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:09 -0700 Subject: [PATCH 443/515] KVM: Introduce per-page memory attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In confidential computing usages, whether a page is private or shared is necessary information for KVM to perform operations like page fault handling, page zapping etc. There are other potential use cases for per-page memory attributes, e.g. to make memory read-only (or no-exec, or exec-only, etc.) without having to modify memslots. Introduce two ioctls (advertised by KVM_CAP_MEMORY_ATTRIBUTES) to allow userspace to operate on the per-page memory attributes. - KVM_SET_MEMORY_ATTRIBUTES to set the per-page memory attributes to a guest memory range. - KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES to return the KVM supported memory attributes. Use an xarray to store the per-page attributes internally, with a naive, not fully optimized implementation, i.e. prioritize correctness over performance for the initial implementation. Use bit 3 for the PRIVATE attribute so that KVM can use bits 0-2 for RWX attributes/protections in the future, e.g. to give userspace fine-grained control over read, write, and execute protections for guest memory. Provide arch hooks for handling attribute changes before and after common code sets the new attributes, e.g. x86 will use the "pre" hook to zap all relevant mappings, and the "post" hook to track whether or not hugepages can be used to map the range. To simplify the implementation wrap the entire sequence with kvm_mmu_invalidate_{begin,end}() even though the operation isn't strictly guaranteed to be an invalidation. For the initial use case, x86 *will* always invalidate memory, and preventing arch code from creating new mappings while the attributes are in flux makes it much easier to reason about the correctness of consuming attributes. It's possible that future usages may not require an invalidation, e.g. if KVM ends up supporting RWX protections and userspace grants _more_ protections, but again opt for simplicity and punt optimizations to if/when they are needed. Suggested-by: Sean Christopherson Link: https://lore.kernel.org/all/Y2WB48kD0J4VGynX@google.com Cc: Fuad Tabba Cc: Xu Yilun Cc: Mickaël Salaün Signed-off-by: Chao Peng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 36 +++++ include/linux/kvm_host.h | 18 +++ include/uapi/linux/kvm.h | 13 ++ virt/kvm/Kconfig | 4 + virt/kvm/kvm_main.c | 233 +++++++++++++++++++++++++++++++++ 5 files changed, 304 insertions(+) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 86021653681009..e2252c748fd635 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6091,6 +6091,42 @@ applied. See KVM_SET_USER_MEMORY_REGION. +4.140 KVM_SET_MEMORY_ATTRIBUTES +------------------------------- + +:Capability: KVM_CAP_MEMORY_ATTRIBUTES +:Architectures: x86 +:Type: vm ioctl +:Parameters: struct kvm_memory_attributes(in) +:Returns: 0 on success, <0 on error + +KVM_SET_MEMORY_ATTRIBUTES allows userspace to set memory attributes for a range +of guest physical memory. + +:: + + struct kvm_memory_attributes { + __u64 address; + __u64 size; + __u64 attributes; + __u64 flags; + }; + + #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) + +The address and size must be page aligned. The supported attributes can be +retrieved via ioctl(KVM_CHECK_EXTENSION) on KVM_CAP_MEMORY_ATTRIBUTES. If +executed on a VM, KVM_CAP_MEMORY_ATTRIBUTES precisely returns the attributes +supported by that VM. If executed at system scope, KVM_CAP_MEMORY_ATTRIBUTES +returns all attributes supported by KVM. The only attribute defined at this +time is KVM_MEMORY_ATTRIBUTE_PRIVATE, which marks the associated gfn as being +guest private memory. + +Note, there is no "get" API. Userspace is responsible for explicitly tracking +the state of a gfn/page as needed. + +The "flags" field is reserved for future extensions and must be '0'. + 5. The kvm_run structure ======================== diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 89c1a991a3b89a..df573229651bca 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -256,6 +256,7 @@ int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); #ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER union kvm_mmu_notifier_arg { pte_t pte; + unsigned long attributes; }; struct kvm_gfn_range { @@ -808,6 +809,9 @@ struct kvm { #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER struct notifier_block pm_notifier; +#endif +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + struct xarray mem_attr_array; #endif char stats_id[KVM_STATS_NAME_SIZE]; }; @@ -2340,4 +2344,18 @@ static inline void kvm_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, vcpu->run->memory_fault.flags = 0; } +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn_t gfn) +{ + return xa_to_value(xa_load(&kvm->mem_attr_array, gfn)); +} + +bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t end, + unsigned long attrs); +bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range); +bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range); +#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ + #endif diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 7ae9987b48dd13..547837feaa28f9 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1211,6 +1211,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229 #define KVM_CAP_USER_MEMORY2 230 #define KVM_CAP_MEMORY_FAULT_INFO 231 +#define KVM_CAP_MEMORY_ATTRIBUTES 232 #ifdef KVM_CAP_IRQ_ROUTING @@ -2277,4 +2278,16 @@ struct kvm_s390_zpci_op { /* flags for kvm_s390_zpci_op->u.reg_aen.flags */ #define KVM_S390_ZPCIOP_REGAEN_HOST (1 << 0) +/* Available with KVM_CAP_MEMORY_ATTRIBUTES */ +#define KVM_SET_MEMORY_ATTRIBUTES _IOW(KVMIO, 0xd2, struct kvm_memory_attributes) + +struct kvm_memory_attributes { + __u64 address; + __u64 size; + __u64 attributes; + __u64 flags; +}; + +#define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) + #endif /* __LINUX_KVM_H */ diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index ecae2914c97e48..5bd7fcaf9089c8 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -96,3 +96,7 @@ config KVM_GENERIC_HARDWARE_ENABLING config KVM_GENERIC_MMU_NOTIFIER select MMU_NOTIFIER bool + +config KVM_GENERIC_MEMORY_ATTRIBUTES + select KVM_GENERIC_MMU_NOTIFIER + bool diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 302ccb87b4c1de..78a0b09ef2a52c 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1218,6 +1218,9 @@ static struct kvm *kvm_create_vm(unsigned long type, const char *fdname) spin_lock_init(&kvm->mn_invalidate_lock); rcuwait_init(&kvm->mn_memslots_update_rcuwait); xa_init(&kvm->vcpu_array); +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + xa_init(&kvm->mem_attr_array); +#endif INIT_LIST_HEAD(&kvm->gpc_list); spin_lock_init(&kvm->gpc_lock); @@ -1398,6 +1401,9 @@ static void kvm_destroy_vm(struct kvm *kvm) } cleanup_srcu_struct(&kvm->irq_srcu); cleanup_srcu_struct(&kvm->srcu); +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + xa_destroy(&kvm->mem_attr_array); +#endif kvm_arch_free_vm(kvm); preempt_notifier_dec(); hardware_disable_all(); @@ -2396,6 +2402,210 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *kvm, } #endif /* CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */ +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +/* + * Returns true if _all_ gfns in the range [@start, @end) have attributes + * matching @attrs. + */ +bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t end, + unsigned long attrs) +{ + XA_STATE(xas, &kvm->mem_attr_array, start); + unsigned long index; + bool has_attrs; + void *entry; + + rcu_read_lock(); + + if (!attrs) { + has_attrs = !xas_find(&xas, end - 1); + goto out; + } + + has_attrs = true; + for (index = start; index < end; index++) { + do { + entry = xas_next(&xas); + } while (xas_retry(&xas, entry)); + + if (xas.xa_index != index || xa_to_value(entry) != attrs) { + has_attrs = false; + break; + } + } + +out: + rcu_read_unlock(); + return has_attrs; +} + +static u64 kvm_supported_mem_attributes(struct kvm *kvm) +{ + if (!kvm) + return KVM_MEMORY_ATTRIBUTE_PRIVATE; + + return 0; +} + +static __always_inline void kvm_handle_gfn_range(struct kvm *kvm, + struct kvm_mmu_notifier_range *range) +{ + struct kvm_gfn_range gfn_range; + struct kvm_memory_slot *slot; + struct kvm_memslots *slots; + struct kvm_memslot_iter iter; + bool found_memslot = false; + bool ret = false; + int i; + + gfn_range.arg = range->arg; + gfn_range.may_block = range->may_block; + + /* + * If/when KVM supports more attributes beyond private .vs shared, this + * _could_ set only_{private,shared} appropriately if the entire target + * range already has the desired private vs. shared state (it's unclear + * if that is a net win). For now, KVM reaches this point if and only + * if the private flag is being toggled, i.e. all mappings are in play. + */ + gfn_range.only_private = false; + gfn_range.only_shared = false; + + for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + slots = __kvm_memslots(kvm, i); + + kvm_for_each_memslot_in_gfn_range(&iter, slots, range->start, range->end) { + slot = iter.slot; + gfn_range.slot = slot; + + gfn_range.start = max(range->start, slot->base_gfn); + gfn_range.end = min(range->end, slot->base_gfn + slot->npages); + if (gfn_range.start >= gfn_range.end) + continue; + + if (!found_memslot) { + found_memslot = true; + KVM_MMU_LOCK(kvm); + if (!IS_KVM_NULL_FN(range->on_lock)) + range->on_lock(kvm); + } + + ret |= range->handler(kvm, &gfn_range); + } + } + + if (range->flush_on_ret && ret) + kvm_flush_remote_tlbs(kvm); + + if (found_memslot) + KVM_MMU_UNLOCK(kvm); +} + +static bool kvm_pre_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range) +{ + /* + * Unconditionally add the range to the invalidation set, regardless of + * whether or not the arch callback actually needs to zap SPTEs. E.g. + * if KVM supports RWX attributes in the future and the attributes are + * going from R=>RW, zapping isn't strictly necessary. Unconditionally + * adding the range allows KVM to require that MMU invalidations add at + * least one range between begin() and end(), e.g. allows KVM to detect + * bugs where the add() is missed. Rexlaing the rule *might* be safe, + * but it's not obvious that allowing new mappings while the attributes + * are in flux is desirable or worth the complexity. + */ + kvm_mmu_invalidate_range_add(kvm, range->start, range->end); + + return kvm_arch_pre_set_memory_attributes(kvm, range); +} + +/* Set @attributes for the gfn range [@start, @end). */ +static int kvm_vm_set_mem_attributes(struct kvm *kvm, gfn_t start, gfn_t end, + unsigned long attributes) +{ + struct kvm_mmu_notifier_range pre_set_range = { + .start = start, + .end = end, + .handler = kvm_pre_set_memory_attributes, + .on_lock = kvm_mmu_invalidate_begin, + .flush_on_ret = true, + .may_block = true, + }; + struct kvm_mmu_notifier_range post_set_range = { + .start = start, + .end = end, + .arg.attributes = attributes, + .handler = kvm_arch_post_set_memory_attributes, + .on_lock = kvm_mmu_invalidate_end, + .may_block = true, + }; + unsigned long i; + void *entry; + int r = 0; + + entry = attributes ? xa_mk_value(attributes) : NULL; + + mutex_lock(&kvm->slots_lock); + + /* Nothing to do if the entire range as the desired attributes. */ + if (kvm_range_has_memory_attributes(kvm, start, end, attributes)) + goto out_unlock; + + /* + * Reserve memory ahead of time to avoid having to deal with failures + * partway through setting the new attributes. + */ + for (i = start; i < end; i++) { + r = xa_reserve(&kvm->mem_attr_array, i, GFP_KERNEL_ACCOUNT); + if (r) + goto out_unlock; + } + + kvm_handle_gfn_range(kvm, &pre_set_range); + + for (i = start; i < end; i++) { + r = xa_err(xa_store(&kvm->mem_attr_array, i, entry, + GFP_KERNEL_ACCOUNT)); + KVM_BUG_ON(r, kvm); + } + + kvm_handle_gfn_range(kvm, &post_set_range); + +out_unlock: + mutex_unlock(&kvm->slots_lock); + + return r; +} +static int kvm_vm_ioctl_set_mem_attributes(struct kvm *kvm, + struct kvm_memory_attributes *attrs) +{ + gfn_t start, end; + + /* flags is currently not used. */ + if (attrs->flags) + return -EINVAL; + if (attrs->attributes & ~kvm_supported_mem_attributes(kvm)) + return -EINVAL; + if (attrs->size == 0 || attrs->address + attrs->size < attrs->address) + return -EINVAL; + if (!PAGE_ALIGNED(attrs->address) || !PAGE_ALIGNED(attrs->size)) + return -EINVAL; + + start = attrs->address >> PAGE_SHIFT; + end = (attrs->address + attrs->size) >> PAGE_SHIFT; + + /* + * xarray tracks data using "unsigned long", and as a result so does + * KVM. For simplicity, supports generic attributes only on 64-bit + * architectures. + */ + BUILD_BUG_ON(sizeof(attrs->attributes) != sizeof(unsigned long)); + + return kvm_vm_set_mem_attributes(kvm, start, end, attrs->attributes); +} +#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ + struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) { return __gfn_to_memslot(kvm_memslots(kvm), gfn); @@ -4640,6 +4850,17 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) case KVM_CAP_BINARY_STATS_FD: case KVM_CAP_SYSTEM_EVENT_DATA: return 1; +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + case KVM_CAP_MEMORY_ATTRIBUTES: + u64 attrs = kvm_supported_mem_attributes(kvm); + + r = -EFAULT; + if (copy_to_user(argp, &attrs, sizeof(attrs))) + goto out; + r = 0; + break; + } +#endif default: break; } @@ -5022,6 +5243,18 @@ static long kvm_vm_ioctl(struct file *filp, break; } #endif /* CONFIG_HAVE_KVM_IRQ_ROUTING */ +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + case KVM_SET_MEMORY_ATTRIBUTES: { + struct kvm_memory_attributes attrs; + + r = -EFAULT; + if (copy_from_user(&attrs, argp, sizeof(attrs))) + goto out; + + r = kvm_vm_ioctl_set_mem_attributes(kvm, &attrs); + break; + } +#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ case KVM_CREATE_DEVICE: { struct kvm_create_device cd; From 832791cc0315f9cba639f273c64707e8e6ece00a Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:10 -0700 Subject: [PATCH 444/515] mm: Add AS_UNMOVABLE to mark mapping as completely unmovable Add an "unmovable" flag for mappings that cannot be migrated under any circumstance. KVM will use the flag for its upcoming GUEST_MEMFD support, which will not support compaction/migration, at least not in the foreseeable future. Test AS_UNMOVABLE under folio lock as already done for the async compaction/dirty folio case, as the mapping can be removed by truncation while compaction is running. To avoid having to lock every folio with a mapping, assume/require that unmovable mappings are also unevictable, and have mapping_set_unmovable() also set AS_UNEVICTABLE. Cc: Matthew Wilcox Co-developed-by: Vlastimil Babka Signed-off-by: Vlastimil Babka Signed-off-by: Sean Christopherson --- include/linux/pagemap.h | 19 +++++++++++++++++- mm/compaction.c | 43 +++++++++++++++++++++++++++++------------ mm/migrate.c | 2 ++ 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 351c3b7f93a14e..82c9bf506b79c0 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -203,7 +203,8 @@ enum mapping_flags { /* writeback related tags are not used */ AS_NO_WRITEBACK_TAGS = 5, AS_LARGE_FOLIO_SUPPORT = 6, - AS_RELEASE_ALWAYS, /* Call ->release_folio(), even if no private data */ + AS_RELEASE_ALWAYS = 7, /* Call ->release_folio(), even if no private data */ + AS_UNMOVABLE = 8, /* The mapping cannot be moved, ever */ }; /** @@ -289,6 +290,22 @@ static inline void mapping_clear_release_always(struct address_space *mapping) clear_bit(AS_RELEASE_ALWAYS, &mapping->flags); } +static inline void mapping_set_unmovable(struct address_space *mapping) +{ + /* + * It's expected unmovable mappings are also unevictable. Compaction + * migrate scanner (isolate_migratepages_block()) relies on this to + * reduce page locking. + */ + set_bit(AS_UNEVICTABLE, &mapping->flags); + set_bit(AS_UNMOVABLE, &mapping->flags); +} + +static inline bool mapping_unmovable(struct address_space *mapping) +{ + return test_bit(AS_UNMOVABLE, &mapping->flags); +} + static inline gfp_t mapping_gfp_mask(struct address_space * mapping) { return mapping->gfp_mask; diff --git a/mm/compaction.c b/mm/compaction.c index 38c8d216c6a3bf..12b828aed7c840 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -883,6 +883,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, /* Time to isolate some pages for migration */ for (; low_pfn < end_pfn; low_pfn++) { + bool is_dirty, is_unevictable; if (skip_on_failure && low_pfn >= next_skip_pfn) { /* @@ -1080,8 +1081,10 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, if (!folio_test_lru(folio)) goto isolate_fail_put; + is_unevictable = folio_test_unevictable(folio); + /* Compaction might skip unevictable pages but CMA takes them */ - if (!(mode & ISOLATE_UNEVICTABLE) && folio_test_unevictable(folio)) + if (!(mode & ISOLATE_UNEVICTABLE) && is_unevictable) goto isolate_fail_put; /* @@ -1093,26 +1096,42 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, if ((mode & ISOLATE_ASYNC_MIGRATE) && folio_test_writeback(folio)) goto isolate_fail_put; - if ((mode & ISOLATE_ASYNC_MIGRATE) && folio_test_dirty(folio)) { - bool migrate_dirty; + is_dirty = folio_test_dirty(folio); + + if (((mode & ISOLATE_ASYNC_MIGRATE) && is_dirty) || + (mapping && is_unevictable)) { + bool migrate_dirty = true; + bool is_unmovable; /* * Only folios without mappings or that have - * a ->migrate_folio callback are possible to - * migrate without blocking. However, we may - * be racing with truncation, which can free - * the mapping. Truncation holds the folio lock - * until after the folio is removed from the page - * cache so holding it ourselves is sufficient. + * a ->migrate_folio callback are possible to migrate + * without blocking. + * + * Folios from unmovable mappings are not migratable. + * + * However, we can be racing with truncation, which can + * free the mapping that we need to check. Truncation + * holds the folio lock until after the folio is removed + * from the page so holding it ourselves is sufficient. + * + * To avoid locking the folio just to check unmovable, + * assume every unmovable folio is also unevictable, + * which is a cheaper test. If our assumption goes + * wrong, it's not a correctness bug, just potentially + * wasted cycles. */ if (!folio_trylock(folio)) goto isolate_fail_put; mapping = folio_mapping(folio); - migrate_dirty = !mapping || - mapping->a_ops->migrate_folio; + if ((mode & ISOLATE_ASYNC_MIGRATE) && is_dirty) { + migrate_dirty = !mapping || + mapping->a_ops->migrate_folio; + } + is_unmovable = mapping && mapping_unmovable(mapping); folio_unlock(folio); - if (!migrate_dirty) + if (!migrate_dirty || is_unmovable) goto isolate_fail_put; } diff --git a/mm/migrate.c b/mm/migrate.c index 2053b54556ca5b..ed874e43ecd712 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -956,6 +956,8 @@ static int move_to_new_folio(struct folio *dst, struct folio *src, if (!mapping) rc = migrate_folio(mapping, dst, src, mode); + else if (mapping_unmovable(mapping)) + rc = -EOPNOTSUPP; else if (mapping->a_ops->migrate_folio) /* * Most folios have a mapping and most filesystems From da0a97772f09748a083d1ecbdbc226d4f2d4222e Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:11 -0700 Subject: [PATCH 445/515] fs: Export anon_inode_getfile_secure() for use by KVM Export anon_inode_getfile_secure() so that it can be used by KVM to create and manage file-based guest memory without need a fullblow filesystem. The "standard" anon_inode_getfd() doesn't work for KVM's use case as KVM needs a unique inode for each file, e.g. to be able to independently manage the size and lifecycle of a given file. Note, KVM doesn't need a "secure" version, just unique inodes, i.e. ignore the name. Signed-off-by: Sean Christopherson --- fs/anon_inodes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 24192a7667edf7..4190336180eec3 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -176,6 +176,7 @@ struct file *anon_inode_getfile_secure(const char *name, return __anon_inode_getfile(name, fops, priv, flags, context_inode, true); } +EXPORT_SYMBOL_GPL(anon_inode_getfile_secure); static int __anon_inode_getfd(const char *name, const struct file_operations *fops, From fcbef1e5e5d2a60dacac0d16c06ac00bedaefc0f Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Thu, 26 Oct 2023 15:11:46 -0700 Subject: [PATCH 446/515] KVM: Add KVM_CREATE_GUEST_MEMFD ioctl() for guest-specific backing memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce an ioctl(), KVM_CREATE_GUEST_MEMFD, to allow creating file-based memory that is tied to a specific KVM virtual machine and whose primary purpose is to serve guest memory. A guest-first memory subsystem allows for optimizations and enhancements that are kludgy or outright infeasible to implement/support in a generic memory subsystem. With guest_memfd, guest protections and mapping sizes are fully decoupled from host userspace mappings. E.g. KVM currently doesn't support mapping memory as writable in the guest without it also being writable in host userspace, as KVM's ABI uses VMA protections to define the allow guest protection. Userspace can fudge this by establishing two mappings, a writable mapping for the guest and readable one for itself, but that’s suboptimal on multiple fronts. Similarly, KVM currently requires the guest mapping size to be a strict subset of the host userspace mapping size, e.g. KVM doesn’t support creating a 1GiB guest mapping unless userspace also has a 1GiB guest mapping. Decoupling the mappings sizes would allow userspace to precisely map only what is needed without impacting guest performance, e.g. to harden against unintentional accesses to guest memory. Decoupling guest and userspace mappings may also allow for a cleaner alternative to high-granularity mappings for HugeTLB, which has reached a bit of an impasse and is unlikely to ever be merged. A guest-first memory subsystem also provides clearer line of sight to things like a dedicated memory pool (for slice-of-hardware VMs) and elimination of "struct page" (for offload setups where userspace _never_ needs to mmap() guest memory). More immediately, being able to map memory into KVM guests without mapping said memory into the host is critical for Confidential VMs (CoCo VMs), the initial use case for guest_memfd. While AMD's SEV and Intel's TDX prevent untrusted software from reading guest private data by encrypting guest memory with a key that isn't usable by the untrusted host, projects such as Protected KVM (pKVM) provide confidentiality and integrity *without* relying on memory encryption. And with SEV-SNP and TDX, accessing guest private memory can be fatal to the host, i.e. KVM must be prevent host userspace from accessing guest memory irrespective of hardware behavior. Attempt #1 to support CoCo VMs was to add a VMA flag to mark memory as being mappable only by KVM (or a similarly enlightened kernel subsystem). That approach was abandoned largely due to it needing to play games with PROT_NONE to prevent userspace from accessing guest memory. Attempt #2 to was to usurp PG_hwpoison to prevent the host from mapping guest private memory into userspace, but that approach failed to meet several requirements for software-based CoCo VMs, e.g. pKVM, as the kernel wouldn't easily be able to enforce a 1:1 page:guest association, let alone a 1:1 pfn:gfn mapping. And using PG_hwpoison does not work for memory that isn't backed by 'struct page', e.g. if devices gain support for exposing encrypted memory regions to guests. Attempt #3 was to extend the memfd() syscall and wrap shmem to provide dedicated file-based guest memory. That approach made it as far as v10 before feedback from Hugh Dickins and Christian Brauner (and others) led to it demise. Hugh's objection was that piggybacking shmem made no sense for KVM's use case as KVM didn't actually *want* the features provided by shmem. I.e. KVM was using memfd() and shmem to avoid having to manage memory directly, not because memfd() and shmem were the optimal solution, e.g. things like read/write/mmap in shmem were dead weight. Christian pointed out flaws with implementing a partial overlay (wrapping only _some_ of shmem), e.g. poking at inode_operations or super_operations would show shmem stuff, but address_space_operations and file_operations would show KVM's overlay. Paraphrashing heavily, Christian suggested KVM stop being lazy and create a proper API. Link: https://lore.kernel.org/all/20201020061859.18385-1-kirill.shutemov@linux.intel.com Link: https://lore.kernel.org/all/20210416154106.23721-1-kirill.shutemov@linux.intel.com Link: https://lore.kernel.org/all/20210824005248.200037-1-seanjc@google.com Link: https://lore.kernel.org/all/20211111141352.26311-1-chao.p.peng@linux.intel.com Link: https://lore.kernel.org/all/20221202061347.1070246-1-chao.p.peng@linux.intel.com Link: https://lore.kernel.org/all/ff5c5b97-acdf-9745-ebe5-c6609dd6322e@google.com Link: https://lore.kernel.org/all/20230418-anfallen-irdisch-6993a61be10b@brauner Link: https://lore.kernel.org/all/ZEM5Zq8oo+xnApW9@google.com Link: https://lore.kernel.org/linux-mm/20230306191944.GA15773@monkey Link: https://lore.kernel.org/linux-mm/ZII1p8ZHlHaQ3dDl@casper.infradead.org Cc: Fuad Tabba Cc: Vishal Annapurve Cc: Ackerley Tng Cc: Jarkko Sakkinen Cc: Maciej Szmigiero Cc: Vlastimil Babka Cc: David Hildenbrand Cc: Quentin Perret Cc: Michael Roth Cc: Wang Cc: Liam Merwick Cc: Isaku Yamahata Co-developed-by: Kirill A. Shutemov Signed-off-by: Kirill A. Shutemov Co-developed-by: Yu Zhang Signed-off-by: Yu Zhang Co-developed-by: Chao Peng Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Co-developed-by: Isaku Yamahata Signed-off-by: Isaku Yamahata Co-developed-by: Paolo Bonzini Signed-off-by: Paolo Bonzini Co-developed-by: Michael Roth Signed-off-by: Michael Roth Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 69 ++++- include/linux/kvm_host.h | 48 +++ include/uapi/linux/kvm.h | 15 +- virt/kvm/Kconfig | 4 + virt/kvm/Makefile.kvm | 1 + virt/kvm/guest_memfd.c | 548 +++++++++++++++++++++++++++++++++ virt/kvm/kvm_main.c | 68 +++- virt/kvm/kvm_mm.h | 26 ++ 8 files changed, 764 insertions(+), 15 deletions(-) create mode 100644 virt/kvm/guest_memfd.c diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index e2252c748fd635..e82c69d5e75549 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6079,6 +6079,15 @@ applied. :Parameters: struct kvm_userspace_memory_region2 (in) :Returns: 0 on success, -1 on error +KVM_SET_USER_MEMORY_REGION2 is an extension to KVM_SET_USER_MEMORY_REGION that +allows mapping guest_memfd memory into a guest. All fields shared with +KVM_SET_USER_MEMORY_REGION identically. Userspace can set KVM_MEM_PRIVATE in +flags to have KVM bind the memory region to a given guest_memfd range of +[guest_memfd_offset, guest_memfd_offset + memory_size]. The target guest_memfd +must point at a file created via KVM_CREATE_GUEST_MEMFD on the current VM, and +the target range must not be bound to any other memory region. All standard +bounds checks apply (use common sense). + :: struct kvm_userspace_memory_region2 { @@ -6087,9 +6096,24 @@ applied. __u64 guest_phys_addr; __u64 memory_size; /* bytes */ __u64 userspace_addr; /* start of the userspace allocated memory */ + __u64 guest_memfd_offset; + __u32 guest_memfd; + __u32 pad1; + __u64 pad2[14]; }; -See KVM_SET_USER_MEMORY_REGION. +A KVM_MEM_PRIVATE region _must_ have a valid guest_memfd (private memory) and +userspace_addr (shared memory). However, "valid" for userspace_addr simply +means that the address itself must be a legal userspace address. The backing +mapping for userspace_addr is not required to be valid/populated at the time of +KVM_SET_USER_MEMORY_REGION2, e.g. shared memory can be lazily mapped/allocated +on-demand. + +When mapping a gfn into the guest, KVM selects shared vs. private, i.e consumes +userspace_addr vs. guest_memfd, based on the gfn's KVM_MEMORY_ATTRIBUTE_PRIVATE +state. At VM creation time, all memory is shared, i.e. the PRIVATE attribute +is '0' for all gfns. Userspace can control whether memory is shared/private by +toggling KVM_MEMORY_ATTRIBUTE_PRIVATE via KVM_SET_MEMORY_ATTRIBUTES as needed. 4.140 KVM_SET_MEMORY_ATTRIBUTES ------------------------------- @@ -6127,6 +6151,49 @@ the state of a gfn/page as needed. The "flags" field is reserved for future extensions and must be '0'. +4.141 KVM_CREATE_GUEST_MEMFD +---------------------------- + +:Capability: KVM_CAP_GUEST_MEMFD +:Architectures: none +:Type: vm ioctl +:Parameters: struct struct kvm_create_guest_memfd(in) +:Returns: 0 on success, <0 on error + +KVM_CREATE_GUEST_MEMFD creates an anonymous file and returns a file descriptor +that refers to it. guest_memfd files are roughly analogous to files created +via memfd_create(), e.g. guest_memfd files live in RAM, have volatile storage, +and are automatically released when the last reference is dropped. Unlike +"regular" memfd_create() files, guest_memfd files are bound to their owning +virtual machine (see below), cannot be mapped, read, or written by userspace, +and cannot be resized (guest_memfd files do however support PUNCH_HOLE). + +:: + + struct kvm_create_guest_memfd { + __u64 size; + __u64 flags; + __u64 reserved[6]; + }; + +Conceptually, the inode backing a guest_memfd file represents physical memory, +i.e. is coupled to the virtual machine as a thing, not to a "struct kvm". The +file itself, which is bound to a "struct kvm", is that instance's view of the +underlying memory, e.g. effectively provides the translation of guest addresses +to host memory. This allows for use cases where multiple KVM structures are +used to manage a single virtual machine, e.g. when performing intrahost +migration of a virtual machine. + +KVM currently only supports mapping guest_memfd via KVM_SET_USER_MEMORY_REGION2, +and more specifically via the guest_memfd and guest_memfd_offset fields in +"struct kvm_userspace_memory_region2", where guest_memfd_offset is the offset +into the guest_memfd instance. For a given guest_memfd file, there can be at +most one mapping per page, i.e. binding multiple memory regions to a single +guest_memfd range is not allowed (any number of memory regions can be bound to +a single guest_memfd file, but the bound ranges must not overlap). + +See KVM_SET_USER_MEMORY_REGION2 for additional details. + 5. The kvm_run structure ======================== diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index df573229651bca..7de93858054d92 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -591,8 +591,20 @@ struct kvm_memory_slot { u32 flags; short id; u16 as_id; + +#ifdef CONFIG_KVM_PRIVATE_MEM + struct { + struct file __rcu *file; + pgoff_t pgoff; + } gmem; +#endif }; +static inline bool kvm_slot_can_be_private(const struct kvm_memory_slot *slot) +{ + return slot && (slot->flags & KVM_MEM_PRIVATE); +} + static inline bool kvm_slot_dirty_track_enabled(const struct kvm_memory_slot *slot) { return slot->flags & KVM_MEM_LOG_DIRTY_PAGES; @@ -687,6 +699,17 @@ static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) } #endif +/* + * Arch code must define kvm_arch_has_private_mem if support for private memory + * is enabled. + */ +#if !defined(kvm_arch_has_private_mem) && !IS_ENABLED(CONFIG_KVM_PRIVATE_MEM) +static inline bool kvm_arch_has_private_mem(struct kvm *kvm) +{ + return false; +} +#endif + struct kvm_memslots { u64 generation; atomic_long_t last_used_slot; @@ -1401,6 +1424,7 @@ void *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc); void kvm_mmu_invalidate_begin(struct kvm *kvm); void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end); void kvm_mmu_invalidate_end(struct kvm *kvm); +bool kvm_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range); long kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); @@ -2356,6 +2380,30 @@ bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, struct kvm_gfn_range *range); bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, struct kvm_gfn_range *range); + +static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) +{ + return IS_ENABLED(CONFIG_KVM_PRIVATE_MEM) && + kvm_get_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE; +} +#else +static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) +{ + return false; +} #endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ +#ifdef CONFIG_KVM_PRIVATE_MEM +int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, int *max_order); +#else +static inline int kvm_gmem_get_pfn(struct kvm *kvm, + struct kvm_memory_slot *slot, gfn_t gfn, + kvm_pfn_t *pfn, int *max_order) +{ + KVM_BUG_ON(1, kvm); + return -EIO; +} +#endif /* CONFIG_KVM_PRIVATE_MEM */ + #endif diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 547837feaa28f9..25caee8d1a8020 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -102,7 +102,10 @@ struct kvm_userspace_memory_region2 { __u64 guest_phys_addr; __u64 memory_size; __u64 userspace_addr; - __u64 pad[16]; + __u64 guest_memfd_offset; + __u32 guest_memfd; + __u32 pad1; + __u64 pad2[14]; }; /* @@ -112,6 +115,7 @@ struct kvm_userspace_memory_region2 { */ #define KVM_MEM_LOG_DIRTY_PAGES (1UL << 0) #define KVM_MEM_READONLY (1UL << 1) +#define KVM_MEM_PRIVATE (1UL << 2) /* for KVM_IRQ_LINE */ struct kvm_irq_level { @@ -1212,6 +1216,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_USER_MEMORY2 230 #define KVM_CAP_MEMORY_FAULT_INFO 231 #define KVM_CAP_MEMORY_ATTRIBUTES 232 +#define KVM_CAP_GUEST_MEMFD 233 #ifdef KVM_CAP_IRQ_ROUTING @@ -2290,4 +2295,12 @@ struct kvm_memory_attributes { #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) +#define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_guest_memfd) + +struct kvm_create_guest_memfd { + __u64 size; + __u64 flags; + __u64 reserved[6]; +}; + #endif /* __LINUX_KVM_H */ diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 5bd7fcaf9089c8..08afef022db9f9 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -100,3 +100,7 @@ config KVM_GENERIC_MMU_NOTIFIER config KVM_GENERIC_MEMORY_ATTRIBUTES select KVM_GENERIC_MMU_NOTIFIER bool + +config KVM_PRIVATE_MEM + select XARRAY_MULTI + bool diff --git a/virt/kvm/Makefile.kvm b/virt/kvm/Makefile.kvm index 2c27d5d0c367c5..724c89af78af96 100644 --- a/virt/kvm/Makefile.kvm +++ b/virt/kvm/Makefile.kvm @@ -12,3 +12,4 @@ kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o kvm-$(CONFIG_HAVE_KVM_IRQ_ROUTING) += $(KVM)/irqchip.o kvm-$(CONFIG_HAVE_KVM_DIRTY_RING) += $(KVM)/dirty_ring.o kvm-$(CONFIG_HAVE_KVM_PFNCACHE) += $(KVM)/pfncache.o +kvm-$(CONFIG_KVM_PRIVATE_MEM) += $(KVM)/guest_memfd.o diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c new file mode 100644 index 00000000000000..98a12da80214d1 --- /dev/null +++ b/virt/kvm/guest_memfd.c @@ -0,0 +1,548 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include + +#include "kvm_mm.h" + +struct kvm_gmem { + struct kvm *kvm; + struct xarray bindings; + struct list_head entry; +}; + +static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) +{ + struct folio *folio; + + /* TODO: Support huge pages. */ + folio = filemap_grab_folio(inode->i_mapping, index); + if (IS_ERR_OR_NULL(folio)) + return NULL; + + /* + * Use the up-to-date flag to track whether or not the memory has been + * zeroed before being handed off to the guest. There is no backing + * storage for the memory, so the folio will remain up-to-date until + * it's removed. + * + * TODO: Skip clearing pages when trusted firmware will do it when + * assigning memory to the guest. + */ + if (!folio_test_uptodate(folio)) { + unsigned long nr_pages = folio_nr_pages(folio); + unsigned long i; + + for (i = 0; i < nr_pages; i++) + clear_highpage(folio_page(folio, i)); + + folio_mark_uptodate(folio); + } + + /* + * Ignore accessed, referenced, and dirty flags. The memory is + * unevictable and there is no storage to write back to. + */ + return folio; +} + +static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, + pgoff_t end) +{ + bool flush = false, found_memslot = false; + struct kvm_memory_slot *slot; + struct kvm *kvm = gmem->kvm; + unsigned long index; + + xa_for_each_range(&gmem->bindings, index, slot, start, end - 1) { + pgoff_t pgoff = slot->gmem.pgoff; + + struct kvm_gfn_range gfn_range = { + .start = slot->base_gfn + max(pgoff, start) - pgoff, + .end = slot->base_gfn + min(pgoff + slot->npages, end) - pgoff, + .slot = slot, + .may_block = true, + }; + + if (!found_memslot) { + found_memslot = true; + + KVM_MMU_LOCK(kvm); + kvm_mmu_invalidate_begin(kvm); + } + + flush |= kvm_mmu_unmap_gfn_range(kvm, &gfn_range); + } + + if (flush) + kvm_flush_remote_tlbs(kvm); + + if (found_memslot) + KVM_MMU_UNLOCK(kvm); +} + +static void kvm_gmem_invalidate_end(struct kvm_gmem *gmem, pgoff_t start, + pgoff_t end) +{ + struct kvm *kvm = gmem->kvm; + + if (xa_find(&gmem->bindings, &start, end - 1, XA_PRESENT)) { + KVM_MMU_LOCK(kvm); + kvm_mmu_invalidate_end(kvm); + KVM_MMU_UNLOCK(kvm); + } +} + +static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len) +{ + struct list_head *gmem_list = &inode->i_mapping->private_list; + pgoff_t start = offset >> PAGE_SHIFT; + pgoff_t end = (offset + len) >> PAGE_SHIFT; + struct kvm_gmem *gmem; + + /* + * Bindings must stable across invalidation to ensure the start+end + * are balanced. + */ + filemap_invalidate_lock(inode->i_mapping); + + list_for_each_entry(gmem, gmem_list, entry) + kvm_gmem_invalidate_begin(gmem, start, end); + + truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1); + + list_for_each_entry(gmem, gmem_list, entry) + kvm_gmem_invalidate_end(gmem, start, end); + + filemap_invalidate_unlock(inode->i_mapping); + + return 0; +} + +static long kvm_gmem_allocate(struct inode *inode, loff_t offset, loff_t len) +{ + struct address_space *mapping = inode->i_mapping; + pgoff_t start, index, end; + int r; + + /* Dedicated guest is immutable by default. */ + if (offset + len > i_size_read(inode)) + return -EINVAL; + + filemap_invalidate_lock_shared(mapping); + + start = offset >> PAGE_SHIFT; + end = (offset + len) >> PAGE_SHIFT; + + r = 0; + for (index = start; index < end; ) { + struct folio *folio; + + if (signal_pending(current)) { + r = -EINTR; + break; + } + + folio = kvm_gmem_get_folio(inode, index); + if (!folio) { + r = -ENOMEM; + break; + } + + index = folio_next_index(folio); + + folio_unlock(folio); + folio_put(folio); + + /* 64-bit only, wrapping the index should be impossible. */ + if (WARN_ON_ONCE(!index)) + break; + + cond_resched(); + } + + filemap_invalidate_unlock_shared(mapping); + + return r; +} + +static long kvm_gmem_fallocate(struct file *file, int mode, loff_t offset, + loff_t len) +{ + int ret; + + if (!(mode & FALLOC_FL_KEEP_SIZE)) + return -EOPNOTSUPP; + + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + return -EOPNOTSUPP; + + if (!PAGE_ALIGNED(offset) || !PAGE_ALIGNED(len)) + return -EINVAL; + + if (mode & FALLOC_FL_PUNCH_HOLE) + ret = kvm_gmem_punch_hole(file_inode(file), offset, len); + else + ret = kvm_gmem_allocate(file_inode(file), offset, len); + + if (!ret) + file_modified(file); + return ret; +} + +static int kvm_gmem_release(struct inode *inode, struct file *file) +{ + struct kvm_gmem *gmem = file->private_data; + struct kvm_memory_slot *slot; + struct kvm *kvm = gmem->kvm; + unsigned long index; + + /* + * Prevent concurrent attempts to *unbind* a memslot. This is the last + * reference to the file and thus no new bindings can be created, but + * dereferencing the slot for existing bindings needs to be protected + * against memslot updates, specifically so that unbind doesn't race + * and free the memslot (kvm_gmem_get_file() will return NULL). + */ + mutex_lock(&kvm->slots_lock); + + filemap_invalidate_lock(inode->i_mapping); + + xa_for_each(&gmem->bindings, index, slot) + rcu_assign_pointer(slot->gmem.file, NULL); + + synchronize_rcu(); + + /* + * All in-flight operations are gone and new bindings can be created. + * Zap all SPTEs pointed at by this file. Do not free the backing + * memory, as its lifetime is associated with the inode, not the file. + */ + kvm_gmem_invalidate_begin(gmem, 0, -1ul); + kvm_gmem_invalidate_end(gmem, 0, -1ul); + + list_del(&gmem->entry); + + filemap_invalidate_unlock(inode->i_mapping); + + mutex_unlock(&kvm->slots_lock); + + xa_destroy(&gmem->bindings); + kfree(gmem); + + kvm_put_kvm(kvm); + + return 0; +} + +static struct file *kvm_gmem_get_file(struct kvm_memory_slot *slot) +{ + struct file *file; + + rcu_read_lock(); + + file = rcu_dereference(slot->gmem.file); + if (file && !get_file_rcu(file)) + file = NULL; + + rcu_read_unlock(); + + return file; +} + +static struct file_operations kvm_gmem_fops = { + .open = generic_file_open, + .release = kvm_gmem_release, + .fallocate = kvm_gmem_fallocate, +}; + +void kvm_gmem_init(struct module *module) +{ + kvm_gmem_fops.owner = module; +} + +static int kvm_gmem_migrate_folio(struct address_space *mapping, + struct folio *dst, struct folio *src, + enum migrate_mode mode) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} + +static int kvm_gmem_error_page(struct address_space *mapping, struct page *page) +{ + struct list_head *gmem_list = &mapping->private_list; + struct kvm_gmem *gmem; + pgoff_t start, end; + + filemap_invalidate_lock_shared(mapping); + + start = page->index; + end = start + thp_nr_pages(page); + + list_for_each_entry(gmem, gmem_list, entry) + kvm_gmem_invalidate_begin(gmem, start, end); + + /* + * Do not truncate the range, what action is taken in response to the + * error is userspace's decision (assuming the architecture supports + * gracefully handling memory errors). If/when the guest attempts to + * access a poisoned page, kvm_gmem_get_pfn() will return -EHWPOISON, + * at which point KVM can either terminate the VM or propagate the + * error to userspace. + */ + + list_for_each_entry(gmem, gmem_list, entry) + kvm_gmem_invalidate_end(gmem, start, end); + + filemap_invalidate_unlock_shared(mapping); + + return MF_DELAYED; +} + +static const struct address_space_operations kvm_gmem_aops = { + .dirty_folio = noop_dirty_folio, +#ifdef CONFIG_MIGRATION + .migrate_folio = kvm_gmem_migrate_folio, +#endif + .error_remove_page = kvm_gmem_error_page, +}; + +static int kvm_gmem_getattr(struct mnt_idmap *idmap, const struct path *path, + struct kstat *stat, u32 request_mask, + unsigned int query_flags) +{ + struct inode *inode = path->dentry->d_inode; + + /* TODO */ + generic_fillattr(idmap, request_mask, inode, stat); + return 0; +} + +static int kvm_gmem_setattr(struct mnt_idmap *idmap, struct dentry *dentry, + struct iattr *attr) +{ + /* TODO */ + return -EINVAL; +} +static const struct inode_operations kvm_gmem_iops = { + .getattr = kvm_gmem_getattr, + .setattr = kvm_gmem_setattr, +}; + +static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) +{ + const char *anon_name = "[kvm-gmem]"; + struct kvm_gmem *gmem; + struct inode *inode; + struct file *file; + int fd, err; + + fd = get_unused_fd_flags(0); + if (fd < 0) + return fd; + + gmem = kzalloc(sizeof(*gmem), GFP_KERNEL); + if (!gmem) { + err = -ENOMEM; + goto err_fd; + } + + /* + * Use the so called "secure" variant, which creates a unique inode + * instead of reusing a single inode. Each guest_memfd instance needs + * its own inode to track the size, flags, etc. + */ + file = anon_inode_getfile_secure(anon_name, &kvm_gmem_fops, gmem, + O_RDWR, NULL); + if (IS_ERR(file)) { + err = PTR_ERR(file); + goto err_gmem; + } + + file->f_flags |= O_LARGEFILE; + + inode = file->f_inode; + WARN_ON(file->f_mapping != inode->i_mapping); + + inode->i_private = (void *)(unsigned long)flags; + inode->i_op = &kvm_gmem_iops; + inode->i_mapping->a_ops = &kvm_gmem_aops; + inode->i_mode |= S_IFREG; + inode->i_size = size; + mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); + mapping_set_unmovable(inode->i_mapping); + /* Unmovable mappings are supposed to be marked unevictable as well. */ + WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); + + kvm_get_kvm(kvm); + gmem->kvm = kvm; + xa_init(&gmem->bindings); + list_add(&gmem->entry, &inode->i_mapping->private_list); + + fd_install(fd, file); + return fd; + +err_gmem: + kfree(gmem); +err_fd: + put_unused_fd(fd); + return err; +} + +int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args) +{ + loff_t size = args->size; + u64 flags = args->flags; + u64 valid_flags = 0; + + if (flags & ~valid_flags) + return -EINVAL; + + if (size < 0 || !PAGE_ALIGNED(size)) + return -EINVAL; + + return __kvm_gmem_create(kvm, size, flags); +} + +int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, + unsigned int fd, loff_t offset) +{ + loff_t size = slot->npages << PAGE_SHIFT; + unsigned long start, end; + struct kvm_gmem *gmem; + struct inode *inode; + struct file *file; + + BUILD_BUG_ON(sizeof(gfn_t) != sizeof(slot->gmem.pgoff)); + + file = fget(fd); + if (!file) + return -EBADF; + + if (file->f_op != &kvm_gmem_fops) + goto err; + + gmem = file->private_data; + if (gmem->kvm != kvm) + goto err; + + inode = file_inode(file); + + if (offset < 0 || !PAGE_ALIGNED(offset)) + return -EINVAL; + + if (offset + size > i_size_read(inode)) + goto err; + + filemap_invalidate_lock(inode->i_mapping); + + start = offset >> PAGE_SHIFT; + end = start + slot->npages; + + if (!xa_empty(&gmem->bindings) && + xa_find(&gmem->bindings, &start, end - 1, XA_PRESENT)) { + filemap_invalidate_unlock(inode->i_mapping); + goto err; + } + + /* + * No synchronize_rcu() needed, any in-flight readers are guaranteed to + * be see either a NULL file or this new file, no need for them to go + * away. + */ + rcu_assign_pointer(slot->gmem.file, file); + slot->gmem.pgoff = start; + + xa_store_range(&gmem->bindings, start, end - 1, slot, GFP_KERNEL); + filemap_invalidate_unlock(inode->i_mapping); + + /* + * Drop the reference to the file, even on success. The file pins KVM, + * not the other way 'round. Active bindings are invalidated if the + * file is closed before memslots are destroyed. + */ + fput(file); + return 0; + +err: + fput(file); + return -EINVAL; +} + +void kvm_gmem_unbind(struct kvm_memory_slot *slot) +{ + unsigned long start = slot->gmem.pgoff; + unsigned long end = start + slot->npages; + struct kvm_gmem *gmem; + struct file *file; + + /* + * Nothing to do if the underlying file was already closed (or is being + * closed right now), kvm_gmem_release() invalidates all bindings. + */ + file = kvm_gmem_get_file(slot); + if (!file) + return; + + gmem = file->private_data; + + filemap_invalidate_lock(file->f_mapping); + xa_store_range(&gmem->bindings, start, end - 1, NULL, GFP_KERNEL); + rcu_assign_pointer(slot->gmem.file, NULL); + synchronize_rcu(); + filemap_invalidate_unlock(file->f_mapping); + + fput(file); +} + +int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, int *max_order) +{ + pgoff_t index = gfn - slot->base_gfn + slot->gmem.pgoff; + struct kvm_gmem *gmem; + struct folio *folio; + struct page *page; + struct file *file; + int r; + + file = kvm_gmem_get_file(slot); + if (!file) + return -EFAULT; + + gmem = file->private_data; + + if (WARN_ON_ONCE(xa_load(&gmem->bindings, index) != slot)) { + r = -EIO; + goto out_fput; + } + + folio = kvm_gmem_get_folio(file_inode(file), index); + if (!folio) { + r = -ENOMEM; + goto out_fput; + } + + if (folio_test_hwpoison(folio)) { + r = -EHWPOISON; + goto out_unlock; + } + + page = folio_file_page(folio, index); + + *pfn = page_to_pfn(page); + if (max_order) + *max_order = 0; + + r = 0; + +out_unlock: + folio_unlock(folio); +out_fput: + fput(file); + + return r; +} +EXPORT_SYMBOL_GPL(kvm_gmem_get_pfn); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 78a0b09ef2a52c..5d1a2f1b4e94a4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -798,7 +798,7 @@ void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end) } } -static bool kvm_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) +bool kvm_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) { kvm_mmu_invalidate_range_add(kvm, range->start, range->end); return kvm_unmap_gfn_range(kvm, range); @@ -1034,6 +1034,9 @@ static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot) /* This does not remove the slot from struct kvm_memslots data structures */ static void kvm_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot) { + if (slot->flags & KVM_MEM_PRIVATE) + kvm_gmem_unbind(slot); + kvm_destroy_dirty_bitmap(slot); kvm_arch_free_memslot(kvm, slot); @@ -1605,10 +1608,18 @@ static void kvm_replace_memslot(struct kvm *kvm, } } -static int check_memory_region_flags(const struct kvm_userspace_memory_region2 *mem) +static int check_memory_region_flags(struct kvm *kvm, + const struct kvm_userspace_memory_region2 *mem) { u32 valid_flags = KVM_MEM_LOG_DIRTY_PAGES; + if (kvm_arch_has_private_mem(kvm)) + valid_flags |= KVM_MEM_PRIVATE; + + /* Dirty logging private memory is not currently supported. */ + if (mem->flags & KVM_MEM_PRIVATE) + valid_flags &= ~KVM_MEM_LOG_DIRTY_PAGES; + #ifdef __KVM_HAVE_READONLY_MEM valid_flags |= KVM_MEM_READONLY; #endif @@ -2017,7 +2028,7 @@ int __kvm_set_memory_region(struct kvm *kvm, int as_id, id; int r; - r = check_memory_region_flags(mem); + r = check_memory_region_flags(kvm, mem); if (r) return r; @@ -2036,6 +2047,10 @@ int __kvm_set_memory_region(struct kvm *kvm, !access_ok((void __user *)(unsigned long)mem->userspace_addr, mem->memory_size)) return -EINVAL; + if (mem->flags & KVM_MEM_PRIVATE && + (mem->guest_memfd_offset & (PAGE_SIZE - 1) || + mem->guest_memfd_offset + mem->memory_size < mem->guest_memfd_offset)) + return -EINVAL; if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_MEM_SLOTS_NUM) return -EINVAL; if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr) @@ -2074,6 +2089,9 @@ int __kvm_set_memory_region(struct kvm *kvm, if ((kvm->nr_memslot_pages + npages) < kvm->nr_memslot_pages) return -EINVAL; } else { /* Modify an existing slot. */ + /* Private memslots are immutable, they can only be deleted. */ + if (mem->flags & KVM_MEM_PRIVATE) + return -EINVAL; if ((mem->userspace_addr != old->userspace_addr) || (npages != old->npages) || ((mem->flags ^ old->flags) & KVM_MEM_READONLY)) @@ -2102,10 +2120,23 @@ int __kvm_set_memory_region(struct kvm *kvm, new->npages = npages; new->flags = mem->flags; new->userspace_addr = mem->userspace_addr; + if (mem->flags & KVM_MEM_PRIVATE) { + r = kvm_gmem_bind(kvm, new, mem->guest_memfd, mem->guest_memfd_offset); + if (r) + goto out; + } r = kvm_set_memslot(kvm, old, new, change); if (r) - kfree(new); + goto out_unbind; + + return 0; + +out_unbind: + if (mem->flags & KVM_MEM_PRIVATE) + kvm_gmem_unbind(new); +out: + kfree(new); return r; } EXPORT_SYMBOL_GPL(__kvm_set_memory_region); @@ -2441,7 +2472,7 @@ bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t end, static u64 kvm_supported_mem_attributes(struct kvm *kvm) { - if (!kvm) + if (!kvm || kvm_arch_has_private_mem(kvm)) return KVM_MEMORY_ATTRIBUTE_PRIVATE; return 0; @@ -4852,14 +4883,11 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) return 1; #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES case KVM_CAP_MEMORY_ATTRIBUTES: - u64 attrs = kvm_supported_mem_attributes(kvm); - - r = -EFAULT; - if (copy_to_user(argp, &attrs, sizeof(attrs))) - goto out; - r = 0; - break; - } + return kvm_supported_mem_attributes(kvm); +#endif +#ifdef CONFIG_KVM_PRIVATE_MEM + case KVM_CAP_GUEST_MEMFD: + return !kvm || kvm_arch_has_private_mem(kvm); #endif default: break; @@ -5282,6 +5310,18 @@ static long kvm_vm_ioctl(struct file *filp, case KVM_GET_STATS_FD: r = kvm_vm_ioctl_get_stats_fd(kvm); break; +#ifdef CONFIG_KVM_PRIVATE_MEM + case KVM_CREATE_GUEST_MEMFD: { + struct kvm_create_guest_memfd guest_memfd; + + r = -EFAULT; + if (copy_from_user(&guest_memfd, argp, sizeof(guest_memfd))) + goto out; + + r = kvm_gmem_create(kvm, &guest_memfd); + break; + } +#endif default: r = kvm_arch_vm_ioctl(filp, ioctl, arg); } @@ -6414,6 +6454,8 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module) if (WARN_ON_ONCE(r)) goto err_vfio; + kvm_gmem_init(module); + /* * Registration _must_ be the very last thing done, as this exposes * /dev/kvm to userspace, i.e. all infrastructure must be setup! diff --git a/virt/kvm/kvm_mm.h b/virt/kvm/kvm_mm.h index 180f1a09e6ba7b..ecefc7ec51af85 100644 --- a/virt/kvm/kvm_mm.h +++ b/virt/kvm/kvm_mm.h @@ -37,4 +37,30 @@ static inline void gfn_to_pfn_cache_invalidate_start(struct kvm *kvm, } #endif /* HAVE_KVM_PFNCACHE */ +#ifdef CONFIG_KVM_PRIVATE_MEM +void kvm_gmem_init(struct module *module); +int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args); +int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, + unsigned int fd, loff_t offset); +void kvm_gmem_unbind(struct kvm_memory_slot *slot); +#else +static inline void kvm_gmem_init(struct module *module) +{ + +} + +static inline int kvm_gmem_bind(struct kvm *kvm, + struct kvm_memory_slot *slot, + unsigned int fd, loff_t offset) +{ + WARN_ON_ONCE(1); + return -EIO; +} + +static inline void kvm_gmem_unbind(struct kvm_memory_slot *slot) +{ + WARN_ON_ONCE(1); +} +#endif /* CONFIG_KVM_PRIVATE_MEM */ + #endif /* __KVM_MM_H__ */ From a2e4643a589a92918922501a9ec93c3075efee7c Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 25 Oct 2023 16:26:41 -0700 Subject: [PATCH 447/515] KVM: Add transparent hugepage support for dedicated guest memory Extended guest_memfd to allow backing guest memory with transparent hugepages. Require userspace to opt-in via a flag even though there's no known/anticipated use case for forcing small pages as THP is optional, i.e. to avoid ending up in a situation where userspace is unaware that KVM can't provide hugepages. For simplicity, require the guest_memfd size to be a multiple of the hugepage size, e.g. so that KVM doesn't need to do bounds checking when deciding whether or not to allocate a huge folio. When reporting the max order when KVM gets a pfn from guest_memfd, force order-0 pages if the hugepage is not fully contained by the memslot binding, e.g. if userspace requested hugepages but punches a hole in the memslot bindings in order to emulate x86's VGA hole. Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 7 ++++ include/uapi/linux/kvm.h | 2 + virt/kvm/guest_memfd.c | 73 ++++++++++++++++++++++++++++++---- 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index e82c69d5e75549..7f00c310c24a42 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6176,6 +6176,8 @@ and cannot be resized (guest_memfd files do however support PUNCH_HOLE). __u64 reserved[6]; }; + #define KVM_GUEST_MEMFD_ALLOW_HUGEPAGE (1ULL << 0) + Conceptually, the inode backing a guest_memfd file represents physical memory, i.e. is coupled to the virtual machine as a thing, not to a "struct kvm". The file itself, which is bound to a "struct kvm", is that instance's view of the @@ -6192,6 +6194,11 @@ most one mapping per page, i.e. binding multiple memory regions to a single guest_memfd range is not allowed (any number of memory regions can be bound to a single guest_memfd file, but the bound ranges must not overlap). +If KVM_GUEST_MEMFD_ALLOW_HUGEPAGE is set in flags, KVM will attempt to allocate +and map hugepages for the guest_memfd file. This is currently best effort. If +KVM_GUEST_MEMFD_ALLOW_HUGEPAGE is set, the size must be aligned to the maximum +transparent hugepage size supported by the kernel + See KVM_SET_USER_MEMORY_REGION2 for additional details. 5. The kvm_run structure diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 25caee8d1a8020..33d542de0a613b 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -2303,4 +2303,6 @@ struct kvm_create_guest_memfd { __u64 reserved[6]; }; +#define KVM_GUEST_MEMFD_ALLOW_HUGEPAGE (1ULL << 0) + #endif /* __LINUX_KVM_H */ diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 98a12da80214d1..94bc478c26f363 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -13,15 +13,48 @@ struct kvm_gmem { struct list_head entry; }; -static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) +static struct folio *kvm_gmem_get_huge_folio(struct inode *inode, pgoff_t index) { +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + unsigned long huge_index = round_down(index, HPAGE_PMD_NR); + unsigned long flags = (unsigned long)inode->i_private; + struct address_space *mapping = inode->i_mapping; + gfp_t gfp = mapping_gfp_mask(mapping); struct folio *folio; - /* TODO: Support huge pages. */ - folio = filemap_grab_folio(inode->i_mapping, index); - if (IS_ERR_OR_NULL(folio)) + if (!(flags & KVM_GUEST_MEMFD_ALLOW_HUGEPAGE)) + return NULL; + + if (filemap_range_has_page(mapping, huge_index << PAGE_SHIFT, + (huge_index + HPAGE_PMD_NR - 1) << PAGE_SHIFT)) + return NULL; + + folio = filemap_alloc_folio(gfp, HPAGE_PMD_ORDER); + if (!folio) return NULL; + if (filemap_add_folio(mapping, folio, huge_index, gfp)) { + folio_put(folio); + return NULL; + } + + return folio; +#else + return NULL; +#endif +} + +static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) +{ + struct folio *folio; + + folio = kvm_gmem_get_huge_folio(inode, index); + if (!folio) { + folio = filemap_grab_folio(inode->i_mapping, index); + if (IS_ERR_OR_NULL(folio)) + return NULL; + } + /* * Use the up-to-date flag to track whether or not the memory has been * zeroed before being handed off to the guest. There is no backing @@ -373,6 +406,7 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) inode->i_mode |= S_IFREG; inode->i_size = size; mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); + mapping_set_large_folios(inode->i_mapping); mapping_set_unmovable(inode->i_mapping); /* Unmovable mappings are supposed to be marked unevictable as well. */ WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); @@ -398,12 +432,21 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args) u64 flags = args->flags; u64 valid_flags = 0; + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) + valid_flags |= KVM_GUEST_MEMFD_ALLOW_HUGEPAGE; + if (flags & ~valid_flags) return -EINVAL; if (size < 0 || !PAGE_ALIGNED(size)) return -EINVAL; +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + if ((flags & KVM_GUEST_MEMFD_ALLOW_HUGEPAGE) && + !IS_ALIGNED(size, HPAGE_PMD_SIZE)) + return -EINVAL; +#endif + return __kvm_gmem_create(kvm, size, flags); } @@ -501,7 +544,7 @@ void kvm_gmem_unbind(struct kvm_memory_slot *slot) int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, kvm_pfn_t *pfn, int *max_order) { - pgoff_t index = gfn - slot->base_gfn + slot->gmem.pgoff; + pgoff_t index, huge_index; struct kvm_gmem *gmem; struct folio *folio; struct page *page; @@ -514,6 +557,7 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gmem = file->private_data; + index = gfn - slot->base_gfn + slot->gmem.pgoff; if (WARN_ON_ONCE(xa_load(&gmem->bindings, index) != slot)) { r = -EIO; goto out_fput; @@ -533,9 +577,24 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, page = folio_file_page(folio, index); *pfn = page_to_pfn(page); - if (max_order) - *max_order = 0; + if (!max_order) + goto success; + + *max_order = compound_order(compound_head(page)); + if (!*max_order) + goto success; + /* + * The folio can be mapped with a hugepage if and only if the folio is + * fully contained by the range the memslot is bound to. Note, the + * caller is responsible for handling gfn alignment, this only deals + * with the file binding. + */ + huge_index = ALIGN(index, 1ull << *max_order); + if (huge_index < ALIGN(slot->gmem.pgoff, 1ull << *max_order) || + huge_index + (1ull << *max_order) > slot->gmem.pgoff + slot->npages) + *max_order = 0; +success: r = 0; out_unlock: From e6c497c57a0a4ba4df4f9d49a8551e2b27e078bc Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:14 -0700 Subject: [PATCH 448/515] KVM: x86: "Reset" vcpu->run->exit_reason early in KVM_RUN Initialize run->exit_reason to KVM_EXIT_UNKNOWN early in KVM_RUN to reduce the probability of exiting to userspace with a stale run->exit_reason that *appears* to be valid. To support fd-based guest memory (guest memory without a corresponding userspace virtual address), KVM will exit to userspace for various memory related errors, which userspace *may* be able to resolve, instead of using e.g. BUS_MCEERR_AR. And in the more distant future, KVM will also likely utilize the same functionality to let userspace "intercept" and handle memory faults when the userspace mapping is missing, i.e. when fast gup() fails. Because many of KVM's internal APIs related to guest memory use '0' to indicate "success, continue on" and not "exit to userspace", reporting memory faults/errors to userspace will set run->exit_reason and corresponding fields in the run structure fields in conjunction with a a non-zero, negative return code, e.g. -EFAULT or -EHWPOISON. And because KVM already returns -EFAULT in many paths, there's a relatively high probability that KVM could return -EFAULT without setting run->exit_reason, in which case reporting KVM_EXIT_UNKNOWN is much better than reporting whatever exit reason happened to be in the run structure. Note, KVM must wait until after run->immediate_exit is serviced to sanitize run->exit_reason as KVM's ABI is that run->exit_reason is preserved across KVM_RUN when run->immediate_exit is true. Link: https://lore.kernel.org/all/20230908222905.1321305-1-amoorthy@google.com Link: https://lore.kernel.org/all/ZFFbwOXZ5uI%2Fgdaf@google.com Signed-off-by: Sean Christopherson --- arch/x86/kvm/x86.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ee3cd8c3c0ef3e..f41dbb1465a0a0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10963,6 +10963,7 @@ static int vcpu_run(struct kvm_vcpu *vcpu) { int r; + vcpu->run->exit_reason = KVM_EXIT_UNKNOWN; vcpu->arch.l1tf_flush_l1d = true; for (;;) { From 4b8573d2d4a509d08ddbd0c120274a62a6d6cf3b Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:15 -0700 Subject: [PATCH 449/515] KVM: x86: Disallow hugepages when memory attributes are mixed Disallow creating hugepages with mixed memory attributes, e.g. shared versus private, as mapping a hugepage in this case would allow the guest to access memory with the wrong attributes, e.g. overlaying private memory with a shared hugepage. Tracking whether or not attributes are mixed via the existing disallow_lpage field, but use the most significant bit in 'disallow_lpage' to indicate a hugepage has mixed attributes instead using the normal refcounting. Whether or not attributes are mixed is binary; either they are or they aren't. Attempting to squeeze that info into the refcount is unnecessarily complex as it would require knowing the previous state of the mixed count when updating attributes. Using a flag means KVM just needs to ensure the current status is reflected in the memslots. Signed-off-by: Chao Peng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 3 + arch/x86/kvm/mmu/mmu.c | 154 +++++++++++++++++++++++++++++++- arch/x86/kvm/x86.c | 4 + 3 files changed, 159 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 31e84668014e88..8d60e4745e8b6e 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1836,6 +1836,9 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu); void kvm_mmu_init_vm(struct kvm *kvm); void kvm_mmu_uninit_vm(struct kvm *kvm); +void kvm_mmu_init_memslot_memory_attributes(struct kvm *kvm, + struct kvm_memory_slot *slot); + void kvm_mmu_after_set_cpuid(struct kvm_vcpu *vcpu); void kvm_mmu_reset_context(struct kvm_vcpu *vcpu); void kvm_mmu_slot_remove_write_access(struct kvm *kvm, diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index d33657d61d803c..4167d557c57732 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -795,16 +795,26 @@ static struct kvm_lpage_info *lpage_info_slot(gfn_t gfn, return &slot->arch.lpage_info[level - 2][idx]; } +/* + * The most significant bit in disallow_lpage tracks whether or not memory + * attributes are mixed, i.e. not identical for all gfns at the current level. + * The lower order bits are used to refcount other cases where a hugepage is + * disallowed, e.g. if KVM has shadow a page table at the gfn. + */ +#define KVM_LPAGE_MIXED_FLAG BIT(31) + static void update_gfn_disallow_lpage_count(const struct kvm_memory_slot *slot, gfn_t gfn, int count) { struct kvm_lpage_info *linfo; - int i; + int old, i; for (i = PG_LEVEL_2M; i <= KVM_MAX_HUGEPAGE_LEVEL; ++i) { linfo = lpage_info_slot(gfn, slot, i); + + old = linfo->disallow_lpage; linfo->disallow_lpage += count; - WARN_ON_ONCE(linfo->disallow_lpage < 0); + WARN_ON_ONCE((old ^ linfo->disallow_lpage) & KVM_LPAGE_MIXED_FLAG); } } @@ -7161,3 +7171,143 @@ void kvm_mmu_pre_destroy_vm(struct kvm *kvm) if (kvm->arch.nx_huge_page_recovery_thread) kthread_stop(kvm->arch.nx_huge_page_recovery_thread); } + +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +static bool hugepage_test_mixed(struct kvm_memory_slot *slot, gfn_t gfn, + int level) +{ + return lpage_info_slot(gfn, slot, level)->disallow_lpage & KVM_LPAGE_MIXED_FLAG; +} + +static void hugepage_clear_mixed(struct kvm_memory_slot *slot, gfn_t gfn, + int level) +{ + lpage_info_slot(gfn, slot, level)->disallow_lpage &= ~KVM_LPAGE_MIXED_FLAG; +} + +static void hugepage_set_mixed(struct kvm_memory_slot *slot, gfn_t gfn, + int level) +{ + lpage_info_slot(gfn, slot, level)->disallow_lpage |= KVM_LPAGE_MIXED_FLAG; +} + +static bool hugepage_has_attrs(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, int level, unsigned long attrs) +{ + const unsigned long start = gfn; + const unsigned long end = start + KVM_PAGES_PER_HPAGE(level); + + if (level == PG_LEVEL_2M) + return kvm_range_has_memory_attributes(kvm, start, end, attrs); + + for (gfn = start; gfn < end; gfn += KVM_PAGES_PER_HPAGE(level - 1)) { + if (hugepage_test_mixed(slot, gfn, level - 1) || + attrs != kvm_get_memory_attributes(kvm, gfn)) + return false; + } + return true; +} + +bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range) +{ + unsigned long attrs = range->arg.attributes; + struct kvm_memory_slot *slot = range->slot; + int level; + + lockdep_assert_held_write(&kvm->mmu_lock); + lockdep_assert_held(&kvm->slots_lock); + + /* + * Calculate which ranges can be mapped with hugepages even if the slot + * can't map memory PRIVATE. KVM mustn't create a SHARED hugepage over + * a range that has PRIVATE GFNs, and conversely converting a range to + * SHARED may now allow hugepages. + */ + if (WARN_ON_ONCE(!kvm_arch_has_private_mem(kvm))) + return false; + + /* + * The sequence matters here: upper levels consume the result of lower + * level's scanning. + */ + for (level = PG_LEVEL_2M; level <= KVM_MAX_HUGEPAGE_LEVEL; level++) { + gfn_t nr_pages = KVM_PAGES_PER_HPAGE(level); + gfn_t gfn = gfn_round_for_level(range->start, level); + + /* Process the head page if it straddles the range. */ + if (gfn != range->start || gfn + nr_pages > range->end) { + /* + * Skip mixed tracking if the aligned gfn isn't covered + * by the memslot, KVM can't use a hugepage due to the + * misaligned address regardless of memory attributes. + */ + if (gfn >= slot->base_gfn) { + if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) + hugepage_clear_mixed(slot, gfn, level); + else + hugepage_set_mixed(slot, gfn, level); + } + gfn += nr_pages; + } + + /* + * Pages entirely covered by the range are guaranteed to have + * only the attributes which were just set. + */ + for ( ; gfn + nr_pages <= range->end; gfn += nr_pages) + hugepage_clear_mixed(slot, gfn, level); + + /* + * Process the last tail page if it straddles the range and is + * contained by the memslot. Like the head page, KVM can't + * create a hugepage if the slot size is misaligned. + */ + if (gfn < range->end && + (gfn + nr_pages) <= (slot->base_gfn + slot->npages)) { + if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) + hugepage_clear_mixed(slot, gfn, level); + else + hugepage_set_mixed(slot, gfn, level); + } + } + return false; +} + +void kvm_mmu_init_memslot_memory_attributes(struct kvm *kvm, + struct kvm_memory_slot *slot) +{ + int level; + + if (!kvm_arch_has_private_mem(kvm)) + return; + + for (level = PG_LEVEL_2M; level <= KVM_MAX_HUGEPAGE_LEVEL; level++) { + /* + * Don't bother tracking mixed attributes for pages that can't + * be huge due to alignment, i.e. process only pages that are + * entirely contained by the memslot. + */ + gfn_t end = gfn_round_for_level(slot->base_gfn + slot->npages, level); + gfn_t start = gfn_round_for_level(slot->base_gfn, level); + gfn_t nr_pages = KVM_PAGES_PER_HPAGE(level); + gfn_t gfn; + + if (start < slot->base_gfn) + start += nr_pages; + + /* + * Unlike setting attributes, every potential hugepage needs to + * be manually checked as the attributes may already be mixed. + */ + for (gfn = start; gfn < end; gfn += nr_pages) { + unsigned long attrs = kvm_get_memory_attributes(kvm, gfn); + + if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) + hugepage_clear_mixed(slot, gfn, level); + else + hugepage_set_mixed(slot, gfn, level); + } + } +} +#endif diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index f41dbb1465a0a0..824b58b44382f7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12607,6 +12607,10 @@ static int kvm_alloc_memslot_metadata(struct kvm *kvm, } } +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + kvm_mmu_init_memslot_memory_attributes(kvm, slot); +#endif + if (kvm_page_track_create_memslot(kvm, slot, npages)) goto out_free; From 42f0487ce2636f1d5a5fd4d614cbda78f250ccea Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:16 -0700 Subject: [PATCH 450/515] KVM: x86/mmu: Handle page fault for private memory Add support for resolving page faults on guest private memory for VMs that differentiate between "shared" and "private" memory. For such VMs, KVM_MEM_PRIVATE memslots can include both fd-based private memory and hva-based shared memory, and KVM needs to map in the "correct" variant, i.e. KVM needs to map the gfn shared/private as appropriate based on the current state of the gfn's KVM_MEMORY_ATTRIBUTE_PRIVATE flag. For AMD's SEV-SNP and Intel's TDX, the guest effectively gets to request shared vs. private via a bit in the guest page tables, i.e. what the guest wants may conflict with the current memory attributes. To support such "implicit" conversion requests, exit to user with KVM_EXIT_MEMORY_FAULT to forward the request to userspace. Add a new flag for memory faults, KVM_MEMORY_EXIT_FLAG_PRIVATE, to communicate whether the guest wants to map memory as shared vs. private. Like KVM_MEMORY_ATTRIBUTE_PRIVATE, use bit 3 for flagging private memory so that KVM can use bits 0-2 for capturing RWX behavior if/when userspace needs such information, e.g. a likely user of KVM_EXIT_MEMORY_FAULT is to exit on missing mappings when handling guest page fault VM-Exits. In that case, userspace will want to know RWX information in order to correctly/precisely resolve the fault. Note, private memory *must* be backed by guest_memfd, i.e. shared mappings always come from the host userspace page tables, and private mappings always come from a guest_memfd instance. Co-developed-by: Yu Zhang Signed-off-by: Yu Zhang Signed-off-by: Chao Peng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 8 ++- arch/x86/kvm/mmu/mmu.c | 101 ++++++++++++++++++++++++++++++-- arch/x86/kvm/mmu/mmu_internal.h | 1 + include/linux/kvm_host.h | 8 ++- include/uapi/linux/kvm.h | 1 + 5 files changed, 110 insertions(+), 9 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 7f00c310c24a42..38dc1fda4f4597 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6837,6 +6837,7 @@ spec refer, https://github.com/riscv/riscv-sbi-doc. /* KVM_EXIT_MEMORY_FAULT */ struct { + #define KVM_MEMORY_EXIT_FLAG_PRIVATE (1ULL << 3) __u64 flags; __u64 gpa; __u64 size; @@ -6845,8 +6846,11 @@ spec refer, https://github.com/riscv/riscv-sbi-doc. KVM_EXIT_MEMORY_FAULT indicates the vCPU has encountered a memory fault that could not be resolved by KVM. The 'gpa' and 'size' (in bytes) describe the guest physical address range [gpa, gpa + size) of the fault. The 'flags' field -describes properties of the faulting access that are likely pertinent. -Currently, no flags are defined. +describes properties of the faulting access that are likely pertinent: + + - KVM_MEMORY_EXIT_FLAG_PRIVATE - When set, indicates the memory fault occurred + on a private memory access. When clear, indicates the fault occurred on a + shared access. Note! KVM_EXIT_MEMORY_FAULT is unique among all KVM exit reasons in that it accompanies a return code of '-1', not '0'! errno will always be set to EFAULT diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 4167d557c57732..c4e758f0aebbcc 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3147,9 +3147,9 @@ static int host_pfn_mapping_level(struct kvm *kvm, gfn_t gfn, return level; } -int kvm_mmu_max_mapping_level(struct kvm *kvm, - const struct kvm_memory_slot *slot, gfn_t gfn, - int max_level) +static int __kvm_mmu_max_mapping_level(struct kvm *kvm, + const struct kvm_memory_slot *slot, + gfn_t gfn, int max_level, bool is_private) { struct kvm_lpage_info *linfo; int host_level; @@ -3161,6 +3161,9 @@ int kvm_mmu_max_mapping_level(struct kvm *kvm, break; } + if (is_private) + return max_level; + if (max_level == PG_LEVEL_4K) return PG_LEVEL_4K; @@ -3168,6 +3171,16 @@ int kvm_mmu_max_mapping_level(struct kvm *kvm, return min(host_level, max_level); } +int kvm_mmu_max_mapping_level(struct kvm *kvm, + const struct kvm_memory_slot *slot, gfn_t gfn, + int max_level) +{ + bool is_private = kvm_slot_can_be_private(slot) && + kvm_mem_is_private(kvm, gfn); + + return __kvm_mmu_max_mapping_level(kvm, slot, gfn, max_level, is_private); +} + void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) { struct kvm_memory_slot *slot = fault->slot; @@ -3188,8 +3201,9 @@ void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault * Enforce the iTLB multihit workaround after capturing the requested * level, which will be used to do precise, accurate accounting. */ - fault->req_level = kvm_mmu_max_mapping_level(vcpu->kvm, slot, - fault->gfn, fault->max_level); + fault->req_level = __kvm_mmu_max_mapping_level(vcpu->kvm, slot, + fault->gfn, fault->max_level, + fault->is_private); if (fault->req_level == PG_LEVEL_4K || fault->huge_page_disallowed) return; @@ -4261,6 +4275,55 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work) kvm_mmu_do_page_fault(vcpu, work->cr2_or_gpa, 0, true, NULL); } +static inline u8 kvm_max_level_for_order(int order) +{ + BUILD_BUG_ON(KVM_MAX_HUGEPAGE_LEVEL > PG_LEVEL_1G); + + KVM_MMU_WARN_ON(order != KVM_HPAGE_GFN_SHIFT(PG_LEVEL_1G) && + order != KVM_HPAGE_GFN_SHIFT(PG_LEVEL_2M) && + order != KVM_HPAGE_GFN_SHIFT(PG_LEVEL_4K)); + + if (order >= KVM_HPAGE_GFN_SHIFT(PG_LEVEL_1G)) + return PG_LEVEL_1G; + + if (order >= KVM_HPAGE_GFN_SHIFT(PG_LEVEL_2M)) + return PG_LEVEL_2M; + + return PG_LEVEL_4K; +} + +static void kvm_mmu_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, + struct kvm_page_fault *fault) +{ + kvm_prepare_memory_fault_exit(vcpu, fault->gfn << PAGE_SHIFT, + PAGE_SIZE, fault->write, fault->exec, + fault->is_private); +} + +static int kvm_faultin_pfn_private(struct kvm_vcpu *vcpu, + struct kvm_page_fault *fault) +{ + int max_order, r; + + if (!kvm_slot_can_be_private(fault->slot)) { + kvm_mmu_prepare_memory_fault_exit(vcpu, fault); + return -EFAULT; + } + + r = kvm_gmem_get_pfn(vcpu->kvm, fault->slot, fault->gfn, &fault->pfn, + &max_order); + if (r) { + kvm_mmu_prepare_memory_fault_exit(vcpu, fault); + return r; + } + + fault->max_level = min(kvm_max_level_for_order(max_order), + fault->max_level); + fault->map_writable = !(fault->slot->flags & KVM_MEM_READONLY); + + return RET_PF_CONTINUE; +} + static int __kvm_faultin_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) { struct kvm_memory_slot *slot = fault->slot; @@ -4293,6 +4356,14 @@ static int __kvm_faultin_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault return RET_PF_EMULATE; } + if (fault->is_private != kvm_mem_is_private(vcpu->kvm, fault->gfn)) { + kvm_mmu_prepare_memory_fault_exit(vcpu, fault); + return -EFAULT; + } + + if (fault->is_private) + return kvm_faultin_pfn_private(vcpu, fault); + async = false; fault->pfn = __gfn_to_pfn_memslot(slot, fault->gfn, false, false, &async, fault->write, &fault->map_writable, @@ -7173,6 +7244,26 @@ void kvm_mmu_pre_destroy_vm(struct kvm *kvm) } #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range) +{ + /* + * Zap SPTEs even if the slot can't be mapped PRIVATE. KVM x86 only + * supports KVM_MEMORY_ATTRIBUTE_PRIVATE, and so it *seems* like KVM + * can simply ignore such slots. But if userspace is making memory + * PRIVATE, then KVM must prevent the guest from accessing the memory + * as shared. And if userspace is making memory SHARED and this point + * is reached, then at least one page within the range was previously + * PRIVATE, i.e. the slot's possible hugepage ranges are changing. + * Zapping SPTEs in this case ensures KVM will reassess whether or not + * a hugepage can be used for affected ranges. + */ + if (WARN_ON_ONCE(!kvm_arch_has_private_mem(kvm))) + return false; + + return kvm_unmap_gfn_range(kvm, range); +} + static bool hugepage_test_mixed(struct kvm_memory_slot *slot, gfn_t gfn, int level) { diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h index decc1f1536694f..86c7cb69278671 100644 --- a/arch/x86/kvm/mmu/mmu_internal.h +++ b/arch/x86/kvm/mmu/mmu_internal.h @@ -201,6 +201,7 @@ struct kvm_page_fault { /* Derived from mmu and global state. */ const bool is_tdp; + const bool is_private; const bool nx_huge_page_workaround_enabled; /* diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 7de93858054d92..e3223cafd7db51 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2358,14 +2358,18 @@ static inline void kvm_account_pgtable_pages(void *virt, int nr) #define KVM_DIRTY_RING_MAX_ENTRIES 65536 static inline void kvm_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, - gpa_t gpa, gpa_t size) + gpa_t gpa, gpa_t size, + bool is_write, bool is_exec, + bool is_private) { vcpu->run->exit_reason = KVM_EXIT_MEMORY_FAULT; vcpu->run->memory_fault.gpa = gpa; vcpu->run->memory_fault.size = size; - /* Flags are not (yet) defined or communicated to userspace. */ + /* RWX flags are not (yet) defined or communicated to userspace. */ vcpu->run->memory_fault.flags = 0; + if (is_private) + vcpu->run->memory_fault.flags |= KVM_MEMORY_EXIT_FLAG_PRIVATE; } #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 33d542de0a613b..29e9eb51dec93d 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -527,6 +527,7 @@ struct kvm_run { } notify; /* KVM_EXIT_MEMORY_FAULT */ struct { +#define KVM_MEMORY_EXIT_FLAG_PRIVATE (1ULL << 3) __u64 flags; __u64 gpa; __u64 size; From b6e644f955002888b02753cacd80c1a0f78f8ba3 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:17 -0700 Subject: [PATCH 451/515] KVM: Drop superfluous __KVM_VCPU_MULTIPLE_ADDRESS_SPACE macro Drop __KVM_VCPU_MULTIPLE_ADDRESS_SPACE and instead check the value of KVM_ADDRESS_SPACE_NUM. No functional change intended. Reviewed-by: Paolo Bonzini Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 1 - include/linux/kvm_host.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 8d60e4745e8b6e..6702f795c862ac 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2124,7 +2124,6 @@ enum { #define HF_SMM_MASK (1 << 1) #define HF_SMM_INSIDE_NMI_MASK (1 << 2) -# define __KVM_VCPU_MULTIPLE_ADDRESS_SPACE # define KVM_ADDRESS_SPACE_NUM 2 # define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index e3223cafd7db51..c3cfe08b1300a9 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -692,7 +692,7 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm); #define KVM_MEM_SLOTS_NUM SHRT_MAX #define KVM_USER_MEM_SLOTS (KVM_MEM_SLOTS_NUM - KVM_INTERNAL_MEM_SLOTS) -#ifndef __KVM_VCPU_MULTIPLE_ADDRESS_SPACE +#if KVM_ADDRESS_SPACE_NUM == 1 static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) { return 0; From e5db21dd2a1d9efacbcee4ff4f83a369551de486 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:18 -0700 Subject: [PATCH 452/515] KVM: Allow arch code to track number of memslot address spaces per VM Let x86 track the number of address spaces on a per-VM basis so that KVM can disallow SMM memslots for confidential VMs. Confidentials VMs are fundamentally incompatible with emulating SMM, which as the name suggests requires being able to read and write guest memory and register state. Disallowing SMM will simplify support for guest private memory, as KVM will not need to worry about tracking memory attributes for multiple address spaces (SMM is the only "non-default" address space across all architectures). Signed-off-by: Sean Christopherson --- arch/powerpc/kvm/book3s_hv.c | 2 +- arch/x86/include/asm/kvm_host.h | 8 +++++++- arch/x86/kvm/debugfs.c | 2 +- arch/x86/kvm/mmu/mmu.c | 6 +++--- arch/x86/kvm/x86.c | 2 +- include/linux/kvm_host.h | 17 +++++++++++------ virt/kvm/dirty_ring.c | 2 +- virt/kvm/kvm_main.c | 26 ++++++++++++++------------ 8 files changed, 39 insertions(+), 26 deletions(-) diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 130bafdb143088..9b0eaa17275a30 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -6084,7 +6084,7 @@ static int kvmhv_svm_off(struct kvm *kvm) } srcu_idx = srcu_read_lock(&kvm->srcu); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { struct kvm_memory_slot *memslot; struct kvm_memslots *slots = __kvm_memslots(kvm, i); int bkt; diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 6702f795c862ac..f9e8d56420697f 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2124,9 +2124,15 @@ enum { #define HF_SMM_MASK (1 << 1) #define HF_SMM_INSIDE_NMI_MASK (1 << 2) -# define KVM_ADDRESS_SPACE_NUM 2 +# define KVM_MAX_NR_ADDRESS_SPACES 2 # define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) + +static inline int kvm_arch_nr_memslot_as_ids(struct kvm *kvm) +{ + return KVM_MAX_NR_ADDRESS_SPACES; +} + #else # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, 0) #endif diff --git a/arch/x86/kvm/debugfs.c b/arch/x86/kvm/debugfs.c index ee8c4c3496edd0..42026b3f3ff34d 100644 --- a/arch/x86/kvm/debugfs.c +++ b/arch/x86/kvm/debugfs.c @@ -111,7 +111,7 @@ static int kvm_mmu_rmaps_stat_show(struct seq_file *m, void *v) mutex_lock(&kvm->slots_lock); write_lock(&kvm->mmu_lock); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { int bkt; slots = __kvm_memslots(kvm, i); diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index c4e758f0aebbcc..baeba8fc1c38ea 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3755,7 +3755,7 @@ static int mmu_first_shadow_root_alloc(struct kvm *kvm) kvm_page_track_write_tracking_enabled(kvm)) goto out_success; - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { slots = __kvm_memslots(kvm, i); kvm_for_each_memslot(slot, bkt, slots) { /* @@ -6294,7 +6294,7 @@ static bool kvm_rmap_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_e if (!kvm_memslots_have_rmaps(kvm)) return flush; - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { slots = __kvm_memslots(kvm, i); kvm_for_each_memslot_in_gfn_range(&iter, slots, gfn_start, gfn_end) { @@ -6791,7 +6791,7 @@ void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen) * modifier prior to checking for a wrap of the MMIO generation so * that a wrap in any address space is detected. */ - gen &= ~((u64)KVM_ADDRESS_SPACE_NUM - 1); + gen &= ~((u64)kvm_arch_nr_memslot_as_ids(kvm) - 1); /* * The very rare case: if the MMIO generation number has wrapped, diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 824b58b44382f7..c4d17727b19956 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12456,7 +12456,7 @@ void __user * __x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, hva = slot->userspace_addr; } - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { struct kvm_userspace_memory_region2 m; m.slot = id | (i << 16); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index c3cfe08b1300a9..687589ce9f6302 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -80,8 +80,8 @@ /* Two fragments for cross MMIO pages. */ #define KVM_MAX_MMIO_FRAGMENTS 2 -#ifndef KVM_ADDRESS_SPACE_NUM -#define KVM_ADDRESS_SPACE_NUM 1 +#ifndef KVM_MAX_NR_ADDRESS_SPACES +#define KVM_MAX_NR_ADDRESS_SPACES 1 #endif /* @@ -692,7 +692,12 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm); #define KVM_MEM_SLOTS_NUM SHRT_MAX #define KVM_USER_MEM_SLOTS (KVM_MEM_SLOTS_NUM - KVM_INTERNAL_MEM_SLOTS) -#if KVM_ADDRESS_SPACE_NUM == 1 +#if KVM_MAX_NR_ADDRESS_SPACES == 1 +static inline int kvm_arch_nr_memslot_as_ids(struct kvm *kvm) +{ + return KVM_MAX_NR_ADDRESS_SPACES; +} + static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) { return 0; @@ -747,9 +752,9 @@ struct kvm { struct mm_struct *mm; /* userspace tied to this vm */ unsigned long nr_memslot_pages; /* The two memslot sets - active and inactive (per address space) */ - struct kvm_memslots __memslots[KVM_ADDRESS_SPACE_NUM][2]; + struct kvm_memslots __memslots[KVM_MAX_NR_ADDRESS_SPACES][2]; /* The current active memslot set for each address space */ - struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM]; + struct kvm_memslots __rcu *memslots[KVM_MAX_NR_ADDRESS_SPACES]; struct xarray vcpu_array; /* * Protected by slots_lock, but can be read outside if an @@ -1018,7 +1023,7 @@ void kvm_put_kvm_no_destroy(struct kvm *kvm); static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id) { - as_id = array_index_nospec(as_id, KVM_ADDRESS_SPACE_NUM); + as_id = array_index_nospec(as_id, KVM_MAX_NR_ADDRESS_SPACES); return srcu_dereference_check(kvm->memslots[as_id], &kvm->srcu, lockdep_is_held(&kvm->slots_lock) || !refcount_read(&kvm->users_count)); diff --git a/virt/kvm/dirty_ring.c b/virt/kvm/dirty_ring.c index c1cd7dfe4a9088..86d267db87bb13 100644 --- a/virt/kvm/dirty_ring.c +++ b/virt/kvm/dirty_ring.c @@ -58,7 +58,7 @@ static void kvm_reset_dirty_gfn(struct kvm *kvm, u32 slot, u64 offset, u64 mask) as_id = slot >> 16; id = (u16)slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return; memslot = id_to_memslot(__kvm_memslots(kvm, as_id), id); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 5d1a2f1b4e94a4..23633984142ff9 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -615,7 +615,7 @@ static __always_inline kvm_mn_ret_t __kvm_handle_hva_range(struct kvm *kvm, idx = srcu_read_lock(&kvm->srcu); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { struct interval_tree_node *node; slots = __kvm_memslots(kvm, i); @@ -1248,7 +1248,7 @@ static struct kvm *kvm_create_vm(unsigned long type, const char *fdname) goto out_err_no_irq_srcu; refcount_set(&kvm->users_count, 1); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { for (j = 0; j < 2; j++) { slots = &kvm->__memslots[i][j]; @@ -1398,7 +1398,7 @@ static void kvm_destroy_vm(struct kvm *kvm) #endif kvm_arch_destroy_vm(kvm); kvm_destroy_devices(kvm); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { kvm_free_memslots(kvm, &kvm->__memslots[i][0]); kvm_free_memslots(kvm, &kvm->__memslots[i][1]); } @@ -1681,7 +1681,7 @@ static void kvm_swap_active_memslots(struct kvm *kvm, int as_id) * space 0 will use generations 0, 2, 4, ... while address space 1 will * use generations 1, 3, 5, ... */ - gen += KVM_ADDRESS_SPACE_NUM; + gen += kvm_arch_nr_memslot_as_ids(kvm); kvm_arch_memslots_updated(kvm, gen); @@ -2051,7 +2051,7 @@ int __kvm_set_memory_region(struct kvm *kvm, (mem->guest_memfd_offset & (PAGE_SIZE - 1) || mem->guest_memfd_offset + mem->memory_size < mem->guest_memfd_offset)) return -EINVAL; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_MEM_SLOTS_NUM) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_MEM_SLOTS_NUM) return -EINVAL; if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr) return -EINVAL; @@ -2187,7 +2187,7 @@ int kvm_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log, as_id = log->slot >> 16; id = (u16)log->slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return -EINVAL; slots = __kvm_memslots(kvm, as_id); @@ -2249,7 +2249,7 @@ static int kvm_get_dirty_log_protect(struct kvm *kvm, struct kvm_dirty_log *log) as_id = log->slot >> 16; id = (u16)log->slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return -EINVAL; slots = __kvm_memslots(kvm, as_id); @@ -2361,7 +2361,7 @@ static int kvm_clear_dirty_log_protect(struct kvm *kvm, as_id = log->slot >> 16; id = (u16)log->slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return -EINVAL; if (log->first_page & 63) @@ -2502,7 +2502,7 @@ static __always_inline void kvm_handle_gfn_range(struct kvm *kvm, gfn_range.only_private = false; gfn_range.only_shared = false; - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { slots = __kvm_memslots(kvm, i); kvm_for_each_memslot_in_gfn_range(&iter, slots, range->start, range->end) { @@ -4857,9 +4857,11 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) case KVM_CAP_IRQ_ROUTING: return KVM_MAX_IRQ_ROUTES; #endif -#if KVM_ADDRESS_SPACE_NUM > 1 +#if KVM_MAX_NR_ADDRESS_SPACES > 1 case KVM_CAP_MULTI_ADDRESS_SPACE: - return KVM_ADDRESS_SPACE_NUM; + if (kvm) + return kvm_arch_nr_memslot_as_ids(kvm); + return KVM_MAX_NR_ADDRESS_SPACES; #endif case KVM_CAP_NR_MEMSLOTS: return KVM_USER_MEM_SLOTS; @@ -4967,7 +4969,7 @@ bool kvm_are_all_memslots_empty(struct kvm *kvm) lockdep_assert_held(&kvm->slots_lock); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { if (!kvm_memslots_empty(__kvm_memslots(kvm, i))) return false; } From 7e63404f9cd5d108041c117c9704dedb4cb2b6c2 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:19 -0700 Subject: [PATCH 453/515] KVM: x86: Add support for "protected VMs" that can utilize private memory Add a new x86 VM type, KVM_X86_SW_PROTECTED_VM, to serve as a development and testing vehicle for Confidential (CoCo) VMs, and potentially to even become a "real" product in the distant future, e.g. a la pKVM. The private memory support in KVM x86 is aimed at AMD's SEV-SNP and Intel's TDX, but those technologies are extremely complex (understatement), difficult to debug, don't support running as nested guests, and require hardware that's isn't universally accessible. I.e. relying SEV-SNP or TDX for maintaining guest private memory isn't a realistic option. At the very least, KVM_X86_SW_PROTECTED_VM will enable a variety of selftests for guest_memfd and private memory support without requiring unique hardware. Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 32 ++++++++++++++++++++++++++++++++ arch/x86/include/asm/kvm_host.h | 15 +++++++++------ arch/x86/include/uapi/asm/kvm.h | 3 +++ arch/x86/kvm/Kconfig | 12 ++++++++++++ arch/x86/kvm/mmu/mmu_internal.h | 1 + arch/x86/kvm/x86.c | 16 +++++++++++++++- include/uapi/linux/kvm.h | 1 + virt/kvm/Kconfig | 5 +++++ 8 files changed, 78 insertions(+), 7 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 38dc1fda4f4597..00029436ac5bc1 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -147,10 +147,29 @@ described as 'basic' will be available. The new VM has no virtual cpus and no memory. You probably want to use 0 as machine type. +X86: +^^^^ + +Supported X86 VM types can be queried via KVM_CAP_VM_TYPES. + +S390: +^^^^^ + In order to create user controlled virtual machines on S390, check KVM_CAP_S390_UCONTROL and use the flag KVM_VM_S390_UCONTROL as privileged user (CAP_SYS_ADMIN). +MIPS: +^^^^^ + +To use hardware assisted virtualization on MIPS (VZ ASE) rather than +the default trap & emulate implementation (which changes the virtual +memory layout to fit in user mode), check KVM_CAP_MIPS_VZ and use the +flag KVM_VM_MIPS_VZ. + +ARM64: +^^^^^^ + On arm64, the physical address size for a VM (IPA Size limit) is limited to 40bits by default. The limit can be configured if the host supports the extension KVM_CAP_ARM_VM_IPA_SIZE. When supported, use @@ -8650,6 +8669,19 @@ block sizes is exposed in KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES as a 64-bit bitmap (each bit describing a block size). The default value is 0, to disable the eager page splitting. +8.41 KVM_CAP_VM_TYPES +--------------------- + +:Capability: KVM_CAP_MEMORY_ATTRIBUTES +:Architectures: x86 +:Type: system ioctl + +This capability returns a bitmap of support VM types. The 1-setting of bit @n +means the VM type with value @n is supported. Possible values of @n are:: + + #define KVM_X86_DEFAULT_VM 0 + #define KVM_X86_SW_PROTECTED_VM 1 + 9. Known KVM API problems ========================= diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index f9e8d56420697f..dff10051e9b63c 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1244,6 +1244,7 @@ enum kvm_apicv_inhibit { }; struct kvm_arch { + unsigned long vm_type; unsigned long n_used_mmu_pages; unsigned long n_requested_mmu_pages; unsigned long n_max_mmu_pages; @@ -2077,6 +2078,12 @@ void kvm_mmu_new_pgd(struct kvm_vcpu *vcpu, gpa_t new_pgd); void kvm_configure_mmu(bool enable_tdp, int tdp_forced_root_level, int tdp_max_root_level, int tdp_huge_page_level); +#ifdef CONFIG_KVM_PRIVATE_MEM +#define kvm_arch_has_private_mem(kvm) ((kvm)->arch.vm_type != KVM_X86_DEFAULT_VM) +#else +#define kvm_arch_has_private_mem(kvm) false +#endif + static inline u16 kvm_read_ldt(void) { u16 ldt; @@ -2125,14 +2132,10 @@ enum { #define HF_SMM_INSIDE_NMI_MASK (1 << 2) # define KVM_MAX_NR_ADDRESS_SPACES 2 +/* SMM is currently unsupported for guests with private memory. */ +# define kvm_arch_nr_memslot_as_ids(kvm) (kvm_arch_has_private_mem(kvm) ? 1 : 2) # define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) - -static inline int kvm_arch_nr_memslot_as_ids(struct kvm *kvm) -{ - return KVM_MAX_NR_ADDRESS_SPACES; -} - #else # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, 0) #endif diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h index 1a6a1f98794967..a448d0964fc06e 100644 --- a/arch/x86/include/uapi/asm/kvm.h +++ b/arch/x86/include/uapi/asm/kvm.h @@ -562,4 +562,7 @@ struct kvm_pmu_event_filter { /* x86-specific KVM_EXIT_HYPERCALL flags. */ #define KVM_EXIT_HYPERCALL_LONG_MODE BIT(0) +#define KVM_X86_DEFAULT_VM 0 +#define KVM_X86_SW_PROTECTED_VM 1 + #endif /* _ASM_X86_KVM_H */ diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 091b74599c2275..8452ed0228cb6b 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -77,6 +77,18 @@ config KVM_WERROR If in doubt, say "N". +config KVM_SW_PROTECTED_VM + bool "Enable support for KVM software-protected VMs" + depends on EXPERT + depends on X86_64 + select KVM_GENERIC_PRIVATE_MEM + help + Enable support for KVM software-protected VMs. Currently "protected" + means the VM can be backed with memory provided by + KVM_CREATE_GUEST_MEMFD. + + If unsure, say "N". + config KVM_INTEL tristate "KVM for Intel (and compatible) processors support" depends on KVM && IA32_FEAT_CTL diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h index 86c7cb69278671..b66a7d47e0e4ef 100644 --- a/arch/x86/kvm/mmu/mmu_internal.h +++ b/arch/x86/kvm/mmu/mmu_internal.h @@ -297,6 +297,7 @@ static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, .max_level = KVM_MAX_HUGEPAGE_LEVEL, .req_level = PG_LEVEL_4K, .goal_level = PG_LEVEL_4K, + .is_private = kvm_mem_is_private(vcpu->kvm, cr2_or_gpa >> PAGE_SHIFT), }; int r; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index c4d17727b19956..e3eb608b6692c7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4441,6 +4441,13 @@ static int kvm_ioctl_get_supported_hv_cpuid(struct kvm_vcpu *vcpu, return 0; } +static bool kvm_is_vm_type_supported(unsigned long type) +{ + return type == KVM_X86_DEFAULT_VM || + (type == KVM_X86_SW_PROTECTED_VM && + IS_ENABLED(CONFIG_KVM_SW_PROTECTED_VM) && tdp_enabled); +} + int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) { int r = 0; @@ -4632,6 +4639,11 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_X86_NOTIFY_VMEXIT: r = kvm_caps.has_notify_vmexit; break; + case KVM_CAP_VM_TYPES: + r = BIT(KVM_X86_DEFAULT_VM); + if (kvm_is_vm_type_supported(KVM_X86_SW_PROTECTED_VM)) + r |= BIT(KVM_X86_SW_PROTECTED_VM); + break; default: break; } @@ -12314,9 +12326,11 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) int ret; unsigned long flags; - if (type) + if (!kvm_is_vm_type_supported(type)) return -EINVAL; + kvm->arch.vm_type = type; + ret = kvm_page_track_init(kvm); if (ret) goto out; diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 29e9eb51dec93d..5b5820d19e7191 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1218,6 +1218,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_MEMORY_FAULT_INFO 231 #define KVM_CAP_MEMORY_ATTRIBUTES 232 #define KVM_CAP_GUEST_MEMFD 233 +#define KVM_CAP_VM_TYPES 234 #ifdef KVM_CAP_IRQ_ROUTING diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 08afef022db9f9..2c964586aa14e8 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -104,3 +104,8 @@ config KVM_GENERIC_MEMORY_ATTRIBUTES config KVM_PRIVATE_MEM select XARRAY_MULTI bool + +config KVM_GENERIC_PRIVATE_MEM + select KVM_GENERIC_MEMORY_ATTRIBUTES + select KVM_PRIVATE_MEM + bool From c49e17c246ad30c25365e47bfc3aca6826ff89df Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:20 -0700 Subject: [PATCH 454/515] KVM: selftests: Drop unused kvm_userspace_memory_region_find() helper Drop kvm_userspace_memory_region_find(), it's unused and a terrible API (probably why it's unused). If anything outside of kvm_util.c needs to get at the memslot, userspace_mem_region_find() can be exposed to give others full access to all memory region/slot information. Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 4 --- tools/testing/selftests/kvm/lib/kvm_util.c | 29 ------------------- 2 files changed, 33 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index a18db6a7b3cf47..967eaaeacd756e 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -776,10 +776,6 @@ vm_adjust_num_guest_pages(enum vm_guest_mode mode, unsigned int num_guest_pages) return n; } -struct kvm_userspace_memory_region * -kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start, - uint64_t end); - #define sync_global_to_guest(vm, g) ({ \ typeof(g) *_p = addr_gva2hva(vm, (vm_vaddr_t)&(g)); \ memcpy(_p, &(g), sizeof(g)); \ diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 7a8af1821f5dae..f09295d56c2361 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -590,35 +590,6 @@ userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end) return NULL; } -/* - * KVM Userspace Memory Region Find - * - * Input Args: - * vm - Virtual Machine - * start - Starting VM physical address - * end - Ending VM physical address, inclusive. - * - * Output Args: None - * - * Return: - * Pointer to overlapping region, NULL if no such region. - * - * Public interface to userspace_mem_region_find. Allows tests to look up - * the memslot datastructure for a given range of guest physical memory. - */ -struct kvm_userspace_memory_region * -kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start, - uint64_t end) -{ - struct userspace_mem_region *region; - - region = userspace_mem_region_find(vm, start, end); - if (!region) - return NULL; - - return ®ion->region; -} - __weak void vcpu_arch_free(struct kvm_vcpu *vcpu) { From afb179d0bc2755d30291fd546e65a36a03b4bb1c Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:21 -0700 Subject: [PATCH 455/515] KVM: selftests: Convert lib's mem regions to KVM_SET_USER_MEMORY_REGION2 Use KVM_SET_USER_MEMORY_REGION2 throughout KVM's selftests library so that support for guest private memory can be added without needing an entirely separate set of helpers. Note, this obviously makes selftests backwards-incompatible with older KVM versions from this point forward. Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 2 +- tools/testing/selftests/kvm/lib/kvm_util.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 967eaaeacd756e..9f144841c2ee86 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -44,7 +44,7 @@ typedef uint64_t vm_paddr_t; /* Virtual Machine (Guest) physical address */ typedef uint64_t vm_vaddr_t; /* Virtual Machine (Guest) virtual address */ struct userspace_mem_region { - struct kvm_userspace_memory_region region; + struct kvm_userspace_memory_region2 region; struct sparsebit *unused_phy_pages; int fd; off_t offset; diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index f09295d56c2361..3676b37bea38d1 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -453,8 +453,9 @@ void kvm_vm_restart(struct kvm_vm *vmp) vm_create_irqchip(vmp); hash_for_each(vmp->regions.slot_hash, ctr, region, slot_node) { - int ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region); - TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n" + int ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION2, ®ion->region); + + TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i\n" " slot: %u flags: 0x%x\n" " guest_phys_addr: 0x%llx size: 0x%llx", @@ -657,7 +658,7 @@ static void __vm_mem_region_delete(struct kvm_vm *vm, } region->region.memory_size = 0; - vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); + vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); sparsebit_free(®ion->unused_phy_pages); ret = munmap(region->mmap_start, region->mmap_size); @@ -1014,8 +1015,8 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, region->region.guest_phys_addr = guest_paddr; region->region.memory_size = npages * vm->page_size; region->region.userspace_addr = (uintptr_t) region->host_mem; - ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); - TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n" + ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); + TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i\n" " slot: %u flags: 0x%x\n" " guest_phys_addr: 0x%lx size: 0x%lx", @@ -1097,9 +1098,9 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags) region->region.flags = flags; - ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); + ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); - TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n" + TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i slot: %u flags: 0x%x", ret, errno, slot, flags); } @@ -1127,9 +1128,9 @@ void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa) region->region.guest_phys_addr = new_gpa; - ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); + ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); - TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed\n" + TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION2 failed\n" "ret: %i errno: %i slot: %u new_gpa: 0x%lx", ret, errno, slot, new_gpa); } From dded709e952606a7ad31e098c8d33389b3cef32d Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:22 -0700 Subject: [PATCH 456/515] KVM: selftests: Add support for creating private memslots Add support for creating "private" memslots via KVM_CREATE_GUEST_MEMFD and KVM_SET_USER_MEMORY_REGION2. Make vm_userspace_mem_region_add() a wrapper to its effective replacement, vm_mem_add(), so that private memslots are fully opt-in, i.e. don't require update all tests that add memory regions. Pivot on the KVM_MEM_PRIVATE flag instead of the validity of the "gmem" file descriptor so that simple tests can let vm_mem_add() do the heavy lifting of creating the guest memfd, but also allow the caller to pass in an explicit fd+offset so that fancier tests can do things like back multiple memslots with a single file. If the caller passes in a fd, dup() the fd so that (a) __vm_mem_region_delete() can close the fd associated with the memory region without needing yet another flag, and (b) so that the caller can safely close its copy of the fd without having to first destroy memslots. Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 23 +++++ .../testing/selftests/kvm/include/test_util.h | 5 ++ tools/testing/selftests/kvm/lib/kvm_util.c | 85 ++++++++++++------- 3 files changed, 82 insertions(+), 31 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 9f144841c2ee86..9f861182c02a84 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -431,6 +431,26 @@ static inline uint64_t vm_get_stat(struct kvm_vm *vm, const char *stat_name) void vm_create_irqchip(struct kvm_vm *vm); +static inline int __vm_create_guest_memfd(struct kvm_vm *vm, uint64_t size, + uint64_t flags) +{ + struct kvm_create_guest_memfd guest_memfd = { + .size = size, + .flags = flags, + }; + + return __vm_ioctl(vm, KVM_CREATE_GUEST_MEMFD, &guest_memfd); +} + +static inline int vm_create_guest_memfd(struct kvm_vm *vm, uint64_t size, + uint64_t flags) +{ + int fd = __vm_create_guest_memfd(vm, size, flags); + + TEST_ASSERT(fd >= 0, KVM_IOCTL_ERROR(KVM_CREATE_GUEST_MEMFD, fd)); + return fd; +} + void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, uint64_t gpa, uint64_t size, void *hva); int __vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, @@ -439,6 +459,9 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t guest_paddr, uint32_t slot, uint64_t npages, uint32_t flags); +void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, + uint64_t guest_paddr, uint32_t slot, uint64_t npages, + uint32_t flags, int guest_memfd_fd, uint64_t guest_memfd_offset); void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags); void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa); diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h index 7e614adc6cf477..7257f2243ab9f1 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -142,6 +142,11 @@ static inline bool backing_src_is_shared(enum vm_mem_backing_src_type t) return vm_mem_backing_src_alias(t)->flag & MAP_SHARED; } +static inline bool backing_src_can_be_huge(enum vm_mem_backing_src_type t) +{ + return t != VM_MEM_SRC_ANONYMOUS && t != VM_MEM_SRC_SHMEM; +} + /* Aligns x up to the next multiple of size. Size must be a power of 2. */ static inline uint64_t align_up(uint64_t x, uint64_t size) { diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 3676b37bea38d1..45050f54701a01 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -669,6 +669,8 @@ static void __vm_mem_region_delete(struct kvm_vm *vm, TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); close(region->fd); } + if (region->region.guest_memfd >= 0) + close(region->region.guest_memfd); free(region); } @@ -870,36 +872,15 @@ void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, errno, strerror(errno)); } -/* - * VM Userspace Memory Region Add - * - * Input Args: - * vm - Virtual Machine - * src_type - Storage source for this region. - * NULL to use anonymous memory. - * guest_paddr - Starting guest physical address - * slot - KVM region slot - * npages - Number of physical pages - * flags - KVM memory region flags (e.g. KVM_MEM_LOG_DIRTY_PAGES) - * - * Output Args: None - * - * Return: None - * - * Allocates a memory area of the number of pages specified by npages - * and maps it to the VM specified by vm, at a starting physical address - * given by guest_paddr. The region is created with a KVM region slot - * given by slot, which must be unique and < KVM_MEM_SLOTS_NUM. The - * region is created with the flags given by flags. - */ -void vm_userspace_mem_region_add(struct kvm_vm *vm, - enum vm_mem_backing_src_type src_type, - uint64_t guest_paddr, uint32_t slot, uint64_t npages, - uint32_t flags) +/* FIXME: This thing needs to be ripped apart and rewritten. */ +void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, + uint64_t guest_paddr, uint32_t slot, uint64_t npages, + uint32_t flags, int guest_memfd, uint64_t guest_memfd_offset) { int ret; struct userspace_mem_region *region; size_t backing_src_pagesz = get_backing_src_pagesz(src_type); + size_t mem_size = npages * vm->page_size; size_t alignment; TEST_ASSERT(vm_adjust_num_guest_pages(vm->mode, npages) == npages, @@ -952,7 +933,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, /* Allocate and initialize new mem region structure. */ region = calloc(1, sizeof(*region)); TEST_ASSERT(region != NULL, "Insufficient Memory"); - region->mmap_size = npages * vm->page_size; + region->mmap_size = mem_size; #ifdef __s390x__ /* On s390x, the host address must be aligned to 1M (due to PGSTEs) */ @@ -999,14 +980,47 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, /* As needed perform madvise */ if ((src_type == VM_MEM_SRC_ANONYMOUS || src_type == VM_MEM_SRC_ANONYMOUS_THP) && thp_configured()) { - ret = madvise(region->host_mem, npages * vm->page_size, + ret = madvise(region->host_mem, mem_size, src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE); TEST_ASSERT(ret == 0, "madvise failed, addr: %p length: 0x%lx src_type: %s", - region->host_mem, npages * vm->page_size, + region->host_mem, mem_size, vm_mem_backing_src_alias(src_type)->name); } region->backing_src_type = src_type; + + if (flags & KVM_MEM_PRIVATE) { + if (guest_memfd < 0) { + uint32_t guest_memfd_flags = 0; + + /* + * Allow hugepages for the guest memfd backing if the + * "normal" backing is allowed/required to be huge. + */ + if (src_type != VM_MEM_SRC_ANONYMOUS && + src_type != VM_MEM_SRC_SHMEM) + guest_memfd_flags |= KVM_GUEST_MEMFD_ALLOW_HUGEPAGE; + + TEST_ASSERT(!guest_memfd_offset, + "Offset must be zero when creating new guest_memfd"); + guest_memfd = vm_create_guest_memfd(vm, mem_size, guest_memfd_flags); + } else { + /* + * Install a unique fd for each memslot so that the fd + * can be closed when the region is deleted without + * needing to track if the fd is owned by the framework + * or by the caller. + */ + guest_memfd = dup(guest_memfd); + TEST_ASSERT(guest_memfd >= 0, __KVM_SYSCALL_ERROR("dup()", guest_memfd)); + } + + region->region.guest_memfd = guest_memfd; + region->region.guest_memfd_offset = guest_memfd_offset; + } else { + region->region.guest_memfd = -1; + } + region->unused_phy_pages = sparsebit_alloc(); sparsebit_set_num(region->unused_phy_pages, guest_paddr >> vm->page_shift, npages); @@ -1019,9 +1033,10 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i\n" " slot: %u flags: 0x%x\n" - " guest_phys_addr: 0x%lx size: 0x%lx", + " guest_phys_addr: 0x%lx size: 0x%lx guest_memfd: %d\n", ret, errno, slot, flags, - guest_paddr, (uint64_t) region->region.memory_size); + guest_paddr, (uint64_t) region->region.memory_size, + region->region.guest_memfd); /* Add to quick lookup data structures */ vm_userspace_mem_region_gpa_insert(&vm->regions.gpa_tree, region); @@ -1042,6 +1057,14 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, } } +void vm_userspace_mem_region_add(struct kvm_vm *vm, + enum vm_mem_backing_src_type src_type, + uint64_t guest_paddr, uint32_t slot, + uint64_t npages, uint32_t flags) +{ + vm_mem_add(vm, src_type, guest_paddr, slot, npages, flags, -1, 0); +} + /* * Memslot to region * From 5d8d654efe631988da34f8c41d50396dea24835e Mon Sep 17 00:00:00 2001 From: Vishal Annapurve Date: Wed, 13 Sep 2023 18:55:23 -0700 Subject: [PATCH 457/515] KVM: selftests: Add helpers to convert guest memory b/w private and shared Add helpers to convert memory between private and shared via KVM's memory attributes, as well as helpers to free/allocate guest_memfd memory via fallocate(). Userspace, i.e. tests, is NOT required to do fallocate() when converting memory, as the attributes are the single source of true. Provide allocate() helpers so that tests can mimic a userspace that frees private memory on conversion, e.g. to prioritize memory usage over performance. Signed-off-by: Vishal Annapurve Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 48 +++++++++++++++++++ tools/testing/selftests/kvm/lib/kvm_util.c | 28 +++++++++++ 2 files changed, 76 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 9f861182c02a84..1441fca6c273d4 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -333,6 +333,54 @@ static inline void vm_enable_cap(struct kvm_vm *vm, uint32_t cap, uint64_t arg0) vm_ioctl(vm, KVM_ENABLE_CAP, &enable_cap); } +static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa, + uint64_t size, uint64_t attributes) +{ + struct kvm_memory_attributes attr = { + .attributes = attributes, + .address = gpa, + .size = size, + .flags = 0, + }; + + /* + * KVM_SET_MEMORY_ATTRIBUTES overwrites _all_ attributes. These flows + * need significant enhancements to support multiple attributes. + */ + TEST_ASSERT(!attributes || attributes == KVM_MEMORY_ATTRIBUTE_PRIVATE, + "Update me to support multiple attributes!"); + + vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES, &attr); +} + + +static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE); +} + +static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_set_memory_attributes(vm, gpa, size, 0); +} + +void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, + bool punch_hole); + +static inline void vm_guest_mem_punch_hole(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_guest_mem_fallocate(vm, gpa, size, true); +} + +static inline void vm_guest_mem_allocate(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_guest_mem_fallocate(vm, gpa, size, false); +} + void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size); const char *vm_guest_mode_string(uint32_t i); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 45050f54701a01..a140aee8d0f50e 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1176,6 +1176,34 @@ void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot) __vm_mem_region_delete(vm, memslot2region(vm, slot), true); } +void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t base, uint64_t size, + bool punch_hole) +{ + const int mode = FALLOC_FL_KEEP_SIZE | (punch_hole ? FALLOC_FL_PUNCH_HOLE : 0); + struct userspace_mem_region *region; + uint64_t end = base + size; + uint64_t gpa, len; + off_t fd_offset; + int ret; + + for (gpa = base; gpa < end; gpa += len) { + uint64_t offset; + + region = userspace_mem_region_find(vm, gpa, gpa); + TEST_ASSERT(region && region->region.flags & KVM_MEM_PRIVATE, + "Private memory region not found for GPA 0x%lx", gpa); + + offset = (gpa - region->region.guest_phys_addr); + fd_offset = region->region.guest_memfd_offset + offset; + len = min_t(uint64_t, end - gpa, region->region.memory_size - offset); + + ret = fallocate(region->region.guest_memfd, mode, fd_offset, len); + TEST_ASSERT(!ret, "fallocate() failed to %s at %lx (len = %lu), fd = %d, mode = %x, offset = %lx\n", + punch_hole ? "punch hole" : "allocate", gpa, len, + region->region.guest_memfd, mode, fd_offset); + } +} + /* Returns the size of a vCPU's kvm_run structure. */ static int vcpu_mmap_sz(void) { From ab7f19846bb46647298a446663ede7b9c073f8a9 Mon Sep 17 00:00:00 2001 From: Vishal Annapurve Date: Wed, 13 Sep 2023 18:55:24 -0700 Subject: [PATCH 458/515] KVM: selftests: Add helpers to do KVM_HC_MAP_GPA_RANGE hypercalls (x86) Add helpers for x86 guests to invoke the KVM_HC_MAP_GPA_RANGE hypercall, which KVM will forward to userspace and thus can be used by tests to coordinate private<=>shared conversions between host userspace code and guest code. Signed-off-by: Vishal Annapurve [sean: drop shared/private helpers (let tests specify flags)] Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/x86_64/processor.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 25bc61dac5fbe6..a84863503fcb46 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -15,6 +15,7 @@ #include #include +#include #include #include "../kvm_util.h" @@ -1194,6 +1195,20 @@ uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t __xen_hypercall(uint64_t nr, uint64_t a0, void *a1); void xen_hypercall(uint64_t nr, uint64_t a0, void *a1); +static inline uint64_t __kvm_hypercall_map_gpa_range(uint64_t gpa, + uint64_t size, uint64_t flags) +{ + return kvm_hypercall(KVM_HC_MAP_GPA_RANGE, gpa, size >> PAGE_SHIFT, flags, 0); +} + +static inline void kvm_hypercall_map_gpa_range(uint64_t gpa, uint64_t size, + uint64_t flags) +{ + uint64_t ret = __kvm_hypercall_map_gpa_range(gpa, size, flags); + + GUEST_ASSERT(!ret); +} + void __vm_xsave_require_permission(uint64_t xfeature, const char *name); #define vm_xsave_require_permission(xfeature) \ From faa3524a967667fc811c23665fba5deda330a716 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:25 -0700 Subject: [PATCH 459/515] KVM: selftests: Introduce VM "shape" to allow tests to specify the VM type Add a "vm_shape" structure to encapsulate the selftests-defined "mode", along with the KVM-defined "type" for use when creating a new VM. "mode" tracks physical and virtual address properties, as well as the preferred backing memory type, while "type" corresponds to the VM type. Taking the VM type will allow adding tests for KVM_CREATE_GUEST_MEMFD, a.k.a. guest private memory, without needing an entirely separate set of helpers. Guest private memory is effectively usable only by confidential VM types, and it's expected that x86 will double down and require unique VM types for TDX and SNP guests. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 2 +- .../selftests/kvm/include/kvm_util_base.h | 54 +++++++++++++++---- .../selftests/kvm/kvm_page_table_test.c | 2 +- tools/testing/selftests/kvm/lib/kvm_util.c | 43 +++++++-------- tools/testing/selftests/kvm/lib/memstress.c | 3 +- .../kvm/x86_64/ucna_injection_test.c | 2 +- 6 files changed, 72 insertions(+), 34 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 936f3a8d1b83e8..6cbecf4997676f 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -699,7 +699,7 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, struct kvm_vcpu **vcpu, pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode)); - vm = __vm_create(mode, 1, extra_mem_pages); + vm = __vm_create(VM_SHAPE(mode), 1, extra_mem_pages); log_mode_create_vm_done(vm); *vcpu = vm_vcpu_add(vm, 0, guest_code); diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 1441fca6c273d4..157508c071f3c2 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -188,6 +188,23 @@ enum vm_guest_mode { NUM_VM_MODES, }; +struct vm_shape { + enum vm_guest_mode mode; + unsigned int type; +}; + +#define VM_TYPE_DEFAULT 0 + +#define VM_SHAPE(__mode) \ +({ \ + struct vm_shape shape = { \ + .mode = (__mode), \ + .type = VM_TYPE_DEFAULT \ + }; \ + \ + shape; \ +}) + #if defined(__aarch64__) extern enum vm_guest_mode vm_mode_default; @@ -220,6 +237,8 @@ extern enum vm_guest_mode vm_mode_default; #endif +#define VM_SHAPE_DEFAULT VM_SHAPE(VM_MODE_DEFAULT) + #define MIN_PAGE_SIZE (1U << MIN_PAGE_SHIFT) #define PTES_PER_MIN_PAGE ptes_per_page(MIN_PAGE_SIZE) @@ -784,21 +803,21 @@ vm_paddr_t vm_alloc_page_table(struct kvm_vm *vm); * __vm_create() does NOT create vCPUs, @nr_runnable_vcpus is used purely to * calculate the amount of memory needed for per-vCPU data, e.g. stacks. */ -struct kvm_vm *____vm_create(enum vm_guest_mode mode); -struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint32_t nr_runnable_vcpus, +struct kvm_vm *____vm_create(struct vm_shape shape); +struct kvm_vm *__vm_create(struct vm_shape shape, uint32_t nr_runnable_vcpus, uint64_t nr_extra_pages); static inline struct kvm_vm *vm_create_barebones(void) { - return ____vm_create(VM_MODE_DEFAULT); + return ____vm_create(VM_SHAPE_DEFAULT); } static inline struct kvm_vm *vm_create(uint32_t nr_runnable_vcpus) { - return __vm_create(VM_MODE_DEFAULT, nr_runnable_vcpus, 0); + return __vm_create(VM_SHAPE_DEFAULT, nr_runnable_vcpus, 0); } -struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus, +struct kvm_vm *__vm_create_with_vcpus(struct vm_shape shape, uint32_t nr_vcpus, uint64_t extra_mem_pages, void *guest_code, struct kvm_vcpu *vcpus[]); @@ -806,17 +825,27 @@ static inline struct kvm_vm *vm_create_with_vcpus(uint32_t nr_vcpus, void *guest_code, struct kvm_vcpu *vcpus[]) { - return __vm_create_with_vcpus(VM_MODE_DEFAULT, nr_vcpus, 0, + return __vm_create_with_vcpus(VM_SHAPE_DEFAULT, nr_vcpus, 0, guest_code, vcpus); } + +struct kvm_vm *__vm_create_shape_with_one_vcpu(struct vm_shape shape, + struct kvm_vcpu **vcpu, + uint64_t extra_mem_pages, + void *guest_code); + /* * Create a VM with a single vCPU with reasonable defaults and @extra_mem_pages * additional pages of guest memory. Returns the VM and vCPU (via out param). */ -struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, - uint64_t extra_mem_pages, - void *guest_code); +static inline struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, + uint64_t extra_mem_pages, + void *guest_code) +{ + return __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, vcpu, + extra_mem_pages, guest_code); +} static inline struct kvm_vm *vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, void *guest_code) @@ -824,6 +853,13 @@ static inline struct kvm_vm *vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, return __vm_create_with_one_vcpu(vcpu, 0, guest_code); } +static inline struct kvm_vm *vm_create_shape_with_one_vcpu(struct vm_shape shape, + struct kvm_vcpu **vcpu, + void *guest_code) +{ + return __vm_create_shape_with_one_vcpu(shape, vcpu, 0, guest_code); +} + struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm); void kvm_pin_this_task_to_pcpu(uint32_t pcpu); diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c index 69f26d80c8216e..e37dc9c21888f4 100644 --- a/tools/testing/selftests/kvm/kvm_page_table_test.c +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c @@ -254,7 +254,7 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg) /* Create a VM with enough guest pages */ guest_num_pages = test_mem_size / guest_page_size; - vm = __vm_create_with_vcpus(mode, nr_vcpus, guest_num_pages, + vm = __vm_create_with_vcpus(VM_SHAPE(mode), nr_vcpus, guest_num_pages, guest_code, test_args.vcpus); /* Align down GPA of the testing memslot */ diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index a140aee8d0f50e..52b131e3aca538 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -209,7 +209,7 @@ __weak void vm_vaddr_populate_bitmap(struct kvm_vm *vm) (1ULL << (vm->va_bits - 1)) >> vm->page_shift); } -struct kvm_vm *____vm_create(enum vm_guest_mode mode) +struct kvm_vm *____vm_create(struct vm_shape shape) { struct kvm_vm *vm; @@ -221,13 +221,13 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode) vm->regions.hva_tree = RB_ROOT; hash_init(vm->regions.slot_hash); - vm->mode = mode; - vm->type = 0; + vm->mode = shape.mode; + vm->type = shape.type; - vm->pa_bits = vm_guest_mode_params[mode].pa_bits; - vm->va_bits = vm_guest_mode_params[mode].va_bits; - vm->page_size = vm_guest_mode_params[mode].page_size; - vm->page_shift = vm_guest_mode_params[mode].page_shift; + vm->pa_bits = vm_guest_mode_params[vm->mode].pa_bits; + vm->va_bits = vm_guest_mode_params[vm->mode].va_bits; + vm->page_size = vm_guest_mode_params[vm->mode].page_size; + vm->page_shift = vm_guest_mode_params[vm->mode].page_shift; /* Setup mode specific traits. */ switch (vm->mode) { @@ -265,7 +265,7 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode) /* * Ignore KVM support for 5-level paging (vm->va_bits == 57), * it doesn't take effect unless a CR4.LA57 is set, which it - * isn't for this VM_MODE. + * isn't for this mode (48-bit virtual address space). */ TEST_ASSERT(vm->va_bits == 48 || vm->va_bits == 57, "Linear address width (%d bits) not supported", @@ -285,10 +285,11 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode) vm->pgtable_levels = 5; break; default: - TEST_FAIL("Unknown guest mode, mode: 0x%x", mode); + TEST_FAIL("Unknown guest mode: 0x%x", vm->mode); } #ifdef __aarch64__ + TEST_ASSERT(!vm->type, "ARM doesn't support test-provided types"); if (vm->pa_bits != 40) vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits); #endif @@ -347,19 +348,19 @@ static uint64_t vm_nr_pages_required(enum vm_guest_mode mode, return vm_adjust_num_guest_pages(mode, nr_pages); } -struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint32_t nr_runnable_vcpus, +struct kvm_vm *__vm_create(struct vm_shape shape, uint32_t nr_runnable_vcpus, uint64_t nr_extra_pages) { - uint64_t nr_pages = vm_nr_pages_required(mode, nr_runnable_vcpus, + uint64_t nr_pages = vm_nr_pages_required(shape.mode, nr_runnable_vcpus, nr_extra_pages); struct userspace_mem_region *slot0; struct kvm_vm *vm; int i; - pr_debug("%s: mode='%s' pages='%ld'\n", __func__, - vm_guest_mode_string(mode), nr_pages); + pr_debug("%s: mode='%s' type='%d', pages='%ld'\n", __func__, + vm_guest_mode_string(shape.mode), shape.type, nr_pages); - vm = ____vm_create(mode); + vm = ____vm_create(shape); vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, 0); for (i = 0; i < NR_MEM_REGIONS; i++) @@ -400,7 +401,7 @@ struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint32_t nr_runnable_vcpus, * extra_mem_pages is only used to calculate the maximum page table size, * no real memory allocation for non-slot0 memory in this function. */ -struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus, +struct kvm_vm *__vm_create_with_vcpus(struct vm_shape shape, uint32_t nr_vcpus, uint64_t extra_mem_pages, void *guest_code, struct kvm_vcpu *vcpus[]) { @@ -409,7 +410,7 @@ struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus TEST_ASSERT(!nr_vcpus || vcpus, "Must provide vCPU array"); - vm = __vm_create(mode, nr_vcpus, extra_mem_pages); + vm = __vm_create(shape, nr_vcpus, extra_mem_pages); for (i = 0; i < nr_vcpus; ++i) vcpus[i] = vm_vcpu_add(vm, i, guest_code); @@ -417,15 +418,15 @@ struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus return vm; } -struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, - uint64_t extra_mem_pages, - void *guest_code) +struct kvm_vm *__vm_create_shape_with_one_vcpu(struct vm_shape shape, + struct kvm_vcpu **vcpu, + uint64_t extra_mem_pages, + void *guest_code) { struct kvm_vcpu *vcpus[1]; struct kvm_vm *vm; - vm = __vm_create_with_vcpus(VM_MODE_DEFAULT, 1, extra_mem_pages, - guest_code, vcpus); + vm = __vm_create_with_vcpus(shape, 1, extra_mem_pages, guest_code, vcpus); *vcpu = vcpus[0]; return vm; diff --git a/tools/testing/selftests/kvm/lib/memstress.c b/tools/testing/selftests/kvm/lib/memstress.c index df457452d1464f..d05487e5a371df 100644 --- a/tools/testing/selftests/kvm/lib/memstress.c +++ b/tools/testing/selftests/kvm/lib/memstress.c @@ -168,7 +168,8 @@ struct kvm_vm *memstress_create_vm(enum vm_guest_mode mode, int nr_vcpus, * The memory is also added to memslot 0, but that's a benign side * effect as KVM allows aliasing HVAs in meslots. */ - vm = __vm_create_with_vcpus(mode, nr_vcpus, slot0_pages + guest_num_pages, + vm = __vm_create_with_vcpus(VM_SHAPE(mode), nr_vcpus, + slot0_pages + guest_num_pages, memstress_guest_code, vcpus); args->vm = vm; diff --git a/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c b/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c index 85f34ca7e49e53..0ed32ec903d035 100644 --- a/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c +++ b/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c @@ -271,7 +271,7 @@ int main(int argc, char *argv[]) kvm_check_cap(KVM_CAP_MCE); - vm = __vm_create(VM_MODE_DEFAULT, 3, 0); + vm = __vm_create(VM_SHAPE_DEFAULT, 3, 0); kvm_ioctl(vm->kvm_fd, KVM_X86_GET_MCE_CAP_SUPPORTED, &supported_mcg_caps); From c1776f5ed72fc72fa18f1d276178728c7fa8b8cb Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Wed, 13 Sep 2023 18:55:26 -0700 Subject: [PATCH 460/515] KVM: selftests: Add GUEST_SYNC[1-6] macros for synchronizing more data Add GUEST_SYNC[1-6]() so that tests can pass the maximum amount of information supported via ucall(), without needing to resort to shared memory. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/ucall_common.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h index ce33d306c2cba7..0fb472a5a05854 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -52,6 +52,17 @@ int ucall_nr_pages_required(uint64_t page_size); #define GUEST_SYNC_ARGS(stage, arg1, arg2, arg3, arg4) \ ucall(UCALL_SYNC, 6, "hello", stage, arg1, arg2, arg3, arg4) #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) +#define GUEST_SYNC1(arg0) ucall(UCALL_SYNC, 1, arg0) +#define GUEST_SYNC2(arg0, arg1) ucall(UCALL_SYNC, 2, arg0, arg1) +#define GUEST_SYNC3(arg0, arg1, arg2) \ + ucall(UCALL_SYNC, 3, arg0, arg1, arg2) +#define GUEST_SYNC4(arg0, arg1, arg2, arg3) \ + ucall(UCALL_SYNC, 4, arg0, arg1, arg2, arg3) +#define GUEST_SYNC5(arg0, arg1, arg2, arg3, arg4) \ + ucall(UCALL_SYNC, 5, arg0, arg1, arg2, arg3, arg4) +#define GUEST_SYNC6(arg0, arg1, arg2, arg3, arg4, arg5) \ + ucall(UCALL_SYNC, 6, arg0, arg1, arg2, arg3, arg4, arg5) + #define GUEST_PRINTF(_fmt, _args...) ucall_fmt(UCALL_PRINTF, _fmt, ##_args) #define GUEST_DONE() ucall(UCALL_DONE, 0) From 5e48de047a8259b9887faadab80d68c2c2fbe96f Mon Sep 17 00:00:00 2001 From: Vishal Annapurve Date: Wed, 13 Sep 2023 18:55:27 -0700 Subject: [PATCH 461/515] KVM: selftests: Add x86-only selftest for private memory conversions Add a selftest to exercise implicit/explicit conversion functionality within KVM and verify: - Shared memory is visible to host userspace - Private memory is not visible to host userspace - Host userspace and guest can communicate over shared memory - Data in shared backing is preserved across conversions (test's host userspace doesn't free the data) - Private memory is bound to the lifetime of the VM Ideally, KVM's selftests infrastructure would be reworked to allow backing a single region of guest memory with multiple memslots for _all_ backing types and shapes, i.e. ideally the code for using a single backing fd across multiple memslots would work for "regular" memory as well. But sadly, support for KVM_CREATE_GUEST_MEMFD has languished for far too long, and overhauling selftests' memslots infrastructure would likely open a can of worms, i.e. delay things even further. In addition to the more obvious tests, verify that PUNCH_HOLE actually frees memory. Directly verifying that KVM frees memory is impractical, if it's even possible, so instead indirectly verify memory is freed by asserting that the guest reads zeroes after a PUNCH_HOLE. E.g. if KVM zaps SPTEs but doesn't actually punch a hole in the inode, the subsequent read will still see the previous value. And obviously punching a hole shouldn't cause explosions. Let the user specify the number of memslots in the private mem conversion test, i.e. don't require the number of memslots to be '1' or "nr_vcpus". Creating more memslots than vCPUs is particularly interesting, e.g. it can result in a single KVM_SET_MEMORY_ATTRIBUTES spanning multiple memslots. To keep the math reasonable, align each vCPU's chunk to at least 2MiB (the size is 2MiB+4KiB), and require the total size to be cleanly divisible by the number of memslots. The goal is to be able to validate that KVM plays nice with multiple memslots, being able to create a truly arbitrary number of memslots doesn't add meaningful value, i.e. isn't worth the cost. Intentionally don't take a requirement on KVM_CAP_GUEST_MEMFD, KVM_CAP_MEMORY_FAULT_INFO, KVM_MEMORY_ATTRIBUTE_PRIVATE, etc., as it's a KVM bug to advertise KVM_X86_SW_PROTECTED_VM without its prerequisites. Signed-off-by: Vishal Annapurve Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../kvm/x86_64/private_mem_conversions_test.c | 487 ++++++++++++++++++ 2 files changed, 488 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index a3bb36fb3cfc55..b709a52d5cdbf6 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -81,6 +81,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/monitor_mwait_test TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test +TEST_GEN_PROGS_x86_64 += x86_64/private_mem_conversions_test TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test TEST_GEN_PROGS_x86_64 += x86_64/smaller_maxphyaddr_emulation_test diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c new file mode 100644 index 00000000000000..be311944e90a4b --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c @@ -0,0 +1,487 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2022, Google LLC. + */ +#define _GNU_SOURCE /* for program_invocation_short_name */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#define BASE_DATA_SLOT 10 +#define BASE_DATA_GPA ((uint64_t)(1ull << 32)) +#define PER_CPU_DATA_SIZE ((uint64_t)(SZ_2M + PAGE_SIZE)) + +/* Horrific macro so that the line info is captured accurately :-( */ +#define memcmp_g(gpa, pattern, size) \ +do { \ + uint8_t *mem = (uint8_t *)gpa; \ + size_t i; \ + \ + for (i = 0; i < size; i++) \ + __GUEST_ASSERT(mem[i] == pattern, \ + "Guest expected 0x%x at offset %lu (gpa 0x%llx), got 0x%x", \ + pattern, i, gpa + i, mem[i]); \ +} while (0) + +static void memcmp_h(uint8_t *mem, uint64_t gpa, uint8_t pattern, size_t size) +{ + size_t i; + + for (i = 0; i < size; i++) + TEST_ASSERT(mem[i] == pattern, + "Host expected 0x%x at gpa 0x%lx, got 0x%x", + pattern, gpa + i, mem[i]); +} + +/* + * Run memory conversion tests with explicit conversion: + * Execute KVM hypercall to map/unmap gpa range which will cause userspace exit + * to back/unback private memory. Subsequent accesses by guest to the gpa range + * will not cause exit to userspace. + * + * Test memory conversion scenarios with following steps: + * 1) Access private memory using private access and verify that memory contents + * are not visible to userspace. + * 2) Convert memory to shared using explicit conversions and ensure that + * userspace is able to access the shared regions. + * 3) Convert memory back to private using explicit conversions and ensure that + * userspace is again not able to access converted private regions. + */ + +#define GUEST_STAGE(o, s) { .offset = o, .size = s } + +enum ucall_syncs { + SYNC_SHARED, + SYNC_PRIVATE, +}; + +static void guest_sync_shared(uint64_t gpa, uint64_t size, + uint8_t current_pattern, uint8_t new_pattern) +{ + GUEST_SYNC5(SYNC_SHARED, gpa, size, current_pattern, new_pattern); +} + +static void guest_sync_private(uint64_t gpa, uint64_t size, uint8_t pattern) +{ + GUEST_SYNC4(SYNC_PRIVATE, gpa, size, pattern); +} + +/* Arbitrary values, KVM doesn't care about the attribute flags. */ +#define MAP_GPA_SET_ATTRIBUTES BIT(0) +#define MAP_GPA_SHARED BIT(1) +#define MAP_GPA_DO_FALLOCATE BIT(2) + +static void guest_map_mem(uint64_t gpa, uint64_t size, bool map_shared, + bool do_fallocate) +{ + uint64_t flags = MAP_GPA_SET_ATTRIBUTES; + + if (map_shared) + flags |= MAP_GPA_SHARED; + if (do_fallocate) + flags |= MAP_GPA_DO_FALLOCATE; + kvm_hypercall_map_gpa_range(gpa, size, flags); +} + +static void guest_map_shared(uint64_t gpa, uint64_t size, bool do_fallocate) +{ + guest_map_mem(gpa, size, true, do_fallocate); +} + +static void guest_map_private(uint64_t gpa, uint64_t size, bool do_fallocate) +{ + guest_map_mem(gpa, size, false, do_fallocate); +} + +struct { + uint64_t offset; + uint64_t size; +} static const test_ranges[] = { + GUEST_STAGE(0, PAGE_SIZE), + GUEST_STAGE(0, SZ_2M), + GUEST_STAGE(PAGE_SIZE, PAGE_SIZE), + GUEST_STAGE(PAGE_SIZE, SZ_2M), + GUEST_STAGE(SZ_2M, PAGE_SIZE), +}; + +static void guest_test_explicit_conversion(uint64_t base_gpa, bool do_fallocate) +{ + const uint8_t def_p = 0xaa; + const uint8_t init_p = 0xcc; + uint64_t j; + int i; + + /* Memory should be shared by default. */ + memset((void *)base_gpa, def_p, PER_CPU_DATA_SIZE); + memcmp_g(base_gpa, def_p, PER_CPU_DATA_SIZE); + guest_sync_shared(base_gpa, PER_CPU_DATA_SIZE, def_p, init_p); + + memcmp_g(base_gpa, init_p, PER_CPU_DATA_SIZE); + + for (i = 0; i < ARRAY_SIZE(test_ranges); i++) { + uint64_t gpa = base_gpa + test_ranges[i].offset; + uint64_t size = test_ranges[i].size; + uint8_t p1 = 0x11; + uint8_t p2 = 0x22; + uint8_t p3 = 0x33; + uint8_t p4 = 0x44; + + /* + * Set the test region to pattern one to differentiate it from + * the data range as a whole (contains the initial pattern). + */ + memset((void *)gpa, p1, size); + + /* + * Convert to private, set and verify the private data, and + * then verify that the rest of the data (map shared) still + * holds the initial pattern, and that the host always sees the + * shared memory (initial pattern). Unlike shared memory, + * punching a hole in private memory is destructive, i.e. + * previous values aren't guaranteed to be preserved. + */ + guest_map_private(gpa, size, do_fallocate); + + if (size > PAGE_SIZE) { + memset((void *)gpa, p2, PAGE_SIZE); + goto skip; + } + + memset((void *)gpa, p2, size); + guest_sync_private(gpa, size, p1); + + /* + * Verify that the private memory was set to pattern two, and + * that shared memory still holds the initial pattern. + */ + memcmp_g(gpa, p2, size); + if (gpa > base_gpa) + memcmp_g(base_gpa, init_p, gpa - base_gpa); + if (gpa + size < base_gpa + PER_CPU_DATA_SIZE) + memcmp_g(gpa + size, init_p, + (base_gpa + PER_CPU_DATA_SIZE) - (gpa + size)); + + /* + * Convert odd-number page frames back to shared to verify KVM + * also correctly handles holes in private ranges. + */ + for (j = 0; j < size; j += PAGE_SIZE) { + if ((j >> PAGE_SHIFT) & 1) { + guest_map_shared(gpa + j, PAGE_SIZE, do_fallocate); + guest_sync_shared(gpa + j, PAGE_SIZE, p1, p3); + + memcmp_g(gpa + j, p3, PAGE_SIZE); + } else { + guest_sync_private(gpa + j, PAGE_SIZE, p1); + } + } + +skip: + /* + * Convert the entire region back to shared, explicitly write + * pattern three to fill in the even-number frames before + * asking the host to verify (and write pattern four). + */ + guest_map_shared(gpa, size, do_fallocate); + memset((void *)gpa, p3, size); + guest_sync_shared(gpa, size, p3, p4); + memcmp_g(gpa, p4, size); + + /* Reset the shared memory back to the initial pattern. */ + memset((void *)gpa, init_p, size); + + /* + * Free (via PUNCH_HOLE) *all* private memory so that the next + * iteration starts from a clean slate, e.g. with respect to + * whether or not there are pages/folios in guest_mem. + */ + guest_map_shared(base_gpa, PER_CPU_DATA_SIZE, true); + } +} + +static void guest_punch_hole(uint64_t gpa, uint64_t size) +{ + /* "Mapping" memory shared via fallocate() is done via PUNCH_HOLE. */ + uint64_t flags = MAP_GPA_SHARED | MAP_GPA_DO_FALLOCATE; + + kvm_hypercall_map_gpa_range(gpa, size, flags); +} + +/* + * Test that PUNCH_HOLE actually frees memory by punching holes without doing a + * proper conversion. Freeing (PUNCH_HOLE) should zap SPTEs, and reallocating + * (subsequent fault) should zero memory. + */ +static void guest_test_punch_hole(uint64_t base_gpa, bool precise) +{ + const uint8_t init_p = 0xcc; + int i; + + /* + * Convert the entire range to private, this testcase is all about + * punching holes in guest_memfd, i.e. shared mappings aren't needed. + */ + guest_map_private(base_gpa, PER_CPU_DATA_SIZE, false); + + for (i = 0; i < ARRAY_SIZE(test_ranges); i++) { + uint64_t gpa = base_gpa + test_ranges[i].offset; + uint64_t size = test_ranges[i].size; + + /* + * Free all memory before each iteration, even for the !precise + * case where the memory will be faulted back in. Freeing and + * reallocating should obviously work, and freeing all memory + * minimizes the probability of cross-testcase influence. + */ + guest_punch_hole(base_gpa, PER_CPU_DATA_SIZE); + + /* Fault-in and initialize memory, and verify the pattern. */ + if (precise) { + memset((void *)gpa, init_p, size); + memcmp_g(gpa, init_p, size); + } else { + memset((void *)base_gpa, init_p, PER_CPU_DATA_SIZE); + memcmp_g(base_gpa, init_p, PER_CPU_DATA_SIZE); + } + + /* + * Punch a hole at the target range and verify that reads from + * the guest succeed and return zeroes. + */ + guest_punch_hole(gpa, size); + memcmp_g(gpa, 0, size); + } +} + +static void guest_code(uint64_t base_gpa) +{ + /* + * Run the conversion test twice, with and without doing fallocate() on + * the guest_memfd backing when converting between shared and private. + */ + guest_test_explicit_conversion(base_gpa, false); + guest_test_explicit_conversion(base_gpa, true); + + /* + * Run the PUNCH_HOLE test twice too, once with the entire guest_memfd + * faulted in, once with only the target range faulted in. + */ + guest_test_punch_hole(base_gpa, false); + guest_test_punch_hole(base_gpa, true); + GUEST_DONE(); +} + +static void handle_exit_hypercall(struct kvm_vcpu *vcpu) +{ + struct kvm_run *run = vcpu->run; + uint64_t gpa = run->hypercall.args[0]; + uint64_t size = run->hypercall.args[1] * PAGE_SIZE; + bool set_attributes = run->hypercall.args[2] & MAP_GPA_SET_ATTRIBUTES; + bool map_shared = run->hypercall.args[2] & MAP_GPA_SHARED; + bool do_fallocate = run->hypercall.args[2] & MAP_GPA_DO_FALLOCATE; + struct kvm_vm *vm = vcpu->vm; + + TEST_ASSERT(run->hypercall.nr == KVM_HC_MAP_GPA_RANGE, + "Wanted MAP_GPA_RANGE (%u), got '%llu'", + KVM_HC_MAP_GPA_RANGE, run->hypercall.nr); + + if (do_fallocate) + vm_guest_mem_fallocate(vm, gpa, size, map_shared); + + if (set_attributes) + vm_set_memory_attributes(vm, gpa, size, + map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE); + run->hypercall.ret = 0; +} + +static bool run_vcpus; + +static void *__test_mem_conversions(void *__vcpu) +{ + struct kvm_vcpu *vcpu = __vcpu; + struct kvm_run *run = vcpu->run; + struct kvm_vm *vm = vcpu->vm; + struct ucall uc; + + while (!READ_ONCE(run_vcpus)) + ; + + for ( ;; ) { + vcpu_run(vcpu); + + if (run->exit_reason == KVM_EXIT_HYPERCALL) { + handle_exit_hypercall(vcpu); + continue; + } + + TEST_ASSERT(run->exit_reason == KVM_EXIT_IO, + "Wanted KVM_EXIT_IO, got exit reason: %u (%s)", + run->exit_reason, exit_reason_str(run->exit_reason)); + + switch (get_ucall(vcpu, &uc)) { + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + case UCALL_SYNC: { + uint64_t gpa = uc.args[1]; + size_t size = uc.args[2]; + size_t i; + + TEST_ASSERT(uc.args[0] == SYNC_SHARED || + uc.args[0] == SYNC_PRIVATE, + "Unknown sync command '%ld'", uc.args[0]); + + for (i = 0; i < size; i += vm->page_size) { + size_t nr_bytes = min_t(size_t, vm->page_size, size - i); + uint8_t *hva = addr_gpa2hva(vm, gpa + i); + + /* In all cases, the host should observe the shared data. */ + memcmp_h(hva, gpa + i, uc.args[3], nr_bytes); + + /* For shared, write the new pattern to guest memory. */ + if (uc.args[0] == SYNC_SHARED) + memset(hva, uc.args[4], nr_bytes); + } + break; + } + case UCALL_DONE: + return NULL; + default: + TEST_FAIL("Unknown ucall 0x%lx.", uc.cmd); + } + } +} + +static void test_mem_conversions(enum vm_mem_backing_src_type src_type, uint32_t nr_vcpus, + uint32_t nr_memslots) +{ + /* + * Allocate enough memory so that each vCPU's chunk of memory can be + * naturally aligned with respect to the size of the backing store. + */ + const size_t alignment = max_t(size_t, SZ_2M, get_backing_src_pagesz(src_type)); + const size_t per_cpu_size = align_up(PER_CPU_DATA_SIZE, alignment); + const size_t memfd_size = per_cpu_size * nr_vcpus; + const size_t slot_size = memfd_size / nr_memslots; + struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; + pthread_t threads[KVM_MAX_VCPUS]; + uint64_t memfd_flags; + struct kvm_vm *vm; + int memfd, i, r; + + const struct vm_shape shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_SW_PROTECTED_VM, + }; + + TEST_ASSERT(slot_size * nr_memslots == memfd_size, + "The memfd size (0x%lx) needs to be cleanly divisible by the number of memslots (%u)", + memfd_size, nr_memslots); + vm = __vm_create_with_vcpus(shape, nr_vcpus, 0, guest_code, vcpus); + + vm_enable_cap(vm, KVM_CAP_EXIT_HYPERCALL, (1 << KVM_HC_MAP_GPA_RANGE)); + + if (backing_src_can_be_huge(src_type)) + memfd_flags = KVM_GUEST_MEMFD_ALLOW_HUGEPAGE; + else + memfd_flags = 0; + memfd = vm_create_guest_memfd(vm, memfd_size, memfd_flags); + + for (i = 0; i < nr_memslots; i++) + vm_mem_add(vm, src_type, BASE_DATA_GPA + slot_size * i, + BASE_DATA_SLOT + i, slot_size / vm->page_size, + KVM_MEM_PRIVATE, memfd, slot_size * i); + + for (i = 0; i < nr_vcpus; i++) { + uint64_t gpa = BASE_DATA_GPA + i * per_cpu_size; + + vcpu_args_set(vcpus[i], 1, gpa); + + /* + * Map only what is needed so that an out-of-bounds access + * results #PF => SHUTDOWN instead of data corruption. + */ + virt_map(vm, gpa, gpa, PER_CPU_DATA_SIZE / vm->page_size); + + pthread_create(&threads[i], NULL, __test_mem_conversions, vcpus[i]); + } + + WRITE_ONCE(run_vcpus, true); + + for (i = 0; i < nr_vcpus; i++) + pthread_join(threads[i], NULL); + + kvm_vm_free(vm); + + /* + * Allocate and free memory from the guest_memfd after closing the VM + * fd. The guest_memfd is gifted a reference to its owning VM, i.e. + * should prevent the VM from being fully destroyed until the last + * reference to the guest_memfd is also put. + */ + r = fallocate(memfd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, memfd_size); + TEST_ASSERT(!r, __KVM_SYSCALL_ERROR("fallocate()", r)); + + r = fallocate(memfd, FALLOC_FL_KEEP_SIZE, 0, memfd_size); + TEST_ASSERT(!r, __KVM_SYSCALL_ERROR("fallocate()", r)); +} + +static void usage(const char *cmd) +{ + puts(""); + printf("usage: %s [-h] [-m nr_memslots] [-s mem_type] [-n nr_vcpus]\n", cmd); + puts(""); + backing_src_help("-s"); + puts(""); + puts(" -n: specify the number of vcpus (default: 1)"); + puts(""); + puts(" -m: specify the number of memslots (default: 1)"); + puts(""); +} + +int main(int argc, char *argv[]) +{ + enum vm_mem_backing_src_type src_type = DEFAULT_VM_MEM_SRC; + uint32_t nr_memslots = 1; + uint32_t nr_vcpus = 1; + int opt; + + TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM)); + + while ((opt = getopt(argc, argv, "hm:s:n:")) != -1) { + switch (opt) { + case 's': + src_type = parse_backing_src_type(optarg); + break; + case 'n': + nr_vcpus = atoi_positive("nr_vcpus", optarg); + break; + case 'm': + nr_memslots = atoi_positive("nr_memslots", optarg); + break; + case 'h': + default: + usage(argv[0]); + exit(0); + } + } + + test_mem_conversions(src_type, nr_vcpus, nr_memslots); + + return 0; +} From 2e896cd0960b8368b64a162d3df639eefe7d9b3b Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:28 -0700 Subject: [PATCH 462/515] KVM: selftests: Add KVM_SET_USER_MEMORY_REGION2 helper Add helpers to invoke KVM_SET_USER_MEMORY_REGION2 directly so that tests can validate of features that are unique to "version 2" of "set user memory region", e.g. do negative testing on gmem_fd and gmem_offset. Provide a raw version as well as an assert-success version to reduce the amount of boilerplate code need for basic usage. Signed-off-by: Chao Peng Signed-off-by: Ackerley Tng Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 7 +++++ tools/testing/selftests/kvm/lib/kvm_util.c | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 157508c071f3c2..8ec122f5fcc885 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -522,6 +522,13 @@ void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, uint64_t gpa, uint64_t size, void *hva); int __vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, uint64_t gpa, uint64_t size, void *hva); +void vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_t flags, + uint64_t gpa, uint64_t size, void *hva, + uint32_t guest_memfd, uint64_t guest_memfd_offset); +int __vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_t flags, + uint64_t gpa, uint64_t size, void *hva, + uint32_t guest_memfd, uint64_t guest_memfd_offset); + void vm_userspace_mem_region_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t guest_paddr, uint32_t slot, uint64_t npages, diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 52b131e3aca538..1620452c1cf797 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -873,6 +873,35 @@ void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, errno, strerror(errno)); } +int __vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_t flags, + uint64_t gpa, uint64_t size, void *hva, + uint32_t guest_memfd, uint64_t guest_memfd_offset) +{ + struct kvm_userspace_memory_region2 region = { + .slot = slot, + .flags = flags, + .guest_phys_addr = gpa, + .memory_size = size, + .userspace_addr = (uintptr_t)hva, + .guest_memfd = guest_memfd, + .guest_memfd_offset = guest_memfd_offset, + }; + + return ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION2, ®ion); +} + +void vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, uint32_t flags, + uint64_t gpa, uint64_t size, void *hva, + uint32_t guest_memfd, uint64_t guest_memfd_offset) +{ + int ret = __vm_set_user_memory_region2(vm, slot, flags, gpa, size, hva, + guest_memfd, guest_memfd_offset); + + TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION2 failed, errno = %d (%s)", + errno, strerror(errno)); +} + + /* FIXME: This thing needs to be ripped apart and rewritten. */ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t guest_paddr, uint32_t slot, uint64_t npages, From d1c371bebc1e056959d5d27721a661c876241bda Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:29 -0700 Subject: [PATCH 463/515] KVM: selftests: Expand set_memory_region_test to validate guest_memfd() Expand set_memory_region_test to exercise various positive and negative testcases for private memory. - Non-guest_memfd() file descriptor for private memory - guest_memfd() from different VM - Overlapping bindings - Unaligned bindings Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng [sean: trim the testcases to remove duplicate coverage] Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 10 ++ .../selftests/kvm/set_memory_region_test.c | 100 ++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 8ec122f5fcc885..e4d2cd9218b2bd 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -819,6 +819,16 @@ static inline struct kvm_vm *vm_create_barebones(void) return ____vm_create(VM_SHAPE_DEFAULT); } +static inline struct kvm_vm *vm_create_barebones_protected_vm(void) +{ + const struct vm_shape shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_SW_PROTECTED_VM, + }; + + return ____vm_create(shape); +} + static inline struct kvm_vm *vm_create(uint32_t nr_runnable_vcpus) { return __vm_create(VM_SHAPE_DEFAULT, nr_runnable_vcpus, 0); diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c index b32960189f5f18..ca83e3307a98fa 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -385,6 +385,98 @@ static void test_add_max_memory_regions(void) kvm_vm_free(vm); } + +static void test_invalid_guest_memfd(struct kvm_vm *vm, int memfd, + size_t offset, const char *msg) +{ + int r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, + 0, memfd, offset); + TEST_ASSERT(r == -1 && errno == EINVAL, "%s", msg); +} + +static void test_add_private_memory_region(void) +{ + struct kvm_vm *vm, *vm2; + int memfd, i; + + pr_info("Testing ADD of KVM_MEM_PRIVATE memory regions\n"); + + vm = vm_create_barebones_protected_vm(); + + test_invalid_guest_memfd(vm, vm->kvm_fd, 0, "KVM fd should fail"); + test_invalid_guest_memfd(vm, vm->fd, 0, "VM's fd should fail"); + + memfd = kvm_memfd_alloc(MEM_REGION_SIZE, false); + test_invalid_guest_memfd(vm, memfd, 0, "Regular memfd() should fail"); + close(memfd); + + vm2 = vm_create_barebones_protected_vm(); + memfd = vm_create_guest_memfd(vm2, MEM_REGION_SIZE, 0); + test_invalid_guest_memfd(vm, memfd, 0, "Other VM's guest_memfd() should fail"); + + vm_set_user_memory_region2(vm2, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + close(memfd); + kvm_vm_free(vm2); + + memfd = vm_create_guest_memfd(vm, MEM_REGION_SIZE, 0); + for (i = 1; i < PAGE_SIZE; i++) + test_invalid_guest_memfd(vm, memfd, i, "Unaligned offset should fail"); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + close(memfd); + + kvm_vm_free(vm); +} + +static void test_add_overlapping_private_memory_regions(void) +{ + struct kvm_vm *vm; + int memfd; + int r; + + pr_info("Testing ADD of overlapping KVM_MEM_PRIVATE memory regions\n"); + + vm = vm_create_barebones_protected_vm(); + + memfd = vm_create_guest_memfd(vm, MEM_REGION_SIZE * 4, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE * 2, 0, memfd, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT + 1, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2, MEM_REGION_SIZE * 2, + 0, memfd, MEM_REGION_SIZE * 2); + + /* + * Delete the first memslot, and then attempt to recreate it except + * with a "bad" offset that results in overlap in the guest_memfd(). + */ + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, 0, NULL, -1, 0); + + /* Overlap the front half of the other slot. */ + r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2 - MEM_REGION_SIZE, + MEM_REGION_SIZE * 2, + 0, memfd, 0); + TEST_ASSERT(r == -1 && errno == EEXIST, "%s", + "Overlapping guest_memfd() bindings should fail with EEXIST"); + + /* And now the back half of the other slot. */ + r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2 + MEM_REGION_SIZE, + MEM_REGION_SIZE * 2, + 0, memfd, 0); + TEST_ASSERT(r == -1 && errno == EEXIST, "%s", + "Overlapping guest_memfd() bindings should fail with EEXIST"); + + close(memfd); + kvm_vm_free(vm); +} + int main(int argc, char *argv[]) { #ifdef __x86_64__ @@ -401,6 +493,14 @@ int main(int argc, char *argv[]) test_add_max_memory_regions(); + if (kvm_has_cap(KVM_CAP_GUEST_MEMFD) && + (kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM))) { + test_add_private_memory_region(); + test_add_overlapping_private_memory_regions(); + } else { + pr_info("Skipping tests for KVM_MEM_PRIVATE memory regions\n"); + } + #ifdef __x86_64__ if (argc > 1) loops = atoi_positive("Number of iterations", argv[1]); From 9cfd4a5b7c6955d5679bf2d62db5bed35315771e Mon Sep 17 00:00:00 2001 From: Chao Peng Date: Wed, 13 Sep 2023 18:55:30 -0700 Subject: [PATCH 464/515] KVM: selftests: Add basic selftest for guest_memfd() Add a selftest to verify the basic functionality of guest_memfd(): + file descriptor created with the guest_memfd() ioctl does not allow read/write/mmap operations + file size and block size as returned from fstat are as expected + fallocate on the fd checks that offset/length on fallocate(FALLOC_FL_PUNCH_HOLE) should be page aligned + invalid inputs (misaligned size, invalid flags) are rejected + file size and inode are unique (the innocuous-sounding anon_inode_getfile() backs all files with a single inode...) Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Co-developed-by: Paolo Bonzini Signed-off-by: Paolo Bonzini Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../testing/selftests/kvm/guest_memfd_test.c | 221 ++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100644 tools/testing/selftests/kvm/guest_memfd_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index b709a52d5cdbf6..2b1ef809d73a2b 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -124,6 +124,7 @@ TEST_GEN_PROGS_x86_64 += access_tracking_perf_test TEST_GEN_PROGS_x86_64 += demand_paging_test TEST_GEN_PROGS_x86_64 += dirty_log_test TEST_GEN_PROGS_x86_64 += dirty_log_perf_test +TEST_GEN_PROGS_x86_64 += guest_memfd_test TEST_GEN_PROGS_x86_64 += guest_print_test TEST_GEN_PROGS_x86_64 += hardware_disable_test TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c new file mode 100644 index 00000000000000..c15de9852316e6 --- /dev/null +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright Intel Corporation, 2023 + * + * Author: Chao Peng + */ + +#define _GNU_SOURCE +#include "test_util.h" +#include "kvm_util_base.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +static void test_file_read_write(int fd) +{ + char buf[64]; + + TEST_ASSERT(read(fd, buf, sizeof(buf)) < 0, + "read on a guest_mem fd should fail"); + TEST_ASSERT(write(fd, buf, sizeof(buf)) < 0, + "write on a guest_mem fd should fail"); + TEST_ASSERT(pread(fd, buf, sizeof(buf), 0) < 0, + "pread on a guest_mem fd should fail"); + TEST_ASSERT(pwrite(fd, buf, sizeof(buf), 0) < 0, + "pwrite on a guest_mem fd should fail"); +} + +static void test_mmap(int fd, size_t page_size) +{ + char *mem; + + mem = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + TEST_ASSERT_EQ(mem, MAP_FAILED); +} + +static void test_file_size(int fd, size_t page_size, size_t total_size) +{ + struct stat sb; + int ret; + + ret = fstat(fd, &sb); + TEST_ASSERT(!ret, "fstat should succeed"); + TEST_ASSERT_EQ(sb.st_size, total_size); + TEST_ASSERT_EQ(sb.st_blksize, page_size); +} + +static void test_fallocate(int fd, size_t page_size, size_t total_size) +{ + int ret; + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, total_size); + TEST_ASSERT(!ret, "fallocate with aligned offset and size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size - 1, page_size); + TEST_ASSERT(ret, "fallocate with unaligned offset should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size, page_size); + TEST_ASSERT(ret, "fallocate beginning at total_size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size + page_size, page_size); + TEST_ASSERT(ret, "fallocate beginning after total_size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + total_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) at total_size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + total_size + page_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) after total_size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size, page_size - 1); + TEST_ASSERT(ret, "fallocate with unaligned size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) with aligned offset and size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, page_size, page_size); + TEST_ASSERT(!ret, "fallocate to restore punched hole should succeed"); +} + +static void test_invalid_punch_hole(int fd, size_t page_size, size_t total_size) +{ + struct { + off_t offset; + off_t len; + } testcases[] = { + {0, 1}, + {0, page_size - 1}, + {0, page_size + 1}, + + {1, 1}, + {1, page_size - 1}, + {1, page_size}, + {1, page_size + 1}, + + {page_size, 1}, + {page_size, page_size - 1}, + {page_size, page_size + 1}, + }; + int ret, i; + + for (i = 0; i < ARRAY_SIZE(testcases); i++) { + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + testcases[i].offset, testcases[i].len); + TEST_ASSERT(ret == -1 && errno == EINVAL, + "PUNCH_HOLE with !PAGE_SIZE offset (%lx) and/or length (%lx) should fail", + testcases[i].offset, testcases[i].len); + } +} + +static void test_create_guest_memfd_invalid(struct kvm_vm *vm) +{ + uint64_t valid_flags = 0; + size_t page_size = getpagesize(); + uint64_t flag; + size_t size; + int fd; + + for (size = 1; size < page_size; size++) { + fd = __vm_create_guest_memfd(vm, size, 0); + TEST_ASSERT(fd == -1 && errno == EINVAL, + "guest_memfd() with non-page-aligned page size '0x%lx' should fail with EINVAL", + size); + } + + if (thp_configured()) { + for (size = page_size * 2; size < get_trans_hugepagesz(); size += page_size) { + fd = __vm_create_guest_memfd(vm, size, KVM_GUEST_MEMFD_ALLOW_HUGEPAGE); + TEST_ASSERT(fd == -1 && errno == EINVAL, + "guest_memfd() with non-hugepage-aligned page size '0x%lx' should fail with EINVAL", + size); + } + + valid_flags = KVM_GUEST_MEMFD_ALLOW_HUGEPAGE; + } + + for (flag = 1; flag; flag <<= 1) { + uint64_t bit; + + if (flag & valid_flags) + continue; + + fd = __vm_create_guest_memfd(vm, page_size, flag); + TEST_ASSERT(fd == -1 && errno == EINVAL, + "guest_memfd() with flag '0x%lx' should fail with EINVAL", + flag); + + for_each_set_bit(bit, &valid_flags, 64) { + fd = __vm_create_guest_memfd(vm, page_size, flag | BIT_ULL(bit)); + TEST_ASSERT(fd == -1 && errno == EINVAL, + "guest_memfd() with flags '0x%llx' should fail with EINVAL", + flag | BIT_ULL(bit)); + } + } +} + +static void test_create_guest_memfd_multiple(struct kvm_vm *vm) +{ + int fd1, fd2, ret; + struct stat st1, st2; + + fd1 = __vm_create_guest_memfd(vm, 4096, 0); + TEST_ASSERT(fd1 != -1, "memfd creation should succeed"); + + ret = fstat(fd1, &st1); + TEST_ASSERT(ret != -1, "memfd fstat should succeed"); + TEST_ASSERT(st1.st_size == 4096, "memfd st_size should match requested size"); + + fd2 = __vm_create_guest_memfd(vm, 8192, 0); + TEST_ASSERT(fd2 != -1, "memfd creation should succeed"); + + ret = fstat(fd2, &st2); + TEST_ASSERT(ret != -1, "memfd fstat should succeed"); + TEST_ASSERT(st2.st_size == 8192, "second memfd st_size should match requested size"); + + ret = fstat(fd1, &st1); + TEST_ASSERT(ret != -1, "memfd fstat should succeed"); + TEST_ASSERT(st1.st_size == 4096, "first memfd st_size should still match requested size"); + TEST_ASSERT(st1.st_ino != st2.st_ino, "different memfd should have different inode numbers"); +} + +int main(int argc, char *argv[]) +{ + size_t page_size; + size_t total_size; + int fd; + struct kvm_vm *vm; + + TEST_REQUIRE(kvm_has_cap(KVM_CAP_GUEST_MEMFD)); + + page_size = getpagesize(); + total_size = page_size * 4; + + vm = vm_create_barebones(); + + test_create_guest_memfd_invalid(vm); + test_create_guest_memfd_multiple(vm); + + fd = vm_create_guest_memfd(vm, total_size, 0); + + test_file_read_write(fd); + test_mmap(fd, page_size); + test_file_size(fd, page_size, total_size); + test_fallocate(fd, page_size, total_size); + test_invalid_punch_hole(fd, page_size, total_size); + + close(fd); +} From 881375a408c0f4ea451ff14545b59216d2923881 Mon Sep 17 00:00:00 2001 From: Ackerley Tng Date: Wed, 13 Sep 2023 18:55:31 -0700 Subject: [PATCH 465/515] KVM: selftests: Test KVM exit behavior for private memory/access "Testing private access when memslot gets deleted" tests the behavior of KVM when a private memslot gets deleted while the VM is using the private memslot. When KVM looks up the deleted (slot = NULL) memslot, KVM should exit to userspace with KVM_EXIT_MEMORY_FAULT. In the second test, upon a private access to non-private memslot, KVM should also exit to userspace with KVM_EXIT_MEMORY_FAULT. Intentionally don't take a requirement on KVM_CAP_GUEST_MEMFD, KVM_CAP_MEMORY_FAULT_INFO, KVM_MEMORY_ATTRIBUTE_PRIVATE, etc., as it's a KVM bug to advertise KVM_X86_SW_PROTECTED_VM without its prerequisites. Signed-off-by: Ackerley Tng [sean: call out the similarities with set_memory_region_test] Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../kvm/x86_64/private_mem_kvm_exits_test.c | 120 ++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 2b1ef809d73a2b..f7fdd8244547b1 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -82,6 +82,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test TEST_GEN_PROGS_x86_64 += x86_64/private_mem_conversions_test +TEST_GEN_PROGS_x86_64 += x86_64/private_mem_kvm_exits_test TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test TEST_GEN_PROGS_x86_64 += x86_64/smaller_maxphyaddr_emulation_test diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c b/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c new file mode 100644 index 00000000000000..7f7ca447574511 --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2022, Google LLC. + */ +#include +#include +#include + +#include "kvm_util.h" +#include "processor.h" +#include "test_util.h" + +/* Arbitrarily selected to avoid overlaps with anything else */ +#define EXITS_TEST_GVA 0xc0000000 +#define EXITS_TEST_GPA EXITS_TEST_GVA +#define EXITS_TEST_NPAGES 1 +#define EXITS_TEST_SIZE (EXITS_TEST_NPAGES * PAGE_SIZE) +#define EXITS_TEST_SLOT 10 + +static uint64_t guest_repeatedly_read(void) +{ + volatile uint64_t value; + + while (true) + value = *((uint64_t *) EXITS_TEST_GVA); + + return value; +} + +static uint32_t run_vcpu_get_exit_reason(struct kvm_vcpu *vcpu) +{ + int r; + + r = _vcpu_run(vcpu); + if (r) { + TEST_ASSERT(errno == EFAULT, KVM_IOCTL_ERROR(KVM_RUN, r)); + TEST_ASSERT_EQ(vcpu->run->exit_reason, KVM_EXIT_MEMORY_FAULT); + } + return vcpu->run->exit_reason; +} + +const struct vm_shape protected_vm_shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_SW_PROTECTED_VM, +}; + +static void test_private_access_memslot_deleted(void) +{ + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + pthread_t vm_thread; + void *thread_return; + uint32_t exit_reason; + + vm = vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, + guest_repeatedly_read); + + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, + EXITS_TEST_GPA, EXITS_TEST_SLOT, + EXITS_TEST_NPAGES, + KVM_MEM_PRIVATE); + + virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); + + /* Request to access page privately */ + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + + pthread_create(&vm_thread, NULL, + (void *(*)(void *))run_vcpu_get_exit_reason, + (void *)vcpu); + + vm_mem_region_delete(vm, EXITS_TEST_SLOT); + + pthread_join(vm_thread, &thread_return); + exit_reason = (uint32_t)(uint64_t)thread_return; + + TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); + TEST_ASSERT_EQ(vcpu->run->memory_fault.flags, KVM_MEMORY_EXIT_FLAG_PRIVATE); + TEST_ASSERT_EQ(vcpu->run->memory_fault.gpa, EXITS_TEST_GPA); + TEST_ASSERT_EQ(vcpu->run->memory_fault.size, EXITS_TEST_SIZE); + + kvm_vm_free(vm); +} + +static void test_private_access_memslot_not_private(void) +{ + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + uint32_t exit_reason; + + vm = vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, + guest_repeatedly_read); + + /* Add a non-private memslot (flags = 0) */ + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, + EXITS_TEST_GPA, EXITS_TEST_SLOT, + EXITS_TEST_NPAGES, 0); + + virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); + + /* Request to access page privately */ + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + + exit_reason = run_vcpu_get_exit_reason(vcpu); + + TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); + TEST_ASSERT_EQ(vcpu->run->memory_fault.flags, KVM_MEMORY_EXIT_FLAG_PRIVATE); + TEST_ASSERT_EQ(vcpu->run->memory_fault.gpa, EXITS_TEST_GPA); + TEST_ASSERT_EQ(vcpu->run->memory_fault.size, EXITS_TEST_SIZE); + + kvm_vm_free(vm); +} + +int main(int argc, char *argv[]) +{ + TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM)); + + test_private_access_memslot_deleted(); + test_private_access_memslot_not_private(); +} From c1fce71d29b2a48fd6788f9555561fda0f0c1863 Mon Sep 17 00:00:00 2001 From: Christian Loehle Date: Fri, 20 Oct 2023 12:46:05 +0100 Subject: [PATCH 466/515] dm delay: for short delays, use kthread instead of timers and wq DM delay's current design of using timers and wq to realize the delays is insufficient for delays below ~50ms. This commit enhances the design to use a kthread to flush the expired delays, trading some CPU time (in some cases) for better delay accuracy and delays closer to what the user requested for smaller delays. The new design is chosen as long as all the delays are below 50ms. Since bios can't be completed in interrupt context using a kthread is probably the most reasonable way to approach this. Testing with echo "0 2097152 zero" | dmsetup create dm-zeros for i in $(seq 0 20); do echo "0 2097152 delay /dev/mapper/dm-zeros 0 $i" | dmsetup create dm-delay-${i}ms; done Some performance numbers for comparison, on beaglebone black (single core) CONFIG_HZ_1000=y: fio --name=1msread --rw=randread --bs=4k --runtime=60 --time_based \ --filename=/dev/mapper/dm-delay-1ms Theoretical maximum: 1000 IOPS Previous: 250 IOPS Kthread: 500 IOPS fio --name=10msread --rw=randread --bs=4k --runtime=60 --time_based \ --filename=/dev/mapper/dm-delay-10ms Theoretical maximum: 100 IOPS Previous: 45 IOPS Kthread: 50 IOPS fio --name=1mswrite --rw=randwrite --direct=1 --bs=4k --runtime=60 \ --time_based --filename=/dev/mapper/dm-delay-1ms Theoretical maximum: 1000 IOPS Previous: 498 IOPS Kthread: 1000 IOPS fio --name=10mswrite --rw=randwrite --direct=1 --bs=4k --runtime=60 \ --time_based --filename=/dev/mapper/dm-delay-10ms Theoretical maximum: 100 IOPS Previous: 90 IOPS Kthread: 100 IOPS (This one is just to prove the new design isn't impacting throughput, not really about delays): fio --name=10mswriteasync --rw=randwrite --direct=1 --bs=4k \ --runtime=60 --time_based --filename=/dev/mapper/dm-delay-10ms \ --numjobs=32 --iodepth=64 --ioengine=libaio --group_reporting Previous: 13.3k IOPS Kthread: 13.3k IOPS Signed-off-by: Christian Loehle Signed-off-by: Mike Snitzer --- drivers/md/dm-delay.c | 101 +++++++++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 15 deletions(-) diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c index 7433525e598560..3d91804923eb76 100644 --- a/drivers/md/dm-delay.c +++ b/drivers/md/dm-delay.c @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -31,6 +32,7 @@ struct delay_c { struct workqueue_struct *kdelayd_wq; struct work_struct flush_expired_bios; struct list_head delayed_bios; + struct task_struct *worker; atomic_t may_delay; struct delay_class read; @@ -66,6 +68,44 @@ static void queue_timeout(struct delay_c *dc, unsigned long expires) mutex_unlock(&dc->timer_lock); } +static inline bool delay_is_fast(struct delay_c *dc) +{ + return !!dc->worker; +} + +static void flush_delayed_bios_fast(struct delay_c *dc, bool flush_all) +{ + struct dm_delay_info *delayed, *next; + + mutex_lock(&delayed_bios_lock); + list_for_each_entry_safe(delayed, next, &dc->delayed_bios, list) { + if (flush_all || time_after_eq(jiffies, delayed->expires)) { + struct bio *bio = dm_bio_from_per_bio_data(delayed, + sizeof(struct dm_delay_info)); + list_del(&delayed->list); + dm_submit_bio_remap(bio, NULL); + delayed->class->ops--; + } + } + mutex_unlock(&delayed_bios_lock); +} + +static int flush_worker_fn(void *data) +{ + struct delay_c *dc = data; + + while (1) { + flush_delayed_bios_fast(dc, false); + if (unlikely(list_empty(&dc->delayed_bios))) { + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + } else + cond_resched(); + } + + return 0; +} + static void flush_bios(struct bio *bio) { struct bio *n; @@ -78,7 +118,7 @@ static void flush_bios(struct bio *bio) } } -static struct bio *flush_delayed_bios(struct delay_c *dc, int flush_all) +static struct bio *flush_delayed_bios(struct delay_c *dc, bool flush_all) { struct dm_delay_info *delayed, *next; unsigned long next_expires = 0; @@ -115,7 +155,10 @@ static void flush_expired_bios(struct work_struct *work) struct delay_c *dc; dc = container_of(work, struct delay_c, flush_expired_bios); - flush_bios(flush_delayed_bios(dc, 0)); + if (delay_is_fast(dc)) + flush_delayed_bios_fast(dc, false); + else + flush_bios(flush_delayed_bios(dc, false)); } static void delay_dtr(struct dm_target *ti) @@ -131,8 +174,11 @@ static void delay_dtr(struct dm_target *ti) dm_put_device(ti, dc->write.dev); if (dc->flush.dev) dm_put_device(ti, dc->flush.dev); + if (dc->worker) + kthread_stop(dc->worker); - mutex_destroy(&dc->timer_lock); + if (!delay_is_fast(dc)) + mutex_destroy(&dc->timer_lock); kfree(dc); } @@ -175,6 +221,7 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv) { struct delay_c *dc; int ret; + unsigned int max_delay; if (argc != 3 && argc != 6 && argc != 9) { ti->error = "Requires exactly 3, 6 or 9 arguments"; @@ -188,16 +235,14 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv) } ti->private = dc; - timer_setup(&dc->delay_timer, handle_delayed_timer, 0); - INIT_WORK(&dc->flush_expired_bios, flush_expired_bios); INIT_LIST_HEAD(&dc->delayed_bios); - mutex_init(&dc->timer_lock); atomic_set(&dc->may_delay, 1); dc->argc = argc; ret = delay_class_ctr(ti, &dc->read, argv); if (ret) goto bad; + max_delay = dc->read.delay; if (argc == 3) { ret = delay_class_ctr(ti, &dc->write, argv); @@ -206,6 +251,8 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv) ret = delay_class_ctr(ti, &dc->flush, argv); if (ret) goto bad; + max_delay = max(max_delay, dc->write.delay); + max_delay = max(max_delay, dc->flush.delay); goto out; } @@ -216,19 +263,35 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv) ret = delay_class_ctr(ti, &dc->flush, argv + 3); if (ret) goto bad; + max_delay = max(max_delay, dc->flush.delay); goto out; } ret = delay_class_ctr(ti, &dc->flush, argv + 6); if (ret) goto bad; + max_delay = max(max_delay, dc->flush.delay); out: - dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); - if (!dc->kdelayd_wq) { - ret = -EINVAL; - DMERR("Couldn't start kdelayd"); - goto bad; + if (max_delay < 50) { + /* + * In case of small requested delays, use kthread instead of + * timers and workqueue to achieve better latency. + */ + dc->worker = kthread_create(&flush_worker_fn, dc, + "dm-delay-flush-worker"); + if (!dc->worker) + goto bad; + } else { + timer_setup(&dc->delay_timer, handle_delayed_timer, 0); + INIT_WORK(&dc->flush_expired_bios, flush_expired_bios); + mutex_init(&dc->timer_lock); + dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); + if (!dc->kdelayd_wq) { + ret = -EINVAL; + DMERR("Couldn't start kdelayd"); + goto bad; + } } ti->num_flush_bios = 1; @@ -260,7 +323,10 @@ static int delay_bio(struct delay_c *dc, struct delay_class *c, struct bio *bio) list_add_tail(&delayed->list, &dc->delayed_bios); mutex_unlock(&delayed_bios_lock); - queue_timeout(dc, expires); + if (delay_is_fast(dc)) + wake_up_process(dc->worker); + else + queue_timeout(dc, expires); return DM_MAPIO_SUBMITTED; } @@ -270,8 +336,13 @@ static void delay_presuspend(struct dm_target *ti) struct delay_c *dc = ti->private; atomic_set(&dc->may_delay, 0); - del_timer_sync(&dc->delay_timer); - flush_bios(flush_delayed_bios(dc, 1)); + + if (delay_is_fast(dc)) + flush_delayed_bios_fast(dc, true); + else { + del_timer_sync(&dc->delay_timer); + flush_bios(flush_delayed_bios(dc, true)); + } } static void delay_resume(struct dm_target *ti) @@ -356,7 +427,7 @@ static int delay_iterate_devices(struct dm_target *ti, static struct target_type delay_target = { .name = "delay", - .version = {1, 3, 0}, + .version = {1, 4, 0}, .features = DM_TARGET_PASSES_INTEGRITY, .module = THIS_MODULE, .ctr = delay_ctr, From c85b4fb8b8edbd915283f6ab3537f2c3b95e7c85 Mon Sep 17 00:00:00 2001 From: Damien Le Moal Date: Thu, 26 Oct 2023 14:12:05 +0900 Subject: [PATCH 467/515] dm error: Add support for zoned block devices dm-error is used in several test cases in the xfstests test suite to check the handling of IO errors in file systems. However, with several file systems getting native support for zoned block devices (e.g. btrfs and f2fs), dm-error's lack of zoned block device support creates problems as the file system attempts executing zone commands (e.g. a zone append operation) against a dm-error non-zoned block device, which causes various issues in the block layer (e.g. WARN_ON triggers). This commit adds supports for zoned block devices to dm-error, allowing a DM device table containing an error target to be exposed as a zoned block device (if all targets have a compatible zoned model support and mapping). This is done as follows: 1) Allow passing 2 arguments to an error target, similar to dm-linear: a backing device and a start sector. These arguments are optional and dm-error retains its characteristics if the arguments are not specified. 2) Implement the iterate_devices method so that dm-core can normally check the zone support and restrictions (e.g. zone alignment of the targets). When the backing device arguments are not specified, the iterate_devices method never calls the fn() argument. When no backing device is specified, as before, we assume that the DM device is not zoned. When the backing device arguments are specified, the zoned model of the DM device will depend on the backing device type: - If the backing device is zoned and its model and mapping is compatible with other targets of the device, the resulting device will be zoned, with the dm-error mapped portion always returning errors (similar to the default non-zoned case). - If the backing device is not zoned, then the DM device will not be either. This zone support for dm-error requires the definition of a functional report_zones operation so that dm_revalidate_zones() can operate correctly and resources for emulating zone append operations initialized. This is necessary for cases where dm-error is used to partially map a device and have an overall correct handling of zone append. This means that dm-error does not fail report zones operations. Two changes that are not obvious are included to avoid issues: 1) dm_table_supports_zoned_model() is changed to directly check if the backing device of a wildcard target (= dm-error target) is zoned. Otherwise, we wouldn't be able to catch the invalid setup of dm-error without a backing device (non zoned case) being combined with zoned targets. 2) dm_table_supports_dax() is modified to return false if the wildcard target is found. Otherwise, when dm-error is set without a backing device, we end up with a NULL pointer dereference in set_dax_synchronous (dax_dev is NULL). This is consistent with the current behavior because dm_table_supports_dax() always returned false for targets that do not define the iterate_devices method. Signed-off-by: Damien Le Moal Tested-by: Christoph Hellwig Signed-off-by: Mike Snitzer --- drivers/md/dm-table.c | 23 ++++++++- drivers/md/dm-target.c | 106 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 125 insertions(+), 4 deletions(-) diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 37b48f63ae6a5e..198d38b53322c1 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -844,7 +844,8 @@ static bool dm_table_supports_dax(struct dm_table *t, if (!ti->type->direct_access) return false; - if (!ti->type->iterate_devices || + if (dm_target_is_wildcard(ti->type) || + !ti->type->iterate_devices || ti->type->iterate_devices(ti, iterate_fn, NULL)) return false; } @@ -1587,6 +1588,14 @@ static int device_not_zoned_model(struct dm_target *ti, struct dm_dev *dev, return blk_queue_zoned_model(q) != *zoned_model; } +static int device_is_zoned_model(struct dm_target *ti, struct dm_dev *dev, + sector_t start, sector_t len, void *data) +{ + struct request_queue *q = bdev_get_queue(dev->bdev); + + return blk_queue_zoned_model(q) != BLK_ZONED_NONE; +} + /* * Check the device zoned model based on the target feature flag. If the target * has the DM_TARGET_ZONED_HM feature flag set, host-managed zoned devices are @@ -1600,6 +1609,18 @@ static bool dm_table_supports_zoned_model(struct dm_table *t, for (unsigned int i = 0; i < t->num_targets; i++) { struct dm_target *ti = dm_table_get_target(t, i); + /* + * For the wildcard target (dm-error), if we do not have a + * backing device, we must always return false. If we have a + * backing device, the result must depend on checking zoned + * model, like for any other target. So for this, check directly + * if the target backing device is zoned as we get "false" when + * dm-error was set without a backing device. + */ + if (dm_target_is_wildcard(ti->type) && + !ti->type->iterate_devices(ti, device_is_zoned_model, NULL)) + return false; + if (dm_target_supports_zoned_hm(ti->type)) { if (!ti->type->iterate_devices || ti->type->iterate_devices(ti, device_not_zoned_model, diff --git a/drivers/md/dm-target.c b/drivers/md/dm-target.c index 27e2992ff24927..0c4efb0bef8a90 100644 --- a/drivers/md/dm-target.c +++ b/drivers/md/dm-target.c @@ -116,8 +116,62 @@ EXPORT_SYMBOL(dm_unregister_target); * io-err: always fails an io, useful for bringing * up LVs that have holes in them. */ +struct io_err_c { + struct dm_dev *dev; + sector_t start; +}; + +static int io_err_get_args(struct dm_target *tt, unsigned int argc, char **args) +{ + unsigned long long start; + struct io_err_c *ioec; + char dummy; + int ret; + + ioec = kmalloc(sizeof(*ioec), GFP_KERNEL); + if (!ioec) { + tt->error = "Cannot allocate io_err context"; + return -ENOMEM; + } + + ret = -EINVAL; + if (sscanf(args[1], "%llu%c", &start, &dummy) != 1 || + start != (sector_t)start) { + tt->error = "Invalid device sector"; + goto bad; + } + ioec->start = start; + + ret = dm_get_device(tt, args[0], dm_table_get_mode(tt->table), &ioec->dev); + if (ret) { + tt->error = "Device lookup failed"; + goto bad; + } + + tt->private = ioec; + + return 0; + +bad: + kfree(ioec); + + return ret; +} + static int io_err_ctr(struct dm_target *tt, unsigned int argc, char **args) { + /* + * If we have arguments, assume it is the path to the backing + * block device and its mapping start sector (same as dm-linear). + * In this case, get the device so that we can get its limits. + */ + if (argc == 2) { + int ret = io_err_get_args(tt, argc, args); + + if (ret) + return ret; + } + /* * Return error for discards instead of -EOPNOTSUPP */ @@ -129,7 +183,12 @@ static int io_err_ctr(struct dm_target *tt, unsigned int argc, char **args) static void io_err_dtr(struct dm_target *tt) { - /* empty */ + struct io_err_c *ioec = tt->private; + + if (ioec) { + dm_put_device(tt, ioec->dev); + kfree(ioec); + } } static int io_err_map(struct dm_target *tt, struct bio *bio) @@ -149,6 +208,45 @@ static void io_err_release_clone_rq(struct request *clone, { } +#ifdef CONFIG_BLK_DEV_ZONED +static sector_t io_err_map_sector(struct dm_target *ti, sector_t bi_sector) +{ + struct io_err_c *ioec = ti->private; + + return ioec->start + dm_target_offset(ti, bi_sector); +} + +static int io_err_report_zones(struct dm_target *ti, + struct dm_report_zones_args *args, unsigned int nr_zones) +{ + struct io_err_c *ioec = ti->private; + + /* + * This should never be called when we do not have a backing device + * as that mean the target is not a zoned one. + */ + if (WARN_ON_ONCE(!ioec)) + return -EIO; + + return dm_report_zones(ioec->dev->bdev, ioec->start, + io_err_map_sector(ti, args->next_sector), + args, nr_zones); +} +#else +#define io_err_report_zones NULL +#endif + +static int io_err_iterate_devices(struct dm_target *ti, + iterate_devices_callout_fn fn, void *data) +{ + struct io_err_c *ioec = ti->private; + + if (!ioec) + return 0; + + return fn(ti, ioec->dev, ioec->start, ti->len, data); +} + static void io_err_io_hints(struct dm_target *ti, struct queue_limits *limits) { limits->max_discard_sectors = UINT_MAX; @@ -165,15 +263,17 @@ static long io_err_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, static struct target_type error_target = { .name = "error", - .version = {1, 6, 0}, - .features = DM_TARGET_WILDCARD, + .version = {1, 7, 0}, + .features = DM_TARGET_WILDCARD | DM_TARGET_ZONED_HM, .ctr = io_err_ctr, .dtr = io_err_dtr, .map = io_err_map, .clone_and_map_rq = io_err_clone_and_map_rq, .release_clone_rq = io_err_release_clone_rq, + .iterate_devices = io_err_iterate_devices, .io_hints = io_err_io_hints, .direct_access = io_err_dax_direct_access, + .report_zones = io_err_report_zones, }; int __init dm_target_init(void) From 6e72dacff95c149e8ca9f010a4ee8ba14f5e7d5c Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 27 Oct 2023 15:55:16 -0700 Subject: [PATCH 468/515] PCI/AER: Increase compile coverage of CONFIG_PCIEAER_CXL implementation Per coding-style, avoid usage of conditional compilation for CONFIG_PCIEAER_CXL related helpers. Instead use IS_ENABLED(CONFIG_PCIEAER_CXL) to check when CXL error handling is compile-time disabled. Cc: Terry Bowman Cc: Robert Richter Cc: Bjorn Helgaas Signed-off-by: Dan Williams --- drivers/cxl/core/pci.c | 9 +++------ drivers/cxl/cxl.h | 6 ------ drivers/pci/pcie/aer.c | 15 +++++---------- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c index 3da195caa4ad61..2d7ba1899ea242 100644 --- a/drivers/cxl/core/pci.c +++ b/drivers/cxl/core/pci.c @@ -729,8 +729,6 @@ static bool cxl_handle_endpoint_ras(struct cxl_dev_state *cxlds) return __cxl_handle_ras(cxlds, cxlds->regs.ras); } -#ifdef CONFIG_PCIEAER_CXL - static void cxl_dport_map_rch_aer(struct cxl_dport *dport) { struct cxl_rcrb_info *ri = &dport->rcrb; @@ -797,6 +795,9 @@ void cxl_setup_parent_dport(struct device *host, struct cxl_dport *dport) struct device *dport_dev = dport->dport_dev; struct pci_host_bridge *host_bridge; + if (!IS_ENABLED(CONFIG_PCIEAER_CXL)) + return; + host_bridge = to_pci_host_bridge(dport_dev); if (host_bridge->native_cxl_error) dport->rcrb.aer_cap = cxl_rcrb_to_aer(dport_dev, dport->rcrb.base); @@ -897,10 +898,6 @@ static void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds) cxl_handle_rdport_ras(cxlds, dport); } -#else -static void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds) { } -#endif - void cxl_cor_error_detected(struct pci_dev *pdev) { struct cxl_dev_state *cxlds = pci_get_drvdata(pdev); diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 378fc96ff7ff60..0bf0d13346c241 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -712,13 +712,7 @@ struct cxl_dport *devm_cxl_add_dport(struct cxl_port *port, struct cxl_dport *devm_cxl_add_rch_dport(struct cxl_port *port, struct device *dport_dev, int port_id, resource_size_t rcrb); - -#ifdef CONFIG_PCIEAER_CXL void cxl_setup_parent_dport(struct device *host, struct cxl_dport *dport); -#else -static inline void cxl_setup_parent_dport(struct device *host, - struct cxl_dport *dport) { } -#endif struct cxl_decoder *to_cxl_decoder(struct device *dev); struct cxl_root_decoder *to_cxl_root_decoder(struct device *dev); diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c index 41076cb2956e6c..36541bfab68884 100644 --- a/drivers/pci/pcie/aer.c +++ b/drivers/pci/pcie/aer.c @@ -934,8 +934,6 @@ static bool find_source_device(struct pci_dev *parent, return true; } -#ifdef CONFIG_PCIEAER_CXL - /** * pci_aer_unmask_internal_errors - unmask internal errors * @dev: pointer to the pcie_dev data structure @@ -1000,7 +998,8 @@ static int cxl_rch_handle_error_iter(struct pci_dev *dev, void *data) struct aer_err_info *info = (struct aer_err_info *)data; const struct pci_error_handlers *err_handler; - if (!is_cxl_mem_dev(dev) || !cxl_error_is_native(dev)) + if (!is_cxl_mem_dev(dev) || !cxl_error_is_native(dev) || + !IS_ENABLED(CONFIG_PCIEAER_CXL)) return 0; /* protect dev->driver */ @@ -1041,7 +1040,9 @@ static int handles_cxl_error_iter(struct pci_dev *dev, void *data) bool *handles_cxl = data; if (!*handles_cxl) - *handles_cxl = is_cxl_mem_dev(dev) && cxl_error_is_native(dev); + *handles_cxl = is_cxl_mem_dev(dev) && + cxl_error_is_native(dev) && + IS_ENABLED(CONFIG_PCIEAER_CXL); /* Non-zero terminates iteration */ return *handles_cxl; @@ -1067,12 +1068,6 @@ static void cxl_rch_enable_rcec(struct pci_dev *rcec) pci_info(rcec, "CXL: Internal errors unmasked"); } -#else -static inline void cxl_rch_enable_rcec(struct pci_dev *dev) { } -static inline void cxl_rch_handle_error(struct pci_dev *dev, - struct aer_err_info *info) { } -#endif - /** * pci_aer_handle_error - handle logging error into an event log * @dev: pointer to pci_dev data structure of error source device From b039f1062b3f8f427019ca0cf3e2636a62b1db4c Mon Sep 17 00:00:00 2001 From: David Stevens Date: Tue, 18 Apr 2023 17:40:31 +0900 Subject: [PATCH 469/515] mm/shmem: fix race in shmem_undo_range w/THP Split folios during the second loop of shmem_undo_range. It's not sufficient to only split folios when dealing with partial pages, since it's possible for a THP to be faulted in after that point. Calling truncate_inode_folio in that situation can result in throwing away data outside of the range being targeted. Link: https://lkml.kernel.org/r/20230418084031.3439795-1-stevensd@google.com Fixes: b9a8a4195c7d ("truncate,shmem: Handle truncates that split large folios") Signed-off-by: David Stevens Cc: Matthew Wilcox (Oracle) Cc: Suleiman Souhlal Cc: Signed-off-by: Andrew Morton --- mm/shmem.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/mm/shmem.c b/mm/shmem.c index 69595d3418829f..6ec7fc737d728c 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1098,7 +1098,22 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, } VM_BUG_ON_FOLIO(folio_test_writeback(folio), folio); - truncate_inode_folio(mapping, folio); + + if (!folio_test_large(folio)) { + truncate_inode_folio(mapping, folio); + } else if (truncate_inode_partial_folio(folio, lstart, lend)) { + /* + * If we split a page, reset the loop so that we + * pick up the new sub pages. Otherwise the THP + * was entirely dropped or the target range was + * zeroed, so just continue the loop as is. + */ + if (!folio_test_large(folio)) { + folio_unlock(folio); + index = start; + break; + } + } } folio_unlock(folio); } From 8955c0ba6c65731cd0c6b43ef5c6dab39c4f87b6 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Wed, 7 Jun 2023 11:58:24 -0700 Subject: [PATCH 470/515] mm-shmem-fix-race-in-shmem_undo_range-w-thp-fix tidy up comment layout Cc: David Stevens Signed-off-by: Andrew Morton --- mm/shmem.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index 6ec7fc737d728c..e826be732b9bbd 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1103,10 +1103,12 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, truncate_inode_folio(mapping, folio); } else if (truncate_inode_partial_folio(folio, lstart, lend)) { /* - * If we split a page, reset the loop so that we - * pick up the new sub pages. Otherwise the THP - * was entirely dropped or the target range was - * zeroed, so just continue the loop as is. + * If we split a page, reset the loop so + * that we pick up the new sub pages. + * Otherwise the THP was entirely + * dropped or the target range was + * zeroed, so just continue the loop as + * is. */ if (!folio_test_large(folio)) { folio_unlock(folio); From 88d09f97c5fdc909505d8654c35b5976b092bdba Mon Sep 17 00:00:00 2001 From: Jiexun Wang Date: Thu, 21 Sep 2023 20:27:51 +0800 Subject: [PATCH 471/515] mm/madvise: add cond_resched() in madvise_cold_or_pageout_pte_range() I conducted real-time testing and observed that madvise_cold_or_pageout_pte_range() causes significant latency under memory pressure, which can be effectively reduced by adding cond_resched() within the loop. I tested on the LicheePi 4A board using Cylictest for latency testing and Ftrace for latency tracing. The board uses TH1520 processor and has a memory size of 8GB. The kernel version is 6.5.0 with the PREEMPT_RT patch applied. The script I tested is as follows: echo wakeup_rt > /sys/kernel/tracing/current_tracer echo 1 > /sys/kernel/tracing/tracing_on echo 0 > /sys/kernel/tracing/tracing_max_latency stress-ng --vm 8 --vm-bytes 2G & cyclictest --mlockall --smp --priority=99 --distance=0 --duration=30m echo 0 > /sys/kernel/tracing/tracing_on cat /sys/kernel/tracing/trace The tracing results before modification are as follows: # tracer: wakeup_rt # # wakeup_rt latency trace v1.1.5 on 6.5.0-rt6-r1208-00003-g999d221864bf # -------------------------------------------------------------------- # latency: 2552 us, #6/6, CPU#3 | (M:preempt_rt VP:0, KP:0, SP:0 HP:0 #P:4) # ----------------- # | task: cyclictest-196 (uid:0 nice:0 policy:1 rt_prio:99) # ----------------- # # _--------=> CPU# # / _-------=> irqs-off/BH-disabled # | / _------=> need-resched # || / _-----=> need-resched-lazy # ||| / _----=> hardirq/softirq # |||| / _---=> preempt-depth # ||||| / _--=> preempt-lazy-depth # |||||| / _-=> migrate-disable # ||||||| / delay # cmd pid |||||||| time | caller # \ / |||||||| \ | / stress-n-206 3dn.h512 2us : 206:120:R + [003] 196: 0:R cyclictest stress-n-206 3dn.h512 7us : => __ftrace_trace_stack => __trace_stack => probe_wakeup => ttwu_do_activate => try_to_wake_up => wake_up_process => hrtimer_wakeup => __hrtimer_run_queues => hrtimer_interrupt => riscv_timer_interrupt => handle_percpu_devid_irq => generic_handle_domain_irq => riscv_intc_irq => handle_riscv_irq => do_irq stress-n-206 3dn.h512 9us#: 0 stress-n-206 3d...3.. 2544us : __schedule stress-n-206 3d...3.. 2545us : 206:120:R ==> [003] 196: 0:R cyclictest stress-n-206 3d...3.. 2551us : => __ftrace_trace_stack => __trace_stack => probe_wakeup_sched_switch => __schedule => preempt_schedule => migrate_enable => rt_spin_unlock => madvise_cold_or_pageout_pte_range => walk_pgd_range => __walk_page_range => walk_page_range => madvise_pageout => madvise_vma_behavior => do_madvise => sys_madvise => do_trap_ecall_u => ret_from_exception The tracing results after modification are as follows: # tracer: wakeup_rt # # wakeup_rt latency trace v1.1.5 on 6.5.0-rt6-r1208-00004-gca3876fc69a6-dirty # -------------------------------------------------------------------- # latency: 1689 us, #6/6, CPU#0 | (M:preempt_rt VP:0, KP:0, SP:0 HP:0 #P:4) # ----------------- # | task: cyclictest-217 (uid:0 nice:0 policy:1 rt_prio:99) # ----------------- # # _--------=> CPU# # / _-------=> irqs-off/BH-disabled # | / _------=> need-resched # || / _-----=> need-resched-lazy # ||| / _----=> hardirq/softirq # |||| / _---=> preempt-depth # ||||| / _--=> preempt-lazy-depth # |||||| / _-=> migrate-disable # ||||||| / delay # cmd pid |||||||| time | caller # \ / |||||||| \ | / stress-n-232 0dn.h413 1us+: 232:120:R + [000] 217: 0:R cyclictest stress-n-232 0dn.h413 12us : => __ftrace_trace_stack => __trace_stack => probe_wakeup => ttwu_do_activate => try_to_wake_up => wake_up_process => hrtimer_wakeup => __hrtimer_run_queues => hrtimer_interrupt => riscv_timer_interrupt => handle_percpu_devid_irq => generic_handle_domain_irq => riscv_intc_irq => handle_riscv_irq => do_irq stress-n-232 0dn.h413 19us#: 0 stress-n-232 0d...3.. 1671us : __schedule stress-n-232 0d...3.. 1676us+: 232:120:R ==> [000] 217: 0:R cyclictest stress-n-232 0d...3.. 1687us : => __ftrace_trace_stack => __trace_stack => probe_wakeup_sched_switch => __schedule => preempt_schedule => migrate_enable => free_unref_page_list => release_pages => free_pages_and_swap_cache => tlb_batch_pages_flush => tlb_flush_mmu => unmap_page_range => unmap_vmas => unmap_region => do_vmi_align_munmap.constprop.0 => do_vmi_munmap => __vm_munmap => sys_munmap => do_trap_ecall_u => ret_from_exception After the modification, the cause of maximum latency is no longer madvise_cold_or_pageout_pte_range(), so this modification can reduce the latency caused by madvise_cold_or_pageout_pte_range(). Currently the madvise_cold_or_pageout_pte_range() function exhibits significant latency under memory pressure, which can be effectively reduced by adding cond_resched() within the loop. When the batch_count reaches SWAP_CLUSTER_MAX, we reschedule the task to ensure fairness and avoid long lock holding times. Link: https://lkml.kernel.org/r/85363861af65fac66c7a98c251906afc0d9c8098.1695291046.git.wangjiexun@tinylab.org Signed-off-by: Jiexun Wang Cc: Zhangjin Wu Signed-off-by: Andrew Morton --- mm/madvise.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mm/madvise.c b/mm/madvise.c index 4dded5d27e7eaa..4cc51cdf8c5f49 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -353,6 +353,7 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, struct folio *folio = NULL; LIST_HEAD(folio_list); bool pageout_anon_only_filter; + unsigned int batch_count = 0; if (fatal_signal_pending(current)) return -EINTR; @@ -434,6 +435,7 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, regular_folio: #endif tlb_change_page_size(tlb, PAGE_SIZE); +restart: start_pte = pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); if (!start_pte) return 0; @@ -442,6 +444,15 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, for (; addr < end; pte++, addr += PAGE_SIZE) { ptent = ptep_get(pte); + if (++batch_count == SWAP_CLUSTER_MAX) { + batch_count = 0; + if (need_resched()) { + pte_unmap_unlock(start_pte, ptl); + cond_resched(); + goto restart; + } + } + if (pte_none(ptent)) continue; From 4b0c8fe469b39bfa9f07493053dcd9ea84b7324f Mon Sep 17 00:00:00 2001 From: Charan Teja Kalla Date: Fri, 13 Oct 2023 18:34:27 +0530 Subject: [PATCH 472/515] mm/sparsemem: fix race in accessing memory_section->usage The below race is observed on a PFN which falls into the device memory region with the system memory configuration where PFN's are such that [ZONE_NORMAL ZONE_DEVICE ZONE_NORMAL]. Since normal zone start and end pfn contains the device memory PFN's as well, the compaction triggered will try on the device memory PFN's too though they end up in NOP(because pfn_to_online_page() returns NULL for ZONE_DEVICE memory sections). When from other core, the section mappings are being removed for the ZONE_DEVICE region, that the PFN in question belongs to, on which compaction is currently being operated is resulting into the kernel crash with CONFIG_SPASEMEM_VMEMAP enabled. The crash logs can be seen at [1]. compact_zone() memunmap_pages ------------- --------------- __pageblock_pfn_to_page ...... (a)pfn_valid(): valid_section()//return true (b)__remove_pages()-> sparse_remove_section()-> section_deactivate(): [Free the array ms->usage and set ms->usage = NULL] pfn_section_valid() [Access ms->usage which is NULL] NOTE: From the above it can be said that the race is reduced to between the pfn_valid()/pfn_section_valid() and the section deactivate with SPASEMEM_VMEMAP enabled. The commit b943f045a9af("mm/sparse: fix kernel crash with pfn_section_valid check") tried to address the same problem by clearing the SECTION_HAS_MEM_MAP with the expectation of valid_section() returns false thus ms->usage is not accessed. Fix this issue by the below steps: a) Clear SECTION_HAS_MEM_MAP before freeing the ->usage. b) RCU protected read side critical section will either return NULL when SECTION_HAS_MEM_MAP is cleared or can successfully access ->usage. c) Free the ->usage with kfree_rcu() and set ms->usage = NULL. No attempt will be made to access ->usage after this as the SECTION_HAS_MEM_MAP is cleared thus valid_section() return false. Thanks to David/Pavan for their inputs on this patch. [1] https://lore.kernel.org/linux-mm/994410bb-89aa-d987-1f50-f514903c55aa@quicinc.com/ On Snapdragon SoC, with the mentioned memory configuration of PFN's as [ZONE_NORMAL ZONE_DEVICE ZONE_NORMAL], we are able to see bunch of issues daily while testing on a device farm. For this particular issue below is the log. Though the below log is not directly pointing to the pfn_section_valid(){ ms->usage;}, when we loaded this dump on T32 lauterbach tool, it is pointing. [ 540.578056] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 [ 540.578068] Mem abort info: [ 540.578070] ESR = 0x0000000096000005 [ 540.578073] EC = 0x25: DABT (current EL), IL = 32 bits [ 540.578077] SET = 0, FnV = 0 [ 540.578080] EA = 0, S1PTW = 0 [ 540.578082] FSC = 0x05: level 1 translation fault [ 540.578085] Data abort info: [ 540.578086] ISV = 0, ISS = 0x00000005 [ 540.578088] CM = 0, WnR = 0 [ 540.579431] pstate: 82400005 (Nzcv daif +PAN -UAO +TCO -DIT -SSBSBTYPE=--) [ 540.579436] pc : __pageblock_pfn_to_page+0x6c/0x14c [ 540.579454] lr : compact_zone+0x994/0x1058 [ 540.579460] sp : ffffffc03579b510 [ 540.579463] x29: ffffffc03579b510 x28: 0000000000235800 x27:000000000000000c [ 540.579470] x26: 0000000000235c00 x25: 0000000000000068 x24:ffffffc03579b640 [ 540.579477] x23: 0000000000000001 x22: ffffffc03579b660 x21:0000000000000000 [ 540.579483] x20: 0000000000235bff x19: ffffffdebf7e3940 x18:ffffffdebf66d140 [ 540.579489] x17: 00000000739ba063 x16: 00000000739ba063 x15:00000000009f4bff [ 540.579495] x14: 0000008000000000 x13: 0000000000000000 x12:0000000000000001 [ 540.579501] x11: 0000000000000000 x10: 0000000000000000 x9 :ffffff897d2cd440 [ 540.579507] x8 : 0000000000000000 x7 : 0000000000000000 x6 :ffffffc03579b5b4 [ 540.579512] x5 : 0000000000027f25 x4 : ffffffc03579b5b8 x3 :0000000000000001 [ 540.579518] x2 : ffffffdebf7e3940 x1 : 0000000000235c00 x0 :0000000000235800 [ 540.579524] Call trace: [ 540.579527] __pageblock_pfn_to_page+0x6c/0x14c [ 540.579533] compact_zone+0x994/0x1058 [ 540.579536] try_to_compact_pages+0x128/0x378 [ 540.579540] __alloc_pages_direct_compact+0x80/0x2b0 [ 540.579544] __alloc_pages_slowpath+0x5c0/0xe10 [ 540.579547] __alloc_pages+0x250/0x2d0 [ 540.579550] __iommu_dma_alloc_noncontiguous+0x13c/0x3fc [ 540.579561] iommu_dma_alloc+0xa0/0x320 [ 540.579565] dma_alloc_attrs+0xd4/0x108 Link: https://lkml.kernel.org/r/1697202267-23600-1-git-send-email-quic_charante@quicinc.com Fixes: f46edbd1b151 ("mm/sparsemem: add helpers track active portions of a section at boot") Signed-off-by: Charan Teja Kalla Cc: Aneesh Kumar K.V Cc: Dan Williams Cc: David Hildenbrand Cc: Mel Gorman Cc: Oscar Salvador Cc: Vlastimil Babka Cc: Signed-off-by: Andrew Morton --- include/linux/mmzone.h | 11 +++++++++-- mm/sparse.c | 14 ++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 4106fbc5b4b324..c877396098031c 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1987,6 +1987,7 @@ static inline int pfn_section_valid(struct mem_section *ms, unsigned long pfn) static inline int pfn_valid(unsigned long pfn) { struct mem_section *ms; + int ret; /* * Ensure the upper PAGE_SHIFT bits are clear in the @@ -2000,13 +2001,19 @@ static inline int pfn_valid(unsigned long pfn) if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) return 0; ms = __pfn_to_section(pfn); - if (!valid_section(ms)) + rcu_read_lock(); + if (!valid_section(ms)) { + rcu_read_unlock(); return 0; + } /* * Traditionally early sections always returned pfn_valid() for * the entire section-sized span. */ - return early_section(ms) || pfn_section_valid(ms, pfn); + ret = early_section(ms) || pfn_section_valid(ms, pfn); + rcu_read_unlock(); + + return ret; } #endif diff --git a/mm/sparse.c b/mm/sparse.c index 77d91e565045ca..ca7dbe110875ad 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -791,6 +791,13 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, if (empty) { unsigned long section_nr = pfn_to_section_nr(pfn); + /* + * Mark the section invalid so that valid_section() + * return false. This prevents code from dereferencing + * ms->usage array. + */ + ms->section_mem_map &= ~SECTION_HAS_MEM_MAP; + /* * When removing an early section, the usage map is kept (as the * usage maps of other sections fall into the same page). It @@ -799,16 +806,11 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, * was allocated during boot. */ if (!PageReserved(virt_to_page(ms->usage))) { + synchronize_rcu(); kfree(ms->usage); ms->usage = NULL; } memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); - /* - * Mark the section invalid so that valid_section() - * return false. This prevents code from dereferencing - * ms->usage array. - */ - ms->section_mem_map &= ~SECTION_HAS_MEM_MAP; } /* From a2bdd6a8e8a8cc3bd1c6690795d6f41dace75ef3 Mon Sep 17 00:00:00 2001 From: Charan Teja Kalla Date: Fri, 27 Oct 2023 16:19:38 +0530 Subject: [PATCH 473/515] mm/sparsemem: fix race in accessing memory_section->usage use kfree_rcu() in place of synchronize_rcu(), per David Link: https://lkml.kernel.org/r/1698403778-20938-1-git-send-email-quic_charante@quicinc.com Fixes: f46edbd1b151 ("mm/sparsemem: add helpers track active portions of a section at boot") Signed-off-by: Charan Teja Kalla Cc: Aneesh Kumar K.V Cc: Dan Williams Cc: David Hildenbrand Cc: Mel Gorman Cc: Oscar Salvador Cc: Vlastimil Babka Cc: Signed-off-by: Andrew Morton --- include/linux/mmzone.h | 3 ++- mm/sparse.c | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index c877396098031c..19a4b1d3433aa8 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1770,6 +1770,7 @@ static inline unsigned long section_nr_to_pfn(unsigned long sec) #define SUBSECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SUBSECTION_MASK) struct mem_section_usage { + struct rcu_head rcu; #ifdef CONFIG_SPARSEMEM_VMEMMAP DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION); #endif @@ -1963,7 +1964,7 @@ static inline int pfn_section_valid(struct mem_section *ms, unsigned long pfn) { int idx = subsection_map_index(pfn); - return test_bit(idx, ms->usage->subsection_map); + return test_bit(idx, READ_ONCE(ms->usage)->subsection_map); } #else static inline int pfn_section_valid(struct mem_section *ms, unsigned long pfn) diff --git a/mm/sparse.c b/mm/sparse.c index ca7dbe110875ad..338cf946dee8de 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -806,9 +806,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, * was allocated during boot. */ if (!PageReserved(virt_to_page(ms->usage))) { - synchronize_rcu(); - kfree(ms->usage); - ms->usage = NULL; + kfree_rcu(ms->usage, rcu); + WRITE_ONCE(ms->usage, NULL); } memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); } From d5ca95f4e4bc09978ee410f36a9a69e3ea36dcb6 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Mon, 23 Oct 2023 13:01:54 +0200 Subject: [PATCH 474/515] kexec: fix KEXEC_FILE dependencies The cleanup for the CONFIG_KEXEC Kconfig logic accidentally changed the 'depends on CRYPTO=y' dependency to a plain 'depends on CRYPTO', which causes a link failure when all the crypto support is in a loadable module and kexec_file support is built-in: x86_64-linux-ld: vmlinux.o: in function `__x64_sys_kexec_file_load': (.text+0x32e30a): undefined reference to `crypto_alloc_shash' x86_64-linux-ld: (.text+0x32e58e): undefined reference to `crypto_shash_update' x86_64-linux-ld: (.text+0x32e6ee): undefined reference to `crypto_shash_final' Both s390 and x86 have this problem, while ppc64 and riscv have the correct dependency already. On riscv, the dependency is only used for the purgatory, not for the kexec_file code itself, which may be a bit surprising as it means that with CONFIG_CRYPTO=m, it is possible to enable KEXEC_FILE but then the purgatory code is silently left out. Move this into the common Kconfig.kexec file in a way that is correct everywhere, using the dependency on CRYPTO_SHA256=y only when the purgatory code is available. This requires reversing the dependency between ARCH_SUPPORTS_KEXEC_PURGATORY and KEXEC_FILE, but the effect remains the same, other than making riscv behave like the other ones. On s390, there is an additional dependency on CRYPTO_SHA256_S390, which should technically not be required but gives better performance. Remove this dependency here, noting that it was not present in the initial Kconfig code but was brought in without an explanation in commit 71406883fd357 ("s390/kexec_file: Add kexec_file_load system call"). Link: https://lkml.kernel.org/r/20231023110308.1202042-1-arnd@kernel.org Fixes: 6af5138083005 ("x86/kexec: refactor for kernel/Kconfig.kexec") Signed-off-by: Arnd Bergmann Cc: Albert Ou Cc: Alexander Gordeev Cc: Ard Biesheuvel Cc: Borislav Petkov Cc: Christian Borntraeger Cc: Christophe Leroy Cc: Conor Dooley Cc: Dave Hansen Cc: David S. Miller Cc: Eric DeVolder Cc: Heiko Carstens Cc: Herbert Xu Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: Nicholas Piggin Cc: Palmer Dabbelt Cc: Paul Walmsley Cc: Peter Zijlstra Cc: Sven Schnelle Cc: Thomas Gleixner Cc: Vasily Gorbik Signed-off-by: Andrew Morton --- arch/powerpc/Kconfig | 4 ++-- arch/riscv/Kconfig | 4 +--- arch/s390/Kconfig | 4 ++-- arch/x86/Kconfig | 4 ++-- kernel/Kconfig.kexec | 1 + 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 3aaadfd2c8eb24..2ebaff352f9061 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -607,10 +607,10 @@ config ARCH_SUPPORTS_KEXEC def_bool PPC_BOOK3S || PPC_E500 || (44x && !SMP) config ARCH_SUPPORTS_KEXEC_FILE - def_bool PPC64 && CRYPTO=y && CRYPTO_SHA256=y + def_bool PPC64 config ARCH_SUPPORTS_KEXEC_PURGATORY - def_bool KEXEC_FILE + def_bool y config ARCH_SELECTS_KEXEC_FILE def_bool y diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index d607ab0f7c6daf..39362559329f0c 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -687,9 +687,7 @@ config ARCH_SELECTS_KEXEC_FILE select KEXEC_ELF config ARCH_SUPPORTS_KEXEC_PURGATORY - def_bool KEXEC_FILE - depends on CRYPTO=y - depends on CRYPTO_SHA256=y + def_bool y config ARCH_SUPPORTS_CRASH_DUMP def_bool y diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index ae29e4392664ad..bd4782f23f66df 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -252,13 +252,13 @@ config ARCH_SUPPORTS_KEXEC def_bool y config ARCH_SUPPORTS_KEXEC_FILE - def_bool CRYPTO && CRYPTO_SHA256 && CRYPTO_SHA256_S390 + def_bool y config ARCH_SUPPORTS_KEXEC_SIG def_bool MODULE_SIG_FORMAT config ARCH_SUPPORTS_KEXEC_PURGATORY - def_bool KEXEC_FILE + def_bool y config ARCH_SUPPORTS_CRASH_DUMP def_bool y diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 66bfabae881491..fe3292e310d48c 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2034,7 +2034,7 @@ config ARCH_SUPPORTS_KEXEC def_bool y config ARCH_SUPPORTS_KEXEC_FILE - def_bool X86_64 && CRYPTO && CRYPTO_SHA256 + def_bool X86_64 config ARCH_SELECTS_KEXEC_FILE def_bool y @@ -2042,7 +2042,7 @@ config ARCH_SELECTS_KEXEC_FILE select HAVE_IMA_KEXEC if IMA config ARCH_SUPPORTS_KEXEC_PURGATORY - def_bool KEXEC_FILE + def_bool y config ARCH_SUPPORTS_KEXEC_SIG def_bool y diff --git a/kernel/Kconfig.kexec b/kernel/Kconfig.kexec index 9bfe68fe967624..3d75dbce712f9f 100644 --- a/kernel/Kconfig.kexec +++ b/kernel/Kconfig.kexec @@ -36,6 +36,7 @@ config KEXEC config KEXEC_FILE bool "Enable kexec file based system call" depends on ARCH_SUPPORTS_KEXEC_FILE + depends on CRYPTO_SHA256=y || !ARCH_SUPPORTS_KEXEC_PURGATORY select KEXEC_CORE help This is new version of kexec system call. This system call is From d1ecc40ee74fe25c751528293311414bd7998fcc Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Mon, 23 Oct 2023 13:01:55 +0200 Subject: [PATCH 475/515] kexec: select CRYPTO from KEXEC_FILE instead of depending on it All other users of crypto code use 'select' instead of 'depends on', so do the same thing with KEXEC_FILE for consistency. In practice this makes very little difference as kernels with kexec support are very likely to also include some other feature that already selects both crypto and crypto_sha256, but being consistent here helps for usability as well as to avoid potential circular dependencies. This reverts the dependency back to what it was originally before commit 74ca317c26a3f ("kexec: create a new config option CONFIG_KEXEC_FILE for new syscall"), which changed changed it with the comment "This should be safer as "select" is not recursive", but that appears to have been done in error, as "select" is indeed recursive, and there are no other dependencies that prevent CRYPTO_SHA256 from being selected here. Link: https://lkml.kernel.org/r/20231023110308.1202042-2-arnd@kernel.org Fixes: 74ca317c26a3f ("kexec: create a new config option CONFIG_KEXEC_FILE for new syscall") Signed-off-by: Arnd Bergmann Cc: Herbert Xu Cc: "David S. Miller" Cc: Albert Ou Cc: Alexander Gordeev Cc: Ard Biesheuvel Cc: Borislav Petkov Cc: Christian Borntraeger Cc: Christophe Leroy Cc: Conor Dooley Cc: Dave Hansen Cc: Eric DeVolder Cc: Heiko Carstens Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: Nicholas Piggin Cc: Palmer Dabbelt Cc: Paul Walmsley Cc: Peter Zijlstra Cc: Sven Schnelle Cc: Thomas Gleixner Cc: Vasily Gorbik Signed-off-by: Andrew Morton --- kernel/Kconfig.kexec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/Kconfig.kexec b/kernel/Kconfig.kexec index 3d75dbce712f9f..b2fad1f890b21d 100644 --- a/kernel/Kconfig.kexec +++ b/kernel/Kconfig.kexec @@ -36,7 +36,8 @@ config KEXEC config KEXEC_FILE bool "Enable kexec file based system call" depends on ARCH_SUPPORTS_KEXEC_FILE - depends on CRYPTO_SHA256=y || !ARCH_SUPPORTS_KEXEC_PURGATORY + select CRYPTO + select CRYPTO_SHA256 select KEXEC_CORE help This is new version of kexec system call. This system call is From 3f6b9d4e4705bbdb464017260210bac9552c88aa Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Mon, 23 Oct 2023 18:04:06 +0200 Subject: [PATCH 476/515] kexec-fix-kexec_file-dependencies-fix fix riscv build Link: https://lkml.kernel.org/r/67ddd260-d424-4229-a815-e3fcfb864a77@app.fastmail.com Signed-off-by: Arnd Bergmann Cc: Albert Ou Cc: Alexander Gordeev Cc: Ard Biesheuvel Cc: Borislav Petkov Cc: Christian Borntraeger Cc: Christophe Leroy Cc: Conor Dooley Cc: Dave Hansen Cc: "David S. Miller" Cc: Eric DeVolder Cc: Heiko Carstens Cc: Herbert Xu Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: Nicholas Piggin Cc: Palmer Dabbelt Cc: Paul Walmsley Cc: Peter Zijlstra Cc: Sven Schnelle Cc: Thomas Gleixner Cc: Vasily Gorbik Signed-off-by: Andrew Morton --- arch/riscv/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 39362559329f0c..543edd0cd373fb 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -687,7 +687,7 @@ config ARCH_SELECTS_KEXEC_FILE select KEXEC_ELF config ARCH_SUPPORTS_KEXEC_PURGATORY - def_bool y + def_bool ARCH_SUPPORTS_KEXEC_FILE config ARCH_SUPPORTS_CRASH_DUMP def_bool y From db27869df6edc883ea6513b29834b8dad4ee84ae Mon Sep 17 00:00:00 2001 From: SeongJae Park Date: Sun, 22 Oct 2023 21:07:33 +0000 Subject: [PATCH 477/515] mm/damon/sysfs: remove requested targets when online-commit inputs damon_sysfs_set_targets(), which updates the targets of the context for online commitment, do not remove targets that removed from the corresponding sysfs files. As a result, more than intended targets of the context can exist and hence consume memory and monitoring CPU resource more than expected. Fix it by removing all targets of the context and fill up again using the user input. This could cause unnecessary memory dealloc and realloc operations, but this is not a hot code path. Also, note that damon_target is stateless, and hence no data is lost. Link: https://lkml.kernel.org/r/20231022210735.46409-2-sj@kernel.org Fixes: da87878010e5 ("mm/damon/sysfs: support online inputs update") Signed-off-by: SeongJae Park Cc: Brendan Higgins Cc: [5.19.x] Signed-off-by: Andrew Morton --- mm/damon/sysfs.c | 50 +++++++++--------------------------------------- 1 file changed, 9 insertions(+), 41 deletions(-) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index f60e56150feb69..580e1f28b98f1c 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -1150,58 +1150,26 @@ static int damon_sysfs_add_target(struct damon_sysfs_target *sys_target, return err; } -/* - * Search a target in a context that corresponds to the sysfs target input. - * - * Return: pointer to the target if found, NULL if not found, or negative - * error code if the search failed. - */ -static struct damon_target *damon_sysfs_existing_target( - struct damon_sysfs_target *sys_target, struct damon_ctx *ctx) -{ - struct pid *pid; - struct damon_target *t; - - if (!damon_target_has_pid(ctx)) { - /* Up to only one target for paddr could exist */ - damon_for_each_target(t, ctx) - return t; - return NULL; - } - - /* ops.id should be DAMON_OPS_VADDR or DAMON_OPS_FVADDR */ - pid = find_get_pid(sys_target->pid); - if (!pid) - return ERR_PTR(-EINVAL); - damon_for_each_target(t, ctx) { - if (t->pid == pid) { - put_pid(pid); - return t; - } - } - put_pid(pid); - return NULL; -} - static int damon_sysfs_set_targets(struct damon_ctx *ctx, struct damon_sysfs_targets *sysfs_targets) { + struct damon_target *t, *next; int i, err; /* Multiple physical address space monitoring targets makes no sense */ if (ctx->ops.id == DAMON_OPS_PADDR && sysfs_targets->nr > 1) return -EINVAL; + damon_for_each_target_safe(t, next, ctx) { + if (damon_target_has_pid(ctx)) + put_pid(t->pid); + damon_destroy_target(t); + } + for (i = 0; i < sysfs_targets->nr; i++) { struct damon_sysfs_target *st = sysfs_targets->targets_arr[i]; - struct damon_target *t = damon_sysfs_existing_target(st, ctx); - - if (IS_ERR(t)) - return PTR_ERR(t); - if (!t) - err = damon_sysfs_add_target(st, ctx); - else - err = damon_sysfs_set_regions(t, st->regions); + + err = damon_sysfs_add_target(st, ctx); if (err) return err; } From cf8cf3731e6e27e9a43e4732d901e26d8cbe440c Mon Sep 17 00:00:00 2001 From: Zhaoyang Huang Date: Thu, 11 May 2023 13:22:30 +0800 Subject: [PATCH 478/515] mm: optimization on page allocation when CMA enabled According to current CMA utilization policy, an alloc_pages(GFP_USER) could 'steal' UNMOVABLE & RECLAIMABLE page blocks via the help of CMA(pass zone_watermark_ok by counting CMA in but use U&R in rmqueue), which could lead to following alloc_pages(GFP_KERNEL) fail. Solving this by introducing second watermark checking for GFP_MOVABLE, which could have the allocation use CMA when proper. -- Free_pages(30MB) | | -- WMARK_LOW(25MB) | -- Free_CMA(12MB) | | -- Link: https://lkml.kernel.org/r/20231016071245.2865233-1-zhaoyang.huang@unisoc.com Link: https://lkml.kernel.org/r/1683782550-25799-1-git-send-email-zhaoyang.huang@unisoc.com Signed-off-by: Zhaoyang Huang Cc: Joonsoo Kim Cc: ke.wang Cc: Minchan Kim Cc: Roman Gushchin Cc: Zhaoyang Huang Signed-off-by: Andrew Morton --- mm/page_alloc.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 733732e7e0ba73..b8544f08cc3654 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2079,6 +2079,43 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype, } +#ifdef CONFIG_CMA +/* + * GFP_MOVABLE allocation could drain UNMOVABLE & RECLAIMABLE page blocks via + * the help of CMA which makes GFP_KERNEL failed. Checking if zone_watermark_ok + * again without ALLOC_CMA to see if to use CMA first. + */ +static bool use_cma_first(struct zone *zone, unsigned int order, unsigned int alloc_flags) +{ + unsigned long watermark; + bool cma_first = false; + + watermark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK); + /* check if GFP_MOVABLE pass previous zone_watermark_ok via the help of CMA */ + if (zone_watermark_ok(zone, order, watermark, 0, alloc_flags & (~ALLOC_CMA))) { + /* + * Balance movable allocations between regular and CMA areas by + * allocating from CMA when over half of the zone's free memory + * is in the CMA area. + */ + cma_first = (zone_page_state(zone, NR_FREE_CMA_PAGES) > + zone_page_state(zone, NR_FREE_PAGES) / 2); + } else { + /* + * watermark failed means UNMOVABLE & RECLAIMBLE is not enough + * now, we should use cma first to keep them stay around the + * corresponding watermark + */ + cma_first = true; + } + return cma_first; +} +#else +static bool use_cma_first(struct zone *zone, unsigned int order, unsigned int alloc_flags) +{ + return false; +} +#endif /* * Do the hard work of removing an element from the buddy allocator. * Call me with the zone->lock already held. @@ -2092,12 +2129,11 @@ __rmqueue(struct zone *zone, unsigned int order, int migratetype, if (IS_ENABLED(CONFIG_CMA)) { /* * Balance movable allocations between regular and CMA areas by - * allocating from CMA when over half of the zone's free memory - * is in the CMA area. + * allocating from CMA base on judging zone_watermark_ok again + * to see if the latest check got pass via the help of CMA */ if (alloc_flags & ALLOC_CMA && - zone_page_state(zone, NR_FREE_CMA_PAGES) > - zone_page_state(zone, NR_FREE_PAGES) / 2) { + use_cma_first(zone, order, alloc_flags)) { page = __rmqueue_cma_fallback(zone, order); if (page) return page; From fc94b020a4ada6ef83da58323d9e931a36e42f25 Mon Sep 17 00:00:00 2001 From: Liu Shixin Date: Wed, 30 Aug 2023 11:56:00 +0800 Subject: [PATCH 479/515] mm: vmscan: try to reclaim swapcache pages if no swap space When spaces of swap devices are exhausted, only file pages can be reclaimed. But there are still some swapcache pages in anon lru list. This can lead to a premature out-of-memory. The problem is found with such step: Firstly, set a 9MB disk swap space, then create a cgroup with 10MB memory limit, then runs an program to allocates about 15MB memory. The problem occurs occasionally, which may need about 100 times [1]. Fix it by checking number of swapcache pages in can_reclaim_anon_pages(). If the number is not zero, return true and set swapcache_only to 1. When scan anon lru list in swapcache_only mode, non-swapcache pages will be skipped to isolate in order to accelerate reclaim efficiency. However, in swapcache_only mode, the scan count still increased when scan non-swapcache pages because there are large number of non-swapcache pages and rare swapcache pages in swapcache_only mode, and if the non-swapcache is skipped and do not count, the scan of pages in isolate_lru_folios() can eventually lead to hung task, just as Sachin reported [2]. By the way, since there are enough times of memory reclaim before OOM, it is not need to isolate too much swapcache pages in one times. [1]. https://lore.kernel.org/lkml/CAJD7tkZAfgncV+KbKr36=eDzMnT=9dZOT0dpMWcurHLr6Do+GA@mail.gmail.com/ [2]. https://lore.kernel.org/linux-mm/CAJD7tkafz_2XAuqE8tGLPEcpLngewhUo=5US14PAtSM9tLBUQg@mail.gmail.com/ Link: https://lore.kernel.org/lkml/CAJD7tkZAfgncV+KbKr36=eDzMnT=9dZOT0dpMWcurHLr6Do+GA@mail.gmail.com/ Link: https://lkml.kernel.org/r/20230830035600.1656792-1-liushixin2@huawei.com Signed-off-by: Liu Shixin Tested-by: Yosry Ahmed Reviewed-by: "Huang, Ying" Reviewed-by: Yosry Ahmed Cc: Johannes Weiner Cc: Kefeng Wang Cc: Michal Hocko Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Cc: Sachin Sant Signed-off-by: Andrew Morton --- include/linux/swap.h | 6 ++++++ mm/memcontrol.c | 8 ++++++++ mm/vmscan.c | 29 +++++++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 493487ed7c388b..19f30a29e1f1a3 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -658,6 +658,7 @@ static inline void mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_p } extern long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg); +extern long mem_cgroup_get_nr_swapcache_pages(struct mem_cgroup *memcg); extern bool mem_cgroup_swap_full(struct folio *folio); #else static inline void mem_cgroup_swapout(struct folio *folio, swp_entry_t entry) @@ -680,6 +681,11 @@ static inline long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg) return get_nr_swap_pages(); } +static inline long mem_cgroup_get_nr_swapcache_pages(struct mem_cgroup *memcg) +{ + return total_swapcache_pages(); +} + static inline bool mem_cgroup_swap_full(struct folio *folio) { return vm_swap_full(); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 774bd6e21e2788..a76ec540d4a377 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -7865,6 +7865,14 @@ long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg) return nr_swap_pages; } +long mem_cgroup_get_nr_swapcache_pages(struct mem_cgroup *memcg) +{ + if (mem_cgroup_disabled()) + return total_swapcache_pages(); + + return memcg_page_state(memcg, NR_SWAPCACHE); +} + bool mem_cgroup_swap_full(struct folio *folio) { struct mem_cgroup *memcg; diff --git a/mm/vmscan.c b/mm/vmscan.c index 506f8220c5fe53..d2f70306bb5350 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -136,6 +136,9 @@ struct scan_control { /* Always discard instead of demoting to lower tier memory */ unsigned int no_demotion:1; + /* Swap space is exhausted, only reclaim swapcache for anon LRU */ + unsigned int swapcache_only:1; + /* Allocation order */ s8 order; @@ -319,10 +322,20 @@ static inline bool can_reclaim_anon_pages(struct mem_cgroup *memcg, */ if (get_nr_swap_pages() > 0) return true; + /* Is there any swapcache pages to reclaim? */ + if (total_swapcache_pages() > 0) { + sc->swapcache_only = 1; + return true; + } } else { /* Is the memcg below its swap limit? */ if (mem_cgroup_get_nr_swap_pages(memcg) > 0) return true; + /* Is there any swapcache pages in memcg to reclaim? */ + if (mem_cgroup_get_nr_swapcache_pages(memcg) > 0) { + sc->swapcache_only = 1; + return true; + } } /* @@ -1580,6 +1593,19 @@ static bool skip_cma(struct folio *folio, struct scan_control *sc) } #endif +static bool skip_isolate(struct folio *folio, struct scan_control *sc, + enum lru_list lru) +{ + if (folio_zonenum(folio) > sc->reclaim_idx) + return true; + if (skip_cma(folio, sc)) + return true; + if (unlikely(sc->swapcache_only && !is_file_lru(lru) && + !folio_test_swapcache(folio))) + return true; + return false; +} + /* * Isolating page from the lruvec to fill in @dst list by nr_to_scan times. * @@ -1626,8 +1652,7 @@ static unsigned long isolate_lru_folios(unsigned long nr_to_scan, nr_pages = folio_nr_pages(folio); total_scan += nr_pages; - if (folio_zonenum(folio) > sc->reclaim_idx || - skip_cma(folio, sc)) { + if (skip_isolate(folio, sc, lru)) { nr_skipped[folio_zonenum(folio)] += nr_pages; move_to = &folios_skipped; goto move; From 381d897922a43cf5bd980b64a3d1c06056978954 Mon Sep 17 00:00:00 2001 From: Liu Shixin Date: Fri, 15 Sep 2023 16:34:17 +0800 Subject: [PATCH 480/515] mm-vmscan-try-to-reclaim-swapcache-pages-if-no-swap-space-v6 fix NULL pointing derefence and hung task problem reported by Sachin Link: https://lkml.kernel.org/r/20230915083417.3190512-1-liushixin2@huawei.com Signed-off-by: Liu Shixin Tested-by: Yosry Ahmed Reviewed-by: "Huang, Ying" Reviewed-by: Yosry Ahmed Cc: "Huang, Ying" Cc: Johannes Weiner Cc: Kefeng Wang Cc: Michal Hocko Cc: Sachin Sant Cc: Yosry Ahmed Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Signed-off-by: Andrew Morton --- mm/vmscan.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index d2f70306bb5350..c16e2b1ea8ae3d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -324,7 +324,8 @@ static inline bool can_reclaim_anon_pages(struct mem_cgroup *memcg, return true; /* Is there any swapcache pages to reclaim? */ if (total_swapcache_pages() > 0) { - sc->swapcache_only = 1; + if (sc) + sc->swapcache_only = 1; return true; } } else { @@ -333,7 +334,8 @@ static inline bool can_reclaim_anon_pages(struct mem_cgroup *memcg, return true; /* Is there any swapcache pages in memcg to reclaim? */ if (mem_cgroup_get_nr_swapcache_pages(memcg) > 0) { - sc->swapcache_only = 1; + if (sc) + sc->swapcache_only = 1; return true; } } @@ -1593,19 +1595,6 @@ static bool skip_cma(struct folio *folio, struct scan_control *sc) } #endif -static bool skip_isolate(struct folio *folio, struct scan_control *sc, - enum lru_list lru) -{ - if (folio_zonenum(folio) > sc->reclaim_idx) - return true; - if (skip_cma(folio, sc)) - return true; - if (unlikely(sc->swapcache_only && !is_file_lru(lru) && - !folio_test_swapcache(folio))) - return true; - return false; -} - /* * Isolating page from the lruvec to fill in @dst list by nr_to_scan times. * @@ -1652,7 +1641,8 @@ static unsigned long isolate_lru_folios(unsigned long nr_to_scan, nr_pages = folio_nr_pages(folio); total_scan += nr_pages; - if (skip_isolate(folio, sc, lru)) { + if (folio_zonenum(folio) > sc->reclaim_idx || + skip_cma(folio, sc)) { nr_skipped[folio_zonenum(folio)] += nr_pages; move_to = &folios_skipped; goto move; @@ -1667,6 +1657,15 @@ static unsigned long isolate_lru_folios(unsigned long nr_to_scan, */ scan += nr_pages; + /* + * Count non-swapcache too because the swapcache pages may + * be rare and it takes too much times here if not count + * the non-swapcache pages. + */ + if (unlikely(sc->swapcache_only && !is_file_lru(lru) && + !folio_test_swapcache(folio))) + goto move; + if (!folio_test_lru(folio)) goto move; if (!sc->may_unmap && folio_mapped(folio)) From 6afa11b8d777e583c96da625f7f5249fa2030df7 Mon Sep 17 00:00:00 2001 From: Liam Ni Date: Mon, 11 Sep 2023 21:38:52 +0800 Subject: [PATCH 481/515] NUMA: improve the efficiency of calculating pages loss Optimize the way of calculating missing pages. In the previous implementation, We calculate missing pages as follows: 1. calculate numaram by traverse all the numa_meminfo's and for each of them traverse all the regions in memblock.memory to prepare for counting missing pages. 2. Traverse all the regions in memblock.memory again to get e820ram. 3. the missing page is (e820ram - numaram ) But it's enough to count memory in `memblock.memory' that doesn't have the node assigned. Link: https://lkml.kernel.org/r/20230911133852.2545-1-zhiguangni01@gmail.com Signed-off-by: Liam Ni Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Dave Hansen Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: Mike Rapoport Cc: Peter Zijlstra Cc: Thomas Gleixner Signed-off-by: Andrew Morton --- arch/x86/mm/numa.c | 33 +-------------------------------- include/linux/memblock.h | 1 + mm/memblock.c | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 2aadb2019b4f23..ee5f08adfaf6a4 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c @@ -447,37 +447,6 @@ int __node_distance(int from, int to) } EXPORT_SYMBOL(__node_distance); -/* - * Sanity check to catch more bad NUMA configurations (they are amazingly - * common). Make sure the nodes cover all memory. - */ -static bool __init numa_meminfo_cover_memory(const struct numa_meminfo *mi) -{ - u64 numaram, e820ram; - int i; - - numaram = 0; - for (i = 0; i < mi->nr_blks; i++) { - u64 s = mi->blk[i].start >> PAGE_SHIFT; - u64 e = mi->blk[i].end >> PAGE_SHIFT; - numaram += e - s; - numaram -= __absent_pages_in_range(mi->blk[i].nid, s, e); - if ((s64)numaram < 0) - numaram = 0; - } - - e820ram = max_pfn - absent_pages_in_range(0, max_pfn); - - /* We seem to lose 3 pages somewhere. Allow 1M of slack. */ - if ((s64)(e820ram - numaram) >= (1 << (20 - PAGE_SHIFT))) { - printk(KERN_ERR "NUMA: nodes only cover %LuMB of your %LuMB e820 RAM. Not used.\n", - (numaram << PAGE_SHIFT) >> 20, - (e820ram << PAGE_SHIFT) >> 20); - return false; - } - return true; -} - /* * Mark all currently memblock-reserved physical memory (which covers the * kernel's own memory ranges) as hot-unswappable. @@ -583,7 +552,7 @@ static int __init numa_register_memblks(struct numa_meminfo *mi) return -EINVAL; } } - if (!numa_meminfo_cover_memory(mi)) + if (!memblock_validate_numa_coverage(SZ_1M)) return -EINVAL; /* Finally register nodes. */ diff --git a/include/linux/memblock.h b/include/linux/memblock.h index ae3bde302f704a..1c90f4e86dc5c8 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -123,6 +123,7 @@ int memblock_physmem_add(phys_addr_t base, phys_addr_t size); void memblock_trim_memory(phys_addr_t align); bool memblock_overlaps_region(struct memblock_type *type, phys_addr_t base, phys_addr_t size); +bool memblock_validate_numa_coverage(const u64 limit); int memblock_mark_hotplug(phys_addr_t base, phys_addr_t size); int memblock_clear_hotplug(phys_addr_t base, phys_addr_t size); int memblock_mark_mirror(phys_addr_t base, phys_addr_t size); diff --git a/mm/memblock.c b/mm/memblock.c index fd492e5bbdbcde..f15c706f646457 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -734,6 +734,27 @@ int __init_memblock memblock_add(phys_addr_t base, phys_addr_t size) return memblock_add_range(&memblock.memory, base, size, MAX_NUMNODES, 0); } +bool __init_memblock memblock_validate_numa_coverage(const u64 limit) +{ + unsigned long lose_pg = 0; + unsigned long start_pfn, end_pfn; + int nid, i; + + /* calculate lose page */ + for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) { + if (nid == NUMA_NO_NODE) + lose_pg += end_pfn - start_pfn; + } + + if (lose_pg >= limit) { + pr_err("NUMA: We lost %ld pages.\n", lose_pg); + return false; + } + + return true; +} + + /** * memblock_isolate_range - isolate given range into disjoint memblocks * @type: memblock type to isolate range for From c745c255829694a2ed43ca31d180a00622111842 Mon Sep 17 00:00:00 2001 From: Yosry Ahmed Date: Tue, 10 Oct 2023 03:21:12 +0000 Subject: [PATCH 482/515] mm: memcg: change flush_next_time to flush_last_time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch series "mm: memcg: subtree stats flushing and thresholds", v2. This series attempts to address shortages in today's approach for memcg stats flushing, namely occasionally stale or expensive stat reads. The series does so by changing the threshold that we use to decide whether to trigger a flush to be per memcg instead of global (patch 3), and then changing flushing to be per memcg (i.e. subtree flushes) instead of global (patch 5). Patch 3 & 5 are the core of the series, and they include more details and testing results. The rest are either cleanups or prep work. This series replaces the "memcg: more sophisticated stats flushing" series [1], which also replaces another series, in a long list of attempts to improve memcg stats flushing. It is not a new version of the same patchset as it is a completely different approach. This is based on collected feedback from discussions on lkml in all previous attempts. Hopefully, this is the final attempt. [1]https://lore.kernel.org/lkml/20230913073846.1528938-1-yosryahmed@google.com/ Domenico Cerasuolo reported: : We backported it on a 5.19-based kernel and ran it on a machine for almost : a week now. The goal was to fix a CPU utilization regression caused by : memory stats readings, it seems that this series was the last bit needed : to completely fix it and bring CPU utilization to 5.12 levels. This patch (of 5): flush_next_time is an inaccurate name. It's not the next time that periodic flushing will happen, it's rather the next time that ratelimited flushing can happen if the periodic flusher is late. Simplify its semantics by just storing the timestamp of the last flush instead, flush_last_time. Move the 2*FLUSH_TIME addition to mem_cgroup_flush_stats_ratelimited(), and add a comment explaining it. This way, all the ratelimiting semantics live in one place. No functional change intended. Link: https://lkml.kernel.org/r/20231010032117.1577496-1-yosryahmed@google.com Link: https://lkml.kernel.org/r/20231010032117.1577496-2-yosryahmed@google.com Signed-off-by: Yosry Ahmed Tested-by: Domenico Cerasuolo Cc: Greg Thelen Cc: Ivan Babrou Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutný Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Cc: Tejun heo Cc: Waiman Long Cc: Wei Xu Signed-off-by: Andrew Morton --- mm/memcontrol.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a76ec540d4a377..645284f533ec38 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -593,7 +593,7 @@ static DECLARE_DEFERRABLE_WORK(stats_flush_dwork, flush_memcg_stats_dwork); static DEFINE_PER_CPU(unsigned int, stats_updates); static atomic_t stats_flush_ongoing = ATOMIC_INIT(0); static atomic_t stats_flush_threshold = ATOMIC_INIT(0); -static u64 flush_next_time; +static u64 flush_last_time; #define FLUSH_TIME (2UL*HZ) @@ -653,7 +653,7 @@ static void do_flush_stats(void) atomic_xchg(&stats_flush_ongoing, 1)) return; - WRITE_ONCE(flush_next_time, jiffies_64 + 2*FLUSH_TIME); + WRITE_ONCE(flush_last_time, jiffies_64); cgroup_rstat_flush(root_mem_cgroup->css.cgroup); @@ -669,7 +669,8 @@ void mem_cgroup_flush_stats(void) void mem_cgroup_flush_stats_ratelimited(void) { - if (time_after64(jiffies_64, READ_ONCE(flush_next_time))) + /* Only flush if the periodic flusher is one full cycle late */ + if (time_after64(jiffies_64, READ_ONCE(flush_last_time) + 2*FLUSH_TIME)) mem_cgroup_flush_stats(); } From 36e392310b4081bc0a7c100565e8bb54c3e158ff Mon Sep 17 00:00:00 2001 From: Yosry Ahmed Date: Tue, 10 Oct 2023 03:21:13 +0000 Subject: [PATCH 483/515] mm: memcg: move vmstats structs definition above flushing code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The following patch will make use of those structs in the flushing code, so move their definitions (and a few other dependencies) a little bit up to reduce the diff noise in the following patch. No functional change intended. Link: https://lkml.kernel.org/r/20231010032117.1577496-3-yosryahmed@google.com Signed-off-by: Yosry Ahmed Tested-by: Domenico Cerasuolo Cc: Greg Thelen Cc: Ivan Babrou Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutný Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Cc: Tejun heo Cc: Waiman Long Cc: Wei Xu Signed-off-by: Andrew Morton --- mm/memcontrol.c | 146 ++++++++++++++++++++++++------------------------ 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 645284f533ec38..17e1fffd3b632f 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -573,6 +573,79 @@ mem_cgroup_largest_soft_limit_node(struct mem_cgroup_tree_per_node *mctz) return mz; } +/* Subset of vm_event_item to report for memcg event stats */ +static const unsigned int memcg_vm_event_stat[] = { + PGPGIN, + PGPGOUT, + PGSCAN_KSWAPD, + PGSCAN_DIRECT, + PGSCAN_KHUGEPAGED, + PGSTEAL_KSWAPD, + PGSTEAL_DIRECT, + PGSTEAL_KHUGEPAGED, + PGFAULT, + PGMAJFAULT, + PGREFILL, + PGACTIVATE, + PGDEACTIVATE, + PGLAZYFREE, + PGLAZYFREED, +#if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_ZSWAP) + ZSWPIN, + ZSWPOUT, +#endif +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + THP_FAULT_ALLOC, + THP_COLLAPSE_ALLOC, + THP_SWPOUT, + THP_SWPOUT_FALLBACK, +#endif +}; + +#define NR_MEMCG_EVENTS ARRAY_SIZE(memcg_vm_event_stat) +static int mem_cgroup_events_index[NR_VM_EVENT_ITEMS] __read_mostly; + +static void init_memcg_events(void) +{ + int i; + + for (i = 0; i < NR_MEMCG_EVENTS; ++i) + mem_cgroup_events_index[memcg_vm_event_stat[i]] = i + 1; +} + +static inline int memcg_events_index(enum vm_event_item idx) +{ + return mem_cgroup_events_index[idx] - 1; +} + +struct memcg_vmstats_percpu { + /* Local (CPU and cgroup) page state & events */ + long state[MEMCG_NR_STAT]; + unsigned long events[NR_MEMCG_EVENTS]; + + /* Delta calculation for lockless upward propagation */ + long state_prev[MEMCG_NR_STAT]; + unsigned long events_prev[NR_MEMCG_EVENTS]; + + /* Cgroup1: threshold notifications & softlimit tree updates */ + unsigned long nr_page_events; + unsigned long targets[MEM_CGROUP_NTARGETS]; +}; + +struct memcg_vmstats { + /* Aggregated (CPU and subtree) page state & events */ + long state[MEMCG_NR_STAT]; + unsigned long events[NR_MEMCG_EVENTS]; + + /* Non-hierarchical (CPU aggregated) page state & events */ + long state_local[MEMCG_NR_STAT]; + unsigned long events_local[NR_MEMCG_EVENTS]; + + /* Pending child counts during tree propagation */ + long state_pending[MEMCG_NR_STAT]; + unsigned long events_pending[NR_MEMCG_EVENTS]; +}; + /* * memcg and lruvec stats flushing * @@ -684,79 +757,6 @@ static void flush_memcg_stats_dwork(struct work_struct *w) queue_delayed_work(system_unbound_wq, &stats_flush_dwork, FLUSH_TIME); } -/* Subset of vm_event_item to report for memcg event stats */ -static const unsigned int memcg_vm_event_stat[] = { - PGPGIN, - PGPGOUT, - PGSCAN_KSWAPD, - PGSCAN_DIRECT, - PGSCAN_KHUGEPAGED, - PGSTEAL_KSWAPD, - PGSTEAL_DIRECT, - PGSTEAL_KHUGEPAGED, - PGFAULT, - PGMAJFAULT, - PGREFILL, - PGACTIVATE, - PGDEACTIVATE, - PGLAZYFREE, - PGLAZYFREED, -#if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_ZSWAP) - ZSWPIN, - ZSWPOUT, -#endif -#ifdef CONFIG_TRANSPARENT_HUGEPAGE - THP_FAULT_ALLOC, - THP_COLLAPSE_ALLOC, - THP_SWPOUT, - THP_SWPOUT_FALLBACK, -#endif -}; - -#define NR_MEMCG_EVENTS ARRAY_SIZE(memcg_vm_event_stat) -static int mem_cgroup_events_index[NR_VM_EVENT_ITEMS] __read_mostly; - -static void init_memcg_events(void) -{ - int i; - - for (i = 0; i < NR_MEMCG_EVENTS; ++i) - mem_cgroup_events_index[memcg_vm_event_stat[i]] = i + 1; -} - -static inline int memcg_events_index(enum vm_event_item idx) -{ - return mem_cgroup_events_index[idx] - 1; -} - -struct memcg_vmstats_percpu { - /* Local (CPU and cgroup) page state & events */ - long state[MEMCG_NR_STAT]; - unsigned long events[NR_MEMCG_EVENTS]; - - /* Delta calculation for lockless upward propagation */ - long state_prev[MEMCG_NR_STAT]; - unsigned long events_prev[NR_MEMCG_EVENTS]; - - /* Cgroup1: threshold notifications & softlimit tree updates */ - unsigned long nr_page_events; - unsigned long targets[MEM_CGROUP_NTARGETS]; -}; - -struct memcg_vmstats { - /* Aggregated (CPU and subtree) page state & events */ - long state[MEMCG_NR_STAT]; - unsigned long events[NR_MEMCG_EVENTS]; - - /* Non-hierarchical (CPU aggregated) page state & events */ - long state_local[MEMCG_NR_STAT]; - unsigned long events_local[NR_MEMCG_EVENTS]; - - /* Pending child counts during tree propagation */ - long state_pending[MEMCG_NR_STAT]; - unsigned long events_pending[NR_MEMCG_EVENTS]; -}; - unsigned long memcg_page_state(struct mem_cgroup *memcg, int idx) { long x = READ_ONCE(memcg->vmstats->state[idx]); From d56f2976787278dc092e3ae89a0f5abf3dcde788 Mon Sep 17 00:00:00 2001 From: Yosry Ahmed Date: Tue, 10 Oct 2023 03:21:14 +0000 Subject: [PATCH 484/515] mm: memcg: make stats flushing threshold per-memcg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A global counter for the magnitude of memcg stats update is maintained on the memcg side to avoid invoking rstat flushes when the pending updates are not significant. This avoids unnecessary flushes, which are not very cheap even if there isn't a lot of stats to flush. It also avoids unnecessary lock contention on the underlying global rstat lock. Make this threshold per-memcg. The scheme is followed where percpu (now also per-memcg) counters are incremented in the update path, and only propagated to per-memcg atomics when they exceed a certain threshold. This provides two benefits: (a) On large machines with a lot of memcgs, the global threshold can be reached relatively fast, so guarding the underlying lock becomes less effective. Making the threshold per-memcg avoids this. (b) Having a global threshold makes it hard to do subtree flushes, as we cannot reset the global counter except for a full flush. Per-memcg counters removes this as a blocker from doing subtree flushes, which helps avoid unnecessary work when the stats of a small subtree are needed. Nothing is free, of course. This comes at a cost: (a) A new per-cpu counter per memcg, consuming NR_CPUS * NR_MEMCGS * 4 bytes. The extra memory usage is insigificant. (b) More work on the update side, although in the common case it will only be percpu counter updates. The amount of work scales with the number of ancestors (i.e. tree depth). This is not a new concept, adding a cgroup to the rstat tree involves a parent loop, so is charging. Testing results below show no significant regressions. (c) The error margin in the stats for the system as a whole increases from NR_CPUS * MEMCG_CHARGE_BATCH to NR_CPUS * MEMCG_CHARGE_BATCH * NR_MEMCGS. This is probably fine because we have a similar per-memcg error in charges coming from percpu stocks, and we have a periodic flusher that makes sure we always flush all the stats every 2s anyway. This patch was tested to make sure no significant regressions are introduced on the update path as follows. The following benchmarks were ran in a cgroup that is 2 levels deep (/sys/fs/cgroup/a/b/): (1) Running 22 instances of netperf on a 44 cpu machine with hyperthreading disabled. All instances are run in a level 2 cgroup, as well as netserver: # netserver -6 # netperf -6 -H ::1 -l 60 -t TCP_SENDFILE -- -m 10K Averaging 20 runs, the numbers are as follows: Base: 40198.0 mbps Patched: 38629.7 mbps (-3.9%) The regression is minimal, especially for 22 instances in the same cgroup sharing all ancestors (so updating the same atomics). (2) will-it-scale page_fault tests. These tests (specifically per_process_ops in page_fault3 test) detected a 25.9% regression before for a change in the stats update path [1]. These are the numbers from 10 runs (+ is good) on a machine with 256 cpus: LABEL | MEAN | MEDIAN | STDDEV | ------------------------------+-------------+-------------+------------- page_fault1_per_process_ops | | | | (A) base | 270249.164 | 265437.000 | 13451.836 | (B) patched | 261368.709 | 255725.000 | 13394.767 | | -3.29% | -3.66% | | page_fault1_per_thread_ops | | | | (A) base | 242111.345 | 239737.000 | 10026.031 | (B) patched | 237057.109 | 235305.000 | 9769.687 | | -2.09% | -1.85% | | page_fault1_scalability | | | (A) base | 0.034387 | 0.035168 | 0.0018283 | (B) patched | 0.033988 | 0.034573 | 0.0018056 | | -1.16% | -1.69% | | page_fault2_per_process_ops | | | (A) base | 203561.836 | 203301.000 | 2550.764 | (B) patched | 197195.945 | 197746.000 | 2264.263 | | -3.13% | -2.73% | | page_fault2_per_thread_ops | | | (A) base | 171046.473 | 170776.000 | 1509.679 | (B) patched | 166626.327 | 166406.000 | 768.753 | | -2.58% | -2.56% | | page_fault2_scalability | | | (A) base | 0.054026 | 0.053821 | 0.00062121 | (B) patched | 0.053329 | 0.05306 | 0.00048394 | | -1.29% | -1.41% | | page_fault3_per_process_ops | | | (A) base | 1295807.782 | 1297550.000 | 5907.585 | (B) patched | 1275579.873 | 1273359.000 | 8759.160 | | -1.56% | -1.86% | | page_fault3_per_thread_ops | | | (A) base | 391234.164 | 390860.000 | 1760.720 | (B) patched | 377231.273 | 376369.000 | 1874.971 | | -3.58% | -3.71% | | page_fault3_scalability | | | (A) base | 0.60369 | 0.60072 | 0.0083029 | (B) patched | 0.61733 | 0.61544 | 0.009855 | | +2.26% | +2.45% | | All regressions seem to be minimal, and within the normal variance for the benchmark. The fix for [1] assumes that 3% is noise -- and there were no further practical complaints), so hopefully this means that such variations in these microbenchmarks do not reflect on practical workloads. (3) I also ran stress-ng in a nested cgroup and did not observe any obvious regressions. [1] https://lore.kernel.org/all/20190520063534.GB19312@shao2-debian/ Link: https://lkml.kernel.org/r/20231010032117.1577496-4-yosryahmed@google.com Signed-off-by: Yosry Ahmed Tested-by: Domenico Cerasuolo Cc: Greg Thelen Cc: Ivan Babrou Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutný Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Cc: Tejun heo Cc: Waiman Long Cc: Wei Xu Signed-off-by: Andrew Morton --- mm/memcontrol.c | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 17e1fffd3b632f..d7ee6094b8c8ef 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -630,6 +630,9 @@ struct memcg_vmstats_percpu { /* Cgroup1: threshold notifications & softlimit tree updates */ unsigned long nr_page_events; unsigned long targets[MEM_CGROUP_NTARGETS]; + + /* Stats updates since the last flush */ + unsigned int stats_updates; }; struct memcg_vmstats { @@ -644,6 +647,9 @@ struct memcg_vmstats { /* Pending child counts during tree propagation */ long state_pending[MEMCG_NR_STAT]; unsigned long events_pending[NR_MEMCG_EVENTS]; + + /* Stats updates since the last flush */ + atomic64_t stats_updates; }; /* @@ -663,9 +669,7 @@ struct memcg_vmstats { */ static void flush_memcg_stats_dwork(struct work_struct *w); static DECLARE_DEFERRABLE_WORK(stats_flush_dwork, flush_memcg_stats_dwork); -static DEFINE_PER_CPU(unsigned int, stats_updates); static atomic_t stats_flush_ongoing = ATOMIC_INIT(0); -static atomic_t stats_flush_threshold = ATOMIC_INIT(0); static u64 flush_last_time; #define FLUSH_TIME (2UL*HZ) @@ -692,26 +696,37 @@ static void memcg_stats_unlock(void) preempt_enable_nested(); } + +static bool memcg_should_flush_stats(struct mem_cgroup *memcg) +{ + return atomic64_read(&memcg->vmstats->stats_updates) > + MEMCG_CHARGE_BATCH * num_online_cpus(); +} + static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val) { + int cpu = smp_processor_id(); unsigned int x; if (!val) return; - cgroup_rstat_updated(memcg->css.cgroup, smp_processor_id()); + cgroup_rstat_updated(memcg->css.cgroup, cpu); + + for (; memcg; memcg = parent_mem_cgroup(memcg)) { + x = __this_cpu_add_return(memcg->vmstats_percpu->stats_updates, + abs(val)); + + if (x < MEMCG_CHARGE_BATCH) + continue; - x = __this_cpu_add_return(stats_updates, abs(val)); - if (x > MEMCG_CHARGE_BATCH) { /* - * If stats_flush_threshold exceeds the threshold - * (>num_online_cpus()), cgroup stats update will be triggered - * in __mem_cgroup_flush_stats(). Increasing this var further - * is redundant and simply adds overhead in atomic update. + * If @memcg is already flush-able, increasing stats_updates is + * redundant. Avoid the overhead of the atomic update. */ - if (atomic_read(&stats_flush_threshold) <= num_online_cpus()) - atomic_add(x / MEMCG_CHARGE_BATCH, &stats_flush_threshold); - __this_cpu_write(stats_updates, 0); + if (!memcg_should_flush_stats(memcg)) + atomic64_add(x, &memcg->vmstats->stats_updates); + __this_cpu_write(memcg->vmstats_percpu->stats_updates, 0); } } @@ -730,13 +745,12 @@ static void do_flush_stats(void) cgroup_rstat_flush(root_mem_cgroup->css.cgroup); - atomic_set(&stats_flush_threshold, 0); atomic_set(&stats_flush_ongoing, 0); } void mem_cgroup_flush_stats(void) { - if (atomic_read(&stats_flush_threshold) > num_online_cpus()) + if (memcg_should_flush_stats(root_mem_cgroup)) do_flush_stats(); } @@ -750,8 +764,8 @@ void mem_cgroup_flush_stats_ratelimited(void) static void flush_memcg_stats_dwork(struct work_struct *w) { /* - * Always flush here so that flushing in latency-sensitive paths is - * as cheap as possible. + * Deliberately ignore memcg_should_flush_stats() here so that flushing + * in latency-sensitive paths is as cheap as possible. */ do_flush_stats(); queue_delayed_work(system_unbound_wq, &stats_flush_dwork, FLUSH_TIME); @@ -5784,6 +5798,9 @@ static void mem_cgroup_css_rstat_flush(struct cgroup_subsys_state *css, int cpu) } } } + /* We are in a per-cpu loop here, only do the atomic write once */ + if (atomic64_read(&memcg->vmstats->stats_updates)) + atomic64_set(&memcg->vmstats->stats_updates, 0); } #ifdef CONFIG_MMU From eb94de72f88e6425092cb9805d7967807b868117 Mon Sep 17 00:00:00 2001 From: Yosry Ahmed Date: Tue, 17 Oct 2023 23:07:59 +0000 Subject: [PATCH 485/515] mm: memcg: clear percpu stats_pending during stats flush MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When flushing memcg stats, we clear the per-memcg count of pending stat updates, as they are captured by the flush. Also clear the percpu count for the cpu being flushed. Link: https://lkml.kernel.org/r/CAJD7tkZDarDn_38ntFg5bK2fAmFdSe+Rt6DKOZA7Sgs_kERoVA@mail.gmail.com Signed-off-by: Yosry Ahmed Suggested-by: Wei Xu Cc: Domenico Cerasuolo Cc: Greg Thelen Cc: Ivan Babrou Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutný Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Cc: Tejun heo Cc: Waiman Long Signed-off-by: Andrew Morton --- mm/memcontrol.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index d7ee6094b8c8ef..8e1732cbf755cd 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5798,6 +5798,7 @@ static void mem_cgroup_css_rstat_flush(struct cgroup_subsys_state *css, int cpu) } } } + statc->stats_updates = 0; /* We are in a per-cpu loop here, only do the atomic write once */ if (atomic64_read(&memcg->vmstats->stats_updates)) atomic64_set(&memcg->vmstats->stats_updates, 0); From 432aed350cc6bf6b10185cecf0c2692e3a9e51ac Mon Sep 17 00:00:00 2001 From: Yosry Ahmed Date: Tue, 10 Oct 2023 03:21:15 +0000 Subject: [PATCH 486/515] mm: workingset: move the stats flush into workingset_test_recent() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The workingset code flushes the stats in workingset_refault() to get accurate stats of the eviction memcg. In preparation for more scoped flushed and passing the eviction memcg to the flush call, move the call to workingset_test_recent() where we have a pointer to the eviction memcg. The flush call is sleepable, and cannot be made in an rcu read section. Hence, minimize the rcu read section by also moving it into workingset_test_recent(). Furthermore, instead of holding the rcu read lock throughout workingset_test_recent(), only hold it briefly to get a ref on the eviction memcg. This allows us to make the flush call after we get the eviction memcg. As for workingset_refault(), nothing else there appears to be protected by rcu. The memcg of the faulted folio (which is not necessarily the same as the eviction memcg) is protected by the folio lock, which is held from all callsites. Add a VM_BUG_ON() to make sure this doesn't change from under us. No functional change intended. Link: https://lkml.kernel.org/r/20231010032117.1577496-5-yosryahmed@google.com Signed-off-by: Yosry Ahmed Tested-by: Domenico Cerasuolo Cc: Greg Thelen Cc: Ivan Babrou Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutný Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Cc: Tejun heo Cc: Waiman Long Cc: Wei Xu Signed-off-by: Andrew Morton --- mm/workingset.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/mm/workingset.c b/mm/workingset.c index b192e44a0e7ccc..a573be6c59fd97 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -425,8 +425,16 @@ bool workingset_test_recent(void *shadow, bool file, bool *workingset) struct pglist_data *pgdat; unsigned long eviction; - if (lru_gen_enabled()) - return lru_gen_test_recent(shadow, file, &eviction_lruvec, &eviction, workingset); + rcu_read_lock(); + + if (lru_gen_enabled()) { + bool recent = lru_gen_test_recent(shadow, file, + &eviction_lruvec, &eviction, workingset); + + rcu_read_unlock(); + return recent; + } + unpack_shadow(shadow, &memcgid, &pgdat, &eviction, workingset); eviction <<= bucket_order; @@ -448,8 +456,16 @@ bool workingset_test_recent(void *shadow, bool file, bool *workingset) * configurations instead. */ eviction_memcg = mem_cgroup_from_id(memcgid); - if (!mem_cgroup_disabled() && !eviction_memcg) + if (!mem_cgroup_disabled() && + (!eviction_memcg || !mem_cgroup_tryget(eviction_memcg))) { + rcu_read_unlock(); return false; + } + + rcu_read_unlock(); + + /* Flush stats (and potentially sleep) outside the RCU read section */ + mem_cgroup_flush_stats_ratelimited(); eviction_lruvec = mem_cgroup_lruvec(eviction_memcg, pgdat); refault = atomic_long_read(&eviction_lruvec->nonresident_age); @@ -493,6 +509,7 @@ bool workingset_test_recent(void *shadow, bool file, bool *workingset) } } + mem_cgroup_put(eviction_memcg); return refault_distance <= workingset_size; } @@ -519,19 +536,16 @@ void workingset_refault(struct folio *folio, void *shadow) return; } - /* Flush stats (and potentially sleep) before holding RCU read lock */ - mem_cgroup_flush_stats_ratelimited(); - - rcu_read_lock(); - /* * The activation decision for this folio is made at the level * where the eviction occurred, as that is where the LRU order * during folio reclaim is being determined. * * However, the cgroup that will own the folio is the one that - * is actually experiencing the refault event. + * is actually experiencing the refault event. Make sure the folio is + * locked to guarantee folio_memcg() stability throughout. */ + VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio); nr = folio_nr_pages(folio); memcg = folio_memcg(folio); pgdat = folio_pgdat(folio); @@ -540,7 +554,7 @@ void workingset_refault(struct folio *folio, void *shadow) mod_lruvec_state(lruvec, WORKINGSET_REFAULT_BASE + file, nr); if (!workingset_test_recent(shadow, file, &workingset)) - goto out; + return; folio_set_active(folio); workingset_age_nonresident(lruvec, nr); @@ -556,8 +570,6 @@ void workingset_refault(struct folio *folio, void *shadow) lru_note_cost_refault(folio); mod_lruvec_state(lruvec, WORKINGSET_RESTORE_BASE + file, nr); } -out: - rcu_read_unlock(); } /** From f3bbc2b11520f2b286d2fbdd0623930d54d5e0ed Mon Sep 17 00:00:00 2001 From: Yosry Ahmed Date: Tue, 10 Oct 2023 03:21:16 +0000 Subject: [PATCH 487/515] mm: memcg: restore subtree stats flushing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stats flushing for memcg currently follows the following rules: - Always flush the entire memcg hierarchy (i.e. flush the root). - Only one flusher is allowed at a time. If someone else tries to flush concurrently, they skip and return immediately. - A periodic flusher flushes all the stats every 2 seconds. The reason this approach is followed is because all flushes are serialized by a global rstat spinlock. On the memcg side, flushing is invoked from userspace reads as well as in-kernel flushers (e.g. reclaim, refault, etc). This approach aims to avoid serializing all flushers on the global lock, which can cause a significant performance hit under high concurrency. This approach has the following problems: - Occasionally a userspace read of the stats of a non-root cgroup will be too expensive as it has to flush the entire hierarchy [1]. - Sometimes the stats accuracy are compromised if there is an ongoing flush, and we skip and return before the subtree of interest is actually flushed, yielding stale stats (by up to 2s due to periodic flushing). This is more visible when reading stats from userspace, but can also affect in-kernel flushers. The latter problem is particulary a concern when userspace reads stats after an event occurs, but gets stats from before the event. Examples: - When memory usage / pressure spikes, a userspace OOM handler may look at the stats of different memcgs to select a victim based on various heuristics (e.g. how much private memory will be freed by killing this). Reading stale stats from before the usage spike in this case may cause a wrongful OOM kill. - A proactive reclaimer may read the stats after writing to memory.reclaim to measure the success of the reclaim operation. Stale stats from before reclaim may give a false negative. - Reading the stats of a parent and a child memcg may be inconsistent (child larger than parent), if the flush doesn't happen when the parent is read, but happens when the child is read. As for in-kernel flushers, they will occasionally get stale stats. No regressions are currently known from this, but if there are regressions, they would be very difficult to debug and link to the source of the problem. This patch aims to fix these problems by restoring subtree flushing, and removing the unified/coalesced flushing logic that skips flushing if there is an ongoing flush. This change would introduce a significant regression with global stats flushing thresholds. With per-memcg stats flushing thresholds, this seems to perform really well. The thresholds protect the underlying lock from unnecessary contention. Add a mutex to protect the underlying rstat lock from excessive memcg flushing. The thresholds are re-checked after the mutex is grabbed to make sure that a concurrent flush did not already get the subtree we are trying to flush. A call to cgroup_rstat_flush() is not cheap, even if there are no pending updates. This patch was tested in two ways to ensure the latency of flushing is up to bar, on a machine with 384 cpus: - A synthetic test with 5000 concurrent workers in 500 cgroups doing allocations and reclaim, as well as 1000 readers for memory.stat (variation of [2]). No regressions were noticed in the total runtime. Note that significant regressions in this test are observed with global stats thresholds, but not with per-memcg thresholds. - A synthetic stress test for concurrently reading memcg stats while memory allocation/freeing workers are running in the background, provided by Wei Xu [3]. With 250k threads reading the stats every 100ms in 50k cgroups, 99.9% of reads take <= 50us. Less than 0.01% of reads take more than 1ms, and no reads take more than 100ms. [1] https://lore.kernel.org/lkml/CABWYdi0c6__rh-K7dcM_pkf9BJdTRtAU08M43KO9ME4-dsgfoQ@mail.gmail.com/ [2] https://lore.kernel.org/lkml/CAJD7tka13M-zVZTyQJYL1iUAYvuQ1fcHbCjcOBZcz6POYTV-4g@mail.gmail.com/ [3] https://lore.kernel.org/lkml/CAAPL-u9D2b=iF5Lf_cRnKxUfkiEe0AMDTu6yhrUAzX0b6a6rDg@mail.gmail.com/ Link: https://lkml.kernel.org/r/20231010032117.1577496-6-yosryahmed@google.com Signed-off-by: Yosry Ahmed Tested-by: Domenico Cerasuolo Cc: Greg Thelen Cc: Ivan Babrou Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutný Cc: Muchun Song Cc: Roman Gushchin Cc: Shakeel Butt Cc: Tejun heo Cc: Waiman Long Cc: Wei Xu Signed-off-by: Andrew Morton --- include/linux/memcontrol.h | 8 ++--- mm/memcontrol.c | 73 +++++++++++++++++++++++--------------- mm/vmscan.c | 2 +- mm/workingset.c | 10 ++++-- 4 files changed, 56 insertions(+), 37 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 7bdcf3020d7a3a..6edd3ec4d8d547 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -1046,8 +1046,8 @@ static inline unsigned long lruvec_page_state_local(struct lruvec *lruvec, return x; } -void mem_cgroup_flush_stats(void); -void mem_cgroup_flush_stats_ratelimited(void); +void mem_cgroup_flush_stats(struct mem_cgroup *memcg); +void mem_cgroup_flush_stats_ratelimited(struct mem_cgroup *memcg); void __mod_memcg_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, int val); @@ -1548,11 +1548,11 @@ static inline unsigned long lruvec_page_state_local(struct lruvec *lruvec, return node_page_state(lruvec_pgdat(lruvec), idx); } -static inline void mem_cgroup_flush_stats(void) +static inline void mem_cgroup_flush_stats(struct mem_cgroup *memcg) { } -static inline void mem_cgroup_flush_stats_ratelimited(void) +static inline void mem_cgroup_flush_stats_ratelimited(struct mem_cgroup *memcg) { } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8e1732cbf755cd..c6aed7ce7b9818 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -669,7 +669,6 @@ struct memcg_vmstats { */ static void flush_memcg_stats_dwork(struct work_struct *w); static DECLARE_DEFERRABLE_WORK(stats_flush_dwork, flush_memcg_stats_dwork); -static atomic_t stats_flush_ongoing = ATOMIC_INIT(0); static u64 flush_last_time; #define FLUSH_TIME (2UL*HZ) @@ -730,35 +729,45 @@ static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val) } } -static void do_flush_stats(void) +static void do_flush_stats(struct mem_cgroup *memcg) { - /* - * We always flush the entire tree, so concurrent flushers can just - * skip. This avoids a thundering herd problem on the rstat global lock - * from memcg flushers (e.g. reclaim, refault, etc). - */ - if (atomic_read(&stats_flush_ongoing) || - atomic_xchg(&stats_flush_ongoing, 1)) - return; - - WRITE_ONCE(flush_last_time, jiffies_64); - - cgroup_rstat_flush(root_mem_cgroup->css.cgroup); + if (mem_cgroup_is_root(memcg)) + WRITE_ONCE(flush_last_time, jiffies_64); - atomic_set(&stats_flush_ongoing, 0); + cgroup_rstat_flush(memcg->css.cgroup); } -void mem_cgroup_flush_stats(void) +/* + * mem_cgroup_flush_stats - flush the stats of a memory cgroup subtree + * @memcg: root of the subtree to flush + * + * Flushing is serialized by the underlying global rstat lock. There is also a + * minimum amount of work to be done even if there are no stat updates to flush. + * Hence, we only flush the stats if the updates delta exceeds a threshold. This + * avoids unnecessary work and contention on the underlying lock. + */ +void mem_cgroup_flush_stats(struct mem_cgroup *memcg) { - if (memcg_should_flush_stats(root_mem_cgroup)) - do_flush_stats(); + static DEFINE_MUTEX(memcg_stats_flush_mutex); + + if (!memcg) + memcg = root_mem_cgroup; + + if (!memcg_should_flush_stats(memcg)) + return; + + mutex_lock(&memcg_stats_flush_mutex); + /* An overlapping flush may have occurred, check again after locking */ + if (memcg_should_flush_stats(memcg)) + do_flush_stats(memcg); + mutex_unlock(&memcg_stats_flush_mutex); } -void mem_cgroup_flush_stats_ratelimited(void) +void mem_cgroup_flush_stats_ratelimited(struct mem_cgroup *memcg) { /* Only flush if the periodic flusher is one full cycle late */ if (time_after64(jiffies_64, READ_ONCE(flush_last_time) + 2*FLUSH_TIME)) - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(memcg); } static void flush_memcg_stats_dwork(struct work_struct *w) @@ -767,7 +776,7 @@ static void flush_memcg_stats_dwork(struct work_struct *w) * Deliberately ignore memcg_should_flush_stats() here so that flushing * in latency-sensitive paths is as cheap as possible. */ - do_flush_stats(); + do_flush_stats(root_mem_cgroup); queue_delayed_work(system_unbound_wq, &stats_flush_dwork, FLUSH_TIME); } @@ -1642,7 +1651,7 @@ static void memcg_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) * * Current memory state: */ - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(memcg); for (i = 0; i < ARRAY_SIZE(memory_stats); i++) { u64 size; @@ -4191,7 +4200,7 @@ static int memcg_numa_stat_show(struct seq_file *m, void *v) int nid; struct mem_cgroup *memcg = mem_cgroup_from_seq(m); - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(memcg); for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) { seq_printf(m, "%s=%lu", stat->name, @@ -4272,7 +4281,7 @@ static void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) BUILD_BUG_ON(ARRAY_SIZE(memcg1_stat_names) != ARRAY_SIZE(memcg1_stats)); - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(memcg); for (i = 0; i < ARRAY_SIZE(memcg1_stats); i++) { unsigned long nr; @@ -4768,7 +4777,7 @@ void mem_cgroup_wb_stats(struct bdi_writeback *wb, unsigned long *pfilepages, struct mem_cgroup *memcg = mem_cgroup_from_css(wb->memcg_css); struct mem_cgroup *parent; - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(memcg); *pdirty = memcg_page_state(memcg, NR_FILE_DIRTY); *pwriteback = memcg_page_state(memcg, NR_WRITEBACK); @@ -6857,7 +6866,7 @@ static int memory_numa_stat_show(struct seq_file *m, void *v) int i; struct mem_cgroup *memcg = mem_cgroup_from_seq(m); - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(memcg); for (i = 0; i < ARRAY_SIZE(memory_stats); i++) { int nid; @@ -8096,7 +8105,11 @@ bool obj_cgroup_may_zswap(struct obj_cgroup *objcg) break; } - cgroup_rstat_flush(memcg->css.cgroup); + /* + * mem_cgroup_flush_stats() ignores small changes. Use + * do_flush_stats() directly to get accurate stats for charging. + */ + do_flush_stats(memcg); pages = memcg_page_state(memcg, MEMCG_ZSWAP_B) / PAGE_SIZE; if (pages < max) continue; @@ -8161,8 +8174,10 @@ void obj_cgroup_uncharge_zswap(struct obj_cgroup *objcg, size_t size) static u64 zswap_current_read(struct cgroup_subsys_state *css, struct cftype *cft) { - cgroup_rstat_flush(css->cgroup); - return memcg_page_state(mem_cgroup_from_css(css), MEMCG_ZSWAP_B); + struct mem_cgroup *memcg = mem_cgroup_from_css(css); + + mem_cgroup_flush_stats(memcg); + return memcg_page_state(memcg, MEMCG_ZSWAP_B); } static int zswap_max_show(struct seq_file *m, void *v) diff --git a/mm/vmscan.c b/mm/vmscan.c index c16e2b1ea8ae3d..2cc0cb41fb32aa 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2246,7 +2246,7 @@ static void prepare_scan_control(pg_data_t *pgdat, struct scan_control *sc) * Flush the memory cgroup stats, so that we read accurate per-memcg * lruvec stats for heuristics. */ - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(sc->target_mem_cgroup); /* * Determine the scan balance between anon and file LRUs. diff --git a/mm/workingset.c b/mm/workingset.c index a573be6c59fd97..11045febc38389 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -464,8 +464,12 @@ bool workingset_test_recent(void *shadow, bool file, bool *workingset) rcu_read_unlock(); - /* Flush stats (and potentially sleep) outside the RCU read section */ - mem_cgroup_flush_stats_ratelimited(); + /* + * Flush stats (and potentially sleep) outside the RCU read section. + * XXX: With per-memcg flushing and thresholding, is ratelimiting + * still needed here? + */ + mem_cgroup_flush_stats_ratelimited(eviction_memcg); eviction_lruvec = mem_cgroup_lruvec(eviction_memcg, pgdat); refault = atomic_long_read(&eviction_lruvec->nonresident_age); @@ -676,7 +680,7 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker, struct lruvec *lruvec; int i; - mem_cgroup_flush_stats(); + mem_cgroup_flush_stats(sc->memcg); lruvec = mem_cgroup_lruvec(sc->memcg, NODE_DATA(sc->nid)); for (pages = 0, i = 0; i < NR_LRU_LISTS; i++) pages += lruvec_page_state_local(lruvec, From 567e4ba25a68712251a881e2aa98a2754ccd71cd Mon Sep 17 00:00:00 2001 From: Zhongkun He Date: Tue, 24 Oct 2023 22:27:06 +0800 Subject: [PATCH 488/515] mm: zswap: fix the lack of page lru flag in zswap_writeback_entry The zswap_writeback_entry() will add a page to the swap cache, decompress the entry data into the page, and issue a bio write to write the page back to the swap device. Move the page to the tail of lru list through SetPageReclaim(page) and folio_rotate_reclaimable(). Currently, about half of the pages will fail to move to the tail of lru list because there is no LRU flag in page which is not in the LRU list but the cpu_fbatches. So fix it. Link: https://lkml.kernel.org/r/20231024142706.195517-1-hezhongkun.hzk@bytedance.com Signed-off-by: Zhongkun He Cc: Dan Streetman Cc: Johannes Weiner Cc: Nhat Pham Cc: Seth Jennings Cc: Vitaly Wool Cc: Yosry Ahmed Signed-off-by: Andrew Morton --- mm/zswap.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mm/zswap.c b/mm/zswap.c index 060857adca76b4..bf15597adf1fe9 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -1142,6 +1142,11 @@ static int zswap_writeback_entry(struct zswap_entry *entry, /* move it to the tail of the inactive list after end_writeback */ SetPageReclaim(page); + if (!PageLRU(page)) { + /* drain lru cache to help folio_rotate_reclaimable() */ + lru_add_drain(); + } + /* start writeback */ __swap_writepage(page, &wbc); put_page(page); From 850b1d3f02f2dfb7b6bb7f4f921c13c3fc9dae68 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Tue, 24 Oct 2023 17:37:50 +0200 Subject: [PATCH 489/515] Documentation: ubsan: drop "the" from article title Drop "the" from the title of the documentation article for UBSAN, as it is redundant. Also add SPDX-License-Identifier for ubsan.rst. Link: https://lkml.kernel.org/r/5fb11a4743eea9d9232a5284dea0716589088fec.1698161845.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov Reviewed-by: Marco Elver Cc: Alexander Potapenko Cc: Andrey Ryabinin Cc: Dmitry Vyukov Signed-off-by: Andrew Morton --- Documentation/dev-tools/ubsan.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Documentation/dev-tools/ubsan.rst b/Documentation/dev-tools/ubsan.rst index 1be6618e232d20..2de7c63415da0e 100644 --- a/Documentation/dev-tools/ubsan.rst +++ b/Documentation/dev-tools/ubsan.rst @@ -1,5 +1,7 @@ -The Undefined Behavior Sanitizer - UBSAN -======================================== +.. SPDX-License-Identifier: GPL-2.0 + +Undefined Behavior Sanitizer - UBSAN +==================================== UBSAN is a runtime undefined behaviour checker. From 1aee4ab516e298250ac7072cb01a731e0e44e801 Mon Sep 17 00:00:00 2001 From: Nhat Pham Date: Tue, 24 Oct 2023 16:45:09 -0700 Subject: [PATCH 490/515] zswap: export compression failure stats During a zswap store attempt, the compression algorithm could fail (for e.g due to the page containing incompressible random data). This is not tracked in any of existing zswap counters, making it hard to monitor for and investigate. We have run into this problem several times in our internal investigations on zswap store failures. This patch adds a dedicated debugfs counter for compression algorithm failures. Link: https://lkml.kernel.org/r/20231024234509.2680539-1-nphamcs@gmail.com Signed-off-by: Nhat Pham Reviewed-by: Sergey Senozhatsky Cc: Dan Streetman Cc: Domenico Cerasuolo Cc: Johannes Weiner Cc: Michal Hocko Cc: Muchun Song Cc: Roman Gushchin Cc: Seth Jennings Cc: Shakeel Butt Cc: Vitaly Wool Cc: Yosry Ahmed Signed-off-by: Andrew Morton --- mm/zswap.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mm/zswap.c b/mm/zswap.c index bf15597adf1fe9..030cc137138f77 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -62,6 +62,8 @@ static u64 zswap_pool_limit_hit; static u64 zswap_written_back_pages; /* Store failed due to a reclaim failure after pool limit was reached */ static u64 zswap_reject_reclaim_fail; +/* Store failed due to compression algorithm failure */ +static u64 zswap_reject_compress_fail; /* Compressed page was too big for the allocator to (optimally) store */ static u64 zswap_reject_compress_poor; /* Store failed because underlying allocator could not get memory */ @@ -1317,8 +1319,10 @@ bool zswap_store(struct folio *folio) ret = crypto_wait_req(crypto_acomp_compress(acomp_ctx->req), &acomp_ctx->wait); dlen = acomp_ctx->req->dlen; - if (ret) + if (ret) { + zswap_reject_compress_fail++; goto put_dstmem; + } /* store */ zpool = zswap_find_zpool(entry); @@ -1558,6 +1562,8 @@ static int zswap_debugfs_init(void) zswap_debugfs_root, &zswap_reject_alloc_fail); debugfs_create_u64("reject_kmemcache_fail", 0444, zswap_debugfs_root, &zswap_reject_kmemcache_fail); + debugfs_create_u64("reject_compress_fail", 0444, + zswap_debugfs_root, &zswap_reject_compress_fail); debugfs_create_u64("reject_compress_poor", 0444, zswap_debugfs_root, &zswap_reject_compress_poor); debugfs_create_u64("written_back_pages", 0444, From 0343b7723e1df3711be863cf0d166ff72c5b0a46 Mon Sep 17 00:00:00 2001 From: Baoquan He Date: Wed, 18 Oct 2023 22:50:14 +0800 Subject: [PATCH 491/515] mm/vmalloc: fix the unchecked dereference warning in vread_iter() LKP reported smatch warning as below: =================== smatch warnings: mm/vmalloc.c:3689 vread_iter() error: we previously assumed 'vm' could be null (see line 3667) ...... 06c8994626d1b7 @3667 size = vm ? get_vm_area_size(vm) : va_size(va); ...... 06c8994626d1b7 @3689 else if (!(vm->flags & VM_IOREMAP)) ^^^^^^^^^ Unchecked dereference ===================== This is not a runtime bug because the possible null 'vm' in the pointed place could only happen when flags == VMAP_BLOCK. However, the case 'flags == VMAP_BLOCK' should never happen and has been detected with WARN_ON. Please check vm_map_ram() implementation and the earlier checking in vread_iter() at below: ~~~~~~~~~~~~~~~~~~~~~~~~~~ /* * VMAP_BLOCK indicates a sub-type of vm_map_ram area, need * be set together with VMAP_RAM. */ WARN_ON(flags == VMAP_BLOCK); if (!vm && !flags) continue; ~~~~~~~~~~~~~~~~~~~~~~~~~~ So add checking on whether 'vm' could be null when dereferencing it in vread_iter(). This mutes smatch complaint. Link: https://lkml.kernel.org/r/ZTCURc8ZQE+KrTvS@MiWiFi-R3L-srv Link: https://lkml.kernel.org/r/ZS/2k6DIMd0tZRgK@MiWiFi-R3L-srv Signed-off-by: Baoquan He Reported-by: kernel test robot Reported-by: Dan Carpenter Closes: https://lore.kernel.org/r/202310171600.WCrsOwFj-lkp@intel.com/ Cc: Lorenzo Stoakes Cc: Philip Li Signed-off-by: Andrew Morton --- mm/vmalloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index a3fedb3ee0dbd4..d12a17fc0c171c 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3809,7 +3809,7 @@ long vread_iter(struct iov_iter *iter, const char *addr, size_t count) if (flags & VMAP_RAM) copied = vmap_ram_vread_iter(iter, addr, n, flags); - else if (!(vm->flags & VM_IOREMAP)) + else if (!(vm && (vm->flags & VM_IOREMAP))) copied = aligned_vread_iter(iter, addr, n); else /* IOREMAP area is treated as memory hole */ copied = zero_iter(iter, n); From 50b37e1dfef2ef6636b82332d570562526d4aaff Mon Sep 17 00:00:00 2001 From: Tom Yang Date: Mon, 23 Oct 2023 17:57:37 +0800 Subject: [PATCH 492/515] Documentation: maple_tree: fix word spelling error The "first" is spelled "fist". Link: https://lkml.kernel.org/r/20231023095737.21823-1-yangqixiao@inspur.com Signed-off-by: Tom Yang Reviewed-by: Liam R. Howlett Signed-off-by: Andrew Morton --- Documentation/core-api/maple_tree.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/core-api/maple_tree.rst b/Documentation/core-api/maple_tree.rst index 45defcf15da71a..96f3d5f076b57c 100644 --- a/Documentation/core-api/maple_tree.rst +++ b/Documentation/core-api/maple_tree.rst @@ -175,7 +175,7 @@ will return the previous entry which occurs before the entry at index. mas_find() will find the first entry which exists at or above index on the first call, and the next entry from every subsequent calls. -mas_find_rev() will find the fist entry which exists at or below the last on +mas_find_rev() will find the first entry which exists at or below the last on the first call, and the previous entry from every subsequent calls. If the user needs to yield the lock during an operation, then the maple state From dc1c3094f2361e92f36fe374f9552b2159691df9 Mon Sep 17 00:00:00 2001 From: Nhat Pham Date: Fri, 20 Oct 2023 15:20:09 -0700 Subject: [PATCH 493/515] selftests: add a sanity check for zswap We recently encountered a bug that makes all zswap store attempt fail. Specifically, after: "141fdeececb3 mm/zswap: delay the initialization of zswap" if we build a kernel with zswap disabled by default, then enabled after the swapfile is set up, the zswap tree will not be initialized. As a result, all zswap store calls will be short-circuited. We have to perform another swapon to get zswap working properly again. Fortunately, this issue has since been fixed by the patch that kills frontswap: "42c06a0e8ebe mm: kill frontswap" which performs zswap_swapon() unconditionally, i.e always initializing the zswap tree. This test add a sanity check that ensure zswap storing works as intended. Link: https://lkml.kernel.org/r/20231020222009.2358953-1-nphamcs@gmail.com Signed-off-by: Nhat Pham Acked-by: Rik van Riel Cc: Domenico Cerasuolo Cc: Johannes Weiner Cc: Shuah Khan Cc: Tejun Heo Cc: Zefan Li Signed-off-by: Andrew Morton --- tools/testing/selftests/cgroup/test_zswap.c | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/selftests/cgroup/test_zswap.c index 49def87a909bdb..c99d2adaca3f0e 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -55,6 +55,11 @@ static int get_zswap_written_back_pages(size_t *value) return read_int("/sys/kernel/debug/zswap/written_back_pages", value); } +static long get_zswpout(const char *cgroup) +{ + return cg_read_key_long(cgroup, "memory.stat", "zswpout "); +} + static int allocate_bytes(const char *cgroup, void *arg) { size_t size = (size_t)arg; @@ -68,6 +73,48 @@ static int allocate_bytes(const char *cgroup, void *arg) return 0; } +/* + * Sanity test to check that pages are written into zswap. + */ +static int test_zswap_usage(const char *root) +{ + long zswpout_before, zswpout_after; + int ret = KSFT_FAIL; + char *test_group; + + /* Set up */ + test_group = cg_name(root, "no_shrink_test"); + if (!test_group) + goto out; + if (cg_create(test_group)) + goto out; + if (cg_write(test_group, "memory.max", "1M")) + goto out; + + zswpout_before = get_zswpout(test_group); + if (zswpout_before < 0) { + ksft_print_msg("Failed to get zswpout\n"); + goto out; + } + + /* Allocate more than memory.max to push memory into zswap */ + if (cg_run(test_group, allocate_bytes, (void *)MB(4))) + goto out; + + /* Verify that pages come into zswap */ + zswpout_after = get_zswpout(test_group); + if (zswpout_after <= zswpout_before) { + ksft_print_msg("zswpout does not increase after test program\n"); + goto out; + } + ret = KSFT_PASS; + +out: + cg_destroy(test_group); + free(test_group); + return ret; +} + /* * When trying to store a memcg page in zswap, if the memcg hits its memory * limit in zswap, writeback should not be triggered. @@ -235,6 +282,7 @@ struct zswap_test { int (*fn)(const char *root); const char *name; } tests[] = { + T(test_zswap_usage), T(test_no_kmem_bypass), T(test_no_invasive_cgroup_shrink), }; From b569721884e0ef8bbb28590f32928cf7106f2bca Mon Sep 17 00:00:00 2001 From: Jia Rui Date: Thu, 19 Oct 2023 03:18:11 +0800 Subject: [PATCH 494/515] ocfs2: replace BUG_ON() at ocfs2_num_free_extents() with ocfs2_error() The BUG_ON() at ocfs2_num_free_extents() handles the error that l_tree_deepth of leaf extent block just read form disk is invalid. This error is mostly caused by file system metadata corruption on the disk. There is no need to call BUG_ON() to handle such errors. We can return error code, since the caller can deal with errors from ocfs2_num_free_extents(). Also, we should make the file system read-only to avoid the damage from expanding. Therefore, BUG_ON() is removed and ocfs2_error() is called instead. Link: https://lkml.kernel.org/r/20231018191811.412458-1-jindui71@gmail.com Signed-off-by: Jia Rui Reviewed-by: Joseph Qi Cc: Mark Fasheh Cc: Joel Becker Cc: Junxiao Bi Cc: Changwei Ge Cc: Gang He Cc: Jun Piao Signed-off-by: Andrew Morton --- fs/ocfs2/alloc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 0fb5e3a875d2f9..dea3de833b4781 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c @@ -967,7 +967,14 @@ int ocfs2_num_free_extents(struct ocfs2_extent_tree *et) el = &eb->h_list; } - BUG_ON(el->l_tree_depth != 0); + if (el->l_tree_depth != 0) { + retval = ocfs2_error(ocfs2_metadata_cache_get_super(et->et_ci), + "Owner %llu has leaf extent block %llu with an invalid l_tree_depth of %u\n", + (unsigned long long)ocfs2_metadata_cache_owner(et->et_ci), + (unsigned long long)last_eb_blk, + le16_to_cpu(el->l_tree_depth)); + goto bail; + } retval = le16_to_cpu(el->l_count) - le16_to_cpu(el->l_next_free_rec); bail: From 7de8447f2c84cfa6f52248d928fe35ccca659419 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Mon, 23 Oct 2023 17:33:43 +0200 Subject: [PATCH 495/515] do_io_accounting: use __for_each_thread() Rather than while_each_thread() which should be avoided when possible. This makes the code more clear and allows the next change. Link: https://lkml.kernel.org/r/20231023153343.GA4629@redhat.com Signed-off-by: Oleg Nesterov Cc: "Eric W. Biederman" Signed-off-by: Andrew Morton --- fs/proc/base.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index 601329f9629a0a..7779efda9fe22b 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2972,7 +2972,7 @@ static const struct file_operations proc_coredump_filter_operations = { #ifdef CONFIG_TASK_IO_ACCOUNTING static int do_io_accounting(struct task_struct *task, struct seq_file *m, int whole) { - struct task_io_accounting acct = task->ioac; + struct task_io_accounting acct; unsigned long flags; int result; @@ -2986,14 +2986,18 @@ static int do_io_accounting(struct task_struct *task, struct seq_file *m, int wh } if (whole && lock_task_sighand(task, &flags)) { - struct task_struct *t = task; + struct signal_struct *sig = task->signal; + struct task_struct *t; - task_io_accounting_add(&acct, &task->signal->ioac); - while_each_thread(task, t) + acct = sig->ioac; + __for_each_thread(sig, t) task_io_accounting_add(&acct, &t->ioac); unlock_task_sighand(task, &flags); + } else { + acct = task->ioac; } + seq_printf(m, "rchar: %llu\n" "wchar: %llu\n" From a91fa001c004245f0b0f3701adb60270c8f9a64e Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Mon, 23 Oct 2023 17:34:05 +0200 Subject: [PATCH 496/515] do_io_accounting: use sig->stats_lock Rather than lock_task_sighand(), sig->stats_lock was specifically designed for this type of use. This way the "if (whole)" branch runs lockless in the likely case. Link: https://lkml.kernel.org/r/20231023153405.GA4639@redhat.com Signed-off-by: Oleg Nesterov Cc: "Eric W. Biederman" Signed-off-by: Andrew Morton --- fs/proc/base.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index 7779efda9fe22b..ca4f0ce64df652 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2973,7 +2973,6 @@ static const struct file_operations proc_coredump_filter_operations = { static int do_io_accounting(struct task_struct *task, struct seq_file *m, int whole) { struct task_io_accounting acct; - unsigned long flags; int result; result = down_read_killable(&task->signal->exec_update_lock); @@ -2985,15 +2984,24 @@ static int do_io_accounting(struct task_struct *task, struct seq_file *m, int wh goto out_unlock; } - if (whole && lock_task_sighand(task, &flags)) { + if (whole) { struct signal_struct *sig = task->signal; struct task_struct *t; + unsigned int seq = 1; + unsigned long flags; + + rcu_read_lock(); + do { + seq++; /* 2 on the 1st/lockless path, otherwise odd */ + flags = read_seqbegin_or_lock_irqsave(&sig->stats_lock, &seq); - acct = sig->ioac; - __for_each_thread(sig, t) - task_io_accounting_add(&acct, &t->ioac); + acct = sig->ioac; + __for_each_thread(sig, t) + task_io_accounting_add(&acct, &t->ioac); - unlock_task_sighand(task, &flags); + } while (need_seqretry(&sig->stats_lock, seq)); + done_seqretry_irqrestore(&sig->stats_lock, seq, flags); + rcu_read_unlock(); } else { acct = task->ioac; } From 0dbee6329dc41aa5d2566f62c71a6c4164aa05e6 Mon Sep 17 00:00:00 2001 From: Yang Li Date: Thu, 26 Oct 2023 08:56:34 +0800 Subject: [PATCH 497/515] fs/proc/base.c: remove unneeded semicolon ./fs/proc/base.c:3829:2-3: Unneeded semicolon Link: https://lkml.kernel.org/r/20231026005634.6581-1-yang.lee@linux.alibaba.com Signed-off-by: Yang Li Reported-by: Abaci Robot Closes: https://bugzilla.openanolis.cn/show_bug.cgi?id=7057 Acked-by: Oleg Nesterov Signed-off-by: Andrew Morton --- fs/proc/base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index ca4f0ce64df652..b13d3e804debae 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -3826,7 +3826,7 @@ static struct task_struct *first_tid(struct pid *pid, int tid, loff_t f_pos, for_each_thread(task, pos) { if (!nr--) goto found; - }; + } fail: pos = NULL; goto out; From 29d92d4a108c52b85776006f31a8af2dcd1efed9 Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Fri, 27 Oct 2023 17:21:03 +0300 Subject: [PATCH 498/515] proc: fix proc-empty-vm test with vsyscall * fix embarassing /proc/*/smaps test bug due to a typo in variable name it tested only the first line of the output if vsyscall is enabled: ffffffffff600000-ffffffffff601000 r-xp ... so test passed but tested only VMA location and permissions. * add "KSM" entry, unnoticed because (1) * swap "r-xp" and "--xp" vsyscall test strings, also unnoticed because (1) Link: https://lkml.kernel.org/r/76f42cce-b1ab-45ec-b6b2-4c64f0dccb90@p183 Signed-off-by: Alexey Dobriyan Cc: Swarup Laxman Kotiaklapudi Signed-off-by: Andrew Morton --- tools/testing/selftests/proc/proc-empty-vm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/proc/proc-empty-vm.c b/tools/testing/selftests/proc/proc-empty-vm.c index 171d46a1ac27c9..1cbdfe8a140e47 100644 --- a/tools/testing/selftests/proc/proc-empty-vm.c +++ b/tools/testing/selftests/proc/proc-empty-vm.c @@ -60,7 +60,7 @@ static const char proc_pid_maps_vsyscall_2[] = static const char proc_pid_smaps_vsyscall_0[] = ""; static const char proc_pid_smaps_vsyscall_1[] = -"ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]\n" +"ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]\n" "Size: 4 kB\n" "KernelPageSize: 4 kB\n" "MMUPageSize: 4 kB\n" @@ -73,6 +73,7 @@ static const char proc_pid_smaps_vsyscall_1[] = "Private_Dirty: 0 kB\n" "Referenced: 0 kB\n" "Anonymous: 0 kB\n" +"KSM: 0 kB\n" "LazyFree: 0 kB\n" "AnonHugePages: 0 kB\n" "ShmemPmdMapped: 0 kB\n" @@ -90,7 +91,7 @@ static const char proc_pid_smaps_vsyscall_1[] = ; static const char proc_pid_smaps_vsyscall_2[] = -"ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]\n" +"ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]\n" "Size: 4 kB\n" "KernelPageSize: 4 kB\n" "MMUPageSize: 4 kB\n" @@ -103,6 +104,7 @@ static const char proc_pid_smaps_vsyscall_2[] = "Private_Dirty: 0 kB\n" "Referenced: 0 kB\n" "Anonymous: 0 kB\n" +"KSM: 0 kB\n" "LazyFree: 0 kB\n" "AnonHugePages: 0 kB\n" "ShmemPmdMapped: 0 kB\n" @@ -244,10 +246,10 @@ static int test_proc_pid_smaps(pid_t pid) if (g_vsyscall == 0) { assert(rv == 0); } else { - size_t len = strlen(g_proc_pid_maps_vsyscall); + size_t len = strlen(g_proc_pid_smaps_vsyscall); /* TODO "ProtectionKey:" */ assert(rv > len); - assert(memcmp(buf, g_proc_pid_maps_vsyscall, len) == 0); + assert(memcmp(buf, g_proc_pid_smaps_vsyscall, len) == 0); } return EXIT_SUCCESS; } From c969e28f42c0d9a269dc906bd0c0fde2bf46e9cc Mon Sep 17 00:00:00 2001 From: Swarup Laxman Kotiaklapudi Date: Fri, 27 Oct 2023 17:26:24 +0300 Subject: [PATCH 499/515] proc: test ProtectionKey in proc-empty-vm test Check ProtectionKey field in /proc/*/smaps output, if system supports protection keys feature. [adobriyan@gmail.com: test support in the beginning of the program, use syscall, not glibc pkey_alloc(3) which may not compile] Link: https://lkml.kernel.org/r/ac05efa7-d2a0-48ad-b704-ffdd5450582e@p183 Signed-off-by: Swarup Laxman Kotiaklapudi Signed-off-by: Alexey Dobriyan Signed-off-by: Andrew Morton --- tools/testing/selftests/proc/proc-empty-vm.c | 79 +++++++++++++++----- 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/tools/testing/selftests/proc/proc-empty-vm.c b/tools/testing/selftests/proc/proc-empty-vm.c index 1cbdfe8a140e47..56198d4ca2bf88 100644 --- a/tools/testing/selftests/proc/proc-empty-vm.c +++ b/tools/testing/selftests/proc/proc-empty-vm.c @@ -23,6 +23,9 @@ * /proc/${pid}/smaps * /proc/${pid}/smaps_rollup */ +#undef _GNU_SOURCE +#define _GNU_SOURCE + #undef NDEBUG #include #include @@ -34,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -42,6 +46,43 @@ #define TEST_VSYSCALL #endif +#if defined __amd64__ + #ifndef SYS_pkey_alloc + #define SYS_pkey_alloc 330 + #endif + #ifndef SYS_pkey_free + #define SYS_pkey_free 331 + #endif +#elif defined __i386__ + #ifndef SYS_pkey_alloc + #define SYS_pkey_alloc 381 + #endif + #ifndef SYS_pkey_free + #define SYS_pkey_free 382 + #endif +#else + #error "SYS_pkey_alloc" +#endif + +static int g_protection_key_support; + +static int protection_key_support(void) +{ + long rv = syscall(SYS_pkey_alloc, 0, 0); + if (rv > 0) { + syscall(SYS_pkey_free, (int)rv); + return 1; + } else if (rv == -1 && errno == ENOSYS) { + return 0; + } else if (rv == -1 && errno == EINVAL) { + // ospke=n + return 0; + } else { + fprintf(stderr, "%s: error: rv %ld, errno %d\n", __func__, rv, errno); + exit(EXIT_FAILURE); + } +} + /* * 0: vsyscall VMA doesn't exist vsyscall=none * 1: vsyscall VMA is --xp vsyscall=xonly @@ -84,10 +125,6 @@ static const char proc_pid_smaps_vsyscall_1[] = "SwapPss: 0 kB\n" "Locked: 0 kB\n" "THPeligible: 0\n" -/* - * "ProtectionKey:" field is conditional. It is possible to check it as well, - * but I don't have such machine. - */ ; static const char proc_pid_smaps_vsyscall_2[] = @@ -115,10 +152,6 @@ static const char proc_pid_smaps_vsyscall_2[] = "SwapPss: 0 kB\n" "Locked: 0 kB\n" "THPeligible: 0\n" -/* - * "ProtectionKey:" field is conditional. It is possible to check it as well, - * but I'm too tired. - */ ; static void sigaction_SIGSEGV(int _, siginfo_t *__, void *___) @@ -240,19 +273,27 @@ static int test_proc_pid_smaps(pid_t pid) } perror("open /proc/${pid}/smaps"); return EXIT_FAILURE; + } + ssize_t rv = read(fd, buf, sizeof(buf)); + close(fd); + + assert(0 <= rv); + assert(rv <= sizeof(buf)); + + if (g_vsyscall == 0) { + assert(rv == 0); } else { - ssize_t rv = read(fd, buf, sizeof(buf)); - close(fd); - if (g_vsyscall == 0) { - assert(rv == 0); - } else { - size_t len = strlen(g_proc_pid_smaps_vsyscall); - /* TODO "ProtectionKey:" */ - assert(rv > len); - assert(memcmp(buf, g_proc_pid_smaps_vsyscall, len) == 0); + size_t len = strlen(g_proc_pid_smaps_vsyscall); + assert(rv > len); + assert(memcmp(buf, g_proc_pid_smaps_vsyscall, len) == 0); + + if (g_protection_key_support) { +#define PROTECTION_KEY "ProtectionKey: 0\n" + assert(memmem(buf, rv, PROTECTION_KEY, strlen(PROTECTION_KEY))); } - return EXIT_SUCCESS; } + + return EXIT_SUCCESS; } static const char g_smaps_rollup[] = @@ -419,6 +460,8 @@ int main(void) abort(); } + g_protection_key_support = protection_key_support(); + pid_t pid = fork(); if (pid == -1) { perror("fork"); From 0bbd8964410e934afc8a95f009a8f173cd0c455e Mon Sep 17 00:00:00 2001 From: Kunwu Chan Date: Wed, 25 Oct 2023 15:29:06 +0800 Subject: [PATCH 500/515] ocfs2: fix a spelling typo in comment Fix a spelling typo in comment. Link: https://lkml.kernel.org/r/20231025072906.14285-1-chentao@kylinos.cn Signed-off-by: Kunwu Chan Acked-by: Joseph Qi Signed-off-by: Andrew Morton --- fs/ocfs2/buffer_head_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index 6cb919f60011b9..cdb9b9bdea1f6d 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c @@ -345,7 +345,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, if (new_bh && bh) { /* If middle bh fails, let previous bh * finish its read and then put it to - * aovoid bh leak + * avoid bh leak */ if (!buffer_jbd(bh)) wait_on_buffer(bh); From d431880137b55533f664056070226a88dba99637 Mon Sep 17 00:00:00 2001 From: Deepak Gupta Date: Thu, 26 Oct 2023 16:38:23 -0700 Subject: [PATCH 501/515] scripts/gdb: add lx_current support for riscv csr_sscratch CSR holds current task_struct address when hart is in user space. Trap handler on entry spills csr_sscratch into "tp" (x2) register and zeroes out csr_sscratch CSR. Trap handler on exit reloads "tp" with expected user mode value and place current task_struct address again in csr_sscratch CSR. This patch assumes "tp" is pointing to task_struct. If value in csr_sscratch is numerically greater than "tp" then it assumes csr_sscratch is correct address of current task_struct. This logic holds when - hart is in user space, "tp" will be less than csr_sscratch. - hart is in kernel space but not in trap handler, "tp" will be more than csr_sscratch (csr_sscratch being equal to 0). - hart is executing trap handler - "tp" is still pointing to user mode but csr_sscratch contains ptr to task_struct. Thus numerically higher. - "tp" is pointing to task_struct but csr_sscratch now contains either 0 or numerically smaller value (transiently holds user mode tp) Link: https://lkml.kernel.org/r/20231026233837.612405-1-debug@rivosinc.com Signed-off-by: Deepak Gupta Reviewed-by: Andrew Jones Reviewed-by: Palmer Dabbelt Acked-by: Palmer Dabbelt Tested-by: Hsieh-Tseng Shen Cc: Albert Ou Cc: Glenn Washburn Cc: Jan Kiszka Cc: Jeff Xie Cc: Kieran Bingham Cc: Palmer Dabbelt Cc: Paul Walmsley Signed-off-by: Andrew Morton --- scripts/gdb/linux/cpus.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/gdb/linux/cpus.py b/scripts/gdb/linux/cpus.py index 255dc18cb9da45..cba589e5b57d61 100644 --- a/scripts/gdb/linux/cpus.py +++ b/scripts/gdb/linux/cpus.py @@ -179,6 +179,21 @@ def get_current_task(cpu): else: raise gdb.GdbError("Sorry, obtaining the current task is not allowed " "while running in userspace(EL0)") + elif utils.is_target_arch("riscv"): + current_tp = gdb.parse_and_eval("$tp") + scratch_reg = gdb.parse_and_eval("$sscratch") + + # by default tp points to current task + current_task = current_tp.cast(task_ptr_type) + + # scratch register is set 0 in trap handler after entering kernel. + # When hart is in user mode, scratch register is pointing to task_struct. + # and tp is used by user mode. So when scratch register holds larger value + # (negative address as ulong is larger value) than tp, then use scratch register. + if (scratch_reg.cast(utils.get_ulong_type()) > current_tp.cast(utils.get_ulong_type())): + current_task = scratch_reg.cast(task_ptr_type) + + return current_task.dereference() else: raise gdb.GdbError("Sorry, obtaining the current task is not yet " "supported with this arch") From bce3ab29a6c0ce0071d06d99bd8dc943cd3d1e8e Mon Sep 17 00:00:00 2001 From: Javier Carrasco Date: Thu, 26 Oct 2023 17:44:49 +0200 Subject: [PATCH 502/515] iio: common: ms_sensors: ms_sensors_i2c: fix humidity conversion time table The HTU21 offers 4 sampling frequencies: 20, 40, 70 and 120, which are associated to an index that is used to select the right measurement resolution and its corresponding measurement time. The current implementation selects the measurement resolution and the temperature measurement time properly, but it does not select the right humidity measurement time in all cases. In summary, the 40 and 70 humidity measurement times are swapped. The reason for that is probably the unusual coding for the measurement resolution. According to the datasheet, the bits [7,0] of the "user register" are used as follows to select the bit resolution: -------------------------------------------------- | Bit 7 | Bit 0 | RH | Temp | Trh (us) | Tt (us) | -------------------------------------------------- | 0 | 0 | 12 | 14 | 16000 | 50000 | -------------------------------------------------- | 0 | 1 | 8 | 12 | 3000 | 13000 | -------------------------------------------------- | 1 | 0 | 10 | 13 | 5000 | 25000 | -------------------------------------------------- | 1 | 1 | 11 | 11 | 8000 | 7000 | -------------------------------------------------- *This table is available in the official datasheet, page 13/21. I have just appended the times provided in the humidity/temperature tables, pages 3/21, 5/21. Note that always a pair of resolutions is selected. The sampling frequencies [20, 40, 70, 120] are assigned to a linear index [0..3] which is then coded as follows [1]: Index [7,0] -------------- idx 0 0,0 idx 1 1,0 idx 2 0,1 idx 3 1,1 That is done that way because the temperature measurements are being used as the reference for the sampling frequency (the frequencies and the temperature measurement times are correlated), so increasing the index always reduces the temperature measurement time and its resolution. Therefore, the temperature measurement time array is as simple as [50000, 25000, 13000, 7000] On the other hand, the humidity resolution cannot follow the same pattern because of the way it is coded in the "user register", where both resolutions are selected at the same time. The humidity measurement time array is the following: [16000, 3000, 5000, 8000], which defines the following assignments: Index [7,0] Trh ----------------------- idx 0 0,0 16000 -> right, [0,0] selects 12 bits (Trh = 16000) idx 1 1,0 3000 -> wrong! [1,0] selects 10 bits (Trh = 5000) idx 2 0,1 5000 -> wrong! [0,1] selects 8 bits (Trh = 3000) idx 3 1,1 8000 -> right, [1,1] selects 11 bits (Trh = 8000) The times have been ordered as if idx = 1 -> [0,1] and idx = 2 -> [1,0], which is not the case for the reason explained above. So a simple modification is required to obtain the right humidity measurement time array, swapping the values in the positions 1 and 2. The right table should be the following: [16000, 5000, 3000, 8000] Fix the humidity measurement time array with the right idex/value coding. [1] The actual code that makes this coding and assigns it to the current value of the "user register" is the following: config_reg &= 0x7E; config_reg |= ((i & 1) << 7) + ((i & 2) >> 1); Fixes: d574a87cc311 ("Add meas-spec sensors common part") Signed-off-by: Javier Carrasco Link: https://lore.kernel.org/r/20231026-topic-htu21_conversion_time-v1-1-bd257dc44209@gmail.com Cc: Signed-off-by: Jonathan Cameron --- drivers/iio/common/ms_sensors/ms_sensors_i2c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/iio/common/ms_sensors/ms_sensors_i2c.c b/drivers/iio/common/ms_sensors/ms_sensors_i2c.c index 6633b35a94e69a..9c9bc77003c7ff 100644 --- a/drivers/iio/common/ms_sensors/ms_sensors_i2c.c +++ b/drivers/iio/common/ms_sensors/ms_sensors_i2c.c @@ -15,8 +15,8 @@ /* Conversion times in us */ static const u16 ms_sensors_ht_t_conversion_time[] = { 50000, 25000, 13000, 7000 }; -static const u16 ms_sensors_ht_h_conversion_time[] = { 16000, 3000, - 5000, 8000 }; +static const u16 ms_sensors_ht_h_conversion_time[] = { 16000, 5000, + 3000, 8000 }; static const u16 ms_sensors_tp_conversion_time[] = { 500, 1100, 2100, 4100, 8220, 16440 }; From 522ea9d023dff197645dec9c12c081388e57e00e Mon Sep 17 00:00:00 2001 From: Antoniu Miclaus Date: Thu, 26 Oct 2023 13:33:13 +0300 Subject: [PATCH 503/515] hwmon: Add driver for ltc2991 Add support for LTC2991 Octal I2C Voltage, Current, and Temperature Monitor. The LTC2991 is used to monitor system temperatures, voltages and currents. Through the I2C serial interface, the eight monitors can individually measure supply voltages and can be paired for differential measurements of current sense resistors or temperature sensing transistors. Additional measurements include internal temperature and internal VCC. Signed-off-by: Antoniu Miclaus Link: https://lore.kernel.org/r/20231026103413.27800-2-antoniu.miclaus@analog.com Signed-off-by: Guenter Roeck --- Documentation/hwmon/index.rst | 1 + Documentation/hwmon/ltc2991.rst | 43 ++++ MAINTAINERS | 8 + drivers/hwmon/Kconfig | 11 + drivers/hwmon/Makefile | 1 + drivers/hwmon/ltc2991.c | 437 ++++++++++++++++++++++++++++++++ 6 files changed, 501 insertions(+) create mode 100644 Documentation/hwmon/ltc2991.rst create mode 100644 drivers/hwmon/ltc2991.c diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst index 10a54644557d07..72f4e6065baede 100644 --- a/Documentation/hwmon/index.rst +++ b/Documentation/hwmon/index.rst @@ -121,6 +121,7 @@ Hardware Monitoring Kernel Drivers ltc2947 ltc2978 ltc2990 + ltc2991 ltc3815 ltc4151 ltc4215 diff --git a/Documentation/hwmon/ltc2991.rst b/Documentation/hwmon/ltc2991.rst new file mode 100644 index 00000000000000..9ab29dd8501269 --- /dev/null +++ b/Documentation/hwmon/ltc2991.rst @@ -0,0 +1,43 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Kernel driver ltc2991 +===================== + +Supported chips: + + * Analog Devices LTC2991 + + Prefix: 'ltc2991' + + Addresses scanned: I2C 0x48 - 0x4f + + Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/2991ff.pdf + +Authors: + + - Antoniu Miclaus + + +Description +----------- + +This driver supports hardware monitoring for Analog Devices LTC2991 Octal I2C +Voltage, Current and Temperature Monitor. + +The LTC2991 is used to monitor system temperatures, voltages and currents. +Through the I2C serial interface, the eight monitors can individually measure +supply voltages and can be paired for differential measurements of current sense +resistors or temperature sensing transistors. Additional measurements include +internal temperatureand internal VCC. + + +sysfs-Interface +------------- + +The following attributes are supported. Limits are read-only. + +=============== ================= +inX_input: voltage input +currX_input: current input +tempX_input: temperature input +=============== ================= diff --git a/MAINTAINERS b/MAINTAINERS index d0ce1a122ddfac..43121073390cf8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -12458,6 +12458,14 @@ F: drivers/hwmon/ltc2947-i2c.c F: drivers/hwmon/ltc2947-spi.c F: drivers/hwmon/ltc2947.h +LTC2991 HARDWARE MONITOR DRIVER +M: Antoniu Miclaus +L: linux-hwmon@vger.kernel.org +S: Supported +W: https://ez.analog.com/linux-software-drivers +F: Documentation/devicetree/bindings/hwmon/adi,ltc2991.yaml +F: drivers/hwmon/ltc2991.c + LTC2983 IIO TEMPERATURE DRIVER M: Nuno Sá L: linux-iio@vger.kernel.org diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index e36f58b01f2d4a..cf27523eed5a71 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -942,6 +942,17 @@ config SENSORS_LTC2990 This driver can also be built as a module. If so, the module will be called ltc2990. +config SENSORS_LTC2991 + tristate "Analog Devices LTC2991" + depends on I2C + help + If you say yes here you get support for Analog Devices LTC2991 + Octal I2C Voltage, Current, and Temperature Monitor. The LTC2991 + supports a combination of voltage, current and temperature monitoring. + + This driver can also be built as a module. If so, the module will + be called ltc2991. + config SENSORS_LTC2992 tristate "Linear Technology LTC2992" depends on I2C diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 019189500e5d77..e84bd9685b5c4d 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -127,6 +127,7 @@ obj-$(CONFIG_SENSORS_LTC2947) += ltc2947-core.o obj-$(CONFIG_SENSORS_LTC2947_I2C) += ltc2947-i2c.o obj-$(CONFIG_SENSORS_LTC2947_SPI) += ltc2947-spi.o obj-$(CONFIG_SENSORS_LTC2990) += ltc2990.o +obj-$(CONFIG_SENSORS_LTC2991) += ltc2991.o obj-$(CONFIG_SENSORS_LTC2992) += ltc2992.o obj-$(CONFIG_SENSORS_LTC4151) += ltc4151.o obj-$(CONFIG_SENSORS_LTC4215) += ltc4215.o diff --git a/drivers/hwmon/ltc2991.c b/drivers/hwmon/ltc2991.c new file mode 100644 index 00000000000000..bd63c61129a94a --- /dev/null +++ b/drivers/hwmon/ltc2991.c @@ -0,0 +1,437 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2023 Analog Devices, Inc. + * Author: Antoniu Miclaus + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LTC2991_STATUS_LOW 0x00 +#define LTC2991_CH_EN_TRIGGER 0x01 +#define LTC2991_V1_V4_CTRL 0x06 +#define LTC2991_V5_V8_CTRL 0x07 +#define LTC2991_PWM_TH_LSB_T_INT 0x08 +#define LTC2991_PWM_TH_MSB 0x09 +#define LTC2991_CHANNEL_V_MSB(x) (0x0A + ((x) * 2)) +#define LTC2991_CHANNEL_T_MSB(x) (0x0A + ((x) * 4)) +#define LTC2991_CHANNEL_C_MSB(x) (0x0C + ((x) * 4)) +#define LTC2991_T_INT_MSB 0x1A +#define LTC2991_VCC_MSB 0x1C + +#define LTC2991_V7_V8_EN BIT(7) +#define LTC2991_V5_V6_EN BIT(6) +#define LTC2991_V3_V4_EN BIT(5) +#define LTC2991_V1_V2_EN BIT(4) +#define LTC2991_T_INT_VCC_EN BIT(3) + +#define LTC2991_V3_V4_FILT_EN BIT(7) +#define LTC2991_V3_V4_TEMP_EN BIT(5) +#define LTC2991_V3_V4_DIFF_EN BIT(4) +#define LTC2991_V1_V2_FILT_EN BIT(3) +#define LTC2991_V1_V2_TEMP_EN BIT(1) +#define LTC2991_V1_V2_DIFF_EN BIT(0) + +#define LTC2991_V7_V8_FILT_EN BIT(7) +#define LTC2991_V7_V8_TEMP_EN BIT(5) +#define LTC2991_V7_V8_DIFF_EN BIT(4) +#define LTC2991_V5_V6_FILT_EN BIT(7) +#define LTC2991_V5_V6_TEMP_EN BIT(5) +#define LTC2991_V5_V6_DIFF_EN BIT(4) + +#define LTC2991_REPEAT_ACQ_EN BIT(4) +#define LTC2991_T_INT_FILT_EN BIT(3) + +#define LTC2991_MAX_CHANNEL 4 +#define LTC2991_T_INT_CH_NR 4 +#define LTC2991_VCC_CH_NR 0 + +struct ltc2991_state { + struct device *dev; + struct regmap *regmap; + u32 r_sense_uohm[LTC2991_MAX_CHANNEL]; + bool temp_en[LTC2991_MAX_CHANNEL]; +}; + +static int ltc2991_read_reg(struct ltc2991_state *st, u8 addr, u8 reg_len, + int *val) +{ + __be16 regvals; + int ret; + + if (reg_len < 2) + return regmap_read(st->regmap, addr, val); + + ret = regmap_bulk_read(st->regmap, addr, ®vals, reg_len); + if (ret) + return ret; + + *val = be16_to_cpu(regvals); + + return 0; +} + +static int ltc2991_get_voltage(struct ltc2991_state *st, u32 reg, long *val) +{ + int reg_val, ret, offset = 0; + + ret = ltc2991_read_reg(st, reg, 2, ®_val); + if (ret) + return ret; + + if (reg == LTC2991_VCC_MSB) + /* Vcc 2.5V offset */ + offset = 2500; + + /* Vx, 305.18uV/LSB */ + *val = DIV_ROUND_CLOSEST(sign_extend32(reg_val, 14) * 30518, + 1000 * 100) + offset; + + return 0; +} + +static int ltc2991_read_in(struct device *dev, u32 attr, int channel, long *val) +{ + struct ltc2991_state *st = dev_get_drvdata(dev); + u32 reg; + + switch (attr) { + case hwmon_in_input: + if (channel == LTC2991_VCC_CH_NR) + reg = LTC2991_VCC_MSB; + else + reg = LTC2991_CHANNEL_V_MSB(channel - 1); + + return ltc2991_get_voltage(st, reg, val); + default: + return -EOPNOTSUPP; + } +} + +static int ltc2991_get_curr(struct ltc2991_state *st, u32 reg, int channel, + long *val) +{ + int reg_val, ret; + + ret = ltc2991_read_reg(st, reg, 2, ®_val); + if (ret) + return ret; + + /* Vx-Vy, 19.075uV/LSB */ + *val = DIV_ROUND_CLOSEST(sign_extend32(reg_val, 14) * 19075, + st->r_sense_uohm[channel]); + + return 0; +} + +static int ltc2991_read_curr(struct device *dev, u32 attr, int channel, + long *val) +{ + struct ltc2991_state *st = dev_get_drvdata(dev); + u32 reg; + + switch (attr) { + case hwmon_curr_input: + reg = LTC2991_CHANNEL_C_MSB(channel); + return ltc2991_get_curr(st, reg, channel, val); + default: + return -EOPNOTSUPP; + } +} + +static int ltc2991_get_temp(struct ltc2991_state *st, u32 reg, int channel, + long *val) +{ + int reg_val, ret; + + ret = ltc2991_read_reg(st, reg, 2, ®_val); + if (ret) + return ret; + + /* Temp LSB = 0.0625 Degrees */ + *val = DIV_ROUND_CLOSEST(sign_extend32(reg_val, 12) * 1000, 16); + + return 0; +} + +static int ltc2991_read_temp(struct device *dev, u32 attr, int channel, + long *val) +{ + struct ltc2991_state *st = dev_get_drvdata(dev); + u32 reg; + + switch (attr) { + case hwmon_temp_input: + if (channel == LTC2991_T_INT_CH_NR) + reg = LTC2991_T_INT_MSB; + else + reg = LTC2991_CHANNEL_T_MSB(channel); + + return ltc2991_get_temp(st, reg, channel, val); + default: + return -EOPNOTSUPP; + } +} + +static int ltc2991_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + switch (type) { + case hwmon_in: + return ltc2991_read_in(dev, attr, channel, val); + case hwmon_curr: + return ltc2991_read_curr(dev, attr, channel, val); + case hwmon_temp: + return ltc2991_read_temp(dev, attr, channel, val); + default: + return -EOPNOTSUPP; + } +} + +static umode_t ltc2991_is_visible(const void *data, + enum hwmon_sensor_types type, u32 attr, + int channel) +{ + const struct ltc2991_state *st = data; + + switch (type) { + case hwmon_in: + switch (attr) { + case hwmon_in_input: + if (channel == LTC2991_VCC_CH_NR) + return 0444; + if (st->temp_en[(channel - 1) / 2]) + break; + if (channel % 2) + return 0444; + if (!st->r_sense_uohm[(channel - 1) / 2]) + return 0444; + } + break; + case hwmon_curr: + switch (attr) { + case hwmon_curr_input: + if (st->r_sense_uohm[channel]) + return 0444; + break; + } + break; + case hwmon_temp: + switch (attr) { + case hwmon_temp_input: + if (st->temp_en[channel] || + channel == LTC2991_T_INT_CH_NR) + return 0444; + break; + } + break; + default: + break; + } + + return 0; +} + +static const struct hwmon_ops ltc2991_hwmon_ops = { + .is_visible = ltc2991_is_visible, + .read = ltc2991_read, +}; + +static const struct hwmon_channel_info *ltc2991_info[] = { + HWMON_CHANNEL_INFO(temp, + HWMON_T_INPUT, + HWMON_T_INPUT, + HWMON_T_INPUT, + HWMON_T_INPUT, + HWMON_T_INPUT + ), + HWMON_CHANNEL_INFO(curr, + HWMON_C_INPUT, + HWMON_C_INPUT, + HWMON_C_INPUT, + HWMON_C_INPUT + ), + HWMON_CHANNEL_INFO(in, + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT + ), + NULL +}; + +static const struct hwmon_chip_info ltc2991_chip_info = { + .ops = <c2991_hwmon_ops, + .info = ltc2991_info, +}; + +static const struct regmap_config ltc2991_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .max_register = 0x1D, +}; + +static int ltc2991_init(struct ltc2991_state *st) +{ + struct fwnode_handle *child; + int ret; + u32 val, addr; + u8 v5_v8_reg_data = 0, v1_v4_reg_data = 0; + + ret = devm_regulator_get_enable(st->dev, "vcc"); + if (ret) + return dev_err_probe(st->dev, ret, + "failed to enable regulator\n"); + + device_for_each_child_node(st->dev, child) { + ret = fwnode_property_read_u32(child, "reg", &addr); + if (ret < 0) { + fwnode_handle_put(child); + return ret; + } + + if (addr > 3) { + fwnode_handle_put(child); + return -EINVAL; + } + + ret = fwnode_property_read_u32(child, + "shunt-resistor-micro-ohms", + &val); + if (!ret) { + if (!val) + return dev_err_probe(st->dev, -EINVAL, + "shunt resistor value cannot be zero\n"); + + st->r_sense_uohm[addr] = val; + + switch (addr) { + case 0: + v1_v4_reg_data |= LTC2991_V1_V2_DIFF_EN; + break; + case 1: + v1_v4_reg_data |= LTC2991_V3_V4_DIFF_EN; + break; + case 2: + v5_v8_reg_data |= LTC2991_V5_V6_DIFF_EN; + break; + case 3: + v5_v8_reg_data |= LTC2991_V7_V8_DIFF_EN; + break; + default: + break; + } + } + + ret = fwnode_property_read_bool(child, + "adi,temperature-enable"); + if (ret) { + st->temp_en[addr] = ret; + + switch (addr) { + case 0: + v1_v4_reg_data |= LTC2991_V1_V2_TEMP_EN; + break; + case 1: + v1_v4_reg_data |= LTC2991_V3_V4_TEMP_EN; + break; + case 2: + v5_v8_reg_data |= LTC2991_V5_V6_TEMP_EN; + break; + case 3: + v5_v8_reg_data |= LTC2991_V7_V8_TEMP_EN; + break; + default: + break; + } + } + } + + ret = regmap_write(st->regmap, LTC2991_V5_V8_CTRL, v5_v8_reg_data); + if (ret) + return dev_err_probe(st->dev, ret, + "Error: Failed to set V5-V8 CTRL reg.\n"); + + ret = regmap_write(st->regmap, LTC2991_V1_V4_CTRL, v1_v4_reg_data); + if (ret) + return dev_err_probe(st->dev, ret, + "Error: Failed to set V1-V4 CTRL reg.\n"); + + ret = regmap_write(st->regmap, LTC2991_PWM_TH_LSB_T_INT, + LTC2991_REPEAT_ACQ_EN); + if (ret) + return dev_err_probe(st->dev, ret, + "Error: Failed to set contiuous mode.\n"); + + /* Enable all channels and trigger conversions */ + return regmap_write(st->regmap, LTC2991_CH_EN_TRIGGER, + LTC2991_V7_V8_EN | LTC2991_V5_V6_EN | + LTC2991_V3_V4_EN | LTC2991_V1_V2_EN | + LTC2991_T_INT_VCC_EN); +} + +static int ltc2991_i2c_probe(struct i2c_client *client) +{ + int ret; + struct device *hwmon_dev; + struct ltc2991_state *st; + + st = devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL); + if (!st) + return -ENOMEM; + + st->dev = &client->dev; + st->regmap = devm_regmap_init_i2c(client, <c2991_regmap_config); + if (IS_ERR(st->regmap)) + return PTR_ERR(st->regmap); + + ret = ltc2991_init(st); + if (ret) + return ret; + + hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, + client->name, st, + <c2991_chip_info, + NULL); + + return PTR_ERR_OR_ZERO(hwmon_dev); +} + +static const struct of_device_id ltc2991_of_match[] = { + { .compatible = "adi,ltc2991" }, + { } +}; +MODULE_DEVICE_TABLE(of, ltc2991_of_match); + +static const struct i2c_device_id ltc2991_i2c_id[] = { + { "ltc2991", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, ltc2991_i2c_id); + +static struct i2c_driver ltc2991_i2c_driver = { + .driver = { + .name = "ltc2991", + .of_match_table = ltc2991_of_match, + }, + .probe = ltc2991_i2c_probe, + .id_table = ltc2991_i2c_id, +}; + +module_i2c_driver(ltc2991_i2c_driver); + +MODULE_AUTHOR("Antoniu Miclaus "); +MODULE_DESCRIPTION("Analog Devices LTC2991 HWMON Driver"); +MODULE_LICENSE("GPL"); From 144c314ccbb420acba1bfa7dffe87f000803beb5 Mon Sep 17 00:00:00 2001 From: Tomer Maimon Date: Wed, 18 Oct 2023 21:19:24 +0300 Subject: [PATCH 504/515] dt-bindings: hwmon: npcm: Add npcm845 compatible string Add a compatible string for Nuvoton BMC NPCM845 Pulse Width Modulation (PWM) and Fan tach controller. Signed-off-by: Tomer Maimon Acked-by: Rob Herring Link: https://lore.kernel.org/r/20231018181925.1826042-2-tmaimon77@gmail.com Signed-off-by: Guenter Roeck --- Documentation/devicetree/bindings/hwmon/npcm750-pwm-fan.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/hwmon/npcm750-pwm-fan.txt b/Documentation/devicetree/bindings/hwmon/npcm750-pwm-fan.txt index 8523777f560cd5..18095ba87a5a9d 100644 --- a/Documentation/devicetree/bindings/hwmon/npcm750-pwm-fan.txt +++ b/Documentation/devicetree/bindings/hwmon/npcm750-pwm-fan.txt @@ -1,12 +1,16 @@ -Nuvoton NPCM7xx PWM and Fan Tacho controller device +Nuvoton NPCM PWM and Fan Tacho controller device The Nuvoton BMC NPCM7XX supports 8 Pulse-width modulation (PWM) controller outputs and 16 Fan tachometer controller inputs. +The Nuvoton BMC NPCM8XX supports 12 Pulse-width modulation (PWM) +controller outputs and 16 Fan tachometer controller inputs. + Required properties for pwm-fan node - #address-cells : should be 1. - #size-cells : should be 0. - compatible : "nuvoton,npcm750-pwm-fan" for Poleg NPCM7XX. + : "nuvoton,npcm845-pwm-fan" for Arbel NPCM8XX. - reg : specifies physical base address and size of the registers. - reg-names : must contain: * "pwm" for the PWM registers. From a91c4af863c27c8b98fd86ea35c4d67fa5866653 Mon Sep 17 00:00:00 2001 From: Aleksa Savic Date: Mon, 16 Oct 2023 10:35:58 +0200 Subject: [PATCH 505/515] hwmon: (aquacomputer_d5next) Add support for Aquacomputer High Flow USB and MPS Flow Extend aquacomputer_d5next driver to expose various hardware sensors of the Aquacomputer High Flow USB flow sensor, which communicates through a proprietary USB HID protocol. This commit also adds support for the sensors of the MPS Flow devices, as they have the same USB product ID and sensor layouts. Implemented by Leonard Anderweit [1]. Internal and external temp sensor readings are available, along with the flow sensor. Additionally, serial number and firmware version are exposed through debugfs. [1] https://github.com/aleksamagicka/aquacomputer_d5next-hwmon/pull/90 Originally-from: Leonard Anderweit Signed-off-by: Aleksa Savic Link: https://lore.kernel.org/r/20231016083559.139341-3-savicaleksa83@gmail.com Signed-off-by: Guenter Roeck --- Documentation/hwmon/aquacomputer_d5next.rst | 7 +++ drivers/hwmon/aquacomputer_d5next.c | 67 +++++++++++++++++++-- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/Documentation/hwmon/aquacomputer_d5next.rst b/Documentation/hwmon/aquacomputer_d5next.rst index 94dc2d93d1808d..cb073c79479c34 100644 --- a/Documentation/hwmon/aquacomputer_d5next.rst +++ b/Documentation/hwmon/aquacomputer_d5next.rst @@ -16,6 +16,8 @@ Supported devices: * Aquacomputer Aquastream XT watercooling pump * Aquacomputer Aquastream Ultimate watercooling pump * Aquacomputer Poweradjust 3 fan controller +* Aquacomputer High Flow USB flow meter +* Aquacomputer MPS Flow devices Author: Aleksa Savic @@ -73,6 +75,11 @@ It also exposes pressure and flow speed readings. The Poweradjust 3 controller exposes a single external temperature sensor. +The High Flow USB exposes an internal and external temperature sensor, and a flow meter. + +The MPS Flow devices expose the same entries as the High Flow USB because they have +the same USB product ID and report sensors equivalently. + Depending on the device, not all sysfs and debugfs entries will be available. Writing to virtual temperature sensors is not currently supported. diff --git a/drivers/hwmon/aquacomputer_d5next.c b/drivers/hwmon/aquacomputer_d5next.c index 023807859be721..0378edd52134d1 100644 --- a/drivers/hwmon/aquacomputer_d5next.c +++ b/drivers/hwmon/aquacomputer_d5next.c @@ -1,11 +1,12 @@ // SPDX-License-Identifier: GPL-2.0+ /* * hwmon driver for Aquacomputer devices (D5 Next, Farbwerk, Farbwerk 360, Octo, - * Quadro, High Flow Next, Aquaero, Aquastream Ultimate, Leakshield) + * Quadro, High Flow Next, Aquaero, Aquastream Ultimate, Leakshield, + * High Flow USB/MPS Flow family) * * Aquacomputer devices send HID reports (with ID 0x01) every second to report * sensor values, except for devices that communicate through the - * legacy way (currently, Poweradjust 3). + * legacy way (currently, Poweradjust 3 and High Flow USB/MPS Flow family). * * Copyright 2021 Aleksa Savic * Copyright 2022 Jack Doan @@ -35,11 +36,12 @@ #define USB_PRODUCT_ID_AQUASTREAMXT 0xf0b6 #define USB_PRODUCT_ID_AQUASTREAMULT 0xf00b #define USB_PRODUCT_ID_POWERADJUST3 0xf0bd +#define USB_PRODUCT_ID_HIGHFLOW 0xf003 enum kinds { d5next, farbwerk, farbwerk360, octo, quadro, highflownext, aquaero, poweradjust3, aquastreamult, - aquastreamxt, leakshield + aquastreamxt, leakshield, highflow }; static const char *const aqc_device_names[] = { @@ -53,7 +55,8 @@ static const char *const aqc_device_names[] = { [aquastreamxt] = "aquastreamxt", [aquaero] = "aquaero", [aquastreamult] = "aquastreamultimate", - [poweradjust3] = "poweradjust3" + [poweradjust3] = "poweradjust3", + [highflow] = "highflow" /* Covers MPS Flow devices */ }; #define DRIVER_NAME "aquacomputer_d5next" @@ -90,6 +93,8 @@ static u8 aquaero_secondary_ctrl_report[] = { #define POWERADJUST3_STATUS_REPORT_ID 0x03 +#define HIGHFLOW_STATUS_REPORT_ID 0x02 + /* Data types for reading and writing control reports */ #define AQC_8 0 #define AQC_BE16 1 @@ -282,6 +287,17 @@ static u16 aquastreamxt_sensor_fan_offsets[] = { 0x13, 0x1b }; /* Sensor report offsets for the Poweradjust 3 */ #define POWERADJUST3_SENSOR_START 0x03 +/* Specs of the High Flow USB */ +#define HIGHFLOW_NUM_SENSORS 2 +#define HIGHFLOW_NUM_FLOW_SENSORS 1 +#define HIGHFLOW_SENSOR_REPORT_SIZE 0x76 + +/* Sensor report offsets for the High Flow USB */ +#define HIGHFLOW_FIRMWARE_VERSION 0x3 +#define HIGHFLOW_SERIAL_START 0x9 +#define HIGHFLOW_FLOW_SENSOR_OFFSET 0x23 +#define HIGHFLOW_SENSOR_START 0x2b + /* Labels for D5 Next */ static const char *const label_d5next_temp[] = { "Coolant temp" @@ -486,6 +502,16 @@ static const char *const label_poweradjust3_temp_sensors[] = { "External sensor" }; +/* Labels for Highflow */ +static const char *const label_highflow_temp[] = { + "External temp", + "Internal temp" +}; + +static const char *const label_highflow_speeds[] = { + "Flow speed [dL/h]" +}; + struct aqc_fan_structure_offsets { u8 voltage; u8 curr; @@ -819,6 +845,7 @@ static umode_t aqc_is_visible(const void *data, enum hwmon_sensor_types type, u3 break; case aquaero: case quadro: + case highflow: /* Special case to support flow sensors */ if (channel < priv->num_fans + priv->num_flow_sensors) return 0444; @@ -962,6 +989,17 @@ static int aqc_legacy_read(struct aqc_data *priv) sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_FAN_VOLTAGE_OFFSET); priv->voltage_input[1] = DIV_ROUND_CLOSEST(sensor_value * 1000, 63); break; + case highflow: + /* Info provided with every report */ + priv->serial_number[0] = get_unaligned_le16(priv->buffer + + priv->serial_number_start_offset); + priv->firmware_version = + get_unaligned_le16(priv->buffer + priv->firmware_version_offset); + + /* Read flow speed */ + priv->speed_input[0] = get_unaligned_le16(priv->buffer + + priv->flow_sensors_start_offset); + break; default: break; } @@ -1747,6 +1785,20 @@ static int aqc_probe(struct hid_device *hdev, const struct hid_device_id *id) priv->temp_label = label_poweradjust3_temp_sensors; break; + case USB_PRODUCT_ID_HIGHFLOW: + priv->kind = highflow; + + priv->num_fans = 0; + + priv->num_temp_sensors = HIGHFLOW_NUM_SENSORS; + priv->temp_sensor_start_offset = HIGHFLOW_SENSOR_START; + priv->num_flow_sensors = HIGHFLOW_NUM_FLOW_SENSORS; + priv->flow_sensors_start_offset = HIGHFLOW_FLOW_SENSOR_OFFSET; + priv->buffer_size = HIGHFLOW_SENSOR_REPORT_SIZE; + + priv->temp_label = label_highflow_temp; + priv->speed_label = label_highflow_speeds; + break; default: break; } @@ -1772,6 +1824,12 @@ static int aqc_probe(struct hid_device *hdev, const struct hid_device_id *id) priv->status_report_id = AQUASTREAMXT_STATUS_REPORT_ID; break; + case highflow: + priv->serial_number_start_offset = HIGHFLOW_SERIAL_START; + priv->firmware_version_offset = HIGHFLOW_FIRMWARE_VERSION; + + priv->status_report_id = HIGHFLOW_STATUS_REPORT_ID; + break; default: priv->serial_number_start_offset = AQC_SERIAL_START; priv->firmware_version_offset = AQC_FIRMWARE_VERSION; @@ -1846,6 +1904,7 @@ static const struct hid_device_id aqc_table[] = { { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUASTREAMXT) }, { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUASTREAMULT) }, { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_POWERADJUST3) }, + { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_HIGHFLOW) }, { } }; From 8293a6bcf50e6f64414b2bdc01a3edf525d78ca0 Mon Sep 17 00:00:00 2001 From: Aleksa Savic Date: Mon, 16 Oct 2023 10:35:57 +0200 Subject: [PATCH 506/515] hwmon: (aquacomputer_d5next) Check if temp sensors of legacy devices are connected Return -ENODATA if a temp sensor of a legacy device does not contain a reading. Originally-from: Leonard Anderweit Signed-off-by: Aleksa Savic Link: https://lore.kernel.org/r/20231016083559.139341-2-savicaleksa83@gmail.com Signed-off-by: Guenter Roeck --- drivers/hwmon/aquacomputer_d5next.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/hwmon/aquacomputer_d5next.c b/drivers/hwmon/aquacomputer_d5next.c index 0378edd52134d1..4fdd2e12427b9d 100644 --- a/drivers/hwmon/aquacomputer_d5next.c +++ b/drivers/hwmon/aquacomputer_d5next.c @@ -953,7 +953,10 @@ static int aqc_legacy_read(struct aqc_data *priv) for (i = 0; i < priv->num_temp_sensors; i++) { sensor_value = get_unaligned_le16(priv->buffer + priv->temp_sensor_start_offset + i * AQC_SENSOR_SIZE); - priv->temp_input[i] = sensor_value * 10; + if (sensor_value == AQC_SENSOR_NA) + priv->temp_input[i] = -ENODATA; + else + priv->temp_input[i] = sensor_value * 10; } /* Special-case sensor readings */ From 1d3936fecb278d80996be74ce5b4e1791f3f949b Mon Sep 17 00:00:00 2001 From: Steve French Date: Thu, 19 Oct 2023 23:01:49 -0500 Subject: [PATCH 507/515] smb3: fix creating FIFOs when mounting with "sfu" mount option Fixes some xfstests including generic/564 and generic/157 The "sfu" mount option can be useful for creating special files (character and block devices in particular) but could not create FIFOs. It did recognize existing empty files with the "system" attribute flag as FIFOs but this is too general, so to support creating FIFOs more safely use a new tag (but the same length as those for char and block devices ie "IntxLNK" and "IntxBLK") "LnxFIFO" to indicate that the file should be treated as a FIFO (when mounted with the "sfu"). For some additional context note that "sfu" followed the way that "Services for Unix" on Windows handled these special files (at least for character and block devices and symlinks), which is different than newer Windows which can handle special files as reparse points (which isn't an option to many servers). Cc: stable@vger.kernel.org Signed-off-by: Steve French --- fs/smb/client/cifspdu.h | 2 +- fs/smb/client/inode.c | 4 ++++ fs/smb/client/smb2ops.c | 8 +++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/smb/client/cifspdu.h b/fs/smb/client/cifspdu.h index e17222fec9d290..a75220db5c1e18 100644 --- a/fs/smb/client/cifspdu.h +++ b/fs/smb/client/cifspdu.h @@ -2570,7 +2570,7 @@ typedef struct { struct win_dev { - unsigned char type[8]; /* IntxCHR or IntxBLK */ + unsigned char type[8]; /* IntxCHR or IntxBLK or LnxFIFO*/ __le64 major; __le64 minor; } __attribute__((packed)); diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index d7c302442c1ec8..c03a286ed41887 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -592,6 +592,10 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path, cifs_dbg(FYI, "Symlink\n"); fattr->cf_mode |= S_IFLNK; fattr->cf_dtype = DT_LNK; + } else if (memcmp("LnxFIFO", pbuf, 8) == 0) { + cifs_dbg(FYI, "FIFO\n"); + fattr->cf_mode |= S_IFIFO; + fattr->cf_dtype = DT_FIFO; } else { fattr->cf_mode |= S_IFREG; /* file? */ fattr->cf_dtype = DT_REG; diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 9aeecee6b91b35..4af0085239b74d 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -5087,7 +5087,7 @@ smb2_make_node(unsigned int xid, struct inode *inode, * over SMB2/SMB3 and Samba will do this with SMB3.1.1 POSIX Extensions */ - if (!S_ISCHR(mode) && !S_ISBLK(mode)) + if (!S_ISCHR(mode) && !S_ISBLK(mode) && !S_ISFIFO(mode)) return rc; cifs_dbg(FYI, "sfu compat create special file\n"); @@ -5135,6 +5135,12 @@ smb2_make_node(unsigned int xid, struct inode *inode, pdev->minor = cpu_to_le64(MINOR(dev)); rc = tcon->ses->server->ops->sync_write(xid, &fid, &io_parms, &bytes_written, iov, 1); + } else if (S_ISFIFO(mode)) { + memcpy(pdev->type, "LnxFIFO", 8); + pdev->major = 0; + pdev->minor = 0; + rc = tcon->ses->server->ops->sync_write(xid, &fid, &io_parms, + &bytes_written, iov, 1); } tcon->ses->server->ops->close(xid, tcon, &fid); d_drop(dentry); From 39543a5e656bdfdec12cbac1ffeaf59f8d710108 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Wed, 25 Oct 2023 14:58:35 -0300 Subject: [PATCH 508/515] smb: client: fix potential deadlock when releasing mids All release_mid() callers seem to hold a reference of @mid so there is no need to call kref_put(&mid->refcount, __release_mid) under @server->mid_lock spinlock. If they don't, then an use-after-free bug would have caused anyways. By getting rid of such spinlock also fixes a potential deadlock as shown below CPU 0 CPU 1 ------------------------------------------------------------------ cifs_demultiplex_thread() cifs_debug_data_proc_show() release_mid() spin_lock(&server->mid_lock); spin_lock(&cifs_tcp_ses_lock) spin_lock(&server->mid_lock) __release_mid() smb2_find_smb_tcon() spin_lock(&cifs_tcp_ses_lock) *deadlock* Signed-off-by: Paulo Alcantara (SUSE) Signed-off-by: Steve French --- fs/smb/client/cifsproto.h | 7 ++++++- fs/smb/client/smb2misc.c | 2 +- fs/smb/client/transport.c | 11 +---------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 0c37eefa18a57c..890ceddae07e25 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -81,7 +81,7 @@ extern char *cifs_build_path_to_root(struct smb3_fs_context *ctx, extern char *build_wildcard_path_from_dentry(struct dentry *direntry); char *cifs_build_devname(char *nodename, const char *prepath); extern void delete_mid(struct mid_q_entry *mid); -extern void release_mid(struct mid_q_entry *mid); +void __release_mid(struct kref *refcount); extern void cifs_wake_up_task(struct mid_q_entry *mid); extern int cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid); @@ -740,4 +740,9 @@ static inline bool dfs_src_pathname_equal(const char *s1, const char *s2) return true; } +static inline void release_mid(struct mid_q_entry *mid) +{ + kref_put(&mid->refcount, __release_mid); +} + #endif /* _CIFSPROTO_H */ diff --git a/fs/smb/client/smb2misc.c b/fs/smb/client/smb2misc.c index 25f7cd6f23d64c..32dfa0f7a78c30 100644 --- a/fs/smb/client/smb2misc.c +++ b/fs/smb/client/smb2misc.c @@ -787,7 +787,7 @@ __smb2_handle_cancelled_cmd(struct cifs_tcon *tcon, __u16 cmd, __u64 mid, { struct close_cancelled_open *cancelled; - cancelled = kzalloc(sizeof(*cancelled), GFP_ATOMIC); + cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL); if (!cancelled) return -ENOMEM; diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 14710afdc2a36c..d553b7a54621bc 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -76,7 +76,7 @@ alloc_mid(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) return temp; } -static void __release_mid(struct kref *refcount) +void __release_mid(struct kref *refcount) { struct mid_q_entry *midEntry = container_of(refcount, struct mid_q_entry, refcount); @@ -156,15 +156,6 @@ static void __release_mid(struct kref *refcount) mempool_free(midEntry, cifs_mid_poolp); } -void release_mid(struct mid_q_entry *mid) -{ - struct TCP_Server_Info *server = mid->server; - - spin_lock(&server->mid_lock); - kref_put(&mid->refcount, __release_mid); - spin_unlock(&server->mid_lock); -} - void delete_mid(struct mid_q_entry *mid) { From 948df361deeea898333e6d0fd21150e7e89287b0 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Tue, 24 Oct 2023 13:49:15 -0300 Subject: [PATCH 509/515] smb: client: fix use-after-free bug in cifs_debug_data_proc_show() Skip SMB sessions that are being teared down (e.g. @ses->ses_status == SES_EXITING) in cifs_debug_data_proc_show() to avoid use-after-free in @ses. This fixes the following GPF when reading from /proc/fs/cifs/DebugData while mounting and umounting [ 816.251274] general protection fault, probably for non-canonical address 0x6b6b6b6b6b6b6d81: 0000 [#1] PREEMPT SMP NOPTI ... [ 816.260138] Call Trace: [ 816.260329] [ 816.260499] ? die_addr+0x36/0x90 [ 816.260762] ? exc_general_protection+0x1b3/0x410 [ 816.261126] ? asm_exc_general_protection+0x26/0x30 [ 816.261502] ? cifs_debug_tcon+0xbd/0x240 [cifs] [ 816.261878] ? cifs_debug_tcon+0xab/0x240 [cifs] [ 816.262249] cifs_debug_data_proc_show+0x516/0xdb0 [cifs] [ 816.262689] ? seq_read_iter+0x379/0x470 [ 816.262995] seq_read_iter+0x118/0x470 [ 816.263291] proc_reg_read_iter+0x53/0x90 [ 816.263596] ? srso_alias_return_thunk+0x5/0x7f [ 816.263945] vfs_read+0x201/0x350 [ 816.264211] ksys_read+0x75/0x100 [ 816.264472] do_syscall_64+0x3f/0x90 [ 816.264750] entry_SYSCALL_64_after_hwframe+0x6e/0xd8 [ 816.265135] RIP: 0033:0x7fd5e669d381 Signed-off-by: Paulo Alcantara (SUSE) Signed-off-by: Steve French --- fs/smb/client/cifs_debug.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/smb/client/cifs_debug.c b/fs/smb/client/cifs_debug.c index 76922fcc4bc6e5..9a0ccd87468ea4 100644 --- a/fs/smb/client/cifs_debug.c +++ b/fs/smb/client/cifs_debug.c @@ -452,6 +452,11 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) seq_printf(m, "\n\n\tSessions: "); i = 0; list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { + spin_lock(&ses->ses_lock); + if (ses->ses_status == SES_EXITING) { + spin_unlock(&ses->ses_lock); + continue; + } i++; if ((ses->serverDomain == NULL) || (ses->serverOS == NULL) || @@ -472,6 +477,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) ses->ses_count, ses->serverOS, ses->serverNOS, ses->capabilities, ses->ses_status); } + spin_unlock(&ses->ses_lock); seq_printf(m, "\n\tSecurity type: %s ", get_security_type_str(server->ops->select_sectype(server, ses->sectype))); From f0fea94ed6c7717b3f3d6a69f7fddedc0a02ae68 Mon Sep 17 00:00:00 2001 From: Steve French Date: Thu, 20 Jul 2023 08:30:32 -0500 Subject: [PATCH 510/515] cifs: update internal module version number for cifs.ko From 2.45 to 2.46 Signed-off-by: Steve French --- fs/smb/client/cifsfs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 41daebd220ff42..32ccc4d43df654 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -152,6 +152,6 @@ extern const struct export_operations cifs_export_ops; #endif /* CONFIG_CIFS_NFSD_EXPORT */ /* when changing internal version - update following two lines at same time */ -#define SMB3_PRODUCT_BUILD 45 -#define CIFS_VERSION "2.45" +#define SMB3_PRODUCT_BUILD 46 +#define CIFS_VERSION "2.46" #endif /* _CIFSFS_H */ From 5cc881595ae4315dada0a53096068486bdaa809c Mon Sep 17 00:00:00 2001 From: Stephen Rothwell Date: Mon, 30 Oct 2023 15:54:37 +1100 Subject: [PATCH 511/515] fix up for "crypto: ahash - remove crypto_ahash_alignmask" interacting with "net/tcp: Introduce TCP_AO setsockopt()s" Signed-off-by: Stephen Rothwell --- net/ipv4/tcp_ao.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/net/ipv4/tcp_ao.c b/net/ipv4/tcp_ao.c index 6a845e906a1d85..ef5472ed615887 100644 --- a/net/ipv4/tcp_ao.c +++ b/net/ipv4/tcp_ao.c @@ -1533,10 +1533,6 @@ static struct tcp_ao_key *tcp_ao_key_alloc(struct sock *sk, goto err_free_pool; tfm = crypto_ahash_reqtfm(hp.req); - if (crypto_ahash_alignmask(tfm) > TCP_AO_KEY_ALIGN) { - err = -EOPNOTSUPP; - goto err_pool_end; - } digest_size = crypto_ahash_digestsize(tfm); tcp_sigpool_end(&hp); @@ -1551,8 +1547,6 @@ static struct tcp_ao_key *tcp_ao_key_alloc(struct sock *sk, key->digest_size = digest_size; return key; -err_pool_end: - tcp_sigpool_end(&hp); err_free_pool: tcp_sigpool_release(pool_id); return ERR_PTR(err); From c503e3eec382ac708ee7adf874add37b77c5d312 Mon Sep 17 00:00:00 2001 From: Stephen Rothwell Date: Mon, 30 Oct 2023 16:31:31 +1100 Subject: [PATCH 512/515] Add linux-next specific files for 20231030 Signed-off-by: Stephen Rothwell --- Next/SHA1s | 371 + Next/Trees | 373 + Next/merge.log | 17254 ++++++++++++++++++++++++++++++++++++++++++++ localversion-next | 1 + 4 files changed, 17999 insertions(+) create mode 100644 Next/SHA1s create mode 100644 Next/Trees create mode 100644 Next/merge.log create mode 100644 localversion-next diff --git a/Next/SHA1s b/Next/SHA1s new file mode 100644 index 00000000000000..7a25164bd10aa9 --- /dev/null +++ b/Next/SHA1s @@ -0,0 +1,371 @@ +Name SHA1 +---- ---- +origin 2af9b20dbb39f6ebf9b9b6c090271594627d818e +fixes 2dde18cd1d8fac735875f2e4987f11817cc0bc2c +mm-hotfixes db27869df6edc883ea6513b29834b8dad4ee84ae +kbuild-current 8a749fd1a8720d4619c91c8b6e7528c0a355c0aa +arc-current 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +arm-current 2dde18cd1d8fac735875f2e4987f11817cc0bc2c +arm64-fixes 4785aa8028536c2be656d22c74ec1995b97056f3 +arm-soc-fixes 736a4aad8a9fdcf577ffa33b33df240c67557af8 +davinci-current 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5 +drivers-memory-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +tee-fixes ceaa837f96adb69c0df0397937cd74991d5d821a +m68k-current eb1e6ccdcf785e633863c5c7cec32d6c1e7b09dd +powerpc-fixes 47b8def9358c5eb888e78b24b7e5b7f2e2e97b8e +s390-fixes c1ae1c59c8c6e0b66a718308c623e0cb394dab6b +sparc 2d2b17d08bfc3d98cf93622e8c6543eaaf02dabe +fscrypt-current 4bcf6f827a79c59806c695dc280e763c5b6a6813 +fsverity-current a075bacde257f755bea0e53400c9f1cdd1b8e8e6 +net c17cda15cc86e65e9725641daddcd7a63cc9ad01 +bpf c17cda15cc86e65e9725641daddcd7a63cc9ad01 +ipsec de5724ca38fd5e442bae9c1fab31942b6544012d +netfilter 53798666648af3aa0dd512c2380576627237a800 +ipvs a63b6622120cd03a304796dbccb80655b3a21798 +wireless 91535613b6090fc968c601d11d4e2f16b333713c +wpan 2d1c882d4434a27a026b98b602f232c7919849c5 +rdma-fixes 94f6f0550c625fab1f373bb86a6669b45e9748b3 +sound-current 99248c8902f505ec064cf2b0f74629016f2f4c82 +sound-asoc-fixes 805ce81826c896dd3c351a32814b28557f9edf54 +regmap-fixes 0ec7731655de196bc1e4af99e495b38778109d22 +regulator-fixes bc00d9f3813a40bc2d854ae0edab14c6b43a3219 +spi-fixes c3aa5cb264a38ae9bbcce32abca4c155af0456df +pci-current 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +driver-core.current 8a749fd1a8720d4619c91c8b6e7528c0a355c0aa +tty.current 58720809f52779dc0f08e53e54b014209d13eebb +usb.current 05d3ef8bba77c1b5f98d941d8b2d4aeab8118ef1 +usb-serial-fixes 52480e1f1a259c93d749ba3961af0bffedfe7a7a +phy 05d3ef8bba77c1b5f98d941d8b2d4aeab8118ef1 +staging.current 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +iio-fixes bce3ab29a6c0ce0071d06d99bd8dc943cd3d1e8e +counter-current 58720809f52779dc0f08e53e54b014209d13eebb +char-misc.current 2af9b20dbb39f6ebf9b9b6c090271594627d818e +soundwire-fixes 58720809f52779dc0f08e53e54b014209d13eebb +thunderbolt-fixes ec4405ed92036f5bb487b5c2f9a28f9e36a3e3d5 +input-current 5c15c60e7be615f05a45cd905093a54b11f461bc +crypto-current b11950356c4b416d2e87941f3aa7a8bf089db72b +vfio-fixes c777b11d34e0f47dbbc4b018ef65ad030f2b283a +kselftest-fixes cf5a103c98a6fb9ee3164334cb5502df6360749b +modules-fixes f412eef03938d3a40d4f6f5a79d0f98ed89b596d +dmaengine-fixes 58720809f52779dc0f08e53e54b014209d13eebb +backlight-fixes 88603b6dc419445847923fcb7fe5080067a30f98 +mtd-fixes f6ca3fb6978f94d95ee79f95085fc22e71ca17cc +mfd-fixes 88603b6dc419445847923fcb7fe5080067a30f98 +v4l-dvb-fixes c46f16f156ac58afcf4addc850bb5dfbca77b9fc +reset-fixes 3a2390c6777e3f6662980c6cfc25cafe9e4fef98 +mips-fixes 8a749fd1a8720d4619c91c8b6e7528c0a355c0aa +at91-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +omap-fixes 0b9a4a67c60d3e15b39a69d480a50ce7eeff9bc1 +kvm-fixes 2b3f2325e71f09098723727d665e2e8003d455dc +kvms390-fixes f87ef5723536a6545ed9c43e18b13a9faceb3c80 +hwmon-fixes 9da2901c47332b030ea4d2a2302bc7c0b83fc67c +nvdimm-fixes 33908660e814203e996f6e775d033c5c32fcf9a7 +cxl-fixes 8f61d48c83f6e3525a770e44692604595693f787 +btrfs-fixes 7a444b6e7de2da017268ef0ca8ed226583207d29 +vfs-fixes dc32464a5fe4946fe1a4d8f8e29961dc411933c5 +dma-mapping-fixes d5090484b021794271280ab64d20253883b7f6fd +drivers-x86-fixes 3bde7ec13c971445faade32172cb0b4370b841d9 +samsung-krzk-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +pinctrl-samsung-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +devicetree-fixes 19007c629c63c76ae0f8adee9dc076bda4788b46 +dt-krzk-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +scsi-fixes 097c06394c835be0cf21e23f9bd13ff771601b63 +drm-fixes 44117828ed5c129a8146585e81262c0025daa50f +drm-intel-fixes 4cbed7702eb775cca22fff6827a549092cb59f61 +mmc-fixes 57925e16c9f7d18012bcf45bfa658f92c087981a +rtc-fixes 08279468a294d8c996a657ecc9e51bd5c084c75d +gnss-fixes 58720809f52779dc0f08e53e54b014209d13eebb +hyperv-fixes 42999c90461293233de9bb6e6c7d8a2db7281c1e +soc-fsl-fixes 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5 +risc-v-fixes 3fec323339a4a9801a54e8b282eb571965b67b23 +riscv-dt-fixes cf98fe6b579e55aa71b6197e34c112b51f0c2a66 +riscv-soc-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +fpga-fixes 03d4bf9ff34abbb24f4fbc674f2dcd057ebff309 +spdx 8a749fd1a8720d4619c91c8b6e7528c0a355c0aa +gpio-brgl-fixes 05d3ef8bba77c1b5f98d941d8b2d4aeab8118ef1 +gpio-intel-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +pinctrl-intel-fixes 2d325e54d9e2e4ae247c9fd03f810208ce958c51 +erofs-fixes 3048102d9d68008e948decbd730f0748dd7bdc31 +kunit-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +ubifs-fixes 2241ab53cbb5cdb08a6b2d4688feb13971058f65 +memblock-fixes 55122e0130e51eb71f5ec62d10525db0468f28e8 +nfsd-fixes 0d32a6bbb8e7bf503855f2990f1ccce0922db87b +irqchip-fixes b673fe1a6229a49be5394f4e539055d9ce685615 +renesas-fixes 9eab43facdadb7d00456c2657001ae2e5353c814 +broadcom-fixes 9abf2313adc1ca1b6180c508c25f22f9395cc780 +perf-current 4fa008a2db484024a5cb52676a1b1534dc82330c +efi-fixes c03d21f05e76b25f907684bdf874308dcefab385 +zstd-fixes f064f4e5ecb151b3fce59762075658ac6f389532 +battery-fixes 8894b432548851f705f72ff135d3dcbd442a18d1 +uml-fixes 73a23d7710331a530e972903318528b75e5a5f58 +asahi-soc-fixes 568035b01cfb107af8d2e4bd2fb9aea22cf5b868 +iommufd-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +rust-fixes cfd96726e61136e68a168813cedc4084f626208b +v9fs-fixes 2dde18cd1d8fac735875f2e4987f11817cc0bc2c +w1-fixes 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +pmdomain-fixes b131329b9bfbd1b4c0c5e088cb0c6ec03a12930f +overlayfs-fixes beae836e9c61ee039e367a94b14f7fea08f0ad4c +drm-misc-fixes 101c9f637efa1655f55876644d4439e552267527 +mm-stable 88c91dc58582f1d0c6f5f501051b0262d06ec4ed +mm-nonmm-stable 5176140c5094b5bfd35e19a4f6ab8a10b65da380 +mm 44c9217272ef625871d399d6232a249f7c6e49cd +kbuild 7715d094a5c3c7b1faab280643d3ad42551c2d6a +clang-format 5d0c230f1de8c7515b6567d9afba1f196fb4e2f4 +perf c43c64f8a1c68da370bf8d458ba52e24183a5264 +compiler-attributes 5d0c230f1de8c7515b6567d9afba1f196fb4e2f4 +dma-mapping 36d91e851598a9ea523ad4681dd11fa661d59695 +asm-generic 550087a0ba91eb001c139f563a193b1e9ef5a8dd +arc 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +arm c7368ddba2ffcc5d200122c5bb122c3825ecb976 +arm64 14dcf78a6c042dd9421b11485b394c6273568bca +arm-perf b805cafc604bfdb671fae7347a57f51154afa735 +arm-soc 1b52f65d88adb1fac2193ed5d38b51ad13c7be76 +amlogic 996fc07dce7991dd12ac0b7c378ce65080036492 +asahi-soc eaf935fa48ec826f7c564c269a607cb4fba082b3 +aspeed 3be891e01a89c6b9267034b6ca2dd31420c0b610 +at91 3cec9514911c4400a4b4ab778b9e92b60a14c677 +broadcom 62a3c97f8167c88a5623d45c8984927c82c286be +davinci 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5 +drivers-memory 09de3691daab15ae125cbf32f9f72fc90eada49d +imx-mxs fa81543ef85463e53bd2e3193a182ec1ff800ee9 +mediatek 9802b60bd6d895a8be9c44cc5f74bb11131aa8bc +mvebu 93e6b023e552e7af30ba89439a1486160779010f +omap cb1114df7bb08a0be22ae1652b0c5ff9602ed391 +qcom 2b05c2dc230b58fa09358009e83eb5556ab72dc1 +renesas fb39831a07ec1fd914da56caede80e2997f1dbc5 +reset 417a3a5ae44a14b4eeb3df514b2c006b19771f82 +rockchip fd1299bf9ce8adf619c8c42202b941e88e76fa14 +samsung-krzk b7df1b3a7a1b3061da0c982a42b4dc5182c41f0a +scmi 269024fecd164f1c4c903ce4be8f8b53a4f7ec73 +stm32 1aeb02d3f2c5a7a9f132ea748877012a48036d90 +sunxi c3f7c14856ebbeb8e9e19439b9f5ec66f88744b9 +tee 6a8b7e80105416cc7324fda295608ea2d3f98862 +tegra 650220c2b474332f78dbb20651f0e98d77af6fde +ti 2234981539e7b12fe56e0224460eb45111df0b55 +xilinx 7d2da28125ce2431451c50aab8f7c60ab01e12f1 +clk 355359eb0902fccbe6f495e66b3b265754117bcd +clk-imx 2838820800dcaa60f32bef715c7e2e87e049aebc +clk-renesas 4bce4bedbe6daa54cf701184601f913a0c00bb1c +csky 5195c35ac4f09bc45bde23b98d74c4f5d62bea65 +loongarch 2c10cda4b777be4be9d9e69e4f70c818dbb15e21 +m68k 03191fb3db3d2585725bcffe0356d12fcfd27c4c +m68knommu 2508b608f4028c6fe0d63698f64a9bfc3eb6b780 +microblaze 65d6e954e37872fd9afb5ef3fc0481bb3c2f20f4 +mips 4b7d3ab445653336db9854eedad812607760c015 +openrisc c289330331eb93bc6a3c68b9119ccd7d4285a4a2 +parisc-hd 07fa32fcbd91adc7c56511ec779eff2514305caf +powerpc 36e826b568e412f61d68fedc02a67b4d8b7583cc +soc-fsl fb9c384625dd604e8a5be1f42b35e83104b90670 +risc-v ec8c6c732e46416e905f5f4a7a46cd648ea20b24 +riscv-dt b99df62818919b84e970eea5aec60b0dbc57da18 +riscv-soc 22dedf8f4570897f15e156ac5547cef93e802182 +s390 8445432611b484d16c23162237215ac088c879c8 +sh 78a96c86a0ff2be546f2ecca210fde5dca30fb59 +uml 974b808d85abbc03c3914af63d60d5816aabf2ca +xtensa a83a72730c330a57c1a07cd98603140f5fbe0bf9 +bcachefs b827ac419721a106ae2fccaa40576b0594edad92 +pidfd a901a3568fd26ca9c4a82d8bc5ed5b3ed844d451 +fscrypt 15baf55481de700f8c4494cddb80ec4f4575548b +afs 0a278bc196e784b4849c1581266421adbca1989f +btrfs c6e8f898f56fae2cb5bc4396bec480f23cd8b066 +ceph 07bb00ef00ace88dd6f695fadbba76565756e55c +cifs f0fea94ed6c7717b3f3d6a69f7fddedc0a02ae68 +configfs 4425c1d9b44ded655d2668e1ce95a62bccf7b21b +ecryptfs a3d78fe3e1ae8c6a1901635c54a1a799656f72c8 +erofs 3120ee29695aece9fd3ff01747405f273604d96f +exfat b3a62a9886007ce5e2b69e2b14fe41c50c6843d6 +ext3 7f680e5f256f346a5d3cd83a17c84bb6bc950008 +ext4 c388da1dad59dc24801b61bc63539cab6cd83e23 +f2fs 1e7bef5f90ed69d903768d78369f251b77e5d2f5 +fsverity 919dc320956ea353a7fb2d84265195ad5ef525ac +fuse ae3024a4c4995ff6927882e800f9f447109e62ae +gfs2 26ad55ecccd5bc18e421b83bbceff225d3605871 +jfs a779ed754e52d582b8c0e17959df063108bd0656 +ksmbd 0c180317c654a494fe429adbf7bc9b0793caf9e2 +nfs 05d3ef8bba77c1b5f98d941d8b2d4aeab8118ef1 +nfs-anna 379e4adfddd6a2f95a4f2029b8ddcbacf92b21f9 +nfsd 3fd2ca5be07f6a43211591a45b43df9e7b6eba00 +ntfs3 e4494770a5cad3c9d1d2a65ed15d07656c0d9b82 +orangefs 31720a2b109b3080eb77e97b8f6f50a27b4ae599 +overlayfs 0b41c33dd34b61d6318d553ed15004efa05e5f09 +ubifs 75690493591fe283e4c92a3ba7c4420e9858abdb +v9fs ce07087964208eee2ca2f9ee4a98f8b5d9027fe6 +v9fs-ericvh 2dde18cd1d8fac735875f2e4987f11817cc0bc2c +xfs cbc06310c36f73a5f3b0c6f0d974d60cf66d816b +zonefs 8812387d056957355ef1d026cd38bed3830649db +iomap 3ac974796e5d94509b85a403449132ea660127c2 +djw-vfs ce85a1e04645b1ed386b074297df27ab5b8801c0 +file-locks e0152e7481c6c63764d6ea8ee41af5cf9dfac5e9 +iversion e0152e7481c6c63764d6ea8ee41af5cf9dfac5e9 +vfs-brauner 46af9de45cb5b037fe17e4169b48ce920c020315 +vfs 1aee9158bc978f91701c5992e395efbc6da2de3c +printk fbddff2e98cfd3c7b0ef5d013b29fef782ec4534 +pci 50b3ef14c26b20476e67af582e788b17512023cf +pstore a19d48f7c5d57c0f0405a7d4334d1d38fe9d3c1c +hid 55ec92989f9be9ee773d88fe3a81c185934e10d3 +i2c b871ee43a7335d3ab18a6c8dda325d62728c5915 +i3c 57ec42b9a1b7e4db4a1c2aa4fcc4eefe6d31bcb8 +dmi 13a0ac816d22aa47d6c393f14a99f39e49b960df +hwmon-staging 8293a6bcf50e6f64414b2bdc01a3edf525d78ca0 +jc_docs e7abea958b7f0d65baafb20af60bdf2073fb2b28 +v4l-dvb 48016737a9af47328dd321df4dd3479ed5e2041d +v4l-dvb-next 48016737a9af47328dd321df4dd3479ed5e2041d +pm 3335ef03ad81e7ec516494af41ee417b630dd843 +cpufreq-arm 6aa2f7738c6d35474f588b3c8951129b1788663a +cpupower 6feb1a9641197ee630bf43b5c34ea1d9f8b4a0aa +devfreq 8f0cd531ee18c70f4655112c49f3c3e329636e7f +pmdomain 9e0cceadb7a5099c637e787191a9adbf9ec424cd +opp 35e0964e4876c4d77ed0d6d49678f7f6270f32e2 +thermal 9618efe343ead954ca5c23856ae23d0a29e7d4b9 +dlm eb53c01873cab75d0bf42e6d685dc5ef3b68d884 +rdma 7a1c2abf9a2be7d969b25e8d65567933335ca88e +net-next 55c900477f5b3897d9038446f72a281cae0efd86 +bpf-next f1c73396133cb3d913e2075298005644ee8dfade +ipsec-next eefed7662ff223f70ba8b1af07f1a096a5ece588 +mlx5-next 82f9378c443c206d3f9e45844306e5270e7e4109 +netfilter-next ef113733c288eccadc105579b8e8c1bfdcc09ad1 +ipvs-next 9cdee063476988102bbc5e0e9551e10c5ed00d3e +bluetooth 0783375f2c56ca17719d5ec670e498dc661ea5c3 +wireless-next cc54d2e2c58a40a82dfd39afa95d3d27f3d6509d +wpan-next 18b849f12dcc34ec4cb9c8fadeb503b069499ba4 +wpan-staging 18b849f12dcc34ec4cb9c8fadeb503b069499ba4 +mtd ff6abbe856342d4a7d5c28a0f7e33838f9f0a873 +nand 5a985960a4dd041c21dbe9956958c1633d2da706 +spi-nor 6823a8383420263bc061865027836755615a275f +crypto f2b88bab69c86d4dab2bfd25a0e741d7df411f7a +drm 5258dfd4a6adb5f45f046b0dd2e73c680f880d9d +drm-ci ad6bfe1b66a5c146ec236847eca7af4c8806d666 +drm-misc 3db2420422a5912d97966e0176050bb0fc9aa63e +amdgpu dd3dd9829bf9a4ecd55482050745efdd9f7f97fc +drm-intel 8d68a0ac9f3f308967bbdf3af37de818a6ed321d +drm-tegra 2429b3c529da29d4277d519bd66d034842dcd70c +drm-msm b08d26dac1a1075c874f40ee02ec8ddc39e20146 +drm-msm-lumag d3b4075b173f033387b614297bb4d998cf22c8bd +etnaviv 925b10728f20c24516031060f3d01e4410c4a52a +fbdev 147de49d6ead27fb3d6ac80857b1baffb897cca5 +regmap 798ee4f7ce564af0aa10a0a0a632d84a7e141fed +sound f71e0be5d297b25453fdf4c1757b3e83e94b5f98 +ieee1394 a464d2f75fa16689b2d0307248740d83828d9b0c +sound-asoc bdb7e1922052b1e7fcce63e2cfa195958ff97e05 +modules 3111add7f414fddb587cf8e419df2d73500cb4e6 +input 28d3fe32354701decc3e76d89712569c269b5e4f +block 8aa6053114f3dedcf1acd34f4cbad7066d924258 +device-mapper c85b4fb8b8edbd915283f6ab3537f2c3b95e7c85 +libata 0e533cba38011457b51f13b3b5afd33c693bfcca +pcmcia 4f733de8b78a209501041a4b0a44c83ece0e8933 +mmc 5428a40a308f220dbbffda66cb01b212f88e9a06 +mfd e9aec86e211ee493081e8934b8c821d660b417ee +backlight d5272d39995f4150062a67e6f2cef556edece740 +battery 469d31745b9fb3a87424b311abb7cb530611404f +regulator 8af4b4efdac959c02e2a82b4e2fbb8f2c0b57c1e +security 82ed980d6f5dd7eca0b90c6a7aeedeebde095e45 +apparmor 6cede10161be00d129a24e8b84c2674785a32cf8 +integrity bc4532e9cd3b060878eccabd836e8128a7793e38 +safesetid 64b634830c919979de4b18163e15d30df66e64a8 +selinux f5bbdeda34c635ca8e893b481dc7865f378ea3f7 +smack 3ad49d37cf5759c3b8b68d02e3563f633d9c1aee +tomoyo 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +tpmdd 03acb9ccec3f8cbcc0ed93c188b7a119ef30ef64 +watchdog 9d08e5909c81188eb1df26ef9d1c8df58ea5a44d +iommu e8cca466a84a75f8ff2a7a31173c99ee6d1c59d2 +audit 47846d51348dd62e5231a83be040981b17c955fa +devicetree a31226cdc877133081b131c2e7c79fc94890b1c7 +dt-krzk d896029c9726830232899944d1927847cfc6a2d1 +mailbox a493208079e299aefdc15169dc80e3da3ebb718a +spi f6218c7e590f9f74fa952c518cffb83be8b12a65 +tip 1187c0b3a6c2ecb3b36c0f236b1206e10033eea6 +clockevents 0a8b07c77ea09602a152d3604e599f95726306d0 +edac 6f15b178cd6315c997981f76c6ebed7ad39144c5 +irqchip 19b5a44bee16518104e8a159ab9a60788292fbd4 +ftrace c7cda5f2ae078817bc09fc2f400524a0a483de18 +rcu 5df10099418f139bbf2f4e0d7b9a8727e76274ec +kvm 2b3f2325e71f09098723727d665e2e8003d455dc +kvm-arm 054484138f49cbdb9537fc19bfb1aed5c50d31d1 +kvms390 70fea30195168fd84e7076720c984f0ac1af5b09 +kvm-ppc b7bce570430e42229fb63f775fcbb10f38b83c71 +kvm-riscv d9c00f44e5de542340cce1d09e2c990e16c0ed3a +kvm-x86 8b6a9d2f7c4374d5f73b9b16a391673d219ab4e7 +xen-tip 2c269f42d0f382743ab230308b836ffe5ae9b2ae +percpu 3fcf62f24c80e2472f472778f317e062841c2d37 +workqueues d5ce8f4ed90bf34b9b2c5459665cee6ee79fe101 +drivers-x86 ac9bc85c49ffcfca8c1b117e1a9e94dd32680c68 +chrome-platform 47ea0ddb1f5604ba3496baa19110aec6a3151f2e +chrome-platform-firmware 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +hsi 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +leds 1b929c02afd37871d5afb9d498426f83432e71c2 +leds-lj 13f0ccb77e98cc82c04db2c5fab984865666285e +ipmi b00839ca4cca8aa9641c121c848a553d6220ce70 +driver-core effd7c70eaa0440688b60b9d419243695ede3c45 +usb c70793fb7632a153862ee9060e6d48131469a29c +thunderbolt a558892b3456d44f2a89d238f5d650f0574fa3b2 +usb-serial 8a749fd1a8720d4619c91c8b6e7528c0a355c0aa +tty 64ebf8797249e792af2143eb9e4bd404d10a022e +char-misc fa10f413091a43f801f82b3cf484f15d6fc9266f +accel 08057253366d916a73e62bafb913d9b659228cc1 +coresight fa55e63584f2c3c84e0c3acdace42544e1832cc2 +fastrpc 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +fpga d79eed22ba97c3031b2ef86f8b7ed0be2da5667d +icc d4c720a19e9ac3a907a8bf9a11c5a3a4e3e50a34 +iio 89e2233386a5670d15908628b63e611cb03b0d03 +phy-next d688c8264b8ed25edbdafac46ea2b41b2e77416a +soundwire 4ea2b6d3128ea4d502c4015df0dc16b7d1070954 +extcon b3edc3463d64bc469162138a6bec6913fbeef931 +gnss 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +vfio 2b88119e35b00d8cb418d86abbace3b90a993bd7 +w1 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +staging 41196b0bbe8a1ce663b85aca2141800214c186f1 +counter-next 7904cdf1397c9391178ce53a7ebfa099c6bc4a59 +mux 44c026a73be8038f03dbdeef028b642880cf1511 +dmaengine 03f25d53b145bc2f7ccc82fc04e4482ed734f524 +cgroup b9a477034b11be3aedf402de9c7668ac9048d277 +scsi e76fe87efdfbe43ba547dc18111cd2b93c99c669 +scsi-mkp a75a16c62a2540f11eeae4f2b50e95deefb652ea +vhost 276d5784878e21f0165974c58e47765ba211163c +rpmsg 6dc66a3096730db94a89b098da66887a390cc6af +gpio 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +gpio-brgl 9bc633117d6a8411c6912cb0194b3e0f83ef9d56 +gpio-intel 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +pinctrl e2b0bac1aae44d603817b55d62553f3d3557d5a7 +pinctrl-intel 8d751da9f1d790f1d5e4b109eb0ad4a366d5efc8 +pinctrl-renesas 583d8073205566468abf3a34000fccdd1d19c9cc +pinctrl-samsung 8aec97decfd0f444a69a765b2f00d64b42752824 +pwm 4bb36d126cb3147d6bbfd00242a5b846dacad595 +userns 05bd6e0242b4c059ec6797e3d721ecca6d15ff8d +ktest 7dc8e24f0e09834341f84d37433840b353d64bc8 +kselftest 5247e6dbed0041147a83137f89cd45043301de5c +kunit 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +kunit-next 8040345fdae4cb256c5d981f91ae0f22bea8adcc +livepatching 602bf18307981f3bfd9ebf19921791a4256d3fd1 +rtc cfb67623ce281e045ec11e3eddb1b68b879b53a1 +nvdimm 9ea459e477dc09370cdd8ee13b61aefe8cd1f20a +at24 3774740fb22162d2c50e79629c4b3e11022ed7d9 +ntb 9341b37ec17a8793e8439e9b18354ba69556b786 +seccomp 31c65705a8cfa5f80d3824c686ab74b0409ee76d +fsi f04d61a379d65794d5d85168b84dcdf01d426f7c +slimbus 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5 +nvmem ca7384334d9bf741e2768d60887924671c4d9a7f +xarray 2a15de80dd0f7e04a823291aa9eb49c5294f56af +hyperv ce9ecca0238b140b88f43859b211c9fdfd8e5b70 +auxdisplay 35b464e32c8bccef435e415db955787ead4ab44c +kgdb dd712d3d45807db9fcae28a522deee85c1f2fde6 +hmm 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +cfi 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5 +mhi 12606ba1d46b34a241eb3d0956727e5379f0f626 +memblock 0f5e4adb608c79bedd8ced30f9ffdcfa01c37459 +cxl 2630b3957abe46d7bc4ae0e26275030d76cefb94 +zstd 2aa14b1ab2c41a4fe41efae80d58bb77da91f19f +efi 5329aa5101f73c451bcd48deaf3f296685849d9c +unicode b500d6d7243d2e0807a39a09c52fbe668b59b2c1 +slab 90f055df112162fd9e093c16be1c21f38c35b907 +random 512dee0c00ad9e9c7ae9f11fc6743702ea40caff +landlock f12f8f84509a084399444c4422661345a15cc713 +rust 3857af38e57a80b15b994e19d1f4301cac796481 +sysctl ccee9a2a8c002516d4252952df836abeaddfa39c +execve 21ca59b365c091d583f36ac753eaa8baf947be6f +bitmap bdcb37a5d8de3253da48b120e3f10863696fb654 +hte fc62d5e214df2dd64f5d675f01b609d86a422a2b +kspp 9cca73d7b4bfec75b2fcef751015f31691afa792 +kspp-gustavo 4d8cbf6dbcdaebe949461b0a933ae4c71cb53edc +nolibc 0bb80ecc33a8fb5a682236443c1e740d5c917d1d +tsm f4738f56d1dc62aaba69b33702a5ab098f1b8c63 +iommufd 03476e687eb07b94f7cdb07cd3c7c4304b6c58b3 diff --git a/Next/Trees b/Next/Trees new file mode 100644 index 00000000000000..0b2c7265701c0f --- /dev/null +++ b/Next/Trees @@ -0,0 +1,373 @@ +Trees included into this release: + +Name Type Url +---- ---- --- +origin git git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git#master +fixes git git://git.kernel.org/pub/scm/linux/kernel/git/sfr/next-fixes.git#fixes +mm-hotfixes git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm#mm-hotfixes-unstable +kbuild-current git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git#fixes +arc-current git git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git#for-curr +arm-current git git://git.armlinux.org.uk/~rmk/linux-arm.git#fixes +arm64-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux#for-next/fixes +arm-soc-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git#arm/fixes +davinci-current git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git#davinci/for-current +drivers-memory-fixes git https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl.git#fixes +tee-fixes git https://git.linaro.org/people/jens.wiklander/linux-tee.git#fixes +m68k-current git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git#for-linus +powerpc-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git#fixes +s390-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git#fixes +sparc git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc.git#master +fscrypt-current git git://git.kernel.org/pub/scm/fs/fscrypt/linux.git#for-current +fsverity-current git git://git.kernel.org/pub/scm/fs/fsverity/linux.git#for-current +net git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git#main +bpf git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git#master +ipsec git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git#master +netfilter git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git#main +ipvs git git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs.git#main +wireless git git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless.git#for-next +wpan git git://git.kernel.org/pub/scm/linux/kernel/git/wpan/wpan.git#master +rdma-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git#for-rc +sound-current git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git#for-linus +sound-asoc-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git#for-linus +regmap-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git#for-linus +regulator-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git#for-linus +spi-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git#for-linus +pci-current git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git#for-linus +driver-core.current git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git#driver-core-linus +tty.current git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git#tty-linus +usb.current git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git#usb-linus +usb-serial-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial.git#usb-linus +phy git git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy.git#fixes +staging.current git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git#staging-linus +iio-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git#fixes-togreg +counter-current git git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter.git#counter-current +char-misc.current git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git#char-misc-linus +soundwire-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire.git#fixes +thunderbolt-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git#fixes +input-current git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git#for-linus +crypto-current git git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6.git#master +vfio-fixes git git://github.com/awilliam/linux-vfio.git#for-linus +kselftest-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git#fixes +modules-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git#modules-linus +dmaengine-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine.git#fixes +backlight-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight.git#for-backlight-fixes +mtd-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git#mtd/fixes +mfd-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git#for-mfd-fixes +v4l-dvb-fixes git https://git.linuxtv.org/media_stage.git#fixes +reset-fixes git https://git.pengutronix.de/git/pza/linux#reset/fixes +mips-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git#mips-fixes +at91-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git#at91-fixes +omap-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git#fixes +kvm-fixes git git://git.kernel.org/pub/scm/virt/kvm/kvm.git#master +kvms390-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git#master +hwmon-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git#hwmon +nvdimm-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm.git#libnvdimm-fixes +cxl-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git#fixes +btrfs-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git#next-fixes +vfs-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git#fixes +dma-mapping-fixes git git://git.infradead.org/users/hch/dma-mapping.git#for-linus +drivers-x86-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git#fixes +samsung-krzk-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git#fixes +pinctrl-samsung-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung.git#fixes +devicetree-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git#dt/linus +dt-krzk-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt.git#fixes +scsi-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git#fixes +drm-fixes git git://git.freedesktop.org/git/drm/drm.git#drm-fixes +drm-intel-fixes git git://anongit.freedesktop.org/drm-intel#for-linux-next-fixes +mmc-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git#fixes +rtc-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git#rtc-fixes +gnss-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/johan/gnss.git#gnss-linus +hyperv-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git#hyperv-fixes +soc-fsl-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux.git#fix +risc-v-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git#fixes +riscv-dt-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git#riscv-dt-fixes +riscv-soc-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git#riscv-soc-fixes +fpga-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/fpga/linux-fpga.git#fixes +spdx git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/spdx.git#spdx-linus +gpio-brgl-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git#gpio/for-current +gpio-intel-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git#fixes +pinctrl-intel-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/intel.git#fixes +erofs-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git#fixes +kunit-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git#kunit-fixes +ubifs-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs.git#fixes +memblock-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock.git#fixes +nfsd-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux#nfsd-fixes +irqchip-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git#irq/irqchip-fixes +renesas-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git#fixes +broadcom-fixes git https://github.com/Broadcom/stblinux.git#fixes +perf-current git git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools#perf-tools +efi-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git#urgent +zstd-fixes git https://github.com/terrelln/linux.git#zstd-linus +battery-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git#fixes +uml-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git#fixes +asahi-soc-fixes git https://github.com/AsahiLinux/linux.git#asahi-soc/fixes +iommufd-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git#for-rc +rust-fixes git https://github.com/Rust-for-Linux/linux.git#rust-fixes +v9fs-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git#fixes/next +w1-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-w1.git#fixes +pmdomain-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git#fixes +overlayfs-fixes git git://git.kernel.org/pub/scm/linux/kernel/git/overlayfs/vfs.git#ovl-fixes +drm-misc-fixes git git://anongit.freedesktop.org/drm/drm-misc#for-linux-next-fixes +mm-stable git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm#mm-stable +mm-nonmm-stable git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm#mm-nonmm-stable +mm git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm#mm-everything +kbuild git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git#for-next +clang-format git https://github.com/ojeda/linux.git#clang-format +perf git git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git#perf-tools-next +compiler-attributes git https://github.com/ojeda/linux.git#compiler-attributes +dma-mapping git git://git.infradead.org/users/hch/dma-mapping.git#for-next +asm-generic git git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git#master +arc git git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git#for-next +arm git git://git.armlinux.org.uk/~rmk/linux-arm.git#for-next +arm64 git git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux#for-next/core +arm-perf git git://git.kernel.org/pub/scm/linux/kernel/git/will/linux.git#for-next/perf +arm-soc git git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git#for-next +amlogic git git://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux.git#for-next +asahi-soc git https://github.com/AsahiLinux/linux.git#asahi-soc/for-next +aspeed git git://git.kernel.org/pub/scm/linux/kernel/git/joel/bmc.git#for-next +at91 git git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git#at91-next +broadcom git https://github.com/Broadcom/stblinux.git#next +davinci git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git#davinci/for-next +drivers-memory git https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl.git#for-next +imx-mxs git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git#for-next +mediatek git git://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux.git#for-next +mvebu git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git#for-next +omap git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git#for-next +qcom git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git#for-next +renesas git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git#next +reset git https://git.pengutronix.de/git/pza/linux#reset/next +rockchip git git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git#for-next +samsung-krzk git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git#for-next +scmi git git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux.git#for-linux-next +stm32 git git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32.git#stm32-next +sunxi git git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git#sunxi/for-next +tee git https://git.linaro.org/people/jens.wiklander/linux-tee.git#next +tegra git git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux.git#for-next +ti git git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git#ti-next +xilinx git git://github.com/Xilinx/linux-xlnx.git#for-next +clk git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git#clk-next +clk-imx git git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux.git#for-next +clk-renesas git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git#renesas-clk +csky git git://github.com/c-sky/csky-linux.git#linux-next +loongarch git git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git#loongarch-next +m68k git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git#for-next +m68knommu git git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu.git#for-next +microblaze git git://git.monstr.eu/linux-2.6-microblaze.git#next +mips git git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git#mips-next +openrisc git git://github.com/openrisc/linux.git#for-next +parisc-hd git git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git#for-next +powerpc git git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git#next +soc-fsl git git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux.git#next +risc-v git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git#for-next +riscv-dt git git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git#riscv-dt-for-next +riscv-soc git git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git#riscv-soc-for-next +s390 git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git#for-next +sh git git:git.kernel.org/pub/scm/linux/kernel/git/glaubitz/sh-linux.git#for-next +uml git git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git#next +xtensa git git://github.com/jcmvbkbc/linux-xtensa.git#xtensa-for-next +bcachefs git https://evilpiepirate.org/git/bcachefs.git#for-next +pidfd git git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux.git#for-next +fscrypt git git://git.kernel.org/pub/scm/fs/fscrypt/linux.git#for-next +afs git git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git#afs-next +btrfs git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git#for-next +ceph git git://github.com/ceph/ceph-client.git#master +cifs git git://git.samba.org/sfrench/cifs-2.6.git#for-next +configfs git git://git.infradead.org/users/hch/configfs.git#for-next +ecryptfs git git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs.git#next +erofs git git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git#dev +exfat git git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat.git#dev +ext3 git git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git#for_next +ext4 git git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git#dev +f2fs git git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git#dev +fsverity git git://git.kernel.org/pub/scm/fs/fsverity/linux.git#for-next +fuse git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git#for-next +gfs2 git git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git#for-next +jfs git git://github.com/kleikamp/linux-shaggy.git#jfs-next +ksmbd git https://github.com/smfrench/smb3-kernel.git#ksmbd-for-next +nfs git git://git.linux-nfs.org/projects/trondmy/nfs-2.6.git#linux-next +nfs-anna git git://git.linux-nfs.org/projects/anna/linux-nfs.git#linux-next +nfsd git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux#nfsd-next +ntfs3 git https://github.com/Paragon-Software-Group/linux-ntfs3.git#master +orangefs git git://git.kernel.org/pub/scm/linux/kernel/git/hubcap/linux#for-next +overlayfs git git://git.kernel.org/pub/scm/linux/kernel/git/overlayfs/vfs.git#overlayfs-next +ubifs git git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs.git#next +v9fs git git://github.com/martinetd/linux#9p-next +v9fs-ericvh git git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git#ericvh/for-next +xfs git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git#for-next +zonefs git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs.git#for-next +iomap git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git#iomap-for-next +djw-vfs git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git#vfs-for-next +file-locks git git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git#locks-next +iversion git git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git#iversion-next +vfs-brauner git git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git#vfs.all +vfs git git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git#for-next +printk git git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux.git#for-next +pci git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git#next +pstore git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git#for-next/pstore +hid git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git#for-next +i2c git git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git#i2c/for-next +i3c git git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux.git#i3c/next +dmi git git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging.git#dmi-for-next +hwmon-staging git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git#hwmon-next +jc_docs git git://git.lwn.net/linux.git#docs-next +v4l-dvb git git://linuxtv.org/media_tree.git#master +v4l-dvb-next git git://linuxtv.org/mchehab/media-next.git#master +pm git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git#linux-next +cpufreq-arm git git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm.git#cpufreq/arm/linux-next +cpupower git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux.git#cpupower +devfreq git git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git#devfreq-next +pmdomain git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git#next +opp git git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm.git#opp/linux-next +thermal git git://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git#thermal/linux-next +dlm git git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm.git#next +rdma git git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git#for-next +net-next git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git#main +bpf-next git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git#for-next +ipsec-next git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next.git#master +mlx5-next git git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux.git#mlx5-next +netfilter-next git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next.git#main +ipvs-next git git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs-next.git#main +bluetooth git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git#master +wireless-next git git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git#for-next +wpan-next git git://git.kernel.org/pub/scm/linux/kernel/git/wpan/wpan-next.git#master +wpan-staging git git://git.kernel.org/pub/scm/linux/kernel/git/wpan/wpan-next.git#staging +mtd git git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git#mtd/next +nand git git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git#nand/next +spi-nor git git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git#spi-nor/next +crypto git git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git#master +drm git git://git.freedesktop.org/git/drm/drm.git#drm-next +drm-ci git git://git.freedesktop.org/git/drm/drm.git#topic/drm-ci +drm-misc git git://anongit.freedesktop.org/drm/drm-misc#for-linux-next +amdgpu git https://gitlab.freedesktop.org/agd5f/linux#drm-next +drm-intel git git://anongit.freedesktop.org/drm-intel#for-linux-next +drm-tegra git https://gitlab.freedesktop.org/drm/tegra.git#for-next +drm-msm git https://gitlab.freedesktop.org/drm/msm.git#msm-next +drm-msm-lumag git https://gitlab.freedesktop.org/lumag/msm.git#msm-next-lumag +etnaviv git https://git.pengutronix.de/git/lst/linux#etnaviv/next +fbdev git git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev.git#for-next +regmap git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git#for-next +sound git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git#for-next +ieee1394 git https://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git#for-next +sound-asoc git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git#for-next +modules git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git#modules-next +input git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git#next +block git git://git.kernel.dk/linux-block.git#for-next +device-mapper git git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git#for-next +libata git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git#for-next +pcmcia git git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux.git#pcmcia-next +mmc git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git#next +mfd git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git#for-mfd-next +backlight git git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight.git#for-backlight-next +battery git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git#for-next +regulator git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git#for-next +security git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git#next +apparmor git git://git.kernel.org/pub/scm/linux/kernel/git/jj/linux-apparmor#apparmor-next +integrity git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity#next-integrity +safesetid git https://github.com/micah-morton/linux.git#safesetid-next +selinux git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux.git#next +smack git git://github.com/cschaufler/smack-next#next +tomoyo git https://scm.osdn.net/gitroot/tomoyo/tomoyo-test1.git#master +tpmdd git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git#next +watchdog git git://www.linux-watchdog.org/linux-watchdog-next.git#master +iommu git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git#next +audit git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit.git#next +devicetree git git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git#for-next +dt-krzk git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt.git#for-next +mailbox git git://git.linaro.org/landing-teams/working/fujitsu/integration.git#mailbox-for-next +spi git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git#for-next +tip git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git#master +clockevents git git://git.linaro.org/people/daniel.lezcano/linux.git#timers/drivers/next +edac git git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git#edac-for-next +irqchip git git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git#irq/irqchip-next +ftrace git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git#for-next +rcu git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git#rcu/next +kvm git git://git.kernel.org/pub/scm/virt/kvm/kvm.git#next +kvm-arm git git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git#next +kvms390 git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git#next +kvm-ppc git git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git#topic/ppc-kvm +kvm-riscv git https://github.com/kvm-riscv/linux.git#riscv_kvm_next +kvm-x86 git https://github.com/kvm-x86/linux.git#next +xen-tip git git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip.git#linux-next +percpu git git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu.git#for-next +workqueues git git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git#for-next +drivers-x86 git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git#for-next +chrome-platform git git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git#for-next +chrome-platform-firmware git git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git#for-firmware-next +hsi git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi.git#for-next +leds git git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds.git#for-next +leds-lj git git://git.kernel.org/pub/scm/linux/kernel/git/lee/leds.git#for-leds-next +ipmi git git://github.com/cminyard/linux-ipmi.git#for-next +driver-core git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git#driver-core-next +usb git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git#usb-next +thunderbolt git git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git#next +usb-serial git git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial.git#usb-next +tty git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git#tty-next +char-misc git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git#char-misc-next +accel git git://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux.git#habanalabs-next +coresight git git://git.kernel.org/pub/scm/linux/kernel/git/coresight/linux.git#next +fastrpc git git://git.kernel.org/pub/scm/linux/kernel/git/srini/fastrpc.git#for-next +fpga git git://git.kernel.org/pub/scm/linux/kernel/git/fpga/linux-fpga.git#for-next +icc git git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc.git#icc-next +iio git git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git#togreg +phy-next git git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy.git#next +soundwire git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire.git#next +extcon git git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon.git#extcon-next +gnss git git://git.kernel.org/pub/scm/linux/kernel/git/johan/gnss.git#gnss-next +vfio git git://github.com/awilliam/linux-vfio.git#next +w1 git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-w1.git#for-next +staging git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git#staging-next +counter-next git git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter.git#counter-next +mux git https://gitlab.com/peda-linux/mux.git#for-next +dmaengine git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine.git#next +cgroup git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git#for-next +scsi git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git#for-next +scsi-mkp git git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git#for-next +vhost git git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git#linux-next +rpmsg git git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux.git#for-next +gpio git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git#for-next +gpio-brgl git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git#gpio/for-next +gpio-intel git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git#for-next +pinctrl git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git#for-next +pinctrl-intel git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/intel.git#for-next +pinctrl-renesas git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git#renesas-pinctrl +pinctrl-samsung git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung.git#for-next +pwm git git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm.git#for-next +userns git git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace.git#for-next +ktest git git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest.git#for-next +kselftest git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git#next +kunit git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git#test +kunit-next git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git#kunit +livepatching git git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching#for-next +rtc git git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git#rtc-next +nvdimm git git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm.git#libnvdimm-for-next +at24 git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git#at24/for-next +ntb git https://github.com/jonmason/ntb.git#ntb-next +seccomp git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git#for-next/seccomp +fsi git git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi.git#next +slimbus git git://git.kernel.org/pub/scm/linux/kernel/git/srini/slimbus.git#for-next +nvmem git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git#for-next +xarray git git://git.infradead.org/users/willy/xarray.git#main +hyperv git git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git#hyperv-next +auxdisplay git https://github.com/ojeda/linux.git#auxdisplay +kgdb git git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux.git#kgdb/for-next +hmm git git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git#hmm +cfi git git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git#cfi/next +mhi git git://git.kernel.org/pub/scm/linux/kernel/git/mani/mhi.git#mhi-next +memblock git git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock.git#for-next +cxl git git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git#next +zstd git https://github.com/terrelln/linux.git#zstd-next +efi git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git#next +unicode git git://git.kernel.org/pub/scm/linux/kernel/git/krisman/unicode.git#for-next +slab git git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab.git#slab/for-next +random git git://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git#master +landlock git git://git.kernel.org/pub/scm/linux/kernel/git/mic/linux.git#next +rust git https://github.com/Rust-for-Linux/linux.git#rust-next +sysctl git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git#sysctl-next +execve git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git#for-next/execve +bitmap git https://github.com/norov/linux.git#bitmap-for-next +hte git git://git.kernel.org/pub/scm/linux/kernel/git/pateldipen1984/linux.git#for-next +kspp git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git#for-next/kspp +kspp-gustavo git git://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git#for-next/kspp +nolibc git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git#nolibc +tsm git git://git.kernel.org/pub/scm/linux/kernel/git/djbw/linux#tsm-next +iommufd git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git#for-next diff --git a/Next/merge.log b/Next/merge.log new file mode 100644 index 00000000000000..1a3cd63d14594a --- /dev/null +++ b/Next/merge.log @@ -0,0 +1,17254 @@ +$ date -R +Mon, 30 Oct 2023 08:17:49 +1100 +$ git checkout master +Already on 'master' +$ git reset --hard stable +Updating files: 49% (5929/11920) Updating files: 50% (5960/11920) Updating files: 51% (6080/11920) Updating files: 52% (6199/11920) Updating files: 53% (6318/11920) Updating files: 54% (6437/11920) Updating files: 55% (6556/11920) Updating files: 56% (6676/11920) Updating files: 57% (6795/11920) Updating files: 58% (6914/11920) Updating files: 59% (7033/11920) Updating files: 60% (7152/11920) Updating files: 61% (7272/11920) Updating files: 62% (7391/11920) Updating files: 63% (7510/11920) Updating files: 64% (7629/11920) Updating files: 65% (7748/11920) Updating files: 66% (7868/11920) Updating files: 67% (7987/11920) Updating files: 68% (8106/11920) Updating files: 69% (8225/11920) Updating files: 70% (8344/11920) Updating files: 71% (8464/11920) Updating files: 72% (8583/11920) Updating files: 73% (8702/11920) Updating files: 74% (8821/11920) Updating files: 75% (8940/11920) Updating files: 76% (9060/11920) Updating files: 77% (9179/11920) Updating files: 78% (9298/11920) Updating files: 79% (9417/11920) Updating files: 80% (9536/11920) Updating files: 81% (9656/11920) Updating files: 82% (9775/11920) Updating files: 82% (9838/11920) Updating files: 83% (9894/11920) Updating files: 84% (10013/11920) Updating files: 85% (10132/11920) Updating files: 86% (10252/11920) Updating files: 87% (10371/11920) Updating files: 88% (10490/11920) Updating files: 89% (10609/11920) Updating files: 90% (10728/11920) Updating files: 91% (10848/11920) Updating files: 92% (10967/11920) Updating files: 93% (11086/11920) Updating files: 94% (11205/11920) Updating files: 95% (11324/11920) Updating files: 96% (11444/11920) Updating files: 97% (11563/11920) Updating files: 98% (11682/11920) Updating files: 99% (11801/11920) Updating files: 100% (11920/11920) Updating files: 100% (11920/11920), done. +HEAD is now at 3a568e3a961b Merge tag 'soc-fixes-6.7-3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc +Merging origin/master (2af9b20dbb39 Merge tag 'x86-urgent-2023-10-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git origin/master +Updating 3a568e3a961b..2af9b20dbb39 +Fast-forward (no commit created; -m option ignored) + .../testing/sysfs-driver-intel-m10-bmc-sec-update | 14 ++--- + .../devicetree/bindings/iio/addac/adi,ad74115.yaml | 3 +- + .../devicetree/bindings/iio/dac/adi,ad5758.yaml | 3 +- + .../devicetree/bindings/iio/health/ti,afe4403.yaml | 3 +- + .../devicetree/bindings/iio/health/ti,afe4404.yaml | 3 +- + MAINTAINERS | 2 +- + arch/powerpc/kernel/setup-common.c | 2 + + arch/powerpc/mm/mem.c | 1 - + arch/powerpc/mm/pgtable.c | 32 +++++++--- + arch/sparc/lib/checksum_32.S | 2 +- + arch/x86/include/asm/i8259.h | 2 + + arch/x86/include/asm/intel-family.h | 2 + + arch/x86/kernel/acpi/boot.c | 3 + + arch/x86/kernel/i8259.c | 38 ++++++++--- + arch/x86/kernel/tsc_sync.c | 10 ++- + block/blk-throttle.c | 6 ++ + drivers/accel/ivpu/ivpu_hw_37xx.c | 11 ++-- + drivers/ata/libata-scsi.c | 5 +- + drivers/clk/clk.c | 21 ++++--- + drivers/clk/socfpga/clk-gate.c | 27 ++++++-- + drivers/clk/stm32/clk-stm32-core.c | 2 +- + drivers/firewire/sbp2.c | 1 + + drivers/fpga/tests/Kconfig | 4 +- + drivers/fpga/tests/fpga-region-test.c | 2 + + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 3 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 15 ++--- + drivers/gpu/drm/amd/amdgpu/vi.c | 2 +- + drivers/gpu/drm/display/drm_dp_mst_topology.c | 6 +- + drivers/gpu/drm/i915/gt/intel_gt_mcr.c | 24 ++++++- + drivers/gpu/drm/i915/i915_perf.c | 4 +- + drivers/gpu/drm/i915/i915_pmu.c | 9 +++ + drivers/gpu/drm/logicvc/Kconfig | 2 + + drivers/i2c/busses/i2c-aspeed.c | 3 +- + drivers/i2c/busses/i2c-stm32f7.c | 9 ++- + drivers/i2c/muxes/i2c-demux-pinctrl.c | 2 +- + drivers/i2c/muxes/i2c-mux-gpmux.c | 2 +- + drivers/i2c/muxes/i2c-mux-pinctrl.c | 2 +- + drivers/iio/adc/exynos_adc.c | 24 ++++--- + drivers/iio/adc/xilinx-xadc-core.c | 39 +++++------- + drivers/iio/adc/xilinx-xadc.h | 2 + + drivers/iio/afe/iio-rescale.c | 19 ++++-- + drivers/iommu/iommu.c | 3 +- + drivers/irqchip/irq-gic-v3-its.c | 4 +- + drivers/misc/fastrpc.c | 34 +++++----- + drivers/nvmem/imx-ocotp.c | 6 +- + drivers/platform/x86/amd/pmc/pmc-quirks.c | 73 ++++++++++++++++++++++ + drivers/scsi/sd.c | 39 +++++++++++- + fs/ceph/mds_client.c | 2 +- + include/scsi/scsi_device.h | 20 +++++- + io_uring/fdinfo.c | 18 ++++-- + io_uring/rw.c | 11 +--- + kernel/dma/swiotlb.c | 5 ++ + kernel/events/core.c | 3 +- + kernel/trace/trace_kprobe.c | 28 +++++++-- + 55 files changed, 442 insertions(+), 172 deletions(-) +Merging fixes/fixes (2dde18cd1d8f Linux 6.5) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/sfr/next-fixes.git fixes/fixes +Already up to date. +Merging mm-hotfixes/mm-hotfixes-unstable (db27869df6ed mm/damon/sysfs: remove requested targets when online-commit inputs) +$ git merge -m Merge branch 'mm-hotfixes-unstable' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm mm-hotfixes/mm-hotfixes-unstable +Auto-merging arch/powerpc/Kconfig +Auto-merging arch/riscv/Kconfig +Merge made by the 'ort' strategy. + arch/powerpc/Kconfig | 4 +-- + arch/riscv/Kconfig | 4 +-- + arch/s390/Kconfig | 4 +-- + arch/x86/Kconfig | 4 +-- + include/linux/mmzone.h | 14 +++++++--- + kernel/Kconfig.kexec | 2 ++ + mm/damon/sysfs.c | 48 ++++++--------------------------- + mm/madvise.c | 11 ++++++++ + mm/shmem.c | 19 ++++++++++++- + mm/sparse.c | 17 ++++++------ + tools/testing/selftests/clone3/clone3.c | 7 ++++- + 11 files changed, 72 insertions(+), 62 deletions(-) +Merging kbuild-current/fixes (8a749fd1a872 Linux 6.6-rc4) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kbuild-current/fixes +Already up to date. +Merging arc-current/for-curr (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-curr' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git arc-current/for-curr +Already up to date. +Merging arm-current/fixes (2dde18cd1d8f Linux 6.5) +$ git merge -m Merge branch 'fixes' of git://git.armlinux.org.uk/~rmk/linux-arm.git arm-current/fixes +Already up to date. +Merging arm64-fixes/for-next/fixes (4785aa802853 cpuidle, ACPI: Evaluate LPI arch_flags for broadcast timer) +$ git merge -m Merge branch 'for-next/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux arm64-fixes/for-next/fixes +Already up to date. +Merging arm-soc-fixes/arm/fixes (736a4aad8a9f Merge tag 'renesas-fixes-for-v6.6-tag3' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel into arm/fixes) +$ git merge -m Merge branch 'arm/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git arm-soc-fixes/arm/fixes +Already up to date. +Merging davinci-current/davinci/for-current (06c2afb862f9 Linux 6.5-rc1) +$ git merge -m Merge branch 'davinci/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git davinci-current/davinci/for-current +Already up to date. +Merging drivers-memory-fixes/fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl.git drivers-memory-fixes/fixes +Already up to date. +Merging tee-fixes/fixes (ceaa837f96ad Linux 6.2-rc8) +$ git merge -m Merge branch 'fixes' of https://git.linaro.org/people/jens.wiklander/linux-tee.git tee-fixes/fixes +Already up to date. +Merging m68k-current/for-linus (eb1e6ccdcf78 zorro: Include zorro.h in names.c) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git m68k-current/for-linus +Already up to date. +Merging powerpc-fixes/fixes (47b8def9358c powerpc/mm: Avoid calling arch_enter/leave_lazy_mmu() in set_ptes) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git powerpc-fixes/fixes +Already up to date. +Merging s390-fixes/fixes (c1ae1c59c8c6 s390/pci: fix iommu bitmap allocation) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git s390-fixes/fixes +Already up to date. +Merging sparc/master (2d2b17d08bfc sparc: Unbreak the build) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc.git sparc/master +Auto-merging arch/sparc/mm/srmmu.c +Merge made by the 'ort' strategy. +Merging fscrypt-current/for-current (4bcf6f827a79 fscrypt: check for NULL keyring in fscrypt_put_master_key_activeref()) +$ git merge -m Merge branch 'for-current' of git://git.kernel.org/pub/scm/fs/fscrypt/linux.git fscrypt-current/for-current +Already up to date. +Merging fsverity-current/for-current (a075bacde257 fsverity: don't drop pagecache at end of FS_IOC_ENABLE_VERITY) +$ git merge -m Merge branch 'for-current' of git://git.kernel.org/pub/scm/fs/fsverity/linux.git fsverity-current/for-current +Already up to date. +Merging net/main (c17cda15cc86 Merge tag 'net-6.6-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net) +$ git merge -m Merge branch 'main' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git net/main +Already up to date. +Merging bpf/master (c17cda15cc86 Merge tag 'net-6.6-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git bpf/master +Already up to date. +Merging ipsec/master (de5724ca38fd xfrm: fix a data-race in xfrm_lookup_with_ifid()) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git ipsec/master +Already up to date. +Merging netfilter/main (53798666648a iavf: in iavf_down, disable queues when removing the driver) +$ git merge -m Merge branch 'main' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git netfilter/main +Already up to date. +Merging ipvs/main (a63b6622120c net/sched: act_ct: additional checks for outdated flows) +$ git merge -m Merge branch 'main' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs.git ipvs/main +Already up to date. +Merging wireless/for-next (91535613b609 wifi: mac80211: don't drop all unprotected public action frames) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless.git wireless/for-next +Already up to date. +Merging wpan/master (2d1c882d4434 Merge tag 'mlx5-fixes-2023-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/wpan/wpan.git wpan/master +Already up to date. +Merging rdma-fixes/for-rc (94f6f0550c62 Linux 6.6-rc5) +$ git merge -m Merge branch 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git rdma-fixes/for-rc +Already up to date. +Merging sound-current/for-linus (99248c8902f5 ALSA: usb-audio: add quirk flag to enable native DSD for McIntosh devices) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git sound-current/for-linus +Merge made by the 'ort' strategy. + sound/hda/intel-dsp-config.c | 6 ++++++ + sound/usb/quirks.c | 2 ++ + 2 files changed, 8 insertions(+) +Merging sound-asoc-fixes/for-linus (805ce81826c8 ASoC: codecs: wsa883x: make use of new mute_unmute_on_trigger flag) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git sound-asoc-fixes/for-linus +Merge made by the 'ort' strategy. + include/sound/soc-dai.h | 1 + + sound/soc/codecs/wsa883x.c | 7 +------ + sound/soc/fsl/fsl_easrc.c | 8 ++++++-- + sound/soc/intel/skylake/skl-sst-utils.c | 1 + + sound/soc/soc-dai.c | 7 +++++++ + sound/soc/soc-pcm.c | 12 ++++++++---- + sound/soc/sof/sof-pci-dev.c | 7 +++++++ + 7 files changed, 31 insertions(+), 12 deletions(-) +Merging regmap-fixes/for-linus (0ec7731655de regmap: Ensure range selector registers are updated after cache sync) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git regmap-fixes/for-linus +Merge made by the 'ort' strategy. + drivers/base/regmap/regcache.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) +Merging regulator-fixes/for-linus (bc00d9f3813a regulator: qcom-rpmh: Fix smps4 regulator for pm8550ve) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git regulator-fixes/for-linus +Merge made by the 'ort' strategy. + drivers/regulator/qcom-rpmh-regulator.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +Merging spi-fixes/for-linus (c3aa5cb264a3 spi: nxp-fspi: use the correct ioremap function) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git spi-fixes/for-linus +Merge made by the 'ort' strategy. + drivers/spi/spi-nxp-fspi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +Merging pci-current/for-linus (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git pci-current/for-linus +Already up to date. +Merging driver-core.current/driver-core-linus (8a749fd1a872 Linux 6.6-rc4) +$ git merge -m Merge branch 'driver-core-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git driver-core.current/driver-core-linus +Already up to date. +Merging tty.current/tty-linus (58720809f527 Linux 6.6-rc6) +$ git merge -m Merge branch 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git tty.current/tty-linus +Already up to date. +Merging usb.current/usb-linus (05d3ef8bba77 Linux 6.6-rc7) +$ git merge -m Merge branch 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb.current/usb-linus +Already up to date. +Merging usb-serial-fixes/usb-linus (52480e1f1a25 USB: serial: option: add Fibocom to DELL custom modem FM101R-GL) +$ git merge -m Merge branch 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial.git usb-serial-fixes/usb-linus +Already up to date. +Merging phy/fixes (05d3ef8bba77 Linux 6.6-rc7) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy.git phy/fixes +Already up to date. +Merging staging.current/staging-linus (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'staging-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git staging.current/staging-linus +Already up to date. +Merging iio-fixes/fixes-togreg (bce3ab29a6c0 iio: common: ms_sensors: ms_sensors_i2c: fix humidity conversion time table) +$ git merge -m Merge branch 'fixes-togreg' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git iio-fixes/fixes-togreg +Merge made by the 'ort' strategy. + drivers/iio/accel/kionix-kx022a.c | 37 ++++++++++++++++++-------- + drivers/iio/common/ms_sensors/ms_sensors_i2c.c | 4 +-- + 2 files changed, 28 insertions(+), 13 deletions(-) +Merging counter-current/counter-current (58720809f527 Linux 6.6-rc6) +$ git merge -m Merge branch 'counter-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter.git counter-current/counter-current +Already up to date. +Merging char-misc.current/char-misc-linus (2af9b20dbb39 Merge tag 'x86-urgent-2023-10-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip) +$ git merge -m Merge branch 'char-misc-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git char-misc.current/char-misc-linus +Already up to date. +Merging soundwire-fixes/fixes (58720809f527 Linux 6.6-rc6) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire.git soundwire-fixes/fixes +Already up to date. +Merging thunderbolt-fixes/fixes (ec4405ed9203 thunderbolt: Call tb_switch_put() once DisplayPort bandwidth request is finished) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git thunderbolt-fixes/fixes +Already up to date. +Merging input-current/for-linus (5c15c60e7be6 Input: powermate - fix use-after-free in powermate_config_complete) +$ git merge -m Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git input-current/for-linus +Already up to date. +Merging crypto-current/master (b11950356c4b KEYS: asymmetric: Fix sign/verify on pkcs1pad without a hash) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6.git crypto-current/master +Already up to date. +Merging vfio-fixes/for-linus (c777b11d34e0 vfio/mdev: Fix a null-ptr-deref bug for mdev_unregister_parent()) +$ git merge -m Merge branch 'for-linus' of git://github.com/awilliam/linux-vfio.git vfio-fixes/for-linus +Already up to date. +Merging kselftest-fixes/fixes (cf5a103c98a6 selftests/user_events: Fix abi_test for BE archs) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git kselftest-fixes/fixes +Already up to date. +Merging modules-fixes/modules-linus (f412eef03938 Documentation: livepatch: module-elf-format: Remove local klp_modinfo definition) +$ git merge -m Merge branch 'modules-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules-fixes/modules-linus +Already up to date. +Merging dmaengine-fixes/fixes (58720809f527 Linux 6.6-rc6) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine.git dmaengine-fixes/fixes +Already up to date. +Merging backlight-fixes/for-backlight-fixes (88603b6dc419 Linux 6.2-rc2) +$ git merge -m Merge branch 'for-backlight-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight.git backlight-fixes/for-backlight-fixes +Already up to date. +Merging mtd-fixes/mtd/fixes (f6ca3fb6978f mtd: rawnand: Ensure the nand chip supports cached reads) +$ git merge -m Merge branch 'mtd/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git mtd-fixes/mtd/fixes +Already up to date. +Merging mfd-fixes/for-mfd-fixes (88603b6dc419 Linux 6.2-rc2) +$ git merge -m Merge branch 'for-mfd-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git mfd-fixes/for-mfd-fixes +Already up to date. +Merging v4l-dvb-fixes/fixes (c46f16f156ac media: i2c: ov8858: Don't set fwnode in the driver) +$ git merge -m Merge branch 'fixes' of https://git.linuxtv.org/media_stage.git v4l-dvb-fixes/fixes +Already up to date. +Merging reset-fixes/reset/fixes (3a2390c6777e reset: uniphier-glue: Fix possible null-ptr-deref) +$ git merge -m Merge branch 'reset/fixes' of https://git.pengutronix.de/git/pza/linux reset-fixes/reset/fixes +Already up to date. +Merging mips-fixes/mips-fixes (8a749fd1a872 Linux 6.6-rc4) +$ git merge -m Merge branch 'mips-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git mips-fixes/mips-fixes +Already up to date. +Merging at91-fixes/at91-fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'at91-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git at91-fixes/at91-fixes +Already up to date. +Merging omap-fixes/fixes (0b9a4a67c60d clk: ti: Fix missing omap5 mcbsp functional clock and aliases) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git omap-fixes/fixes +Already up to date. +Merging kvm-fixes/master (2b3f2325e71f Merge tag 'kvm-x86-selftests-6.6-fixes' of https://github.com/kvm-x86/linux into HEAD) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/virt/kvm/kvm.git kvm-fixes/master +Already up to date. +Merging kvms390-fixes/master (f87ef5723536 KVM: s390: fix gisa destroy operation might lead to cpu stalls) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git kvms390-fixes/master +Already up to date. +Merging hwmon-fixes/hwmon (9da2901c4733 hwmon: (pmbus/mp2975) Move PGOOD fix) +$ git merge -m Merge branch 'hwmon' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-fixes/hwmon +Merge made by the 'ort' strategy. + drivers/hwmon/axi-fan-control.c | 29 ++++++++++--------- + drivers/hwmon/coretemp.c | 2 +- + drivers/hwmon/nct6775-core.c | 12 +++++--- + drivers/hwmon/pmbus/mp2975.c | 10 +++---- + drivers/hwmon/sch56xx-common.c | 64 ++--------------------------------------- + 5 files changed, 32 insertions(+), 85 deletions(-) +Merging nvdimm-fixes/libnvdimm-fixes (33908660e814 ACPI: NFIT: Fix incorrect calculation of idt size) +$ git merge -m Merge branch 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm.git nvdimm-fixes/libnvdimm-fixes +Already up to date. +Merging cxl-fixes/fixes (8f61d48c83f6 tools/testing/cxl: Slow down the mock firmware transfer) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git cxl-fixes/fixes +Merge made by the 'ort' strategy. + drivers/cxl/core/core.h | 1 + + drivers/cxl/core/hdm.c | 19 ++++ + drivers/cxl/core/mbox.c | 55 ++++++--- + drivers/cxl/core/memdev.c | 157 +++++++++++-------------- + drivers/cxl/core/port.c | 6 + + drivers/cxl/core/region.c | 266 ++++++++++++++++++++++++------------------- + drivers/cxl/cxlmem.h | 13 ++- + drivers/cxl/pci.c | 94 +++++++-------- + tools/testing/cxl/test/cxl.c | 2 +- + tools/testing/cxl/test/mem.c | 79 ++++++++++++- + 10 files changed, 412 insertions(+), 280 deletions(-) +Merging btrfs-fixes/next-fixes (7a444b6e7de2 Merge branch 'misc-6.6' into next-fixes) +$ git merge -m Merge branch 'next-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git btrfs-fixes/next-fixes +Merge made by the 'ort' strategy. +Merging vfs-fixes/fixes (dc32464a5fe4 ceph_wait_on_conflict_unlink(): grab reference before dropping ->d_lock) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git vfs-fixes/fixes +Already up to date. +Merging dma-mapping-fixes/for-linus (d5090484b021 swiotlb: do not try to allocate a TLB bigger than MAX_ORDER pages) +$ git merge -m Merge branch 'for-linus' of git://git.infradead.org/users/hch/dma-mapping.git dma-mapping-fixes/for-linus +Already up to date. +Merging drivers-x86-fixes/fixes (3bde7ec13c97 platform/x86: Add s2idle quirk for more Lenovo laptops) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git drivers-x86-fixes/fixes +Already up to date. +Merging samsung-krzk-fixes/fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git samsung-krzk-fixes/fixes +Already up to date. +Merging pinctrl-samsung-fixes/fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung.git pinctrl-samsung-fixes/fixes +Already up to date. +Merging devicetree-fixes/dt/linus (19007c629c63 dt-bindings: trivial-devices: Fix MEMSIC MXC4005 compatible string) +$ git merge -m Merge branch 'dt/linus' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git devicetree-fixes/dt/linus +Already up to date. +Merging dt-krzk-fixes/fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt.git dt-krzk-fixes/fixes +Already up to date. +Merging scsi-fixes/fixes (097c06394c83 scsi: qla2xxx: Fix double free of dsd_list during driver load) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git scsi-fixes/fixes +Already up to date. +Merging drm-fixes/drm-fixes (44117828ed5c Merge tag 'amd-drm-fixes-6.6-2023-10-25' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes) +$ git merge -m Merge branch 'drm-fixes' of git://git.freedesktop.org/git/drm/drm.git drm-fixes/drm-fixes +Already up to date. +Merging drm-intel-fixes/for-linux-next-fixes (4cbed7702eb7 drm/i915/pmu: Check if pmu is closed before stopping event) +$ git merge -m Merge branch 'for-linux-next-fixes' of git://anongit.freedesktop.org/drm-intel drm-intel-fixes/for-linux-next-fixes +Already up to date. +Merging mmc-fixes/fixes (57925e16c9f7 mmc: meson-gx: Remove setting of CMD_CFG_ERROR) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git mmc-fixes/fixes +Merge made by the 'ort' strategy. + drivers/mmc/host/meson-gx-mmc.c | 1 - + 1 file changed, 1 deletion(-) +Merging rtc-fixes/rtc-fixes (08279468a294 rtc: sunplus: fix format string for printing resource) +$ git merge -m Merge branch 'rtc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git rtc-fixes/rtc-fixes +Already up to date. +Merging gnss-fixes/gnss-linus (58720809f527 Linux 6.6-rc6) +$ git merge -m Merge branch 'gnss-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/gnss.git gnss-fixes/gnss-linus +Already up to date. +Merging hyperv-fixes/hyperv-fixes (42999c904612 hv/hv_kvp_daemon:Support for keyfile based connection profile) +$ git merge -m Merge branch 'hyperv-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git hyperv-fixes/hyperv-fixes +Already up to date. +Merging soc-fsl-fixes/fix (06c2afb862f9 Linux 6.5-rc1) +$ git merge -m Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux.git soc-fsl-fixes/fix +Already up to date. +Merging risc-v-fixes/fixes (3fec323339a4 drivers: perf: Fix panic in riscv SBI mmap support) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git risc-v-fixes/fixes +Already up to date. +Merging riscv-dt-fixes/riscv-dt-fixes (cf98fe6b579e riscv: dts: starfive: visionfive 2: correct spi's ss pin) +$ git merge -m Merge branch 'riscv-dt-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git riscv-dt-fixes/riscv-dt-fixes +Already up to date. +Merging riscv-soc-fixes/riscv-soc-fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'riscv-soc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git riscv-soc-fixes/riscv-soc-fixes +Already up to date. +Merging fpga-fixes/fixes (03d4bf9ff34a fpga: Fix memory leak for fpga_region_test_class_find()) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/fpga/linux-fpga.git fpga-fixes/fixes +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. +Merging spdx/spdx-linus (8a749fd1a872 Linux 6.6-rc4) +$ git merge -m Merge branch 'spdx-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/spdx.git spdx/spdx-linus +Already up to date. +Merging gpio-brgl-fixes/gpio/for-current (05d3ef8bba77 Linux 6.6-rc7) +$ git merge -m Merge branch 'gpio/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git gpio-brgl-fixes/gpio/for-current +Already up to date. +Merging gpio-intel-fixes/fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git gpio-intel-fixes/fixes +Already up to date. +Merging pinctrl-intel-fixes/fixes (2d325e54d9e2 pinctrl: baytrail: fix debounce disable case) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/intel.git pinctrl-intel-fixes/fixes +Merge made by the 'ort' strategy. + drivers/pinctrl/intel/pinctrl-baytrail.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) +Merging erofs-fixes/fixes (3048102d9d68 erofs: update documentation) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git erofs-fixes/fixes +Already up to date. +Merging kunit-fixes/kunit-fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'kunit-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git kunit-fixes/kunit-fixes +Already up to date. +Merging ubifs-fixes/fixes (2241ab53cbb5 Linux 6.2-rc5) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs.git ubifs-fixes/fixes +Already up to date. +Merging memblock-fixes/fixes (55122e0130e5 memblock tests: fix warning ‘struct seq_file’ declared inside parameter list) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock.git memblock-fixes/fixes +Already up to date. +Merging nfsd-fixes/nfsd-fixes (0d32a6bbb8e7 NFSD: Fix zero NFSv4 READ results when RQ_SPLICE_OK is not set) +$ git merge -m Merge branch 'nfsd-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux nfsd-fixes/nfsd-fixes +Already up to date. +Merging irqchip-fixes/irq/irqchip-fixes (b673fe1a6229 MAINTAINERS: Remove myself from the general IRQ subsystem maintenance) +$ git merge -m Merge branch 'irq/irqchip-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git irqchip-fixes/irq/irqchip-fixes +Already up to date. +Merging renesas-fixes/fixes (9eab43facdad soc: renesas: ARCH_R9A07G043 depends on !RISCV_ISA_ZICBOM) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git renesas-fixes/fixes +Already up to date. +Merging broadcom-fixes/fixes (9abf2313adc1 Linux 6.1-rc1) +$ git merge -m Merge branch 'fixes' of https://github.com/Broadcom/stblinux.git broadcom-fixes/fixes +Already up to date. +Merging perf-current/perf-tools (4fa008a2db48 tools build: Fix llvm feature detection, still used by bpftool) +$ git merge -m Merge branch 'perf-tools' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools perf-current/perf-tools +Already up to date. +Merging efi-fixes/urgent (c03d21f05e76 Merge 3rd batch of EFI fixes into efi/urgent) +$ git merge -m Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git efi-fixes/urgent +Already up to date. +Merging zstd-fixes/zstd-linus (f064f4e5ecb1 zstd: Fix array-index-out-of-bounds UBSAN warning) +$ git merge -m Merge branch 'zstd-linus' of https://github.com/terrelln/linux.git zstd-fixes/zstd-linus +Merge made by the 'ort' strategy. + lib/zstd/common/fse_decompress.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +Merging battery-fixes/fixes (8894b4325488 power: supply: qcom_battmgr: fix enable request endianness) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git battery-fixes/fixes +Already up to date. +Merging uml-fixes/fixes (73a23d771033 um: harddog: fix modular build) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git uml-fixes/fixes +Already up to date. +Merging asahi-soc-fixes/asahi-soc/fixes (568035b01cfb Linux 6.0-rc1) +$ git merge -m Merge branch 'asahi-soc/fixes' of https://github.com/AsahiLinux/linux.git asahi-soc-fixes/asahi-soc/fixes +Already up to date. +Merging iommufd-fixes/for-rc (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git iommufd-fixes/for-rc +Already up to date. +Merging rust-fixes/rust-fixes (cfd96726e611 rust: docs: fix logo replacement) +$ git merge -m Merge branch 'rust-fixes' of https://github.com/Rust-for-Linux/linux.git rust-fixes/rust-fixes +Already up to date. +Merging v9fs-fixes/fixes/next (2dde18cd1d8f Linux 6.5) +$ git merge -m Merge branch 'fixes/next' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git v9fs-fixes/fixes/next +Already up to date. +Merging w1-fixes/fixes (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-w1.git w1-fixes/fixes +Already up to date. +Merging pmdomain-fixes/fixes (b131329b9bfb pmdomain: amlogic: Fix mask for the second NNA mem PD domain) +$ git merge -m Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git pmdomain-fixes/fixes +Merge made by the 'ort' strategy. + drivers/pmdomain/amlogic/meson-ee-pwrc.c | 2 +- + drivers/pmdomain/bcm/bcm2835-power.c | 2 +- + drivers/pmdomain/imx/gpc.c | 1 + + 3 files changed, 3 insertions(+), 2 deletions(-) +Merging overlayfs-fixes/ovl-fixes (beae836e9c61 ovl: temporarily disable appending lowedirs) +$ git merge -m Merge branch 'ovl-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/overlayfs/vfs.git overlayfs-fixes/ovl-fixes +Already up to date. +Merging drm-misc-fixes/for-linux-next-fixes (101c9f637efa drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE) +$ git merge -m Merge branch 'for-linux-next-fixes' of git://anongit.freedesktop.org/drm/drm-misc drm-misc-fixes/for-linux-next-fixes +Merge made by the 'ort' strategy. + drivers/gpu/drm/drm_syncobj.c | 3 ++- + drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c | 2 +- + drivers/gpu/drm/vc4/tests/vc4_mock_output.c | 2 +- + 3 files changed, 4 insertions(+), 3 deletions(-) +Merging mm-stable/mm-stable (88c91dc58582 mempolicy: migration attempt to match interleave nodes) +$ git merge -m Merge branch 'mm-stable' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm mm-stable/mm-stable +Auto-merging MAINTAINERS +Auto-merging drivers/firmware/efi/unaccepted_memory.c +Auto-merging drivers/md/raid5.c +Auto-merging drivers/virtio/virtio_balloon.c +Auto-merging fs/iomap/buffered-io.c +Auto-merging fs/ntfs3/file.c +Auto-merging fs/quota/dquot.c +Auto-merging include/linux/cgroup-defs.h +Auto-merging include/linux/fs.h +Auto-merging include/linux/mmzone.h +Auto-merging kernel/sched/fair.c +Auto-merging mm/damon/sysfs.c +Auto-merging mm/madvise.c +Auto-merging mm/shmem.c +Auto-merging net/sunrpc/auth.c +Merge made by the 'ort' strategy. + Documentation/ABI/testing/sysfs-kernel-mm-damon | 7 + + Documentation/admin-guide/cgroup-v1/memory.rst | 1 + + Documentation/admin-guide/cgroup-v2.rst | 38 + + Documentation/admin-guide/mm/damon/usage.rst | 124 +- + Documentation/admin-guide/mm/ksm.rst | 11 + + Documentation/admin-guide/mm/pagemap.rst | 89 ++ + Documentation/admin-guide/mm/userfaultfd.rst | 35 + + Documentation/dev-tools/kasan.rst | 7 +- + Documentation/dev-tools/kcsan.rst | 4 +- + Documentation/dev-tools/kmsan.rst | 6 +- + Documentation/mm/damon/design.rst | 26 +- + .../trace/postprocess/trace-vmscan-postprocess.pl | 40 +- + MAINTAINERS | 2 + + arch/alpha/include/asm/bitops.h | 20 + + arch/arm64/include/asm/tlb.h | 5 +- + arch/arm64/kernel/mte.c | 4 +- + arch/arm64/mm/kasan_init.c | 6 +- + arch/loongarch/include/asm/pgalloc.h | 1 + + arch/m68k/include/asm/bitops.h | 21 + + arch/mips/include/asm/bitops.h | 25 +- + arch/mips/include/asm/pgalloc.h | 1 + + arch/mips/lib/bitops.c | 14 + + arch/mips/mm/cache.c | 2 +- + arch/powerpc/include/asm/bitops.h | 21 +- + arch/riscv/include/asm/bitops.h | 12 + + arch/s390/include/asm/bitops.h | 10 + + arch/x86/include/asm/bitops.h | 11 +- + arch/x86/kvm/mmu/mmu.c | 18 +- + arch/x86/mm/pgtable.c | 3 + + drivers/acpi/acpi_pad.c | 2 +- + drivers/acpi/numa/hmat.c | 146 +- + drivers/android/binder_alloc.c | 30 +- + drivers/base/cacheinfo.c | 51 +- + drivers/dax/kmem.c | 62 +- + drivers/firmware/efi/unaccepted_memory.c | 20 + + drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 29 +- + drivers/gpu/drm/i915/i915_drv.h | 2 +- + drivers/gpu/drm/msm/msm_drv.c | 4 +- + drivers/gpu/drm/msm/msm_drv.h | 4 +- + drivers/gpu/drm/msm/msm_gem_shrinker.c | 33 +- + drivers/gpu/drm/panfrost/panfrost_device.h | 2 +- + drivers/gpu/drm/panfrost/panfrost_drv.c | 6 +- + drivers/gpu/drm/panfrost/panfrost_gem.h | 2 +- + drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c | 29 +- + drivers/gpu/drm/ttm/ttm_pool.c | 40 +- + drivers/md/bcache/bcache.h | 2 +- + drivers/md/bcache/btree.c | 27 +- + drivers/md/bcache/sysfs.c | 3 +- + drivers/md/dm-bufio.c | 28 +- + drivers/md/dm-cache-metadata.c | 2 +- + drivers/md/dm-zoned-metadata.c | 28 +- + drivers/md/raid5.c | 26 +- + drivers/md/raid5.h | 2 +- + drivers/misc/vmw_balloon.c | 38 +- + drivers/virtio/virtio_balloon.c | 24 +- + drivers/xen/xenbus/xenbus_probe_backend.c | 17 +- + fs/btrfs/super.c | 2 +- + fs/buffer.c | 125 +- + fs/dax.c | 24 +- + fs/erofs/utils.c | 19 +- + fs/exec.c | 4 +- + fs/ext4/ext4.h | 2 +- + fs/ext4/extents_status.c | 23 +- + fs/ext4/inode.c | 14 +- + fs/ext4/move_extent.c | 11 +- + fs/ext4/readpage.c | 14 +- + fs/ext4/super.c | 13 +- + fs/f2fs/super.c | 31 +- + fs/gfs2/aops.c | 2 +- + fs/gfs2/bmap.c | 48 +- + fs/gfs2/glock.c | 19 +- + fs/gfs2/main.c | 6 +- + fs/gfs2/meta_io.c | 61 +- + fs/gfs2/quota.c | 62 +- + fs/gfs2/quota.h | 3 +- + fs/hugetlbfs/inode.c | 84 +- + fs/iomap/buffered-io.c | 57 +- + fs/jbd2/journal.c | 29 +- + fs/kernfs/file.c | 49 - + fs/kernfs/mount.c | 2 +- + fs/mbcache.c | 22 +- + fs/mpage.c | 3 +- + fs/nfs/nfs42xattr.c | 87 +- + fs/nfs/super.c | 21 +- + fs/nfsd/filecache.c | 23 +- + fs/nfsd/netns.h | 4 +- + fs/nfsd/nfs4state.c | 19 +- + fs/nfsd/nfscache.c | 31 +- + fs/nilfs2/mdt.c | 66 +- + fs/nilfs2/page.c | 76 +- + fs/nilfs2/page.h | 11 - + fs/nilfs2/segment.c | 7 +- + fs/ntfs/aops.c | 255 ++- + fs/ntfs/file.c | 89 +- + fs/ntfs3/file.c | 31 +- + fs/ocfs2/aops.c | 19 +- + fs/proc/kcore.c | 3 +- + fs/proc/root.c | 2 +- + fs/proc/task_mmu.c | 733 ++++++++- + fs/quota/dquot.c | 17 +- + fs/reiserfs/inode.c | 80 +- + fs/super.c | 35 +- + fs/ubifs/super.c | 21 +- + fs/ufs/balloc.c | 20 +- + fs/ufs/inode.c | 25 +- + fs/ufs/util.c | 34 +- + fs/ufs/util.h | 10 +- + fs/userfaultfd.c | 96 +- + fs/xfs/xfs_buf.c | 24 +- + fs/xfs/xfs_buf.h | 2 +- + fs/xfs/xfs_icache.c | 26 +- + fs/xfs/xfs_mount.c | 4 +- + fs/xfs/xfs_mount.h | 2 +- + fs/xfs/xfs_qm.c | 27 +- + fs/xfs/xfs_qm.h | 2 +- + include/asm-generic/bitops/instrumented-lock.h | 28 +- + include/asm-generic/bitops/lock.h | 20 +- + include/asm-generic/pgalloc.h | 7 +- + include/linux/bootmem_info.h | 2 +- + include/linux/buffer_head.h | 83 +- + include/linux/cacheinfo.h | 1 + + include/linux/cgroup-defs.h | 5 + + include/linux/damon.h | 74 +- + include/linux/dax.h | 10 +- + include/linux/fs.h | 6 +- + include/linux/gfp.h | 12 +- + include/linux/hugetlb.h | 25 +- + include/linux/hugetlb_cgroup.h | 11 - + include/linux/jbd2.h | 2 +- + include/linux/memblock.h | 9 + + include/linux/memcontrol.h | 93 +- + include/linux/memory-tiers.h | 41 +- + include/linux/mempolicy.h | 58 +- + include/linux/migrate.h | 4 +- + include/linux/mm.h | 176 ++- + include/linux/mm_inline.h | 20 +- + include/linux/mm_types.h | 49 +- + include/linux/mmu_notifier.h | 9 +- + include/linux/mmzone.h | 29 +- + include/linux/page-flags.h | 19 + + include/linux/pagemap.h | 33 +- + include/linux/percpu_counter.h | 30 + + include/linux/rmap.h | 4 +- + include/linux/sched.h | 4 + + include/linux/sched/coredump.h | 19 +- + include/linux/sched/mm.h | 4 + + include/linux/sched/numa_balancing.h | 6 +- + include/linux/shmem_fs.h | 16 +- + include/linux/shrinker.h | 87 +- + include/linux/userfaultfd_k.h | 28 +- + include/linux/wait.h | 9 +- + include/trace/events/damon.h | 45 +- + include/trace/events/migrate.h | 24 +- + include/trace/events/vmscan.h | 8 +- + include/uapi/linux/fs.h | 59 + + include/uapi/linux/mempolicy.h | 2 +- + include/uapi/linux/prctl.h | 3 +- + include/uapi/linux/userfaultfd.h | 9 +- + ipc/shm.c | 21 +- + kernel/cgroup/cgroup.c | 15 +- + kernel/events/uprobes.c | 4 +- + kernel/exit.c | 4 - + kernel/fork.c | 8 +- + kernel/kcsan/kcsan_test.c | 9 +- + kernel/kcsan/selftest.c | 9 +- + kernel/kthread.c | 1 - + kernel/ptrace.c | 2 +- + kernel/rcu/tree.c | 21 +- + kernel/rcu/tree_nocb.h | 19 +- + kernel/sched/fair.c | 12 +- + kernel/sched/wait.c | 60 +- + kernel/sys.c | 32 +- + lib/percpu_counter.c | 79 + + mm/Kconfig | 12 + + mm/Makefile | 4 +- + mm/bootmem_info.c | 2 +- + mm/cma.c | 2 +- + mm/compaction.c | 91 +- + mm/damon/Kconfig | 12 + + mm/damon/core-test.h | 29 +- + mm/damon/core.c | 295 +++- + mm/damon/dbgfs.c | 3 +- + mm/damon/lru_sort.c | 6 +- + mm/damon/ops-common.c | 5 +- + mm/damon/paddr.c | 11 +- + mm/damon/reclaim.c | 2 + + mm/damon/sysfs-common.h | 2 + + mm/damon/sysfs-schemes.c | 133 +- + mm/damon/sysfs-test.h | 86 + + mm/damon/sysfs.c | 36 +- + mm/damon/vaddr.c | 22 +- + mm/debug_vm_pgtable.c | 4 +- + mm/filemap.c | 215 +-- + mm/gup.c | 16 +- + mm/huge_memory.c | 134 +- + mm/hugetlb.c | 629 ++++++-- + mm/hugetlb_cgroup.c | 20 +- + mm/hugetlb_vmemmap.c | 303 +++- + mm/hugetlb_vmemmap.h | 31 +- + mm/internal.h | 147 +- + mm/kasan/kasan_test.c | 19 +- + mm/kasan/kasan_test_module.c | 2 +- + mm/kasan/quarantine.c | 4 +- + mm/kasan/report.c | 4 +- + mm/kasan/report_generic.c | 6 +- + mm/kasan/shadow.c | 2 +- + mm/khugepaged.c | 137 +- + mm/kmemleak.c | 144 +- + mm/kmsan/core.c | 125 +- + mm/kmsan/kmsan_test.c | 109 +- + mm/kmsan/shadow.c | 9 +- + mm/ksm.c | 116 ++ + mm/madvise.c | 33 +- + mm/memblock.c | 49 +- + mm/memcontrol.c | 409 ++++- + mm/memfd.c | 6 - + mm/memory-failure.c | 29 +- + mm/memory-tiers.c | 175 ++- + mm/memory.c | 302 ++-- + mm/memory_hotplug.c | 8 +- + mm/mempolicy.c | 1036 ++++++------ + mm/migrate.c | 225 +-- + mm/mlock.c | 95 +- + mm/mm_init.c | 4 +- + mm/mmap.c | 149 +- + mm/mmzone.c | 6 +- + mm/mprotect.c | 58 +- + mm/mremap.c | 107 +- + mm/nommu.c | 8 +- + mm/oom_kill.c | 16 +- + mm/page-writeback.c | 35 +- + mm/page_alloc.c | 343 +++- + mm/page_io.c | 8 +- + mm/page_owner.c | 4 +- + mm/percpu.c | 8 +- + mm/rmap.c | 164 +- + mm/shmem.c | 594 +++---- + mm/show_mem.c | 11 +- + mm/shrinker.c | 809 ++++++++++ + mm/shrinker_debug.c | 35 +- + mm/slab.h | 15 +- + mm/swap.h | 9 +- + mm/swap_state.c | 92 +- + mm/util.c | 1 + + mm/vmscan.c | 734 +-------- + mm/vmstat.c | 30 +- + mm/workingset.c | 29 +- + mm/zsmalloc.c | 29 +- + mm/zswap.c | 7 +- + net/sunrpc/auth.c | 20 +- + tools/include/uapi/linux/fs.h | 59 + + tools/include/uapi/linux/prctl.h | 3 +- + tools/mm/page_owner_sort.c | 217 ++- + tools/testing/radix-tree/linux.c | 4 +- + tools/testing/selftests/cgroup/.gitignore | 1 + + tools/testing/selftests/cgroup/Makefile | 2 + + .../testing/selftests/cgroup/test_hugetlb_memcg.c | 234 +++ + tools/testing/selftests/damon/sysfs.sh | 1 + + tools/testing/selftests/mm/.gitignore | 2 + + tools/testing/selftests/mm/Makefile | 4 +- + tools/testing/selftests/mm/config | 1 + + tools/testing/selftests/mm/gup_longterm.c | 3 +- + tools/testing/selftests/mm/hugetlb-madvise.c | 19 - + .../selftests/mm/hugetlb_fault_after_madv.c | 73 + + tools/testing/selftests/mm/ksm_functional_tests.c | 66 +- + tools/testing/selftests/mm/mdwe_test.c | 137 +- + tools/testing/selftests/mm/mremap_test.c | 305 +++- + tools/testing/selftests/mm/pagemap_ioctl.c | 1660 ++++++++++++++++++++ + tools/testing/selftests/mm/run_vmtests.sh | 8 + + tools/testing/selftests/mm/vm_util.c | 19 + + tools/testing/selftests/mm/vm_util.h | 1 + + 271 files changed, 11545 insertions(+), 5228 deletions(-) + create mode 100644 mm/damon/sysfs-test.h + create mode 100644 mm/shrinker.c + create mode 100644 tools/testing/selftests/cgroup/test_hugetlb_memcg.c + create mode 100644 tools/testing/selftests/mm/hugetlb_fault_after_madv.c + create mode 100644 tools/testing/selftests/mm/pagemap_ioctl.c +Merging mm-nonmm-stable/mm-nonmm-stable (5176140c5094 ocfs2: fix a typo in a comment) +$ git merge -m Merge branch 'mm-nonmm-stable' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm mm-nonmm-stable/mm-nonmm-stable +Auto-merging arch/arm64/Kconfig +Auto-merging arch/loongarch/kernel/setup.c +Auto-merging arch/riscv/Kconfig +Auto-merging arch/x86/Kconfig +Auto-merging drivers/net/xen-netback/interface.c +Auto-merging fs/buffer.c +Auto-merging fs/kernfs/mount.c +Auto-merging fs/notify/fanotify/fanotify_user.c +Auto-merging fs/proc/task_mmu.c +Auto-merging fs/userfaultfd.c +Auto-merging include/linux/sched.h +Auto-merging kernel/Kconfig.kexec +Auto-merging kernel/exit.c +Auto-merging kernel/fork.c +Auto-merging kernel/kthread.c +Auto-merging kernel/sys.c +Auto-merging kernel/workqueue.c +Auto-merging mm/damon/core.c +Auto-merging mm/khugepaged.c +Auto-merging mm/shmem.c +Auto-merging net/core/pktgen.c +Merge made by the 'ort' strategy. + arch/arm/kernel/setup.c | 3 +- + arch/arm64/Kconfig | 3 + + arch/arm64/include/asm/crash_core.h | 10 ++ + arch/arm64/mm/init.c | 140 ++------------------ + arch/ia64/kernel/setup.c | 2 +- + arch/loongarch/kernel/setup.c | 4 +- + arch/mips/kernel/setup.c | 3 +- + arch/powerpc/kernel/fadump.c | 2 +- + arch/powerpc/kexec/core.c | 2 +- + arch/powerpc/mm/nohash/kaslr_booke.c | 2 +- + arch/riscv/Kconfig | 3 + + arch/riscv/include/asm/crash_core.h | 11 ++ + arch/riscv/include/asm/processor.h | 2 + + arch/riscv/mm/init.c | 141 ++------------------ + arch/s390/kernel/setup.c | 4 +- + arch/sh/kernel/machine_kexec.c | 2 +- + arch/x86/Kconfig | 3 + + arch/x86/include/asm/crash_core.h | 42 ++++++ + arch/x86/kernel/setup.c | 147 ++------------------- + block/bdev.c | 6 +- + drivers/accel/ivpu/ivpu_job.c | 3 +- + drivers/dma-buf/st-dma-fence-chain.c | 12 +- + drivers/dma-buf/st-dma-fence.c | 4 +- + drivers/gpu/drm/i915/gt/selftest_migrate.c | 4 +- + drivers/net/xen-netback/interface.c | 3 +- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 137 ++------------------ + drivers/scsi/qla2xxx/qla_dfs.c | 59 +-------- + drivers/usb/usbip/usbip_common.h | 6 - + fs/anon_inodes.c | 4 +- + fs/buffer.c | 4 +- + fs/char_dev.c | 2 +- + fs/dcache.c | 8 +- + fs/direct-io.c | 2 +- + fs/eventpoll.c | 6 +- + fs/fcntl.c | 2 +- + fs/file_table.c | 2 +- + fs/gfs2/ops_fstype.c | 9 +- + fs/inode.c | 8 +- + fs/kernfs/mount.c | 5 +- + fs/locks.c | 4 +- + fs/namespace.c | 16 +-- + fs/notify/dnotify/dnotify.c | 6 +- + fs/notify/fanotify/fanotify_user.c | 8 +- + fs/notify/inotify/inotify_user.c | 2 +- + fs/ocfs2/alloc.c | 2 +- + fs/ocfs2/buffer_head_io.c | 2 +- + fs/ocfs2/dlmfs/dlmfs.c | 3 +- + fs/ocfs2/journal.c | 2 +- + fs/ocfs2/namei.c | 8 ++ + fs/ocfs2/quota_local.c | 4 + + fs/pipe.c | 2 +- + fs/proc/array.c | 7 +- + fs/proc/base.c | 22 ++-- + fs/proc/inode.c | 11 +- + fs/proc/task_mmu.c | 11 +- + fs/userfaultfd.c | 2 +- + include/linux/compiler-clang.h | 5 - + include/linux/compiler-gcc.h | 2 - + include/linux/compiler.h | 13 +- + include/linux/const.h | 8 -- + include/linux/crash_core.h | 49 ++++++- + include/linux/fortify-string.h | 2 +- + include/linux/kexec.h | 4 - + include/linux/kstrtox.h | 5 - + include/linux/kthread.h | 1 + + include/linux/minmax.h | 129 ++++++++++--------- + include/linux/sched.h | 1 - + include/linux/sched/signal.h | 19 ++- + include/linux/seq_file.h | 15 +++ + include/linux/stringify.h | 2 + + include/linux/timer.h | 3 +- + init/init_task.c | 1 - + kernel/Kconfig.kexec | 2 +- + kernel/audit_tree.c | 4 +- + kernel/crash_core.c | 184 ++++++++++++++++++++++++--- + kernel/exit.c | 1 - + kernel/fork.c | 3 - + kernel/gcov/fs.c | 2 +- + kernel/irq/manage.c | 15 +-- + kernel/kexec_core.c | 17 --- + kernel/kthread.c | 18 +++ + kernel/panic.c | 22 ++-- + kernel/pid_namespace.c | 6 - + kernel/sched/core.c | 2 +- + kernel/signal.c | 24 ++-- + kernel/smpboot.c | 3 +- + kernel/sys.c | 41 +++--- + kernel/taskstats.c | 5 +- + kernel/user_namespace.c | 2 +- + kernel/workqueue.c | 16 +-- + lib/debugobjects.c | 2 +- + mm/damon/core.c | 3 +- + mm/khugepaged.c | 2 +- + mm/shmem.c | 8 +- + net/core/pktgen.c | 3 +- + scripts/get_maintainer.pl | 38 +++--- + scripts/show_delta | 3 +- + security/integrity/iint.c | 2 +- + sound/pci/asihpi/hpidebug.h | 9 +- + tools/include/linux/compiler.h | 8 ++ + tools/include/linux/const.h | 8 -- + tools/testing/selftests/proc/proc-empty-vm.c | 97 +++++++++++++- + 102 files changed, 769 insertions(+), 964 deletions(-) + create mode 100644 arch/arm64/include/asm/crash_core.h + create mode 100644 arch/riscv/include/asm/crash_core.h + create mode 100644 arch/x86/include/asm/crash_core.h +Merging mm/mm-everything (44c9217272ef Merge branch 'mm-nonmm-unstable' into mm-everything) +$ git merge -m Merge branch 'mm-everything' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm mm/mm-everything +Merge made by the 'ort' strategy. + Documentation/core-api/maple_tree.rst | 2 +- + Documentation/dev-tools/ubsan.rst | 6 +- + arch/x86/mm/numa.c | 33 +--- + fs/ocfs2/alloc.c | 9 +- + fs/ocfs2/buffer_head_io.c | 2 +- + fs/proc/base.c | 30 ++- + include/linux/memblock.h | 1 + + include/linux/memcontrol.h | 8 +- + include/linux/swap.h | 6 + + mm/memblock.c | 21 ++ + mm/memcontrol.c | 278 +++++++++++++++------------ + mm/page_alloc.c | 44 ++++- + mm/vmalloc.c | 2 +- + mm/vmscan.c | 26 ++- + mm/workingset.c | 42 ++-- + mm/zswap.c | 13 +- + scripts/gdb/linux/cpus.py | 15 ++ + tools/testing/selftests/cgroup/test_zswap.c | 48 +++++ + tools/testing/selftests/proc/proc-empty-vm.c | 137 ++++++++----- + 19 files changed, 489 insertions(+), 234 deletions(-) +Merging kbuild/for-next (7715d094a5c3 kbuild: unify no-compiler-targets and no-sync-config-targets) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kbuild/for-next +Auto-merging Makefile +Auto-merging arch/riscv/Makefile +Auto-merging rust/Makefile +Merge made by the 'ort' strategy. + .gitignore | 1 - + Documentation/kbuild/kbuild.rst | 6 + + Documentation/kbuild/makefiles.rst | 7 ++ + Makefile | 24 ++-- + arch/arm/Makefile | 7 +- + arch/arm/vdso/Makefile | 25 ----- + arch/arm64/Makefile | 9 +- + arch/arm64/kernel/vdso/Makefile | 10 -- + arch/arm64/kernel/vdso32/Makefile | 10 -- + arch/csky/kernel/vdso/Makefile | 10 -- + arch/loongarch/Makefile | 4 +- + arch/loongarch/vdso/Makefile | 10 -- + arch/parisc/Makefile | 8 +- + arch/riscv/Makefile | 9 +- + arch/riscv/kernel/compat_vdso/Makefile | 10 -- + arch/riscv/kernel/vdso/Makefile | 10 -- + arch/s390/Makefile | 6 +- + arch/s390/kernel/vdso32/Makefile | 10 -- + arch/s390/kernel/vdso64/Makefile | 10 -- + arch/sparc/Makefile | 5 +- + arch/sparc/vdso/Makefile | 27 ----- + arch/x86/Makefile | 7 +- + arch/x86/entry/vdso/Makefile | 27 ----- + arch/x86/um/vdso/Makefile | 12 -- + rust/Makefile | 2 + + scripts/Makefile.host | 2 + + scripts/Makefile.package | 10 +- + scripts/Makefile.vdsoinst | 45 ++++++++ + scripts/mod/Makefile | 4 +- + scripts/mod/file2alias.c | 14 +-- + scripts/mod/modpost.c | 138 +++++++---------------- + scripts/mod/modpost.h | 50 ++++++--- + scripts/mod/symsearch.c | 199 +++++++++++++++++++++++++++++++++ + scripts/package/mkspec | 6 + + scripts/remove-stale-files | 2 +- + 35 files changed, 388 insertions(+), 348 deletions(-) + create mode 100644 scripts/Makefile.vdsoinst + create mode 100644 scripts/mod/symsearch.c +Merging clang-format/clang-format (5d0c230f1de8 Linux 6.5-rc4) +$ git merge -m Merge branch 'clang-format' of https://github.com/ojeda/linux.git clang-format/clang-format +Already up to date. +Merging perf/perf-tools-next (c43c64f8a1c6 perf vendor events intel: Update tsx_cycles_per_elision metrics) +$ git merge -m Merge branch 'perf-tools-next' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git perf/perf-tools-next +Auto-merging tools/perf/util/dlfilter.c +Auto-merging tools/perf/util/pmu.c +Merge made by the 'ort' strategy. + scripts/clang-tools/gen_compile_commands.py | 8 +- + scripts/clang-tools/run-clang-tools.py | 32 +- + tools/build/Makefile.build | 10 +- + tools/include/asm-generic/unaligned.h | 147 +- + tools/lib/api/io.h | 1 + + tools/lib/perf/evlist.c | 9 + + tools/lib/perf/include/internal/evlist.h | 2 + + tools/lib/perf/include/internal/rc_check.h | 13 +- + tools/perf/Documentation/perf-bench.txt | 19 + + tools/perf/Documentation/perf-kwork.txt | 38 +- + tools/perf/Documentation/perf-lock.txt | 7 + + tools/perf/Documentation/perf-record.txt | 3 + + tools/perf/Makefile.config | 85 +- + tools/perf/Makefile.perf | 18 +- + tools/perf/arch/arm/util/cs-etm.c | 35 +- + tools/perf/arch/arm/util/pmu.c | 10 +- + tools/perf/arch/arm64/util/arm-spe.c | 48 +- + tools/perf/arch/arm64/util/pmu.c | 20 +- + tools/perf/arch/powerpc/util/header.c | 2 +- + tools/perf/arch/s390/util/pmu.c | 3 +- + tools/perf/arch/x86/annotate/instructions.c | 9 +- + tools/perf/arch/x86/util/intel-pt.c | 42 +- + tools/perf/arch/x86/util/pmu.c | 145 +- + tools/perf/bench/sched-messaging.c | 102 +- + tools/perf/bench/sched-pipe.c | 132 +- + tools/perf/bench/uprobe.c | 1 + + tools/perf/builtin-buildid-cache.c | 6 +- + tools/perf/builtin-kwork.c | 760 ++- + tools/perf/builtin-lock.c | 117 +- + tools/perf/builtin-record.c | 92 +- + tools/perf/builtin-report.c | 15 + + tools/perf/builtin-sched.c | 2 +- + tools/perf/builtin-script.c | 2 +- + tools/perf/builtin-stat.c | 2 +- + tools/perf/builtin-version.c | 1 + + tools/perf/check-headers.sh | 1 + + tools/perf/perf-completion.sh | 10 +- + .../arch/arm64/ampere/ampereone/metrics.json | 418 +- + .../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 + + .../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 + + .../arch/arm64/arm/neoverse-v1/branch.json | 8 - + .../pmu-events/arch/arm64/arm/neoverse-v1/bus.json | 18 +- + .../arch/arm64/arm/neoverse-v1/cache.json | 155 - + .../arch/arm64/arm/neoverse-v1/exception.json | 45 +- + .../arch/arm64/arm/neoverse-v1/fp_operation.json | 10 + + .../arch/arm64/arm/neoverse-v1/general.json | 10 + + .../arch/arm64/arm/neoverse-v1/instruction.json | 119 - + .../arch/arm64/arm/neoverse-v1/l1d_cache.json | 54 + + .../arch/arm64/arm/neoverse-v1/l1i_cache.json | 14 + + .../arch/arm64/arm/neoverse-v1/l2_cache.json | 50 + + .../arch/arm64/arm/neoverse-v1/l3_cache.json | 22 + + .../arch/arm64/arm/neoverse-v1/ll_cache.json | 10 + + .../arch/arm64/arm/neoverse-v1/memory.json | 21 +- + .../arch/arm64/arm/neoverse-v1/metrics.json | 233 + + .../arch/arm64/arm/neoverse-v1/pipeline.json | 23 - + .../arch/arm64/arm/neoverse-v1/retired.json | 30 + + .../pmu-events/arch/arm64/arm/neoverse-v1/spe.json | 18 + + .../arch/arm64/arm/neoverse-v1/spec_operation.json | 110 + + .../arch/arm64/arm/neoverse-v1/stall.json | 30 + + .../pmu-events/arch/arm64/arm/neoverse-v1/sve.json | 30 + + .../pmu-events/arch/arm64/arm/neoverse-v1/tlb.json | 66 + + tools/perf/pmu-events/arch/arm64/mapfile.csv | 2 +- + tools/perf/pmu-events/arch/nds32/mapfile.csv | 2 +- + tools/perf/pmu-events/arch/powerpc/mapfile.csv | 8 +- + .../arch/powerpc/power10/datasource.json | 1787 ++++++ + .../pmu-events/arch/powerpc/power10/metrics.json | 388 ++ + .../pmu-events/arch/powerpc/power10/others.json | 10 - + .../perf/pmu-events/arch/powerpc/power10/pmc.json | 2 +- + .../arch/powerpc/power10/translation.json | 5 - + .../pmu-events/arch/test/test_soc/sys/uncore.json | 8 + + .../pmu-events/arch/x86/alderlake/adl-metrics.json | 8 +- + .../pmu-events/arch/x86/alderlake/frontend.json | 44 +- + .../perf/pmu-events/arch/x86/alderlake/memory.json | 4 +- + .../pmu-events/arch/x86/alderlake/pipeline.json | 22 +- + .../arch/x86/alderlake/uncore-interconnect.json | 2 + + .../arch/x86/alderlaken/adln-metrics.json | 6 +- + .../pmu-events/arch/x86/alderlaken/memory.json | 4 +- + .../pmu-events/arch/x86/alderlaken/pipeline.json | 16 + + .../arch/x86/alderlaken/uncore-interconnect.json | 66 + + .../perf/pmu-events/arch/x86/bonnell/frontend.json | 2 +- + .../arch/x86/broadwellde/bdwde-metrics.json | 14 +- + .../arch/x86/broadwellde/uncore-interconnect.json | 18 +- + .../arch/x86/broadwellx/uncore-interconnect.json | 18 +- + .../arch/x86/cascadelakex/clx-metrics.json | 2 +- + .../pmu-events/arch/x86/emeraldrapids/cache.json | 888 +++ + .../arch/x86/emeraldrapids/floating-point.json | 193 + + .../arch/x86/emeraldrapids/frontend.json | 389 ++ + .../pmu-events/arch/x86/emeraldrapids/memory.json | 343 ++ + .../pmu-events/arch/x86/emeraldrapids/other.json | 315 + + .../arch/x86/emeraldrapids/pipeline.json | 975 +++ + .../arch/x86/emeraldrapids/uncore-cache.json | 5988 +++++++++++++++++++ + .../arch/x86/emeraldrapids/uncore-cxl.json | 450 ++ + .../x86/emeraldrapids/uncore-interconnect.json | 6199 ++++++++++++++++++++ + .../arch/x86/emeraldrapids/uncore-io.json | 3587 +++++++++++ + .../arch/x86/emeraldrapids/uncore-memory.json | 3308 +++++++++++ + .../arch/x86/emeraldrapids/uncore-power.json | 197 + + .../arch/x86/emeraldrapids/virtual-memory.json | 165 + + .../arch/x86/haswellx/uncore-interconnect.json | 18 +- + .../pmu-events/arch/x86/icelake/icl-metrics.json | 2 +- + .../pmu-events/arch/x86/icelakex/icx-metrics.json | 2 +- + .../perf/pmu-events/arch/x86/ivybridge/cache.json | 8 +- + .../arch/x86/ivybridge/floating-point.json | 2 +- + .../pmu-events/arch/x86/ivybridge/frontend.json | 18 +- + tools/perf/pmu-events/arch/x86/ivytown/cache.json | 4 +- + .../arch/x86/ivytown/uncore-interconnect.json | 20 +- + .../arch/x86/jaketown/uncore-interconnect.json | 18 +- + .../pmu-events/arch/x86/knightslanding/cache.json | 39 +- + .../arch/x86/knightslanding/floating-point.json | 8 +- + .../arch/x86/knightslanding/pipeline.json | 55 +- + .../arch/x86/knightslanding/uncore-cache.json | 26 +- + .../arch/x86/knightslanding/virtual-memory.json | 2 +- + .../perf/pmu-events/arch/x86/lunarlake/cache.json | 219 + + .../pmu-events/arch/x86/lunarlake/frontend.json | 27 + + .../perf/pmu-events/arch/x86/lunarlake/memory.json | 183 + + .../perf/pmu-events/arch/x86/lunarlake/other.json | 62 + + .../pmu-events/arch/x86/lunarlake/pipeline.json | 217 + + .../arch/x86/lunarlake/virtual-memory.json | 56 + + tools/perf/pmu-events/arch/x86/mapfile.csv | 38 +- + .../perf/pmu-events/arch/x86/meteorlake/cache.json | 30 + + .../pmu-events/arch/x86/meteorlake/frontend.json | 29 +- + .../pmu-events/arch/x86/meteorlake/memory.json | 37 + + .../perf/pmu-events/arch/x86/meteorlake/other.json | 40 + + .../pmu-events/arch/x86/meteorlake/pipeline.json | 68 +- + .../arch/x86/meteorlake/uncore-other.json | 9 + + .../perf/pmu-events/arch/x86/nehalemep/cache.json | 2 +- + .../arch/x86/nehalemep/floating-point.json | 2 +- + .../perf/pmu-events/arch/x86/nehalemex/cache.json | 2 +- + .../arch/x86/nehalemex/floating-point.json | 2 +- + .../arch/x86/rocketlake/rkl-metrics.json | 2 +- + .../arch/x86/sapphirerapids/frontend.json | 41 +- + .../arch/x86/sapphirerapids/spr-metrics.json | 7 - + .../arch/x86/sapphirerapids/uncore-cache.json | 20 +- + .../pmu-events/arch/x86/skylake/skl-metrics.json | 2 +- + .../pmu-events/arch/x86/skylakex/skx-metrics.json | 2 +- + .../pmu-events/arch/x86/tigerlake/tgl-metrics.json | 14 +- + .../arch/x86/westmereep-dp/floating-point.json | 2 +- + .../pmu-events/arch/x86/westmereep-sp/cache.json | 2 +- + .../arch/x86/westmereep-sp/floating-point.json | 2 +- + .../perf/pmu-events/arch/x86/westmereex/cache.json | 2 +- + .../arch/x86/westmereex/floating-point.json | 2 +- + .../pmu-events/arch/x86/westmereex/pipeline.json | 2 +- + tools/perf/pmu-events/empty-pmu-events.c | 8 + + tools/perf/pmu-events/jevents.py | 124 +- + tools/perf/pmu-events/metric.py | 3 +- + tools/perf/tests/Build | 1 + + tools/perf/tests/attr/system-wide-dummy | 14 +- + tools/perf/tests/attr/test-record-C0 | 4 +- + tools/perf/tests/attr/test-record-dummy-C0 | 55 + + tools/perf/tests/builtin-test.c | 1 + + tools/perf/tests/code-reading.c | 10 + + tools/perf/tests/expr.c | 33 +- + tools/perf/tests/hists_link.c | 4 +- + tools/perf/tests/make | 7 +- + tools/perf/tests/parse-events.c | 51 +- + tools/perf/tests/pmu-events.c | 65 +- + tools/perf/tests/pmu.c | 23 +- + tools/perf/tests/shell/coresight/asm_pure_loop.sh | 4 + + .../tests/shell/coresight/memcpy_thread_16k_10.sh | 4 + + .../shell/coresight/thread_loop_check_tid_10.sh | 4 + + .../shell/coresight/thread_loop_check_tid_2.sh | 4 + + .../tests/shell/coresight/unroll_loop_thread_10.sh | 4 + + tools/perf/tests/shell/lib/coresight.sh | 2 + + tools/perf/tests/shell/lock_contention.sh | 52 + + tools/perf/tests/shell/probe_vfs_getname.sh | 2 + + .../tests/shell/record+probe_libc_inet_pton.sh | 2 + + .../tests/shell/record+script_probe_vfs_getname.sh | 2 + + tools/perf/tests/shell/record.sh | 1 + + tools/perf/tests/shell/record_offcpu.sh | 2 +- + tools/perf/tests/shell/record_sideband.sh | 58 + + tools/perf/tests/shell/stat+csv_output.sh | 1 + + tools/perf/tests/shell/stat+csv_summary.sh | 4 +- + tools/perf/tests/shell/stat+shadow_stat.sh | 34 +- + tools/perf/tests/shell/stat+std_output.sh | 1 + + tools/perf/tests/shell/stat_all_metricgroups.sh | 16 +- + tools/perf/tests/shell/test_arm_coresight.sh | 4 +- + tools/perf/tests/shell/test_intel_pt.sh | 1 + + tools/perf/tests/shell/trace+probe_vfs_getname.sh | 1 + + tools/perf/tests/tests.h | 1 + + tools/perf/tests/thread-maps-share.c | 9 +- + tools/perf/tests/util.c | 31 + + tools/perf/ui/browsers/hists.c | 6 +- + tools/perf/util/Build | 2 + + tools/perf/util/arm-spe.h | 4 +- + tools/perf/util/bpf-filter.y | 4 + + tools/perf/util/bpf_counter.c | 5 +- + tools/perf/util/bpf_kwork_top.c | 308 + + tools/perf/util/bpf_lock_contention.c | 51 +- + tools/perf/util/bpf_off_cpu.c | 13 +- + .../util/bpf_skel/augmented_raw_syscalls.bpf.c | 16 +- + tools/perf/util/bpf_skel/kwork_top.bpf.c | 338 ++ + tools/perf/util/bpf_skel/lock_contention.bpf.c | 161 +- + tools/perf/util/bpf_skel/lock_data.h | 3 +- + tools/perf/util/bpf_skel/vmlinux/.gitignore | 1 + + tools/perf/util/branch.c | 4 +- + tools/perf/util/branch.h | 4 +- + tools/perf/util/callchain.c | 76 +- + tools/perf/util/callchain.h | 20 +- + tools/perf/util/cgroup.c | 63 +- + tools/perf/util/cgroup.h | 5 + + tools/perf/util/cs-etm.c | 114 +- + tools/perf/util/cs-etm.h | 2 +- + tools/perf/util/data.c | 12 + + tools/perf/util/dlfilter.c | 4 +- + tools/perf/util/dso.c | 2 + + tools/perf/util/dso.h | 2 + + tools/perf/util/env.c | 6 +- + tools/perf/util/evlist.c | 23 +- + tools/perf/util/evlist.h | 1 + + tools/perf/util/evsel.c | 43 +- + tools/perf/util/evsel.h | 5 +- + tools/perf/util/expr.c | 2 +- + tools/perf/util/expr.y | 2 + + tools/perf/util/header.c | 60 +- + tools/perf/util/hisi-ptt.c | 4 +- + tools/perf/util/hist.c | 32 +- + .../util/intel-pt-decoder/intel-pt-pkt-decoder.c | 43 +- + tools/perf/util/intel-pt.c | 2 + + tools/perf/util/intel-pt.h | 3 +- + tools/perf/util/jitdump.c | 1 + + tools/perf/util/kwork.h | 61 +- + tools/perf/util/lock-contention.h | 10 +- + tools/perf/util/machine.c | 37 +- + tools/perf/util/machine.h | 1 - + tools/perf/util/map_symbol.c | 15 + + tools/perf/util/map_symbol.h | 4 + + tools/perf/util/mem-events.c | 3 +- + tools/perf/util/metricgroup.c | 2 +- + tools/perf/util/parse-events.c | 213 +- + tools/perf/util/parse-events.h | 34 +- + tools/perf/util/parse-events.l | 6 +- + tools/perf/util/parse-events.y | 68 +- + tools/perf/util/pfm.c | 15 +- + tools/perf/util/pmu.c | 173 +- + tools/perf/util/pmu.h | 34 +- + tools/perf/util/pmu.y | 4 + + tools/perf/util/pmus.c | 18 +- + tools/perf/util/print-events.c | 28 +- + tools/perf/util/python-ext-sources | 1 + + tools/perf/util/python.c | 2 +- + tools/perf/util/rlimit.c | 28 + + tools/perf/util/rlimit.h | 11 +- + tools/perf/util/rwsem.c | 34 + + tools/perf/util/rwsem.h | 11 + + tools/perf/util/sort.c | 2 +- + tools/perf/util/string.c | 48 + + tools/perf/util/string2.h | 1 + + tools/perf/util/svghelper.c | 5 +- + tools/perf/util/symbol-elf.c | 4 +- + tools/perf/util/symbol.c | 15 +- + tools/perf/util/trace-event-info.c | 3 +- + tools/scripts/Makefile.include | 10 +- + 251 files changed, 31721 insertions(+), 1837 deletions(-) + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json + delete mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/branch.json + delete mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/cache.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/fp_operation.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/general.json + delete mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/instruction.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l1d_cache.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l1i_cache.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l2_cache.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l3_cache.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/ll_cache.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/metrics.json + delete mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/pipeline.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/retired.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/spe.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/spec_operation.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/stall.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/sve.json + create mode 100644 tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/tlb.json + create mode 100644 tools/perf/pmu-events/arch/powerpc/power10/datasource.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/cache.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/floating-point.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/frontend.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/memory.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/other.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/pipeline.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-cache.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-cxl.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-interconnect.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-io.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-memory.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-power.json + create mode 100644 tools/perf/pmu-events/arch/x86/emeraldrapids/virtual-memory.json + create mode 100644 tools/perf/pmu-events/arch/x86/lunarlake/cache.json + create mode 100644 tools/perf/pmu-events/arch/x86/lunarlake/frontend.json + create mode 100644 tools/perf/pmu-events/arch/x86/lunarlake/memory.json + create mode 100644 tools/perf/pmu-events/arch/x86/lunarlake/other.json + create mode 100644 tools/perf/pmu-events/arch/x86/lunarlake/pipeline.json + create mode 100644 tools/perf/pmu-events/arch/x86/lunarlake/virtual-memory.json + create mode 100644 tools/perf/pmu-events/arch/x86/meteorlake/uncore-other.json + create mode 100644 tools/perf/tests/attr/test-record-dummy-C0 + create mode 100755 tools/perf/tests/shell/record_sideband.sh + create mode 100644 tools/perf/tests/util.c + create mode 100644 tools/perf/util/bpf_kwork_top.c + create mode 100644 tools/perf/util/bpf_skel/kwork_top.bpf.c + create mode 100644 tools/perf/util/bpf_skel/vmlinux/.gitignore + create mode 100644 tools/perf/util/map_symbol.c +Merging compiler-attributes/compiler-attributes (5d0c230f1de8 Linux 6.5-rc4) +$ git merge -m Merge branch 'compiler-attributes' of https://github.com/ojeda/linux.git compiler-attributes/compiler-attributes +Already up to date. +Merging dma-mapping/for-next (36d91e851598 dma-debug: Fix a typo in a debugging eye-catcher) +$ git merge -m Merge branch 'for-next' of git://git.infradead.org/users/hch/dma-mapping.git dma-mapping/for-next +Auto-merging kernel/dma/swiotlb.c +Merge made by the 'ort' strategy. + arch/arm/Kconfig | 1 + + arch/m68k/Kconfig | 6 +-- + arch/m68k/Kconfig.cpu | 12 +++++ + arch/m68k/kernel/Makefile | 2 +- + arch/m68k/kernel/dma.c | 34 +----------- + arch/parisc/Kconfig | 1 + + drivers/net/ethernet/freescale/fec_main.c | 86 +++++++++++++++++++++++++++---- + kernel/dma/Kconfig | 11 ++++ + kernel/dma/debug.c | 2 +- + kernel/dma/direct.c | 37 +++++-------- + kernel/dma/swiotlb.c | 12 +++-- + 11 files changed, 127 insertions(+), 77 deletions(-) +Merging asm-generic/master (550087a0ba91 hexagon: Remove unusable symbols from the ptrace.h uapi) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git asm-generic/master +Auto-merging Documentation/kbuild/makefiles.rst +Auto-merging MAINTAINERS +Auto-merging Makefile +CONFLICT (modify/delete): arch/ia64/include/asm/cpu.h deleted in asm-generic/master and modified in HEAD. Version HEAD of arch/ia64/include/asm/cpu.h left in tree. +CONFLICT (modify/delete): arch/ia64/kernel/setup.c deleted in asm-generic/master and modified in HEAD. Version HEAD of arch/ia64/kernel/setup.c left in tree. +CONFLICT (modify/delete): arch/ia64/kernel/topology.c deleted in asm-generic/master and modified in HEAD. Version HEAD of arch/ia64/kernel/topology.c left in tree. +Auto-merging drivers/firmware/efi/efi.c +Auto-merging drivers/video/fbdev/Kconfig +Auto-merging include/linux/acpi.h +Auto-merging include/linux/mm.h +Auto-merging include/linux/sched/signal.h +Auto-merging kernel/fork.c +Auto-merging kernel/sched/core.c +Auto-merging kernel/signal.c +Auto-merging mm/mmap.c +Auto-merging tools/include/uapi/asm-generic/unistd.h +Auto-merging tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl +Auto-merging tools/perf/arch/powerpc/entry/syscalls/syscall.tbl +Auto-merging tools/perf/arch/s390/entry/syscalls/syscall.tbl +Auto-merging tools/perf/arch/x86/entry/syscalls/syscall_64.tbl +Automatic merge failed; fix conflicts and then commit the result. +$ git rm -f arch/ia64/kernel/setup.c arch/ia64/include/asm/cpu.h arch/ia64/kernel/topology.c +rm 'arch/ia64/include/asm/cpu.h' +rm 'arch/ia64/kernel/setup.c' +rm 'arch/ia64/kernel/topology.c' +$ git commit --no-edit -v -a +[master c19dc196d0c3] Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git +$ git diff -M --stat --summary HEAD^.. + Documentation/ABI/testing/sysfs-devices-system-cpu | 3 - + .../ABI/testing/sysfs-firmware-dmi-entries | 2 +- + Documentation/admin-guide/kdump/kdump.rst | 37 +- + Documentation/admin-guide/kdump/vmcoreinfo.rst | 30 - + Documentation/admin-guide/kernel-parameters.txt | 8 +- + Documentation/admin-guide/mm/memory-hotplug.rst | 2 +- + Documentation/admin-guide/sysctl/kernel.rst | 23 +- + Documentation/arch/ia64/aliasing.rst | 246 --- + Documentation/arch/ia64/efirtc.rst | 144 -- + Documentation/arch/ia64/err_inject.rst | 1067 --------- + Documentation/arch/ia64/features.rst | 3 - + Documentation/arch/ia64/fsys.rst | 303 --- + Documentation/arch/ia64/ia64.rst | 49 - + Documentation/arch/ia64/index.rst | 19 - + Documentation/arch/ia64/irq-redir.rst | 80 - + Documentation/arch/ia64/mca.rst | 198 -- + Documentation/arch/ia64/serial.rst | 165 -- + Documentation/arch/index.rst | 1 - + Documentation/block/ioprio.rst | 3 - + Documentation/core-api/cpu_hotplug.rst | 6 - + Documentation/core-api/debugging-via-ohci1394.rst | 6 +- + .../features/core/cBPF-JIT/arch-support.txt | 1 - + .../features/core/eBPF-JIT/arch-support.txt | 1 - + .../core/generic-idle-thread/arch-support.txt | 1 - + .../features/core/jump-labels/arch-support.txt | 1 - + .../core/thread-info-in-task/arch-support.txt | 1 - + .../features/core/tracehook/arch-support.txt | 1 - + .../features/debug/KASAN/arch-support.txt | 1 - + .../debug/debug-vm-pgtable/arch-support.txt | 1 - + .../debug/gcov-profile-all/arch-support.txt | 1 - + Documentation/features/debug/kcov/arch-support.txt | 1 - + Documentation/features/debug/kgdb/arch-support.txt | 1 - + .../features/debug/kmemleak/arch-support.txt | 1 - + .../debug/kprobes-on-ftrace/arch-support.txt | 1 - + .../features/debug/kprobes/arch-support.txt | 1 - + .../features/debug/kretprobes/arch-support.txt | 1 - + .../features/debug/optprobes/arch-support.txt | 1 - + .../features/debug/stackprotector/arch-support.txt | 1 - + .../features/debug/uprobes/arch-support.txt | 1 - + .../debug/user-ret-profiler/arch-support.txt | 1 - + .../features/io/dma-contiguous/arch-support.txt | 1 - + .../locking/cmpxchg-local/arch-support.txt | 1 - + .../features/locking/lockdep/arch-support.txt | 1 - + .../locking/queued-rwlocks/arch-support.txt | 1 - + .../locking/queued-spinlocks/arch-support.txt | 1 - + .../features/perf/kprobes-event/arch-support.txt | 1 - + .../features/perf/perf-regs/arch-support.txt | 1 - + .../features/perf/perf-stackdump/arch-support.txt | 1 - + .../sched/membarrier-sync-core/arch-support.txt | 1 - + .../features/sched/numa-balancing/arch-support.txt | 1 - + .../seccomp/seccomp-filter/arch-support.txt | 1 - + .../time/arch-tick-broadcast/arch-support.txt | 1 - + .../features/time/clockevents/arch-support.txt | 1 - + .../time/context-tracking/arch-support.txt | 1 - + .../features/time/irq-time-acct/arch-support.txt | 1 - + .../features/time/virt-cpuacct/arch-support.txt | 1 - + .../features/vm/ELF-ASLR/arch-support.txt | 1 - + .../features/vm/PG_uncached/arch-support.txt | 1 - + Documentation/features/vm/THP/arch-support.txt | 1 - + Documentation/features/vm/TLB/arch-support.txt | 1 - + .../features/vm/huge-vmap/arch-support.txt | 1 - + .../features/vm/ioremap_prot/arch-support.txt | 1 - + .../features/vm/pte_special/arch-support.txt | 1 - + Documentation/kbuild/makefiles.rst | 2 +- + .../device_drivers/ethernet/neterion/s2io.rst | 4 +- + Documentation/scheduler/sched-arch.rst | 4 +- + Documentation/trace/kprobes.rst | 1 - + Documentation/translations/zh_CN/arch/index.rst | 1 - + .../translations/zh_CN/core-api/cpu_hotplug.rst | 6 - + .../translations/zh_CN/scheduler/sched-arch.rst | 5 +- + MAINTAINERS | 11 - + Makefile | 4 +- + arch/Kconfig | 1 - + arch/alpha/kernel/syscalls/syscall.tbl | 3 +- + arch/arm/tools/syscall.tbl | 3 +- + arch/arm64/include/asm/unistd.h | 2 +- + arch/arm64/include/asm/unistd32.h | 6 +- + arch/hexagon/include/asm/ptrace.h | 25 + + arch/hexagon/include/uapi/asm/ptrace.h | 13 - + arch/ia64/Kbuild | 3 - + arch/ia64/Kconfig | 394 ---- + arch/ia64/Kconfig.debug | 55 - + arch/ia64/Makefile | 82 - + arch/ia64/configs/bigsur_defconfig | 102 - + arch/ia64/configs/generic_defconfig | 206 -- + arch/ia64/configs/gensparse_defconfig | 184 -- + arch/ia64/configs/tiger_defconfig | 169 -- + arch/ia64/configs/zx1_defconfig | 148 -- + arch/ia64/hp/common/Makefile | 10 - + arch/ia64/hp/common/aml_nfw.c | 232 -- + arch/ia64/hp/common/sba_iommu.c | 2155 ------------------ + arch/ia64/include/asm/Kbuild | 6 - + arch/ia64/include/asm/acenv.h | 49 - + arch/ia64/include/asm/acpi-ext.h | 17 - + arch/ia64/include/asm/acpi.h | 110 - + arch/ia64/include/asm/asm-offsets.h | 1 - + arch/ia64/include/asm/asm-prototypes.h | 30 - + arch/ia64/include/asm/asmmacro.h | 136 -- + arch/ia64/include/asm/atomic.h | 216 -- + arch/ia64/include/asm/barrier.h | 79 - + arch/ia64/include/asm/bitops.h | 453 ---- + arch/ia64/include/asm/bug.h | 19 - + arch/ia64/include/asm/cache.h | 30 - + arch/ia64/include/asm/cacheflush.h | 39 - + arch/ia64/include/asm/checksum.h | 63 - + arch/ia64/include/asm/clocksource.h | 11 - + arch/ia64/include/asm/cmpxchg.h | 33 - + arch/ia64/include/asm/cpu.h | 18 - + arch/ia64/include/asm/cputime.h | 21 - + arch/ia64/include/asm/current.h | 18 - + arch/ia64/include/asm/cyclone.h | 16 - + arch/ia64/include/asm/delay.h | 89 - + arch/ia64/include/asm/device.h | 14 - + arch/ia64/include/asm/div64.h | 1 - + arch/ia64/include/asm/dma-mapping.h | 16 - + arch/ia64/include/asm/dma.h | 17 - + arch/ia64/include/asm/dmi.h | 15 - + arch/ia64/include/asm/early_ioremap.h | 11 - + arch/ia64/include/asm/efi.h | 13 - + arch/ia64/include/asm/elf.h | 233 -- + arch/ia64/include/asm/emergency-restart.h | 6 - + arch/ia64/include/asm/esi.h | 30 - + arch/ia64/include/asm/exception.h | 23 - + arch/ia64/include/asm/extable.h | 12 - + arch/ia64/include/asm/fb.h | 43 - + arch/ia64/include/asm/fpswa.h | 74 - + arch/ia64/include/asm/ftrace.h | 28 - + arch/ia64/include/asm/futex.h | 109 - + arch/ia64/include/asm/gcc_intrin.h | 13 - + arch/ia64/include/asm/hardirq.h | 27 - + arch/ia64/include/asm/hugetlb.h | 34 - + arch/ia64/include/asm/hw_irq.h | 167 -- + arch/ia64/include/asm/idle.h | 8 - + arch/ia64/include/asm/intrinsics.h | 13 - + arch/ia64/include/asm/io.h | 271 --- + arch/ia64/include/asm/iommu.h | 22 - + arch/ia64/include/asm/iosapic.h | 106 - + arch/ia64/include/asm/irq.h | 37 - + arch/ia64/include/asm/irq_regs.h | 1 - + arch/ia64/include/asm/irq_remapping.h | 5 - + arch/ia64/include/asm/irqflags.h | 95 - + arch/ia64/include/asm/kdebug.h | 45 - + arch/ia64/include/asm/kexec.h | 46 - + arch/ia64/include/asm/kprobes.h | 116 - + arch/ia64/include/asm/kregs.h | 166 -- + arch/ia64/include/asm/libata-portmap.h | 9 - + arch/ia64/include/asm/linkage.h | 19 - + arch/ia64/include/asm/local.h | 1 - + arch/ia64/include/asm/mca.h | 185 -- + arch/ia64/include/asm/mca_asm.h | 245 --- + arch/ia64/include/asm/meminit.h | 59 - + arch/ia64/include/asm/mman.h | 18 - + arch/ia64/include/asm/mmiowb.h | 17 - + arch/ia64/include/asm/mmu.h | 14 - + arch/ia64/include/asm/mmu_context.h | 194 -- + arch/ia64/include/asm/mmzone.h | 35 - + arch/ia64/include/asm/module.h | 35 - + arch/ia64/include/asm/module.lds.h | 14 - + arch/ia64/include/asm/msidef.h | 43 - + arch/ia64/include/asm/native/inst.h | 119 - + arch/ia64/include/asm/native/irq.h | 20 - + arch/ia64/include/asm/native/patchlist.h | 24 - + arch/ia64/include/asm/nodedata.h | 63 - + arch/ia64/include/asm/numa.h | 83 - + arch/ia64/include/asm/page.h | 208 -- + arch/ia64/include/asm/pal.h | 1827 --------------- + arch/ia64/include/asm/param.h | 18 - + arch/ia64/include/asm/parport.h | 20 - + arch/ia64/include/asm/patch.h | 28 - + arch/ia64/include/asm/pci.h | 66 - + arch/ia64/include/asm/percpu.h | 53 - + arch/ia64/include/asm/pgalloc.h | 64 - + arch/ia64/include/asm/pgtable.h | 545 ----- + arch/ia64/include/asm/processor.h | 660 ------ + arch/ia64/include/asm/ptrace.h | 146 -- + arch/ia64/include/asm/sal.h | 919 -------- + arch/ia64/include/asm/sections.h | 33 - + arch/ia64/include/asm/serial.h | 17 - + arch/ia64/include/asm/shmparam.h | 13 - + arch/ia64/include/asm/signal.h | 33 - + arch/ia64/include/asm/smp.h | 103 - + arch/ia64/include/asm/sn/intr.h | 15 - + arch/ia64/include/asm/sn/sn_sal.h | 124 -- + arch/ia64/include/asm/sparsemem.h | 28 - + arch/ia64/include/asm/spinlock.h | 265 --- + arch/ia64/include/asm/spinlock_types.h | 22 - + arch/ia64/include/asm/string.h | 22 - + arch/ia64/include/asm/switch_to.h | 71 - + arch/ia64/include/asm/syscall.h | 65 - + arch/ia64/include/asm/thread_info.h | 131 -- + arch/ia64/include/asm/timex.h | 47 - + arch/ia64/include/asm/tlb.h | 50 - + arch/ia64/include/asm/tlbflush.h | 128 -- + arch/ia64/include/asm/topology.h | 56 - + arch/ia64/include/asm/types.h | 32 - + arch/ia64/include/asm/uaccess.h | 265 --- + arch/ia64/include/asm/uncached.h | 9 - + arch/ia64/include/asm/unistd.h | 38 - + arch/ia64/include/asm/unwind.h | 234 -- + arch/ia64/include/asm/user.h | 53 - + arch/ia64/include/asm/ustack.h | 12 - + arch/ia64/include/asm/uv/uv.h | 30 - + arch/ia64/include/asm/uv/uv_hub.h | 315 --- + arch/ia64/include/asm/uv/uv_mmrs.h | 825 ------- + arch/ia64/include/asm/vermagic.h | 15 - + arch/ia64/include/asm/vga.h | 26 - + arch/ia64/include/asm/vmalloc.h | 4 - + arch/ia64/include/asm/xor.h | 30 - + arch/ia64/include/asm/xtp.h | 46 - + arch/ia64/include/uapi/asm/Kbuild | 2 - + arch/ia64/include/uapi/asm/auxvec.h | 14 - + arch/ia64/include/uapi/asm/bitsperlong.h | 9 - + arch/ia64/include/uapi/asm/break.h | 23 - + arch/ia64/include/uapi/asm/byteorder.h | 7 - + arch/ia64/include/uapi/asm/cmpxchg.h | 138 -- + arch/ia64/include/uapi/asm/fcntl.h | 15 - + arch/ia64/include/uapi/asm/fpu.h | 67 - + arch/ia64/include/uapi/asm/gcc_intrin.h | 619 ------ + arch/ia64/include/uapi/asm/ia64regs.h | 101 - + arch/ia64/include/uapi/asm/intrinsics.h | 82 - + arch/ia64/include/uapi/asm/mman.h | 17 - + arch/ia64/include/uapi/asm/param.h | 30 - + arch/ia64/include/uapi/asm/posix_types.h | 9 - + arch/ia64/include/uapi/asm/ptrace.h | 248 --- + arch/ia64/include/uapi/asm/ptrace_offsets.h | 269 --- + arch/ia64/include/uapi/asm/resource.h | 8 - + arch/ia64/include/uapi/asm/rse.h | 67 - + arch/ia64/include/uapi/asm/setup.h | 25 - + arch/ia64/include/uapi/asm/sigcontext.h | 71 - + arch/ia64/include/uapi/asm/siginfo.h | 28 - + arch/ia64/include/uapi/asm/signal.h | 98 - + arch/ia64/include/uapi/asm/stat.h | 52 - + arch/ia64/include/uapi/asm/statfs.h | 21 - + arch/ia64/include/uapi/asm/swab.h | 35 - + arch/ia64/include/uapi/asm/types.h | 32 - + arch/ia64/include/uapi/asm/ucontext.h | 13 - + arch/ia64/include/uapi/asm/unistd.h | 22 - + arch/ia64/include/uapi/asm/ustack.h | 13 - + arch/ia64/install.sh | 30 - + arch/ia64/kernel/.gitignore | 3 - + arch/ia64/kernel/Makefile | 46 - + arch/ia64/kernel/Makefile.gate | 29 - + arch/ia64/kernel/acpi-ext.c | 101 - + arch/ia64/kernel/acpi.c | 913 -------- + arch/ia64/kernel/asm-offsets.c | 289 --- + arch/ia64/kernel/audit.c | 63 - + arch/ia64/kernel/brl_emu.c | 217 -- + arch/ia64/kernel/crash.c | 257 --- + arch/ia64/kernel/crash_dump.c | 27 - + arch/ia64/kernel/cyclone.c | 125 -- + arch/ia64/kernel/dma-mapping.c | 9 - + arch/ia64/kernel/efi.c | 1360 ------------ + arch/ia64/kernel/efi_stub.S | 87 - + arch/ia64/kernel/elfcore.c | 77 - + arch/ia64/kernel/entry.S | 1427 ------------ + arch/ia64/kernel/entry.h | 83 - + arch/ia64/kernel/err_inject.c | 273 --- + arch/ia64/kernel/esi.c | 193 -- + arch/ia64/kernel/esi_stub.S | 99 - + arch/ia64/kernel/fsys.S | 837 ------- + arch/ia64/kernel/fsyscall_gtod_data.h | 30 - + arch/ia64/kernel/ftrace.c | 196 -- + arch/ia64/kernel/gate-data.S | 3 - + arch/ia64/kernel/gate.S | 380 ---- + arch/ia64/kernel/gate.lds.S | 108 - + arch/ia64/kernel/head.S | 1167 ---------- + arch/ia64/kernel/iosapic.c | 1137 ---------- + arch/ia64/kernel/irq.c | 181 -- + arch/ia64/kernel/irq.h | 3 - + arch/ia64/kernel/irq_ia64.c | 645 ------ + arch/ia64/kernel/irq_lsapic.c | 45 - + arch/ia64/kernel/ivt.S | 1688 -------------- + arch/ia64/kernel/kprobes.c | 911 -------- + arch/ia64/kernel/machine_kexec.c | 163 -- + arch/ia64/kernel/mca.c | 2111 ------------------ + arch/ia64/kernel/mca_asm.S | 1123 ---------- + arch/ia64/kernel/mca_drv.c | 796 ------- + arch/ia64/kernel/mca_drv.h | 123 -- + arch/ia64/kernel/mca_drv_asm.S | 56 - + arch/ia64/kernel/minstate.h | 251 --- + arch/ia64/kernel/module.c | 959 -------- + arch/ia64/kernel/msi_ia64.c | 198 -- + arch/ia64/kernel/numa.c | 73 - + arch/ia64/kernel/pal.S | 306 --- + arch/ia64/kernel/palinfo.c | 942 -------- + arch/ia64/kernel/patch.c | 237 -- + arch/ia64/kernel/pci-dma.c | 33 - + arch/ia64/kernel/perfmon_itanium.h | 116 - + arch/ia64/kernel/process.c | 611 ------ + arch/ia64/kernel/ptrace.c | 2012 ----------------- + arch/ia64/kernel/relocate_kernel.S | 321 --- + arch/ia64/kernel/sal.c | 400 ---- + arch/ia64/kernel/salinfo.c | 646 ------ + arch/ia64/kernel/setup.c | 1081 --------- + arch/ia64/kernel/sigframe.h | 26 - + arch/ia64/kernel/signal.c | 412 ---- + arch/ia64/kernel/smp.c | 335 --- + arch/ia64/kernel/smpboot.c | 839 ------- + arch/ia64/kernel/stacktrace.c | 40 - + arch/ia64/kernel/sys_ia64.c | 197 -- + arch/ia64/kernel/syscalls/Makefile | 32 - + arch/ia64/kernel/syscalls/syscall.tbl | 375 ---- + arch/ia64/kernel/time.c | 463 ---- + arch/ia64/kernel/topology.c | 410 ---- + arch/ia64/kernel/traps.c | 612 ------ + arch/ia64/kernel/unaligned.c | 1560 ------------- + arch/ia64/kernel/uncached.c | 273 --- + arch/ia64/kernel/unwind.c | 2320 -------------------- + arch/ia64/kernel/unwind_decoder.c | 460 ---- + arch/ia64/kernel/unwind_i.h | 165 -- + arch/ia64/kernel/vmlinux.lds.S | 224 -- + arch/ia64/lib/Makefile | 48 - + arch/ia64/lib/checksum.c | 102 - + arch/ia64/lib/clear_page.S | 79 - + arch/ia64/lib/clear_user.S | 212 -- + arch/ia64/lib/copy_page.S | 101 - + arch/ia64/lib/copy_page_mck.S | 188 -- + arch/ia64/lib/copy_user.S | 613 ------ + arch/ia64/lib/csum_partial_copy.c | 98 - + arch/ia64/lib/do_csum.S | 324 --- + arch/ia64/lib/flush.S | 119 - + arch/ia64/lib/idiv32.S | 86 - + arch/ia64/lib/idiv64.S | 83 - + arch/ia64/lib/io.c | 51 - + arch/ia64/lib/ip_fast_csum.S | 148 -- + arch/ia64/lib/memcpy.S | 304 --- + arch/ia64/lib/memcpy_mck.S | 659 ------ + arch/ia64/lib/memset.S | 365 --- + arch/ia64/lib/strlen.S | 195 -- + arch/ia64/lib/strncpy_from_user.S | 47 - + arch/ia64/lib/strnlen_user.S | 48 - + arch/ia64/lib/xor.S | 181 -- + arch/ia64/mm/Makefile | 11 - + arch/ia64/mm/contig.c | 208 -- + arch/ia64/mm/discontig.c | 635 ------ + arch/ia64/mm/extable.c | 24 - + arch/ia64/mm/fault.c | 251 --- + arch/ia64/mm/hugetlbpage.c | 186 -- + arch/ia64/mm/init.c | 532 ----- + arch/ia64/mm/ioremap.c | 94 - + arch/ia64/mm/numa.c | 80 - + arch/ia64/mm/tlb.c | 591 ----- + arch/ia64/pci/Makefile | 5 - + arch/ia64/pci/fixup.c | 80 - + arch/ia64/pci/pci.c | 576 ----- + arch/ia64/scripts/check-gas | 16 - + arch/ia64/scripts/check-gas-asm.S | 2 - + arch/ia64/scripts/check-model.c | 1 - + arch/ia64/scripts/check-segrel.S | 5 - + arch/ia64/scripts/check-segrel.lds | 13 - + arch/ia64/scripts/check-serialize.S | 2 - + arch/ia64/scripts/check-text-align.S | 7 - + arch/ia64/scripts/toolchain-flags | 54 - + arch/ia64/scripts/unwcheck.py | 65 - + arch/ia64/uv/Makefile | 12 - + arch/ia64/uv/kernel/Makefile | 12 - + arch/ia64/uv/kernel/setup.c | 120 - + arch/m68k/kernel/syscalls/syscall.tbl | 3 +- + arch/microblaze/kernel/syscalls/syscall.tbl | 3 +- + arch/mips/kernel/syscalls/syscall_n32.tbl | 3 +- + arch/mips/kernel/syscalls/syscall_n64.tbl | 3 +- + arch/mips/kernel/syscalls/syscall_o32.tbl | 3 +- + arch/parisc/kernel/syscalls/syscall.tbl | 3 +- + arch/powerpc/kernel/syscalls/syscall.tbl | 3 +- + arch/s390/kernel/syscalls/syscall.tbl | 3 +- + arch/sh/kernel/syscalls/syscall.tbl | 3 +- + arch/sparc/kernel/syscalls/syscall.tbl | 3 +- + arch/x86/entry/syscalls/syscall_32.tbl | 3 +- + arch/x86/entry/syscalls/syscall_64.tbl | 2 +- + arch/xtensa/kernel/syscalls/syscall.tbl | 3 +- + drivers/acpi/Kconfig | 6 +- + drivers/acpi/numa/Kconfig | 4 +- + drivers/acpi/osl.c | 2 +- + drivers/char/Kconfig | 4 +- + drivers/char/Makefile | 1 - + drivers/char/agp/Kconfig | 16 +- + drivers/char/agp/Makefile | 2 - + drivers/char/agp/hp-agp.c | 550 ----- + drivers/char/agp/i460-agp.c | 659 ------ + drivers/char/hpet.c | 30 - + drivers/char/hw_random/Kconfig | 2 +- + drivers/char/mem.c | 12 - + drivers/char/mspec.c | 295 --- + drivers/cpufreq/Kconfig | 11 - + drivers/cpufreq/Makefile | 1 - + drivers/cpufreq/ia64-acpi-cpufreq.c | 353 --- + drivers/firmware/Kconfig | 24 - + drivers/firmware/Makefile | 1 - + drivers/firmware/efi/Kconfig | 6 +- + drivers/firmware/efi/efi.c | 13 +- + drivers/firmware/pcdp.c | 135 -- + drivers/firmware/pcdp.h | 108 - + drivers/gpu/drm/drm_ioc32.c | 4 +- + drivers/input/serio/i8042.h | 2 +- + drivers/iommu/Kconfig | 4 +- + drivers/iommu/intel/Kconfig | 2 +- + drivers/media/cec/platform/Kconfig | 2 +- + drivers/misc/Kconfig | 2 +- + drivers/misc/sgi-gru/gru.h | 4 +- + drivers/misc/sgi-gru/gru_instructions.h | 12 +- + drivers/misc/sgi-gru/grufile.c | 72 - + drivers/misc/sgi-gru/gruhandles.c | 6 - + drivers/misc/sgi-gru/grumain.c | 4 - + drivers/misc/sgi-xp/xp.h | 2 +- + drivers/misc/sgi-xp/xp_uv.c | 24 - + drivers/misc/sgi-xp/xpc_main.c | 31 - + drivers/misc/sgi-xp/xpc_uv.c | 85 - + drivers/net/ethernet/broadcom/tg3.c | 2 +- + drivers/net/ethernet/brocade/bna/bnad.h | 1 - + .../net/ethernet/qlogic/netxen/netxen_nic_main.c | 2 - + drivers/pci/vgaarb.c | 2 +- + drivers/tty/serial/8250/Kconfig | 2 +- + drivers/tty/vt/keyboard.c | 2 +- + drivers/video/fbdev/Kconfig | 2 +- + drivers/watchdog/Kconfig | 2 +- + fs/Kconfig | 2 +- + fs/afs/main.c | 2 - + fs/xfs/xfs_ioctl32.h | 2 +- + include/asm-generic/Kbuild | 2 +- + include/linux/acpi.h | 9 +- + include/linux/compat.h | 1 - + include/linux/efi.h | 7 - + include/linux/mm.h | 2 - + include/linux/moduleparam.h | 2 +- + include/linux/raid/pq.h | 2 - + include/linux/sched/signal.h | 17 +- + include/linux/syscalls.h | 1 - + include/trace/events/mmflags.h | 2 +- + include/uapi/asm-generic/siginfo.h | 5 - + include/uapi/asm-generic/unistd.h | 7 +- + init/Kconfig | 2 +- + kernel/cpu.c | 3 - + kernel/fork.c | 2 +- + kernel/sched/core.c | 29 +- + kernel/signal.c | 25 +- + kernel/sys_ni.c | 2 - + kernel/sysctl.c | 9 - + lib/Kconfig.debug | 2 +- + lib/decompress_unxz.c | 3 - + lib/raid6/Makefile | 4 +- + lib/raid6/algos.c | 4 - + lib/raid6/int.uc | 9 - + lib/xz/Kconfig | 5 - + mm/mmap.c | 6 +- + scripts/headers_install.sh | 1 - + tools/arch/ia64/include/asm/barrier.h | 59 - + tools/arch/ia64/include/uapi/asm/bitsperlong.h | 9 - + tools/arch/ia64/include/uapi/asm/mman.h | 7 - + tools/include/uapi/asm-generic/unistd.h | 2 +- + .../perf/arch/mips/entry/syscalls/syscall_n64.tbl | 2 +- + tools/perf/arch/powerpc/entry/syscalls/syscall.tbl | 2 +- + tools/perf/arch/s390/entry/syscalls/syscall.tbl | 2 +- + tools/perf/arch/x86/entry/syscalls/syscall_64.tbl | 2 +- + usr/include/Makefile | 6 - + 454 files changed, 144 insertions(+), 65215 deletions(-) + delete mode 100644 Documentation/arch/ia64/aliasing.rst + delete mode 100644 Documentation/arch/ia64/efirtc.rst + delete mode 100644 Documentation/arch/ia64/err_inject.rst + delete mode 100644 Documentation/arch/ia64/features.rst + delete mode 100644 Documentation/arch/ia64/fsys.rst + delete mode 100644 Documentation/arch/ia64/ia64.rst + delete mode 100644 Documentation/arch/ia64/index.rst + delete mode 100644 Documentation/arch/ia64/irq-redir.rst + delete mode 100644 Documentation/arch/ia64/mca.rst + delete mode 100644 Documentation/arch/ia64/serial.rst + create mode 100644 arch/hexagon/include/asm/ptrace.h + delete mode 100644 arch/ia64/Kbuild + delete mode 100644 arch/ia64/Kconfig + delete mode 100644 arch/ia64/Kconfig.debug + delete mode 100644 arch/ia64/Makefile + delete mode 100644 arch/ia64/configs/bigsur_defconfig + delete mode 100644 arch/ia64/configs/generic_defconfig + delete mode 100644 arch/ia64/configs/gensparse_defconfig + delete mode 100644 arch/ia64/configs/tiger_defconfig + delete mode 100644 arch/ia64/configs/zx1_defconfig + delete mode 100644 arch/ia64/hp/common/Makefile + delete mode 100644 arch/ia64/hp/common/aml_nfw.c + delete mode 100644 arch/ia64/hp/common/sba_iommu.c + delete mode 100644 arch/ia64/include/asm/Kbuild + delete mode 100644 arch/ia64/include/asm/acenv.h + delete mode 100644 arch/ia64/include/asm/acpi-ext.h + delete mode 100644 arch/ia64/include/asm/acpi.h + delete mode 100644 arch/ia64/include/asm/asm-offsets.h + delete mode 100644 arch/ia64/include/asm/asm-prototypes.h + delete mode 100644 arch/ia64/include/asm/asmmacro.h + delete mode 100644 arch/ia64/include/asm/atomic.h + delete mode 100644 arch/ia64/include/asm/barrier.h + delete mode 100644 arch/ia64/include/asm/bitops.h + delete mode 100644 arch/ia64/include/asm/bug.h + delete mode 100644 arch/ia64/include/asm/cache.h + delete mode 100644 arch/ia64/include/asm/cacheflush.h + delete mode 100644 arch/ia64/include/asm/checksum.h + delete mode 100644 arch/ia64/include/asm/clocksource.h + delete mode 100644 arch/ia64/include/asm/cmpxchg.h + delete mode 100644 arch/ia64/include/asm/cpu.h + delete mode 100644 arch/ia64/include/asm/cputime.h + delete mode 100644 arch/ia64/include/asm/current.h + delete mode 100644 arch/ia64/include/asm/cyclone.h + delete mode 100644 arch/ia64/include/asm/delay.h + delete mode 100644 arch/ia64/include/asm/device.h + delete mode 100644 arch/ia64/include/asm/div64.h + delete mode 100644 arch/ia64/include/asm/dma-mapping.h + delete mode 100644 arch/ia64/include/asm/dma.h + delete mode 100644 arch/ia64/include/asm/dmi.h + delete mode 100644 arch/ia64/include/asm/early_ioremap.h + delete mode 100644 arch/ia64/include/asm/efi.h + delete mode 100644 arch/ia64/include/asm/elf.h + delete mode 100644 arch/ia64/include/asm/emergency-restart.h + delete mode 100644 arch/ia64/include/asm/esi.h + delete mode 100644 arch/ia64/include/asm/exception.h + delete mode 100644 arch/ia64/include/asm/extable.h + delete mode 100644 arch/ia64/include/asm/fb.h + delete mode 100644 arch/ia64/include/asm/fpswa.h + delete mode 100644 arch/ia64/include/asm/ftrace.h + delete mode 100644 arch/ia64/include/asm/futex.h + delete mode 100644 arch/ia64/include/asm/gcc_intrin.h + delete mode 100644 arch/ia64/include/asm/hardirq.h + delete mode 100644 arch/ia64/include/asm/hugetlb.h + delete mode 100644 arch/ia64/include/asm/hw_irq.h + delete mode 100644 arch/ia64/include/asm/idle.h + delete mode 100644 arch/ia64/include/asm/intrinsics.h + delete mode 100644 arch/ia64/include/asm/io.h + delete mode 100644 arch/ia64/include/asm/iommu.h + delete mode 100644 arch/ia64/include/asm/iosapic.h + delete mode 100644 arch/ia64/include/asm/irq.h + delete mode 100644 arch/ia64/include/asm/irq_regs.h + delete mode 100644 arch/ia64/include/asm/irq_remapping.h + delete mode 100644 arch/ia64/include/asm/irqflags.h + delete mode 100644 arch/ia64/include/asm/kdebug.h + delete mode 100644 arch/ia64/include/asm/kexec.h + delete mode 100644 arch/ia64/include/asm/kprobes.h + delete mode 100644 arch/ia64/include/asm/kregs.h + delete mode 100644 arch/ia64/include/asm/libata-portmap.h + delete mode 100644 arch/ia64/include/asm/linkage.h + delete mode 100644 arch/ia64/include/asm/local.h + delete mode 100644 arch/ia64/include/asm/mca.h + delete mode 100644 arch/ia64/include/asm/mca_asm.h + delete mode 100644 arch/ia64/include/asm/meminit.h + delete mode 100644 arch/ia64/include/asm/mman.h + delete mode 100644 arch/ia64/include/asm/mmiowb.h + delete mode 100644 arch/ia64/include/asm/mmu.h + delete mode 100644 arch/ia64/include/asm/mmu_context.h + delete mode 100644 arch/ia64/include/asm/mmzone.h + delete mode 100644 arch/ia64/include/asm/module.h + delete mode 100644 arch/ia64/include/asm/module.lds.h + delete mode 100644 arch/ia64/include/asm/msidef.h + delete mode 100644 arch/ia64/include/asm/native/inst.h + delete mode 100644 arch/ia64/include/asm/native/irq.h + delete mode 100644 arch/ia64/include/asm/native/patchlist.h + delete mode 100644 arch/ia64/include/asm/nodedata.h + delete mode 100644 arch/ia64/include/asm/numa.h + delete mode 100644 arch/ia64/include/asm/page.h + delete mode 100644 arch/ia64/include/asm/pal.h + delete mode 100644 arch/ia64/include/asm/param.h + delete mode 100644 arch/ia64/include/asm/parport.h + delete mode 100644 arch/ia64/include/asm/patch.h + delete mode 100644 arch/ia64/include/asm/pci.h + delete mode 100644 arch/ia64/include/asm/percpu.h + delete mode 100644 arch/ia64/include/asm/pgalloc.h + delete mode 100644 arch/ia64/include/asm/pgtable.h + delete mode 100644 arch/ia64/include/asm/processor.h + delete mode 100644 arch/ia64/include/asm/ptrace.h + delete mode 100644 arch/ia64/include/asm/sal.h + delete mode 100644 arch/ia64/include/asm/sections.h + delete mode 100644 arch/ia64/include/asm/serial.h + delete mode 100644 arch/ia64/include/asm/shmparam.h + delete mode 100644 arch/ia64/include/asm/signal.h + delete mode 100644 arch/ia64/include/asm/smp.h + delete mode 100644 arch/ia64/include/asm/sn/intr.h + delete mode 100644 arch/ia64/include/asm/sn/sn_sal.h + delete mode 100644 arch/ia64/include/asm/sparsemem.h + delete mode 100644 arch/ia64/include/asm/spinlock.h + delete mode 100644 arch/ia64/include/asm/spinlock_types.h + delete mode 100644 arch/ia64/include/asm/string.h + delete mode 100644 arch/ia64/include/asm/switch_to.h + delete mode 100644 arch/ia64/include/asm/syscall.h + delete mode 100644 arch/ia64/include/asm/thread_info.h + delete mode 100644 arch/ia64/include/asm/timex.h + delete mode 100644 arch/ia64/include/asm/tlb.h + delete mode 100644 arch/ia64/include/asm/tlbflush.h + delete mode 100644 arch/ia64/include/asm/topology.h + delete mode 100644 arch/ia64/include/asm/types.h + delete mode 100644 arch/ia64/include/asm/uaccess.h + delete mode 100644 arch/ia64/include/asm/uncached.h + delete mode 100644 arch/ia64/include/asm/unistd.h + delete mode 100644 arch/ia64/include/asm/unwind.h + delete mode 100644 arch/ia64/include/asm/user.h + delete mode 100644 arch/ia64/include/asm/ustack.h + delete mode 100644 arch/ia64/include/asm/uv/uv.h + delete mode 100644 arch/ia64/include/asm/uv/uv_hub.h + delete mode 100644 arch/ia64/include/asm/uv/uv_mmrs.h + delete mode 100644 arch/ia64/include/asm/vermagic.h + delete mode 100644 arch/ia64/include/asm/vga.h + delete mode 100644 arch/ia64/include/asm/vmalloc.h + delete mode 100644 arch/ia64/include/asm/xor.h + delete mode 100644 arch/ia64/include/asm/xtp.h + delete mode 100644 arch/ia64/include/uapi/asm/Kbuild + delete mode 100644 arch/ia64/include/uapi/asm/auxvec.h + delete mode 100644 arch/ia64/include/uapi/asm/bitsperlong.h + delete mode 100644 arch/ia64/include/uapi/asm/break.h + delete mode 100644 arch/ia64/include/uapi/asm/byteorder.h + delete mode 100644 arch/ia64/include/uapi/asm/cmpxchg.h + delete mode 100644 arch/ia64/include/uapi/asm/fcntl.h + delete mode 100644 arch/ia64/include/uapi/asm/fpu.h + delete mode 100644 arch/ia64/include/uapi/asm/gcc_intrin.h + delete mode 100644 arch/ia64/include/uapi/asm/ia64regs.h + delete mode 100644 arch/ia64/include/uapi/asm/intrinsics.h + delete mode 100644 arch/ia64/include/uapi/asm/mman.h + delete mode 100644 arch/ia64/include/uapi/asm/param.h + delete mode 100644 arch/ia64/include/uapi/asm/posix_types.h + delete mode 100644 arch/ia64/include/uapi/asm/ptrace.h + delete mode 100644 arch/ia64/include/uapi/asm/ptrace_offsets.h + delete mode 100644 arch/ia64/include/uapi/asm/resource.h + delete mode 100644 arch/ia64/include/uapi/asm/rse.h + delete mode 100644 arch/ia64/include/uapi/asm/setup.h + delete mode 100644 arch/ia64/include/uapi/asm/sigcontext.h + delete mode 100644 arch/ia64/include/uapi/asm/siginfo.h + delete mode 100644 arch/ia64/include/uapi/asm/signal.h + delete mode 100644 arch/ia64/include/uapi/asm/stat.h + delete mode 100644 arch/ia64/include/uapi/asm/statfs.h + delete mode 100644 arch/ia64/include/uapi/asm/swab.h + delete mode 100644 arch/ia64/include/uapi/asm/types.h + delete mode 100644 arch/ia64/include/uapi/asm/ucontext.h + delete mode 100644 arch/ia64/include/uapi/asm/unistd.h + delete mode 100644 arch/ia64/include/uapi/asm/ustack.h + delete mode 100755 arch/ia64/install.sh + delete mode 100644 arch/ia64/kernel/.gitignore + delete mode 100644 arch/ia64/kernel/Makefile + delete mode 100644 arch/ia64/kernel/Makefile.gate + delete mode 100644 arch/ia64/kernel/acpi-ext.c + delete mode 100644 arch/ia64/kernel/acpi.c + delete mode 100644 arch/ia64/kernel/asm-offsets.c + delete mode 100644 arch/ia64/kernel/audit.c + delete mode 100644 arch/ia64/kernel/brl_emu.c + delete mode 100644 arch/ia64/kernel/crash.c + delete mode 100644 arch/ia64/kernel/crash_dump.c + delete mode 100644 arch/ia64/kernel/cyclone.c + delete mode 100644 arch/ia64/kernel/dma-mapping.c + delete mode 100644 arch/ia64/kernel/efi.c + delete mode 100644 arch/ia64/kernel/efi_stub.S + delete mode 100644 arch/ia64/kernel/elfcore.c + delete mode 100644 arch/ia64/kernel/entry.S + delete mode 100644 arch/ia64/kernel/entry.h + delete mode 100644 arch/ia64/kernel/err_inject.c + delete mode 100644 arch/ia64/kernel/esi.c + delete mode 100644 arch/ia64/kernel/esi_stub.S + delete mode 100644 arch/ia64/kernel/fsys.S + delete mode 100644 arch/ia64/kernel/fsyscall_gtod_data.h + delete mode 100644 arch/ia64/kernel/ftrace.c + delete mode 100644 arch/ia64/kernel/gate-data.S + delete mode 100644 arch/ia64/kernel/gate.S + delete mode 100644 arch/ia64/kernel/gate.lds.S + delete mode 100644 arch/ia64/kernel/head.S + delete mode 100644 arch/ia64/kernel/iosapic.c + delete mode 100644 arch/ia64/kernel/irq.c + delete mode 100644 arch/ia64/kernel/irq.h + delete mode 100644 arch/ia64/kernel/irq_ia64.c + delete mode 100644 arch/ia64/kernel/irq_lsapic.c + delete mode 100644 arch/ia64/kernel/ivt.S + delete mode 100644 arch/ia64/kernel/kprobes.c + delete mode 100644 arch/ia64/kernel/machine_kexec.c + delete mode 100644 arch/ia64/kernel/mca.c + delete mode 100644 arch/ia64/kernel/mca_asm.S + delete mode 100644 arch/ia64/kernel/mca_drv.c + delete mode 100644 arch/ia64/kernel/mca_drv.h + delete mode 100644 arch/ia64/kernel/mca_drv_asm.S + delete mode 100644 arch/ia64/kernel/minstate.h + delete mode 100644 arch/ia64/kernel/module.c + delete mode 100644 arch/ia64/kernel/msi_ia64.c + delete mode 100644 arch/ia64/kernel/numa.c + delete mode 100644 arch/ia64/kernel/pal.S + delete mode 100644 arch/ia64/kernel/palinfo.c + delete mode 100644 arch/ia64/kernel/patch.c + delete mode 100644 arch/ia64/kernel/pci-dma.c + delete mode 100644 arch/ia64/kernel/perfmon_itanium.h + delete mode 100644 arch/ia64/kernel/process.c + delete mode 100644 arch/ia64/kernel/ptrace.c + delete mode 100644 arch/ia64/kernel/relocate_kernel.S + delete mode 100644 arch/ia64/kernel/sal.c + delete mode 100644 arch/ia64/kernel/salinfo.c + delete mode 100644 arch/ia64/kernel/setup.c + delete mode 100644 arch/ia64/kernel/sigframe.h + delete mode 100644 arch/ia64/kernel/signal.c + delete mode 100644 arch/ia64/kernel/smp.c + delete mode 100644 arch/ia64/kernel/smpboot.c + delete mode 100644 arch/ia64/kernel/stacktrace.c + delete mode 100644 arch/ia64/kernel/sys_ia64.c + delete mode 100644 arch/ia64/kernel/syscalls/Makefile + delete mode 100644 arch/ia64/kernel/syscalls/syscall.tbl + delete mode 100644 arch/ia64/kernel/time.c + delete mode 100644 arch/ia64/kernel/topology.c + delete mode 100644 arch/ia64/kernel/traps.c + delete mode 100644 arch/ia64/kernel/unaligned.c + delete mode 100644 arch/ia64/kernel/uncached.c + delete mode 100644 arch/ia64/kernel/unwind.c + delete mode 100644 arch/ia64/kernel/unwind_decoder.c + delete mode 100644 arch/ia64/kernel/unwind_i.h + delete mode 100644 arch/ia64/kernel/vmlinux.lds.S + delete mode 100644 arch/ia64/lib/Makefile + delete mode 100644 arch/ia64/lib/checksum.c + delete mode 100644 arch/ia64/lib/clear_page.S + delete mode 100644 arch/ia64/lib/clear_user.S + delete mode 100644 arch/ia64/lib/copy_page.S + delete mode 100644 arch/ia64/lib/copy_page_mck.S + delete mode 100644 arch/ia64/lib/copy_user.S + delete mode 100644 arch/ia64/lib/csum_partial_copy.c + delete mode 100644 arch/ia64/lib/do_csum.S + delete mode 100644 arch/ia64/lib/flush.S + delete mode 100644 arch/ia64/lib/idiv32.S + delete mode 100644 arch/ia64/lib/idiv64.S + delete mode 100644 arch/ia64/lib/io.c + delete mode 100644 arch/ia64/lib/ip_fast_csum.S + delete mode 100644 arch/ia64/lib/memcpy.S + delete mode 100644 arch/ia64/lib/memcpy_mck.S + delete mode 100644 arch/ia64/lib/memset.S + delete mode 100644 arch/ia64/lib/strlen.S + delete mode 100644 arch/ia64/lib/strncpy_from_user.S + delete mode 100644 arch/ia64/lib/strnlen_user.S + delete mode 100644 arch/ia64/lib/xor.S + delete mode 100644 arch/ia64/mm/Makefile + delete mode 100644 arch/ia64/mm/contig.c + delete mode 100644 arch/ia64/mm/discontig.c + delete mode 100644 arch/ia64/mm/extable.c + delete mode 100644 arch/ia64/mm/fault.c + delete mode 100644 arch/ia64/mm/hugetlbpage.c + delete mode 100644 arch/ia64/mm/init.c + delete mode 100644 arch/ia64/mm/ioremap.c + delete mode 100644 arch/ia64/mm/numa.c + delete mode 100644 arch/ia64/mm/tlb.c + delete mode 100644 arch/ia64/pci/Makefile + delete mode 100644 arch/ia64/pci/fixup.c + delete mode 100644 arch/ia64/pci/pci.c + delete mode 100755 arch/ia64/scripts/check-gas + delete mode 100644 arch/ia64/scripts/check-gas-asm.S + delete mode 100644 arch/ia64/scripts/check-model.c + delete mode 100644 arch/ia64/scripts/check-segrel.S + delete mode 100644 arch/ia64/scripts/check-segrel.lds + delete mode 100644 arch/ia64/scripts/check-serialize.S + delete mode 100644 arch/ia64/scripts/check-text-align.S + delete mode 100755 arch/ia64/scripts/toolchain-flags + delete mode 100644 arch/ia64/scripts/unwcheck.py + delete mode 100644 arch/ia64/uv/Makefile + delete mode 100644 arch/ia64/uv/kernel/Makefile + delete mode 100644 arch/ia64/uv/kernel/setup.c + delete mode 100644 drivers/char/agp/hp-agp.c + delete mode 100644 drivers/char/agp/i460-agp.c + delete mode 100644 drivers/char/mspec.c + delete mode 100644 drivers/cpufreq/ia64-acpi-cpufreq.c + delete mode 100644 drivers/firmware/pcdp.c + delete mode 100644 drivers/firmware/pcdp.h + delete mode 100644 tools/arch/ia64/include/asm/barrier.h + delete mode 100644 tools/arch/ia64/include/uapi/asm/bitsperlong.h + delete mode 100644 tools/arch/ia64/include/uapi/asm/mman.h +Merging arc/for-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git arc/for-next +Already up to date. +Merging arm/for-next (c7368ddba2ff ARM: 9326/1: make self-contained for ARM) +$ git merge -m Merge branch 'for-next' of git://git.armlinux.org.uk/~rmk/linux-arm.git arm/for-next +Auto-merging arch/arm/kernel/setup.c +Merge made by the 'ort' strategy. + arch/arm/common/sa1111.c | 27 ++++++++++++++------------- + arch/arm/include/asm/dma.h | 3 +++ + arch/arm/include/asm/domain.h | 2 +- + arch/arm/include/asm/exception.h | 4 ---- + arch/arm/include/asm/traps.h | 3 ++- + arch/arm/include/asm/uaccess.h | 15 +++------------ + arch/arm/kernel/devtree.c | 1 - + arch/arm/kernel/setup.c | 2 +- + arch/arm/lib/memset.S | 1 + + 9 files changed, 25 insertions(+), 33 deletions(-) +Merging arm64/for-next/core (14dcf78a6c04 Merge branch 'for-next/cpus_have_const_cap' into for-next/core) +$ git merge -m Merge branch 'for-next/core' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux arm64/for-next/core +Auto-merging arch/arm64/Kconfig +Auto-merging arch/arm64/include/asm/cputype.h +Auto-merging arch/arm64/kernel/cpu_errata.c +Auto-merging arch/arm64/kernel/mte.c +Auto-merging arch/arm64/kvm/sys_regs.c +Auto-merging arch/arm64/mm/hugetlbpage.c +Auto-merging arch/arm64/mm/init.c +Auto-merging arch/arm64/tools/cpucaps +Auto-merging drivers/irqchip/irq-gic-v3.c +Auto-merging drivers/perf/arm-cmn.c +Auto-merging include/linux/acpi.h +Merge made by the 'ort' strategy. + Documentation/admin-guide/perf/ampere_cspmu.rst | 29 +++ + Documentation/admin-guide/perf/index.rst | 1 + + Documentation/arch/arm64/cpu-feature-registers.rst | 2 + + Documentation/arch/arm64/elf_hwcaps.rst | 9 + + arch/arm/xen/enlighten.c | 25 +- + arch/arm64/Kconfig | 2 + + arch/arm64/include/asm/Kbuild | 2 +- + arch/arm64/include/asm/alternative-macros.h | 8 +- + arch/arm64/include/asm/arch_gicv3.h | 8 + + arch/arm64/include/asm/archrandom.h | 2 +- + arch/arm64/include/asm/cacheflush.h | 2 +- + arch/arm64/include/asm/cpu.h | 6 - + arch/arm64/include/asm/cpucaps.h | 67 +++++ + arch/arm64/include/asm/cpufeature.h | 98 ++++---- + arch/arm64/include/asm/cputype.h | 3 +- + arch/arm64/include/asm/fpsimd.h | 36 ++- + arch/arm64/include/asm/hwcap.h | 3 + + arch/arm64/include/asm/irq.h | 3 + + arch/arm64/include/asm/irqflags.h | 20 +- + arch/arm64/include/asm/kvm_emulate.h | 4 +- + arch/arm64/include/asm/kvm_host.h | 2 +- + arch/arm64/include/asm/kvm_mmu.h | 2 +- + arch/arm64/include/asm/lse.h | 9 +- + arch/arm64/include/asm/mmu.h | 2 +- + arch/arm64/include/asm/mmu_context.h | 28 ++- + arch/arm64/include/asm/module.h | 3 +- + arch/arm64/include/asm/mte.h | 4 +- + arch/arm64/include/asm/pgtable-prot.h | 6 +- + arch/arm64/include/asm/pgtable.h | 34 ++- + arch/arm64/include/asm/smp.h | 4 +- + arch/arm64/include/asm/spectre.h | 2 +- + arch/arm64/include/asm/tlbflush.h | 7 +- + arch/arm64/include/asm/vectors.h | 2 +- + arch/arm64/include/uapi/asm/hwcap.h | 3 + + arch/arm64/kernel/acpi_parking_protocol.c | 2 +- + arch/arm64/kernel/cpu_errata.c | 17 -- + arch/arm64/kernel/cpufeature.c | 272 ++++++++++----------- + arch/arm64/kernel/cpuinfo.c | 3 + + arch/arm64/kernel/efi.c | 3 +- + arch/arm64/kernel/fpsimd.c | 149 +++++------ + arch/arm64/kernel/idle.c | 4 +- + arch/arm64/kernel/module-plts.c | 13 +- + arch/arm64/kernel/mte.c | 4 +- + arch/arm64/kernel/process.c | 2 +- + arch/arm64/kernel/proton-pack.c | 2 +- + arch/arm64/kernel/smp.c | 147 ++++++++--- + arch/arm64/kernel/suspend.c | 13 +- + arch/arm64/kernel/sys_compat.c | 2 +- + arch/arm64/kernel/traps.c | 2 +- + arch/arm64/kernel/vdso.c | 2 +- + arch/arm64/kvm/arm.c | 10 +- + arch/arm64/kvm/guest.c | 6 +- + arch/arm64/kvm/hyp/pgtable.c | 4 +- + arch/arm64/kvm/mmu.c | 2 +- + arch/arm64/kvm/sys_regs.c | 2 +- + arch/arm64/kvm/vgic/vgic-v3.c | 2 +- + arch/arm64/lib/delay.c | 2 +- + arch/arm64/mm/fault.c | 2 +- + arch/arm64/mm/hugetlbpage.c | 3 +- + arch/arm64/mm/init.c | 11 +- + arch/arm64/mm/mmap.c | 2 +- + arch/arm64/mm/mmu.c | 3 +- + arch/arm64/mm/proc.S | 3 +- + arch/arm64/tools/Makefile | 4 +- + arch/arm64/tools/cpucaps | 2 +- + arch/arm64/tools/gen-cpucaps.awk | 6 +- + arch/arm64/tools/sysreg | 8 +- + drivers/acpi/processor_core.c | 2 +- + drivers/clocksource/arm_arch_timer.c | 36 ++- + drivers/irqchip/irq-gic-v3.c | 82 ++++--- + drivers/perf/amlogic/meson_g12_ddr_pmu.c | 1 + + drivers/perf/arm-cmn.c | 154 ++++++------ + drivers/perf/arm_cspmu/Kconfig | 19 +- + drivers/perf/arm_cspmu/Makefile | 8 +- + drivers/perf/arm_cspmu/ampere_cspmu.c | 272 +++++++++++++++++++++ + drivers/perf/arm_cspmu/arm_cspmu.c | 201 +++++++++++---- + drivers/perf/arm_cspmu/arm_cspmu.h | 32 ++- + drivers/perf/arm_cspmu/nvidia_cspmu.c | 34 ++- + drivers/perf/arm_cspmu/nvidia_cspmu.h | 17 -- + drivers/perf/arm_pmuv3.c | 46 +--- + drivers/perf/hisilicon/hisi_pcie_pmu.c | 9 +- + drivers/perf/hisilicon/hisi_uncore_pa_pmu.c | 4 +- + drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c | 4 +- + drivers/perf/hisilicon/hns3_pmu.c | 8 +- + drivers/perf/xgene_pmu.c | 37 +-- + include/linux/acpi.h | 5 + + include/linux/cpuhotplug.h | 2 + + tools/testing/selftests/arm64/abi/hwcap.c | 54 ++++ + tools/testing/selftests/arm64/fp/sve-test.S | 19 ++ + 89 files changed, 1459 insertions(+), 734 deletions(-) + create mode 100644 Documentation/admin-guide/perf/ampere_cspmu.rst + create mode 100644 arch/arm64/include/asm/cpucaps.h + create mode 100644 drivers/perf/arm_cspmu/ampere_cspmu.c + delete mode 100644 drivers/perf/arm_cspmu/nvidia_cspmu.h +Merging arm-perf/for-next/perf (b805cafc604b perf: hisi: Fix use-after-free when register pmu fails) +$ git merge -m Merge branch 'for-next/perf' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux.git arm-perf/for-next/perf +Already up to date. +Merging arm-soc/for-next (1b52f65d88ad Merge branch 'soc/defconfig' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git arm-soc/for-next +Auto-merging MAINTAINERS +Auto-merging drivers/firmware/Kconfig +Auto-merging drivers/firmware/Makefile +Merge made by the 'ort' strategy. + .../devicetree/bindings/arm/amd,pensando.yaml | 26 + + Documentation/devicetree/bindings/arm/amlogic.yaml | 3 + + .../devicetree/bindings/arm/aspeed/aspeed.yaml | 1 + + .../devicetree/bindings/arm/atmel-at91.yaml | 7 + + Documentation/devicetree/bindings/arm/cpus.yaml | 4 +- + Documentation/devicetree/bindings/arm/fsl.yaml | 43 +- + .../devicetree/bindings/arm/intel-ixp4xx.yaml | 16 + + .../devicetree/bindings/arm/mediatek.yaml | 16 + + Documentation/devicetree/bindings/arm/qcom.yaml | 55 + + .../devicetree/bindings/arm/rockchip.yaml | 25 + + Documentation/devicetree/bindings/arm/sti.yaml | 23 +- + .../devicetree/bindings/arm/stm32/stm32.yaml | 1 + + Documentation/devicetree/bindings/arm/sunxi.yaml | 16 + + .../bindings/arm/tegra/nvidia,tegra20-pmc.yaml | 393 --- + .../devicetree/bindings/cache/qcom,llcc.yaml | 10 + + .../bindings/clock/qcom,sm8450-camcc.yaml | 8 +- + .../bindings/clock/renesas,rzg2l-cpg.yaml | 1 + + .../devicetree/bindings/firmware/arm,scmi.yaml | 15 +- + .../devicetree/bindings/firmware/qcom,scm.yaml | 10 + + .../interrupt-controller/sifive,plic-1.0.0.yaml | 2 + + .../thead,c900-aclint-mswi.yaml | 43 + + .../bindings/memory-controllers/ingenic,nemc.yaml | 1 + + .../memory-controllers/renesas,rpc-if.yaml | 2 + + .../bindings/memory-controllers/ti,gpmc.yaml | 2 +- + .../bindings/nvmem/allwinner,sun4i-a10-sid.yaml | 4 +- + .../bindings/power/amlogic,meson-sec-pwrc.yaml | 3 +- + .../bindings/power/mediatek,power-controller.yaml | 6 + + .../devicetree/bindings/power/power-domain.yaml | 17 +- + .../devicetree/bindings/power/qcom,rpmpd.yaml | 1 + + .../devicetree/bindings/pwm/pwm-rockchip.yaml | 1 + + .../bindings/reserved-memory/qcom,rmtfs-mem.yaml | 11 + + Documentation/devicetree/bindings/riscv/cpus.yaml | 1 + + .../devicetree/bindings/riscv/sophgo.yaml | 32 + + .../devicetree/bindings/soc/mediatek/mtk-svs.yaml | 1 + + .../devicetree/bindings/soc/qcom/qcom,geni-se.yaml | 2 + + .../bindings/soc/renesas/renesas,rzg2l-sysc.yaml | 1 + + .../devicetree/bindings/soc/renesas/renesas.yaml | 28 +- + .../devicetree/bindings/soc/sti/st,sti-syscon.yaml | 46 + + .../bindings/soc/tegra/nvidia,tegra20-pmc.yaml | 416 +++ + .../devicetree/bindings/timer/sifive,clint.yaml | 1 + + .../bindings/timer/thead,c900-aclint-mtimer.yaml | 43 + + .../devicetree/bindings/vendor-prefixes.yaml | 22 + + MAINTAINERS | 29 + + arch/arm/Kconfig.debug | 12 +- + arch/arm/arm-soc-for-next-contents.txt | 269 ++ + arch/arm/boot/dts/allwinner/Makefile | 1 + + arch/arm/boot/dts/allwinner/sun8i-r40.dtsi | 2 + + .../dts/allwinner/sun8i-v3s-anbernic-rg-nano.dts | 276 ++ + arch/arm/boot/dts/allwinner/sun8i-v3s.dtsi | 35 + + arch/arm/boot/dts/aspeed/Makefile | 1 + + .../boot/dts/aspeed/aspeed-bmc-ampere-mtjade.dts | 66 +- + .../dts/aspeed/aspeed-bmc-ampere-mtmitchell.dts | 302 +- + .../dts/aspeed/aspeed-bmc-facebook-minerva-cmc.dts | 265 ++ + .../arm/boot/dts/aspeed/aspeed-bmc-ibm-bonnell.dts | 8 +- + arch/arm/boot/dts/broadcom/bcm-ns.dtsi | 34 + + .../bcm4708-buffalo-wzr-1166dhp-common.dtsi | 8 + + .../boot/dts/broadcom/bcm4708-luxul-xap-1510.dts | 8 + + .../boot/dts/broadcom/bcm4708-luxul-xwc-1000.dts | 8 + + .../boot/dts/broadcom/bcm4708-netgear-r6250.dts | 8 + + .../boot/dts/broadcom/bcm4708-smartrg-sr400ac.dts | 8 + + .../dts/broadcom/bcm47081-buffalo-wzr-600dhp2.dts | 8 + + .../boot/dts/broadcom/bcm47081-luxul-xap-1410.dts | 8 + + .../boot/dts/broadcom/bcm47081-luxul-xwr-1200.dts | 8 + + .../boot/dts/broadcom/bcm4709-asus-rt-ac87u.dts | 11 + + .../boot/dts/broadcom/bcm4709-linksys-ea9200.dts | 38 + + .../boot/dts/broadcom/bcm4709-netgear-r8000.dts | 18 + + .../boot/dts/broadcom/bcm47094-dlink-dir-885l.dts | 24 + + .../boot/dts/broadcom/bcm47094-dlink-dir-890l.dts | 8 + + .../boot/dts/broadcom/bcm47094-luxul-abr-4500.dts | 8 + + .../boot/dts/broadcom/bcm47094-luxul-xap-1610.dts | 8 + + .../boot/dts/broadcom/bcm47094-luxul-xbr-4500.dts | 8 + + .../boot/dts/broadcom/bcm47094-luxul-xwc-2000.dts | 8 + + .../boot/dts/broadcom/bcm47094-luxul-xwr-3100.dts | 8 + + .../dts/broadcom/bcm47094-luxul-xwr-3150-v1.dts | 8 + + .../arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts | 8 + + .../arm/boot/dts/broadcom/bcm53016-meraki-mr32.dts | 8 + + arch/arm/boot/dts/broadcom/bcm5301x.dtsi | 34 - + arch/arm/boot/dts/broadcom/bcm953012er.dts | 8 + + arch/arm/boot/dts/intel/ixp/Makefile | 3 +- + .../dts/intel/ixp/intel-ixp42x-dlink-dsm-g600.dts | 2 +- + .../dts/intel/ixp/intel-ixp42x-freecom-fsg-3.dts | 2 +- + .../dts/intel/ixp/intel-ixp42x-iomega-nas100d.dts | 2 +- + .../dts/intel/ixp/intel-ixp42x-linksys-nslu2.dts | 4 +- + .../dts/intel/ixp/intel-ixp42x-linksys-wrv54g.dts | 2 +- + .../intel/ixp/intel-ixp42x-usrobotics-usr8200.dts | 251 ++ + arch/arm/boot/dts/mediatek/mt2701-evb.dts | 2 +- + arch/arm/boot/dts/mediatek/mt6323.dtsi | 58 +- + arch/arm/boot/dts/mediatek/mt7623n.dtsi | 4 +- + arch/arm/boot/dts/mediatek/mt7629-rfb.dts | 2 +- + arch/arm/boot/dts/microchip/Makefile | 2 + + .../boot/dts/microchip/at91-sam9x60_curiosity.dts | 4 + + .../boot/dts/microchip/at91-sama5d29_curiosity.dts | 600 ++++ + arch/arm/boot/dts/microchip/sama5d4.dtsi | 2 +- + arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj.dts | 4 +- + arch/arm/boot/dts/nuvoton/nuvoton-npcm730-kudo.dts | 2 +- + .../dts/nuvoton/nuvoton-npcm750-runbmc-olympus.dts | 4 +- + .../boot/dts/nvidia/tegra20-acer-a500-picasso.dts | 2 +- + arch/arm/boot/dts/nvidia/tegra20-asus-tf101.dts | 2 +- + .../boot/dts/nvidia/tegra30-asus-lvds-display.dtsi | 2 +- + arch/arm/boot/dts/nvidia/tegra30-asus-tf700t.dts | 2 +- + arch/arm/boot/dts/nxp/imx/Makefile | 3 + + arch/arm/boot/dts/nxp/imx/imx25.dtsi | 7 +- + .../dts/nxp/imx/imx27-phytec-phycard-s-som.dtsi | 2 +- + .../boot/dts/nxp/imx/imx27-phytec-phycore-som.dtsi | 2 +- + arch/arm/boot/dts/nxp/imx/imx51-zii-rdu1.dts | 4 +- + arch/arm/boot/dts/nxp/imx/imx51.dtsi | 2 +- + .../dts/nxp/imx/imx53-sk-imx53-atm0700d4-lvds.dts | 97 + + .../dts/nxp/imx/imx53-sk-imx53-atm0700d4-rgb.dts | 112 + + .../boot/dts/nxp/imx/imx53-sk-imx53-atm0700d4.dtsi | 45 + + arch/arm/boot/dts/nxp/imx/imx53.dtsi | 4 +- + arch/arm/boot/dts/nxp/imx/imx6q-b650v3.dts | 4 +- + arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts | 4 +- + .../boot/dts/nxp/imx/imx6q-var-mx6customboard.dts | 247 ++ + arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi | 46 +- + arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi | 1 - + arch/arm/boot/dts/nxp/imx/imx6qdl-gw5912.dtsi | 1 - + .../boot/dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi | 2 +- + arch/arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi | 569 ++++ + arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi | 6 +- + .../dts/nxp/imx/imx6ull-colibri-emmc-aster.dts | 1 - + .../dts/nxp/imx/imx6ull-colibri-emmc-eval-v3.dts | 1 - + .../dts/nxp/imx/imx6ull-colibri-emmc-iris-v2.dts | 3 +- + .../boot/dts/nxp/imx/imx6ull-colibri-emmc-iris.dts | 1 - + .../boot/dts/nxp/imx/imx6ull-colibri-eval-v3.dts | 2 +- + .../dts/nxp/imx/imx6ull-colibri-wifi-aster.dts | 2 +- + .../dts/nxp/imx/imx6ull-colibri-wifi-eval-v3.dts | 2 +- + .../dts/nxp/imx/imx6ull-colibri-wifi-iris-v2.dts | 2 +- + .../boot/dts/nxp/imx/imx6ull-colibri-wifi-iris.dts | 2 +- + .../boot/dts/nxp/imx/imx6ull-phytec-tauri-emmc.dts | 4 +- + .../boot/dts/nxp/imx/imx6ull-phytec-tauri-nand.dts | 4 +- + .../arm/boot/dts/nxp/imx/imx6ull-phytec-tauri.dtsi | 5 - + .../boot/dts/nxp/imx/imx7d-colibri-emmc-aster.dts | 1 - + .../dts/nxp/imx/imx7d-colibri-emmc-eval-v3.dts | 1 - + .../dts/nxp/imx/imx7d-colibri-emmc-iris-v2.dts | 1 - + .../boot/dts/nxp/imx/imx7d-colibri-emmc-iris.dts | 1 - + arch/arm/boot/dts/nxp/imx/imx7d-pico-pi.dts | 4 + + arch/arm/boot/dts/nxp/imx/imx7s.dtsi | 7 +- + arch/arm/boot/dts/nxp/imx/imx7ulp.dtsi | 2 +- + arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi | 9 +- + arch/arm/boot/dts/nxp/mxs/imx23-evk.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx23.dtsi | 4 +- + arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-cfa10055.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts | 2 +- + .../boot/dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-evk.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts | 2 +- + arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts | 6 +- + arch/arm/boot/dts/nxp/mxs/imx28.dtsi | 6 +- + arch/arm/boot/dts/nxp/vf/vfxxx.dtsi | 27 +- + arch/arm/boot/dts/qcom/Makefile | 5 + + .../dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts | 4 +- + .../arm/boot/dts/qcom/qcom-apq8060-dragonboard.dts | 1 - + .../boot/dts/qcom/qcom-apq8064-asus-nexus7-flo.dts | 1 - + arch/arm/boot/dts/qcom/qcom-apq8064-ifc6410.dts | 1 - + arch/arm/boot/dts/qcom/qcom-apq8064.dtsi | 1 - + arch/arm/boot/dts/qcom/qcom-ipq8064-rb3011.dts | 55 +- + arch/arm/boot/dts/qcom/qcom-ipq8064-v1.0.dtsi | 122 +- + arch/arm/boot/dts/qcom/qcom-mdm9615.dtsi | 14 +- + .../dts/qcom/qcom-msm8226-microsoft-common.dtsi | 327 ++ + .../dts/qcom/qcom-msm8226-microsoft-dempsey.dts | 17 + + .../dts/qcom/qcom-msm8226-microsoft-makepeace.dts | 17 + + .../dts/qcom/qcom-msm8226-microsoft-moneypenny.dts | 23 + + arch/arm/boot/dts/qcom/qcom-msm8226.dtsi | 36 +- + .../qcom/qcom-msm8926-microsoft-superman-lte.dts | 53 + + .../boot/dts/qcom/qcom-msm8926-microsoft-tesla.dts | 67 + + arch/arm/boot/dts/qcom/qcom-msm8974.dtsi | 110 +- + arch/arm/boot/dts/qcom/qcom-sdx55.dtsi | 32 +- + arch/arm/boot/dts/qcom/qcom-sdx65-mtp.dts | 4 + + arch/arm/boot/dts/qcom/qcom-sdx65.dtsi | 7 +- + arch/arm/boot/dts/renesas/r7s72100-genmai.dts | 82 +- + arch/arm/boot/dts/renesas/r7s72100-gr-peach.dts | 6 - + arch/arm/boot/dts/renesas/r7s72100-rskrza1.dts | 71 +- + arch/arm/boot/dts/renesas/r7s72100.dtsi | 7 + + arch/arm/boot/dts/renesas/r7s9210-rza2mevb.dts | 5 - + arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts | 2 +- + arch/arm/boot/dts/renesas/r8a7778-bockw.dts | 34 + + arch/arm/boot/dts/renesas/r8a7779-marzen.dts | 32 +- + arch/arm/boot/dts/renesas/r8a7779.dtsi | 7 + + arch/arm/boot/dts/renesas/r8a7790-lager.dts | 5 - + arch/arm/boot/dts/renesas/r8a7791-koelsch.dts | 5 - + arch/arm/boot/dts/renesas/r8a7792-blanche.dts | 34 +- + arch/arm/boot/dts/renesas/r8a7792-wheat.dts | 34 +- + arch/arm/boot/dts/renesas/r8a7792.dtsi | 7 + + arch/arm/boot/dts/renesas/r8a7794-alt.dts | 5 - + arch/arm/boot/dts/rockchip/rk3128.dtsi | 61 +- + .../boot/dts/rockchip/rv1126-edgeble-neu2-io.dts | 4 + + arch/arm/boot/dts/rockchip/rv1126-pinctrl.dtsi | 16 + + arch/arm/boot/dts/rockchip/rv1126.dtsi | 22 + + arch/arm/boot/dts/samsung/exynos4210.dtsi | 12 +- + arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi | 41 +- + .../arm/boot/dts/samsung/exynos4412-galaxy-s3.dtsi | 43 +- + arch/arm/boot/dts/samsung/exynos4412-midas.dtsi | 8 +- + arch/arm/boot/dts/samsung/exynos4412-n710x.dts | 39 +- + arch/arm/boot/dts/samsung/exynos4412-odroidu3.dts | 13 +- + arch/arm/boot/dts/samsung/exynos4412-odroidx.dts | 9 +- + .../dts/samsung/exynos5422-odroidxu3-audio.dtsi | 19 +- + arch/arm/boot/dts/samsung/exynos5422-odroidxu4.dts | 2 +- + arch/arm/boot/dts/samsung/s5pv210-fascinate4g.dts | 33 +- + arch/arm/boot/dts/samsung/s5pv210-galaxys.dts | 37 +- + arch/arm/boot/dts/st/Makefile | 1 + + arch/arm/boot/dts/st/spear1310-evb.dts | 2 - + arch/arm/boot/dts/st/spear1340-evb.dts | 2 - + arch/arm/boot/dts/st/ste-href-tvk1281618-r2.dtsi | 4 +- + arch/arm/boot/dts/st/stih407-family.dtsi | 1 - + arch/arm/boot/dts/st/stih418-b2264.dts | 16 +- + arch/arm/boot/dts/st/stm32746g-eval.dts | 3 +- + arch/arm/boot/dts/st/stm32f7-pinctrl.dtsi | 23 +- + arch/arm/boot/dts/st/stm32f746-disco.dts | 3 +- + arch/arm/boot/dts/st/stm32f769-disco.dts | 3 +- + arch/arm/boot/dts/st/stm32mp131.dtsi | 19 + + arch/arm/boot/dts/st/stm32mp15-pinctrl.dtsi | 342 ++ + arch/arm/boot/dts/st/stm32mp157c-osd32mp1-red.dts | 225 ++ + arch/arm/boot/dts/st/stm32mp15xc-lxa-tac.dtsi | 4 - + arch/arm/boot/dts/st/stm32mp15xx-osd32.dtsi | 6 - + arch/arm/boot/dts/ti/omap/am335x-pocketbeagle.dts | 57 +- + arch/arm/boot/dts/ti/omap/am3517-evm.dts | 35 +- + arch/arm/boot/dts/ti/omap/am3517.dtsi | 1 + + .../boot/dts/ti/omap/motorola-mapphone-common.dtsi | 20 +- + .../boot/dts/ti/omap/omap3-devkit8000-common.dtsi | 4 +- + arch/arm/boot/dts/ti/omap/omap3-gta04.dtsi | 2 +- + arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts | 55 +- + arch/arm/configs/aspeed_g4_defconfig | 1 - + arch/arm/configs/aspeed_g5_defconfig | 8 +- + arch/arm/configs/exynos_defconfig | 3 +- + arch/arm/configs/keystone_defconfig | 1 - + arch/arm/configs/multi_v7_defconfig | 7 +- + arch/arm/configs/omap2plus_defconfig | 8 - + arch/arm/configs/s5pv210_defconfig | 1 + + arch/arm/configs/shmobile_defconfig | 2 +- + arch/arm/mach-shmobile/pm-rcar-gen2.c | 5 +- + arch/arm/mach-shmobile/smp-r8a7779.c | 9 +- + arch/arm/mach-shmobile/smp-sh73a0.c | 10 +- + arch/arm64/Kconfig.platforms | 12 + + arch/arm64/boot/dts/allwinner/Makefile | 2 + + .../sun50i-h616-bigtreetech-cb1-manta.dts | 35 + + .../dts/allwinner/sun50i-h616-bigtreetech-cb1.dtsi | 138 + + .../dts/allwinner/sun50i-h616-bigtreetech-pi.dts | 63 + + arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi | 7 + + arch/arm64/boot/dts/amd/Makefile | 1 + + arch/arm64/boot/dts/amd/amd-overdrive-rev-b0.dts | 1 - + arch/arm64/boot/dts/amd/amd-overdrive-rev-b1.dts | 1 - + arch/arm64/boot/dts/amd/elba-16core.dtsi | 197 ++ + arch/arm64/boot/dts/amd/elba-asic-common.dtsi | 70 + + arch/arm64/boot/dts/amd/elba-asic.dts | 28 + + arch/arm64/boot/dts/amd/elba-flash-parts.dtsi | 117 + + arch/arm64/boot/dts/amd/elba.dtsi | 191 ++ + arch/arm64/boot/dts/amlogic/Makefile | 3 + + arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi | 28 + + arch/arm64/boot/dts/amlogic/meson-a1-ad402.dts | 147 + + arch/arm64/boot/dts/amlogic/meson-a1.dtsi | 369 +- + arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 13 + + arch/arm64/boot/dts/amlogic/meson-g12.dtsi | 40 +- + arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts | 341 ++ + arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts | 10 +- + .../dts/amlogic/meson-g12b-a311d-libretech-cc.dts | 121 + + arch/arm64/boot/dts/amlogic/meson-g12b-gtking.dts | 10 +- + .../boot/dts/amlogic/meson-g12b-ugoos-am6.dts | 10 +- + arch/arm64/boot/dts/amlogic/meson-gxbb-p200.dts | 60 + + arch/arm64/boot/dts/amlogic/meson-gxbb-p201.dts | 39 + + .../dts/amlogic/meson-libretech-cottonwood.dtsi | 614 ++++ + .../boot/dts/amlogic/meson-s4-s805x2-aq222.dts | 6 + + arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 20 + + .../dts/amlogic/meson-sm1-s905d3-libretech-cc.dts | 89 + + arch/arm64/boot/dts/apm/apm-shadowcat.dtsi | 2 +- + arch/arm64/boot/dts/apm/apm-storm.dtsi | 2 +- + arch/arm64/boot/dts/bitmain/bm1880.dtsi | 6 +- + .../arm64/boot/dts/broadcom/northstar2/ns2-svk.dts | 2 - + .../boot/dts/exynos/exynos5433-tm2-common.dtsi | 23 +- + arch/arm64/boot/dts/exynos/exynos7.dtsi | 1 - + arch/arm64/boot/dts/exynos/exynos850-e850-96.dts | 73 + + arch/arm64/boot/dts/exynos/exynos850.dtsi | 30 + + arch/arm64/boot/dts/freescale/Makefile | 19 + + .../freescale/fsl-ls1043a-tqmls1043a-mbls10xxa.dts | 49 + + .../boot/dts/freescale/fsl-ls1043a-tqmls1043a.dtsi | 32 + + arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 14 - + .../freescale/fsl-ls1046a-tqmls1046a-mbls10xxa.dts | 56 + + .../boot/dts/freescale/fsl-ls1046a-tqmls1046a.dtsi | 42 + + .../freescale/fsl-ls1088a-tqmls1088a-mbls10xxa.dts | 64 + + .../boot/dts/freescale/fsl-ls1088a-tqmls1088a.dtsi | 42 + + arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi | 46 +- + arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 7 + + .../boot/dts/freescale/fsl-lx2162a-clearfog.dts | 376 +++ + .../boot/dts/freescale/fsl-lx2162a-sr-som.dtsi | 73 + + .../boot/dts/freescale/imx8-apalis-ixora-v1.1.dtsi | 1 - + .../boot/dts/freescale/imx8-apalis-ixora-v1.2.dtsi | 1 - + .../arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi | 11 +- + arch/arm64/boot/dts/freescale/imx8-ss-audio.dtsi | 98 +- + arch/arm64/boot/dts/freescale/imx8-ss-conn.dtsi | 42 +- + arch/arm64/boot/dts/freescale/imx8-ss-dma.dtsi | 117 +- + arch/arm64/boot/dts/freescale/imx8-ss-img.dtsi | 36 +- + arch/arm64/boot/dts/freescale/imx8-ss-lsio.dtsi | 25 +- + arch/arm64/boot/dts/freescale/imx8dxl-evk.dts | 2 - + arch/arm64/boot/dts/freescale/imx8dxl-ss-adma.dtsi | 38 +- + arch/arm64/boot/dts/freescale/imx8dxl-ss-conn.dtsi | 6 +- + arch/arm64/boot/dts/freescale/imx8dxl.dtsi | 8 +- + .../dts/freescale/imx8mm-beacon-baseboard.dtsi | 76 +- + arch/arm64/boot/dts/freescale/imx8mm-ddr4-evk.dts | 1 - + arch/arm64/boot/dts/freescale/imx8mm-phg.dts | 5 + + .../boot/dts/freescale/imx8mm-phygate-tauri-l.dts | 489 +++ + .../imx8mm-tqma8mqml-mba8mx-lvds-tm070jvhg33.dtso | 45 + + .../arm64/boot/dts/freescale/imx8mm-tqma8mqml.dtsi | 5 + + .../boot/dts/freescale/imx8mm-venice-gw71xx.dtsi | 1 - + .../boot/dts/freescale/imx8mm-venice-gw72xx.dtsi | 1 - + .../boot/dts/freescale/imx8mm-venice-gw73xx.dtsi | 11 +- + .../boot/dts/freescale/imx8mm-venice-gw7901.dts | 4 +- + .../boot/dts/freescale/imx8mm-venice-gw7902.dts | 3 +- + .../boot/dts/freescale/imx8mm-venice-gw7903.dts | 3 +- + .../boot/dts/freescale/imx8mm-venice-gw7904.dts | 3 +- + arch/arm64/boot/dts/freescale/imx8mm.dtsi | 1 + + .../dts/freescale/imx8mn-beacon-baseboard.dtsi | 38 + + .../arm64/boot/dts/freescale/imx8mn-bsh-smm-s2.dts | 1 - + arch/arm64/boot/dts/freescale/imx8mn-evk.dtsi | 2 - + .../imx8mn-tqma8mqnl-mba8mx-lvds-tm070jvhg33.dtso | 45 + + .../arm64/boot/dts/freescale/imx8mn-tqma8mqnl.dtsi | 5 + + .../boot/dts/freescale/imx8mn-venice-gw7902.dts | 3 +- + arch/arm64/boot/dts/freescale/imx8mn.dtsi | 1 + + .../arm64/boot/dts/freescale/imx8mp-beacon-kit.dts | 65 +- + .../dts/freescale/imx8mp-data-modul-edm-sbc.dts | 2 + + .../boot/dts/freescale/imx8mp-debix-model-a.dts | 3 - + .../dts/freescale/imx8mp-debix-som-a-bmb-08.dts | 2 +- + .../arm64/boot/dts/freescale/imx8mp-dhcom-pdk2.dts | 4 +- + .../arm64/boot/dts/freescale/imx8mp-dhcom-pdk3.dts | 70 +- + .../arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi | 154 +- + .../dts/freescale/imx8mp-phyboard-pollux-rdk.dts | 154 + + .../boot/dts/freescale/imx8mp-phycore-som.dtsi | 13 + + .../boot/dts/freescale/imx8mp-venice-gw71xx.dtsi | 1 - + .../boot/dts/freescale/imx8mp-venice-gw72xx.dtsi | 1 - + .../boot/dts/freescale/imx8mp-venice-gw73xx.dtsi | 10 +- + .../dts/freescale/imx8mp-venice-gw74xx-imx219.dtso | 80 + + .../boot/dts/freescale/imx8mp-venice-gw74xx.dts | 2 - + arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi | 1 - + arch/arm64/boot/dts/freescale/imx8mp.dtsi | 148 +- + arch/arm64/boot/dts/freescale/imx8mq-librem5.dtsi | 7 +- + arch/arm64/boot/dts/freescale/imx8mq-nitrogen.dts | 14 +- + arch/arm64/boot/dts/freescale/imx8mq-pico-pi.dts | 2 +- + arch/arm64/boot/dts/freescale/imx8mq-thor96.dts | 2 +- + .../imx8mq-tqma8mq-mba8mx-lvds-tm070jvhg33.dtso | 49 + + .../arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi | 2 +- + arch/arm64/boot/dts/freescale/imx8mq.dtsi | 106 +- + arch/arm64/boot/dts/freescale/imx8qm-apalis.dtsi | 1 - + arch/arm64/boot/dts/freescale/imx8qm-mek.dts | 26 + + arch/arm64/boot/dts/freescale/imx8qm-ss-dma.dtsi | 56 + + arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi | 2 +- + arch/arm64/boot/dts/freescale/imx8qxp-mek.dts | 26 + + arch/arm64/boot/dts/freescale/imx8ulp.dtsi | 23 +- + .../boot/dts/freescale/imx8x-colibri-iris-v2.dtsi | 4 +- + arch/arm64/boot/dts/freescale/imx93-11x11-evk.dts | 15 + + arch/arm64/boot/dts/freescale/imx93.dtsi | 159 +- + arch/arm64/boot/dts/freescale/mba8mx.dtsi | 93 + + .../dts/freescale/tqmls104xa-mbls10xxa-fman.dtsi | 104 + + .../dts/freescale/tqmls1088a-mbls10xxa-mc.dtsi | 146 + + .../boot/dts/freescale/tqmls10xxa-mbls10xxa.dtsi | 136 + + arch/arm64/boot/dts/freescale/tqmls10xxa.dtsi | 58 + + arch/arm64/boot/dts/marvell/ac5-98dx25xx.dtsi | 4 +- + arch/arm64/boot/dts/marvell/armada-3720-eDPU.dts | 47 + + arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi | 8 +- + arch/arm64/boot/dts/marvell/cn9130-crb.dtsi | 4 +- + arch/arm64/boot/dts/marvell/cn9130-db.dtsi | 4 +- + arch/arm64/boot/dts/mediatek/Makefile | 3 + + .../boot/dts/mediatek/mt6795-sony-xperia-m5.dts | 101 + + arch/arm64/boot/dts/mediatek/mt6795.dtsi | 253 +- + .../boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts | 6 +- + arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts | 6 +- + arch/arm64/boot/dts/mediatek/mt8183-evb.dts | 48 +- + arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 40 +- + arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts | 12 +- + .../mt8192-asurada-audio-rt1015p-rt5682.dtsi | 19 - + .../dts/mediatek/mt8192-asurada-audio-rt1015p.dtsi | 26 - + .../dts/mediatek/mt8192-asurada-audio-rt5682.dtsi | 21 - + .../boot/dts/mediatek/mt8192-asurada-hayato-r1.dts | 19 +- + .../dts/mediatek/mt8192-asurada-hayato-r5-sku2.dts | 64 + + .../dts/mediatek/mt8192-asurada-spherion-r0.dts | 19 +- + .../dts/mediatek/mt8192-asurada-spherion-r4.dts | 77 + + arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi | 28 + + arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi | 33 + + arch/arm64/boot/dts/mediatek/mt8195-demo.dts | 2 +- + arch/arm64/boot/dts/mediatek/mt8365.dtsi | 210 ++ + .../boot/dts/mediatek/mt8395-genio-1200-evk.dts | 901 +++++ + arch/arm64/boot/dts/nvidia/tegra132.dtsi | 2 + + arch/arm64/boot/dts/nvidia/tegra210-smaug.dts | 66 + + .../arm64/boot/dts/nvidia/tegra234-p3701-0008.dtsi | 33 + + arch/arm64/boot/dts/nvidia/tegra234-p3701.dtsi | 53 + + .../dts/nvidia/tegra234-p3737-0000+p3701-0000.dts | 1 + + arch/arm64/boot/dts/nvidia/tegra234-p3767.dtsi | 33 +- + .../dts/nvidia/tegra234-p3768-0000+p3767-0000.dts | 13 - + .../arm64/boot/dts/nvidia/tegra234-p3768-0000.dtsi | 1 + + arch/arm64/boot/dts/nvidia/tegra234.dtsi | 52 +- + arch/arm64/boot/dts/qcom/Makefile | 12 + + arch/arm64/boot/dts/qcom/apq8016-sbc-usb-host.dtso | 8 + + arch/arm64/boot/dts/qcom/apq8016-sbc.dts | 30 +- + arch/arm64/boot/dts/qcom/apq8039-t2.dts | 8 + + arch/arm64/boot/dts/qcom/apq8096-db820c.dts | 2 +- + arch/arm64/boot/dts/qcom/ipq5018-rdp432-c2.dts | 12 + + arch/arm64/boot/dts/qcom/ipq5018.dtsi | 86 + + arch/arm64/boot/dts/qcom/ipq5332-rdp468.dts | 23 + + arch/arm64/boot/dts/qcom/ipq5332.dtsi | 80 +- + arch/arm64/boot/dts/qcom/ipq6018.dtsi | 40 +- + arch/arm64/boot/dts/qcom/ipq8074.dtsi | 73 +- + arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi | 147 + + arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts | 63 +- + arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 91 +- + arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts | 65 +- + arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts | 65 +- + arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts | 66 +- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 27 +- + arch/arm64/boot/dts/qcom/msm8916-acer-a1-724.dts | 12 + + .../boot/dts/qcom/msm8916-alcatel-idol347.dts | 185 +- + arch/arm64/boot/dts/qcom/msm8916-asus-z00l.dts | 33 + + arch/arm64/boot/dts/qcom/msm8916-gplus-fl8005a.dts | 12 + + arch/arm64/boot/dts/qcom/msm8916-huawei-g7.dts | 12 + + .../boot/dts/qcom/msm8916-longcheer-l8150.dts | 46 +- + .../boot/dts/qcom/msm8916-longcheer-l8910.dts | 115 + + arch/arm64/boot/dts/qcom/msm8916-modem-qdsp6.dtsi | 148 + + .../dts/qcom/msm8916-samsung-a2015-common.dtsi | 83 + + .../boot/dts/qcom/msm8916-samsung-a3u-eur.dts | 14 +- + .../boot/dts/qcom/msm8916-samsung-a5u-eur.dts | 4 + + .../dts/qcom/msm8916-samsung-e2015-common.dtsi | 8 + + .../boot/dts/qcom/msm8916-samsung-grandmax.dts | 4 + + .../boot/dts/qcom/msm8916-samsung-gt5-common.dtsi | 104 +- + arch/arm64/boot/dts/qcom/msm8916-samsung-gt510.dts | 112 + + arch/arm64/boot/dts/qcom/msm8916-samsung-gt58.dts | 110 + + .../boot/dts/qcom/msm8916-samsung-j5-common.dtsi | 65 + + arch/arm64/boot/dts/qcom/msm8916-samsung-j5.dts | 9 + + arch/arm64/boot/dts/qcom/msm8916-samsung-j5x.dts | 15 + + .../boot/dts/qcom/msm8916-samsung-serranove.dts | 25 + + arch/arm64/boot/dts/qcom/msm8916-thwc-uf896.dts | 8 +- + arch/arm64/boot/dts/qcom/msm8916-thwc-ufi001c.dts | 8 +- + arch/arm64/boot/dts/qcom/msm8916-ufi.dtsi | 33 +- + .../boot/dts/qcom/msm8916-wingtech-wt88047.dts | 86 + + .../arm64/boot/dts/qcom/msm8916-yiming-uz801v3.dts | 8 +- + arch/arm64/boot/dts/qcom/msm8916.dtsi | 90 +- + .../boot/dts/qcom/msm8939-longcheer-l9100.dts | 389 +++ + arch/arm64/boot/dts/qcom/msm8939-samsung-a7.dts | 74 + + .../dts/qcom/msm8939-sony-xperia-kanuti-tulip.dts | 8 + + arch/arm64/boot/dts/qcom/msm8939.dtsi | 118 +- + arch/arm64/boot/dts/qcom/msm8976.dtsi | 15 +- + arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts | 6 +- + .../boot/dts/qcom/msm8994-msft-lumia-octagon.dtsi | 1 + + arch/arm64/boot/dts/qcom/msm8994.dtsi | 2 +- + .../boot/dts/qcom/msm8996-oneplus-common.dtsi | 2 +- + .../arm64/boot/dts/qcom/msm8996-xiaomi-common.dtsi | 4 +- + arch/arm64/boot/dts/qcom/msm8996.dtsi | 3 +- + arch/arm64/boot/dts/qcom/msm8998-fxtec-pro1.dts | 2 +- + arch/arm64/boot/dts/qcom/msm8998-mtp.dts | 2 +- + .../boot/dts/qcom/msm8998-oneplus-common.dtsi | 2 +- + arch/arm64/boot/dts/qcom/msm8998-xiaomi-sagit.dts | 2 +- + arch/arm64/boot/dts/qcom/msm8998.dtsi | 33 +- + arch/arm64/boot/dts/qcom/pm6150.dtsi | 16 + + arch/arm64/boot/dts/qcom/pm7250b.dtsi | 16 +- + arch/arm64/boot/dts/qcom/pm8150b.dtsi | 40 + + arch/arm64/boot/dts/qcom/pm8150l.dtsi | 10 + + arch/arm64/boot/dts/qcom/pm8350c.dtsi | 6 + + arch/arm64/boot/dts/qcom/pm8916.dtsi | 3 - + .../boot/dts/qcom/{pmr735d.dtsi => pmr735d_a.dtsi} | 45 - + arch/arm64/boot/dts/qcom/pmr735d_b.dtsi | 59 + + arch/arm64/boot/dts/qcom/qcm6490-fairphone-fp5.dts | 667 ++++ + arch/arm64/boot/dts/qcom/qrb2210-rb1.dts | 147 +- + arch/arm64/boot/dts/qcom/qrb4210-rb2.dts | 1 - + arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 125 +- + arch/arm64/boot/dts/qcom/sa8775p-ride.dts | 2 + + arch/arm64/boot/dts/qcom/sa8775p.dtsi | 1114 ++++++ + .../arm64/boot/dts/qcom/sc7180-trogdor-coachz.dtsi | 2 +- + .../boot/dts/qcom/sc7180-trogdor-homestar.dtsi | 3 + + .../boot/dts/qcom/sc7180-trogdor-kingoftown.dts | 13 +- + .../sc7180-trogdor-lazor-limozeen-nots-r10.dts | 29 + + .../qcom/sc7180-trogdor-lazor-limozeen-nots-r5.dts | 1 + + .../qcom/sc7180-trogdor-lazor-limozeen-nots-r9.dts | 7 +- + .../dts/qcom/sc7180-trogdor-lazor-limozeen-r10.dts | 45 + + .../dts/qcom/sc7180-trogdor-lazor-limozeen-r4.dts | 2 + + .../dts/qcom/sc7180-trogdor-lazor-limozeen-r9.dts | 11 +- + .../boot/dts/qcom/sc7180-trogdor-lazor-r1.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-lazor-r10-kb.dts | 23 + + .../boot/dts/qcom/sc7180-trogdor-lazor-r10-lte.dts | 27 + + .../boot/dts/qcom/sc7180-trogdor-lazor-r10.dts | 19 + + .../boot/dts/qcom/sc7180-trogdor-lazor-r3-kb.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-lazor-r3-lte.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-lazor-r3.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-lazor-r9-kb.dts | 5 +- + .../boot/dts/qcom/sc7180-trogdor-lazor-r9-lte.dts | 5 +- + .../boot/dts/qcom/sc7180-trogdor-lazor-r9.dts | 5 +- + arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor.dtsi | 1 + + .../dts/qcom/sc7180-trogdor-pazquel-lte-parade.dts | 1 + + .../dts/qcom/sc7180-trogdor-pazquel-lte-ti.dts | 1 + + .../dts/qcom/sc7180-trogdor-pazquel-parade.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-pazquel-ti.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-pazquel360.dtsi | 13 +- + .../arm64/boot/dts/qcom/sc7180-trogdor-pompom.dtsi | 2 + + .../dts/qcom/sc7180-trogdor-quackingstick.dtsi | 2 + + arch/arm64/boot/dts/qcom/sc7180-trogdor-r1.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-rt5682i-sku.dtsi | 38 + + .../boot/dts/qcom/sc7180-trogdor-rt5682s-sku.dtsi | 38 + + ...sc7180-trogdor-wormdingler-rev1-boe-rt5682s.dts | 17 +- + .../qcom/sc7180-trogdor-wormdingler-rev1-boe.dts | 1 + + ...sc7180-trogdor-wormdingler-rev1-inx-rt5682s.dts | 15 +- + .../qcom/sc7180-trogdor-wormdingler-rev1-inx.dts | 1 + + .../boot/dts/qcom/sc7180-trogdor-wormdingler.dtsi | 1 + + arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi | 27 - + arch/arm64/boot/dts/qcom/sc7180.dtsi | 187 +- + arch/arm64/boot/dts/qcom/sc7280-chrome-common.dtsi | 24 + + arch/arm64/boot/dts/qcom/sc7280-crd-r3.dts | 4 + + arch/arm64/boot/dts/qcom/sc7280.dtsi | 402 ++- + .../arm64/boot/dts/qcom/sc8180x-lenovo-flex-5g.dts | 3 +- + arch/arm64/boot/dts/qcom/sc8180x-primus.dts | 3 +- + arch/arm64/boot/dts/qcom/sc8180x.dtsi | 177 +- + .../dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 11 + + arch/arm64/boot/dts/qcom/sdm630.dtsi | 68 +- + arch/arm64/boot/dts/qcom/sdm670.dtsi | 5 +- + arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi | 32 +- + arch/arm64/boot/dts/qcom/sdm845-lg-common.dtsi | 2 +- + arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 90 +- + .../arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi | 25 +- + .../dts/qcom/sdm845-sony-xperia-tama-akari.dts | 170 + + .../dts/qcom/sdm845-sony-xperia-tama-akatsuki.dts | 168 + + .../dts/qcom/sdm845-sony-xperia-tama-apollo.dts | 170 + + .../boot/dts/qcom/sdm845-sony-xperia-tama.dtsi | 91 + + .../dts/qcom/sdm845-xiaomi-beryllium-common.dtsi | 24 +- + arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts | 2 +- + arch/arm64/boot/dts/qcom/sdm845.dtsi | 130 +- + arch/arm64/boot/dts/qcom/sdx75-idp.dts | 2 +- + .../arm64/boot/dts/qcom/sm4250-oneplus-billie2.dts | 2 +- + arch/arm64/boot/dts/qcom/sm6115-fxtec-pro1x.dts | 2 +- + arch/arm64/boot/dts/qcom/sm6115p-lenovo-j606f.dts | 2 +- + .../dts/qcom/sm6125-sony-xperia-seine-pdx201.dts | 59 + + .../boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts | 4 +- + arch/arm64/boot/dts/qcom/sm6125.dtsi | 257 +- + .../dts/qcom/sm6375-sony-xperia-murray-pdx225.dts | 29 +- + arch/arm64/boot/dts/qcom/sm6375.dtsi | 43 + + arch/arm64/boot/dts/qcom/sm7125-xiaomi-common.dtsi | 423 +++ + arch/arm64/boot/dts/qcom/sm7125-xiaomi-joyeuse.dts | 16 + + arch/arm64/boot/dts/qcom/sm7125.dtsi | 16 + + arch/arm64/boot/dts/qcom/sm7225-fairphone-fp4.dts | 35 +- + arch/arm64/boot/dts/qcom/sm8150.dtsi | 117 +- + .../boot/dts/qcom/sm8250-sony-xperia-edo.dtsi | 5 + + arch/arm64/boot/dts/qcom/sm8250.dtsi | 554 ++- + arch/arm64/boot/dts/qcom/sm8350-hdk.dts | 81 + + arch/arm64/boot/dts/qcom/sm8350-mtp.dts | 1 + + arch/arm64/boot/dts/qcom/sm8350.dtsi | 5 +- + arch/arm64/boot/dts/qcom/sm8450-hdk.dts | 24 +- + arch/arm64/boot/dts/qcom/sm8450-qrd.dts | 1 + + .../boot/dts/qcom/sm8450-sony-xperia-nagara.dtsi | 2 +- + arch/arm64/boot/dts/qcom/sm8450.dtsi | 87 +- + arch/arm64/boot/dts/qcom/sm8550-mtp.dts | 6 +- + arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 49 +- + arch/arm64/boot/dts/qcom/sm8550.dtsi | 53 +- + arch/arm64/boot/dts/renesas/Makefile | 38 + + .../boot/dts/renesas/beacon-renesom-baseboard.dtsi | 2 +- + arch/arm64/boot/dts/renesas/ebisu.dtsi | 2 +- + arch/arm64/boot/dts/renesas/hihope-rev4.dtsi | 2 +- + arch/arm64/boot/dts/renesas/r8a774a1.dtsi | 4 +- + arch/arm64/boot/dts/renesas/r8a774b1.dtsi | 4 +- + arch/arm64/boot/dts/renesas/r8a774c0.dtsi | 2 +- + arch/arm64/boot/dts/renesas/r8a774e1.dtsi | 4 +- + arch/arm64/boot/dts/renesas/r8a77951.dtsi | 4 +- + arch/arm64/boot/dts/renesas/r8a77960.dtsi | 4 +- + arch/arm64/boot/dts/renesas/r8a77961.dtsi | 4 +- + arch/arm64/boot/dts/renesas/r8a77965.dtsi | 4 +- + arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts | 2 +- + arch/arm64/boot/dts/renesas/r8a77990.dtsi | 2 +- + arch/arm64/boot/dts/renesas/r8a77995.dtsi | 2 +- + .../boot/dts/renesas/r8a779f0-spider-cpu.dtsi | 24 + + arch/arm64/boot/dts/renesas/r8a779f0.dtsi | 134 + + arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts | 240 ++ + arch/arm64/boot/dts/renesas/r8a779f4.dtsi | 12 + + arch/arm64/boot/dts/renesas/r9a08g045.dtsi | 170 + + arch/arm64/boot/dts/renesas/r9a08g045s33-smarc.dts | 18 + + arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi | 14 + + arch/arm64/boot/dts/renesas/rz-smarc-common.dtsi | 14 +- + arch/arm64/boot/dts/renesas/rzg2l-smarc.dtsi | 20 + + arch/arm64/boot/dts/renesas/rzg2lc-smarc.dtsi | 20 + + arch/arm64/boot/dts/renesas/rzg2ul-smarc.dtsi | 24 + + arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi | 142 + + arch/arm64/boot/dts/renesas/rzg3s-smarc.dtsi | 28 + + arch/arm64/boot/dts/renesas/salvator-common.dtsi | 2 +- + .../renesas/ulcb-audio-graph-card-mix+split.dtsi | 16 +- + .../boot/dts/renesas/ulcb-audio-graph-card.dtsi | 17 +- + .../renesas/ulcb-audio-graph-card2-mix+split.dtsi | 13 +- + .../boot/dts/renesas/ulcb-audio-graph-card2.dtsi | 4 +- + .../ulcb-kf-audio-graph-card-mix+split.dtsi | 57 +- + .../boot/dts/renesas/ulcb-kf-audio-graph-card.dtsi | 27 +- + .../ulcb-kf-audio-graph-card2-mix+split.dtsi | 108 +- + .../dts/renesas/ulcb-kf-audio-graph-card2.dtsi | 14 +- + .../ulcb-kf-simple-audio-card-mix+split.dtsi | 152 +- + .../dts/renesas/ulcb-kf-simple-audio-card.dtsi | 77 +- + .../renesas/ulcb-simple-audio-card-mix+split.dtsi | 8 +- + .../boot/dts/renesas/ulcb-simple-audio-card.dtsi | 8 +- + arch/arm64/boot/dts/renesas/ulcb.dtsi | 2 +- + arch/arm64/boot/dts/rockchip/Makefile | 5 + + arch/arm64/boot/dts/rockchip/rk3399.dtsi | 1 - + .../boot/dts/rockchip/rk3566-powkiddy-rgb30.dts | 161 + + arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts | 4 + + arch/arm64/boot/dts/rockchip/rk356x.dtsi | 7 + + arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts | 136 + + arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dts | 28 + + .../boot/dts/rockchip/rk3588-orangepi-5-plus.dts | 848 +++++ + .../arm64/boot/dts/rockchip/rk3588-quartzpro64.dts | 1137 +++++++ + arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts | 145 + + arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dts | 21 + + .../arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi | 614 ++++ + .../boot/dts/rockchip/rk3588s-indiedroid-nova.dts | 84 + + .../arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts | 662 ++++ + arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi | 44 + + arch/arm64/boot/dts/rockchip/rk3588s.dtsi | 40 + + arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi | 2 + + arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi | 4 + + arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi | 2 + + arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi | 54 + + arch/arm64/boot/dts/st/stm32mp251.dtsi | 19 + + arch/arm64/boot/dts/st/stm32mp257f-ev1.dts | 27 + + arch/arm64/boot/dts/ti/Makefile | 11 +- + arch/arm64/boot/dts/ti/k3-am62-main.dtsi | 12 +- + arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi | 2 + + arch/arm64/boot/dts/ti/k3-am62-verdin-wifi.dtsi | 6 + + arch/arm64/boot/dts/ti/k3-am62-verdin.dtsi | 1 + + arch/arm64/boot/dts/ti/k3-am62-wakeup.dtsi | 2 + + arch/arm64/boot/dts/ti/k3-am62.dtsi | 3 + + arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts | 28 +- + arch/arm64/boot/dts/ti/k3-am625-sk.dts | 27 + + arch/arm64/boot/dts/ti/k3-am62a-main.dtsi | 60 + + arch/arm64/boot/dts/ti/k3-am62a7-sk.dts | 189 +- + arch/arm64/boot/dts/ti/k3-am62p-main.dtsi | 766 ++++- + arch/arm64/boot/dts/ti/k3-am62p-mcu.dtsi | 190 ++ + arch/arm64/boot/dts/ti/k3-am62p-thermal.dtsi | 47 + + arch/arm64/boot/dts/ti/k3-am62p-wakeup.dtsi | 69 +- + arch/arm64/boot/dts/ti/k3-am62p.dtsi | 7 +- + arch/arm64/boot/dts/ti/k3-am62p5-sk.dts | 520 ++- + arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi | 16 + + arch/arm64/boot/dts/ti/k3-am64-main.dtsi | 37 +- + arch/arm64/boot/dts/ti/k3-am64-mcu.dtsi | 2 + + arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi | 11 + + arch/arm64/boot/dts/ti/k3-am64.dtsi | 2 + + arch/arm64/boot/dts/ti/k3-am642-evm.dts | 37 + + arch/arm64/boot/dts/ti/k3-am642-sk.dts | 29 + + .../boot/dts/ti/k3-am642-tqma64xxl-mbax4xxl.dts | 84 +- + arch/arm64/boot/dts/ti/k3-am642-tqma64xxl.dtsi | 12 + + arch/arm64/boot/dts/ti/k3-am65-main.dtsi | 38 +- + arch/arm64/boot/dts/ti/k3-am65-mcu.dtsi | 2 +- + arch/arm64/boot/dts/ti/k3-am654-base-board.dts | 7 + + arch/arm64/boot/dts/ti/k3-am654-icssg2.dtso | 145 + + arch/arm64/boot/dts/ti/k3-am654-idk.dtso | 296 ++ + arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts | 56 + + arch/arm64/boot/dts/ti/k3-am68-sk-som.dtsi | 208 ++ + arch/arm64/boot/dts/ti/k3-am69-sk.dts | 536 +++ + arch/arm64/boot/dts/ti/k3-j7200-main.dtsi | 2 +- + arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi | 9 +- + arch/arm64/boot/dts/ti/k3-j721e-main.dtsi | 2 +- + arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi | 9 +- + arch/arm64/boot/dts/ti/k3-j721s2-main.dtsi | 232 +- + arch/arm64/boot/dts/ti/k3-j721s2-mcu-wakeup.dtsi | 82 +- + arch/arm64/boot/dts/ti/k3-j721s2-som-p0.dtsi | 208 ++ + arch/arm64/boot/dts/ti/k3-j784s4-evm.dts | 117 + + arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi | 497 +++ + arch/arm64/boot/dts/ti/k3-j784s4-mcu-wakeup.dtsi | 40 + + arch/arm64/boot/dts/ti/k3-serdes.h | 2 +- + arch/arm64/configs/defconfig | 19 + + arch/arm64/kvm/hyp/nvhe/ffa.c | 10 +- + arch/riscv/Kconfig.socs | 6 + + arch/riscv/boot/dts/Makefile | 1 + + .../dts/allwinner/sun20i-common-regulators.dtsi | 2 +- + .../dts/allwinner/sun20i-d1-dongshan-nezha-stu.dts | 2 +- + .../sun20i-d1-lichee-rv-86-panel-480p.dts | 2 +- + .../sun20i-d1-lichee-rv-86-panel-720p.dts | 2 +- + .../allwinner/sun20i-d1-lichee-rv-86-panel.dtsi | 2 +- + .../dts/allwinner/sun20i-d1-lichee-rv-dock.dts | 2 +- + .../boot/dts/allwinner/sun20i-d1-lichee-rv.dts | 2 +- + .../dts/allwinner/sun20i-d1-mangopi-mq-pro.dts | 2 +- + arch/riscv/boot/dts/allwinner/sun20i-d1-nezha.dts | 2 +- + arch/riscv/boot/dts/allwinner/sun20i-d1.dtsi | 2 +- + .../boot/dts/allwinner/sun20i-d1s-mangopi-mq.dts | 2 +- + arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi | 45 +- + arch/riscv/boot/dts/allwinner/sunxi-d1-t113.dtsi | 2 +- + arch/riscv/boot/dts/allwinner/sunxi-d1s-t113.dtsi | 2 +- + arch/riscv/boot/dts/microchip/mpfs.dtsi | 15 + + arch/riscv/boot/dts/renesas/r9a07g043f.dtsi | 13 + + arch/riscv/boot/dts/renesas/rzfive-smarc-som.dtsi | 23 - + arch/riscv/boot/dts/renesas/rzfive-smarc.dtsi | 56 - + arch/riscv/boot/dts/sifive/fu540-c000.dtsi | 15 + + arch/riscv/boot/dts/sifive/fu740-c000.dtsi | 15 + + arch/riscv/boot/dts/sophgo/Makefile | 3 + + arch/riscv/boot/dts/sophgo/cv1800b-milkv-duo.dts | 38 + + arch/riscv/boot/dts/sophgo/cv1800b.dtsi | 123 + + arch/riscv/boot/dts/sophgo/sg2042-cpus.dtsi | 2000 +++++++++++ + .../riscv/boot/dts/sophgo/sg2042-milkv-pioneer.dts | 19 + + arch/riscv/boot/dts/sophgo/sg2042.dtsi | 325 ++ + arch/riscv/boot/dts/starfive/jh7100.dtsi | 6 + + arch/riscv/boot/dts/starfive/jh7110-pinfunc.h | 4 +- + .../dts/starfive/jh7110-starfive-visionfive-2.dtsi | 111 + + arch/riscv/boot/dts/starfive/jh7110.dtsi | 93 + + arch/riscv/boot/dts/thead/th1520.dtsi | 12 + + arch/riscv/configs/defconfig | 3 +- + drivers/base/power/common.c | 21 + + drivers/base/power/domain.c | 44 +- + drivers/bus/Kconfig | 2 +- + drivers/bus/vexpress-config.c | 2 +- + drivers/clk/clk-scmi.c | 96 +- + drivers/clk/qcom/Kconfig | 7 + + drivers/clk/qcom/Makefile | 1 + + drivers/clk/qcom/camcc-sm8550.c | 3564 ++++++++++++++++++++ + drivers/clk/qcom/clk-alpha-pll.c | 29 + + drivers/clk/qcom/clk-alpha-pll.h | 2 + + drivers/cpufreq/scmi-cpufreq.c | 54 +- + drivers/firmware/Kconfig | 15 +- + drivers/firmware/Makefile | 3 +- + drivers/firmware/arm_ffa/bus.c | 16 +- + drivers/firmware/arm_ffa/driver.c | 770 ++++- + drivers/firmware/arm_scmi/Kconfig | 12 + + drivers/firmware/arm_scmi/Makefile | 1 - + drivers/firmware/arm_scmi/clock.c | 402 ++- + drivers/firmware/arm_scmi/driver.c | 1 + + drivers/firmware/arm_scmi/perf.c | 112 +- + drivers/firmware/arm_scmi/powercap.c | 4 +- + drivers/firmware/arm_scmi/smc.c | 35 +- + drivers/firmware/arm_scpi.c | 13 +- + drivers/firmware/meson/meson_sm.c | 25 +- + drivers/firmware/qcom/Kconfig | 56 + + drivers/firmware/qcom/Makefile | 9 + + drivers/firmware/qcom/qcom_qseecom.c | 120 + + drivers/firmware/qcom/qcom_qseecom_uefisecapp.c | 871 +++++ + drivers/firmware/{ => qcom}/qcom_scm-legacy.c | 0 + drivers/firmware/{ => qcom}/qcom_scm-smc.c | 0 + drivers/firmware/{ => qcom}/qcom_scm.c | 450 ++- + drivers/firmware/{ => qcom}/qcom_scm.h | 16 +- + drivers/firmware/raspberrypi.c | 1 + + drivers/firmware/tegra/bpmp.c | 30 + + drivers/firmware/ti_sci.c | 69 +- + drivers/memory/atmel-ebi.c | 16 +- + drivers/memory/brcmstb_memc.c | 9 +- + drivers/memory/fsl-corenet-cf.c | 11 +- + drivers/memory/tegra/tegra234.c | 64 + + drivers/opp/core.c | 60 +- + drivers/opp/of.c | 10 +- + drivers/opp/opp.h | 2 +- + drivers/pmdomain/Makefile | 1 + + drivers/pmdomain/arm/Makefile | 4 + + drivers/pmdomain/arm/scmi_perf_domain.c | 184 + + .../arm_scmi => pmdomain/arm}/scmi_pm_domain.c | 0 + drivers/soc/aspeed/aspeed-lpc-ctrl.c | 6 +- + drivers/soc/aspeed/aspeed-lpc-snoop.c | 6 +- + drivers/soc/aspeed/aspeed-p2a-ctrl.c | 6 +- + drivers/soc/aspeed/aspeed-uart-routing.c | 6 +- + drivers/soc/bcm/Kconfig | 2 +- + drivers/soc/dove/pmu.c | 5 +- + drivers/soc/fsl/dpaa2-console.c | 6 +- + drivers/soc/fsl/qe/qmc.c | 6 +- + drivers/soc/fsl/qe/tsa.c | 5 +- + drivers/soc/fujitsu/a64fx-diag.c | 6 +- + drivers/soc/hisilicon/kunpeng_hccs.c | 6 +- + drivers/soc/ixp4xx/ixp4xx-npe.c | 6 +- + drivers/soc/ixp4xx/ixp4xx-qmgr.c | 5 +- + drivers/soc/litex/litex_soc_ctrl.c | 5 +- + drivers/soc/loongson/loongson2_guts.c | 6 +- + drivers/soc/mediatek/mtk-devapc.c | 6 +- + drivers/soc/mediatek/mtk-mmsys.c | 6 +- + drivers/soc/mediatek/mtk-svs.c | 184 +- + drivers/soc/microchip/mpfs-sys-controller.c | 6 +- + drivers/soc/pxa/ssp.c | 6 +- + drivers/soc/qcom/apr.c | 4 +- + drivers/soc/qcom/cmd-db.c | 8 +- + drivers/soc/qcom/icc-bwmon.c | 6 +- + drivers/soc/qcom/kryo-l2-accessors.c | 4 +- + drivers/soc/qcom/llcc-qcom.c | 367 +- + drivers/soc/qcom/ocmem.c | 12 +- + drivers/soc/qcom/pdr_interface.c | 8 +- + drivers/soc/qcom/pmic_glink.c | 6 +- + drivers/soc/qcom/pmic_glink_altmode.c | 46 +- + drivers/soc/qcom/qcom-geni-se.c | 38 +- + drivers/soc/qcom/qcom_aoss.c | 12 +- + drivers/soc/qcom/qcom_gsbi.c | 6 +- + drivers/soc/qcom/qcom_stats.c | 6 +- + drivers/soc/qcom/qmi_encdec.c | 6 +- + drivers/soc/qcom/qmi_interface.c | 20 +- + drivers/soc/qcom/rmtfs_mem.c | 15 +- + drivers/soc/qcom/rpmh.c | 8 +- + drivers/soc/qcom/smd-rpm.c | 2 +- + drivers/soc/qcom/smem.c | 10 +- + drivers/soc/qcom/smp2p.c | 6 +- + drivers/soc/qcom/smsm.c | 6 +- + drivers/soc/qcom/socinfo.c | 17 +- + drivers/soc/qcom/wcnss_ctrl.c | 3 +- + drivers/soc/renesas/Kconfig | 6 + + drivers/soc/renesas/renesas-soc.c | 15 +- + drivers/soc/rockchip/io-domain.c | 6 +- + drivers/soc/samsung/exynos-chipid.c | 6 +- + drivers/soc/sifive/Kconfig | 2 +- + drivers/soc/tegra/cbb/tegra194-cbb.c | 6 +- + drivers/soc/tegra/pmc.c | 8 - + drivers/soc/ti/k3-ringacc.c | 5 +- + drivers/soc/ti/k3-socinfo.c | 7 +- + drivers/soc/ti/knav_dma.c | 6 +- + drivers/soc/ti/knav_qmss_queue.c | 13 +- + drivers/soc/ti/pm33xx.c | 5 +- + drivers/soc/ti/pruss.c | 6 +- + drivers/soc/ti/smartreflex.c | 5 +- + drivers/soc/ti/wkup_m3_ipc.c | 6 +- + include/dt-bindings/arm/qcom,ids.h | 5 + + include/dt-bindings/clock/qcom,sm8550-camcc.h | 187 + + include/dt-bindings/clock/r9a08g045-cpg.h | 242 ++ + include/dt-bindings/power/amlogic,t7-pwrc.h | 63 + + include/dt-bindings/power/mediatek,mt8365-power.h | 19 + + include/linux/arm_ffa.h | 79 +- + include/linux/firmware/meson/meson_sm.h | 2 +- + include/linux/firmware/qcom/qcom_qseecom.h | 52 + + include/linux/firmware/qcom/qcom_scm.h | 109 +- + include/linux/nvmem-consumer.h | 6 + + include/linux/pm.h | 2 + + include/linux/pm_domain.h | 11 + + include/linux/pm_opp.h | 31 +- + include/linux/scmi_protocol.h | 43 +- + include/linux/soc/qcom/llcc-qcom.h | 2 +- + include/linux/ucs2_string.h | 1 + + include/soc/tegra/bpmp-abi.h | 2 +- + include/soc/tegra/bpmp.h | 6 + + lib/ucs2_string.c | 52 + + 818 files changed, 43599 insertions(+), 4313 deletions(-) + create mode 100644 Documentation/devicetree/bindings/arm/amd,pensando.yaml + delete mode 100644 Documentation/devicetree/bindings/arm/tegra/nvidia,tegra20-pmc.yaml + create mode 100644 Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-mswi.yaml + create mode 100644 Documentation/devicetree/bindings/riscv/sophgo.yaml + create mode 100644 Documentation/devicetree/bindings/soc/sti/st,sti-syscon.yaml + create mode 100644 Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-pmc.yaml + create mode 100644 Documentation/devicetree/bindings/timer/thead,c900-aclint-mtimer.yaml + create mode 100644 arch/arm/arm-soc-for-next-contents.txt + create mode 100644 arch/arm/boot/dts/allwinner/sun8i-v3s-anbernic-rg-nano.dts + create mode 100644 arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-minerva-cmc.dts + create mode 100644 arch/arm/boot/dts/intel/ixp/intel-ixp42x-usrobotics-usr8200.dts + create mode 100644 arch/arm/boot/dts/microchip/at91-sama5d29_curiosity.dts + create mode 100644 arch/arm/boot/dts/nxp/imx/imx53-sk-imx53-atm0700d4-lvds.dts + create mode 100644 arch/arm/boot/dts/nxp/imx/imx53-sk-imx53-atm0700d4-rgb.dts + create mode 100644 arch/arm/boot/dts/nxp/imx/imx53-sk-imx53-atm0700d4.dtsi + create mode 100644 arch/arm/boot/dts/nxp/imx/imx6q-var-mx6customboard.dts + create mode 100644 arch/arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi + create mode 100644 arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-common.dtsi + create mode 100644 arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-dempsey.dts + create mode 100644 arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-makepeace.dts + create mode 100644 arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-moneypenny.dts + create mode 100644 arch/arm/boot/dts/qcom/qcom-msm8926-microsoft-superman-lte.dts + create mode 100644 arch/arm/boot/dts/qcom/qcom-msm8926-microsoft-tesla.dts + create mode 100644 arch/arm/boot/dts/st/stm32mp157c-osd32mp1-red.dts + create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h616-bigtreetech-cb1-manta.dts + create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h616-bigtreetech-cb1.dtsi + create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h616-bigtreetech-pi.dts + create mode 100644 arch/arm64/boot/dts/amd/elba-16core.dtsi + create mode 100644 arch/arm64/boot/dts/amd/elba-asic-common.dtsi + create mode 100644 arch/arm64/boot/dts/amd/elba-asic.dts + create mode 100644 arch/arm64/boot/dts/amd/elba-flash-parts.dtsi + create mode 100644 arch/arm64/boot/dts/amd/elba.dtsi + create mode 100644 arch/arm64/boot/dts/amlogic/meson-a1-ad402.dts + create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-a311d-libretech-cc.dts + create mode 100644 arch/arm64/boot/dts/amlogic/meson-libretech-cottonwood.dtsi + create mode 100644 arch/arm64/boot/dts/amlogic/meson-sm1-s905d3-libretech-cc.dts + create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a-mbls10xxa.dts + create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a.dtsi + create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a-mbls10xxa.dts + create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a.dtsi + create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1088a-tqmls1088a-mbls10xxa.dts + create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1088a-tqmls1088a.dtsi + create mode 100644 arch/arm64/boot/dts/freescale/fsl-lx2162a-clearfog.dts + create mode 100644 arch/arm64/boot/dts/freescale/fsl-lx2162a-sr-som.dtsi + create mode 100644 arch/arm64/boot/dts/freescale/imx8mm-phygate-tauri-l.dts + create mode 100644 arch/arm64/boot/dts/freescale/imx8mm-tqma8mqml-mba8mx-lvds-tm070jvhg33.dtso + create mode 100644 arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl-mba8mx-lvds-tm070jvhg33.dtso + create mode 100644 arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx-imx219.dtso + create mode 100644 arch/arm64/boot/dts/freescale/imx8mq-tqma8mq-mba8mx-lvds-tm070jvhg33.dtso + create mode 100644 arch/arm64/boot/dts/freescale/tqmls104xa-mbls10xxa-fman.dtsi + create mode 100644 arch/arm64/boot/dts/freescale/tqmls1088a-mbls10xxa-mc.dtsi + create mode 100644 arch/arm64/boot/dts/freescale/tqmls10xxa-mbls10xxa.dtsi + create mode 100644 arch/arm64/boot/dts/freescale/tqmls10xxa.dtsi + delete mode 100644 arch/arm64/boot/dts/mediatek/mt8192-asurada-audio-rt1015p-rt5682.dtsi + delete mode 100644 arch/arm64/boot/dts/mediatek/mt8192-asurada-audio-rt1015p.dtsi + delete mode 100644 arch/arm64/boot/dts/mediatek/mt8192-asurada-audio-rt5682.dtsi + create mode 100644 arch/arm64/boot/dts/mediatek/mt8192-asurada-hayato-r5-sku2.dts + create mode 100644 arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r4.dts + create mode 100644 arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts + create mode 100644 arch/arm64/boot/dts/qcom/apq8016-sbc-usb-host.dtso + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi + create mode 100644 arch/arm64/boot/dts/qcom/msm8916-modem-qdsp6.dtsi + create mode 100644 arch/arm64/boot/dts/qcom/msm8939-longcheer-l9100.dts + rename arch/arm64/boot/dts/qcom/{pmr735d.dtsi => pmr735d_a.dtsi} (55%) + create mode 100644 arch/arm64/boot/dts/qcom/pmr735d_b.dtsi + create mode 100644 arch/arm64/boot/dts/qcom/qcm6490-fairphone-fp5.dts + create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r10.dts + create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r10.dts + create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10-kb.dts + create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10-lte.dts + create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10.dts + create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor-rt5682i-sku.dtsi + create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor-rt5682s-sku.dtsi + create mode 100644 arch/arm64/boot/dts/qcom/sm7125-xiaomi-common.dtsi + create mode 100644 arch/arm64/boot/dts/qcom/sm7125-xiaomi-joyeuse.dts + create mode 100644 arch/arm64/boot/dts/qcom/sm7125.dtsi + create mode 100644 arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts + create mode 100644 arch/arm64/boot/dts/renesas/r8a779f4.dtsi + create mode 100644 arch/arm64/boot/dts/renesas/r9a08g045.dtsi + create mode 100644 arch/arm64/boot/dts/renesas/r9a08g045s33-smarc.dts + create mode 100644 arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi + create mode 100644 arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi + create mode 100644 arch/arm64/boot/dts/renesas/rzg3s-smarc.dtsi + create mode 100644 arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts + create mode 100644 arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts + create mode 100644 arch/arm64/boot/dts/rockchip/rk3588-quartzpro64.dts + create mode 100644 arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dts + create mode 100644 arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi + create mode 100644 arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts + create mode 100644 arch/arm64/boot/dts/ti/k3-am62p-thermal.dtsi + create mode 100644 arch/arm64/boot/dts/ti/k3-am654-icssg2.dtso + create mode 100644 arch/arm64/boot/dts/ti/k3-am654-idk.dtso + create mode 100644 arch/riscv/boot/dts/sophgo/Makefile + create mode 100644 arch/riscv/boot/dts/sophgo/cv1800b-milkv-duo.dts + create mode 100644 arch/riscv/boot/dts/sophgo/cv1800b.dtsi + create mode 100644 arch/riscv/boot/dts/sophgo/sg2042-cpus.dtsi + create mode 100644 arch/riscv/boot/dts/sophgo/sg2042-milkv-pioneer.dts + create mode 100644 arch/riscv/boot/dts/sophgo/sg2042.dtsi + create mode 100644 drivers/clk/qcom/camcc-sm8550.c + create mode 100644 drivers/firmware/qcom/Kconfig + create mode 100644 drivers/firmware/qcom/Makefile + create mode 100644 drivers/firmware/qcom/qcom_qseecom.c + create mode 100644 drivers/firmware/qcom/qcom_qseecom_uefisecapp.c + rename drivers/firmware/{ => qcom}/qcom_scm-legacy.c (100%) + rename drivers/firmware/{ => qcom}/qcom_scm-smc.c (100%) + rename drivers/firmware/{ => qcom}/qcom_scm.c (76%) + rename drivers/firmware/{ => qcom}/qcom_scm.h (91%) + create mode 100644 drivers/pmdomain/arm/Makefile + create mode 100644 drivers/pmdomain/arm/scmi_perf_domain.c + rename drivers/{firmware/arm_scmi => pmdomain/arm}/scmi_pm_domain.c (100%) + create mode 100644 include/dt-bindings/clock/qcom,sm8550-camcc.h + create mode 100644 include/dt-bindings/clock/r9a08g045-cpg.h + create mode 100644 include/dt-bindings/power/amlogic,t7-pwrc.h + create mode 100644 include/dt-bindings/power/mediatek,mt8365-power.h + create mode 100644 include/linux/firmware/qcom/qcom_qseecom.h +Merging amlogic/for-next (996fc07dce79 Merge branch 'v6.7/defconfig' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/amlogic/linux.git amlogic/for-next +Merge made by the 'ort' strategy. +Merging asahi-soc/asahi-soc/for-next (eaf935fa48ec soc: apple: mailbox: Rename config symbol to APPLE_MAILBOX) +$ git merge -m Merge branch 'asahi-soc/for-next' of https://github.com/AsahiLinux/linux.git asahi-soc/asahi-soc/for-next +Auto-merging MAINTAINERS +Auto-merging drivers/soc/apple/Makefile +CONFLICT (content): Merge conflict in drivers/soc/apple/Makefile +Resolved 'drivers/soc/apple/Makefile' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master d929afa5749d] Merge branch 'asahi-soc/for-next' of https://github.com/AsahiLinux/linux.git +$ git diff -M --stat --summary HEAD^.. + MAINTAINERS | 2 - + drivers/mailbox/Kconfig | 12 - + drivers/mailbox/Makefile | 2 - + drivers/mailbox/apple-mailbox.c | 441 ------------------------------------- + drivers/soc/apple/Kconfig | 15 +- + drivers/soc/apple/Makefile | 3 + + drivers/soc/apple/mailbox.c | 436 ++++++++++++++++++++++++++++++++++++ + drivers/soc/apple/mailbox.h | 48 ++++ + drivers/soc/apple/rtkit-internal.h | 8 +- + drivers/soc/apple/rtkit.c | 133 +++-------- + include/linux/apple-mailbox.h | 19 -- + include/linux/soc/apple/rtkit.h | 18 -- + 12 files changed, 531 insertions(+), 606 deletions(-) + delete mode 100644 drivers/mailbox/apple-mailbox.c + create mode 100644 drivers/soc/apple/mailbox.c + create mode 100644 drivers/soc/apple/mailbox.h + delete mode 100644 include/linux/apple-mailbox.h +Merging aspeed/for-next (3be891e01a89 Merge branches 'defconfig-for-v6.7', 'dt-for-v6.7' and 'soc-for-v6.7' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/bmc.git aspeed/for-next +Merge made by the 'ort' strategy. +Merging at91/at91-next (3cec9514911c ARM: dts: at91: sam9x60_curiosity: Add mandatory dt property for RTT) +$ git merge -m Merge branch 'at91-next' of git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git at91/at91-next +Already up to date. +Merging broadcom/next (62a3c97f8167 Merge branch 'devicetree/next' into next) +$ git merge -m Merge branch 'next' of https://github.com/Broadcom/stblinux.git broadcom/next +Merge made by the 'ort' strategy. +Merging davinci/davinci/for-next (06c2afb862f9 Linux 6.5-rc1) +$ git merge -m Merge branch 'davinci/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git davinci/davinci/for-next +Already up to date. +Merging drivers-memory/for-next (09de3691daab memory: Use device_get_match_data()) +$ git merge -m Merge branch 'for-next' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl.git drivers-memory/for-next +Already up to date. +Merging imx-mxs/for-next (fa81543ef854 Merge branch 'imx/defconfig' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git imx-mxs/for-next +Merge made by the 'ort' strategy. +Merging mediatek/for-next (9802b60bd6d8 Merge branch 'v6.6-next/soc' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux.git mediatek/for-next +Merge made by the 'ort' strategy. +Merging mvebu/for-next (93e6b023e552 Merge branch 'mvebu/dt64' into mvebu/for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git mvebu/for-next +Merge made by the 'ort' strategy. +Merging omap/for-next (cb1114df7bb0 Merge branch 'fixes' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git omap/for-next +Merge made by the 'ort' strategy. +Merging qcom/for-next (2b05c2dc230b Merge branches 'arm64-defconfig-for-6.7', 'arm64-fixes-for-6.6', 'arm64-for-6.7', 'clk-for-6.7', 'drivers-for-6.7' and 'dts-for-6.7' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git qcom/for-next +Merge made by the 'ort' strategy. + .../devicetree/bindings/clock/qcom,hfpll.txt | 3 + + .../devicetree/bindings/clock/qcom,rpmhcc.yaml | 1 + + .../devicetree/bindings/clock/qcom,sm4450-gcc.yaml | 55 + + drivers/clk/qcom/Kconfig | 10 + + drivers/clk/qcom/Makefile | 1 + + drivers/clk/qcom/apss-ipq-pll.c | 4 +- + drivers/clk/qcom/apss-ipq6018.c | 61 +- + drivers/clk/qcom/camcc-sm8550.c | 3 +- + drivers/clk/qcom/clk-alpha-pll.c | 63 + + drivers/clk/qcom/clk-alpha-pll.h | 1 + + drivers/clk/qcom/clk-cbf-8996.c | 12 +- + drivers/clk/qcom/clk-hfpll.c | 4 + + drivers/clk/qcom/clk-hfpll.h | 1 + + drivers/clk/qcom/clk-rcg2.c | 14 +- + drivers/clk/qcom/clk-rpmh.c | 21 + + drivers/clk/qcom/clk-smd-rpm.c | 16 +- + drivers/clk/qcom/gcc-ipq5018.c | 6 +- + drivers/clk/qcom/gcc-ipq5332.c | 4 - + drivers/clk/qcom/gcc-ipq6018.c | 27 +- + drivers/clk/qcom/gcc-ipq8074.c | 6 - + drivers/clk/qcom/gcc-ipq9574.c | 4 - + drivers/clk/qcom/gcc-msm8996.c | 237 +- + drivers/clk/qcom/gcc-sm4450.c | 2898 ++++++++++++++++++++ + drivers/clk/qcom/gcc-sm8150.c | 2 +- + drivers/clk/qcom/gpucc-sm8550.c | 10 +- + drivers/clk/qcom/hfpll.c | 59 +- + drivers/clk/qcom/mmcc-msm8974.c | 18 - + drivers/clk/qcom/mmcc-msm8998.c | 7 +- + drivers/clk/qcom/videocc-sm8550.c | 10 +- + include/dt-bindings/clock/qcom,mmcc-msm8974.h | 1 - + include/dt-bindings/clock/qcom,sm4450-gcc.h | 197 ++ + 31 files changed, 3440 insertions(+), 316 deletions(-) + create mode 100644 Documentation/devicetree/bindings/clock/qcom,sm4450-gcc.yaml + create mode 100644 drivers/clk/qcom/gcc-sm4450.c + create mode 100644 include/dt-bindings/clock/qcom,sm4450-gcc.h +Merging renesas/next (fb39831a07ec Merge branch 'renesas-fixes-for-v6.6' into renesas-next) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git renesas/next +Merge made by the 'ort' strategy. +Merging reset/reset/next (417a3a5ae44a reset: ti: syscon: remove unneeded call to platform_set_drvdata()) +$ git merge -m Merge branch 'reset/next' of https://git.pengutronix.de/git/pza/linux reset/reset/next +Already up to date. +Merging rockchip/for-next (fd1299bf9ce8 Merge branch 'v6.7-armsoc/dts64' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git rockchip/for-next +Merge made by the 'ort' strategy. + Documentation/devicetree/bindings/soc/rockchip/grf.yaml | 1 + + drivers/clk/rockchip/clk-rk3568.c | 2 ++ + 2 files changed, 3 insertions(+) +Merging samsung-krzk/for-next (b7df1b3a7a1b Merge branch 'next/dt' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git samsung-krzk/for-next +Merge made by the 'ort' strategy. +Merging scmi/for-linux-next (269024fecd16 Merge branch 'for-next/ffa/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux into for-linux-next) +$ git merge -m Merge branch 'for-linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux.git scmi/for-linux-next +Merge made by the 'ort' strategy. + drivers/firmware/arm_ffa/driver.c | 64 ++++++++++++++++++++++++++------------- + include/linux/arm_ffa.h | 2 ++ + 2 files changed, 45 insertions(+), 21 deletions(-) +Merging stm32/stm32-next (1aeb02d3f2c5 ARM: dts: stm32: add SDIO pinctrl sleep support on stm32f7 boards) +$ git merge -m Merge branch 'stm32-next' of git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32.git stm32/stm32-next +Already up to date. +Merging sunxi/sunxi/for-next (c3f7c14856eb riscv: dts: allwinner: convert isa detection to new properties) +$ git merge -m Merge branch 'sunxi/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git sunxi/sunxi/for-next +Already up to date. +Merging tee/next (6a8b7e801054 tee: optee: Use kmemdup() to replace kmalloc + memcpy) +$ git merge -m Merge branch 'next' of https://git.linaro.org/people/jens.wiklander/linux-tee.git tee/next +Already up to date. +Merging tegra/for-next (650220c2b474 Merge branch for-6.7/arm64/dt into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux.git tegra/for-next +Merge made by the 'ort' strategy. +Merging ti/ti-next (2234981539e7 Merge branch 'ti-k3-dts-next' into ti-next) +$ git merge -m Merge branch 'ti-next' of git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git ti/ti-next +Merge made by the 'ort' strategy. +Merging xilinx/for-next (7d2da28125ce Merge branch 'zynqmp/dt' into for-next) +$ git merge -m Merge branch 'for-next' of git://github.com/Xilinx/linux-xlnx.git xilinx/for-next +Merge made by the 'ort' strategy. + arch/arm64/boot/dts/xilinx/Makefile | 9 ++++---- + arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts | 8 +++---- + .../boot/dts/xilinx/zynqmp-zc1751-xm015-dc1.dts | 8 +++++-- + .../boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts | 16 ++++++++----- + .../boot/dts/xilinx/zynqmp-zc1751-xm017-dc3.dts | 8 +++++-- + .../boot/dts/xilinx/zynqmp-zc1751-xm018-dc4.dts | 26 +++++++++++++--------- + .../boot/dts/xilinx/zynqmp-zc1751-xm019-dc5.dts | 8 +++++-- + arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts | 4 ++-- + arch/arm64/boot/dts/xilinx/zynqmp.dtsi | 14 +++--------- + drivers/soc/xilinx/zynqmp_power.c | 6 ++--- + 10 files changed, 57 insertions(+), 50 deletions(-) +Merging clk/clk-next (355359eb0902 Merge branch 'clk-kunit' into clk-next) +$ git merge -m Merge branch 'clk-next' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git clk/clk-next +Merge made by the 'ort' strategy. + .../clock/amlogic,s4-peripherals-clkc.yaml | 96 + + .../bindings/clock/amlogic,s4-pll-clkc.yaml | 49 + + drivers/clk/.kunitconfig | 1 + + drivers/clk/Kconfig | 16 + + drivers/clk/Makefile | 2 + + drivers/clk/analogbits/Kconfig | 2 +- + drivers/clk/analogbits/wrpll-cln28hpc.c | 8 + + drivers/clk/at91/clk-utmi.c | 12 +- + drivers/clk/clk-asm9260.c | 6 +- + drivers/clk/clk-cdce925.c | 67 +- + drivers/clk/clk-fractional-divider.c | 27 +- + drivers/clk/clk-fractional-divider_test.c | 147 + + drivers/clk/clk-gate.c | 2 +- + drivers/clk/clk-gate_test.c | 30 +- + drivers/clk/clk-lochnagar.c | 9 +- + drivers/clk/clk-npcm7xx.c | 2 +- + drivers/clk/clk-renesas-pcie.c | 2 +- + drivers/clk/clk-si514.c | 2 +- + drivers/clk/clk-si521xx.c | 6 +- + drivers/clk/clk-si5341.c | 2 +- + drivers/clk/clk-si5351.c | 6 +- + drivers/clk/clk-si544.c | 53 +- + drivers/clk/clk-si570.c | 69 +- + drivers/clk/clk-twl.c | 197 + + drivers/clk/clk-versaclock3.c | 8 +- + drivers/clk/clk-versaclock5.c | 2 +- + drivers/clk/clk-versaclock7.c | 2 +- + drivers/clk/clk.c | 65 +- + drivers/clk/clk_test.c | 130 +- + drivers/clk/davinci/da8xx-cfgchip.c | 8 +- + drivers/clk/davinci/pll.c | 10 +- + drivers/clk/davinci/psc.c | 10 +- + drivers/clk/imx/Kconfig | 1 + + drivers/clk/imx/clk-imx6sx.c | 14 +- + drivers/clk/imx/clk-imx8-acm.c | 35 +- + drivers/clk/imx/clk-imx8dxl-rsrc.c | 3 +- + drivers/clk/imx/clk-imx8mq.c | 17 +- + drivers/clk/imx/clk-imx8qm-rsrc.c | 5 +- + drivers/clk/imx/clk-imx8qxp-lpcg.h | 1 - + drivers/clk/imx/clk-imx8qxp-rsrc.c | 4 +- + drivers/clk/imx/clk-imx8qxp.c | 13 +- + drivers/clk/imx/clk-scu.c | 20 + + drivers/clk/keystone/pll.c | 15 +- + drivers/clk/mediatek/clk-mt2701.c | 8 + + drivers/clk/mediatek/clk-mt6765.c | 6 + + drivers/clk/mediatek/clk-mt6779.c | 4 + + drivers/clk/mediatek/clk-mt6797.c | 6 + + drivers/clk/mediatek/clk-mt7629-eth.c | 4 + + drivers/clk/mediatek/clk-mt7629.c | 6 + + drivers/clk/mediatek/clk-pll.c | 6 +- + drivers/clk/meson/Kconfig | 25 + + drivers/clk/meson/Makefile | 2 + + drivers/clk/meson/s4-peripherals.c | 3813 ++++++++++++++++++++ + drivers/clk/meson/s4-peripherals.h | 56 + + drivers/clk/meson/s4-pll.c | 867 +++++ + drivers/clk/meson/s4-pll.h | 38 + + drivers/clk/qcom/gcc-msm8960.c | 13 +- + drivers/clk/qcom/gcc-msm8974.c | 10 +- + drivers/clk/qcom/kpss-xcc.c | 9 +- + drivers/clk/qcom/krait-cc.c | 14 +- + drivers/clk/qcom/mmcc-msm8960.c | 16 +- + drivers/clk/qcom/mmcc-sdm660.c | 8 +- + drivers/clk/ralink/clk-mtmips.c | 20 +- + drivers/clk/renesas/Kconfig | 7 +- + drivers/clk/renesas/Makefile | 1 + + drivers/clk/renesas/r8a7795-cpg-mssr.c | 4 +- + drivers/clk/renesas/r9a06g032-clocks.c | 69 +- + drivers/clk/renesas/r9a07g043-cpg.c | 19 +- + drivers/clk/renesas/r9a07g044-cpg.c | 19 +- + drivers/clk/renesas/r9a08g045-cpg.c | 248 ++ + drivers/clk/renesas/rcar-cpg-lib.c | 15 +- + drivers/clk/renesas/rzg2l-cpg.c | 465 ++- + drivers/clk/renesas/rzg2l-cpg.h | 39 +- + drivers/clk/rockchip/clk-rk3399.c | 9 +- + drivers/clk/samsung/clk-exynos-clkout.c | 8 +- + drivers/clk/sifive/Kconfig | 2 +- + drivers/clk/sifive/sifive-prci.c | 10 +- + drivers/clk/socfpga/clk-agilex.c | 12 +- + drivers/clk/socfpga/clk-s10.c | 6 +- + drivers/clk/socfpga/stratix10-clk.h | 4 +- + drivers/clk/sprd/composite.h | 36 +- + drivers/clk/sprd/div.c | 6 +- + drivers/clk/sprd/div.h | 17 +- + drivers/clk/ti/adpll.c | 14 +- + drivers/clk/ti/divider.c | 8 +- + drivers/clk/visconti/pll.c | 6 +- + drivers/clk/visconti/pll.h | 4 +- + .../clock/amlogic,s4-peripherals-clkc.h | 236 ++ + include/dt-bindings/clock/amlogic,s4-pll-clkc.h | 43 + + include/dt-bindings/clock/imx8mp-clock.h | 1 - + include/linux/clk-provider.h | 15 +- + 91 files changed, 6914 insertions(+), 516 deletions(-) + create mode 100644 Documentation/devicetree/bindings/clock/amlogic,s4-peripherals-clkc.yaml + create mode 100644 Documentation/devicetree/bindings/clock/amlogic,s4-pll-clkc.yaml + create mode 100644 drivers/clk/clk-fractional-divider_test.c + create mode 100644 drivers/clk/clk-twl.c + create mode 100644 drivers/clk/meson/s4-peripherals.c + create mode 100644 drivers/clk/meson/s4-peripherals.h + create mode 100644 drivers/clk/meson/s4-pll.c + create mode 100644 drivers/clk/meson/s4-pll.h + create mode 100644 drivers/clk/renesas/r9a08g045-cpg.c + create mode 100644 include/dt-bindings/clock/amlogic,s4-peripherals-clkc.h + create mode 100644 include/dt-bindings/clock/amlogic,s4-pll-clkc.h +Merging clk-imx/for-next (2838820800dc clk: imx: imx8qm/qxp: add more resources to whitelist) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux.git clk-imx/for-next +Already up to date. +Merging clk-renesas/renesas-clk (4bce4bedbe6d clk: renesas: r9a08g045: Add clock and reset support for SDHI1 and SDHI2) +$ git merge -m Merge branch 'renesas-clk' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git clk-renesas/renesas-clk +Already up to date. +Merging csky/linux-next (5195c35ac4f0 csky: Fixup compile error) +$ git merge -m Merge branch 'linux-next' of git://github.com/c-sky/csky-linux.git csky/linux-next +Already up to date. +Merging loongarch/loongarch-next (2c10cda4b777 LoongArch: KVM: Add maintainers for LoongArch KVM) +$ git merge -m Merge branch 'loongarch-next' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git loongarch/loongarch-next +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. + Documentation/virt/kvm/api.rst | 70 ++- + MAINTAINERS | 12 + + arch/loongarch/Kbuild | 2 + + arch/loongarch/Kconfig | 6 + + arch/loongarch/configs/loongson3_defconfig | 2 + + arch/loongarch/include/asm/inst.h | 16 + + arch/loongarch/include/asm/kvm_csr.h | 211 +++++++ + arch/loongarch/include/asm/kvm_host.h | 237 ++++++++ + arch/loongarch/include/asm/kvm_mmu.h | 139 +++++ + arch/loongarch/include/asm/kvm_types.h | 11 + + arch/loongarch/include/asm/kvm_vcpu.h | 93 +++ + arch/loongarch/include/asm/loongarch.h | 19 +- + arch/loongarch/include/uapi/asm/kvm.h | 108 ++++ + arch/loongarch/kernel/asm-offsets.c | 32 + + arch/loongarch/kvm/Kconfig | 40 ++ + arch/loongarch/kvm/Makefile | 22 + + arch/loongarch/kvm/exit.c | 696 +++++++++++++++++++++ + arch/loongarch/kvm/interrupt.c | 183 ++++++ + arch/loongarch/kvm/main.c | 420 +++++++++++++ + arch/loongarch/kvm/mmu.c | 914 ++++++++++++++++++++++++++++ + arch/loongarch/kvm/switch.S | 250 ++++++++ + arch/loongarch/kvm/timer.c | 197 ++++++ + arch/loongarch/kvm/tlb.c | 32 + + arch/loongarch/kvm/trace.h | 162 +++++ + arch/loongarch/kvm/vcpu.c | 939 +++++++++++++++++++++++++++++ + arch/loongarch/kvm/vm.c | 94 +++ + include/uapi/linux/kvm.h | 9 + + 27 files changed, 4902 insertions(+), 14 deletions(-) + create mode 100644 arch/loongarch/include/asm/kvm_csr.h + create mode 100644 arch/loongarch/include/asm/kvm_host.h + create mode 100644 arch/loongarch/include/asm/kvm_mmu.h + create mode 100644 arch/loongarch/include/asm/kvm_types.h + create mode 100644 arch/loongarch/include/asm/kvm_vcpu.h + create mode 100644 arch/loongarch/include/uapi/asm/kvm.h + create mode 100644 arch/loongarch/kvm/Kconfig + create mode 100644 arch/loongarch/kvm/Makefile + create mode 100644 arch/loongarch/kvm/exit.c + create mode 100644 arch/loongarch/kvm/interrupt.c + create mode 100644 arch/loongarch/kvm/main.c + create mode 100644 arch/loongarch/kvm/mmu.c + create mode 100644 arch/loongarch/kvm/switch.S + create mode 100644 arch/loongarch/kvm/timer.c + create mode 100644 arch/loongarch/kvm/tlb.c + create mode 100644 arch/loongarch/kvm/trace.h + create mode 100644 arch/loongarch/kvm/vcpu.c + create mode 100644 arch/loongarch/kvm/vm.c +Merging m68k/for-next (03191fb3db3d m68k: lib: Include for __muldi3()) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git m68k/for-next +Auto-merging arch/m68k/Kconfig +Merge made by the 'ort' strategy. + arch/m68k/68000/entry.S | 7 +-- + arch/m68k/Kconfig | 3 ++ + arch/m68k/amiga/amiga.h | 5 +++ + arch/m68k/amiga/amisound.c | 2 + + arch/m68k/amiga/config.c | 4 +- + arch/m68k/amiga/pcmcia.c | 3 +- + arch/m68k/apollo/apollo.h | 4 ++ + arch/m68k/apollo/config.c | 45 ++++--------------- + arch/m68k/apollo/dn_ints.c | 8 ++-- + arch/m68k/atari/ataints.c | 3 +- + arch/m68k/atari/atakeyb.c | 2 +- + arch/m68k/atari/atari.h | 15 +++++++ + arch/m68k/atari/atasound.c | 1 + + arch/m68k/atari/config.c | 13 ++---- + arch/m68k/atari/stdma.c | 1 + + arch/m68k/atari/stram.c | 2 +- + arch/m68k/atari/time.c | 2 + + arch/m68k/bvme6000/config.c | 7 +-- + arch/m68k/coldfire/entry.S | 7 +-- + arch/m68k/configs/amiga_defconfig | 1 + + arch/m68k/configs/apollo_defconfig | 2 + + arch/m68k/configs/atari_defconfig | 1 + + arch/m68k/configs/bvme6000_defconfig | 2 + + arch/m68k/configs/hp300_defconfig | 2 + + arch/m68k/configs/mac_defconfig | 1 + + arch/m68k/configs/multi_defconfig | 1 + + arch/m68k/configs/mvme147_defconfig | 2 + + arch/m68k/configs/mvme16x_defconfig | 2 + + arch/m68k/configs/q40_defconfig | 1 + + arch/m68k/configs/sun3_defconfig | 2 + + arch/m68k/configs/sun3x_defconfig | 2 + + arch/m68k/configs/virt_defconfig | 3 +- + arch/m68k/emu/natfeat.c | 9 ++-- + arch/m68k/emu/nfeth.c | 2 +- + arch/m68k/fpsp040/slogn.S | 84 ++++++++++++++++++------------------ + arch/m68k/hp300/time.c | 2 + + arch/m68k/ifpsp060/Makefile | 6 +-- + arch/m68k/include/asm/dvma.h | 8 +++- + arch/m68k/include/asm/io_mm.h | 24 +++++------ + arch/m68k/include/asm/irq.h | 5 +++ + arch/m68k/include/asm/oplib.h | 4 +- + arch/m68k/include/asm/page_mm.h | 43 +++++++++--------- + arch/m68k/include/asm/pgtable.h | 9 ++++ + arch/m68k/include/asm/pgtable_no.h | 1 - + arch/m68k/include/asm/raw_io.h | 32 +++++++------- + arch/m68k/include/asm/sun3_pgalloc.h | 10 ++--- + arch/m68k/include/asm/syscalls.h | 19 ++++++++ + arch/m68k/include/asm/tlbflush.h | 71 +++++++++++++++--------------- + arch/m68k/kernel/early_printk.c | 4 +- + arch/m68k/kernel/entry.S | 7 +-- + arch/m68k/kernel/head.S | 8 +--- + arch/m68k/kernel/ints.c | 2 + + arch/m68k/kernel/ints.h | 7 +++ + arch/m68k/kernel/process.c | 1 + + arch/m68k/kernel/process.h | 8 ++++ + arch/m68k/kernel/ptrace.c | 2 + + arch/m68k/kernel/ptrace.h | 6 +++ + arch/m68k/kernel/setup_mm.c | 2 - + arch/m68k/kernel/signal.c | 4 +- + arch/m68k/kernel/signal.h | 7 +++ + arch/m68k/kernel/sys_m68k.c | 4 +- + arch/m68k/kernel/traps.c | 19 ++++---- + arch/m68k/kernel/traps.h | 10 +++++ + arch/m68k/kernel/vectors.c | 3 ++ + arch/m68k/kernel/vectors.h | 3 ++ + arch/m68k/lib/Makefile | 3 +- + arch/m68k/lib/ashldi3.c | 61 -------------------------- + arch/m68k/lib/ashrdi3.c | 62 -------------------------- + arch/m68k/lib/lshrdi3.c | 61 -------------------------- + arch/m68k/lib/muldi3.c | 1 + + arch/m68k/mac/baboon.c | 2 + + arch/m68k/mac/config.c | 14 ++---- + arch/m68k/mac/iop.c | 2 + + arch/m68k/mac/mac.h | 25 +++++++++++ + arch/m68k/mac/macboing.c | 11 +---- + arch/m68k/mac/misc.c | 5 ++- + arch/m68k/mac/oss.c | 2 + + arch/m68k/mac/psc.c | 2 + + arch/m68k/mac/via.c | 2 + + arch/m68k/math-emu/fp_arith.c | 49 ++++++++------------- + arch/m68k/math-emu/fp_arith.h | 47 ++++++++------------ + arch/m68k/math-emu/fp_log.c | 46 ++++++++------------ + arch/m68k/math-emu/fp_log.h | 44 +++++++++++++++++++ + arch/m68k/math-emu/fp_trig.c | 54 ++++++++--------------- + arch/m68k/math-emu/fp_trig.h | 25 +++++++++-- + arch/m68k/math-emu/multi_arith.h | 8 ++-- + arch/m68k/mm/fault.c | 2 + + arch/m68k/mm/fault.h | 7 +++ + arch/m68k/mm/hwtest.c | 2 + + arch/m68k/mm/sun3kmap.c | 6 +-- + arch/m68k/mm/sun3mmu.c | 2 +- + arch/m68k/mvme147/config.c | 7 +-- + arch/m68k/mvme16x/config.c | 10 ++--- + arch/m68k/mvme16x/mvme16x.h | 6 +++ + arch/m68k/q40/config.c | 11 ++--- + arch/m68k/q40/q40.h | 6 +++ + arch/m68k/q40/q40ints.c | 2 + + arch/m68k/sun3/config.c | 13 +++--- + arch/m68k/sun3/idprom.c | 4 +- + arch/m68k/sun3/intersil.c | 1 + + arch/m68k/sun3/leds.c | 2 + + arch/m68k/sun3/mmu_emu.c | 43 +++++++++--------- + arch/m68k/sun3/prom/printf.c | 5 +-- + arch/m68k/sun3/sun3.h | 22 ++++++++++ + arch/m68k/sun3/sun3dvma.c | 17 -------- + arch/m68k/sun3/sun3ints.c | 12 +++--- + arch/m68k/sun3x/config.c | 6 +-- + arch/m68k/sun3x/dvma.c | 5 +-- + arch/m68k/sun3x/prom.c | 2 +- + 109 files changed, 629 insertions(+), 672 deletions(-) + create mode 100644 arch/m68k/amiga/amiga.h + create mode 100644 arch/m68k/apollo/apollo.h + create mode 100644 arch/m68k/atari/atari.h + create mode 100644 arch/m68k/include/asm/syscalls.h + create mode 100644 arch/m68k/kernel/ints.h + create mode 100644 arch/m68k/kernel/process.h + create mode 100644 arch/m68k/kernel/ptrace.h + create mode 100644 arch/m68k/kernel/signal.h + create mode 100644 arch/m68k/kernel/traps.h + create mode 100644 arch/m68k/kernel/vectors.h + delete mode 100644 arch/m68k/lib/ashldi3.c + delete mode 100644 arch/m68k/lib/ashrdi3.c + delete mode 100644 arch/m68k/lib/lshrdi3.c + create mode 100644 arch/m68k/mac/mac.h + create mode 100644 arch/m68k/math-emu/fp_log.h + create mode 100644 arch/m68k/mm/fault.h + create mode 100644 arch/m68k/mvme16x/mvme16x.h + create mode 100644 arch/m68k/q40/q40.h + create mode 100644 arch/m68k/sun3/sun3.h +Merging m68knommu/for-next (2508b608f402 m68k: 68000: fix warning in timer code) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu.git m68knommu/for-next +Merge made by the 'ort' strategy. + arch/m68k/68000/ints.c | 5 ++++- + arch/m68k/68000/ints.h | 7 +++++++ + arch/m68k/68000/timers.c | 2 ++ + arch/m68k/Kconfig.machine | 4 ++-- + arch/m68k/coldfire/intc.c | 4 ++-- + arch/m68k/coldfire/vectors.c | 2 ++ + arch/m68k/coldfire/vectors.h | 3 +++ + arch/m68k/include/asm/mcfgpio.h | 8 ++++---- + arch/m68k/include/asm/nettel.h | 5 ++--- + arch/m68k/kernel/uboot.c | 13 ++++++++----- + arch/m68k/mm/mcfmmu.c | 3 +-- + 11 files changed, 37 insertions(+), 19 deletions(-) + create mode 100644 arch/m68k/68000/ints.h + create mode 100644 arch/m68k/coldfire/vectors.h +Merging microblaze/next (65d6e954e378 Merge tag 'gfs2-v6.5-rc5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2) +$ git merge -m Merge branch 'next' of git://git.monstr.eu/linux-2.6-microblaze.git microblaze/next +Already up to date. +Merging mips/mips-next (4b7d3ab44565 MIPS: AR7: remove platform) +$ git merge -m Merge branch 'mips-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git mips/mips-next +Auto-merging MAINTAINERS +Auto-merging drivers/watchdog/Kconfig +Merge made by the 'ort' strategy. + MAINTAINERS | 7 - + arch/arm/configs/pxa_defconfig | 1 - + arch/mips/Kbuild.platforms | 1 - + arch/mips/Kconfig | 22 - + arch/mips/ar7/Makefile | 11 - + arch/mips/ar7/Platform | 5 - + arch/mips/ar7/clock.c | 439 ----------- + arch/mips/ar7/gpio.c | 332 --------- + arch/mips/ar7/irq.c | 165 ----- + arch/mips/ar7/memory.c | 51 -- + arch/mips/ar7/platform.c | 722 ------------------- + arch/mips/ar7/prom.c | 256 ------- + arch/mips/ar7/setup.c | 93 --- + arch/mips/ar7/time.c | 31 - + arch/mips/boot/compressed/uart-16550.c | 5 - + arch/mips/boot/dts/ingenic/jz4725b.dtsi | 1 - + arch/mips/boot/dts/ingenic/jz4770.dtsi | 1 - + arch/mips/boot/dts/ralink/mt7621-gnubee-gb-pc1.dts | 2 +- + arch/mips/boot/dts/ralink/mt7621-gnubee-gb-pc2.dts | 2 +- + arch/mips/boot/dts/ralink/mt7621.dtsi | 5 +- + arch/mips/configs/ar7_defconfig | 119 --- + arch/mips/configs/fuloong2e_defconfig | 1 - + arch/mips/configs/jazz_defconfig | 4 - + arch/mips/configs/lemote2f_defconfig | 3 - + arch/mips/configs/malta_defconfig | 5 - + arch/mips/configs/malta_kvm_defconfig | 5 - + arch/mips/configs/maltaup_xpa_defconfig | 5 - + arch/mips/configs/rm200_defconfig | 4 - + arch/mips/include/asm/mach-ar7/ar7.h | 191 ----- + arch/mips/include/asm/mach-ar7/irq.h | 16 - + arch/mips/include/asm/mach-ar7/prom.h | 12 - + arch/mips/include/asm/mach-ar7/spaces.h | 22 - + arch/mips/include/asm/mach-loongson32/dma.h | 21 - + arch/mips/include/asm/mach-loongson32/nand.h | 26 - + arch/mips/include/asm/mach-loongson32/platform.h | 3 - + arch/mips/kernel/relocate_kernel.S | 1 - + arch/mips/loongson32/common/platform.c | 2 - + arch/mips/loongson32/ls1b/board.c | 2 - + arch/mips/pci/fixup-lantiq.c | 2 +- + drivers/Kconfig | 2 - + drivers/Makefile | 1 - + drivers/mtd/parsers/Kconfig | 5 - + drivers/mtd/parsers/Makefile | 1 - + drivers/mtd/parsers/ar7part.c | 129 ---- + drivers/tty/serial/8250/8250_port.c | 7 - + drivers/vlynq/Kconfig | 21 - + drivers/vlynq/Makefile | 6 - + drivers/vlynq/vlynq.c | 799 --------------------- + drivers/watchdog/Kconfig | 6 - + drivers/watchdog/Makefile | 1 - + drivers/watchdog/ar7_wdt.c | 315 -------- + include/linux/vlynq.h | 149 ---- + 52 files changed, 5 insertions(+), 4033 deletions(-) + delete mode 100644 arch/mips/ar7/Makefile + delete mode 100644 arch/mips/ar7/Platform + delete mode 100644 arch/mips/ar7/clock.c + delete mode 100644 arch/mips/ar7/gpio.c + delete mode 100644 arch/mips/ar7/irq.c + delete mode 100644 arch/mips/ar7/memory.c + delete mode 100644 arch/mips/ar7/platform.c + delete mode 100644 arch/mips/ar7/prom.c + delete mode 100644 arch/mips/ar7/setup.c + delete mode 100644 arch/mips/ar7/time.c + delete mode 100644 arch/mips/configs/ar7_defconfig + delete mode 100644 arch/mips/include/asm/mach-ar7/ar7.h + delete mode 100644 arch/mips/include/asm/mach-ar7/irq.h + delete mode 100644 arch/mips/include/asm/mach-ar7/prom.h + delete mode 100644 arch/mips/include/asm/mach-ar7/spaces.h + delete mode 100644 arch/mips/include/asm/mach-loongson32/dma.h + delete mode 100644 arch/mips/include/asm/mach-loongson32/nand.h + delete mode 100644 drivers/mtd/parsers/ar7part.c + delete mode 100644 drivers/vlynq/Kconfig + delete mode 100644 drivers/vlynq/Makefile + delete mode 100644 drivers/vlynq/vlynq.c + delete mode 100644 drivers/watchdog/ar7_wdt.c + delete mode 100644 include/linux/vlynq.h +Merging openrisc/for-next (c289330331eb openrisc: Remove kernel-doc marker from ioremap comment) +$ git merge -m Merge branch 'for-next' of git://github.com/openrisc/linux.git openrisc/for-next +Already up to date. +Merging parisc-hd/for-next (07fa32fcbd91 fbdev: stifb: Make the STI next font pointer a 32-bit signed offset) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git parisc-hd/for-next +Auto-merging arch/parisc/Kconfig +Merge made by the 'ort' strategy. + arch/parisc/Kconfig | 1 + + arch/parisc/boot/Makefile | 2 +- + arch/parisc/include/asm/processor.h | 1 + + arch/parisc/include/uapi/asm/pdc.h | 28 ++++++++++++- + arch/parisc/kernel/entry.S | 81 +++++++++++++++++++++++------------- + arch/parisc/kernel/firmware.c | 14 +++---- + arch/parisc/kernel/processor.c | 6 +-- + arch/parisc/kernel/setup.c | 3 -- + arch/parisc/kernel/smp.c | 8 +--- + drivers/char/agp/parisc-agp.c | 16 +++---- + drivers/gpu/drm/drm_cache.c | 2 + + drivers/gpu/drm/radeon/r100.c | 6 +++ + drivers/gpu/drm/radeon/radeon_ring.c | 5 +++ + drivers/parisc/power.c | 67 +++++++++++++---------------- + drivers/parisc/sba_iommu.c | 2 +- + include/video/sticore.h | 2 +- + 16 files changed, 144 insertions(+), 100 deletions(-) +Merging powerpc/next (36e826b568e4 powerpc/vmcore: Add MMU information to vmcoreinfo) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git powerpc/next +Auto-merging arch/powerpc/Kconfig +Auto-merging arch/powerpc/kexec/core.c +Auto-merging arch/powerpc/mm/mem.c +Auto-merging arch/powerpc/mm/nohash/8xx.c +Auto-merging arch/powerpc/mm/pgtable.c +Merge made by the 'ort' strategy. + arch/powerpc/Kconfig | 1 + + arch/powerpc/Kconfig.debug | 2 + + arch/powerpc/boot/install.sh | 16 +- + arch/powerpc/configs/44x/sam440ep_defconfig | 1 - + arch/powerpc/configs/debug.config | 4 + + arch/powerpc/configs/g5_defconfig | 4 - + arch/powerpc/configs/pmac32_defconfig | 2 +- + arch/powerpc/configs/ppc64e_defconfig | 4 - + arch/powerpc/configs/ppc6xx_defconfig | 5 - + arch/powerpc/include/asm/book3s/32/pgtable.h | 83 ++---- + arch/powerpc/include/asm/book3s/32/tlbflush.h | 2 +- + arch/powerpc/include/asm/book3s/64/pgtable.h | 37 +-- + arch/powerpc/include/asm/book3s/pgtable.h | 33 --- + arch/powerpc/include/asm/code-patching.h | 1 + + arch/powerpc/include/asm/cpm1.h | 5 - + arch/powerpc/include/asm/cpm2.h | 4 - + arch/powerpc/include/asm/fixmap.h | 16 +- + arch/powerpc/include/asm/imc-pmu.h | 16 +- + arch/powerpc/include/asm/io.h | 2 +- + arch/powerpc/include/asm/kexec.h | 8 +- + arch/powerpc/include/asm/nohash/32/mmu-8xx.h | 1 - + arch/powerpc/include/asm/nohash/32/pgtable.h | 201 +------------ + arch/powerpc/include/asm/nohash/32/pte-40x.h | 21 +- + arch/powerpc/include/asm/nohash/32/pte-44x.h | 20 +- + arch/powerpc/include/asm/nohash/32/pte-85xx.h | 20 +- + arch/powerpc/include/asm/nohash/32/pte-8xx.h | 92 ++++-- + arch/powerpc/include/asm/nohash/64/pgtable.h | 120 +------- + arch/powerpc/include/asm/nohash/pgtable.h | 223 ++++++++++----- + arch/powerpc/include/asm/nohash/pte-e500.h | 41 +-- + arch/powerpc/include/asm/opal.h | 2 +- + arch/powerpc/include/asm/paravirt.h | 47 +++- + arch/powerpc/include/asm/pgtable-masks.h | 32 +++ + arch/powerpc/include/asm/pgtable.h | 35 +++ + arch/powerpc/include/asm/ptrace.h | 17 ++ + arch/powerpc/include/asm/uaccess.h | 2 +- + arch/powerpc/kernel/btext.c | 360 +----------------------- + arch/powerpc/kernel/crash_dump.c | 12 + + arch/powerpc/kernel/eeh_driver.c | 4 +- + arch/powerpc/kernel/head_40x.S | 19 +- + arch/powerpc/kernel/head_44x.S | 40 +-- + arch/powerpc/kernel/head_85xx.S | 12 +- + arch/powerpc/kernel/head_book3s_32.S | 63 +++-- + arch/powerpc/kernel/io.c | 12 +- + arch/powerpc/kernel/iommu.c | 8 +- + arch/powerpc/kernel/process.c | 26 +- + arch/powerpc/kernel/prom_init.c | 2 +- + arch/powerpc/kernel/ptrace/ptrace.c | 5 +- + arch/powerpc/kernel/setup_64.c | 2 +- + arch/powerpc/kernel/signal.c | 5 +- + arch/powerpc/kernel/signal.h | 7 +- + arch/powerpc/kernel/traps.c | 6 +- + arch/powerpc/kexec/core.c | 3 + + arch/powerpc/kexec/core_64.c | 4 +- + arch/powerpc/kexec/file_load_64.c | 14 +- + arch/powerpc/kvm/book3s_64_vio.c | 8 +- + arch/powerpc/kvm/book3s_xive_native.c | 2 +- + arch/powerpc/lib/code-patching.c | 146 +++++++++- + arch/powerpc/lib/qspinlock.c | 126 ++++----- + arch/powerpc/mm/book3s32/hash_low.S | 32 ++- + arch/powerpc/mm/book3s32/mmu.c | 6 +- + arch/powerpc/mm/book3s64/pgtable.c | 10 +- + arch/powerpc/mm/drmem.c | 2 +- + arch/powerpc/mm/fault.c | 9 +- + arch/powerpc/mm/init_32.c | 1 + + arch/powerpc/mm/ioremap.c | 6 +- + arch/powerpc/mm/mem.c | 1 + + arch/powerpc/mm/nohash/40x.c | 19 +- + arch/powerpc/mm/nohash/8xx.c | 2 + + arch/powerpc/mm/nohash/book3e_pgtable.c | 2 +- + arch/powerpc/mm/nohash/e500.c | 6 +- + arch/powerpc/mm/nohash/e500_hugetlbpage.c | 3 +- + arch/powerpc/mm/pgtable.c | 26 +- + arch/powerpc/mm/ptdump/8xx.c | 5 - + arch/powerpc/mm/ptdump/shared.c | 16 +- + arch/powerpc/net/bpf_jit.h | 18 +- + arch/powerpc/net/bpf_jit_comp.c | 149 +++++++--- + arch/powerpc/net/bpf_jit_comp32.c | 15 +- + arch/powerpc/net/bpf_jit_comp64.c | 10 +- + arch/powerpc/perf/core-book3s.c | 5 +- + arch/powerpc/perf/hv-24x7.c | 2 +- + arch/powerpc/perf/imc-pmu.c | 13 +- + arch/powerpc/perf/power6-pmu.c | 44 +-- + arch/powerpc/platforms/4xx/soc.c | 2 +- + arch/powerpc/platforms/83xx/misc.c | 2 + + arch/powerpc/platforms/8xx/cpm1.c | 1 + + arch/powerpc/platforms/book3s/vas-api.c | 34 ++- + arch/powerpc/platforms/powermac/Kconfig | 1 + + arch/powerpc/platforms/powermac/feature.c | 3 +- + arch/powerpc/platforms/powermac/low_i2c.c | 4 +- + arch/powerpc/platforms/powermac/smp.c | 4 +- + arch/powerpc/platforms/powernv/opal-fadump.h | 2 +- + arch/powerpc/platforms/pseries/hotplug-memory.c | 3 +- + arch/powerpc/platforms/pseries/iommu.c | 8 +- + arch/powerpc/platforms/pseries/lpar.c | 12 +- + arch/powerpc/platforms/pseries/plpks.c | 4 +- + arch/powerpc/platforms/pseries/vas.c | 4 +- + arch/powerpc/sysdev/fsl_msi.c | 10 +- + arch/powerpc/sysdev/mpic.c | 2 +- + arch/powerpc/sysdev/xive/native.c | 2 +- + arch/powerpc/tools/gcc-check-mprofile-kernel.sh | 11 +- + drivers/macintosh/macio-adb.c | 1 + + drivers/soc/fsl/qe/qe_common.c | 4 +- + include/linux/crash_dump.h | 8 +- + lib/fonts/Kconfig | 2 +- + 104 files changed, 1119 insertions(+), 1413 deletions(-) + create mode 100644 arch/powerpc/include/asm/pgtable-masks.h +Merging soc-fsl/next (fb9c384625dd bus: fsl-mc: fsl-mc-allocator: Drop a write-only variable) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux.git soc-fsl/next +Already up to date. +Merging risc-v/for-next (ec8c6c732e46 Merge patch series "RISC-V: ACPI improvements") + 5392534a1954 ("riscv: Kconfig: Add select ARM_AMBA to SOC_STARFIVE") + 767423658d53 ("riscv: kexec: Align the kexeced kernel entry") + fe2ed36d419f ("riscv: Remove duplicate objcopy flag") +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git risc-v/for-next +Auto-merging arch/riscv/Kconfig +Auto-merging arch/riscv/Kconfig.socs +Auto-merging arch/riscv/Makefile +Auto-merging arch/riscv/kernel/setup.c +Auto-merging arch/riscv/mm/init.c +Merge made by the 'ort' strategy. + Documentation/riscv/hwprobe.rst | 6 + + arch/riscv/Kconfig | 1 + + arch/riscv/include/asm/acpi.h | 6 + + arch/riscv/include/asm/cpufeature.h | 1 + + arch/riscv/include/asm/csr.h | 1 + + arch/riscv/include/asm/hwcap.h | 16 ++ + arch/riscv/include/asm/hwprobe.h | 2 +- + arch/riscv/include/asm/page.h | 4 +- + arch/riscv/include/asm/pgtable-32.h | 3 + + arch/riscv/include/asm/pgtable.h | 3 +- + arch/riscv/include/asm/vdso/processor.h | 2 +- + arch/riscv/include/uapi/asm/hwprobe.h | 2 + + arch/riscv/kernel/acpi.c | 89 ++++++++- + arch/riscv/kernel/cpufeature.c | 17 +- + arch/riscv/kernel/entry.S | 2 + + arch/riscv/kernel/kexec_relocate.S | 52 +++--- + arch/riscv/kernel/setup.c | 4 + + arch/riscv/kernel/smpboot.c | 4 + + arch/riscv/kernel/sys_riscv.c | 44 +++-- + arch/riscv/mm/cacheflush.c | 25 ++- + arch/riscv/mm/init.c | 2 + + arch/riscv/mm/ptdump.c | 3 + + arch/riscv/purgatory/Makefile | 4 + + drivers/acpi/riscv/rhct.c | 93 +++++++++- + drivers/clocksource/timer-riscv.c | 17 +- + tools/testing/selftests/riscv/hwprobe/Makefile | 9 +- + tools/testing/selftests/riscv/hwprobe/cbo.c | 228 ++++++++++++++++++++++++ + tools/testing/selftests/riscv/hwprobe/hwprobe.c | 64 +++---- + tools/testing/selftests/riscv/hwprobe/hwprobe.h | 15 ++ + 29 files changed, 606 insertions(+), 113 deletions(-) + create mode 100644 tools/testing/selftests/riscv/hwprobe/cbo.c + create mode 100644 tools/testing/selftests/riscv/hwprobe/hwprobe.h +Merging riscv-dt/riscv-dt-for-next (b99df6281891 riscv: dts: sophgo: remove address-cells from intc node) +$ git merge -m Merge branch 'riscv-dt-for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git riscv-dt/riscv-dt-for-next +Merge made by the 'ort' strategy. + arch/riscv/boot/dts/sophgo/cv1800b.dtsi | 1 - + 1 file changed, 1 deletion(-) +Merging riscv-soc/riscv-soc-for-next (22dedf8f4570 soc/microchip: mpfs-sys-controller: Convert to platform remove callback returning void) +$ git merge -m Merge branch 'riscv-soc-for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git riscv-soc/riscv-soc-for-next +Already up to date. +Merging s390/for-next (8445432611b4 Merge branch 'features' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git s390/for-next +Auto-merging arch/s390/Kconfig +Auto-merging arch/s390/kernel/setup.c +Merge made by the 'ort' strategy. + arch/s390/Kconfig | 1 + + arch/s390/boot/startup.c | 2 +- + arch/s390/boot/vmem.c | 17 +- + arch/s390/include/asm/asm-extable.h | 27 +- + arch/s390/include/asm/ctl_reg.h | 146 ----------- + arch/s390/include/asm/ctlreg.h | 251 ++++++++++++++++++ + arch/s390/include/asm/fault.h | 28 ++ + arch/s390/include/asm/fpu/internal.h | 1 - + arch/s390/include/asm/irq.h | 23 +- + arch/s390/include/asm/kprobes.h | 3 +- + arch/s390/include/asm/lowcore.h | 15 +- + arch/s390/include/asm/mmu_context.h | 10 +- + arch/s390/include/asm/pgtable.h | 3 +- + arch/s390/include/asm/smp.h | 1 - + arch/s390/include/asm/uaccess.h | 1 - + arch/s390/include/asm/word-at-a-time.h | 64 +++++ + arch/s390/kernel/Makefile | 2 +- + arch/s390/kernel/crash_dump.c | 6 +- + arch/s390/kernel/ctlreg.c | 121 +++++++++ + arch/s390/kernel/diag.c | 3 +- + arch/s390/kernel/early.c | 22 +- + arch/s390/kernel/guarded_storage.c | 6 +- + arch/s390/kernel/ipl.c | 2 +- + arch/s390/kernel/irq.c | 4 +- + arch/s390/kernel/kprobes.c | 21 +- + arch/s390/kernel/machine_kexec.c | 6 +- + arch/s390/kernel/nmi.c | 24 +- + arch/s390/kernel/perf_cpum_cf.c | 2 +- + arch/s390/kernel/perf_pai_crypto.c | 138 +++++++--- + arch/s390/kernel/perf_pai_ext.c | 10 +- + arch/s390/kernel/ptrace.c | 45 ++-- + arch/s390/kernel/setup.c | 23 +- + arch/s390/kernel/smp.c | 132 +--------- + arch/s390/kernel/time.c | 4 +- + arch/s390/kvm/gaccess.c | 45 +--- + arch/s390/kvm/kvm-s390.c | 6 +- + arch/s390/kvm/priv.c | 2 +- + arch/s390/lib/uaccess.c | 15 +- + arch/s390/mm/dump_pagetables.c | 2 +- + arch/s390/mm/extable.c | 18 ++ + arch/s390/mm/fault.c | 460 +++++++++++++-------------------- + arch/s390/mm/gmap.c | 24 +- + arch/s390/mm/init.c | 4 +- + arch/s390/mm/maccess.c | 2 +- + arch/s390/mm/page-states.c | 25 +- + arch/s390/mm/pageattr.c | 2 +- + arch/s390/mm/pgalloc.c | 8 +- + arch/s390/mm/vmem.c | 15 +- + arch/s390/pci/pci.c | 2 +- + drivers/s390/char/diag_ftp.c | 2 +- + drivers/s390/char/sclp.c | 14 +- + drivers/s390/char/sclp_cmd.c | 3 +- + drivers/s390/char/sclp_early.c | 2 +- + drivers/s390/char/sclp_early_core.c | 7 +- + drivers/s390/cio/chp.c | 2 +- + drivers/s390/cio/chsc.c | 8 +- + drivers/s390/cio/crw.c | 4 +- + drivers/s390/cio/isc.c | 4 +- + drivers/s390/crypto/ap_bus.c | 21 +- + drivers/s390/crypto/ap_bus.h | 3 + + drivers/s390/crypto/ap_queue.c | 58 ++++- + drivers/s390/crypto/zcrypt_api.c | 10 +- + drivers/s390/crypto/zcrypt_cex4.c | 4 + + drivers/s390/crypto/zcrypt_error.h | 18 +- + net/iucv/iucv.c | 4 +- + 65 files changed, 1111 insertions(+), 847 deletions(-) + delete mode 100644 arch/s390/include/asm/ctl_reg.h + create mode 100644 arch/s390/include/asm/ctlreg.h + create mode 100644 arch/s390/include/asm/fault.h + create mode 100644 arch/s390/include/asm/word-at-a-time.h + create mode 100644 arch/s390/kernel/ctlreg.c +Merging sh/for-next (78a96c86a0ff Documentation: kernel-parameters: Add earlyprintk=bios on SH) +$ git merge -m Merge branch 'for-next' of git:git.kernel.org/pub/scm/linux/kernel/git/glaubitz/sh-linux.git sh/for-next +Auto-merging Documentation/admin-guide/kernel-parameters.txt +Merge made by the 'ort' strategy. + Documentation/admin-guide/kernel-parameters.txt | 3 + + Documentation/arch/sh/index.rst | 6 - + arch/sh/Kconfig | 12 +- + arch/sh/Kconfig.debug | 11 ++ + arch/sh/boards/Kconfig | 7 - + arch/sh/boards/Makefile | 1 - + arch/sh/boards/mach-microdev/Makefile | 6 - + arch/sh/boards/mach-microdev/fdc37c93xapm.c | 157 ---------------- + arch/sh/boards/mach-microdev/io.c | 123 ------------- + arch/sh/boards/mach-microdev/irq.c | 150 --------------- + arch/sh/boards/mach-microdev/setup.c | 197 -------------------- + arch/sh/configs/microdev_defconfig | 42 ----- + arch/sh/drivers/Makefile | 1 - + arch/sh/drivers/superhyway/Makefile | 7 - + arch/sh/drivers/superhyway/ops-sh4-202.c | 168 ----------------- + arch/sh/include/asm/io.h | 4 +- + arch/sh/include/asm/machvec.h | 5 - + arch/sh/include/mach-common/mach/microdev.h | 69 ------- + arch/sh/kernel/cpu/sh4/Makefile | 4 - + arch/sh/kernel/cpu/sh4/clock-sh4-202.c | 174 ------------------ + arch/sh/kernel/cpu/sh4/setup-sh4-202.c | 139 -------------- + arch/sh/kernel/ioport.c | 13 +- + drivers/net/ethernet/smsc/smc91x.h | 19 -- + drivers/sh/Makefile | 1 - + drivers/sh/superhyway/Makefile | 8 - + drivers/sh/superhyway/superhyway-sysfs.c | 54 ------ + drivers/sh/superhyway/superhyway.c | 234 ------------------------ + include/linux/superhyway.h | 107 ----------- + 28 files changed, 18 insertions(+), 1704 deletions(-) + delete mode 100644 arch/sh/boards/mach-microdev/Makefile + delete mode 100644 arch/sh/boards/mach-microdev/fdc37c93xapm.c + delete mode 100644 arch/sh/boards/mach-microdev/io.c + delete mode 100644 arch/sh/boards/mach-microdev/irq.c + delete mode 100644 arch/sh/boards/mach-microdev/setup.c + delete mode 100644 arch/sh/configs/microdev_defconfig + delete mode 100644 arch/sh/drivers/superhyway/Makefile + delete mode 100644 arch/sh/drivers/superhyway/ops-sh4-202.c + delete mode 100644 arch/sh/include/mach-common/mach/microdev.h + delete mode 100644 arch/sh/kernel/cpu/sh4/clock-sh4-202.c + delete mode 100644 arch/sh/kernel/cpu/sh4/setup-sh4-202.c + delete mode 100644 drivers/sh/superhyway/Makefile + delete mode 100644 drivers/sh/superhyway/superhyway-sysfs.c + delete mode 100644 drivers/sh/superhyway/superhyway.c + delete mode 100644 include/linux/superhyway.h +Merging uml/next (974b808d85ab um: virt-pci: fix missing declaration warning) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git uml/next +Already up to date. +Merging xtensa/xtensa-for-next (a83a72730c33 xtensa: import ESP32S3 core variant) +$ git merge -m Merge branch 'xtensa-for-next' of git://github.com/jcmvbkbc/linux-xtensa.git xtensa/xtensa-for-next +Merge made by the 'ort' strategy. + arch/xtensa/variants/esp32/include/variant/core.h | 655 ++++++++++++++++++++ + .../variants/esp32/include/variant/tie-asm.h | 323 ++++++++++ + arch/xtensa/variants/esp32/include/variant/tie.h | 182 ++++++ + .../xtensa/variants/esp32s3/include/variant/core.h | 681 +++++++++++++++++++++ + .../variants/esp32s3/include/variant/tie-asm.h | 429 +++++++++++++ + arch/xtensa/variants/esp32s3/include/variant/tie.h | 207 +++++++ + 6 files changed, 2477 insertions(+) + create mode 100644 arch/xtensa/variants/esp32/include/variant/core.h + create mode 100644 arch/xtensa/variants/esp32/include/variant/tie-asm.h + create mode 100644 arch/xtensa/variants/esp32/include/variant/tie.h + create mode 100644 arch/xtensa/variants/esp32s3/include/variant/core.h + create mode 100644 arch/xtensa/variants/esp32s3/include/variant/tie-asm.h + create mode 100644 arch/xtensa/variants/esp32s3/include/variant/tie.h +Merging bcachefs/for-next (b827ac419721 exportfs: Change bcachefs fid_type enum to avoid conflicts) +$ git merge -m Merge branch 'for-next' of https://evilpiepirate.org/git/bcachefs.git bcachefs/for-next +Auto-merging MAINTAINERS +Auto-merging drivers/md/bcache/bcache.h +Auto-merging fs/Kconfig +Auto-merging fs/dcache.c +Auto-merging include/linux/sched.h +Auto-merging init/init_task.c +Auto-merging lib/Kconfig.debug +Merge made by the 'ort' strategy. + MAINTAINERS | 23 + + drivers/md/bcache/Kconfig | 10 +- + drivers/md/bcache/Makefile | 4 +- + drivers/md/bcache/bcache.h | 2 +- + drivers/md/bcache/super.c | 1 - + drivers/md/bcache/util.h | 3 +- + fs/Kconfig | 1 + + fs/Makefile | 1 + + fs/bcachefs/Kconfig | 85 + + fs/bcachefs/Makefile | 88 + + fs/bcachefs/acl.c | 463 ++++ + fs/bcachefs/acl.h | 60 + + fs/bcachefs/alloc_background.c | 2146 +++++++++++++++ + fs/bcachefs/alloc_background.h | 258 ++ + fs/bcachefs/alloc_foreground.c | 1576 +++++++++++ + fs/bcachefs/alloc_foreground.h | 224 ++ + fs/bcachefs/alloc_types.h | 126 + + fs/bcachefs/backpointers.c | 868 ++++++ + fs/bcachefs/backpointers.h | 131 + + fs/bcachefs/bbpos.h | 48 + + fs/bcachefs/bcachefs.h | 1156 ++++++++ + fs/bcachefs/bcachefs_format.h | 2413 +++++++++++++++++ + fs/bcachefs/bcachefs_ioctl.h | 368 +++ + fs/bcachefs/bkey.c | 1120 ++++++++ + fs/bcachefs/bkey.h | 782 ++++++ + fs/bcachefs/bkey_buf.h | 61 + + fs/bcachefs/bkey_cmp.h | 129 + + fs/bcachefs/bkey_methods.c | 458 ++++ + fs/bcachefs/bkey_methods.h | 188 ++ + fs/bcachefs/bkey_sort.c | 201 ++ + fs/bcachefs/bkey_sort.h | 54 + + fs/bcachefs/bset.c | 1592 +++++++++++ + fs/bcachefs/bset.h | 541 ++++ + fs/bcachefs/btree_cache.c | 1202 +++++++++ + fs/bcachefs/btree_cache.h | 130 + + fs/bcachefs/btree_gc.c | 2111 +++++++++++++++ + fs/bcachefs/btree_gc.h | 114 + + fs/bcachefs/btree_io.c | 2223 ++++++++++++++++ + fs/bcachefs/btree_io.h | 228 ++ + fs/bcachefs/btree_iter.c | 3215 +++++++++++++++++++++++ + fs/bcachefs/btree_iter.h | 939 +++++++ + fs/bcachefs/btree_journal_iter.c | 531 ++++ + fs/bcachefs/btree_journal_iter.h | 57 + + fs/bcachefs/btree_key_cache.c | 1072 ++++++++ + fs/bcachefs/btree_key_cache.h | 48 + + fs/bcachefs/btree_locking.c | 791 ++++++ + fs/bcachefs/btree_locking.h | 423 +++ + fs/bcachefs/btree_trans_commit.c | 1150 ++++++++ + fs/bcachefs/btree_types.h | 739 ++++++ + fs/bcachefs/btree_update.c | 933 +++++++ + fs/bcachefs/btree_update.h | 340 +++ + fs/bcachefs/btree_update_interior.c | 2480 +++++++++++++++++ + fs/bcachefs/btree_update_interior.h | 337 +++ + fs/bcachefs/btree_write_buffer.c | 375 +++ + fs/bcachefs/btree_write_buffer.h | 14 + + fs/bcachefs/btree_write_buffer_types.h | 44 + + fs/bcachefs/buckets.c | 2106 +++++++++++++++ + fs/bcachefs/buckets.h | 443 ++++ + fs/bcachefs/buckets_types.h | 92 + + fs/bcachefs/buckets_waiting_for_journal.c | 166 ++ + fs/bcachefs/buckets_waiting_for_journal.h | 15 + + fs/bcachefs/buckets_waiting_for_journal_types.h | 23 + + fs/bcachefs/chardev.c | 784 ++++++ + fs/bcachefs/chardev.h | 31 + + fs/bcachefs/checksum.c | 804 ++++++ + fs/bcachefs/checksum.h | 213 ++ + fs/bcachefs/clock.c | 193 ++ + fs/bcachefs/clock.h | 38 + + fs/bcachefs/clock_types.h | 37 + + fs/bcachefs/compress.c | 710 +++++ + fs/bcachefs/compress.h | 55 + + fs/bcachefs/counters.c | 107 + + fs/bcachefs/counters.h | 17 + + fs/bcachefs/darray.h | 87 + + fs/bcachefs/data_update.c | 558 ++++ + fs/bcachefs/data_update.h | 43 + + fs/bcachefs/debug.c | 954 +++++++ + fs/bcachefs/debug.h | 32 + + fs/bcachefs/dirent.c | 587 +++++ + fs/bcachefs/dirent.h | 70 + + fs/bcachefs/disk_groups.c | 550 ++++ + fs/bcachefs/disk_groups.h | 106 + + fs/bcachefs/ec.c | 1966 ++++++++++++++ + fs/bcachefs/ec.h | 260 ++ + fs/bcachefs/ec_types.h | 41 + + fs/bcachefs/errcode.c | 68 + + fs/bcachefs/errcode.h | 265 ++ + fs/bcachefs/error.c | 293 +++ + fs/bcachefs/error.h | 206 ++ + fs/bcachefs/extent_update.c | 173 ++ + fs/bcachefs/extent_update.h | 12 + + fs/bcachefs/extents.c | 1403 ++++++++++ + fs/bcachefs/extents.h | 758 ++++++ + fs/bcachefs/extents_types.h | 40 + + fs/bcachefs/eytzinger.h | 281 ++ + fs/bcachefs/fifo.h | 127 + + fs/bcachefs/fs-common.c | 501 ++++ + fs/bcachefs/fs-common.h | 43 + + fs/bcachefs/fs-io-buffered.c | 1093 ++++++++ + fs/bcachefs/fs-io-buffered.h | 27 + + fs/bcachefs/fs-io-direct.c | 679 +++++ + fs/bcachefs/fs-io-direct.h | 16 + + fs/bcachefs/fs-io-pagecache.c | 791 ++++++ + fs/bcachefs/fs-io-pagecache.h | 176 ++ + fs/bcachefs/fs-io.c | 1072 ++++++++ + fs/bcachefs/fs-io.h | 184 ++ + fs/bcachefs/fs-ioctl.c | 572 ++++ + fs/bcachefs/fs-ioctl.h | 81 + + fs/bcachefs/fs.c | 1980 ++++++++++++++ + fs/bcachefs/fs.h | 209 ++ + fs/bcachefs/fsck.c | 2417 +++++++++++++++++ + fs/bcachefs/fsck.h | 14 + + fs/bcachefs/inode.c | 1133 ++++++++ + fs/bcachefs/inode.h | 207 ++ + fs/bcachefs/io_misc.c | 515 ++++ + fs/bcachefs/io_misc.h | 34 + + fs/bcachefs/io_read.c | 1210 +++++++++ + fs/bcachefs/io_read.h | 158 ++ + fs/bcachefs/io_write.c | 1671 ++++++++++++ + fs/bcachefs/io_write.h | 110 + + fs/bcachefs/io_write_types.h | 96 + + fs/bcachefs/journal.c | 1449 ++++++++++ + fs/bcachefs/journal.h | 548 ++++ + fs/bcachefs/journal_io.c | 1894 +++++++++++++ + fs/bcachefs/journal_io.h | 65 + + fs/bcachefs/journal_reclaim.c | 876 ++++++ + fs/bcachefs/journal_reclaim.h | 87 + + fs/bcachefs/journal_sb.c | 219 ++ + fs/bcachefs/journal_sb.h | 24 + + fs/bcachefs/journal_seq_blacklist.c | 320 +++ + fs/bcachefs/journal_seq_blacklist.h | 22 + + fs/bcachefs/journal_types.h | 345 +++ + fs/bcachefs/keylist.c | 52 + + fs/bcachefs/keylist.h | 74 + + fs/bcachefs/keylist_types.h | 16 + + fs/bcachefs/logged_ops.c | 112 + + fs/bcachefs/logged_ops.h | 20 + + fs/bcachefs/lru.c | 162 ++ + fs/bcachefs/lru.h | 69 + + fs/bcachefs/mean_and_variance.c | 159 ++ + fs/bcachefs/mean_and_variance.h | 198 ++ + fs/bcachefs/mean_and_variance_test.c | 240 ++ + fs/bcachefs/migrate.c | 179 ++ + fs/bcachefs/migrate.h | 7 + + fs/bcachefs/move.c | 1159 ++++++++ + fs/bcachefs/move.h | 96 + + fs/bcachefs/move_types.h | 36 + + fs/bcachefs/movinggc.c | 414 +++ + fs/bcachefs/movinggc.h | 12 + + fs/bcachefs/nocow_locking.c | 144 + + fs/bcachefs/nocow_locking.h | 50 + + fs/bcachefs/nocow_locking_types.h | 20 + + fs/bcachefs/opts.c | 605 +++++ + fs/bcachefs/opts.h | 564 ++++ + fs/bcachefs/printbuf.c | 425 +++ + fs/bcachefs/printbuf.h | 284 ++ + fs/bcachefs/quota.c | 978 +++++++ + fs/bcachefs/quota.h | 74 + + fs/bcachefs/quota_types.h | 43 + + fs/bcachefs/rebalance.c | 366 +++ + fs/bcachefs/rebalance.h | 28 + + fs/bcachefs/rebalance_types.h | 26 + + fs/bcachefs/recovery.c | 1049 ++++++++ + fs/bcachefs/recovery.h | 33 + + fs/bcachefs/recovery_types.h | 49 + + fs/bcachefs/reflink.c | 405 +++ + fs/bcachefs/reflink.h | 81 + + fs/bcachefs/replicas.c | 1058 ++++++++ + fs/bcachefs/replicas.h | 91 + + fs/bcachefs/replicas_types.h | 27 + + fs/bcachefs/sb-clean.c | 395 +++ + fs/bcachefs/sb-clean.h | 16 + + fs/bcachefs/sb-members.c | 339 +++ + fs/bcachefs/sb-members.h | 182 ++ + fs/bcachefs/seqmutex.h | 48 + + fs/bcachefs/siphash.c | 173 ++ + fs/bcachefs/siphash.h | 87 + + fs/bcachefs/six.c | 913 +++++++ + fs/bcachefs/six.h | 393 +++ + fs/bcachefs/snapshot.c | 1689 ++++++++++++ + fs/bcachefs/snapshot.h | 270 ++ + fs/bcachefs/str_hash.h | 370 +++ + fs/bcachefs/subvolume.c | 450 ++++ + fs/bcachefs/subvolume.h | 35 + + fs/bcachefs/subvolume_types.h | 31 + + fs/bcachefs/super-io.c | 1258 +++++++++ + fs/bcachefs/super-io.h | 124 + + fs/bcachefs/super.c | 2022 ++++++++++++++ + fs/bcachefs/super.h | 52 + + fs/bcachefs/super_types.h | 52 + + fs/bcachefs/sysfs.c | 1031 ++++++++ + fs/bcachefs/sysfs.h | 48 + + fs/bcachefs/tests.c | 919 +++++++ + fs/bcachefs/tests.h | 15 + + fs/bcachefs/trace.c | 16 + + fs/bcachefs/trace.h | 1284 +++++++++ + fs/bcachefs/two_state_shared_lock.c | 8 + + fs/bcachefs/two_state_shared_lock.h | 59 + + fs/bcachefs/util.c | 1141 ++++++++ + fs/bcachefs/util.h | 852 ++++++ + fs/bcachefs/varint.c | 129 + + fs/bcachefs/varint.h | 11 + + fs/bcachefs/vstructs.h | 63 + + fs/bcachefs/xattr.c | 651 +++++ + fs/bcachefs/xattr.h | 50 + + fs/dcache.c | 12 +- + {drivers/md/bcache => include/linux}/closure.h | 46 +- + include/linux/dcache.h | 1 + + include/linux/exportfs.h | 6 + + include/linux/generic-radix-tree.h | 68 +- + include/linux/sched.h | 1 + + include/linux/string_helpers.h | 4 +- + init/init_task.c | 1 + + kernel/locking/mutex.c | 3 + + kernel/stacktrace.c | 2 + + lib/Kconfig | 3 + + lib/Kconfig.debug | 9 + + lib/Makefile | 2 + + {drivers/md/bcache => lib}/closure.c | 36 +- + lib/errname.c | 1 + + lib/generic-radix-tree.c | 76 +- + lib/string_helpers.c | 10 +- + tools/objtool/noreturns.h | 2 + + 223 files changed, 95037 insertions(+), 56 deletions(-) + create mode 100644 fs/bcachefs/Kconfig + create mode 100644 fs/bcachefs/Makefile + create mode 100644 fs/bcachefs/acl.c + create mode 100644 fs/bcachefs/acl.h + create mode 100644 fs/bcachefs/alloc_background.c + create mode 100644 fs/bcachefs/alloc_background.h + create mode 100644 fs/bcachefs/alloc_foreground.c + create mode 100644 fs/bcachefs/alloc_foreground.h + create mode 100644 fs/bcachefs/alloc_types.h + create mode 100644 fs/bcachefs/backpointers.c + create mode 100644 fs/bcachefs/backpointers.h + create mode 100644 fs/bcachefs/bbpos.h + create mode 100644 fs/bcachefs/bcachefs.h + create mode 100644 fs/bcachefs/bcachefs_format.h + create mode 100644 fs/bcachefs/bcachefs_ioctl.h + create mode 100644 fs/bcachefs/bkey.c + create mode 100644 fs/bcachefs/bkey.h + create mode 100644 fs/bcachefs/bkey_buf.h + create mode 100644 fs/bcachefs/bkey_cmp.h + create mode 100644 fs/bcachefs/bkey_methods.c + create mode 100644 fs/bcachefs/bkey_methods.h + create mode 100644 fs/bcachefs/bkey_sort.c + create mode 100644 fs/bcachefs/bkey_sort.h + create mode 100644 fs/bcachefs/bset.c + create mode 100644 fs/bcachefs/bset.h + create mode 100644 fs/bcachefs/btree_cache.c + create mode 100644 fs/bcachefs/btree_cache.h + create mode 100644 fs/bcachefs/btree_gc.c + create mode 100644 fs/bcachefs/btree_gc.h + create mode 100644 fs/bcachefs/btree_io.c + create mode 100644 fs/bcachefs/btree_io.h + create mode 100644 fs/bcachefs/btree_iter.c + create mode 100644 fs/bcachefs/btree_iter.h + create mode 100644 fs/bcachefs/btree_journal_iter.c + create mode 100644 fs/bcachefs/btree_journal_iter.h + create mode 100644 fs/bcachefs/btree_key_cache.c + create mode 100644 fs/bcachefs/btree_key_cache.h + create mode 100644 fs/bcachefs/btree_locking.c + create mode 100644 fs/bcachefs/btree_locking.h + create mode 100644 fs/bcachefs/btree_trans_commit.c + create mode 100644 fs/bcachefs/btree_types.h + create mode 100644 fs/bcachefs/btree_update.c + create mode 100644 fs/bcachefs/btree_update.h + create mode 100644 fs/bcachefs/btree_update_interior.c + create mode 100644 fs/bcachefs/btree_update_interior.h + create mode 100644 fs/bcachefs/btree_write_buffer.c + create mode 100644 fs/bcachefs/btree_write_buffer.h + create mode 100644 fs/bcachefs/btree_write_buffer_types.h + create mode 100644 fs/bcachefs/buckets.c + create mode 100644 fs/bcachefs/buckets.h + create mode 100644 fs/bcachefs/buckets_types.h + create mode 100644 fs/bcachefs/buckets_waiting_for_journal.c + create mode 100644 fs/bcachefs/buckets_waiting_for_journal.h + create mode 100644 fs/bcachefs/buckets_waiting_for_journal_types.h + create mode 100644 fs/bcachefs/chardev.c + create mode 100644 fs/bcachefs/chardev.h + create mode 100644 fs/bcachefs/checksum.c + create mode 100644 fs/bcachefs/checksum.h + create mode 100644 fs/bcachefs/clock.c + create mode 100644 fs/bcachefs/clock.h + create mode 100644 fs/bcachefs/clock_types.h + create mode 100644 fs/bcachefs/compress.c + create mode 100644 fs/bcachefs/compress.h + create mode 100644 fs/bcachefs/counters.c + create mode 100644 fs/bcachefs/counters.h + create mode 100644 fs/bcachefs/darray.h + create mode 100644 fs/bcachefs/data_update.c + create mode 100644 fs/bcachefs/data_update.h + create mode 100644 fs/bcachefs/debug.c + create mode 100644 fs/bcachefs/debug.h + create mode 100644 fs/bcachefs/dirent.c + create mode 100644 fs/bcachefs/dirent.h + create mode 100644 fs/bcachefs/disk_groups.c + create mode 100644 fs/bcachefs/disk_groups.h + create mode 100644 fs/bcachefs/ec.c + create mode 100644 fs/bcachefs/ec.h + create mode 100644 fs/bcachefs/ec_types.h + create mode 100644 fs/bcachefs/errcode.c + create mode 100644 fs/bcachefs/errcode.h + create mode 100644 fs/bcachefs/error.c + create mode 100644 fs/bcachefs/error.h + create mode 100644 fs/bcachefs/extent_update.c + create mode 100644 fs/bcachefs/extent_update.h + create mode 100644 fs/bcachefs/extents.c + create mode 100644 fs/bcachefs/extents.h + create mode 100644 fs/bcachefs/extents_types.h + create mode 100644 fs/bcachefs/eytzinger.h + create mode 100644 fs/bcachefs/fifo.h + create mode 100644 fs/bcachefs/fs-common.c + create mode 100644 fs/bcachefs/fs-common.h + create mode 100644 fs/bcachefs/fs-io-buffered.c + create mode 100644 fs/bcachefs/fs-io-buffered.h + create mode 100644 fs/bcachefs/fs-io-direct.c + create mode 100644 fs/bcachefs/fs-io-direct.h + create mode 100644 fs/bcachefs/fs-io-pagecache.c + create mode 100644 fs/bcachefs/fs-io-pagecache.h + create mode 100644 fs/bcachefs/fs-io.c + create mode 100644 fs/bcachefs/fs-io.h + create mode 100644 fs/bcachefs/fs-ioctl.c + create mode 100644 fs/bcachefs/fs-ioctl.h + create mode 100644 fs/bcachefs/fs.c + create mode 100644 fs/bcachefs/fs.h + create mode 100644 fs/bcachefs/fsck.c + create mode 100644 fs/bcachefs/fsck.h + create mode 100644 fs/bcachefs/inode.c + create mode 100644 fs/bcachefs/inode.h + create mode 100644 fs/bcachefs/io_misc.c + create mode 100644 fs/bcachefs/io_misc.h + create mode 100644 fs/bcachefs/io_read.c + create mode 100644 fs/bcachefs/io_read.h + create mode 100644 fs/bcachefs/io_write.c + create mode 100644 fs/bcachefs/io_write.h + create mode 100644 fs/bcachefs/io_write_types.h + create mode 100644 fs/bcachefs/journal.c + create mode 100644 fs/bcachefs/journal.h + create mode 100644 fs/bcachefs/journal_io.c + create mode 100644 fs/bcachefs/journal_io.h + create mode 100644 fs/bcachefs/journal_reclaim.c + create mode 100644 fs/bcachefs/journal_reclaim.h + create mode 100644 fs/bcachefs/journal_sb.c + create mode 100644 fs/bcachefs/journal_sb.h + create mode 100644 fs/bcachefs/journal_seq_blacklist.c + create mode 100644 fs/bcachefs/journal_seq_blacklist.h + create mode 100644 fs/bcachefs/journal_types.h + create mode 100644 fs/bcachefs/keylist.c + create mode 100644 fs/bcachefs/keylist.h + create mode 100644 fs/bcachefs/keylist_types.h + create mode 100644 fs/bcachefs/logged_ops.c + create mode 100644 fs/bcachefs/logged_ops.h + create mode 100644 fs/bcachefs/lru.c + create mode 100644 fs/bcachefs/lru.h + create mode 100644 fs/bcachefs/mean_and_variance.c + create mode 100644 fs/bcachefs/mean_and_variance.h + create mode 100644 fs/bcachefs/mean_and_variance_test.c + create mode 100644 fs/bcachefs/migrate.c + create mode 100644 fs/bcachefs/migrate.h + create mode 100644 fs/bcachefs/move.c + create mode 100644 fs/bcachefs/move.h + create mode 100644 fs/bcachefs/move_types.h + create mode 100644 fs/bcachefs/movinggc.c + create mode 100644 fs/bcachefs/movinggc.h + create mode 100644 fs/bcachefs/nocow_locking.c + create mode 100644 fs/bcachefs/nocow_locking.h + create mode 100644 fs/bcachefs/nocow_locking_types.h + create mode 100644 fs/bcachefs/opts.c + create mode 100644 fs/bcachefs/opts.h + create mode 100644 fs/bcachefs/printbuf.c + create mode 100644 fs/bcachefs/printbuf.h + create mode 100644 fs/bcachefs/quota.c + create mode 100644 fs/bcachefs/quota.h + create mode 100644 fs/bcachefs/quota_types.h + create mode 100644 fs/bcachefs/rebalance.c + create mode 100644 fs/bcachefs/rebalance.h + create mode 100644 fs/bcachefs/rebalance_types.h + create mode 100644 fs/bcachefs/recovery.c + create mode 100644 fs/bcachefs/recovery.h + create mode 100644 fs/bcachefs/recovery_types.h + create mode 100644 fs/bcachefs/reflink.c + create mode 100644 fs/bcachefs/reflink.h + create mode 100644 fs/bcachefs/replicas.c + create mode 100644 fs/bcachefs/replicas.h + create mode 100644 fs/bcachefs/replicas_types.h + create mode 100644 fs/bcachefs/sb-clean.c + create mode 100644 fs/bcachefs/sb-clean.h + create mode 100644 fs/bcachefs/sb-members.c + create mode 100644 fs/bcachefs/sb-members.h + create mode 100644 fs/bcachefs/seqmutex.h + create mode 100644 fs/bcachefs/siphash.c + create mode 100644 fs/bcachefs/siphash.h + create mode 100644 fs/bcachefs/six.c + create mode 100644 fs/bcachefs/six.h + create mode 100644 fs/bcachefs/snapshot.c + create mode 100644 fs/bcachefs/snapshot.h + create mode 100644 fs/bcachefs/str_hash.h + create mode 100644 fs/bcachefs/subvolume.c + create mode 100644 fs/bcachefs/subvolume.h + create mode 100644 fs/bcachefs/subvolume_types.h + create mode 100644 fs/bcachefs/super-io.c + create mode 100644 fs/bcachefs/super-io.h + create mode 100644 fs/bcachefs/super.c + create mode 100644 fs/bcachefs/super.h + create mode 100644 fs/bcachefs/super_types.h + create mode 100644 fs/bcachefs/sysfs.c + create mode 100644 fs/bcachefs/sysfs.h + create mode 100644 fs/bcachefs/tests.c + create mode 100644 fs/bcachefs/tests.h + create mode 100644 fs/bcachefs/trace.c + create mode 100644 fs/bcachefs/trace.h + create mode 100644 fs/bcachefs/two_state_shared_lock.c + create mode 100644 fs/bcachefs/two_state_shared_lock.h + create mode 100644 fs/bcachefs/util.c + create mode 100644 fs/bcachefs/util.h + create mode 100644 fs/bcachefs/varint.c + create mode 100644 fs/bcachefs/varint.h + create mode 100644 fs/bcachefs/vstructs.h + create mode 100644 fs/bcachefs/xattr.c + create mode 100644 fs/bcachefs/xattr.h + rename {drivers/md/bcache => include/linux}/closure.h (93%) + rename {drivers/md/bcache => lib}/closure.c (88%) +$ git am -3 ../patches/0001-bcachefs-convert-to-dynamically-allocated-shrinkers.patch +Applying: bcachefs: convert to dynamically allocated shrinkers +$ git reset HEAD^ +Unstaged changes after reset: +M fs/bcachefs/btree_cache.c +M fs/bcachefs/btree_key_cache.c +M fs/bcachefs/btree_types.h +M fs/bcachefs/fs.c +M fs/bcachefs/sysfs.c +$ git add -A . +$ git commit -v -a --amend +[master c138d4126af9] Merge branch 'for-next' of https://evilpiepirate.org/git/bcachefs.git + Date: Mon Oct 30 09:24:20 2023 +1100 +Merging pidfd/for-next (a901a3568fd2 Merge tag 'iomap-6.5-merge-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux.git pidfd/for-next +Already up to date. +Merging fscrypt/for-next (15baf55481de fscrypt: track master key presence separately from secret) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/fs/fscrypt/linux.git fscrypt/for-next +Auto-merging fs/ceph/crypto.c +Auto-merging fs/f2fs/super.c +Auto-merging include/linux/fs.h +Merge made by the 'ort' strategy. + Documentation/filesystems/fscrypt.rst | 109 ++++++++++++++++------ + fs/ceph/crypto.c | 1 + + fs/crypto/bio.c | 39 ++++---- + fs/crypto/crypto.c | 163 ++++++++++++++++++--------------- + fs/crypto/fname.c | 6 +- + fs/crypto/fscrypt_private.h | 164 ++++++++++++++++++++++------------ + fs/crypto/hooks.c | 4 +- + fs/crypto/inline_crypt.c | 32 +++---- + fs/crypto/keyring.c | 82 ++++++++++------- + fs/crypto/keysetup.c | 62 +++++++------ + fs/crypto/keysetup_v1.c | 20 +++-- + fs/crypto/policy.c | 83 +++++++++++------ + fs/ext4/crypto.c | 13 +-- + fs/f2fs/super.c | 13 +-- + fs/ubifs/crypto.c | 3 +- + include/linux/fs.h | 4 +- + include/linux/fscrypt.h | 82 ++++++++++------- + include/uapi/linux/fscrypt.h | 3 +- + 18 files changed, 540 insertions(+), 343 deletions(-) +Merging afs/afs-next (0a278bc196e7 afs: Automatically generate trace tag enums) +$ git merge -m Merge branch 'afs-next' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git afs/afs-next +Merge made by the 'ort' strategy. + include/trace/events/afs.h | 475 ++++++++++++++------------------------------- + 1 file changed, 148 insertions(+), 327 deletions(-) +Merging btrfs/for-next (c6e8f898f56f btrfs: open code timespec64 in struct btrfs_inode) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git btrfs/for-next +Auto-merging fs/btrfs/backref.c +Auto-merging fs/btrfs/backref.h +Auto-merging fs/btrfs/ctree.c +Auto-merging fs/btrfs/ctree.h +Auto-merging fs/btrfs/relocation.c +Auto-merging fs/btrfs/super.c +Auto-merging fs/btrfs/volumes.c +Merge made by the 'ort' strategy. + fs/btrfs/Kconfig | 21 - + fs/btrfs/Makefile | 3 +- + fs/btrfs/accessors.h | 16 + + fs/btrfs/async-thread.c | 12 +- + fs/btrfs/async-thread.h | 6 +- + fs/btrfs/backref.c | 5 +- + fs/btrfs/backref.h | 10 +- + fs/btrfs/bio.c | 47 +- + fs/btrfs/block-group.c | 178 +-- + fs/btrfs/block-rsv.c | 24 +- + fs/btrfs/btrfs_inode.h | 80 +- + fs/btrfs/check-integrity.c | 2871 ---------------------------------- + fs/btrfs/check-integrity.h | 20 - + fs/btrfs/compression.c | 6 +- + fs/btrfs/ctree.c | 340 ++-- + fs/btrfs/ctree.h | 142 +- + fs/btrfs/defrag.c | 152 +- + fs/btrfs/defrag.h | 2 +- + fs/btrfs/delalloc-space.c | 6 +- + fs/btrfs/delayed-inode.c | 27 +- + fs/btrfs/delayed-inode.h | 1 - + fs/btrfs/delayed-ref.c | 199 ++- + fs/btrfs/delayed-ref.h | 70 +- + fs/btrfs/dev-replace.c | 3 +- + fs/btrfs/dir-item.c | 8 +- + fs/btrfs/dir-item.h | 9 + + fs/btrfs/disk-io.c | 142 +- + fs/btrfs/disk-io.h | 3 +- + fs/btrfs/extent-io-tree.c | 272 ++-- + fs/btrfs/extent-io-tree.h | 7 +- + fs/btrfs/extent-tree.c | 538 ++++--- + fs/btrfs/extent-tree.h | 15 +- + fs/btrfs/extent_io.c | 39 +- + fs/btrfs/extent_io.h | 4 +- + fs/btrfs/file-item.c | 17 +- + fs/btrfs/file.c | 61 +- + fs/btrfs/free-space-cache.c | 28 +- + fs/btrfs/free-space-tree.c | 17 +- + fs/btrfs/fs.h | 69 +- + fs/btrfs/inode-item.c | 21 +- + fs/btrfs/inode-item.h | 8 + + fs/btrfs/inode.c | 182 +-- + fs/btrfs/ioctl.c | 23 +- + fs/btrfs/locking.c | 20 +- + fs/btrfs/messages.c | 32 +- + fs/btrfs/messages.h | 14 +- + fs/btrfs/ordered-data.c | 127 +- + fs/btrfs/ordered-data.h | 17 +- + fs/btrfs/print-tree.c | 35 + + fs/btrfs/props.c | 1 + + fs/btrfs/qgroup.c | 872 +++++++---- + fs/btrfs/qgroup.h | 149 +- + fs/btrfs/raid-stripe-tree.c | 274 ++++ + fs/btrfs/raid-stripe-tree.h | 50 + + fs/btrfs/ref-verify.c | 9 +- + fs/btrfs/reflink.c | 3 +- + fs/btrfs/relocation.c | 208 ++- + fs/btrfs/relocation.h | 9 +- + fs/btrfs/root-tree.c | 12 +- + fs/btrfs/root-tree.h | 8 +- + fs/btrfs/scrub.c | 78 +- + fs/btrfs/send.c | 6 +- + fs/btrfs/space-info.c | 64 +- + fs/btrfs/space-info.h | 3 +- + fs/btrfs/super.c | 87 +- + fs/btrfs/sysfs.c | 53 +- + fs/btrfs/tests/extent-buffer-tests.c | 6 +- + fs/btrfs/tests/inode-tests.c | 12 +- + fs/btrfs/transaction.c | 231 +-- + fs/btrfs/transaction.h | 20 +- + fs/btrfs/tree-checker.c | 48 +- + fs/btrfs/tree-log.c | 81 +- + fs/btrfs/ulist.c | 3 +- + fs/btrfs/uuid-tree.c | 6 +- + fs/btrfs/verity.c | 4 +- + fs/btrfs/volumes.c | 417 +++-- + fs/btrfs/volumes.h | 39 +- + fs/btrfs/xattr.c | 12 +- + fs/btrfs/zoned.c | 452 ++++-- + fs/btrfs/zstd.c | 11 +- + include/trace/events/btrfs.h | 83 +- + include/uapi/linux/btrfs.h | 3 + + include/uapi/linux/btrfs_tree.h | 60 +- + 83 files changed, 4030 insertions(+), 5293 deletions(-) + delete mode 100644 fs/btrfs/check-integrity.c + delete mode 100644 fs/btrfs/check-integrity.h + create mode 100644 fs/btrfs/raid-stripe-tree.c + create mode 100644 fs/btrfs/raid-stripe-tree.h +Merging ceph/master (07bb00ef00ac ceph: fix type promotion bug on 32bit systems) +$ git merge -m Merge branch 'master' of git://github.com/ceph/ceph-client.git ceph/master +Already up to date. +Merging cifs/for-next (f0fea94ed6c7 cifs: update internal module version number for cifs.ko) +$ git merge -m Merge branch 'for-next' of git://git.samba.org/sfrench/cifs-2.6.git cifs/for-next +Merge made by the 'ort' strategy. + fs/smb/client/cifs_debug.c | 6 ++++++ + fs/smb/client/cifsfs.c | 1 + + fs/smb/client/cifsfs.h | 4 ++-- + fs/smb/client/cifspdu.h | 2 +- + fs/smb/client/cifsproto.h | 7 ++++++- + fs/smb/client/inode.c | 4 ++++ + fs/smb/client/ntlmssp.h | 4 ++-- + fs/smb/client/sess.c | 12 +++++++++--- + fs/smb/client/smb2misc.c | 2 +- + fs/smb/client/smb2ops.c | 8 +++++++- + fs/smb/client/transport.c | 11 +---------- + fs/smb/common/smb2pdu.h | 24 +++++++++++++++++++++++- + 12 files changed, 63 insertions(+), 22 deletions(-) +Merging configfs/for-next (4425c1d9b44d configfs: improve item creation performance) +$ git merge -m Merge branch 'for-next' of git://git.infradead.org/users/hch/configfs.git configfs/for-next +Merge made by the 'ort' strategy. + fs/configfs/configfs_internal.h | 4 ++-- + fs/configfs/dir.c | 42 +++++++++++++++++++++++++++++++---------- + fs/configfs/inode.c | 24 ----------------------- + 3 files changed, 34 insertions(+), 36 deletions(-) +Merging ecryptfs/next (a3d78fe3e1ae fs: ecryptfs: comment typo fix) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs.git ecryptfs/next +Auto-merging fs/ecryptfs/crypto.c +Auto-merging fs/ecryptfs/read_write.c +Merge made by the 'ort' strategy. + fs/ecryptfs/crypto.c | 2 +- + fs/ecryptfs/keystore.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) +Merging erofs/dev (3120ee29695a erofs: tidy up redundant includes) +$ git merge -m Merge branch 'dev' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git erofs/dev +Merge made by the 'ort' strategy. + Documentation/filesystems/erofs.rst | 2 +- + fs/erofs/Kconfig | 7 +--- + fs/erofs/compress.h | 6 +++ + fs/erofs/data.c | 2 - + fs/erofs/decompressor.c | 63 +++++++++++++++++++++++++++-- + fs/erofs/decompressor_deflate.c | 6 +-- + fs/erofs/decompressor_lzma.c | 7 +--- + fs/erofs/internal.h | 42 ++----------------- + fs/erofs/super.c | 81 +++++-------------------------------- + 9 files changed, 87 insertions(+), 129 deletions(-) +Merging exfat/dev (b3a62a988600 exfat: support create zero-size directory) +$ git merge -m Merge branch 'dev' of git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat.git exfat/dev +Merge made by the 'ort' strategy. + fs/exfat/dir.c | 12 +++---- + fs/exfat/exfat_fs.h | 8 +++++ + fs/exfat/file.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + fs/exfat/namei.c | 36 +++++++++++++++------ + fs/exfat/super.c | 7 ++++ + 5 files changed, 141 insertions(+), 15 deletions(-) +Merging ext3/for_next (7f680e5f256f Pull ext2 conversion of directory code to folios.) +$ git merge -m Merge branch 'for_next' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git ext3/for_next +Auto-merging fs/quota/dquot.c +Merge made by the 'ort' strategy. + fs/ext2/dir.c | 214 +++++++++++++++++++++--------------------- + fs/ext2/ext2.h | 23 ++--- + fs/ext2/namei.c | 32 +++---- + fs/notify/fanotify/fanotify.h | 4 +- + fs/quota/dquot.c | 14 +++ + fs/udf/ecma_167.h | 2 +- + fs/udf/udf_sb.h | 2 +- + include/linux/highmem.h | 18 +++- + 8 files changed, 166 insertions(+), 143 deletions(-) +Merging ext4/dev (c388da1dad59 ext4: properly sync file size update after O_SYNC direct IO) +$ git merge -m Merge branch 'dev' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git ext4/dev +Auto-merging fs/ext4/ext4.h +Auto-merging fs/ext4/extents_status.c +Auto-merging fs/ext4/inode.c +Auto-merging fs/ext4/super.c +Merge made by the 'ort' strategy. + fs/ext4/acl.h | 5 + + fs/ext4/balloc.c | 16 +- + fs/ext4/ext4.h | 8 +- + fs/ext4/extents.c | 14 +- + fs/ext4/extents_status.c | 127 ++++++++--- + fs/ext4/fast_commit.c | 8 +- + fs/ext4/file.c | 169 ++++++-------- + fs/ext4/inode.c | 14 +- + fs/ext4/mballoc-test.c | 349 ++++++++++++++++++++++++++++ + fs/ext4/mballoc.c | 581 +++++++++++++++++------------------------------ + fs/ext4/namei.c | 3 +- + fs/ext4/resize.c | 94 +++----- + fs/ext4/super.c | 17 +- + fs/jbd2/recovery.c | 13 +- + 14 files changed, 828 insertions(+), 590 deletions(-) + create mode 100644 fs/ext4/mballoc-test.c +Merging f2fs/dev (1e7bef5f90ed f2fs: finish previous checkpoints before returning from remount) +$ git merge -m Merge branch 'dev' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git f2fs/dev +Auto-merging fs/f2fs/super.c +Merge made by the 'ort' strategy. + fs/f2fs/compress.c | 63 +++++++++++++++++-------------- + fs/f2fs/data.c | 35 ++++++++++++++---- + fs/f2fs/extent_cache.c | 53 +++++++++++--------------- + fs/f2fs/file.c | 17 ++++++++- + fs/f2fs/inode.c | 2 +- + fs/f2fs/node.c | 20 +++++++--- + fs/f2fs/segment.c | 90 +++++++++++++++++++++++++++------------------ + fs/f2fs/segment.h | 4 +- + fs/f2fs/super.c | 98 ++++++++++++++++++++++++++++++++++--------------- + fs/f2fs/xattr.c | 20 ++++++---- + include/linux/f2fs_fs.h | 70 +++++++++++++++++++++-------------- + 11 files changed, 295 insertions(+), 177 deletions(-) +Merging fsverity/for-next (919dc320956e fsverity: skip PKCS#7 parser when keyring is empty) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/fs/fsverity/linux.git fsverity/for-next +Already up to date. +Merging fuse/for-next (ae3024a4c499 docs/fuse-io: Document the usage of DIRECT_IO_ALLOW_MMAP) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git fuse/for-next +Merge made by the 'ort' strategy. + Documentation/filesystems/fuse-io.rst | 3 ++- + fs/fuse/file.c | 6 +++--- + fs/fuse/fuse_i.h | 4 ++-- + fs/fuse/inode.c | 6 +++--- + include/uapi/linux/fuse.h | 7 +++---- + 5 files changed, 13 insertions(+), 13 deletions(-) +Merging gfs2/for-next (26ad55ecccd5 gfs2: fs: derive f_fsid from s_uuid) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git gfs2/for-next +Auto-merging fs/gfs2/aops.c +Auto-merging fs/gfs2/bmap.c +Auto-merging fs/gfs2/ops_fstype.c +Auto-merging fs/gfs2/quota.c +Auto-merging fs/gfs2/quota.h +Merge made by the 'ort' strategy. + fs/gfs2/acl.h | 8 ++-- + fs/gfs2/aops.c | 72 ++++++++++++++++---------------- + fs/gfs2/aops.h | 6 +-- + fs/gfs2/bmap.c | 72 ++++++++++++++++++++++---------- + fs/gfs2/bmap.h | 38 ++++++++--------- + fs/gfs2/dir.c | 2 +- + fs/gfs2/dir.h | 38 ++++++++--------- + fs/gfs2/file.c | 18 +++++--- + fs/gfs2/glock.h | 113 ++++++++++++++++++++++----------------------------- + fs/gfs2/glops.c | 13 ------ + fs/gfs2/glops.h | 4 +- + fs/gfs2/incore.h | 2 +- + fs/gfs2/inode.c | 30 +++++++++----- + fs/gfs2/inode.h | 56 ++++++++++++------------- + fs/gfs2/log.h | 46 ++++++++++----------- + fs/gfs2/lops.h | 22 +++++----- + fs/gfs2/meta_io.h | 20 ++++----- + fs/gfs2/ops_fstype.c | 24 +++++------ + fs/gfs2/quota.c | 31 +++++++++----- + fs/gfs2/quota.h | 35 ++++++++-------- + fs/gfs2/recovery.h | 18 ++++---- + fs/gfs2/rgrp.c | 12 +++--- + fs/gfs2/rgrp.h | 81 ++++++++++++++++++------------------ + fs/gfs2/super.c | 19 +++------ + fs/gfs2/super.h | 50 +++++++++++------------ + fs/gfs2/trans.h | 22 +++++----- + fs/gfs2/util.h | 8 ++-- + fs/gfs2/xattr.c | 6 +-- + fs/gfs2/xattr.h | 12 +++--- + 29 files changed, 446 insertions(+), 432 deletions(-) +Merging jfs/jfs-next (a779ed754e52 jfs: define xtree root and page independently) +$ git merge -m Merge branch 'jfs-next' of git://github.com/kleikamp/linux-shaggy.git jfs/jfs-next +Merge made by the 'ort' strategy. + fs/jfs/jfs_dinode.h | 2 +- + fs/jfs/jfs_dmap.c | 23 ++++++++++++++++++----- + fs/jfs/jfs_imap.c | 11 +++++++---- + fs/jfs/jfs_incore.h | 2 +- + fs/jfs/jfs_txnmgr.c | 4 ++-- + fs/jfs/jfs_xtree.c | 4 ++-- + fs/jfs/jfs_xtree.h | 37 +++++++++++++++++++++++-------------- + 7 files changed, 54 insertions(+), 29 deletions(-) +Merging ksmbd/ksmbd-for-next (0c180317c654 ksmbd: add support for surrogate pair conversion) +$ git merge -m Merge branch 'ksmbd-for-next' of https://github.com/smfrench/smb3-kernel.git ksmbd/ksmbd-for-next +Merge made by the 'ort' strategy. + fs/smb/server/ksmbd_work.c | 43 ++++----- + fs/smb/server/mgmt/user_config.h | 1 - + fs/smb/server/transport_rdma.c | 40 ++++++--- + fs/smb/server/unicode.c | 187 +++++++++++++++++++++++++++++---------- + fs/smb/server/vfs.c | 25 +----- + 5 files changed, 194 insertions(+), 102 deletions(-) +Merging nfs/linux-next (05d3ef8bba77 Linux 6.6-rc7) +$ git merge -m Merge branch 'linux-next' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6.git nfs/linux-next +Already up to date. +Merging nfs-anna/linux-next (379e4adfddd6 NFSv4.1: fixup use EXCHGID4_FLAG_USE_PNFS_DS for DS server) +$ git merge -m Merge branch 'linux-next' of git://git.linux-nfs.org/projects/anna/linux-nfs.git nfs-anna/linux-next +Already up to date. +Merging nfsd/nfsd-next (3fd2ca5be07f svcrdma: Fix tracepoint printk format) +$ git merge -m Merge branch 'nfsd-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux nfsd/nfsd-next +Auto-merging fs/locks.c +Auto-merging fs/nfsd/filecache.c +Auto-merging fs/nfsd/nfs4state.c +Auto-merging fs/nfsd/vfs.c +Auto-merging include/linux/exportfs.h +Auto-merging lib/Kconfig +Auto-merging lib/Makefile +Merge made by the 'ort' strategy. + Documentation/filesystems/nfs/exporting.rst | 7 + + Documentation/netlink/specs/nfsd.yaml | 89 + + fs/lockd/svc.c | 7 +- + fs/lockd/svclock.c | 43 +- + fs/locks.c | 12 +- + fs/nfs/callback.c | 46 +- + fs/nfsd/Makefile | 3 +- + fs/nfsd/blocklayoutxdr.c | 6 +- + fs/nfsd/blocklayoutxdr.h | 4 +- + fs/nfsd/export.c | 32 +- + fs/nfsd/export.h | 4 +- + fs/nfsd/filecache.c | 27 +- + fs/nfsd/flexfilelayoutxdr.c | 6 +- + fs/nfsd/flexfilelayoutxdr.h | 4 +- + fs/nfsd/netlink.c | 32 + + fs/nfsd/netlink.h | 22 + + fs/nfsd/nfs3proc.c | 5 +- + fs/nfsd/nfs4callback.c | 97 +- + fs/nfsd/nfs4layouts.c | 6 +- + fs/nfsd/nfs4proc.c | 32 +- + fs/nfsd/nfs4state.c | 156 +- + fs/nfsd/nfs4xdr.c | 2700 +++++++++++++++------------ + fs/nfsd/nfsctl.c | 203 ++ + fs/nfsd/nfsd.h | 17 + + fs/nfsd/nfsfh.c | 2 +- + fs/nfsd/nfsfh.h | 3 +- + fs/nfsd/nfssvc.c | 42 +- + fs/nfsd/pnfs.h | 6 +- + fs/nfsd/state.h | 27 +- + fs/nfsd/stats.c | 4 +- + fs/nfsd/stats.h | 18 +- + fs/nfsd/trace.h | 87 + + fs/nfsd/vfs.c | 61 +- + fs/nfsd/vfs.h | 4 +- + fs/nfsd/xdr4.h | 154 +- + fs/nfsd/xdr4cb.h | 18 + + include/linux/exportfs.h | 14 + + include/linux/iversion.h | 2 +- + include/linux/llist.h | 46 + + include/linux/lockd/lockd.h | 2 +- + include/linux/lwq.h | 124 ++ + include/linux/nfs4.h | 262 ++- + include/linux/sunrpc/svc.h | 45 +- + include/linux/sunrpc/svc_xprt.h | 2 +- + include/linux/sunrpc/xprt.h | 3 +- + include/trace/events/rpcrdma.h | 10 +- + include/trace/events/sunrpc.h | 1 - + include/uapi/linux/nfsd_netlink.h | 39 + + lib/Kconfig | 5 + + lib/Makefile | 2 +- + lib/llist.c | 28 + + lib/lwq.c | 158 ++ + net/sunrpc/backchannel_rqst.c | 13 +- + net/sunrpc/svc.c | 155 +- + net/sunrpc/svc_xprt.c | 238 ++- + net/sunrpc/xprtrdma/backchannel.c | 6 +- + net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 3 +- + tools/net/ynl/Makefile.deps | 1 + + tools/net/ynl/generated/Makefile | 2 +- + tools/net/ynl/generated/nfsd-user.c | 95 + + tools/net/ynl/generated/nfsd-user.h | 33 + + 61 files changed, 3531 insertions(+), 1744 deletions(-) + create mode 100644 Documentation/netlink/specs/nfsd.yaml + create mode 100644 fs/nfsd/netlink.c + create mode 100644 fs/nfsd/netlink.h + create mode 100644 include/linux/lwq.h + create mode 100644 include/uapi/linux/nfsd_netlink.h + create mode 100644 lib/lwq.c + create mode 100644 tools/net/ynl/generated/nfsd-user.c + create mode 100644 tools/net/ynl/generated/nfsd-user.h +Merging ntfs3/master (e4494770a5ca fs/ntfs3: Avoid possible memory leak) +$ git merge -m Merge branch 'master' of https://github.com/Paragon-Software-Group/linux-ntfs3.git ntfs3/master +Already up to date. +Merging orangefs/for-next (31720a2b109b orangefs: Fix kmemleak in orangefs_{kernel,client}_debug_init()) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/hubcap/linux orangefs/for-next +Already up to date. +Merging overlayfs/overlayfs-next (0b41c33dd34b ovl: Add documentation on nesting of overlayfs mounts) +$ git merge -m Merge branch 'overlayfs-next' of git://git.kernel.org/pub/scm/linux/kernel/git/overlayfs/vfs.git overlayfs/overlayfs-next +Auto-merging fs/btrfs/xattr.c +Auto-merging fs/f2fs/xattr.c +Auto-merging fs/fuse/fuse_i.h +Auto-merging fs/gfs2/super.h +Auto-merging fs/gfs2/xattr.c +Auto-merging fs/inode.c +Auto-merging fs/namespace.c +Auto-merging fs/nfs/nfs4proc.c +Auto-merging fs/ntfs3/ntfs_fs.h +Auto-merging fs/ntfs3/xattr.c +Auto-merging fs/smb/client/cifsfs.h +Auto-merging fs/super.c +Auto-merging include/linux/fs.h +Auto-merging mm/shmem.c +Merge made by the 'ort' strategy. + Documentation/filesystems/overlayfs.rst | 23 +++ + fs/9p/xattr.c | 8 +- + fs/9p/xattr.h | 2 +- + fs/afs/internal.h | 2 +- + fs/afs/xattr.c | 2 +- + fs/btrfs/xattr.c | 2 +- + fs/btrfs/xattr.h | 2 +- + fs/ceph/super.h | 2 +- + fs/ceph/xattr.c | 2 +- + fs/ecryptfs/ecryptfs_kernel.h | 2 +- + fs/ecryptfs/inode.c | 2 +- + fs/erofs/xattr.c | 2 +- + fs/erofs/xattr.h | 4 +- + fs/ext2/xattr.c | 4 +- + fs/ext2/xattr.h | 2 +- + fs/ext4/xattr.c | 2 +- + fs/ext4/xattr.h | 2 +- + fs/f2fs/xattr.c | 4 +- + fs/f2fs/xattr.h | 2 +- + fs/fuse/fuse_i.h | 2 +- + fs/fuse/xattr.c | 2 +- + fs/gfs2/super.h | 4 +- + fs/gfs2/xattr.c | 4 +- + fs/hfs/attr.c | 2 +- + fs/hfs/hfs_fs.h | 2 +- + fs/hfsplus/xattr.c | 2 +- + fs/hfsplus/xattr.h | 2 +- + fs/inode.c | 8 +- + fs/internal.h | 12 +- + fs/jffs2/xattr.c | 2 +- + fs/jffs2/xattr.h | 2 +- + fs/jfs/jfs_xattr.h | 2 +- + fs/jfs/xattr.c | 2 +- + fs/kernfs/inode.c | 2 +- + fs/kernfs/kernfs-internal.h | 2 +- + fs/namespace.c | 36 +++-- + fs/nfs/nfs.h | 2 +- + fs/nfs/nfs4_fs.h | 2 +- + fs/nfs/nfs4proc.c | 2 +- + fs/ntfs3/ntfs_fs.h | 2 +- + fs/ntfs3/xattr.c | 2 +- + fs/ocfs2/xattr.c | 4 +- + fs/ocfs2/xattr.h | 2 +- + fs/open.c | 2 +- + fs/orangefs/orangefs-kernel.h | 2 +- + fs/orangefs/xattr.c | 2 +- + fs/overlayfs/Makefile | 2 +- + fs/overlayfs/copy_up.c | 142 +++++++++++------ + fs/overlayfs/dir.c | 66 ++++---- + fs/overlayfs/export.c | 7 +- + fs/overlayfs/file.c | 88 ++++++++--- + fs/overlayfs/inode.c | 165 +++---------------- + fs/overlayfs/namei.c | 52 ++++-- + fs/overlayfs/overlayfs.h | 72 +++++++-- + fs/overlayfs/readdir.c | 27 +++- + fs/overlayfs/super.c | 87 ++-------- + fs/overlayfs/util.c | 117 +++++++++++++- + fs/overlayfs/xattrs.c | 271 ++++++++++++++++++++++++++++++++ + fs/reiserfs/reiserfs.h | 2 +- + fs/reiserfs/xattr.c | 4 +- + fs/smb/client/cifsfs.h | 2 +- + fs/smb/client/xattr.c | 2 +- + fs/squashfs/squashfs.h | 2 +- + fs/squashfs/xattr.c | 2 +- + fs/super.c | 1 + + fs/ubifs/ubifs.h | 2 +- + fs/ubifs/xattr.c | 2 +- + fs/xattr.c | 6 +- + fs/xfs/xfs_xattr.c | 2 +- + fs/xfs/xfs_xattr.h | 2 +- + include/linux/fs.h | 2 +- + include/linux/mount.h | 4 +- + include/linux/pseudo_fs.h | 2 +- + kernel/acct.c | 4 +- + mm/shmem.c | 2 +- + net/socket.c | 2 +- + 76 files changed, 841 insertions(+), 481 deletions(-) + create mode 100644 fs/overlayfs/xattrs.c +Merging ubifs/next (75690493591f ubifs: ubifs_link: Fix wrong name len calculating when UBIFS is encrypted) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs.git ubifs/next +Auto-merging fs/ubifs/super.c +Merge made by the 'ort' strategy. + drivers/mtd/ubi/block.c | 4 +- + drivers/mtd/ubi/build.c | 25 ++++++++-- + drivers/mtd/ubi/cdev.c | 3 +- + drivers/mtd/ubi/eba.c | 3 -- + drivers/mtd/ubi/fastmap-wl.c | 112 +++++++++++++++++++++++++++++++++---------- + drivers/mtd/ubi/fastmap.c | 66 +++---------------------- + drivers/mtd/ubi/ubi.h | 10 +++- + drivers/mtd/ubi/wl.c | 48 ++++++++++++------- + drivers/mtd/ubi/wl.h | 6 ++- + fs/ubifs/dir.c | 4 +- + fs/ubifs/file.c | 3 ++ + fs/ubifs/journal.c | 1 + + fs/ubifs/super.c | 5 +- + fs/ubifs/tnc.c | 1 + + include/uapi/mtd/ubi-user.h | 4 +- + 15 files changed, 179 insertions(+), 116 deletions(-) +Merging v9fs/9p-next (ce0708796420 9p/net: fix possible memory leak in p9_check_errors()) +$ git merge -m Merge branch '9p-next' of git://github.com/martinetd/linux v9fs/9p-next +Auto-merging fs/9p/xattr.c +Merge made by the 'ort' strategy. + fs/9p/v9fs.c | 1 + + fs/9p/v9fs_vfs.h | 1 - + fs/9p/xattr.c | 5 +++-- + net/9p/client.c | 8 +++++--- + net/9p/trans_fd.c | 21 ++++++++++++++++----- + net/9p/trans_xen.c | 15 +++++++-------- + 6 files changed, 32 insertions(+), 19 deletions(-) +Merging v9fs-ericvh/ericvh/for-next (2dde18cd1d8f Linux 6.5) +$ git merge -m Merge branch 'ericvh/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git v9fs-ericvh/ericvh/for-next +Already up to date. +Merging xfs/for-next (cbc06310c36f xfs: reinstate the old i_version counter as STATX_CHANGE_COOKIE) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git xfs/for-next +Already up to date. +Merging zonefs/for-next (8812387d0569 zonefs: set FMODE_CAN_ODIRECT instead of a dummy direct_IO method) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs.git zonefs/for-next +Already up to date. +Merging iomap/iomap-for-next (3ac974796e5d iomap: fix short copy in iomap_write_iter()) +$ git merge -m Merge branch 'iomap-for-next' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git iomap/iomap-for-next +Already up to date. +Merging djw-vfs/vfs-for-next (ce85a1e04645 xfs: stabilize fs summary counters for online fsck) +$ git merge -m Merge branch 'vfs-for-next' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git djw-vfs/vfs-for-next +Already up to date. +Merging file-locks/locks-next (e0152e7481c6 Merge tag 'riscv-for-linus-6.6-mw1' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux) +$ git merge -m Merge branch 'locks-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git file-locks/locks-next +Already up to date. +Merging iversion/iversion-next (e0152e7481c6 Merge tag 'riscv-for-linus-6.6-mw1' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux) +$ git merge -m Merge branch 'iversion-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git iversion/iversion-next +Already up to date. +Merging vfs-brauner/vfs.all (46af9de45cb5 Merge branch 'vfs.f_fsid' into vfs.all) +$ git merge -m Merge branch 'vfs.all' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs-brauner/vfs.all +Auto-merging Documentation/filesystems/nfs/exporting.rst +Auto-merging block/bdev.c +Auto-merging drivers/md/bcache/bcache.h +Auto-merging drivers/md/bcache/super.c +Auto-merging fs/ceph/mds_client.c +Auto-merging fs/char_dev.c +Auto-merging fs/configfs/inode.c +Auto-merging fs/erofs/data.c +Auto-merging fs/erofs/internal.h +Auto-merging fs/erofs/super.c +Auto-merging fs/exfat/exfat_fs.h +Auto-merging fs/exfat/file.c +Auto-merging fs/exfat/namei.c +Auto-merging fs/exfat/super.c +Auto-merging fs/ext2/dir.c +CONFLICT (content): Merge conflict in fs/ext2/dir.c +Auto-merging fs/ext4/ext4.h +Auto-merging fs/ext4/extents.c +Auto-merging fs/ext4/inode.c +Auto-merging fs/ext4/namei.c +Auto-merging fs/ext4/super.c +Auto-merging fs/f2fs/file.c +Auto-merging fs/f2fs/inode.c +Auto-merging fs/f2fs/super.c +Auto-merging fs/file_table.c +Auto-merging fs/fuse/inode.c +Auto-merging fs/gfs2/bmap.c +Auto-merging fs/gfs2/dir.c +Auto-merging fs/gfs2/glock.c +Auto-merging fs/gfs2/glops.c +Auto-merging fs/gfs2/inode.c +Auto-merging fs/gfs2/quota.c +Auto-merging fs/gfs2/super.c +Auto-merging fs/hugetlbfs/inode.c +Auto-merging fs/inode.c +Auto-merging fs/jfs/jfs_imap.c +Auto-merging fs/namespace.c +Auto-merging fs/nfs/super.c +Auto-merging fs/nfsd/export.c +Auto-merging fs/nfsd/nfs3proc.c +Auto-merging fs/nfsd/nfs4proc.c +Auto-merging fs/nfsd/nfsctl.c +Auto-merging fs/nfsd/vfs.c +Auto-merging fs/notify/dnotify/dnotify.c +Auto-merging fs/notify/fanotify/fanotify_user.c +Auto-merging fs/ntfs3/file.c +Auto-merging fs/ocfs2/alloc.c +Auto-merging fs/ocfs2/aops.c +Auto-merging fs/ocfs2/dlmfs/dlmfs.c +Auto-merging fs/ocfs2/namei.c +Auto-merging fs/overlayfs/file.c +Auto-merging fs/overlayfs/inode.c +Auto-merging fs/overlayfs/super.c +Auto-merging fs/overlayfs/util.c +Auto-merging fs/pipe.c +Auto-merging fs/proc/base.c +Auto-merging fs/proc/inode.c +Auto-merging fs/proc/task_mmu.c +Auto-merging fs/reiserfs/inode.c +Auto-merging fs/smb/client/inode.c +Auto-merging fs/smb/client/smb2ops.c +Auto-merging fs/super.c +Auto-merging fs/ubifs/dir.c +Auto-merging fs/ubifs/file.c +Auto-merging fs/ubifs/journal.c +Auto-merging fs/ubifs/super.c +Auto-merging fs/ufs/inode.c +Auto-merging fs/xfs/xfs_buf.c +CONFLICT (content): Merge conflict in fs/xfs/xfs_buf.c +Auto-merging fs/xfs/xfs_buf.h +Auto-merging include/linux/exportfs.h +Auto-merging include/linux/fs.h +Auto-merging include/linux/swap.h +Auto-merging kernel/fork.c +Auto-merging mm/shmem.c +Resolved 'fs/ext2/dir.c' using previous resolution. +Resolved 'fs/xfs/xfs_buf.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master d6c33edc8b8f] Merge branch 'vfs.all' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git +$ git diff -M --stat --summary HEAD^.. + Documentation/filesystems/files.rst | 53 ++-- + Documentation/filesystems/nfs/exporting.rst | 7 +- + Documentation/filesystems/porting.rst | 16 + + arch/arc/kernel/troubleshoot.c | 6 +- + arch/powerpc/platforms/cell/spufs/coredump.c | 11 +- + arch/powerpc/platforms/cell/spufs/inode.c | 2 +- + arch/s390/hypfs/inode.c | 4 +- + arch/x86/include/asm/uaccess.h | 2 +- + arch/x86/lib/copy_mc.c | 8 +- + block/bdev.c | 65 +++- + block/disk-events.c | 18 +- + block/fops.c | 44 ++- + block/genhd.c | 19 +- + block/ioctl.c | 11 +- + block/partitions/core.c | 43 ++- + drivers/android/binderfs.c | 8 +- + drivers/block/ataflop.c | 4 +- + drivers/block/drbd/drbd_int.h | 2 + + drivers/block/drbd/drbd_nl.c | 65 ++-- + drivers/block/floppy.c | 4 +- + drivers/block/pktcdvd.c | 76 ++--- + drivers/block/rnbd/rnbd-srv.c | 27 +- + drivers/block/rnbd/rnbd-srv.h | 2 +- + drivers/block/xen-blkback/blkback.c | 4 +- + drivers/block/xen-blkback/common.h | 4 +- + drivers/block/xen-blkback/xenbus.c | 40 +-- + drivers/block/zram/zram_drv.c | 31 +- + drivers/block/zram/zram_drv.h | 2 +- + drivers/char/sonypi.c | 2 +- + drivers/gpu/drm/i915/gem/i915_gem_mman.c | 6 +- + drivers/infiniband/hw/hfi1/file_ops.c | 2 +- + drivers/infiniband/hw/qib/qib_file_ops.c | 2 +- + drivers/infiniband/hw/qib/qib_fs.c | 4 +- + drivers/md/bcache/bcache.h | 2 + + drivers/md/bcache/super.c | 95 +++--- + drivers/md/dm.c | 20 +- + drivers/md/md.c | 23 +- + drivers/md/md.h | 4 +- + drivers/misc/ibmasm/ibmasmfs.c | 2 +- + drivers/misc/ibmvmc.c | 2 +- + drivers/mtd/devices/block2mtd.c | 51 +-- + drivers/nvme/target/io-cmd-bdev.c | 20 +- + drivers/nvme/target/nvmet.h | 1 + + drivers/platform/x86/sony-laptop.c | 2 +- + drivers/s390/block/dasd.c | 12 +- + drivers/s390/block/dasd_genhd.c | 45 ++- + drivers/s390/block/dasd_int.h | 2 +- + drivers/s390/block/dasd_ioctl.c | 2 +- + drivers/target/target_core_iblock.c | 19 +- + drivers/target/target_core_iblock.h | 1 + + drivers/target/target_core_pscsi.c | 26 +- + drivers/target/target_core_pscsi.h | 2 +- + drivers/tty/tty_io.c | 10 +- + drivers/usb/core/devio.c | 26 +- + drivers/usb/gadget/function/f_fs.c | 4 +- + drivers/usb/gadget/legacy/inode.c | 2 +- + fs/9p/vfs_inode.c | 6 +- + fs/9p/vfs_inode_dotl.c | 16 +- + fs/adfs/inode.c | 13 +- + fs/affs/amigaffs.c | 4 +- + fs/affs/inode.c | 17 +- + fs/affs/namei.c | 1 + + fs/afs/dynroot.c | 2 +- + fs/afs/inode.c | 8 +- + fs/afs/write.c | 2 +- + fs/attr.c | 4 +- + fs/autofs/autofs_i.h | 20 +- + fs/autofs/init.c | 9 +- + fs/autofs/inode.c | 443 ++++++++++++++++----------- + fs/autofs/root.c | 6 +- + fs/bad_inode.c | 2 +- + fs/befs/linuxvfs.c | 11 +- + fs/bfs/dir.c | 9 +- + fs/bfs/inode.c | 12 +- + fs/binfmt_misc.c | 2 +- + fs/btrfs/delayed-inode.c | 20 +- + fs/btrfs/dev-replace.c | 14 +- + fs/btrfs/file.c | 18 +- + fs/btrfs/inode.c | 51 +-- + fs/btrfs/ioctl.c | 18 +- + fs/btrfs/reflink.c | 2 +- + fs/btrfs/transaction.c | 3 +- + fs/btrfs/tree-log.c | 12 +- + fs/btrfs/volumes.c | 107 +++---- + fs/btrfs/volumes.h | 6 +- + fs/ceph/addr.c | 10 +- + fs/ceph/caps.c | 4 +- + fs/ceph/file.c | 2 +- + fs/ceph/inode.c | 64 ++-- + fs/ceph/mds_client.c | 8 +- + fs/ceph/snap.c | 4 +- + fs/char_dev.c | 2 +- + fs/coda/coda_linux.c | 6 +- + fs/coda/dir.c | 2 +- + fs/coda/file.c | 2 +- + fs/configfs/inode.c | 8 +- + fs/cramfs/inode.c | 6 +- + fs/debugfs/inode.c | 2 +- + fs/devpts/inode.c | 6 +- + fs/efivarfs/file.c | 2 +- + fs/efivarfs/inode.c | 2 +- + fs/efivarfs/super.c | 2 + + fs/efs/inode.c | 5 +- + fs/efs/super.c | 1 + + fs/erofs/data.c | 4 +- + fs/erofs/inode.c | 3 +- + fs/erofs/internal.h | 2 +- + fs/erofs/super.c | 21 +- + fs/exfat/exfat_fs.h | 1 + + fs/exfat/file.c | 7 +- + fs/exfat/inode.c | 31 +- + fs/exfat/misc.c | 8 + + fs/exfat/namei.c | 31 +- + fs/exfat/super.c | 4 +- + fs/exportfs/expfs.c | 54 +++- + fs/ext2/dir.c | 6 +- + fs/ext2/ialloc.c | 2 +- + fs/ext2/inode.c | 13 +- + fs/ext2/super.c | 3 +- + fs/ext4/ext4.h | 22 +- + fs/ext4/extents.c | 11 +- + fs/ext4/fsmap.c | 9 +- + fs/ext4/ialloc.c | 4 +- + fs/ext4/inline.c | 4 +- + fs/ext4/inode.c | 19 +- + fs/ext4/ioctl.c | 13 +- + fs/ext4/namei.c | 10 +- + fs/ext4/super.c | 55 ++-- + fs/ext4/xattr.c | 8 +- + fs/f2fs/dir.c | 6 +- + fs/f2fs/f2fs.h | 11 +- + fs/f2fs/file.c | 14 +- + fs/f2fs/inline.c | 2 +- + fs/f2fs/inode.c | 24 +- + fs/f2fs/namei.c | 4 +- + fs/f2fs/recovery.c | 8 +- + fs/f2fs/super.c | 16 +- + fs/fat/inode.c | 25 +- + fs/fat/misc.c | 6 +- + fs/fat/nfs.c | 1 + + fs/fhandle.c | 6 +- + fs/file.c | 153 +++++++-- + fs/file_table.c | 53 ++-- + fs/freevxfs/vxfs_inode.c | 6 +- + fs/freevxfs/vxfs_super.c | 2 + + fs/fs-writeback.c | 41 ++- + fs/fsopen.c | 1 + + fs/fuse/control.c | 2 +- + fs/fuse/dir.c | 10 +- + fs/fuse/inode.c | 36 +-- + fs/fuse/readdir.c | 6 +- + fs/gfs2/bmap.c | 10 +- + fs/gfs2/dir.c | 10 +- + fs/gfs2/glock.c | 11 +- + fs/gfs2/glops.c | 11 +- + fs/gfs2/inode.c | 7 +- + fs/gfs2/quota.c | 2 +- + fs/gfs2/super.c | 12 +- + fs/hfs/catalog.c | 8 +- + fs/hfs/inode.c | 16 +- + fs/hfs/sysdep.c | 10 +- + fs/hfsplus/catalog.c | 8 +- + fs/hfsplus/inode.c | 22 +- + fs/hostfs/hostfs_kern.c | 12 +- + fs/hpfs/dir.c | 12 +- + fs/hpfs/inode.c | 16 +- + fs/hpfs/namei.c | 22 +- + fs/hpfs/super.c | 10 +- + fs/hugetlbfs/inode.c | 12 +- + fs/init.c | 6 +- + fs/inode.c | 35 ++- + fs/internal.h | 12 +- + fs/isofs/inode.c | 4 +- + fs/isofs/rock.c | 18 +- + fs/jffs2/dir.c | 35 ++- + fs/jffs2/file.c | 4 +- + fs/jffs2/fs.c | 20 +- + fs/jffs2/os-linux.h | 4 +- + fs/jffs2/super.c | 1 + + fs/jfs/inode.c | 2 +- + fs/jfs/jfs_imap.c | 20 +- + fs/jfs/jfs_inode.c | 4 +- + fs/jfs/jfs_logmgr.c | 33 +- + fs/jfs/jfs_logmgr.h | 2 +- + fs/jfs/jfs_mount.c | 3 +- + fs/jfs/namei.c | 20 +- + fs/jfs/super.c | 3 +- + fs/kernfs/inode.c | 6 +- + fs/libfs.c | 44 ++- + fs/minix/bitmap.c | 2 +- + fs/minix/dir.c | 6 +- + fs/minix/inode.c | 17 +- + fs/minix/itree_common.c | 2 +- + fs/namei.c | 31 +- + fs/namespace.c | 4 +- + fs/nfs/blocklayout/blocklayout.h | 2 +- + fs/nfs/blocklayout/dev.c | 74 +++-- + fs/nfs/callback_proc.c | 2 +- + fs/nfs/fscache.h | 4 +- + fs/nfs/inode.c | 30 +- + fs/nfs/super.c | 2 +- + fs/nfsd/blocklayout.c | 3 +- + fs/nfsd/export.c | 3 +- + fs/nfsd/nfs3proc.c | 4 +- + fs/nfsd/nfs4proc.c | 8 +- + fs/nfsd/nfsctl.c | 2 +- + fs/nfsd/vfs.c | 2 +- + fs/nilfs2/dir.c | 6 +- + fs/nilfs2/inode.c | 20 +- + fs/notify/dnotify/dnotify.c | 6 +- + fs/notify/fanotify/fanotify_user.c | 4 +- + fs/nsfs.c | 2 +- + fs/ntfs/inode.c | 25 +- + fs/ntfs/mft.c | 2 +- + fs/ntfs/namei.c | 1 + + fs/ntfs3/file.c | 6 +- + fs/ntfs3/frecord.c | 11 +- + fs/ntfs3/inode.c | 25 +- + fs/ntfs3/namei.c | 4 +- + fs/ntfs3/super.c | 1 + + fs/ocfs2/acl.c | 4 +- + fs/ocfs2/alloc.c | 6 +- + fs/ocfs2/aops.c | 6 +- + fs/ocfs2/cluster/heartbeat.c | 81 ++--- + fs/ocfs2/dir.c | 9 +- + fs/ocfs2/dlmfs/dlmfs.c | 4 +- + fs/ocfs2/dlmglue.c | 29 +- + fs/ocfs2/file.c | 30 +- + fs/ocfs2/inode.c | 28 +- + fs/ocfs2/move_extents.c | 4 +- + fs/ocfs2/namei.c | 16 +- + fs/ocfs2/refcounttree.c | 12 +- + fs/ocfs2/xattr.c | 4 +- + fs/omfs/inode.c | 12 +- + fs/open.c | 52 +++- + fs/openpromfs/inode.c | 4 +- + fs/orangefs/orangefs-utils.c | 16 +- + fs/overlayfs/file.c | 9 +- + fs/overlayfs/inode.c | 3 +- + fs/overlayfs/super.c | 24 +- + fs/overlayfs/util.c | 6 +- + fs/pipe.c | 66 ++-- + fs/proc/base.c | 4 +- + fs/proc/fd.c | 11 +- + fs/proc/inode.c | 2 +- + fs/proc/nommu.c | 2 +- + fs/proc/proc_sysctl.c | 2 +- + fs/proc/self.c | 2 +- + fs/proc/task_mmu.c | 4 +- + fs/proc/task_nommu.c | 2 +- + fs/proc/thread_self.c | 2 +- + fs/pstore/inode.c | 5 +- + fs/qnx4/inode.c | 6 +- + fs/qnx6/inode.c | 6 +- + fs/ramfs/inode.c | 7 +- + fs/reiserfs/inode.c | 26 +- + fs/reiserfs/journal.c | 56 ++-- + fs/reiserfs/namei.c | 8 +- + fs/reiserfs/procfs.c | 2 +- + fs/reiserfs/reiserfs.h | 11 +- + fs/reiserfs/stree.c | 5 +- + fs/reiserfs/super.c | 2 +- + fs/romfs/super.c | 5 +- + fs/smb/client/export.c | 11 +- + fs/smb/client/file.c | 18 +- + fs/smb/client/fscache.h | 6 +- + fs/smb/client/inode.c | 17 +- + fs/smb/client/smb2ops.c | 6 +- + fs/smb/server/smb2pdu.c | 8 +- + fs/squashfs/export.c | 1 + + fs/squashfs/inode.c | 6 +- + fs/stack.c | 4 +- + fs/stat.c | 4 +- + fs/super.c | 66 ++-- + fs/sysv/dir.c | 6 +- + fs/sysv/ialloc.c | 2 +- + fs/sysv/inode.c | 12 +- + fs/sysv/itree.c | 2 +- + fs/tracefs/inode.c | 2 +- + fs/ubifs/debug.c | 12 +- + fs/ubifs/dir.c | 23 +- + fs/ubifs/file.c | 16 +- + fs/ubifs/journal.c | 12 +- + fs/ubifs/super.c | 8 +- + fs/udf/ialloc.c | 4 +- + fs/udf/inode.c | 38 ++- + fs/udf/namei.c | 16 +- + fs/ufs/dir.c | 6 +- + fs/ufs/ialloc.c | 2 +- + fs/ufs/inode.c | 42 +-- + fs/ufs/super.c | 1 + + fs/vboxsf/utils.c | 15 +- + fs/xfs/libxfs/xfs_inode_buf.c | 10 +- + fs/xfs/libxfs/xfs_rtbitmap.c | 6 +- + fs/xfs/libxfs/xfs_trans_inode.c | 2 +- + fs/xfs/xfs_bmap_util.c | 7 +- + fs/xfs/xfs_buf.c | 22 +- + fs/xfs/xfs_buf.h | 3 +- + fs/xfs/xfs_inode.c | 4 +- + fs/xfs/xfs_inode_item.c | 4 +- + fs/xfs/xfs_iops.c | 8 +- + fs/xfs/xfs_itable.c | 12 +- + fs/xfs/xfs_rtalloc.c | 30 +- + fs/xfs/xfs_super.c | 42 +-- + fs/zonefs/super.c | 10 +- + include/linux/blkdev.h | 11 + + include/linux/device-mapper.h | 1 + + include/linux/exportfs.h | 51 ++- + include/linux/fdtable.h | 17 +- + include/linux/fs.h | 125 ++++++-- + include/linux/fs_stack.h | 6 +- + include/linux/fsnotify.h | 3 +- + include/linux/iov_iter.h | 274 +++++++++++++++++ + include/linux/namei.h | 26 +- + include/linux/pipe_fs_i.h | 22 +- + include/linux/pktcdvd.h | 4 +- + include/linux/skbuff.h | 3 + + include/linux/swap.h | 1 + + include/linux/uio.h | 34 +- + include/linux/watch_queue.h | 2 +- + init/do_mounts.c | 2 +- + io_uring/openclose.c | 9 +- + ipc/mqueue.c | 19 +- + kernel/bpf/inode.c | 5 +- + kernel/bpf/task_iter.c | 4 +- + kernel/fork.c | 4 +- + kernel/kcmp.c | 4 +- + kernel/power/hibernate.c | 14 +- + kernel/power/power.h | 2 +- + kernel/power/swap.c | 37 +-- + kernel/trace/trace_output.c | 2 +- + lib/iov_iter.c | 435 ++++++++------------------ + mm/readahead.c | 3 +- + mm/shmem.c | 20 +- + mm/swapfile.c | 23 +- + net/core/datagram.c | 75 ++++- + net/core/skbuff.c | 40 +++ + net/sunrpc/rpc_pipe.c | 2 +- + scripts/const_structs.checkpatch | 1 + + security/apparmor/apparmorfs.c | 7 +- + security/apparmor/policy_unpack.c | 4 +- + security/inode.c | 2 +- + security/selinux/selinuxfs.c | 2 +- + sound/core/pcm_native.c | 4 +- + 344 files changed, 3465 insertions(+), 2475 deletions(-) + create mode 100644 include/linux/iov_iter.h +$ git am -3 ../patches/bcachefs_convert_to_new_timestamp_accessors.patch +Applying: bcachefs: convert to new timestamp accessors +$ git reset HEAD^ +Unstaged changes after reset: +M fs/bcachefs/fs.c +$ git add -A . +$ git commit -v -a --amend +[master 7e43fcc7d07a] Merge branch 'vfs.all' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git + Date: Mon Oct 30 09:25:09 2023 +1100 +Merging vfs/for-next (1aee9158bc97 nfsd: lock_rename() needs both directories to live on the same fs) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git vfs/for-next +Already up to date. +Merging printk/for-next (fbddff2e98cf Merge branch 'for-6.7' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux.git printk/for-next +Merge made by the 'ort' strategy. + include/linux/console.h | 129 ++++++ + kernel/printk/Makefile | 2 +- + kernel/printk/internal.h | 31 ++ + kernel/printk/nbcon.c | 1029 ++++++++++++++++++++++++++++++++++++++++++++++ + kernel/printk/printk.c | 150 ++++--- + 5 files changed, 1276 insertions(+), 65 deletions(-) + create mode 100644 kernel/printk/nbcon.c +Merging pci/next (50b3ef14c26b Merge branch 'pci/misc') +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git pci/next +Auto-merging MAINTAINERS +Auto-merging drivers/pci/controller/dwc/pcie-qcom.c +Auto-merging drivers/pci/pcie/aer.c +Auto-merging drivers/pci/vgaarb.c +Auto-merging sound/pci/hda/hda_intel.c +Merge made by the 'ort' strategy. + .../devicetree/bindings/pci/rcar-gen4-pci-ep.yaml | 115 +++ + .../bindings/pci/rcar-gen4-pci-host.yaml | 127 ++++ + .../bindings/pci/snps,dw-pcie-common.yaml | 4 +- + .../devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 4 +- + .../devicetree/bindings/pci/snps,dw-pcie.yaml | 4 +- + .../devicetree/bindings/pci/xlnx,nwl-pcie.yaml | 2 +- + .../devicetree/bindings/pci/xlnx,xdma-host.yaml | 114 +++ + MAINTAINERS | 1 + + arch/alpha/kernel/sys_miata.c | 17 +- + arch/sh/drivers/pci/common.c | 11 +- + arch/x86/pci/fixup.c | 59 ++ + drivers/atm/iphase.c | 20 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 11 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 20 +- + drivers/gpu/drm/nouveau/nouveau_acpi.c | 11 +- + drivers/gpu/drm/qxl/qxl_drv.c | 11 +- + drivers/gpu/drm/radeon/radeon_bios.c | 20 +- + drivers/gpu/drm/virtio/virtgpu_drv.c | 2 +- + drivers/misc/pci_endpoint_test.c | 4 + + drivers/pci/Kconfig | 2 +- + drivers/pci/ats.c | 7 +- + drivers/pci/controller/Kconfig | 11 + + drivers/pci/controller/Makefile | 1 + + drivers/pci/controller/cadence/pcie-cadence-ep.c | 9 +- + drivers/pci/controller/cadence/pcie-cadence-plat.c | 5 - + drivers/pci/controller/dwc/Kconfig | 25 + + drivers/pci/controller/dwc/Makefile | 1 + + drivers/pci/controller/dwc/pci-exynos.c | 4 +- + drivers/pci/controller/dwc/pci-keystone.c | 8 +- + drivers/pci/controller/dwc/pci-layerscape-ep.c | 2 + + drivers/pci/controller/dwc/pci-layerscape.c | 2 +- + drivers/pci/controller/dwc/pcie-designware-ep.c | 52 +- + drivers/pci/controller/dwc/pcie-designware-host.c | 3 + + drivers/pci/controller/dwc/pcie-designware.c | 102 +-- + drivers/pci/controller/dwc/pcie-designware.h | 9 +- + drivers/pci/controller/dwc/pcie-kirin.c | 4 +- + drivers/pci/controller/dwc/pcie-qcom-ep.c | 48 +- + drivers/pci/controller/dwc/pcie-qcom.c | 52 +- + drivers/pci/controller/dwc/pcie-rcar-gen4.c | 527 +++++++++++++ + drivers/pci/controller/dwc/pcie-tegra194.c | 27 +- + .../pci/controller/mobiveil/pcie-mobiveil-host.c | 2 +- + drivers/pci/controller/pci-hyperv.c | 2 +- + drivers/pci/controller/pci-mvebu.c | 2 +- + drivers/pci/controller/pci-xgene.c | 7 +- + drivers/pci/controller/pcie-iproc.c | 2 +- + drivers/pci/controller/pcie-rcar-ep.c | 2 +- + drivers/pci/controller/pcie-rcar-host.c | 2 +- + drivers/pci/controller/pcie-xilinx-common.h | 31 + + drivers/pci/controller/pcie-xilinx-cpm.c | 38 +- + drivers/pci/controller/pcie-xilinx-dma-pl.c | 814 +++++++++++++++++++++ + drivers/pci/controller/pcie-xilinx-nwl.c | 18 +- + drivers/pci/controller/vmd.c | 10 +- + drivers/pci/endpoint/pci-epc-core.c | 13 +- + drivers/pci/hotplug/Kconfig | 12 + + drivers/pci/hotplug/Makefile | 1 + + drivers/pci/hotplug/acpiphp_ampere_altra.c | 127 ++++ + drivers/pci/hotplug/acpiphp_core.c | 3 +- + drivers/pci/hotplug/cpqphp_ctrl.c | 6 +- + drivers/pci/hotplug/cpqphp_pci.c | 22 +- + drivers/pci/hotplug/ibmphp.h | 5 +- + drivers/pci/hotplug/ibmphp_pci.c | 2 +- + drivers/pci/hotplug/pciehp_core.c | 3 +- + drivers/pci/hotplug/pciehp_hpc.c | 5 +- + drivers/pci/hotplug/pnv_php.c | 3 +- + drivers/pci/msi/msi.c | 10 +- + drivers/pci/p2pdma.c | 3 +- + drivers/pci/pci-acpi.c | 15 +- + drivers/pci/pci-sysfs.c | 17 +- + drivers/pci/pci.c | 69 +- + drivers/pci/pci.h | 3 + + drivers/pci/pcie/aer.c | 45 +- + drivers/pci/pcie/aspm.c | 84 ++- + drivers/pci/pcie/dpc.c | 42 +- + drivers/pci/pcie/pme.c | 4 +- + drivers/pci/pcie/portdrv.c | 7 +- + drivers/pci/pcie/ptm.c | 5 +- + drivers/pci/probe.c | 14 +- + drivers/pci/quirks.c | 75 +- + drivers/pci/search.c | 31 + + drivers/pci/setup-bus.c | 2 +- + drivers/pci/vc.c | 9 +- + drivers/pci/vgaarb.c | 14 +- + drivers/scsi/ipr.c | 12 +- + include/linux/logic_pio.h | 3 - + include/linux/pci.h | 29 + + include/linux/pci_ids.h | 1 + + include/uapi/linux/pci_regs.h | 24 +- + sound/pci/hda/hda_intel.c | 16 +- + 88 files changed, 2613 insertions(+), 511 deletions(-) + create mode 100644 Documentation/devicetree/bindings/pci/rcar-gen4-pci-ep.yaml + create mode 100644 Documentation/devicetree/bindings/pci/rcar-gen4-pci-host.yaml + create mode 100644 Documentation/devicetree/bindings/pci/xlnx,xdma-host.yaml + create mode 100644 drivers/pci/controller/dwc/pcie-rcar-gen4.c + create mode 100644 drivers/pci/controller/pcie-xilinx-common.h + create mode 100644 drivers/pci/controller/pcie-xilinx-dma-pl.c + create mode 100644 drivers/pci/hotplug/acpiphp_ampere_altra.c +Merging pstore/for-next/pstore (a19d48f7c5d5 pstore/platform: Add check for kstrdup) +$ git merge -m Merge branch 'for-next/pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git pstore/for-next/pstore +Merge made by the 'ort' strategy. + Documentation/admin-guide/pstore-blk.rst | 8 ++++---- + fs/pstore/platform.c | 9 ++++++++- + 2 files changed, 12 insertions(+), 5 deletions(-) +Merging hid/for-next (55ec92989f9b Merge branch 'for-6.6/upstream-fixes' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git hid/for-next +Merge made by the 'ort' strategy. + drivers/hid/hid-cp2112.c | 10 +- + drivers/hid/hid-ids.h | 1 + + drivers/hid/hid-lenovo.c | 122 +++++++++----- + drivers/hid/hid-logitech-hidpp.c | 176 ++++++++------------- + drivers/hid/hid-multitouch.c | 10 +- + drivers/hid/hid-nintendo.c | 133 +++++++++------- + drivers/hid/hid-nvidia-shield.c | 21 +-- + drivers/hid/hid-quirks.c | 1 + + drivers/hid/hid-rmi.c | 10 +- + drivers/hid/hid-uclogic-core-test.c | 7 + + drivers/hid/hid-uclogic-params-test.c | 16 +- + drivers/hid/usbhid/hid-core.c | 11 +- + include/linux/hid.h | 4 +- + tools/testing/selftests/hid/Makefile | 10 +- + tools/testing/selftests/hid/progs/hid.c | 3 - + .../testing/selftests/hid/progs/hid_bpf_helpers.h | 77 +++++++++ + 16 files changed, 355 insertions(+), 257 deletions(-) +Merging i2c/i2c/for-next (b871ee43a733 Merge branch 'i2c/for-mergewindow' into i2c/for-next) +$ git merge -m Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git i2c/i2c/for-next +Auto-merging MAINTAINERS +Auto-merging include/linux/acpi.h +Merge made by the 'ort' strategy. + Documentation/devicetree/bindings/eeprom/at24.yaml | 4 + + .../devicetree/bindings/i2c/i2c-demux-pinctrl.txt | 135 --------------- + .../devicetree/bindings/i2c/i2c-demux-pinctrl.yaml | 172 +++++++++++++++++++ + .../devicetree/bindings/i2c/qcom,i2c-cci.yaml | 2 + + Documentation/i2c/busses/i2c-i801.rst | 1 + + Documentation/i2c/fault-codes.rst | 4 + + MAINTAINERS | 1 + + drivers/i2c/busses/Kconfig | 1 + + drivers/i2c/busses/i2c-at91-core.c | 10 +- + drivers/i2c/busses/i2c-axxia.c | 8 +- + drivers/i2c/busses/i2c-brcmstb.c | 23 ++- + drivers/i2c/busses/i2c-cp2615.c | 2 +- + drivers/i2c/busses/i2c-exynos5.c | 80 ++++++++- + drivers/i2c/busses/i2c-gpio.c | 7 +- + drivers/i2c/busses/i2c-i801.c | 110 +++++-------- + drivers/i2c/busses/i2c-mt65xx.c | 12 +- + drivers/i2c/busses/i2c-mv64xxx.c | 11 +- + drivers/i2c/busses/i2c-omap.c | 8 +- + drivers/i2c/busses/i2c-powermac.c | 2 +- + drivers/i2c/busses/i2c-pxa.c | 7 +- + drivers/i2c/busses/i2c-qcom-geni.c | 1 + + drivers/i2c/busses/i2c-rcar.c | 182 +++++++++++++-------- + drivers/i2c/busses/i2c-riic.c | 2 +- + drivers/i2c/busses/i2c-s3c2410.c | 7 +- + drivers/i2c/busses/i2c-stm32f4.c | 32 ++-- + drivers/i2c/busses/i2c-stm32f7.c | 89 ++++++---- + drivers/i2c/busses/i2c-sun6i-p2wi.c | 5 + + drivers/i2c/i2c-atr.c | 2 +- + drivers/i2c/i2c-core-base.c | 19 ++- + drivers/i2c/i2c-core.h | 2 +- + drivers/i2c/i2c-dev.c | 18 +- + drivers/i2c/muxes/i2c-demux-pinctrl.c | 12 +- + drivers/i2c/muxes/i2c-mux-gpio.c | 7 +- + drivers/mfd/tps6586x.c | 50 +++++- + drivers/misc/eeprom/at24.c | 42 ++--- + include/linux/acpi.h | 5 + + include/linux/reboot.h | 3 + + kernel/reboot.c | 4 + + 38 files changed, 646 insertions(+), 436 deletions(-) + delete mode 100644 Documentation/devicetree/bindings/i2c/i2c-demux-pinctrl.txt + create mode 100644 Documentation/devicetree/bindings/i2c/i2c-demux-pinctrl.yaml +Merging i3c/i3c/next (57ec42b9a1b7 i3c: Fix typo "Provisional ID" to "Provisioned ID") +$ git merge -m Merge branch 'i3c/next' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux.git i3c/i3c/next +Merge made by the 'ort' strategy. + Documentation/ABI/testing/sysfs-bus-i3c | 4 ++-- + Documentation/devicetree/bindings/i3c/i3c.yaml | 4 ++-- + Documentation/driver-api/i3c/protocol.rst | 4 ++-- + drivers/i3c/master.c | 10 ++++++++-- + drivers/i3c/master/dw-i3c-master.c | 2 +- + drivers/i3c/master/i3c-master-cdns.c | 8 ++++---- + drivers/i3c/master/mipi-i3c-hci/cmd_v1.c | 1 + + drivers/i3c/master/mipi-i3c-hci/core.c | 14 ++++++++------ + drivers/i3c/master/mipi-i3c-hci/dma.c | 21 +++++++++++++-------- + drivers/i3c/master/svc-i3c-master.c | 4 ++-- + include/linux/i3c/device.h | 2 +- + include/linux/i3c/master.h | 2 +- + 12 files changed, 45 insertions(+), 31 deletions(-) +Merging dmi/dmi-for-next (13a0ac816d22 firmware: dmi: Fortify entry point length checks) +$ git merge -m Merge branch 'dmi-for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging.git dmi/dmi-for-next +Already up to date. +Merging hwmon-staging/hwmon-next (8293a6bcf50e hwmon: (aquacomputer_d5next) Check if temp sensors of legacy devices are connected) +$ git merge -m Merge branch 'hwmon-next' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-staging/hwmon-next +Auto-merging Documentation/devicetree/bindings/trivial-devices.yaml +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. + .../devicetree/bindings/hwmon/adi,ltc2991.yaml | 128 ++++++ + .../devicetree/bindings/hwmon/adi,max31827.yaml | 66 ++++ + .../devicetree/bindings/hwmon/ina3221.txt | 54 --- + .../devicetree/bindings/hwmon/npcm750-pwm-fan.txt | 6 +- + .../bindings/hwmon/pmbus/infineon,tda38640.yaml | 49 +++ + .../devicetree/bindings/hwmon/ti,ina2xx.yaml | 1 + + .../devicetree/bindings/hwmon/ti,ina3221.yaml | 121 ++++++ + .../devicetree/bindings/regulator/mps,mpq2286.yaml | 59 +++ + .../devicetree/bindings/trivial-devices.yaml | 2 - + Documentation/hwmon/adt7475.rst | 3 +- + Documentation/hwmon/aquacomputer_d5next.rst | 7 + + Documentation/hwmon/asus_ec_sensors.rst | 1 + + Documentation/hwmon/index.rst | 2 + + Documentation/hwmon/ltc2991.rst | 43 ++ + Documentation/hwmon/max31827.rst | 4 +- + Documentation/hwmon/nct6683.rst | 1 + + Documentation/hwmon/powerz.rst | 30 ++ + Documentation/hwmon/sch5627.rst | 10 + + MAINTAINERS | 16 + + drivers/hwmon/Kconfig | 26 +- + drivers/hwmon/Makefile | 2 + + drivers/hwmon/abituguru.c | 6 +- + drivers/hwmon/abituguru3.c | 5 +- + drivers/hwmon/adt7475.c | 68 +++- + drivers/hwmon/aquacomputer_d5next.c | 72 +++- + drivers/hwmon/asus-ec-sensors.c | 12 + + drivers/hwmon/da9052-hwmon.c | 6 +- + drivers/hwmon/dme1737.c | 6 +- + drivers/hwmon/f71805f.c | 6 +- + drivers/hwmon/f71882fg.c | 5 +- + drivers/hwmon/hs3001.c | 2 +- + drivers/hwmon/i5k_amb.c | 5 +- + drivers/hwmon/ina238.c | 3 +- + drivers/hwmon/ina3221.c | 33 +- + drivers/hwmon/ltc2991.c | 437 +++++++++++++++++++++ + drivers/hwmon/ltc2992.c | 6 +- + drivers/hwmon/max197.c | 6 +- + drivers/hwmon/max31827.c | 131 +++--- + drivers/hwmon/mc13783-adc.c | 6 +- + drivers/hwmon/nct6683.c | 3 + + drivers/hwmon/nct6775-platform.c | 4 +- + drivers/hwmon/npcm750-pwm-fan.c | 2 + + drivers/hwmon/occ/p9_sbe.c | 6 +- + drivers/hwmon/pc87360.c | 6 +- + drivers/hwmon/pc87427.c | 6 +- + drivers/hwmon/pmbus/max31785.c | 188 ++++++++- + drivers/hwmon/pmbus/mpq7932.c | 19 +- + drivers/hwmon/pmbus/pmbus.h | 24 ++ + drivers/hwmon/pmbus/tda38640.c | 154 +++++++- + drivers/hwmon/powerz.c | 275 +++++++++++++ + drivers/hwmon/sch5627.c | 267 +++++++++---- + drivers/hwmon/sch5636.c | 6 +- + drivers/hwmon/sch56xx-common.c | 107 +++++ + drivers/hwmon/sch56xx-common.h | 6 + + drivers/hwmon/sht15.c | 6 +- + drivers/hwmon/sis5595.c | 6 +- + drivers/hwmon/tmp513.c | 52 ++- + drivers/hwmon/ultra45_env.c | 6 +- + drivers/hwmon/via-cputemp.c | 5 +- + drivers/hwmon/via686a.c | 6 +- + drivers/hwmon/vt1211.c | 6 +- + drivers/hwmon/vt8231.c | 6 +- + drivers/hwmon/w83627hf.c | 6 +- + drivers/hwmon/w83781d.c | 7 +- + drivers/hwmon/xgene-hwmon.c | 6 +- + 65 files changed, 2260 insertions(+), 371 deletions(-) + create mode 100644 Documentation/devicetree/bindings/hwmon/adi,ltc2991.yaml + delete mode 100644 Documentation/devicetree/bindings/hwmon/ina3221.txt + create mode 100644 Documentation/devicetree/bindings/hwmon/pmbus/infineon,tda38640.yaml + create mode 100644 Documentation/devicetree/bindings/hwmon/ti,ina3221.yaml + create mode 100644 Documentation/devicetree/bindings/regulator/mps,mpq2286.yaml + create mode 100644 Documentation/hwmon/ltc2991.rst + create mode 100644 Documentation/hwmon/powerz.rst + create mode 100644 drivers/hwmon/ltc2991.c + create mode 100644 drivers/hwmon/powerz.c +Merging jc_docs/docs-next (e7abea958b7f docs: backporting: address feedback) +$ git merge -m Merge branch 'docs-next' of git://git.lwn.net/linux.git jc_docs/docs-next +Auto-merging Documentation/admin-guide/cgroup-v2.rst +Auto-merging Documentation/admin-guide/mm/memory-hotplug.rst +Auto-merging Documentation/arch/index.rst +Auto-merging Documentation/translations/zh_CN/arch/index.rst +Auto-merging MAINTAINERS +Auto-merging arch/riscv/include/uapi/asm/hwprobe.h +Auto-merging arch/riscv/kernel/sys_riscv.c +Auto-merging kernel/fork.c +Merge made by the 'ort' strategy. + Documentation/ABI/testing/sysfs-bus-papr-pmem | 2 +- + Documentation/PCI/pci-error-recovery.rst | 4 +- + Documentation/admin-guide/cgroup-v2.rst | 10 +- + Documentation/admin-guide/dynamic-debug-howto.rst | 2 +- + Documentation/admin-guide/efi-stub.rst | 2 +- + Documentation/admin-guide/hw-vuln/mds.rst | 32 +- + .../hw-vuln/processor_mmio_stale_data.rst | 13 +- + .../admin-guide/hw-vuln/tsx_async_abort.rst | 33 +- + Documentation/admin-guide/mm/memory-hotplug.rst | 10 +- + Documentation/admin-guide/spkguide.txt | 11 +- + Documentation/admin-guide/sysctl/fs.rst | 16 +- + Documentation/admin-guide/sysctl/vm.rst | 4 +- + Documentation/arch/index.rst | 4 +- + Documentation/{ => arch}/powerpc/associativity.rst | 0 + Documentation/{ => arch}/powerpc/booting.rst | 0 + Documentation/{ => arch}/powerpc/bootwrapper.rst | 0 + Documentation/{ => arch}/powerpc/cpu_families.rst | 0 + Documentation/{ => arch}/powerpc/cpu_features.rst | 0 + Documentation/{ => arch}/powerpc/cxl.rst | 0 + Documentation/{ => arch}/powerpc/cxlflash.rst | 2 +- + Documentation/{ => arch}/powerpc/dawr-power9.rst | 0 + Documentation/{ => arch}/powerpc/dexcr.rst | 0 + Documentation/{ => arch}/powerpc/dscr.rst | 0 + .../{ => arch}/powerpc/eeh-pci-error-recovery.rst | 0 + Documentation/{ => arch}/powerpc/elf_hwcaps.rst | 6 +- + Documentation/{ => arch}/powerpc/elfnote.rst | 0 + Documentation/{ => arch}/powerpc/features.rst | 0 + .../{ => arch}/powerpc/firmware-assisted-dump.rst | 0 + Documentation/{ => arch}/powerpc/hvcs.rst | 0 + Documentation/{ => arch}/powerpc/imc.rst | 0 + Documentation/{ => arch}/powerpc/index.rst | 0 + Documentation/{ => arch}/powerpc/isa-versions.rst | 0 + Documentation/{ => arch}/powerpc/kasan.txt | 0 + Documentation/{ => arch}/powerpc/kaslr-booke32.rst | 0 + Documentation/{ => arch}/powerpc/mpc52xx.rst | 0 + Documentation/{ => arch}/powerpc/papr_hcalls.rst | 0 + .../powerpc/pci_iov_resource_on_powernv.rst | 0 + Documentation/{ => arch}/powerpc/pmu-ebb.rst | 0 + Documentation/{ => arch}/powerpc/ptrace.rst | 0 + Documentation/{ => arch}/powerpc/qe_firmware.rst | 0 + Documentation/{ => arch}/powerpc/syscall64-abi.rst | 0 + .../{ => arch}/powerpc/transactional_memory.rst | 0 + Documentation/{ => arch}/powerpc/ultravisor.rst | 0 + Documentation/{ => arch}/powerpc/vas-api.rst | 0 + .../{ => arch}/powerpc/vcpudispatch_stats.rst | 0 + Documentation/{ => arch}/powerpc/vmemmap_dedup.rst | 0 + Documentation/{ => arch}/riscv/acpi.rst | 0 + .../{ => arch}/riscv/boot-image-header.rst | 0 + Documentation/{ => arch}/riscv/boot.rst | 0 + Documentation/{ => arch}/riscv/features.rst | 0 + Documentation/{ => arch}/riscv/hwprobe.rst | 0 + Documentation/{ => arch}/riscv/index.rst | 0 + .../{ => arch}/riscv/patch-acceptance.rst | 0 + Documentation/{ => arch}/riscv/uabi.rst | 0 + Documentation/{ => arch}/riscv/vector.rst | 0 + Documentation/{ => arch}/riscv/vm-layout.rst | 0 + Documentation/block/blk-mq.rst | 2 +- + Documentation/doc-guide/contributing.rst | 4 + + Documentation/driver-api/driver-model/devres.rst | 14 +- + Documentation/driver-api/pps.rst | 16 +- + Documentation/driver-api/pwm.rst | 6 +- + .../filesystems/xfs-online-fsck-design.rst | 2 +- + .../maintainer/maintainer-entry-profile.rst | 2 +- + Documentation/mm/overcommit-accounting.rst | 3 +- + Documentation/mm/page_tables.rst | 127 ++++ + Documentation/mm/vmemmap_dedup.rst | 2 +- + Documentation/process/backporting.rst | 604 ++++++++++++++++ + Documentation/process/index.rst | 3 +- + Documentation/process/submitting-patches.rst | 10 +- + Documentation/security/index.rst | 1 + + Documentation/security/snp-tdx-threat-model.rst | 253 +++++++ + Documentation/sphinx/cdomain.py | 4 +- + Documentation/sphinx/kernel_abi.py | 2 +- + Documentation/sphinx/kernel_feat.py | 2 +- + Documentation/sphinx/kerneldoc.py | 4 +- + Documentation/sphinx/kfigure.py | 2 +- + Documentation/sphinx/maintainers_include.py | 8 +- + Documentation/subsystem-apis.rst | 2 +- + .../translations/it_IT/riscv/patch-acceptance.rst | 2 +- + .../sp_SP/process/embargoed-hardware-issues.rst | 341 +++++++++ + Documentation/translations/sp_SP/process/index.rst | 2 + + .../translations/sp_SP/process/security-bugs.rst | 103 +++ + Documentation/translations/zh_CN/arch/index.rst | 2 +- + .../zh_CN/{ => arch}/riscv/boot-image-header.rst | 4 +- + .../translations/zh_CN/{ => arch}/riscv/index.rst | 4 +- + .../zh_CN/{ => arch}/riscv/patch-acceptance.rst | 4 +- + .../zh_CN/{ => arch}/riscv/vm-layout.rst | 4 +- + Documentation/translations/zh_CN/index.rst | 5 +- + .../zh_CN/maintainer/maintainer-entry-profile.rst | 2 +- + .../translations/zh_CN/subsystem-apis.rst | 110 +++ + .../translations/zh_TW/admin-guide/README.rst | 160 ++--- + .../translations/zh_TW/admin-guide/bootconfig.rst | 294 ++++++++ + .../translations/zh_TW/admin-guide/bug-bisect.rst | 10 +- + .../translations/zh_TW/admin-guide/bug-hunting.rst | 38 +- + .../zh_TW/admin-guide/clearing-warn-once.rst | 4 +- + .../translations/zh_TW/admin-guide/cpu-load.rst | 8 +- + .../translations/zh_TW/admin-guide/cputopology.rst | 97 +++ + .../translations/zh_TW/admin-guide/index.rst | 137 ++-- + .../translations/zh_TW/admin-guide/init.rst | 36 +- + .../zh_TW/admin-guide/lockup-watchdogs.rst | 67 ++ + .../zh_TW/admin-guide/mm/damon/index.rst | 30 + + .../zh_TW/admin-guide/mm/damon/lru_sort.rst | 264 +++++++ + .../zh_TW/admin-guide/mm/damon/reclaim.rst | 229 +++++++ + .../zh_TW/admin-guide/mm/damon/start.rst | 125 ++++ + .../zh_TW/admin-guide/mm/damon/usage.rst | 592 ++++++++++++++++ + .../translations/zh_TW/admin-guide/mm/index.rst | 50 ++ + .../translations/zh_TW/admin-guide/mm/ksm.rst | 199 ++++++ + .../zh_TW/admin-guide/reporting-issues.rst | 727 ++++++++++---------- + .../zh_TW/admin-guide/reporting-regressions.rst | 371 ++++++++++ + .../zh_TW/admin-guide/security-bugs.rst | 26 +- + .../translations/zh_TW/admin-guide/sysrq.rst | 281 ++++++++ + .../zh_TW/admin-guide/tainted-kernels.rst | 84 +-- + .../translations/zh_TW/admin-guide/unicode.rst | 10 +- + Documentation/translations/zh_TW/arch/arm/Booting | 176 +++++ + .../zh_TW/arch/arm/kernel_user_helpers.txt | 285 ++++++++ + .../translations/zh_TW/arch/arm64/amu.rst | 6 +- + .../translations/zh_TW/arch/arm64/booting.txt | 28 +- + .../translations/zh_TW/arch/arm64/elf_hwcaps.rst | 10 +- + .../zh_TW/arch/arm64/legacy_instructions.txt | 14 +- + .../translations/zh_TW/arch/arm64/memory.txt | 16 +- + .../translations/zh_TW/arch/arm64/perf.rst | 2 +- + .../zh_TW/arch/arm64/silicon-errata.txt | 28 +- + .../zh_TW/arch/arm64/tagged-pointers.txt | 10 +- + Documentation/translations/zh_TW/arch/index.rst | 29 + + .../translations/zh_TW/arch/loongarch/booting.rst | 49 ++ + .../translations/zh_TW/arch/loongarch/features.rst | 9 + + .../translations/zh_TW/arch/loongarch/index.rst | 28 + + .../zh_TW/arch/loongarch/introduction.rst | 354 ++++++++++ + .../zh_TW/arch/loongarch/irq-chip-model.rst | 158 +++++ + .../translations/zh_TW/arch/mips/booting.rst | 35 + + .../translations/zh_TW/arch/mips/features.rst | 14 + + .../translations/zh_TW/arch/mips/index.rst | 30 + + .../translations/zh_TW/arch/mips/ingenic-tcu.rst | 73 ++ + .../translations/zh_TW/arch/openrisc/index.rst | 33 + + .../zh_TW/arch/openrisc/openrisc_port.rst | 128 ++++ + .../translations/zh_TW/arch/openrisc/todo.rst | 24 + + .../translations/zh_TW/arch/parisc/debugging.rst | 46 ++ + .../translations/zh_TW/arch/parisc/index.rst | 32 + + .../translations/zh_TW/arch/parisc/registers.rst | 157 +++++ + Documentation/translations/zh_TW/cpu-freq/core.rst | 38 +- + .../translations/zh_TW/cpu-freq/cpu-drivers.rst | 158 ++--- + .../translations/zh_TW/cpu-freq/cpufreq-stats.rst | 52 +- + .../translations/zh_TW/cpu-freq/index.rst | 13 +- + .../translations/zh_TW/dev-tools/gcov.rst | 265 +++++++ + .../zh_TW/dev-tools/gdb-kernel-debugging.rst | 168 +++++ + .../translations/zh_TW/dev-tools/index.rst | 43 ++ + .../translations/zh_TW/dev-tools/kasan.rst | 463 +++++++++++++ + .../zh_TW/{sparse.txt => dev-tools/sparse.rst} | 4 +- + .../zh_TW/dev-tools/testing-overview.rst | 162 +++++ + .../translations/zh_TW/filesystems/debugfs.rst | 47 +- + .../translations/zh_TW/filesystems/index.rst | 2 +- + .../translations/zh_TW/filesystems/sysfs.txt | 14 +- + .../translations/zh_TW/filesystems/tmpfs.rst | 35 +- + .../translations/zh_TW/filesystems/virtiofs.rst | 9 +- + Documentation/translations/zh_TW/index.rst | 7 +- + .../translations/zh_TW/process/1.Intro.rst | 78 +-- + .../translations/zh_TW/process/2.Process.rst | 130 ++-- + .../translations/zh_TW/process/3.Early-stage.rst | 44 +- + .../translations/zh_TW/process/4.Coding.rst | 104 +-- + .../translations/zh_TW/process/5.Posting.rst | 80 +-- + .../translations/zh_TW/process/6.Followthrough.rst | 46 +- + .../zh_TW/process/7.AdvancedTopics.rst | 56 +- + .../translations/zh_TW/process/8.Conclusion.rst | 14 +- + .../process/code-of-conduct-interpretation.rst | 52 +- + .../translations/zh_TW/process/code-of-conduct.rst | 18 +- + .../translations/zh_TW/process/coding-style.rst | 405 +++++++---- + .../zh_TW/process/development-process.rst | 2 +- + .../translations/zh_TW/process/email-clients.rst | 295 +++++--- + .../zh_TW/process/embargoed-hardware-issues.rst | 76 +- + Documentation/translations/zh_TW/process/index.rst | 5 +- + .../zh_TW/process/kernel-driver-statement.rst | 2 +- + .../translations/zh_TW/process/license-rules.rst | 54 +- + .../zh_TW/process/management-style.rst | 60 +- + .../zh_TW/process/stable-api-nonsense.rst | 86 +-- + .../zh_TW/process/stable-kernel-rules.rst | 36 +- + .../zh_TW/process/submit-checklist.rst | 92 +-- + .../zh_TW/process/submitting-patches.rst | 761 ++++++++++----------- + .../zh_TW/process/volatile-considered-harmful.rst | 32 +- + Documentation/usb/gadget_uvc.rst | 2 +- + MAINTAINERS | 16 +- + arch/powerpc/kernel/exceptions-64s.S | 6 +- + arch/powerpc/kernel/paca.c | 2 +- + arch/powerpc/kvm/book3s_64_entry.S | 2 +- + arch/riscv/include/uapi/asm/hwprobe.h | 2 +- + arch/riscv/kernel/sys_riscv.c | 2 +- + drivers/soc/fsl/qe/qe.c | 2 +- + drivers/tty/hvc/hvcs.c | 2 +- + include/soc/fsl/qe/qe.h | 2 +- + kernel/fork.c | 15 +- + scripts/kernel-doc | 2 +- + 190 files changed, 9304 insertions(+), 2179 deletions(-) + rename Documentation/{ => arch}/powerpc/associativity.rst (100%) + rename Documentation/{ => arch}/powerpc/booting.rst (100%) + rename Documentation/{ => arch}/powerpc/bootwrapper.rst (100%) + rename Documentation/{ => arch}/powerpc/cpu_families.rst (100%) + rename Documentation/{ => arch}/powerpc/cpu_features.rst (100%) + rename Documentation/{ => arch}/powerpc/cxl.rst (100%) + rename Documentation/{ => arch}/powerpc/cxlflash.rst (99%) + rename Documentation/{ => arch}/powerpc/dawr-power9.rst (100%) + rename Documentation/{ => arch}/powerpc/dexcr.rst (100%) + rename Documentation/{ => arch}/powerpc/dscr.rst (100%) + rename Documentation/{ => arch}/powerpc/eeh-pci-error-recovery.rst (100%) + rename Documentation/{ => arch}/powerpc/elf_hwcaps.rst (97%) + rename Documentation/{ => arch}/powerpc/elfnote.rst (100%) + rename Documentation/{ => arch}/powerpc/features.rst (100%) + rename Documentation/{ => arch}/powerpc/firmware-assisted-dump.rst (100%) + rename Documentation/{ => arch}/powerpc/hvcs.rst (100%) + rename Documentation/{ => arch}/powerpc/imc.rst (100%) + rename Documentation/{ => arch}/powerpc/index.rst (100%) + rename Documentation/{ => arch}/powerpc/isa-versions.rst (100%) + rename Documentation/{ => arch}/powerpc/kasan.txt (100%) + rename Documentation/{ => arch}/powerpc/kaslr-booke32.rst (100%) + rename Documentation/{ => arch}/powerpc/mpc52xx.rst (100%) + rename Documentation/{ => arch}/powerpc/papr_hcalls.rst (100%) + rename Documentation/{ => arch}/powerpc/pci_iov_resource_on_powernv.rst (100%) + rename Documentation/{ => arch}/powerpc/pmu-ebb.rst (100%) + rename Documentation/{ => arch}/powerpc/ptrace.rst (100%) + rename Documentation/{ => arch}/powerpc/qe_firmware.rst (100%) + rename Documentation/{ => arch}/powerpc/syscall64-abi.rst (100%) + rename Documentation/{ => arch}/powerpc/transactional_memory.rst (100%) + rename Documentation/{ => arch}/powerpc/ultravisor.rst (100%) + rename Documentation/{ => arch}/powerpc/vas-api.rst (100%) + rename Documentation/{ => arch}/powerpc/vcpudispatch_stats.rst (100%) + rename Documentation/{ => arch}/powerpc/vmemmap_dedup.rst (100%) + rename Documentation/{ => arch}/riscv/acpi.rst (100%) + rename Documentation/{ => arch}/riscv/boot-image-header.rst (100%) + rename Documentation/{ => arch}/riscv/boot.rst (100%) + rename Documentation/{ => arch}/riscv/features.rst (100%) + rename Documentation/{ => arch}/riscv/hwprobe.rst (100%) + rename Documentation/{ => arch}/riscv/index.rst (100%) + rename Documentation/{ => arch}/riscv/patch-acceptance.rst (100%) + rename Documentation/{ => arch}/riscv/uabi.rst (100%) + rename Documentation/{ => arch}/riscv/vector.rst (100%) + rename Documentation/{ => arch}/riscv/vm-layout.rst (100%) + create mode 100644 Documentation/process/backporting.rst + create mode 100644 Documentation/security/snp-tdx-threat-model.rst + create mode 100644 Documentation/translations/sp_SP/process/embargoed-hardware-issues.rst + create mode 100644 Documentation/translations/sp_SP/process/security-bugs.rst + rename Documentation/translations/zh_CN/{ => arch}/riscv/boot-image-header.rst (96%) + rename Documentation/translations/zh_CN/{ => arch}/riscv/index.rst (79%) + rename Documentation/translations/zh_CN/{ => arch}/riscv/patch-acceptance.rst (93%) + rename Documentation/translations/zh_CN/{ => arch}/riscv/vm-layout.rst (98%) + create mode 100644 Documentation/translations/zh_CN/subsystem-apis.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/bootconfig.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/cputopology.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/lockup-watchdogs.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/mm/damon/index.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/mm/damon/lru_sort.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/mm/damon/reclaim.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/mm/damon/start.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/mm/damon/usage.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/mm/index.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/mm/ksm.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/reporting-regressions.rst + create mode 100644 Documentation/translations/zh_TW/admin-guide/sysrq.rst + create mode 100644 Documentation/translations/zh_TW/arch/arm/Booting + create mode 100644 Documentation/translations/zh_TW/arch/arm/kernel_user_helpers.txt + create mode 100644 Documentation/translations/zh_TW/arch/index.rst + create mode 100644 Documentation/translations/zh_TW/arch/loongarch/booting.rst + create mode 100644 Documentation/translations/zh_TW/arch/loongarch/features.rst + create mode 100644 Documentation/translations/zh_TW/arch/loongarch/index.rst + create mode 100644 Documentation/translations/zh_TW/arch/loongarch/introduction.rst + create mode 100644 Documentation/translations/zh_TW/arch/loongarch/irq-chip-model.rst + create mode 100644 Documentation/translations/zh_TW/arch/mips/booting.rst + create mode 100644 Documentation/translations/zh_TW/arch/mips/features.rst + create mode 100644 Documentation/translations/zh_TW/arch/mips/index.rst + create mode 100644 Documentation/translations/zh_TW/arch/mips/ingenic-tcu.rst + create mode 100644 Documentation/translations/zh_TW/arch/openrisc/index.rst + create mode 100644 Documentation/translations/zh_TW/arch/openrisc/openrisc_port.rst + create mode 100644 Documentation/translations/zh_TW/arch/openrisc/todo.rst + create mode 100644 Documentation/translations/zh_TW/arch/parisc/debugging.rst + create mode 100644 Documentation/translations/zh_TW/arch/parisc/index.rst + create mode 100644 Documentation/translations/zh_TW/arch/parisc/registers.rst + create mode 100644 Documentation/translations/zh_TW/dev-tools/gcov.rst + create mode 100644 Documentation/translations/zh_TW/dev-tools/gdb-kernel-debugging.rst + create mode 100644 Documentation/translations/zh_TW/dev-tools/index.rst + create mode 100644 Documentation/translations/zh_TW/dev-tools/kasan.rst + rename Documentation/translations/zh_TW/{sparse.txt => dev-tools/sparse.rst} (98%) + create mode 100644 Documentation/translations/zh_TW/dev-tools/testing-overview.rst +Merging v4l-dvb/master (48016737a9af media: platform: cadence: select MIPI_DPHY dependency) +$ git merge -m Merge branch 'master' of git://linuxtv.org/media_tree.git v4l-dvb/master +Auto-merging Documentation/devicetree/bindings/media/i2c/sony,imx415.yaml +Auto-merging Documentation/devicetree/bindings/media/samsung,fimc.yaml +Auto-merging Documentation/devicetree/bindings/trivial-devices.yaml +Auto-merging MAINTAINERS +Auto-merging arch/arm/configs/omap2plus_defconfig +Auto-merging drivers/media/pci/intel/ivsc/Kconfig +Auto-merging drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c +Auto-merging drivers/media/v4l2-core/v4l2-subdev.c +Auto-merging drivers/staging/media/atomisp/Kconfig +Merge made by the 'ort' strategy. + Documentation/admin-guide/media/mgb4.rst | 374 ++ + Documentation/admin-guide/media/pci-cardlist.rst | 1 + + Documentation/admin-guide/media/v4l-drivers.rst | 1 + + Documentation/admin-guide/media/visl.rst | 6 +- + .../devicetree/bindings/leds/irled/pwm-ir-tx.yaml | 5 +- + .../bindings/media/amlogic,meson6-ir.yaml | 1 + + .../devicetree/bindings/media/cdns,csi2rx.yaml | 1 + + .../devicetree/bindings/media/i2c/hynix,hi846.yaml | 7 +- + .../bindings/media/i2c/onnn,mt9m114.yaml | 114 + + .../bindings/media/i2c/ovti,ov02a10.yaml | 8 +- + .../devicetree/bindings/media/i2c/ovti,ov4689.yaml | 6 +- + .../devicetree/bindings/media/i2c/ovti,ov5640.yaml | 7 +- + .../devicetree/bindings/media/i2c/ovti,ov5642.yaml | 141 + + .../devicetree/bindings/media/i2c/ovti,ov5693.yaml | 2 +- + .../devicetree/bindings/media/i2c/sony,imx214.yaml | 2 +- + .../devicetree/bindings/media/i2c/sony,imx415.yaml | 10 +- + .../devicetree/bindings/media/nokia,n900-ir | 20 - + .../bindings/media/nuvoton,npcm-ece.yaml | 43 + + .../bindings/media/nuvoton,npcm-vcd.yaml | 72 + + .../bindings/media/qcom,sdm845-venus-v2.yaml | 8 + + .../devicetree/bindings/media/rockchip-vpu.yaml | 7 + + .../bindings/media/samsung,exynos4212-fimc-is.yaml | 15 +- + .../devicetree/bindings/media/samsung,fimc.yaml | 27 +- + .../bindings/media/ti,j721e-csi2rx-shim.yaml | 100 + + .../bindings/media/video-interfaces.yaml | 1 + + .../bindings/soc/nuvoton/nuvoton,gfxi.yaml | 39 + + .../devicetree/bindings/trivial-devices.yaml | 2 - + Documentation/driver-api/media/camera-sensor.rst | 188 +- + Documentation/driver-api/media/drivers/ccs/ccs.rst | 10 +- + Documentation/driver-api/media/v4l2-core.rst | 1 - + Documentation/driver-api/media/v4l2-dev.rst | 8 - + Documentation/driver-api/media/v4l2-videobuf.rst | 403 --- + .../zh_CN/video4linux/v4l2-framework.txt | 12 - + .../userspace-api/media/drivers/camera-sensor.rst | 104 + + .../userspace-api/media/drivers/index.rst | 2 + + .../userspace-api/media/drivers/npcm-video.rst | 66 + + Documentation/userspace-api/media/gen-errors.rst | 4 +- + Documentation/userspace-api/media/v4l/buffer.rst | 4 +- + Documentation/userspace-api/media/v4l/control.rst | 4 + + .../userspace-api/media/v4l/dev-subdev.rst | 49 +- + .../userspace-api/media/v4l/dv-timings.rst | 21 + + .../userspace-api/media/v4l/pixfmt-reserved.rst | 7 + + .../userspace-api/media/v4l/pixfmt-srggb12p.rst | 4 +- + MAINTAINERS | 52 +- + arch/arm/configs/omap2plus_defconfig | 1 - + drivers/media/cec/platform/Makefile | 2 +- + drivers/media/cec/platform/cros-ec/cros-ec-cec.c | 387 +- + drivers/media/common/siano/smsdvb-debugfs.c | 22 +- + drivers/media/common/videobuf2/frame_vector.c | 2 +- + drivers/media/common/videobuf2/videobuf2-core.c | 2 +- + .../media/common/videobuf2/videobuf2-dma-contig.c | 13 +- + drivers/media/common/videobuf2/videobuf2-vmalloc.c | 10 +- + drivers/media/dvb-frontends/drx39xyj/drxj.c | 6 +- + drivers/media/dvb-frontends/m88ds3103.c | 3 +- + drivers/media/i2c/Kconfig | 11 + + drivers/media/i2c/Makefile | 1 + + drivers/media/i2c/adp1653.c | 28 +- + drivers/media/i2c/adv7180.c | 65 +- + drivers/media/i2c/ar0521.c | 30 +- + drivers/media/i2c/ccs/ccs-core.c | 431 +-- + drivers/media/i2c/ccs/ccs-quirk.h | 4 +- + drivers/media/i2c/ccs/ccs.h | 4 +- + drivers/media/i2c/cx25840/cx25840-core.c | 3694 +++++--------------- + drivers/media/i2c/ds90ub913.c | 2 - + drivers/media/i2c/ds90ub953.c | 2 - + drivers/media/i2c/ds90ub960.c | 2 - + drivers/media/i2c/hi556.c | 114 +- + drivers/media/i2c/hi846.c | 34 +- + drivers/media/i2c/hi847.c | 57 +- + drivers/media/i2c/imx208.c | 61 +- + drivers/media/i2c/imx214.c | 40 - + drivers/media/i2c/imx219.c | 1511 ++++---- + drivers/media/i2c/imx258.c | 40 - + drivers/media/i2c/imx296.c | 16 +- + drivers/media/i2c/imx319.c | 44 - + drivers/media/i2c/imx334.c | 66 +- + drivers/media/i2c/imx335.c | 9 - + drivers/media/i2c/imx355.c | 45 - + drivers/media/i2c/imx412.c | 9 - + drivers/media/i2c/imx415.c | 45 +- + drivers/media/i2c/max9286.c | 2 - + drivers/media/i2c/msp3400-driver.c | 2 +- + drivers/media/i2c/mt9m001.c | 6 - + drivers/media/i2c/mt9m111.c | 13 +- + drivers/media/i2c/mt9m114.c | 2481 +++++++++++++ + drivers/media/i2c/mt9v011.c | 6 - + drivers/media/i2c/mt9v032.c | 26 +- + drivers/media/i2c/mt9v111.c | 14 - + drivers/media/i2c/og01a1b.c | 55 +- + drivers/media/i2c/ov01a10.c | 59 +- + drivers/media/i2c/ov02a10.c | 2 - + drivers/media/i2c/ov08d10.c | 52 - + drivers/media/i2c/ov08x40.c | 44 - + drivers/media/i2c/ov13858.c | 44 - + drivers/media/i2c/ov13b10.c | 98 +- + drivers/media/i2c/ov2640.c | 21 +- + drivers/media/i2c/ov2659.c | 16 +- + drivers/media/i2c/ov2685.c | 19 - + drivers/media/i2c/ov2740.c | 170 +- + drivers/media/i2c/ov4689.c | 9 +- + drivers/media/i2c/ov5640.c | 24 +- + drivers/media/i2c/ov5647.c | 6 - + drivers/media/i2c/ov5670.c | 36 - + drivers/media/i2c/ov5675.c | 44 - + drivers/media/i2c/ov5693.c | 9 +- + drivers/media/i2c/ov5695.c | 25 - + drivers/media/i2c/ov7251.c | 8 +- + drivers/media/i2c/ov7670.c | 72 +- + drivers/media/i2c/ov772x.c | 4 - + drivers/media/i2c/ov7740.c | 30 +- + drivers/media/i2c/ov8856.c | 47 - + drivers/media/i2c/ov9282.c | 9 - + drivers/media/i2c/ov9734.c | 50 - + drivers/media/i2c/rdacm20.c | 3 +- + drivers/media/i2c/st-vgxy61.c | 9 +- + drivers/media/i2c/tc358746.c | 6 +- + drivers/media/i2c/tvp514x.c | 51 +- + drivers/media/i2c/video-i2c.c | 12 +- + drivers/media/mc/mc-entity.c | 15 +- + drivers/media/pci/Kconfig | 1 + + drivers/media/pci/Makefile | 1 + + drivers/media/pci/bt8xx/bttv-cards.c | 1 + + drivers/media/pci/bt8xx/bttv-driver.c | 1 + + drivers/media/pci/bt8xx/dvb-bt8xx.c | 14 +- + drivers/media/pci/cobalt/cobalt-driver.c | 11 +- + drivers/media/pci/cobalt/cobalt-v4l2.c | 8 +- + drivers/media/pci/cx18/cx18-driver.h | 2 +- + drivers/media/pci/cx18/cx18-mailbox.c | 2 +- + drivers/media/pci/intel/ivsc/Kconfig | 12 +- + drivers/media/pci/intel/ivsc/mei_ace.c | 9 +- + drivers/media/pci/intel/ivsc/mei_csi.c | 5 +- + drivers/media/pci/mgb4/Kconfig | 17 + + drivers/media/pci/mgb4/Makefile | 6 + + drivers/media/pci/mgb4/mgb4_cmt.c | 244 ++ + drivers/media/pci/mgb4/mgb4_cmt.h | 17 + + drivers/media/pci/mgb4/mgb4_core.c | 686 ++++ + drivers/media/pci/mgb4/mgb4_core.h | 74 + + drivers/media/pci/mgb4/mgb4_dma.c | 123 + + drivers/media/pci/mgb4/mgb4_dma.h | 18 + + drivers/media/pci/mgb4/mgb4_i2c.c | 140 + + drivers/media/pci/mgb4/mgb4_i2c.h | 35 + + drivers/media/pci/mgb4/mgb4_io.h | 33 + + drivers/media/pci/mgb4/mgb4_regs.c | 30 + + drivers/media/pci/mgb4/mgb4_regs.h | 35 + + drivers/media/pci/mgb4/mgb4_sysfs.h | 18 + + drivers/media/pci/mgb4/mgb4_sysfs_in.c | 772 ++++ + drivers/media/pci/mgb4/mgb4_sysfs_out.c | 740 ++++ + drivers/media/pci/mgb4/mgb4_sysfs_pci.c | 71 + + drivers/media/pci/mgb4/mgb4_trigger.c | 208 ++ + drivers/media/pci/mgb4/mgb4_trigger.h | 8 + + drivers/media/pci/mgb4/mgb4_vin.c | 939 +++++ + drivers/media/pci/mgb4/mgb4_vin.h | 69 + + drivers/media/pci/mgb4/mgb4_vout.c | 602 ++++ + drivers/media/pci/mgb4/mgb4_vout.h | 65 + + drivers/media/pci/zoran/zoran.h | 2 +- + drivers/media/platform/Kconfig | 1 + + drivers/media/platform/Makefile | 1 + + drivers/media/platform/allegro-dvt/allegro-mail.c | 2 +- + drivers/media/platform/allegro-dvt/allegro-mail.h | 2 +- + drivers/media/platform/amphion/vpu_defs.h | 1 + + drivers/media/platform/amphion/vpu_helpers.c | 1 + + drivers/media/platform/amphion/vpu_malone.c | 1 + + drivers/media/platform/amphion/vpu_msgs.c | 31 +- + drivers/media/platform/aspeed/aspeed-video.c | 15 +- + drivers/media/platform/cadence/Kconfig | 2 + + drivers/media/platform/cadence/cdns-csi2rx.c | 180 +- + drivers/media/platform/cadence/cdns-csi2tx.c | 6 +- + .../media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 5 +- + .../media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c | 2 +- + .../media/platform/mediatek/mdp3/mtk-mdp3-comp.c | 1 + + .../mediatek/vcodec/common/mtk_vcodec_fw_scp.c | 2 +- + .../mediatek/vcodec/common/mtk_vcodec_fw_vpu.c | 2 +- + .../mediatek/vcodec/common/mtk_vcodec_util.c | 56 +- + .../mediatek/vcodec/encoder/mtk_vcodec_enc.c | 21 +- + .../mediatek/vcodec/encoder/mtk_vcodec_enc_pm.c | 18 + + .../mediatek/vcodec/encoder/mtk_vcodec_enc_pm.h | 3 +- + .../platform/mediatek/vcodec/encoder/venc_drv_if.c | 8 +- + .../platform/mediatek/vcodec/encoder/venc_vpu_if.c | 5 + + .../media/platform/microchip/microchip-isc-base.c | 6 - + drivers/media/platform/nuvoton/Kconfig | 15 + + drivers/media/platform/nuvoton/Makefile | 2 + + drivers/media/platform/nuvoton/npcm-regs.h | 152 + + drivers/media/platform/nuvoton/npcm-video.c | 1831 ++++++++++ + drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h | 11 - + drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c | 36 +- + drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h | 1 + + drivers/media/platform/nxp/imx-mipi-csis.c | 2 - + .../media/platform/nxp/imx8-isi/imx8-isi-core.c | 4 +- + drivers/media/platform/qcom/camss/camss-csid-4-1.c | 8 +- + drivers/media/platform/qcom/camss/camss-csid-4-7.c | 8 +- + .../media/platform/qcom/camss/camss-csid-gen2.c | 33 +- + drivers/media/platform/qcom/camss/camss-csid.c | 39 +- + drivers/media/platform/qcom/camss/camss-csid.h | 4 +- + .../platform/qcom/camss/camss-csiphy-3ph-1-0.c | 10 +- + drivers/media/platform/qcom/camss/camss-csiphy.c | 93 +- + drivers/media/platform/qcom/camss/camss-csiphy.h | 4 +- + drivers/media/platform/qcom/camss/camss-ispif.c | 52 +- + drivers/media/platform/qcom/camss/camss-ispif.h | 4 +- + drivers/media/platform/qcom/camss/camss-vfe-170.c | 73 +- + drivers/media/platform/qcom/camss/camss-vfe-4-1.c | 18 +- + drivers/media/platform/qcom/camss/camss-vfe-4-7.c | 18 +- + drivers/media/platform/qcom/camss/camss-vfe-4-8.c | 18 +- + drivers/media/platform/qcom/camss/camss-vfe-480.c | 61 +- + drivers/media/platform/qcom/camss/camss-vfe.c | 228 +- + drivers/media/platform/qcom/camss/camss-vfe.h | 15 +- + drivers/media/platform/qcom/camss/camss-video.c | 81 +- + drivers/media/platform/qcom/camss/camss.c | 482 +-- + drivers/media/platform/qcom/camss/camss.h | 34 +- + drivers/media/platform/qcom/venus/pm_helpers.c | 2 +- + drivers/media/platform/renesas/rcar-isp.c | 2 +- + .../media/platform/renesas/rcar-vin/rcar-csi2.c | 2 +- + drivers/media/platform/renesas/rcar_drif.c | 3 +- + drivers/media/platform/renesas/renesas-ceu.c | 6 +- + .../platform/rockchip/rkisp1/rkisp1-capture.c | 24 +- + .../media/platform/rockchip/rkisp1/rkisp1-common.h | 18 - + .../media/platform/rockchip/rkisp1/rkisp1-csi.c | 107 +- + .../media/platform/rockchip/rkisp1/rkisp1-isp.c | 263 +- + .../media/platform/rockchip/rkisp1/rkisp1-params.c | 4 +- + .../media/platform/rockchip/rkisp1/rkisp1-regs.h | 618 ++-- + .../platform/rockchip/rkisp1/rkisp1-resizer.c | 255 +- + .../media/platform/samsung/exynos4-is/fimc-is.c | 33 +- + .../platform/samsung/s3c-camif/camif-capture.c | 6 +- + .../media/platform/samsung/s5p-mfc/s5p_mfc_enc.c | 2 +- + .../platform/st/sti/c8sectpfe/c8sectpfe-core.c | 26 +- + drivers/media/platform/ti/Kconfig | 12 + + drivers/media/platform/ti/Makefile | 1 + + drivers/media/platform/ti/am437x/am437x-vpfe.c | 4 - + drivers/media/platform/ti/j721e-csi2rx/Makefile | 2 + + .../media/platform/ti/j721e-csi2rx/j721e-csi2rx.c | 1159 ++++++ + drivers/media/platform/ti/omap3isp/ispstat.c | 2 +- + drivers/media/platform/verisilicon/hantro_drv.c | 8 +- + .../media/platform/verisilicon/hantro_postproc.c | 2 +- + .../platform/verisilicon/rockchip_av1_filmgrain.c | 2 +- + .../media/platform/verisilicon/rockchip_vpu_hw.c | 2 +- + drivers/media/platform/xilinx/xilinx-dma.c | 5 +- + drivers/media/radio/radio-isa.c | 2 +- + drivers/media/radio/radio-miropcm20.c | 4 +- + drivers/media/radio/radio-si476x.c | 4 +- + drivers/media/radio/radio-wl1273.c | 2 +- + drivers/media/rc/Kconfig | 10 - + drivers/media/rc/Makefile | 1 - + drivers/media/rc/ati_remote.c | 2 +- + drivers/media/rc/imon.c | 6 + + drivers/media/rc/ir-rx51.c | 285 -- + drivers/media/rc/ir-sharp-decoder.c | 8 +- + drivers/media/rc/keymaps/rc-adstech-dvb-t-pci.c | 1 + + drivers/media/rc/keymaps/rc-alink-dtu-m.c | 1 + + drivers/media/rc/keymaps/rc-anysee.c | 1 + + drivers/media/rc/keymaps/rc-apac-viewcomp.c | 1 + + drivers/media/rc/keymaps/rc-astrometa-t2hybrid.c | 1 + + drivers/media/rc/keymaps/rc-asus-pc39.c | 1 + + drivers/media/rc/keymaps/rc-asus-ps3-100.c | 1 + + drivers/media/rc/keymaps/rc-ati-tv-wonder-hd-600.c | 1 + + drivers/media/rc/keymaps/rc-ati-x10.c | 1 + + drivers/media/rc/keymaps/rc-avermedia-a16d.c | 1 + + drivers/media/rc/keymaps/rc-avermedia-cardbus.c | 1 + + drivers/media/rc/keymaps/rc-avermedia-dvbt.c | 1 + + drivers/media/rc/keymaps/rc-avermedia-m135a.c | 1 + + .../media/rc/keymaps/rc-avermedia-m733a-rm-k6.c | 1 + + drivers/media/rc/keymaps/rc-avermedia-rm-ks.c | 1 + + drivers/media/rc/keymaps/rc-avermedia.c | 1 + + drivers/media/rc/keymaps/rc-avertv-303.c | 1 + + drivers/media/rc/keymaps/rc-azurewave-ad-tu700.c | 1 + + drivers/media/rc/keymaps/rc-beelink-gs1.c | 1 + + drivers/media/rc/keymaps/rc-beelink-mxiii.c | 1 + + drivers/media/rc/keymaps/rc-behold-columbus.c | 1 + + drivers/media/rc/keymaps/rc-behold.c | 1 + + drivers/media/rc/keymaps/rc-budget-ci-old.c | 1 + + drivers/media/rc/keymaps/rc-cinergy-1400.c | 1 + + drivers/media/rc/keymaps/rc-cinergy.c | 1 + + drivers/media/rc/keymaps/rc-ct-90405.c | 1 + + drivers/media/rc/keymaps/rc-d680-dmb.c | 1 + + drivers/media/rc/keymaps/rc-dib0700-nec.c | 1 + + drivers/media/rc/keymaps/rc-dib0700-rc5.c | 1 + + drivers/media/rc/keymaps/rc-digitalnow-tinytwin.c | 1 + + drivers/media/rc/keymaps/rc-digittrade.c | 1 + + drivers/media/rc/keymaps/rc-dm1105-nec.c | 1 + + drivers/media/rc/keymaps/rc-dntv-live-dvb-t.c | 1 + + drivers/media/rc/keymaps/rc-dntv-live-dvbt-pro.c | 1 + + drivers/media/rc/keymaps/rc-dreambox.c | 1 + + drivers/media/rc/keymaps/rc-dtt200u.c | 1 + + drivers/media/rc/keymaps/rc-dvbsky.c | 1 + + drivers/media/rc/keymaps/rc-dvico-mce.c | 1 + + drivers/media/rc/keymaps/rc-dvico-portable.c | 1 + + drivers/media/rc/keymaps/rc-em-terratec.c | 1 + + drivers/media/rc/keymaps/rc-encore-enltv-fm53.c | 1 + + drivers/media/rc/keymaps/rc-encore-enltv.c | 1 + + drivers/media/rc/keymaps/rc-encore-enltv2.c | 1 + + drivers/media/rc/keymaps/rc-evga-indtube.c | 1 + + drivers/media/rc/keymaps/rc-eztv.c | 1 + + drivers/media/rc/keymaps/rc-flydvb.c | 1 + + drivers/media/rc/keymaps/rc-flyvideo.c | 1 + + drivers/media/rc/keymaps/rc-fusionhdtv-mce.c | 1 + + drivers/media/rc/keymaps/rc-gadmei-rm008z.c | 1 + + drivers/media/rc/keymaps/rc-geekbox.c | 1 + + drivers/media/rc/keymaps/rc-genius-tvgo-a11mce.c | 1 + + drivers/media/rc/keymaps/rc-gotview7135.c | 1 + + drivers/media/rc/keymaps/rc-hauppauge.c | 1 + + drivers/media/rc/keymaps/rc-hisi-poplar.c | 1 + + drivers/media/rc/keymaps/rc-hisi-tv-demo.c | 1 + + drivers/media/rc/keymaps/rc-imon-mce.c | 1 + + drivers/media/rc/keymaps/rc-imon-pad.c | 1 + + drivers/media/rc/keymaps/rc-imon-rsc.c | 1 + + drivers/media/rc/keymaps/rc-iodata-bctv7e.c | 1 + + drivers/media/rc/keymaps/rc-it913x-v1.c | 1 + + drivers/media/rc/keymaps/rc-it913x-v2.c | 1 + + drivers/media/rc/keymaps/rc-kaiomy.c | 1 + + drivers/media/rc/keymaps/rc-khadas.c | 1 + + drivers/media/rc/keymaps/rc-khamsin.c | 1 + + drivers/media/rc/keymaps/rc-kworld-315u.c | 1 + + drivers/media/rc/keymaps/rc-kworld-pc150u.c | 1 + + .../media/rc/keymaps/rc-kworld-plus-tv-analog.c | 1 + + drivers/media/rc/keymaps/rc-leadtek-y04g0051.c | 1 + + drivers/media/rc/keymaps/rc-lme2510.c | 1 + + drivers/media/rc/keymaps/rc-manli.c | 1 + + drivers/media/rc/keymaps/rc-mecool-kii-pro.c | 1 + + drivers/media/rc/keymaps/rc-mecool-kiii-pro.c | 1 + + drivers/media/rc/keymaps/rc-medion-x10.c | 1 + + drivers/media/rc/keymaps/rc-minix-neo.c | 1 + + drivers/media/rc/keymaps/rc-msi-digivox-ii.c | 1 + + drivers/media/rc/keymaps/rc-msi-digivox-iii.c | 1 + + drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.c | 1 + + drivers/media/rc/keymaps/rc-msi-tvanywhere.c | 1 + + drivers/media/rc/keymaps/rc-nebula.c | 1 + + .../media/rc/keymaps/rc-nec-terratec-cinergy-xs.c | 1 + + drivers/media/rc/keymaps/rc-norwood.c | 1 + + drivers/media/rc/keymaps/rc-npgtech.c | 1 + + drivers/media/rc/keymaps/rc-odroid.c | 1 + + drivers/media/rc/keymaps/rc-pctv-sedna.c | 1 + + drivers/media/rc/keymaps/rc-pine64.c | 1 + + drivers/media/rc/keymaps/rc-pinnacle-color.c | 1 + + drivers/media/rc/keymaps/rc-pinnacle-grey.c | 1 + + drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c | 1 + + drivers/media/rc/keymaps/rc-pixelview-002t.c | 1 + + drivers/media/rc/keymaps/rc-pixelview-mk12.c | 1 + + drivers/media/rc/keymaps/rc-pixelview-new.c | 1 + + drivers/media/rc/keymaps/rc-pixelview.c | 1 + + .../media/rc/keymaps/rc-powercolor-real-angel.c | 1 + + drivers/media/rc/keymaps/rc-proteus-2309.c | 1 + + drivers/media/rc/keymaps/rc-purpletv.c | 1 + + drivers/media/rc/keymaps/rc-pv951.c | 1 + + drivers/media/rc/keymaps/rc-rc6-mce.c | 1 + + .../media/rc/keymaps/rc-real-audio-220-32-keys.c | 1 + + drivers/media/rc/keymaps/rc-reddo.c | 1 + + drivers/media/rc/keymaps/rc-snapstream-firefly.c | 1 + + drivers/media/rc/keymaps/rc-streamzap.c | 1 + + drivers/media/rc/keymaps/rc-su3000.c | 1 + + drivers/media/rc/keymaps/rc-tanix-tx3mini.c | 1 + + drivers/media/rc/keymaps/rc-tanix-tx5max.c | 1 + + drivers/media/rc/keymaps/rc-tbs-nec.c | 1 + + drivers/media/rc/keymaps/rc-technisat-ts35.c | 1 + + drivers/media/rc/keymaps/rc-technisat-usb2.c | 1 + + .../media/rc/keymaps/rc-terratec-cinergy-c-pci.c | 1 + + .../media/rc/keymaps/rc-terratec-cinergy-s2-hd.c | 1 + + drivers/media/rc/keymaps/rc-terratec-cinergy-xs.c | 1 + + drivers/media/rc/keymaps/rc-terratec-slim-2.c | 1 + + drivers/media/rc/keymaps/rc-terratec-slim.c | 1 + + drivers/media/rc/keymaps/rc-tevii-nec.c | 1 + + drivers/media/rc/keymaps/rc-tivo.c | 1 + + .../media/rc/keymaps/rc-total-media-in-hand-02.c | 1 + + drivers/media/rc/keymaps/rc-total-media-in-hand.c | 1 + + drivers/media/rc/keymaps/rc-trekstor.c | 1 + + drivers/media/rc/keymaps/rc-tt-1500.c | 1 + + drivers/media/rc/keymaps/rc-twinhan-dtv-cab-ci.c | 1 + + drivers/media/rc/keymaps/rc-twinhan1027.c | 1 + + drivers/media/rc/keymaps/rc-vega-s9x.c | 1 + + drivers/media/rc/keymaps/rc-videomate-m1f.c | 1 + + drivers/media/rc/keymaps/rc-videomate-s350.c | 1 + + drivers/media/rc/keymaps/rc-videomate-tv-pvr.c | 1 + + drivers/media/rc/keymaps/rc-videostrong-kii-pro.c | 1 + + drivers/media/rc/keymaps/rc-wetek-hub.c | 1 + + drivers/media/rc/keymaps/rc-wetek-play2.c | 1 + + drivers/media/rc/keymaps/rc-winfast-usbii-deluxe.c | 1 + + drivers/media/rc/keymaps/rc-winfast.c | 1 + + drivers/media/rc/keymaps/rc-x96max.c | 1 + + drivers/media/rc/keymaps/rc-xbox-360.c | 1 + + drivers/media/rc/keymaps/rc-xbox-dvd.c | 1 + + drivers/media/rc/keymaps/rc-zx-irdec.c | 1 + + drivers/media/rc/lirc_dev.c | 6 +- + drivers/media/rc/meson-ir.c | 560 ++- + drivers/media/rc/pwm-ir-tx.c | 1 + + drivers/media/test-drivers/vidtv/vidtv_mux.c | 7 +- + drivers/media/test-drivers/vidtv/vidtv_psi.c | 45 +- + drivers/media/test-drivers/vivid/vivid-core.c | 2 +- + drivers/media/test-drivers/vivid/vivid-rds-gen.c | 2 +- + drivers/media/usb/cx231xx/cx231xx-417.c | 9 +- + drivers/media/usb/cx231xx/cx231xx-core.c | 7 +- + drivers/media/usb/cx231xx/cx231xx.h | 3 + + drivers/media/usb/dvb-usb-v2/af9035.c | 13 +- + drivers/media/usb/dvb-usb/gp8psk.c | 2 +- + drivers/media/usb/gspca/cpia1.c | 3 + + drivers/media/usb/siano/smsusb.c | 4 +- + drivers/media/v4l2-core/Kconfig | 16 - + drivers/media/v4l2-core/Makefile | 5 - + drivers/media/v4l2-core/v4l2-event.c | 2 +- + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + + drivers/media/v4l2-core/v4l2-subdev.c | 55 +- + drivers/media/v4l2-core/videobuf-core.c | 1198 ------- + drivers/media/v4l2-core/videobuf-dma-contig.c | 402 --- + drivers/media/v4l2-core/videobuf-dma-sg.c | 681 ---- + drivers/media/v4l2-core/videobuf-vmalloc.c | 326 -- + drivers/staging/media/atomisp/Kconfig | 12 - + drivers/staging/media/atomisp/Makefile | 16 +- + drivers/staging/media/atomisp/TODO | 3 - + drivers/staging/media/atomisp/i2c/Kconfig | 12 - + drivers/staging/media/atomisp/i2c/Makefile | 1 - + drivers/staging/media/atomisp/i2c/atomisp-gc0310.c | 26 +- + drivers/staging/media/atomisp/i2c/ov5693/Makefile | 2 - + drivers/staging/media/atomisp/i2c/ov5693/ad5823.h | 63 - + .../media/atomisp/i2c/ov5693/atomisp-ov5693.c | 1763 ---------- + drivers/staging/media/atomisp/i2c/ov5693/ov5693.h | 1331 ------- + .../staging/media/atomisp/include/linux/atomisp.h | 10 - + drivers/staging/media/atomisp/pci/atomisp_cmd.c | 44 +- + drivers/staging/media/atomisp/pci/atomisp_cmd.h | 13 - + .../media/atomisp/pci/atomisp_compat_css20.c | 15 +- + .../media/atomisp/pci/atomisp_csi2_bridge.c | 7 +- + drivers/staging/media/atomisp/pci/atomisp_fops.c | 7 +- + drivers/staging/media/atomisp/pci/atomisp_ioctl.c | 21 +- + drivers/staging/media/atomisp/pci/atomisp_subdev.c | 48 - + drivers/staging/media/atomisp/pci/atomisp_subdev.h | 2 - + drivers/staging/media/atomisp/pci/atomisp_v4l2.c | 19 - + .../pci/css_2401_system/host/isys_irq_local.h | 3 - + .../pci/css_2401_system/host/isys_irq_private.h | 2 - + .../atomisp/pci/css_2401_system/isys_irq_global.h | 2 - + .../atomisp/pci/hive_isp_css_common/debug_global.h | 7 - + .../atomisp/pci/hive_isp_css_common/host/dma.c | 266 -- + .../pci/hive_isp_css_common/host/dma_local.h | 116 - + .../pci/hive_isp_css_common/host/input_formatter.c | 2 - + .../pci/hive_isp_css_common/host/input_system.c | 446 --- + .../atomisp/pci/hive_isp_css_common/host/irq.c | 19 - + .../pci/hive_isp_css_common/host/irq_local.h | 8 - + .../atomisp/pci/hive_isp_css_common/host/isp.c | 60 - + .../pci/hive_isp_css_common/host/isp_local.h | 31 - + .../atomisp/pci/hive_isp_css_common/host/sp.c | 47 - + .../pci/hive_isp_css_common/host/sp_local.h | 26 - + .../pci/hive_isp_css_include/host/csi_rx_public.h | 2 - + .../pci/hive_isp_css_include/host/dma_public.h | 13 - + .../pci/hive_isp_css_include/host/irq_public.h | 10 - + .../pci/hive_isp_css_include/host/isp_public.h | 13 - + .../hive_isp_css_include/host/isys_dma_public.h | 2 - + .../hive_isp_css_include/host/isys_irq_public.h | 2 - + .../pci/hive_isp_css_include/host/isys_public.h | 38 - + .../hive_isp_css_include/host/pixelgen_public.h | 2 - + .../pci/hive_isp_css_include/host/sp_public.h | 16 - + .../atomisp/pci/hive_isp_css_include/isys_irq.h | 2 - + .../staging/media/atomisp/pci/ia_css_acc_types.h | 6 +- + drivers/staging/media/atomisp/pci/ia_css_mipi.h | 16 - + .../staging/media/atomisp/pci/input_system_local.h | 7 +- + .../media/atomisp/pci/input_system_private.h | 7 +- + .../media/atomisp/pci/input_system_public.h | 4 +- + .../pci/isp/kernels/raw/raw_1.0/ia_css_raw.host.c | 21 +- + .../media/atomisp/pci/isp2400_input_system_local.h | 198 +- + .../atomisp/pci/isp2400_input_system_private.h | 4 +- + .../atomisp/pci/isp2400_input_system_public.h | 42 +- + .../media/atomisp/pci/isp2401_input_system_local.h | 88 +- + .../atomisp/pci/isp2401_input_system_private.h | 112 +- + .../media/atomisp/pci/runtime/binary/src/binary.c | 15 +- + .../pci/runtime/debug/interface/ia_css_debug.h | 85 - + .../atomisp/pci/runtime/debug/src/ia_css_debug.c | 1495 +------- + .../media/atomisp/pci/runtime/ifmtr/src/ifmtr.c | 2 - + .../pci/runtime/isys/interface/ia_css_isys.h | 9 +- + .../pci/runtime/isys/interface/ia_css_isys_comm.h | 2 - + .../atomisp/pci/runtime/isys/src/csi_rx_rmgr.c | 2 - + .../atomisp/pci/runtime/isys/src/isys_dma_rmgr.c | 2 - + .../media/atomisp/pci/runtime/isys/src/isys_init.c | 35 +- + .../pci/runtime/isys/src/isys_stream2mmio_rmgr.c | 2 - + .../media/atomisp/pci/runtime/isys/src/rx.c | 265 +- + .../atomisp/pci/runtime/isys/src/virtual_isys.c | 8 +- + .../runtime/pipeline/interface/ia_css_pipeline.h | 2 - + .../atomisp/pci/runtime/pipeline/src/pipeline.c | 2 - + drivers/staging/media/atomisp/pci/sh_css.c | 236 +- + .../staging/media/atomisp/pci/sh_css_internal.h | 41 +- + drivers/staging/media/atomisp/pci/sh_css_mipi.c | 29 - + drivers/staging/media/atomisp/pci/sh_css_params.c | 41 +- + drivers/staging/media/atomisp/pci/sh_css_sp.c | 62 +- + drivers/staging/media/atomisp/pci/sh_css_sp.h | 4 - + .../media/deprecated/atmel/atmel-isc-base.c | 4 - + drivers/staging/media/ipu3/ipu3-css-params.c | 44 +- + drivers/staging/media/ipu3/ipu3.c | 6 - + drivers/staging/media/omap4iss/iss_csi2.c | 2 +- + drivers/staging/media/sunxi/cedrus/cedrus.c | 2 +- + drivers/staging/media/sunxi/cedrus/cedrus_hw.c | 24 +- + drivers/staging/media/tegra-video/csi.c | 4 +- + drivers/staging/media/tegra-video/vip.c | 2 +- + include/linux/platform_data/cros_ec_commands.h | 66 +- + include/media/cec.h | 2 +- + include/media/ipu-bridge.h | 2 +- + include/media/mipi-csi2.h | 1 + + include/media/v4l2-dev.h | 2 +- + include/media/v4l2-device.h | 4 +- + include/media/v4l2-event.h | 2 +- + include/media/v4l2-mc.h | 6 + + include/media/v4l2-subdev.h | 13 +- + include/media/videobuf-core.h | 233 -- + include/media/videobuf-dma-contig.h | 30 - + include/media/videobuf-dma-sg.h | 102 - + include/media/videobuf-vmalloc.h | 43 - + include/uapi/linux/npcm-video.h | 41 + + include/uapi/linux/v4l2-controls.h | 6 + + include/uapi/linux/videodev2.h | 1 + + 500 files changed, 17340 insertions(+), 18172 deletions(-) + create mode 100644 Documentation/admin-guide/media/mgb4.rst + create mode 100644 Documentation/devicetree/bindings/media/i2c/onnn,mt9m114.yaml + create mode 100644 Documentation/devicetree/bindings/media/i2c/ovti,ov5642.yaml + delete mode 100644 Documentation/devicetree/bindings/media/nokia,n900-ir + create mode 100644 Documentation/devicetree/bindings/media/nuvoton,npcm-ece.yaml + create mode 100644 Documentation/devicetree/bindings/media/nuvoton,npcm-vcd.yaml + create mode 100644 Documentation/devicetree/bindings/media/ti,j721e-csi2rx-shim.yaml + create mode 100644 Documentation/devicetree/bindings/soc/nuvoton/nuvoton,gfxi.yaml + delete mode 100644 Documentation/driver-api/media/v4l2-videobuf.rst + create mode 100644 Documentation/userspace-api/media/drivers/camera-sensor.rst + create mode 100644 Documentation/userspace-api/media/drivers/npcm-video.rst + create mode 100644 drivers/media/i2c/mt9m114.c + create mode 100644 drivers/media/pci/mgb4/Kconfig + create mode 100644 drivers/media/pci/mgb4/Makefile + create mode 100644 drivers/media/pci/mgb4/mgb4_cmt.c + create mode 100644 drivers/media/pci/mgb4/mgb4_cmt.h + create mode 100644 drivers/media/pci/mgb4/mgb4_core.c + create mode 100644 drivers/media/pci/mgb4/mgb4_core.h + create mode 100644 drivers/media/pci/mgb4/mgb4_dma.c + create mode 100644 drivers/media/pci/mgb4/mgb4_dma.h + create mode 100644 drivers/media/pci/mgb4/mgb4_i2c.c + create mode 100644 drivers/media/pci/mgb4/mgb4_i2c.h + create mode 100644 drivers/media/pci/mgb4/mgb4_io.h + create mode 100644 drivers/media/pci/mgb4/mgb4_regs.c + create mode 100644 drivers/media/pci/mgb4/mgb4_regs.h + create mode 100644 drivers/media/pci/mgb4/mgb4_sysfs.h + create mode 100644 drivers/media/pci/mgb4/mgb4_sysfs_in.c + create mode 100644 drivers/media/pci/mgb4/mgb4_sysfs_out.c + create mode 100644 drivers/media/pci/mgb4/mgb4_sysfs_pci.c + create mode 100644 drivers/media/pci/mgb4/mgb4_trigger.c + create mode 100644 drivers/media/pci/mgb4/mgb4_trigger.h + create mode 100644 drivers/media/pci/mgb4/mgb4_vin.c + create mode 100644 drivers/media/pci/mgb4/mgb4_vin.h + create mode 100644 drivers/media/pci/mgb4/mgb4_vout.c + create mode 100644 drivers/media/pci/mgb4/mgb4_vout.h + create mode 100644 drivers/media/platform/nuvoton/Kconfig + create mode 100644 drivers/media/platform/nuvoton/Makefile + create mode 100644 drivers/media/platform/nuvoton/npcm-regs.h + create mode 100644 drivers/media/platform/nuvoton/npcm-video.c + create mode 100644 drivers/media/platform/ti/j721e-csi2rx/Makefile + create mode 100644 drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c + delete mode 100644 drivers/media/rc/ir-rx51.c + delete mode 100644 drivers/media/v4l2-core/videobuf-core.c + delete mode 100644 drivers/media/v4l2-core/videobuf-dma-contig.c + delete mode 100644 drivers/media/v4l2-core/videobuf-dma-sg.c + delete mode 100644 drivers/media/v4l2-core/videobuf-vmalloc.c + delete mode 100644 drivers/staging/media/atomisp/i2c/ov5693/Makefile + delete mode 100644 drivers/staging/media/atomisp/i2c/ov5693/ad5823.h + delete mode 100644 drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c + delete mode 100644 drivers/staging/media/atomisp/i2c/ov5693/ov5693.h + delete mode 100644 drivers/staging/media/atomisp/pci/hive_isp_css_include/host/isys_public.h + delete mode 100644 include/media/videobuf-core.h + delete mode 100644 include/media/videobuf-dma-contig.h + delete mode 100644 include/media/videobuf-dma-sg.h + delete mode 100644 include/media/videobuf-vmalloc.h + create mode 100644 include/uapi/linux/npcm-video.h +Merging v4l-dvb-next/master (48016737a9af media: platform: cadence: select MIPI_DPHY dependency) +$ git merge -m Merge branch 'master' of git://linuxtv.org/mchehab/media-next.git v4l-dvb-next/master +Already up to date. +Merging pm/linux-next (3335ef03ad81 Merge branch 'pm' into linux-next) +$ git merge -m Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git pm/linux-next +Auto-merging MAINTAINERS +Auto-merging drivers/acpi/acpi_pad.c +Auto-merging drivers/acpi/osl.c +Auto-merging drivers/hwmon/xgene-hwmon.c +Auto-merging drivers/pci/pcie/aer.c +Auto-merging drivers/perf/arm_cspmu/arm_cspmu.c +Auto-merging drivers/soc/hisilicon/kunpeng_hccs.c +Auto-merging include/linux/acpi.h +Auto-merging kernel/power/swap.c +Merge made by the 'ort' strategy. + .../bindings/cpufreq/cpufreq-qcom-hw.yaml | 4 + + .../bindings/cpufreq/qcom-cpufreq-nvmem.yaml | 8 +- + .../bindings/devfreq/event/rockchip,dfi.yaml | 74 ++ + .../bindings/devfreq/event/rockchip-dfi.txt | 18 - + .../memory-controllers/rockchip,rk3399-dmc.yaml | 2 +- + .../devicetree/bindings/net/microchip,lan95xx.yaml | 2 + + .../devicetree/bindings/opp/opp-v2-kryo-cpu.yaml | 36 +- + .../bindings/thermal/fsl,scu-thermal.yaml | 4 +- + .../devicetree/bindings/thermal/imx-thermal.yaml | 7 + + .../bindings/thermal/mediatek,lvts-thermal.yaml | 1 + + .../bindings/thermal/nvidia,tegra124-soctherm.yaml | 5 + + .../devicetree/bindings/thermal/qcom-tsens.yaml | 1 + + .../devicetree/bindings/thermal/thermal-zones.yaml | 2 +- + .../devicetree/bindings/timer/fsl,imxgpt.yaml | 4 +- + Documentation/driver-api/thermal/intel_dptf.rst | 64 ++ + Documentation/firmware-guide/acpi/enumeration.rst | 43 + + MAINTAINERS | 2 +- + drivers/acpi/ac.c | 98 +-- + drivers/acpi/acpi_fpdt.c | 45 +- + drivers/acpi/acpi_lpss.c | 21 +- + drivers/acpi/acpi_pad.c | 82 +- + drivers/acpi/acpi_video.c | 2 +- + drivers/acpi/apei/erst.c | 41 +- + drivers/acpi/apei/ghes.c | 23 +- + drivers/acpi/battery.c | 2 +- + drivers/acpi/bus.c | 4 +- + drivers/acpi/device_sysfs.c | 24 +- + drivers/acpi/ec.c | 10 + + drivers/acpi/hed.c | 2 +- + drivers/acpi/nfit/core.c | 2 +- + drivers/acpi/osi.c | 2 +- + drivers/acpi/osl.c | 28 +- + drivers/acpi/pci_root.c | 6 +- + drivers/acpi/prmt.c | 2 +- + drivers/acpi/property.c | 20 +- + drivers/acpi/resource.c | 96 +-- + drivers/acpi/scan.c | 13 +- + drivers/acpi/thermal.c | 889 ++++++++++----------- + drivers/acpi/utils.c | 102 ++- + drivers/acpi/video_detect.c | 84 +- + drivers/acpi/x86/s2idle.c | 5 +- + drivers/acpi/x86/utils.c | 3 +- + drivers/cpufreq/Kconfig.arm | 6 +- + drivers/cpufreq/cpufreq-dt-platdev.c | 4 + + drivers/cpufreq/cpufreq.c | 3 +- + drivers/cpufreq/cpufreq_conservative.c | 3 +- + drivers/cpufreq/cpufreq_stats.c | 14 +- + drivers/cpufreq/cpufreq_userspace.c | 74 +- + drivers/cpufreq/intel_pstate.c | 6 +- + drivers/cpufreq/pmac32-cpufreq.c | 7 +- + drivers/cpufreq/qcom-cpufreq-nvmem.c | 208 ++++- + drivers/cpufreq/tegra194-cpufreq.c | 153 ++-- + drivers/cpufreq/ti-cpufreq.c | 1 + + drivers/devfreq/devfreq.c | 14 +- + drivers/devfreq/event/exynos-ppmu.c | 13 +- + drivers/devfreq/event/rockchip-dfi.c | 846 +++++++++++++++++--- + drivers/devfreq/mtk-cci-devfreq.c | 9 +- + drivers/devfreq/rk3399_dmc.c | 10 +- + drivers/hwmon/xgene-hwmon.c | 16 +- + drivers/i2c/busses/i2c-xgene-slimpro.c | 16 +- + drivers/mailbox/pcc.c | 91 ++- + drivers/opp/core.c | 171 ++-- + drivers/opp/debugfs.c | 2 +- + drivers/opp/of.c | 72 +- + drivers/opp/opp.h | 2 - + drivers/pci/pcie/aer.c | 10 + + drivers/perf/arm_cspmu/arm_cspmu.c | 8 +- + drivers/perf/qcom_l3_pmu.c | 4 +- + drivers/pinctrl/intel/pinctrl-intel.c | 2 +- + drivers/platform/surface/surface_acpi_notify.c | 10 +- + drivers/pnp/pnpacpi/core.c | 7 +- + drivers/pnp/pnpbios/rsparser.c | 4 +- + drivers/powercap/intel_rapl_common.c | 2 +- + drivers/soc/hisilicon/kunpeng_hccs.c | 8 +- + drivers/thermal/amlogic_thermal.c | 8 +- + drivers/thermal/armada_thermal.c | 6 +- + drivers/thermal/broadcom/bcm2835_thermal.c | 6 +- + drivers/thermal/broadcom/ns-thermal.c | 6 +- + drivers/thermal/da9062-thermal.c | 5 +- + drivers/thermal/dove_thermal.c | 6 +- + drivers/thermal/gov_bang_bang.c | 27 +- + drivers/thermal/gov_fair_share.c | 35 +- + drivers/thermal/gov_power_allocator.c | 120 ++- + drivers/thermal/gov_step_wise.c | 50 +- + drivers/thermal/gov_user_space.c | 8 +- + drivers/thermal/hisi_thermal.c | 6 +- + drivers/thermal/imx8mm_thermal.c | 8 +- + drivers/thermal/imx_thermal.c | 6 +- + drivers/thermal/intel/int340x_thermal/Makefile | 3 + + .../intel/int340x_thermal/int3400_thermal.c | 5 +- + .../intel/int340x_thermal/int3401_thermal.c | 6 +- + .../intel/int340x_thermal/int3402_thermal.c | 6 +- + .../intel/int340x_thermal/int3403_thermal.c | 6 +- + .../intel/int340x_thermal/int3406_thermal.c | 5 +- + .../intel/int340x_thermal/int340x_thermal_zone.c | 80 +- + .../int340x_thermal/processor_thermal_device.c | 85 +- + .../int340x_thermal/processor_thermal_device.h | 33 +- + .../int340x_thermal/processor_thermal_device_pci.c | 123 ++- + .../processor_thermal_device_pci_legacy.c | 3 +- + .../intel/int340x_thermal/processor_thermal_mbox.c | 193 ++--- + .../processor_thermal_power_floor.c | 126 +++ + .../int340x_thermal/processor_thermal_wt_hint.c | 255 ++++++ + .../int340x_thermal/processor_thermal_wt_req.c | 136 ++++ + drivers/thermal/intel/intel_powerclamp.c | 2 +- + drivers/thermal/k3_bandgap.c | 6 +- + drivers/thermal/k3_j72xx_bandgap.c | 6 +- + drivers/thermal/kirkwood_thermal.c | 6 +- + drivers/thermal/max77620_thermal.c | 8 +- + drivers/thermal/mediatek/auxadc_thermal.c | 2 +- + drivers/thermal/mediatek/lvts_thermal.c | 256 +++++- + drivers/thermal/qcom/tsens-v0_1.c | 6 - + drivers/thermal/qcom/tsens.c | 6 +- + drivers/thermal/rcar_gen3_thermal.c | 6 +- + drivers/thermal/rcar_thermal.c | 6 +- + drivers/thermal/rockchip_thermal.c | 6 +- + drivers/thermal/rzg2l_thermal.c | 6 +- + drivers/thermal/samsung/exynos_tmu.c | 6 +- + drivers/thermal/spear_thermal.c | 6 +- + drivers/thermal/sprd_thermal.c | 5 +- + drivers/thermal/st/stm_thermal.c | 6 +- + drivers/thermal/tegra/soctherm.c | 6 +- + drivers/thermal/tegra/tegra-bpmp-thermal.c | 6 +- + drivers/thermal/thermal_acpi.c | 3 +- + drivers/thermal/thermal_core.c | 137 ++-- + drivers/thermal/thermal_core.h | 9 +- + drivers/thermal/thermal_helpers.c | 8 +- + drivers/thermal/thermal_sysfs.c | 3 +- + drivers/thermal/thermal_trip.c | 55 +- + drivers/thermal/ti-soc-thermal/ti-bandgap.c | 6 +- + drivers/thermal/uniphier_thermal.c | 6 +- + include/acpi/acpi_bus.h | 12 +- + include/acpi/actbl1.h | 3 + + include/acpi/ghes.h | 4 + + include/acpi/pcc.h | 13 + + .../dt-bindings/thermal/mediatek,lvts-thermal.h | 28 + + include/linux/acpi.h | 5 + + include/linux/cpufreq.h | 8 - + include/linux/pm.h | 43 +- + include/linux/pm_opp.h | 9 + + include/linux/pnp.h | 8 +- + include/linux/thermal.h | 20 +- + include/soc/rockchip/rk3399_grf.h | 9 +- + include/soc/rockchip/rk3568_grf.h | 13 + + include/soc/rockchip/rk3588_grf.h | 18 + + include/soc/rockchip/rockchip_grf.h | 18 + + kernel/power/snapshot.c | 16 +- + kernel/power/swap.c | 4 +- + kernel/sched/cpufreq_schedutil.c | 66 +- + .../x86/intel_pstate_tracer/intel_pstate_tracer.py | 12 +- + tools/testing/selftests/Makefile | 2 + + .../selftests/thermal/intel/power_floor/Makefile | 12 + + .../thermal/intel/power_floor/power_floor_test.c | 108 +++ + .../selftests/thermal/intel/workload_hint/Makefile | 12 + + .../intel/workload_hint/workload_hint_test.c | 157 ++++ + tools/thermal/lib/mainloop.c | 16 - + 155 files changed, 4297 insertions(+), 1944 deletions(-) + create mode 100644 Documentation/devicetree/bindings/devfreq/event/rockchip,dfi.yaml + delete mode 100644 Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt + create mode 100644 drivers/thermal/intel/int340x_thermal/processor_thermal_power_floor.c + create mode 100644 drivers/thermal/intel/int340x_thermal/processor_thermal_wt_hint.c + create mode 100644 drivers/thermal/intel/int340x_thermal/processor_thermal_wt_req.c + create mode 100644 include/soc/rockchip/rk3568_grf.h + create mode 100644 include/soc/rockchip/rk3588_grf.h + create mode 100644 include/soc/rockchip/rockchip_grf.h + create mode 100644 tools/testing/selftests/thermal/intel/power_floor/Makefile + create mode 100644 tools/testing/selftests/thermal/intel/power_floor/power_floor_test.c + create mode 100644 tools/testing/selftests/thermal/intel/workload_hint/Makefile + create mode 100644 tools/testing/selftests/thermal/intel/workload_hint/workload_hint_test.c +Merging cpufreq-arm/cpufreq/arm/linux-next (6aa2f7738c6d cpufreq: qcom-nvmem: add support for IPQ8074) +$ git merge -m Merge branch 'cpufreq/arm/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm.git cpufreq-arm/cpufreq/arm/linux-next +Merge made by the 'ort' strategy. + drivers/cpufreq/cpufreq-dt-platdev.c | 1 + + drivers/cpufreq/qcom-cpufreq-nvmem.c | 48 ++++++++++++++++++++++++++++++++++++ + 2 files changed, 49 insertions(+) +Merging cpupower/cpupower (6feb1a964119 cpupower: fix reference to nonexistent document) +$ git merge -m Merge branch 'cpupower' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux.git cpupower/cpupower +Merge made by the 'ort' strategy. + tools/power/cpupower/man/cpupower-powercap-info.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +Merging devfreq/devfreq-next (8f0cd531ee18 dt-bindings: devfreq: event: rockchip,dfi: Add rk3588 support) +$ git merge -m Merge branch 'devfreq-next' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git devfreq/devfreq-next +Already up to date. +Merging pmdomain/next (9e0cceadb7a5 pmdomain: Merge branch fixes into next) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git pmdomain/next +Auto-merging MAINTAINERS +Auto-merging drivers/Kconfig +Auto-merging drivers/soc/apple/Kconfig +CONFLICT (content): Merge conflict in drivers/soc/apple/Kconfig +Auto-merging drivers/soc/bcm/Kconfig +Auto-merging drivers/soc/renesas/Kconfig +Resolved 'drivers/soc/apple/Kconfig' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master 131fbe9e948f] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git +$ git diff -M --stat --summary HEAD^.. + .../devicetree/bindings/power/qcom,rpmpd.yaml | 83 ++++---- + MAINTAINERS | 6 +- + drivers/Kconfig | 2 + + drivers/firmware/imx/Kconfig | 6 - + drivers/pmdomain/Kconfig | 21 ++ + drivers/{soc => pmdomain}/actions/Kconfig | 0 + drivers/pmdomain/actions/owl-sps.c | 16 +- + drivers/pmdomain/amlogic/Kconfig | 39 ++++ + drivers/pmdomain/amlogic/meson-secure-pwrc.c | 127 +++++++++-- + drivers/pmdomain/apple/Kconfig | 18 ++ + drivers/pmdomain/bcm/Kconfig | 42 ++++ + drivers/pmdomain/imx/Kconfig | 29 +++ + drivers/pmdomain/imx/gpc.c | 7 +- + drivers/pmdomain/mediatek/Kconfig | 29 +++ + drivers/pmdomain/mediatek/mt6795-pm-domains.h | 16 +- + drivers/pmdomain/mediatek/mt8167-pm-domains.h | 20 +- + drivers/pmdomain/mediatek/mt8173-pm-domains.h | 16 +- + drivers/pmdomain/mediatek/mt8183-pm-domains.h | 125 ++++++----- + drivers/pmdomain/mediatek/mt8186-pm-domains.h | 236 ++++++++++++--------- + drivers/pmdomain/mediatek/mt8188-pm-domains.h | 223 ++++++++++++------- + drivers/pmdomain/mediatek/mt8192-pm-domains.h | 112 ++++++---- + drivers/pmdomain/mediatek/mt8195-pm-domains.h | 199 ++++++++++------- + drivers/pmdomain/mediatek/mt8365-pm-domains.h | 197 +++++++++++++++++ + drivers/pmdomain/mediatek/mtk-pm-domains.c | 165 +++++++++----- + drivers/pmdomain/mediatek/mtk-pm-domains.h | 51 +++-- + drivers/pmdomain/qcom/Kconfig | 41 ++++ + drivers/pmdomain/qcom/cpr.c | 7 - + drivers/pmdomain/qcom/rpmhpd.c | 83 +++++++- + drivers/pmdomain/qcom/rpmpd.c | 98 ++++++++- + drivers/pmdomain/renesas/Kconfig | 109 ++++++++++ + drivers/pmdomain/renesas/rmobile-sysc.c | 2 +- + drivers/pmdomain/rockchip/Kconfig | 16 ++ + drivers/pmdomain/rockchip/pm-domains.c | 13 +- + drivers/pmdomain/samsung/Kconfig | 8 + + drivers/pmdomain/st/Kconfig | 5 + + drivers/pmdomain/st/Makefile | 2 +- + drivers/{soc => pmdomain}/starfive/Kconfig | 4 +- + drivers/pmdomain/starfive/jh71xx-pmu.c | 139 +++++++++--- + drivers/pmdomain/sunxi/Kconfig | 10 + + drivers/pmdomain/tegra/Kconfig | 6 + + drivers/pmdomain/ti/Kconfig | 22 ++ + drivers/pmdomain/ti/Makefile | 2 +- + drivers/pmdomain/ti/ti_sci_pm_domains.c | 8 +- + drivers/pmdomain/xilinx/Kconfig | 10 + + drivers/soc/Kconfig | 2 - + drivers/soc/amlogic/Kconfig | 35 --- + drivers/soc/apple/Kconfig | 13 -- + drivers/soc/bcm/Kconfig | 51 ----- + drivers/soc/imx/Kconfig | 19 -- + drivers/soc/mediatek/Kconfig | 23 -- + drivers/soc/qcom/Kconfig | 37 ---- + drivers/soc/renesas/Kconfig | 105 --------- + drivers/soc/rockchip/Kconfig | 12 -- + drivers/soc/samsung/Kconfig | 4 - + drivers/soc/sunxi/Kconfig | 9 - + drivers/soc/tegra/Kconfig | 5 - + drivers/soc/ti/Kconfig | 12 -- + drivers/soc/xilinx/Kconfig | 9 - + include/dt-bindings/power/qcom,rpmhpd.h | 2 + + include/dt-bindings/power/qcom-rpmpd.h | 21 ++ + include/dt-bindings/power/starfive,jh7110-pmu.h | 6 +- + include/linux/soc/mediatek/infracfg.h | 41 ++++ + 62 files changed, 1849 insertions(+), 927 deletions(-) + create mode 100644 drivers/pmdomain/Kconfig + rename drivers/{soc => pmdomain}/actions/Kconfig (100%) + create mode 100644 drivers/pmdomain/amlogic/Kconfig + create mode 100644 drivers/pmdomain/apple/Kconfig + create mode 100644 drivers/pmdomain/bcm/Kconfig + create mode 100644 drivers/pmdomain/imx/Kconfig + create mode 100644 drivers/pmdomain/mediatek/Kconfig + create mode 100644 drivers/pmdomain/mediatek/mt8365-pm-domains.h + create mode 100644 drivers/pmdomain/qcom/Kconfig + create mode 100644 drivers/pmdomain/renesas/Kconfig + create mode 100644 drivers/pmdomain/rockchip/Kconfig + create mode 100644 drivers/pmdomain/samsung/Kconfig + create mode 100644 drivers/pmdomain/st/Kconfig + rename drivers/{soc => pmdomain}/starfive/Kconfig (84%) + create mode 100644 drivers/pmdomain/sunxi/Kconfig + create mode 100644 drivers/pmdomain/tegra/Kconfig + create mode 100644 drivers/pmdomain/ti/Kconfig + create mode 100644 drivers/pmdomain/xilinx/Kconfig +Merging opp/opp/linux-next (35e0964e4876 dt-bindings: opp: opp-v2-kryo-cpu: Document named opp-microvolt property) +$ git merge -m Merge branch 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm.git opp/opp/linux-next +Already up to date. +Merging thermal/thermal/linux-next (9618efe343ea thermal/qcom/tsens: Drop ops_v0_1) +$ git merge -m Merge branch 'thermal/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git thermal/thermal/linux-next +Already up to date. +Merging dlm/next (eb53c01873ca MAINTAINERS: Update dlm maintainer and web page) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm.git dlm/next +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. + MAINTAINERS | 4 ++-- + fs/dlm/debug_fs.c | 18 +++++++----------- + fs/dlm/lowcomms.c | 12 ++++++++++++ + fs/dlm/midcomms.c | 39 ++++++++++++++++++++++++++++++++------- + 4 files changed, 53 insertions(+), 20 deletions(-) +Merging rdma/for-next (7a1c2abf9a2b RDMA/core: Remove NULL check before dev_{put, hold}) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git rdma/for-next +Auto-merging drivers/infiniband/core/nldev.c +Auto-merging drivers/infiniband/hw/hfi1/file_ops.c +Auto-merging drivers/infiniband/hw/mlx5/main.c +Auto-merging drivers/infiniband/hw/mlx5/mr.c +CONFLICT (content): Merge conflict in drivers/infiniband/hw/mlx5/mr.c +Auto-merging drivers/infiniband/sw/siw/siw_cm.c +Auto-merging drivers/net/ethernet/mellanox/mlx5/core/cmd.c +Auto-merging drivers/net/ethernet/mellanox/mlx5/core/en_main.c +Resolved 'drivers/infiniband/hw/mlx5/mr.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master d52da7870c3e] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git +$ git diff -M --stat --summary HEAD^.. + drivers/infiniband/core/cache.c | 2 +- + drivers/infiniband/core/core_priv.h | 1 + + drivers/infiniband/core/device.c | 4 +- + drivers/infiniband/core/lag.c | 3 +- + drivers/infiniband/core/nldev.c | 92 +++- + drivers/infiniband/core/rw.c | 2 +- + drivers/infiniband/core/sa_query.c | 4 +- + drivers/infiniband/core/sysfs.c | 14 +- + drivers/infiniband/core/user_mad.c | 4 +- + drivers/infiniband/core/uverbs_cmd.c | 3 +- + drivers/infiniband/core/uverbs_std_types_device.c | 3 +- + drivers/infiniband/core/verbs.c | 7 +- + drivers/infiniband/hw/bnxt_re/main.c | 173 ++++++- + drivers/infiniband/hw/bnxt_re/qplib_tlv.h | 2 +- + drivers/infiniband/hw/bnxt_re/roce_hsi.h | 58 +++ + drivers/infiniband/hw/hfi1/affinity.c | 2 +- + drivers/infiniband/hw/hfi1/affinity.h | 2 +- + drivers/infiniband/hw/hfi1/aspm.h | 2 +- + drivers/infiniband/hw/hfi1/chip.c | 6 +- + drivers/infiniband/hw/hfi1/chip.h | 2 +- + drivers/infiniband/hw/hfi1/chip_registers.h | 2 +- + drivers/infiniband/hw/hfi1/common.h | 2 +- + drivers/infiniband/hw/hfi1/debugfs.c | 2 +- + drivers/infiniband/hw/hfi1/debugfs.h | 2 +- + drivers/infiniband/hw/hfi1/device.c | 2 +- + drivers/infiniband/hw/hfi1/device.h | 2 +- + drivers/infiniband/hw/hfi1/driver.c | 2 +- + drivers/infiniband/hw/hfi1/efivar.c | 2 +- + drivers/infiniband/hw/hfi1/efivar.h | 2 +- + drivers/infiniband/hw/hfi1/eprom.c | 2 +- + drivers/infiniband/hw/hfi1/eprom.h | 2 +- + drivers/infiniband/hw/hfi1/exp_rcv.c | 2 +- + drivers/infiniband/hw/hfi1/exp_rcv.h | 2 +- + drivers/infiniband/hw/hfi1/fault.c | 2 +- + drivers/infiniband/hw/hfi1/fault.h | 2 +- + drivers/infiniband/hw/hfi1/file_ops.c | 2 +- + drivers/infiniband/hw/hfi1/firmware.c | 2 +- + drivers/infiniband/hw/hfi1/hfi.h | 2 +- + drivers/infiniband/hw/hfi1/init.c | 3 +- + drivers/infiniband/hw/hfi1/intr.c | 2 +- + drivers/infiniband/hw/hfi1/iowait.h | 2 +- + drivers/infiniband/hw/hfi1/ipoib_tx.c | 2 +- + drivers/infiniband/hw/hfi1/mad.c | 2 +- + drivers/infiniband/hw/hfi1/mad.h | 2 +- + drivers/infiniband/hw/hfi1/mmu_rb.c | 2 +- + drivers/infiniband/hw/hfi1/mmu_rb.h | 2 +- + drivers/infiniband/hw/hfi1/opa_compat.h | 2 +- + drivers/infiniband/hw/hfi1/pcie.c | 11 +- + drivers/infiniband/hw/hfi1/pio.c | 2 +- + drivers/infiniband/hw/hfi1/pio.h | 2 +- + drivers/infiniband/hw/hfi1/pio_copy.c | 2 +- + drivers/infiniband/hw/hfi1/platform.c | 2 +- + drivers/infiniband/hw/hfi1/platform.h | 2 +- + drivers/infiniband/hw/hfi1/qp.c | 2 +- + drivers/infiniband/hw/hfi1/qp.h | 2 +- + drivers/infiniband/hw/hfi1/qsfp.c | 2 +- + drivers/infiniband/hw/hfi1/qsfp.h | 2 +- + drivers/infiniband/hw/hfi1/rc.c | 2 +- + drivers/infiniband/hw/hfi1/ruc.c | 2 +- + drivers/infiniband/hw/hfi1/sdma.c | 2 +- + drivers/infiniband/hw/hfi1/sdma.h | 2 +- + drivers/infiniband/hw/hfi1/sdma_txreq.h | 2 +- + drivers/infiniband/hw/hfi1/sysfs.c | 2 +- + drivers/infiniband/hw/hfi1/trace.c | 2 +- + drivers/infiniband/hw/hfi1/trace.h | 2 +- + drivers/infiniband/hw/hfi1/trace_ctxts.h | 2 +- + drivers/infiniband/hw/hfi1/trace_dbg.h | 2 +- + drivers/infiniband/hw/hfi1/trace_ibhdrs.h | 2 +- + drivers/infiniband/hw/hfi1/trace_misc.h | 2 +- + drivers/infiniband/hw/hfi1/trace_mmu.h | 2 +- + drivers/infiniband/hw/hfi1/trace_rc.h | 2 +- + drivers/infiniband/hw/hfi1/trace_rx.h | 2 +- + drivers/infiniband/hw/hfi1/trace_tx.h | 2 +- + drivers/infiniband/hw/hfi1/uc.c | 2 +- + drivers/infiniband/hw/hfi1/ud.c | 2 +- + drivers/infiniband/hw/hfi1/user_exp_rcv.c | 2 +- + drivers/infiniband/hw/hfi1/user_exp_rcv.h | 4 +- + drivers/infiniband/hw/hfi1/user_pages.c | 2 +- + drivers/infiniband/hw/hfi1/user_sdma.c | 2 +- + drivers/infiniband/hw/hfi1/user_sdma.h | 2 +- + drivers/infiniband/hw/hfi1/verbs.c | 2 +- + drivers/infiniband/hw/hfi1/verbs.h | 2 +- + drivers/infiniband/hw/hfi1/verbs_txreq.c | 2 +- + drivers/infiniband/hw/hfi1/verbs_txreq.h | 2 +- + drivers/infiniband/hw/hfi1/vnic.h | 2 +- + drivers/infiniband/hw/hfi1/vnic_main.c | 2 +- + drivers/infiniband/hw/hfi1/vnic_sdma.c | 2 +- + drivers/infiniband/hw/hns/hns_roce_ah.c | 13 +- + drivers/infiniband/hw/hns/hns_roce_device.h | 6 + + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 90 +++- + drivers/infiniband/hw/hns/hns_roce_main.c | 24 +- + drivers/infiniband/hw/hns/hns_roce_qp.c | 2 +- + drivers/infiniband/hw/hns/hns_roce_restrack.c | 49 ++ + drivers/infiniband/hw/hns/hns_roce_srq.c | 85 +++- + drivers/infiniband/hw/irdma/cm.c | 2 +- + drivers/infiniband/hw/irdma/cm.h | 2 +- + drivers/infiniband/hw/irdma/ctrl.c | 2 +- + drivers/infiniband/hw/irdma/defs.h | 2 +- + drivers/infiniband/hw/irdma/hmc.c | 2 +- + drivers/infiniband/hw/irdma/hmc.h | 2 +- + drivers/infiniband/hw/irdma/hw.c | 2 +- + drivers/infiniband/hw/irdma/i40iw_hw.c | 2 +- + drivers/infiniband/hw/irdma/i40iw_hw.h | 2 +- + drivers/infiniband/hw/irdma/i40iw_if.c | 4 +- + drivers/infiniband/hw/irdma/icrdma_hw.c | 2 +- + drivers/infiniband/hw/irdma/icrdma_hw.h | 2 +- + drivers/infiniband/hw/irdma/irdma.h | 2 +- + drivers/infiniband/hw/irdma/main.c | 2 +- + drivers/infiniband/hw/irdma/main.h | 2 +- + drivers/infiniband/hw/irdma/osdep.h | 2 +- + drivers/infiniband/hw/irdma/pble.c | 2 +- + drivers/infiniband/hw/irdma/pble.h | 2 +- + drivers/infiniband/hw/irdma/protos.h | 2 +- + drivers/infiniband/hw/irdma/puda.c | 2 +- + drivers/infiniband/hw/irdma/puda.h | 2 +- + drivers/infiniband/hw/irdma/trace.c | 2 +- + drivers/infiniband/hw/irdma/trace.h | 2 +- + drivers/infiniband/hw/irdma/trace_cm.h | 2 +- + drivers/infiniband/hw/irdma/type.h | 2 +- + drivers/infiniband/hw/irdma/uda.c | 2 +- + drivers/infiniband/hw/irdma/uda.h | 2 +- + drivers/infiniband/hw/irdma/uda_d.h | 2 +- + drivers/infiniband/hw/irdma/uk.c | 2 +- + drivers/infiniband/hw/irdma/user.h | 2 +- + drivers/infiniband/hw/irdma/utils.c | 2 +- + drivers/infiniband/hw/irdma/verbs.c | 234 +++++++-- + drivers/infiniband/hw/irdma/verbs.h | 4 +- + drivers/infiniband/hw/irdma/ws.c | 2 +- + drivers/infiniband/hw/irdma/ws.h | 2 +- + drivers/infiniband/hw/mlx5/mad.c | 13 + + drivers/infiniband/hw/mlx5/main.c | 23 +- + drivers/infiniband/hw/mlx5/mlx5_ib.h | 21 +- + drivers/infiniband/hw/mlx5/mr.c | 324 ++++++------ + drivers/infiniband/hw/mlx5/qp.c | 29 +- + drivers/infiniband/hw/mlx5/umr.c | 4 +- + drivers/infiniband/hw/mthca/mthca_memfree.h | 2 +- + drivers/infiniband/hw/qib/qib_iba7322.c | 2 +- + drivers/infiniband/hw/usnic/usnic_uiom.h | 2 +- + drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c | 12 +- + drivers/infiniband/sw/rdmavt/ah.c | 2 +- + drivers/infiniband/sw/rdmavt/ah.h | 2 +- + drivers/infiniband/sw/rdmavt/cq.c | 2 +- + drivers/infiniband/sw/rdmavt/cq.h | 2 +- + drivers/infiniband/sw/rdmavt/mad.c | 2 +- + drivers/infiniband/sw/rdmavt/mad.h | 2 +- + drivers/infiniband/sw/rdmavt/mcast.c | 2 +- + drivers/infiniband/sw/rdmavt/mcast.h | 2 +- + drivers/infiniband/sw/rdmavt/mmap.c | 2 +- + drivers/infiniband/sw/rdmavt/mmap.h | 2 +- + drivers/infiniband/sw/rdmavt/mr.c | 2 +- + drivers/infiniband/sw/rdmavt/mr.h | 2 +- + drivers/infiniband/sw/rdmavt/pd.c | 2 +- + drivers/infiniband/sw/rdmavt/pd.h | 2 +- + drivers/infiniband/sw/rdmavt/qp.c | 2 +- + drivers/infiniband/sw/rdmavt/qp.h | 2 +- + drivers/infiniband/sw/rdmavt/rc.c | 2 +- + drivers/infiniband/sw/rdmavt/srq.c | 2 +- + drivers/infiniband/sw/rdmavt/srq.h | 2 +- + drivers/infiniband/sw/rdmavt/trace.c | 2 +- + drivers/infiniband/sw/rdmavt/trace.h | 2 +- + drivers/infiniband/sw/rdmavt/trace_cq.h | 2 +- + drivers/infiniband/sw/rdmavt/trace_mr.h | 2 +- + drivers/infiniband/sw/rdmavt/trace_qp.h | 2 +- + drivers/infiniband/sw/rdmavt/trace_rc.h | 2 +- + drivers/infiniband/sw/rdmavt/trace_rvt.h | 2 +- + drivers/infiniband/sw/rdmavt/trace_tx.h | 2 +- + drivers/infiniband/sw/rdmavt/vt.c | 2 +- + drivers/infiniband/sw/rdmavt/vt.h | 2 +- + drivers/infiniband/sw/siw/iwarp.h | 2 +- + drivers/infiniband/sw/siw/siw.h | 4 +- + drivers/infiniband/sw/siw/siw_cm.c | 2 +- + drivers/infiniband/sw/siw/siw_cm.h | 2 +- + drivers/infiniband/sw/siw/siw_cq.c | 2 +- + drivers/infiniband/sw/siw/siw_main.c | 2 +- + drivers/infiniband/sw/siw/siw_mem.c | 2 +- + drivers/infiniband/sw/siw/siw_mem.h | 2 +- + drivers/infiniband/sw/siw/siw_qp.c | 2 +- + drivers/infiniband/sw/siw/siw_qp_rx.c | 2 +- + drivers/infiniband/sw/siw/siw_qp_tx.c | 2 +- + drivers/infiniband/sw/siw/siw_verbs.c | 2 +- + drivers/infiniband/sw/siw/siw_verbs.h | 2 +- + drivers/infiniband/ulp/ipoib/ipoib_ethtool.c | 2 + + drivers/infiniband/ulp/ipoib/ipoib_main.c | 3 +- + drivers/infiniband/ulp/rtrs/rtrs-clt.c | 7 +- + drivers/infiniband/ulp/rtrs/rtrs.c | 2 +- + drivers/infiniband/ulp/srp/ib_srp.h | 2 +- + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 70 +++ + drivers/net/ethernet/mellanox/mlx5/core/en.h | 8 + + .../ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 3 +- + .../ethernet/mellanox/mlx5/core/en_accel/ipsec.h | 25 +- + .../mellanox/mlx5/core/en_accel/ipsec_fs.c | 122 ++++- + .../mellanox/mlx5/core/en_accel/ipsec_offload.c | 3 +- + drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 63 +++ + drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 10 +- + .../net/ethernet/mellanox/mlx5/core/lib/devcom.h | 1 + + .../mellanox/mlx5/core/lib/ipsec_fs_roce.c | 542 ++++++++++++++++++++- + .../mellanox/mlx5/core/lib/ipsec_fs_roce.h | 14 +- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 6 + + .../net/ethernet/mellanox/mlx5/core/mlx5_core.h | 22 + + drivers/net/ethernet/mellanox/mlx5/core/port.c | 3 +- + include/linux/mlx5/device.h | 2 + + include/linux/mlx5/driver.h | 2 + + include/linux/mlx5/mlx5_ifc.h | 71 ++- + include/linux/mlx5/port.h | 3 +- + include/rdma/ib_mad.h | 2 + + include/rdma/ib_verbs.h | 8 +- + include/uapi/rdma/hns-abi.h | 12 +- + include/uapi/rdma/ib_user_ioctl_verbs.h | 3 +- + include/uapi/rdma/rdma_netlink.h | 4 + + include/uapi/rdma/siw-abi.h | 2 +- + 210 files changed, 2106 insertions(+), 536 deletions(-) +Merging net-next/main (55c900477f5b net: fill in MODULE_DESCRIPTION()s under drivers/net/) +$ git merge -m Merge branch 'main' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git net-next/main +Auto-merging Documentation/devicetree/bindings/i3c/i3c.yaml +Auto-merging MAINTAINERS +Auto-merging drivers/Kconfig +Auto-merging drivers/Makefile +Auto-merging drivers/i3c/master.c +Auto-merging drivers/net/ethernet/broadcom/tg3.c +Auto-merging drivers/net/ethernet/freescale/fec_main.c +Auto-merging drivers/net/xen-netback/interface.c +Auto-merging include/linux/fortify-string.h +Auto-merging include/linux/i3c/master.h +Auto-merging include/linux/mm_types.h +Auto-merging include/linux/pci_ids.h +Auto-merging kernel/bpf/task_iter.c +Auto-merging kernel/cgroup/cgroup.c +Auto-merging kernel/trace/trace_kprobe.c +Auto-merging mm/percpu.c +Auto-merging net/core/pktgen.c +Auto-merging net/core/skbuff.c +Auto-merging tools/net/ynl/generated/Makefile +Merge made by the 'ort' strategy. + Documentation/admin-guide/sysctl/net.rst | 1 + + Documentation/bpf/libbpf/program_types.rst | 10 + + Documentation/bpf/prog_flow_dissector.rst | 2 +- + .../bpf/standardization/instruction-set.rst | 8 + + .../bindings/arm/mediatek/mediatek,mt7622-wed.yaml | 1 + + Documentation/devicetree/bindings/i3c/i3c.yaml | 6 + + Documentation/devicetree/bindings/mfd/syscon.yaml | 2 + + .../bindings/net/allwinner,sun8i-a83t-emac.yaml | 2 + + .../devicetree/bindings/net/brcm,asp-v2.0.yaml | 2 +- + .../devicetree/bindings/net/dsa/brcm,sf2.yaml | 1 + + Documentation/devicetree/bindings/net/dsa/dsa.yaml | 11 +- + .../bindings/net/dsa/mediatek,mt7530.yaml | 10 +- + .../devicetree/bindings/net/dsa/microchip,ksz.yaml | 22 + + .../bindings/net/dsa/microchip,lan937x.yaml | 3 +- + .../devicetree/bindings/net/dsa/nxp,sja1105.yaml | 4 +- + .../devicetree/bindings/net/dsa/qca8k.yaml | 1 + + .../devicetree/bindings/net/dsa/realtek.yaml | 2 + + .../bindings/net/dsa/renesas,rzn1-a5psw.yaml | 10 +- + .../devicetree/bindings/net/engleder,tsnep.yaml | 1 + + .../devicetree/bindings/net/ethernet-switch.yaml | 14 +- + Documentation/devicetree/bindings/net/fsl,fec.yaml | 1 + + .../bindings/net/loongson,ls1b-gmac.yaml | 114 + + .../bindings/net/loongson,ls1c-emac.yaml | 113 + + .../bindings/net/mscc,vsc7514-switch.yaml | 44 +- + .../devicetree/bindings/net/nxp,tja11xx.yaml | 1 + + .../devicetree/bindings/net/renesas,ether.yaml | 3 +- + .../devicetree/bindings/net/renesas,etheravb.yaml | 3 +- + .../devicetree/bindings/net/snps,dwmac.yaml | 5 + + .../devicetree/bindings/net/ti,cpsw-switch.yaml | 2 +- + .../devicetree/bindings/net/ti,icssg-prueth.yaml | 8 + + .../soc/mediatek/mediatek,mt7986-wo-ccif.yaml | 1 + + Documentation/driver-api/80211/mac80211.rst | 2 +- + Documentation/driver-api/dpll.rst | 551 +++ + Documentation/driver-api/index.rst | 1 + + Documentation/netlink/genetlink-c.yaml | 45 +- + Documentation/netlink/genetlink-legacy.yaml | 51 +- + Documentation/netlink/genetlink.yaml | 39 +- + Documentation/netlink/netlink-raw.yaml | 23 +- + Documentation/netlink/specs/devlink.yaml | 1568 ++++++- + Documentation/netlink/specs/dpll.yaml | 510 +++ + Documentation/netlink/specs/ethtool.yaml | 3 - + Documentation/netlink/specs/handshake.yaml | 8 +- + Documentation/netlink/specs/mptcp.yaml | 393 ++ + Documentation/netlink/specs/netdev.yaml | 21 +- + .../networking/device_drivers/appletalk/cops.rst | 80 - + .../networking/device_drivers/appletalk/index.rst | 18 - + .../networking/device_drivers/ethernet/index.rst | 1 + + .../device_drivers/ethernet/intel/idpf.rst | 160 + + .../ethernet/mellanox/mlx5/kconfig.rst | 2 +- + Documentation/networking/device_drivers/index.rst | 1 - + Documentation/networking/devlink/i40e.rst | 59 + + Documentation/networking/devlink/index.rst | 29 + + Documentation/networking/dsa/b53.rst | 14 +- + Documentation/networking/dsa/bcm_sf2.rst | 2 +- + Documentation/networking/dsa/configuration.rst | 102 +- + Documentation/networking/dsa/dsa.rst | 162 +- + Documentation/networking/dsa/lan9303.rst | 2 +- + Documentation/networking/dsa/sja1105.rst | 6 +- + Documentation/networking/filter.rst | 4 +- + Documentation/networking/index.rst | 2 +- + Documentation/networking/ip-sysctl.rst | 41 +- + Documentation/networking/ipddp.rst | 78 - + Documentation/networking/mptcp-sysctl.rst | 11 + + Documentation/networking/msg_zerocopy.rst | 13 +- + Documentation/networking/netconsole.rst | 22 +- + Documentation/networking/page_pool.rst | 4 +- + Documentation/networking/pktgen.rst | 12 + + Documentation/networking/scaling.rst | 42 + + Documentation/networking/sfp-phylink.rst | 10 +- + Documentation/networking/tcp_ao.rst | 444 ++ + Documentation/networking/xdp-rx-metadata.rst | 7 + + Documentation/process/7.AdvancedTopics.rst | 18 + + Documentation/process/maintainer-netdev.rst | 15 + + .../userspace-api/netlink/genetlink-legacy.rst | 16 +- + Documentation/userspace-api/netlink/specs.rst | 23 +- + MAINTAINERS | 51 +- + arch/arm/net/bpf_jit_32.c | 280 +- + arch/arm/net/bpf_jit_32.h | 4 + + .../boot/dts/marvell/armada-3720-espressobin.dtsi | 2 +- + arch/arm64/net/bpf_jit_comp.c | 2 +- + arch/s390/net/bpf_jit_comp.c | 267 +- + arch/x86/net/bpf_jit_comp.c | 148 +- + drivers/Kconfig | 2 + + drivers/Makefile | 1 + + drivers/atm/fore200e.c | 8 +- + drivers/bluetooth/btmtksdio.c | 44 +- + drivers/bluetooth/btqca.c | 68 + + drivers/bluetooth/btqca.h | 5 +- + drivers/bluetooth/btusb.c | 11 + + drivers/bluetooth/hci_bcm4377.c | 5 + + drivers/bluetooth/hci_qca.c | 11 + + drivers/dpll/Kconfig | 7 + + drivers/dpll/Makefile | 9 + + drivers/dpll/dpll_core.c | 798 ++++ + drivers/dpll/dpll_core.h | 89 + + drivers/dpll/dpll_netlink.c | 1423 +++++++ + drivers/dpll/dpll_netlink.h | 13 + + drivers/dpll/dpll_nl.c | 164 + + drivers/dpll/dpll_nl.h | 51 + + drivers/i3c/master.c | 35 + + drivers/infiniband/ulp/ipoib/ipoib_ib.c | 4 +- + drivers/net/Kconfig | 9 + + drivers/net/Makefile | 2 +- + drivers/net/Space.c | 6 - + drivers/net/amt.c | 1 + + drivers/net/appletalk/Kconfig | 102 - + drivers/net/appletalk/Makefile | 7 - + drivers/net/appletalk/cops.c | 1005 ----- + drivers/net/appletalk/cops.h | 61 - + drivers/net/appletalk/cops_ffdrv.h | 532 --- + drivers/net/appletalk/cops_ltdrv.h | 241 -- + drivers/net/appletalk/ipddp.c | 345 -- + drivers/net/appletalk/ipddp.h | 28 - + drivers/net/bareudp.c | 45 +- + drivers/net/bonding/bond_netlink.c | 2 +- + drivers/net/can/Kconfig | 1 + + drivers/net/can/at91_can.c | 998 ++--- + drivers/net/can/dev/dev.c | 51 +- + drivers/net/can/dev/rx-offload.c | 2 +- + drivers/net/can/dev/skb.c | 6 +- + drivers/net/can/sja1000/peak_pci.c | 2 +- + drivers/net/can/sja1000/sja1000.c | 2 +- + drivers/net/can/usb/etas_es58x/es58x_core.c | 1 + + drivers/net/can/usb/etas_es58x/es58x_core.h | 6 +- + drivers/net/can/usb/etas_es58x/es58x_devlink.c | 57 +- + drivers/net/dsa/b53/b53_common.c | 4 +- + drivers/net/dsa/b53/b53_mdio.c | 2 +- + drivers/net/dsa/b53/b53_mmap.c | 6 +- + drivers/net/dsa/b53/b53_srab.c | 8 +- + drivers/net/dsa/bcm_sf2.c | 49 +- + drivers/net/dsa/bcm_sf2.h | 2 +- + drivers/net/dsa/bcm_sf2_cfp.c | 4 +- + drivers/net/dsa/dsa_loop.c | 9 + + drivers/net/dsa/hirschmann/hellcreek.c | 8 +- + drivers/net/dsa/lan9303-core.c | 4 +- + drivers/net/dsa/lantiq_gswip.c | 45 +- + drivers/net/dsa/microchip/Makefile | 2 +- + drivers/net/dsa/microchip/ksz8795.c | 86 +- + drivers/net/dsa/microchip/ksz8795_reg.h | 21 - + drivers/net/dsa/microchip/ksz9477.c | 274 ++ + drivers/net/dsa/microchip/ksz9477.h | 43 + + drivers/net/dsa/microchip/ksz9477_acl.c | 1436 +++++++ + drivers/net/dsa/microchip/ksz9477_i2c.c | 5 +- + drivers/net/dsa/microchip/ksz9477_reg.h | 20 - + drivers/net/dsa/microchip/ksz9477_tc_flower.c | 281 ++ + drivers/net/dsa/microchip/ksz_common.c | 645 ++- + drivers/net/dsa/microchip/ksz_common.h | 42 + + drivers/net/dsa/microchip/ksz_ptp.c | 2 +- + drivers/net/dsa/microchip/ksz_spi.c | 5 +- + drivers/net/dsa/mt7530-mmio.c | 7 +- + drivers/net/dsa/mt7530.c | 32 +- + drivers/net/dsa/mv88e6xxx/chip.c | 4 +- + drivers/net/dsa/mv88e6xxx/pcs-639x.c | 2 +- + drivers/net/dsa/mv88e6xxx/ptp.c | 4 + + drivers/net/dsa/ocelot/felix.c | 68 +- + drivers/net/dsa/ocelot/felix.h | 6 +- + drivers/net/dsa/ocelot/ocelot_ext.c | 8 +- + drivers/net/dsa/ocelot/seville_vsc9953.c | 8 +- + drivers/net/dsa/qca/qca8k-8xxx.c | 50 +- + drivers/net/dsa/qca/qca8k-common.c | 7 +- + drivers/net/dsa/qca/qca8k-leds.c | 6 +- + drivers/net/dsa/qca/qca8k.h | 2 +- + drivers/net/dsa/realtek/realtek-smi.c | 36 +- + drivers/net/dsa/realtek/realtek.h | 2 +- + drivers/net/dsa/realtek/rtl8365mb.c | 5 +- + drivers/net/dsa/realtek/rtl8366-core.c | 8 +- + drivers/net/dsa/realtek/rtl8366rb.c | 44 +- + drivers/net/dsa/rzn1_a5psw.c | 8 +- + drivers/net/dsa/sja1105/sja1105_clocking.c | 21 +- + drivers/net/dsa/sja1105/sja1105_main.c | 4 +- + drivers/net/dsa/vitesse-vsc73xx-core.c | 49 +- + drivers/net/dsa/vitesse-vsc73xx-platform.c | 8 +- + drivers/net/dsa/xrs700x/xrs700x.c | 30 +- + drivers/net/dummy.c | 1 + + drivers/net/eql.c | 1 + + drivers/net/ethernet/8390/ax88796.c | 6 +- + drivers/net/ethernet/8390/mcf8390.c | 5 +- + drivers/net/ethernet/8390/ne.c | 5 +- + drivers/net/ethernet/actions/owl-emac.c | 6 +- + drivers/net/ethernet/aeroflex/greth.c | 6 +- + drivers/net/ethernet/allwinner/sun4i-emac.c | 5 +- + drivers/net/ethernet/altera/altera_tse.h | 2 +- + drivers/net/ethernet/altera/altera_tse_main.c | 19 +- + drivers/net/ethernet/amazon/ena/ena_netdev.c | 2 +- + drivers/net/ethernet/amd/au1000_eth.c | 6 +- + drivers/net/ethernet/amd/pds_core/core.c | 50 +- + drivers/net/ethernet/amd/pds_core/core.h | 7 + + drivers/net/ethernet/amd/pds_core/dev.c | 11 +- + drivers/net/ethernet/amd/pds_core/devlink.c | 31 +- + drivers/net/ethernet/amd/pds_core/main.c | 50 + + drivers/net/ethernet/amd/sunlance.c | 6 +- + drivers/net/ethernet/amd/xgbe/xgbe-platform.c | 48 +- + drivers/net/ethernet/apm/xgene-v2/main.c | 6 +- + drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 21 +- + drivers/net/ethernet/apm/xgene/xgene_enet_main.h | 3 +- + drivers/net/ethernet/apple/macmace.c | 6 +- + drivers/net/ethernet/arc/emac_arc.c | 6 +- + drivers/net/ethernet/arc/emac_rockchip.c | 5 +- + drivers/net/ethernet/asix/ax88796c_ioctl.c | 2 +- + drivers/net/ethernet/atheros/ag71xx.c | 8 +- + drivers/net/ethernet/atheros/atl1c/atl1c.h | 3 - + drivers/net/ethernet/atheros/atl1c/atl1c_main.c | 80 +- + drivers/net/ethernet/atheros/atlx/atl1.c | 4 +- + drivers/net/ethernet/atheros/atlx/atl2.c | 2 +- + drivers/net/ethernet/broadcom/asp2/bcmasp.c | 8 +- + drivers/net/ethernet/broadcom/bcm4908_enet.c | 6 +- + drivers/net/ethernet/broadcom/bcm63xx_enet.c | 14 +- + drivers/net/ethernet/broadcom/bcmsysport.c | 8 +- + drivers/net/ethernet/broadcom/bgmac-platform.c | 6 +- + drivers/net/ethernet/broadcom/bnxt/Makefile | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 275 +- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 13 + + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 95 +- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 694 +++- + drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h | 541 ++- + drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c | 241 ++ + drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.h | 30 + + drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.c | 2 + + drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.h | 14 + + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 26 +- + drivers/net/ethernet/broadcom/genet/bcmgenet.c | 26 +- + drivers/net/ethernet/broadcom/sb1250-mac.c | 6 +- + drivers/net/ethernet/broadcom/tg3.c | 81 +- + drivers/net/ethernet/broadcom/tg3.h | 3 + + drivers/net/ethernet/brocade/bna/bfa_ioc.c | 2 +- + drivers/net/ethernet/cadence/macb_main.c | 6 +- + drivers/net/ethernet/calxeda/xgmac.c | 6 +- + drivers/net/ethernet/cavium/liquidio/lio_ethtool.c | 18 +- + drivers/net/ethernet/cavium/liquidio/lio_main.c | 2 +- + drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c | 3 +- + .../net/ethernet/cavium/liquidio/octeon_device.c | 11 +- + drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | 5 +- + drivers/net/ethernet/chelsio/cxgb3/l2t.h | 2 +- + drivers/net/ethernet/chelsio/cxgb3/sge.c | 15 +- + drivers/net/ethernet/chelsio/cxgb4/clip_tbl.h | 2 +- + .../ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h | 2 +- + drivers/net/ethernet/chelsio/cxgb4/l2t.c | 2 +- + drivers/net/ethernet/chelsio/cxgb4/sched.h | 2 +- + drivers/net/ethernet/chelsio/cxgb4/sge.c | 2 +- + drivers/net/ethernet/chelsio/cxgb4/smt.h | 2 +- + drivers/net/ethernet/chelsio/cxgb4vf/sge.c | 2 +- + .../chelsio/inline_crypto/ch_ktls/chcr_ktls.c | 43 +- + .../chelsio/inline_crypto/ch_ktls/chcr_ktls.h | 36 +- + .../chelsio/inline_crypto/chtls/chtls_cm.c | 2 +- + drivers/net/ethernet/cirrus/cs89x0.c | 5 +- + drivers/net/ethernet/cirrus/ep93xx_eth.c | 8 +- + drivers/net/ethernet/cirrus/mac89x0.c | 5 +- + drivers/net/ethernet/cortina/gemini.c | 12 +- + drivers/net/ethernet/davicom/dm9000.c | 6 +- + drivers/net/ethernet/dec/tulip/tulip.h | 2 +- + drivers/net/ethernet/dnet.c | 6 +- + drivers/net/ethernet/engleder/tsnep.h | 2 +- + drivers/net/ethernet/engleder/tsnep_hw.h | 2 + + drivers/net/ethernet/engleder/tsnep_main.c | 121 +- + drivers/net/ethernet/ethoc.c | 6 +- + drivers/net/ethernet/ezchip/nps_enet.c | 2 +- + drivers/net/ethernet/faraday/ftgmac100.c | 5 +- + drivers/net/ethernet/faraday/ftmac100.c | 5 +- + drivers/net/ethernet/freescale/enetc/enetc.c | 2 +- + drivers/net/ethernet/freescale/enetc/enetc.h | 2 +- + drivers/net/ethernet/freescale/enetc/enetc_qos.c | 2 +- + drivers/net/ethernet/freescale/fec_main.c | 83 +- + drivers/net/ethernet/freescale/fman/fman_memac.c | 11 +- + .../net/ethernet/freescale/fs_enet/fs_enet-main.c | 18 +- + drivers/net/ethernet/freescale/fs_enet/mii-fec.c | 10 +- + drivers/net/ethernet/freescale/fsl_pq_mdio.c | 12 +- + drivers/net/ethernet/google/gve/gve_main.c | 4 +- + drivers/net/ethernet/hisilicon/hip04_eth.c | 6 +- + drivers/net/ethernet/hisilicon/hisi_femac.c | 6 +- + drivers/net/ethernet/hisilicon/hix5hd2_gmac.c | 17 +- + drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 6 +- + drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.h | 2 +- + drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h | 2 +- + drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 +- + drivers/net/ethernet/hisilicon/hns3/hnae3.h | 5 + + .../hisilicon/hns3/hns3_common/hclge_comm_cmd.c | 1 + + .../hisilicon/hns3/hns3_common/hclge_comm_cmd.h | 2 + + drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 3 + + drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 3 +- + .../net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 116 +- + .../net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h | 2 + + .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 161 +- + .../ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 18 +- + .../net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 2 +- + drivers/net/ethernet/hisilicon/hns_mdio.c | 5 +- + drivers/net/ethernet/huawei/hinic/hinic_devlink.c | 217 +- + drivers/net/ethernet/huawei/hinic/hinic_tx.c | 8 +- + drivers/net/ethernet/i825xx/sni_82596.c | 5 +- + drivers/net/ethernet/ibm/ehea/ehea_main.c | 10 +- + drivers/net/ethernet/ibm/emac/core.c | 6 +- + drivers/net/ethernet/ibm/emac/mal.c | 8 +- + drivers/net/ethernet/ibm/emac/rgmii.c | 6 +- + drivers/net/ethernet/ibm/emac/tah.c | 6 +- + drivers/net/ethernet/ibm/emac/zmii.c | 6 +- + drivers/net/ethernet/ibm/ibmveth.c | 2 +- + drivers/net/ethernet/ibm/ibmvnic.c | 5 +- + drivers/net/ethernet/intel/Kconfig | 14 + + drivers/net/ethernet/intel/Makefile | 1 + + drivers/net/ethernet/intel/e100.c | 2 +- + drivers/net/ethernet/intel/e1000/e1000_main.c | 2 +- + drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c | 8 +- + drivers/net/ethernet/intel/i40e/Makefile | 3 +- + drivers/net/ethernet/intel/i40e/i40e.h | 216 +- + drivers/net/ethernet/intel/i40e/i40e_adminq.c | 8 +- + drivers/net/ethernet/intel/i40e/i40e_adminq.h | 3 +- + drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 2 + + drivers/net/ethernet/intel/i40e/i40e_alloc.h | 24 +- + drivers/net/ethernet/intel/i40e/i40e_client.c | 1 - + drivers/net/ethernet/intel/i40e/i40e_common.c | 69 +- + drivers/net/ethernet/intel/i40e/i40e_dcb.c | 4 +- + drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c | 2 +- + drivers/net/ethernet/intel/i40e/i40e_ddp.c | 31 +- + drivers/net/ethernet/intel/i40e/i40e_debug.h | 47 + + drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 3 +- + drivers/net/ethernet/intel/i40e/i40e_devlink.c | 236 ++ + drivers/net/ethernet/intel/i40e/i40e_devlink.h | 18 + + drivers/net/ethernet/intel/i40e/i40e_diag.h | 5 +- + drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 16 +- + drivers/net/ethernet/intel/i40e/i40e_hmc.c | 16 +- + drivers/net/ethernet/intel/i40e/i40e_hmc.h | 4 + + drivers/net/ethernet/intel/i40e/i40e_io.h | 16 + + drivers/net/ethernet/intel/i40e/i40e_lan_hmc.c | 9 +- + drivers/net/ethernet/intel/i40e/i40e_lan_hmc.h | 2 + + drivers/net/ethernet/intel/i40e/i40e_main.c | 125 +- + drivers/net/ethernet/intel/i40e/i40e_nvm.c | 2 + + drivers/net/ethernet/intel/i40e/i40e_osdep.h | 59 - + drivers/net/ethernet/intel/i40e/i40e_prototype.h | 12 +- + drivers/net/ethernet/intel/i40e/i40e_ptp.c | 3 +- + drivers/net/ethernet/intel/i40e/i40e_register.h | 5 + + drivers/net/ethernet/intel/i40e/i40e_txrx.c | 9 +- + drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 + + drivers/net/ethernet/intel/i40e/i40e_txrx_common.h | 2 + + drivers/net/ethernet/intel/i40e/i40e_type.h | 60 +- + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 4 +- + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h | 4 +- + drivers/net/ethernet/intel/i40e/i40e_xsk.c | 4 - + drivers/net/ethernet/intel/i40e/i40e_xsk.h | 4 + + drivers/net/ethernet/intel/iavf/Makefile | 2 +- + drivers/net/ethernet/intel/iavf/iavf.h | 46 +- + drivers/net/ethernet/intel/iavf/iavf_client.c | 578 --- + drivers/net/ethernet/intel/iavf/iavf_client.h | 169 - + drivers/net/ethernet/intel/iavf/iavf_common.c | 32 - + drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 8 +- + drivers/net/ethernet/intel/iavf/iavf_main.c | 244 +- + drivers/net/ethernet/intel/iavf/iavf_prototype.h | 2 - + drivers/net/ethernet/intel/iavf/iavf_txrx.c | 46 +- + drivers/net/ethernet/intel/iavf/iavf_type.h | 12 - + drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | 117 +- + drivers/net/ethernet/intel/ice/Makefile | 2 +- + drivers/net/ethernet/intel/ice/ice.h | 23 +- + drivers/net/ethernet/intel/ice/ice_adminq_cmd.h | 306 +- + drivers/net/ethernet/intel/ice/ice_common.c | 750 +++- + drivers/net/ethernet/intel/ice/ice_common.h | 51 +- + drivers/net/ethernet/intel/ice/ice_ddp.c | 475 ++- + drivers/net/ethernet/intel/ice/ice_ddp.h | 27 +- + drivers/net/ethernet/intel/ice/ice_devids.h | 10 +- + drivers/net/ethernet/intel/ice/ice_dpll.c | 2120 ++++++++++ + drivers/net/ethernet/intel/ice/ice_dpll.h | 114 + + drivers/net/ethernet/intel/ice/ice_eswitch_br.c | 6 +- + drivers/net/ethernet/intel/ice/ice_ethtool.c | 228 +- + drivers/net/ethernet/intel/ice/ice_ethtool.h | 8 + + drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c | 24 +- + drivers/net/ethernet/intel/ice/ice_flow.c | 5 +- + drivers/net/ethernet/intel/ice/ice_flow.h | 3 - + drivers/net/ethernet/intel/ice/ice_gnss.c | 3 + + drivers/net/ethernet/intel/ice/ice_hw_autogen.h | 53 +- + drivers/net/ethernet/intel/ice/ice_lag.c | 135 +- + drivers/net/ethernet/intel/ice/ice_lag.h | 2 + + drivers/net/ethernet/intel/ice/ice_lib.c | 43 +- + drivers/net/ethernet/intel/ice/ice_main.c | 96 +- + drivers/net/ethernet/intel/ice/ice_ptp.c | 679 +++- + drivers/net/ethernet/intel/ice/ice_ptp.h | 41 +- + drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 758 +++- + drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 95 +- + drivers/net/ethernet/intel/ice/ice_sched.c | 56 +- + drivers/net/ethernet/intel/ice/ice_sched.h | 6 +- + drivers/net/ethernet/intel/ice/ice_sriov.c | 307 +- + drivers/net/ethernet/intel/ice/ice_sriov.h | 17 +- + drivers/net/ethernet/intel/ice/ice_switch.c | 63 +- + drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 2 +- + drivers/net/ethernet/intel/ice/ice_type.h | 29 +- + drivers/net/ethernet/intel/ice/ice_vf_lib.c | 2 + + drivers/net/ethernet/intel/ice/ice_vf_lib.h | 9 +- + drivers/net/ethernet/intel/ice/ice_virtchnl.c | 71 +- + drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c | 29 +- + drivers/net/ethernet/intel/ice/ice_xsk.c | 22 +- + drivers/net/ethernet/intel/idpf/Makefile | 18 + + drivers/net/ethernet/intel/idpf/idpf.h | 968 +++++ + drivers/net/ethernet/intel/idpf/idpf_controlq.c | 621 +++ + drivers/net/ethernet/intel/idpf/idpf_controlq.h | 130 + + .../net/ethernet/intel/idpf/idpf_controlq_api.h | 169 + + .../net/ethernet/intel/idpf/idpf_controlq_setup.c | 171 + + drivers/net/ethernet/intel/idpf/idpf_dev.c | 165 + + drivers/net/ethernet/intel/idpf/idpf_devids.h | 10 + + drivers/net/ethernet/intel/idpf/idpf_ethtool.c | 1369 +++++++ + drivers/net/ethernet/intel/idpf/idpf_lan_pf_regs.h | 124 + + drivers/net/ethernet/intel/idpf/idpf_lan_txrx.h | 293 ++ + drivers/net/ethernet/intel/idpf/idpf_lan_vf_regs.h | 128 + + drivers/net/ethernet/intel/idpf/idpf_lib.c | 2379 +++++++++++ + drivers/net/ethernet/intel/idpf/idpf_main.c | 279 ++ + drivers/net/ethernet/intel/idpf/idpf_mem.h | 20 + + .../net/ethernet/intel/idpf/idpf_singleq_txrx.c | 1183 ++++++ + drivers/net/ethernet/intel/idpf/idpf_txrx.c | 4292 ++++++++++++++++++++ + drivers/net/ethernet/intel/idpf/idpf_txrx.h | 1023 +++++ + drivers/net/ethernet/intel/idpf/idpf_vf_dev.c | 163 + + drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 3798 +++++++++++++++++ + drivers/net/ethernet/intel/idpf/virtchnl2.h | 1273 ++++++ + .../net/ethernet/intel/idpf/virtchnl2_lan_desc.h | 451 ++ + drivers/net/ethernet/intel/igb/igb_ethtool.c | 4 +- + drivers/net/ethernet/intel/igb/igb_main.c | 55 +- + drivers/net/ethernet/intel/igbvf/netdev.c | 2 +- + drivers/net/ethernet/intel/igc/igc_ethtool.c | 5 +- + drivers/net/ethernet/intel/igc/igc_main.c | 2 +- + drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 +- + drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +- + drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 26 +- + drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 2 +- + drivers/net/ethernet/korina.c | 6 +- + drivers/net/ethernet/lantiq_etop.c | 6 +- + drivers/net/ethernet/lantiq_xrx200.c | 6 +- + drivers/net/ethernet/litex/litex_liteeth.c | 6 +- + drivers/net/ethernet/marvell/mv643xx_eth.c | 11 +- + drivers/net/ethernet/marvell/mvmdio.c | 6 +- + drivers/net/ethernet/marvell/mvneta.c | 8 +- + drivers/net/ethernet/marvell/mvneta_bm.c | 6 +- + drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 12 +- + .../net/ethernet/marvell/octeon_ep/octep_cn9k_pf.c | 168 +- + .../net/ethernet/marvell/octeon_ep/octep_config.h | 22 +- + .../ethernet/marvell/octeon_ep/octep_ctrl_net.c | 24 +- + .../ethernet/marvell/octeon_ep/octep_ctrl_net.h | 18 + + .../net/ethernet/marvell/octeon_ep/octep_main.c | 213 +- + .../net/ethernet/marvell/octeon_ep/octep_main.h | 13 +- + .../marvell/octeon_ep/octep_regs_cn9k_pf.h | 4 + + drivers/net/ethernet/marvell/octeon_ep/octep_rx.h | 3 + + drivers/net/ethernet/marvell/octeon_ep/octep_tx.h | 4 + + drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 8 +- + drivers/net/ethernet/marvell/octeontx2/af/mbox.h | 11 +- + drivers/net/ethernet/marvell/octeontx2/af/npc.h | 8 + + drivers/net/ethernet/marvell/octeontx2/af/ptp.c | 88 +- + .../net/ethernet/marvell/octeontx2/af/rvu_cgx.c | 7 +- + .../ethernet/marvell/octeontx2/af/rvu_debugfs.c | 53 + + .../ethernet/marvell/octeontx2/af/rvu_devlink.c | 464 +-- + .../net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c | 62 + + .../ethernet/marvell/octeontx2/nic/otx2_common.c | 2 +- + .../net/ethernet/marvell/octeontx2/nic/otx2_ptp.c | 31 +- + .../net/ethernet/marvell/octeontx2/nic/otx2_tc.c | 58 + + drivers/net/ethernet/marvell/pxa168_eth.c | 5 +- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 +- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- + drivers/net/ethernet/mediatek/mtk_ppe.c | 4 +- + drivers/net/ethernet/mediatek/mtk_ppe.h | 19 +- + drivers/net/ethernet/mediatek/mtk_ppe_offload.c | 12 +- + drivers/net/ethernet/mediatek/mtk_wed.c | 1432 +++++-- + drivers/net/ethernet/mediatek/mtk_wed.h | 57 + + drivers/net/ethernet/mediatek/mtk_wed_debugfs.c | 400 +- + drivers/net/ethernet/mediatek/mtk_wed_mcu.c | 152 +- + drivers/net/ethernet/mediatek/mtk_wed_regs.h | 369 +- + drivers/net/ethernet/mediatek/mtk_wed_wo.h | 3 +- + drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 +- + drivers/net/ethernet/mellanox/mlx4/fw.c | 2 +- + drivers/net/ethernet/mellanox/mlx5/core/Kconfig | 8 + + drivers/net/ethernet/mellanox/mlx5/core/Makefile | 3 + + drivers/net/ethernet/mellanox/mlx5/core/dev.c | 122 +- + drivers/net/ethernet/mellanox/mlx5/core/devlink.c | 11 - + .../ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 49 +- + .../mellanox/mlx5/core/diag/reporter_vnic.c | 118 +- + .../mellanox/mlx5/core/diag/reporter_vnic.h | 6 +- + drivers/net/ethernet/mellanox/mlx5/core/dpll.c | 432 ++ + drivers/net/ethernet/mellanox/mlx5/core/en.h | 5 +- + .../net/ethernet/mellanox/mlx5/core/en/devlink.c | 8 + + drivers/net/ethernet/mellanox/mlx5/core/en/fs.h | 1 - + .../net/ethernet/mellanox/mlx5/core/en/health.c | 187 +- + .../net/ethernet/mellanox/mlx5/core/en/health.h | 14 +- + .../ethernet/mellanox/mlx5/core/en/reporter_rx.c | 418 +- + .../ethernet/mellanox/mlx5/core/en/reporter_tx.c | 342 +- + drivers/net/ethernet/mellanox/mlx5/core/en/rqt.c | 32 +- + drivers/net/ethernet/mellanox/mlx5/core/en/rqt.h | 9 +- + drivers/net/ethernet/mellanox/mlx5/core/en/rss.c | 152 +- + drivers/net/ethernet/mellanox/mlx5/core/en/rss.h | 20 +- + .../net/ethernet/mellanox/mlx5/core/en/rx_res.c | 105 +- + .../net/ethernet/mellanox/mlx5/core/en/rx_res.h | 12 +- + drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 2 +- + .../ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 23 +- + .../mellanox/mlx5/core/en_accel/ipsec_fs.c | 24 +- + .../mellanox/mlx5/core/en_accel/ipsec_rxtx.h | 1 - + .../net/ethernet/mellanox/mlx5/core/en_ethtool.c | 2 +- + drivers/net/ethernet/mellanox/mlx5/core/en_fs.c | 8 +- + drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 34 +- + drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 32 +- + drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 16 +- + .../ethernet/mellanox/mlx5/core/esw/bridge_mcast.c | 11 +- + drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c | 96 +- + drivers/net/ethernet/mellanox/mlx5/core/events.c | 5 - + drivers/net/ethernet/mellanox/mlx5/core/health.c | 129 +- + .../net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 24 +- + drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 47 +- + drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h | 1 + + .../net/ethernet/mellanox/mlx5/core/lag/mpesw.c | 27 +- + .../net/ethernet/mellanox/mlx5/core/lag/port_sel.c | 10 +- + .../net/ethernet/mellanox/mlx5/core/lib/devcom.c | 25 + + .../net/ethernet/mellanox/mlx5/core/lib/devcom.h | 5 + + drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h | 1 - + drivers/net/ethernet/mellanox/mlx5/core/main.c | 27 +- + .../net/ethernet/mellanox/mlx5/core/mlx5_core.h | 14 +- + .../net/ethernet/mellanox/mlx5/core/sf/dev/dev.c | 101 +- + .../net/ethernet/mellanox/mlx5/core/sf/dev/dev.h | 6 + + .../ethernet/mellanox/mlx5/core/sf/dev/driver.c | 26 + + .../net/ethernet/mellanox/mlx5/core/sf/devlink.c | 244 +- + .../ethernet/mellanox/mlx5/core/sf/vhca_event.c | 69 +- + .../ethernet/mellanox/mlx5/core/sf/vhca_event.h | 3 + + .../mellanox/mlx5/core/steering/dr_action.c | 35 +- + .../mellanox/mlx5/core/steering/dr_types.h | 5 +- + .../ethernet/mellanox/mlx5/core/steering/fs_dr.c | 9 +- + .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c | 6 +- + drivers/net/ethernet/mellanox/mlxsw/cmd.h | 43 +- + drivers/net/ethernet/mellanox/mlxsw/core.c | 178 +- + drivers/net/ethernet/mellanox/mlxsw/core.h | 6 +- + .../ethernet/mellanox/mlxsw/core_acl_flex_keys.c | 72 +- + .../ethernet/mellanox/mlxsw/core_acl_flex_keys.h | 15 +- + drivers/net/ethernet/mellanox/mlxsw/core_env.c | 4 +- + drivers/net/ethernet/mellanox/mlxsw/core_hwmon.c | 2 +- + .../ethernet/mellanox/mlxsw/core_linecard_dev.c | 9 +- + drivers/net/ethernet/mellanox/mlxsw/core_thermal.c | 3 +- + drivers/net/ethernet/mellanox/mlxsw/i2c.c | 4 +- + drivers/net/ethernet/mellanox/mlxsw/pci.c | 37 +- + drivers/net/ethernet/mellanox/mlxsw/reg.h | 20 +- + drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 95 +- + drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 3 +- + .../ethernet/mellanox/mlxsw/spectrum2_mr_tcam.c | 20 +- + .../mellanox/mlxsw/spectrum_acl_bloom_filter.c | 2 +- + .../mellanox/mlxsw/spectrum_acl_flex_keys.c | 30 +- + drivers/net/ethernet/mellanox/mlxsw/spectrum_cnt.c | 2 +- + .../net/ethernet/mellanox/mlxsw/spectrum_ethtool.c | 2 +- + drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c | 93 +- + drivers/net/ethernet/mellanox/mlxsw/spectrum_pgt.c | 20 +- + .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +- + .../net/ethernet/mellanox/mlxsw/spectrum_span.c | 2 +- + drivers/net/ethernet/micrel/ks8842.c | 5 +- + drivers/net/ethernet/micrel/ks8851_par.c | 6 +- + drivers/net/ethernet/microchip/lan743x_ethtool.c | 3 +- + drivers/net/ethernet/microchip/lan743x_main.c | 51 +- + drivers/net/ethernet/microchip/lan743x_main.h | 8 + + drivers/net/ethernet/microchip/lan743x_ptp.c | 9 + + .../net/ethernet/microchip/lan966x/lan966x_main.c | 7 +- + .../net/ethernet/microchip/sparx5/sparx5_ethtool.c | 3 +- + .../net/ethernet/microchip/sparx5/sparx5_main.c | 6 +- + .../net/ethernet/microchip/vcap/vcap_api_debugfs.c | 2 +- + drivers/net/ethernet/microsoft/mana/mana_en.c | 5 +- + drivers/net/ethernet/moxa/moxart_ether.c | 6 +- + drivers/net/ethernet/mscc/ocelot_vsc7514.c | 6 +- + drivers/net/ethernet/natsemi/jazzsonic.c | 6 +- + drivers/net/ethernet/natsemi/macsonic.c | 6 +- + drivers/net/ethernet/natsemi/xtsonic.c | 6 +- + drivers/net/ethernet/netronome/nfp/crypto/ipsec.c | 45 +- + drivers/net/ethernet/netronome/nfp/nfd3/dp.c | 2 +- + drivers/net/ethernet/netronome/nfp/nfd3/xsk.c | 2 +- + drivers/net/ethernet/netronome/nfp/nfdk/dp.c | 2 +- + drivers/net/ethernet/netronome/nfp/nfp_net_repr.h | 2 +- + .../net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h | 2 +- + .../ethernet/netronome/nfp/nfpcore/nfp_resource.c | 2 +- + drivers/net/ethernet/ni/nixge.c | 11 +- + drivers/net/ethernet/nxp/lpc_eth.c | 6 +- + drivers/net/ethernet/pensando/ionic/ionic_dev.h | 3 +- + drivers/net/ethernet/pensando/ionic/ionic_lif.c | 12 + + drivers/net/ethernet/pensando/ionic/ionic_main.c | 4 +- + drivers/net/ethernet/pensando/ionic/ionic_txrx.c | 77 +- + drivers/net/ethernet/qlogic/qed/qed_debug.c | 7 +- + drivers/net/ethernet/qlogic/qed/qed_devlink.c | 6 +- + drivers/net/ethernet/qlogic/qede/qede_ethtool.c | 46 +- + drivers/net/ethernet/qualcomm/emac/emac.c | 6 +- + drivers/net/ethernet/realtek/r8169_main.c | 4 + + drivers/net/ethernet/renesas/Kconfig | 9 +- + drivers/net/ethernet/renesas/Makefile | 4 +- + drivers/net/ethernet/renesas/ravb_main.c | 6 +- + drivers/net/ethernet/renesas/rswitch.c | 55 +- + drivers/net/ethernet/renesas/rswitch.h | 2 +- + drivers/net/ethernet/renesas/sh_eth.c | 6 +- + .../net/ethernet/samsung/sxgbe/sxgbe_platform.c | 6 +- + drivers/net/ethernet/seeq/sgiseeq.c | 6 +- + drivers/net/ethernet/sfc/efx_channels.c | 2 +- + drivers/net/ethernet/sfc/mae.c | 62 +- + drivers/net/ethernet/sfc/mcdi.c | 3 +- + drivers/net/ethernet/sfc/ptp.c | 27 +- + drivers/net/ethernet/sfc/siena/efx_channels.c | 2 +- + drivers/net/ethernet/sfc/tc.c | 337 +- + drivers/net/ethernet/sfc/tc.h | 8 + + drivers/net/ethernet/sfc/tc_conntrack.c | 91 +- + drivers/net/ethernet/sgi/ioc3-eth.c | 6 +- + drivers/net/ethernet/sgi/meth.c | 6 +- + drivers/net/ethernet/smsc/smc91x.c | 6 +- + drivers/net/ethernet/smsc/smsc911x.c | 6 +- + drivers/net/ethernet/socionext/netsec.c | 8 +- + drivers/net/ethernet/socionext/sni_ave.c | 6 +- + drivers/net/ethernet/stmicro/stmmac/Kconfig | 11 + + drivers/net/ethernet/stmicro/stmmac/Makefile | 1 + + drivers/net/ethernet/stmicro/stmmac/common.h | 2 +- + .../net/ethernet/stmicro/stmmac/dwmac-anarion.c | 10 +- + .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c | 15 +- + .../net/ethernet/stmicro/stmmac/dwmac-generic.c | 15 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c | 13 +- + .../net/ethernet/stmicro/stmmac/dwmac-ingenic.c | 33 +- + .../net/ethernet/stmicro/stmmac/dwmac-intel-plat.c | 34 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c | 1 - + .../net/ethernet/stmicro/stmmac/dwmac-ipq806x.c | 27 +- + .../net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 209 + + .../net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c | 19 +- + .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c | 6 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c | 25 +- + .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 53 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 14 +- + .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 16 +- + .../net/ethernet/stmicro/stmmac/dwmac-starfive.c | 10 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c | 14 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c | 148 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 6 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 23 +- + drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c | 10 +- + .../net/ethernet/stmicro/stmmac/dwmac-visconti.c | 18 +- + .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 2 +- + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 50 +- + .../net/ethernet/stmicro/stmmac/stmmac_platform.c | 75 +- + .../net/ethernet/stmicro/stmmac/stmmac_platform.h | 5 - + drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 34 +- + drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h | 2 +- + .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 2 +- + drivers/net/ethernet/sun/niu.c | 5 +- + drivers/net/ethernet/sun/sunbmac.c | 6 +- + drivers/net/ethernet/sun/sunqe.c | 6 +- + drivers/net/ethernet/sunplus/spl2sw_driver.c | 6 +- + drivers/net/ethernet/ti/Kconfig | 9 +- + drivers/net/ethernet/ti/Makefile | 1 - + drivers/net/ethernet/ti/cpmac.c | 1251 ------ + drivers/net/ethernet/ti/cpsw_priv.c | 2 +- + drivers/net/ethernet/ti/davinci_emac.c | 40 +- + drivers/net/ethernet/ti/davinci_mdio.c | 6 +- + drivers/net/ethernet/ti/icssg/icssg_config.c | 14 + + drivers/net/ethernet/ti/icssg/icssg_prueth.c | 49 +- + drivers/net/ethernet/ti/icssg/icssg_prueth.h | 2 + + drivers/net/ethernet/ti/netcp_core.c | 5 +- + drivers/net/ethernet/ti/netcp_ethss.c | 4 +- + drivers/net/ethernet/toshiba/spider_net.c | 2 +- + drivers/net/ethernet/toshiba/tc35815.c | 10 +- + drivers/net/ethernet/tundra/tsi108_eth.c | 6 +- + drivers/net/ethernet/via/via-rhine.c | 6 +- + drivers/net/ethernet/via/via-velocity.c | 6 +- + drivers/net/ethernet/wangxun/libwx/wx_ethtool.c | 169 + + drivers/net/ethernet/wangxun/libwx/wx_ethtool.h | 8 + + drivers/net/ethernet/wangxun/libwx/wx_hw.c | 191 + + drivers/net/ethernet/wangxun/libwx/wx_hw.h | 9 + + drivers/net/ethernet/wangxun/libwx/wx_lib.c | 20 +- + drivers/net/ethernet/wangxun/libwx/wx_type.h | 82 + + drivers/net/ethernet/wangxun/ngbe/ngbe_ethtool.c | 5 + + drivers/net/ethernet/wangxun/ngbe/ngbe_hw.c | 2 + + drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 7 +- + drivers/net/ethernet/wangxun/ngbe/ngbe_mdio.c | 119 +- + drivers/net/ethernet/wangxun/ngbe/ngbe_type.h | 3 - + drivers/net/ethernet/wangxun/txgbe/txgbe_ethtool.c | 5 + + drivers/net/ethernet/wangxun/txgbe/txgbe_hw.c | 110 +- + drivers/net/ethernet/wangxun/txgbe/txgbe_hw.h | 1 - + drivers/net/ethernet/wangxun/txgbe/txgbe_main.c | 10 +- + drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c | 56 +- + drivers/net/ethernet/wangxun/txgbe/txgbe_type.h | 6 - + drivers/net/ethernet/wiznet/w5100-spi.c | 12 +- + drivers/net/ethernet/wiznet/w5100.c | 10 +- + drivers/net/ethernet/wiznet/w5300.c | 5 +- + drivers/net/ethernet/xilinx/ll_temac_main.c | 5 +- + drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 6 +- + drivers/net/ethernet/xilinx/xilinx_emaclite.c | 8 +- + drivers/net/ethernet/xscale/ixp4xx_eth.c | 74 +- + drivers/net/fjes/fjes_main.c | 2 +- + drivers/net/geneve.c | 207 +- + drivers/net/gtp.c | 4 +- + drivers/net/hamradio/Kconfig | 15 +- + drivers/net/hamradio/baycom_epp.c | 4 +- + drivers/net/hyperv/netvsc.c | 18 +- + drivers/net/ifb.c | 1 + + drivers/net/ipa/ipa_power.c | 2 +- + drivers/net/ipvlan/ipvlan_core.c | 8 +- + drivers/net/ipvlan/ipvlan_main.c | 1 + + drivers/net/macsec.c | 6 +- + drivers/net/macvtap.c | 1 + + drivers/net/mctp/Kconfig | 9 + + drivers/net/mctp/Makefile | 1 + + drivers/net/mctp/mctp-i3c.c | 755 ++++ + drivers/net/mdio/mdio-aspeed.c | 6 +- + drivers/net/mdio/mdio-bcm-iproc.c | 6 +- + drivers/net/mdio/mdio-bcm-unimac.c | 6 +- + drivers/net/mdio/mdio-gpio.c | 6 +- + drivers/net/mdio/mdio-hisi-femac.c | 6 +- + drivers/net/mdio/mdio-ipq4019.c | 6 +- + drivers/net/mdio/mdio-ipq8064.c | 7 +- + drivers/net/mdio/mdio-moxart.c | 6 +- + drivers/net/mdio/mdio-mscc-miim.c | 6 +- + drivers/net/mdio/mdio-mux-bcm-iproc.c | 6 +- + drivers/net/mdio/mdio-mux-bcm6368.c | 6 +- + drivers/net/mdio/mdio-mux-gpio.c | 5 +- + drivers/net/mdio/mdio-mux-meson-g12a.c | 6 +- + drivers/net/mdio/mdio-mux-meson-gxl.c | 6 +- + drivers/net/mdio/mdio-mux-mmioreg.c | 6 +- + drivers/net/mdio/mdio-mux-multiplexer.c | 6 +- + drivers/net/mdio/mdio-octeon.c | 5 +- + drivers/net/mdio/mdio-sun4i.c | 6 +- + drivers/net/mdio/mdio-xgene.c | 27 +- + drivers/net/netconsole.c | 155 +- + drivers/net/netdevsim/bus.c | 12 + + drivers/net/netdevsim/health.c | 118 +- + drivers/net/netdevsim/netdev.c | 1 + + drivers/net/netkit.c | 936 +++++ + drivers/net/pcs/pcs-xpcs.c | 29 + + drivers/net/pcs/pcs-xpcs.h | 2 + + drivers/net/phy/Kconfig | 4 +- + drivers/net/phy/amd.c | 33 +- + drivers/net/phy/ax88796b.c | 2 +- + drivers/net/phy/broadcom.c | 156 +- + drivers/net/phy/dp83867.c | 137 + + drivers/net/phy/micrel.c | 22 + + drivers/net/phy/nxp-tja11xx.c | 6 +- + drivers/net/phy/phy.c | 207 +- + drivers/net/phy/phylink.c | 45 +- + drivers/net/phy/sfp.c | 41 +- + drivers/net/phy/smsc.c | 6 +- + drivers/net/ppp/pppoe.c | 2 +- + drivers/net/sungem_phy.c | 1 + + drivers/net/tap.c | 1 + + drivers/net/usb/lan78xx.c | 2 +- + drivers/net/usb/r8152.c | 85 +- + drivers/net/usb/sr9800.c | 4 +- + drivers/net/veth.c | 25 +- + drivers/net/virtio_net.c | 258 +- + drivers/net/vxlan/vxlan_core.c | 452 ++- + drivers/net/vxlan/vxlan_mdb.c | 190 +- + drivers/net/vxlan/vxlan_private.h | 2 + + drivers/net/wan/ixp4xx_hss.c | 4 +- + drivers/net/wireless/ath/ar5523/ar5523.c | 2 +- + drivers/net/wireless/ath/ath10k/ce.h | 2 +- + drivers/net/wireless/ath/ath10k/debug.c | 49 +- + drivers/net/wireless/ath/ath10k/htt.h | 3 +- + drivers/net/wireless/ath/ath10k/htt_rx.c | 1 - + drivers/net/wireless/ath/ath10k/htt_tx.c | 16 +- + drivers/net/wireless/ath/ath10k/mac.c | 26 +- + drivers/net/wireless/ath/ath10k/pci.c | 2 +- + drivers/net/wireless/ath/ath10k/snoc.c | 18 +- + drivers/net/wireless/ath/ath10k/spectral.c | 26 +- + drivers/net/wireless/ath/ath11k/Makefile | 3 +- + drivers/net/wireless/ath/ath11k/ahb.c | 10 +- + drivers/net/wireless/ath/ath11k/core.c | 127 +- + drivers/net/wireless/ath/ath11k/core.h | 23 +- + drivers/net/wireless/ath/ath11k/debugfs.c | 8 +- + drivers/net/wireless/ath/ath11k/debugfs_sta.c | 30 +- + drivers/net/wireless/ath/ath11k/dp.c | 2 +- + drivers/net/wireless/ath/ath11k/dp_rx.c | 39 +- + drivers/net/wireless/ath/ath11k/dp_tx.c | 4 +- + drivers/net/wireless/ath/ath11k/fw.c | 168 + + drivers/net/wireless/ath/ath11k/fw.h | 27 + + drivers/net/wireless/ath/ath11k/hal.c | 8 +- + drivers/net/wireless/ath/ath11k/hal_rx.c | 31 +- + drivers/net/wireless/ath/ath11k/hal_rx.h | 18 +- + drivers/net/wireless/ath/ath11k/hal_tx.c | 2 +- + drivers/net/wireless/ath/ath11k/hif.h | 54 +- + drivers/net/wireless/ath/ath11k/htc.h | 12 - + drivers/net/wireless/ath/ath11k/mac.c | 116 +- + drivers/net/wireless/ath/ath11k/mhi.c | 19 +- + drivers/net/wireless/ath/ath11k/pci.c | 24 +- + drivers/net/wireless/ath/ath11k/pcic.c | 6 +- + drivers/net/wireless/ath/ath11k/peer.c | 2 +- + drivers/net/wireless/ath/ath11k/qmi.c | 54 +- + drivers/net/wireless/ath/ath11k/reg.c | 11 + + drivers/net/wireless/ath/ath11k/reg.h | 3 + + drivers/net/wireless/ath/ath11k/spectral.c | 28 +- + drivers/net/wireless/ath/ath11k/thermal.c | 22 +- + drivers/net/wireless/ath/ath11k/thermal.h | 8 +- + drivers/net/wireless/ath/ath11k/wmi.c | 70 +- + drivers/net/wireless/ath/ath12k/core.c | 137 +- + drivers/net/wireless/ath/ath12k/core.h | 31 +- + drivers/net/wireless/ath/ath12k/debug.c | 2 +- + drivers/net/wireless/ath/ath12k/dp.c | 1 + + drivers/net/wireless/ath/ath12k/dp_mon.c | 16 +- + drivers/net/wireless/ath/ath12k/dp_rx.c | 55 +- + drivers/net/wireless/ath/ath12k/dp_tx.c | 16 +- + drivers/net/wireless/ath/ath12k/hal.c | 12 +- + drivers/net/wireless/ath/ath12k/hal_rx.c | 2 - + drivers/net/wireless/ath/ath12k/hif.h | 18 +- + drivers/net/wireless/ath/ath12k/hw.c | 24 +- + drivers/net/wireless/ath/ath12k/hw.h | 6 + + drivers/net/wireless/ath/ath12k/mac.c | 311 +- + drivers/net/wireless/ath/ath12k/mac.h | 2 + + drivers/net/wireless/ath/ath12k/mhi.c | 12 +- + drivers/net/wireless/ath/ath12k/pci.c | 4 +- + drivers/net/wireless/ath/ath12k/peer.h | 3 + + drivers/net/wireless/ath/ath12k/qmi.c | 12 + + drivers/net/wireless/ath/ath12k/qmi.h | 1 + + drivers/net/wireless/ath/ath12k/reg.c | 14 + + drivers/net/wireless/ath/ath12k/reg.h | 6 + + drivers/net/wireless/ath/ath12k/rx_desc.h | 91 +- + drivers/net/wireless/ath/ath12k/wmi.c | 131 +- + drivers/net/wireless/ath/ath12k/wmi.h | 28 + + drivers/net/wireless/ath/ath5k/base.c | 6 +- + drivers/net/wireless/ath/ath5k/led.c | 3 +- + drivers/net/wireless/ath/ath5k/pci.c | 4 +- + drivers/net/wireless/ath/ath6kl/cfg80211.c | 8 +- + drivers/net/wireless/ath/ath6kl/init.c | 2 +- + drivers/net/wireless/ath/ath6kl/main.c | 4 +- + drivers/net/wireless/ath/ath6kl/txrx.c | 2 +- + drivers/net/wireless/ath/ath9k/ar9003_phy.c | 11 +- + drivers/net/wireless/ath/ath9k/debug.c | 2 +- + drivers/net/wireless/ath/ath9k/hif_usb.c | 34 +- + drivers/net/wireless/ath/ath9k/hif_usb.h | 2 +- + drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 2 +- + drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 2 +- + drivers/net/wireless/ath/ath9k/xmit.c | 2 +- + drivers/net/wireless/ath/carl9170/usb.c | 10 +- + drivers/net/wireless/ath/dfs_pattern_detector.c | 21 +- + drivers/net/wireless/ath/wcn36xx/dxe.c | 6 +- + drivers/net/wireless/ath/wcn36xx/smd.c | 20 +- + drivers/net/wireless/ath/wcn36xx/smd.h | 2 +- + drivers/net/wireless/ath/wcn36xx/testmode.c | 2 +- + drivers/net/wireless/ath/wil6210/cfg80211.c | 3 +- + drivers/net/wireless/ath/wil6210/wmi.c | 2 - + drivers/net/wireless/atmel/atmel.c | 72 - + drivers/net/wireless/broadcom/b43/dma.c | 4 +- + drivers/net/wireless/broadcom/b43/pio.c | 2 +- + .../broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +- + .../broadcom/brcm80211/brcmfmac/firmware.c | 6 +- + .../broadcom/brcm80211/brcmfmac/firmware.h | 2 +- + .../wireless/broadcom/brcm80211/brcmfmac/fweh.c | 6 +- + .../broadcom/brcm80211/brcmfmac/fwil_types.h | 2 +- + drivers/net/wireless/intel/ipw2x00/ipw2100.c | 20 +- + drivers/net/wireless/intel/ipw2x00/ipw2200.c | 23 +- + drivers/net/wireless/intel/ipw2x00/libipw.h | 2 +- + drivers/net/wireless/intel/iwlegacy/4965-mac.c | 2 +- + drivers/net/wireless/intel/iwlegacy/common.c | 2 +- + drivers/net/wireless/intel/iwlwifi/cfg/ax210.c | 2 +- + drivers/net/wireless/intel/iwlwifi/cfg/bz.c | 16 +- + drivers/net/wireless/intel/iwlwifi/cfg/sc.c | 12 +- + drivers/net/wireless/intel/iwlwifi/dvm/commands.h | 33 +- + drivers/net/wireless/intel/iwlwifi/dvm/dev.h | 14 +- + drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c | 6 +- + drivers/net/wireless/intel/iwlwifi/dvm/main.c | 2 +- + drivers/net/wireless/intel/iwlwifi/dvm/rs.h | 12 +- + drivers/net/wireless/intel/iwlwifi/dvm/tt.h | 9 +- + drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 9 +- + drivers/net/wireless/intel/iwlwifi/fw/acpi.c | 42 +- + drivers/net/wireless/intel/iwlwifi/fw/acpi.h | 8 +- + .../net/wireless/intel/iwlwifi/fw/api/commands.h | 30 + + drivers/net/wireless/intel/iwlwifi/fw/api/d3.h | 46 +- + .../net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h | 38 +- + drivers/net/wireless/intel/iwlwifi/fw/api/debug.h | 22 + + .../net/wireless/intel/iwlwifi/fw/api/mac-cfg.h | 10 +- + .../net/wireless/intel/iwlwifi/fw/api/nvm-reg.h | 68 +- + .../net/wireless/intel/iwlwifi/fw/api/offload.h | 6 +- + .../net/wireless/intel/iwlwifi/fw/api/phy-ctxt.h | 4 +- + drivers/net/wireless/intel/iwlwifi/fw/api/power.h | 7 +- + drivers/net/wireless/intel/iwlwifi/fw/api/rfi.h | 7 +- + drivers/net/wireless/intel/iwlwifi/fw/api/rx.h | 16 +- + drivers/net/wireless/intel/iwlwifi/fw/api/stats.h | 153 +- + .../net/wireless/intel/iwlwifi/fw/api/time-event.h | 78 +- + drivers/net/wireless/intel/iwlwifi/fw/api/txq.h | 4 +- + drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 203 +- + drivers/net/wireless/intel/iwlwifi/fw/dbg.h | 1 + + drivers/net/wireless/intel/iwlwifi/fw/debugfs.c | 14 +- + drivers/net/wireless/intel/iwlwifi/fw/file.h | 32 +- + drivers/net/wireless/intel/iwlwifi/fw/img.h | 4 +- + drivers/net/wireless/intel/iwlwifi/fw/notif-wait.h | 3 +- + drivers/net/wireless/intel/iwlwifi/fw/rs.c | 1 - + drivers/net/wireless/intel/iwlwifi/fw/runtime.h | 4 + + drivers/net/wireless/intel/iwlwifi/fw/uefi.c | 50 + + drivers/net/wireless/intel/iwlwifi/fw/uefi.h | 17 + + drivers/net/wireless/intel/iwlwifi/iwl-config.h | 10 +- + .../wireless/intel/iwlwifi/iwl-context-info-gen3.h | 10 +- + drivers/net/wireless/intel/iwlwifi/iwl-csr.h | 4 +- + drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | 2 + + drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h | 5 +- + drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h | 8 +- + drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 90 +- + drivers/net/wireless/intel/iwlwifi/iwl-drv.h | 2 +- + .../net/wireless/intel/iwlwifi/iwl-eeprom-parse.c | 5 +- + .../net/wireless/intel/iwlwifi/iwl-eeprom-parse.h | 4 +- + drivers/net/wireless/intel/iwlwifi/iwl-fh.h | 13 +- + drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c | 83 +- + drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h | 19 +- + drivers/net/wireless/intel/iwlwifi/iwl-prph.h | 20 +- + drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 24 +- + drivers/net/wireless/intel/iwlwifi/mei/iwl-mei.h | 4 +- + drivers/net/wireless/intel/iwlwifi/mvm/constants.h | 2 + + drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 177 +- + .../net/wireless/intel/iwlwifi/mvm/debugfs-vif.c | 78 +- + drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c | 148 +- + drivers/net/wireless/intel/iwlwifi/mvm/debugfs.h | 1 + + .../net/wireless/intel/iwlwifi/mvm/ftm-responder.c | 9 +- + drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 141 +- + drivers/net/wireless/intel/iwlwifi/mvm/link.c | 30 +- + drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 28 +- + drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 572 +-- + drivers/net/wireless/intel/iwlwifi/mvm/mld-key.c | 16 +- + .../net/wireless/intel/iwlwifi/mvm/mld-mac80211.c | 266 +- + drivers/net/wireless/intel/iwlwifi/mvm/mld-sta.c | 25 +- + drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 176 +- + drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 14 +- + drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 44 +- + drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c | 68 +- + drivers/net/wireless/intel/iwlwifi/mvm/power.c | 5 + + drivers/net/wireless/intel/iwlwifi/mvm/rs.h | 23 +- + drivers/net/wireless/intel/iwlwifi/mvm/rx.c | 157 +- + drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 335 +- + drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 2 +- + drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 39 +- + drivers/net/wireless/intel/iwlwifi/mvm/sta.h | 12 +- + drivers/net/wireless/intel/iwlwifi/mvm/tdls.c | 7 +- + .../net/wireless/intel/iwlwifi/mvm/time-event.c | 200 +- + .../net/wireless/intel/iwlwifi/mvm/time-event.h | 21 +- + drivers/net/wireless/intel/iwlwifi/mvm/tt.c | 7 - + drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 130 +- + drivers/net/wireless/intel/iwlwifi/mvm/utils.c | 61 + + drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 7 +- + drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 59 +- + drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 12 +- + .../net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 6 +- + drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 46 +- + drivers/net/wireless/intel/iwlwifi/queue/tx.c | 9 +- + drivers/net/wireless/intel/iwlwifi/queue/tx.h | 8 +- + drivers/net/wireless/intersil/hostap/hostap.h | 1 - + .../net/wireless/intersil/hostap/hostap_download.c | 3 +- + .../net/wireless/intersil/hostap/hostap_ioctl.c | 228 -- + drivers/net/wireless/intersil/hostap/hostap_main.c | 3 - + drivers/net/wireless/intersil/hostap/hostap_wlan.h | 2 +- + drivers/net/wireless/intersil/p54/p54.h | 2 +- + drivers/net/wireless/legacy/ray_cs.c | 6 +- + drivers/net/wireless/marvell/mwifiex/11h.c | 4 +- + drivers/net/wireless/marvell/mwifiex/cfg80211.c | 3 +- + drivers/net/wireless/marvell/mwifiex/main.h | 4 +- + drivers/net/wireless/marvell/mwifiex/pcie.c | 322 +- + drivers/net/wireless/marvell/mwifiex/sdio.c | 10 - + drivers/net/wireless/marvell/mwifiex/sdio.h | 4 - + drivers/net/wireless/mediatek/mt76/Kconfig | 1 + + drivers/net/wireless/mediatek/mt76/Makefile | 1 + + drivers/net/wireless/mediatek/mt76/debugfs.c | 2 - + drivers/net/wireless/mediatek/mt76/dma.c | 14 +- + drivers/net/wireless/mediatek/mt76/eeprom.c | 7 +- + drivers/net/wireless/mediatek/mt76/mac80211.c | 64 +- + drivers/net/wireless/mediatek/mt76/mt76.h | 36 +- + drivers/net/wireless/mediatek/mt76/mt7603/beacon.c | 80 +- + drivers/net/wireless/mediatek/mt76/mt7603/core.c | 2 + + drivers/net/wireless/mediatek/mt76/mt7603/init.c | 8 + + drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 52 +- + drivers/net/wireless/mediatek/mt76/mt7603/main.c | 4 +- + drivers/net/wireless/mediatek/mt76/mt7603/regs.h | 5 + + drivers/net/wireless/mediatek/mt76/mt7615/init.c | 5 +- + drivers/net/wireless/mediatek/mt76/mt7615/main.c | 4 +- + drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 2 +- + .../net/wireless/mediatek/mt76/mt7615/pci_mac.c | 2 +- + drivers/net/wireless/mediatek/mt76/mt76_connac.h | 6 + + .../net/wireless/mediatek/mt76/mt76_connac3_mac.h | 18 +- + .../net/wireless/mediatek/mt76/mt76_connac_mac.c | 28 +- + .../net/wireless/mediatek/mt76/mt76_connac_mcu.c | 191 +- + .../net/wireless/mediatek/mt76/mt76_connac_mcu.h | 60 +- + .../net/wireless/mediatek/mt76/mt76x02_beacon.c | 8 +- + drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 11 +- + .../net/wireless/mediatek/mt76/mt76x02_usb_core.c | 13 +- + drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 4 +- + drivers/net/wireless/mediatek/mt76/mt7915/init.c | 33 +- + drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 2 +- + drivers/net/wireless/mediatek/mt76/mt7915/main.c | 53 +- + drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 79 +- + drivers/net/wireless/mediatek/mt76/mt7915/mcu.h | 18 +- + drivers/net/wireless/mediatek/mt76/mt7915/mmio.c | 2 +- + drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 4 + + drivers/net/wireless/mediatek/mt76/mt7915/regs.h | 1 + + drivers/net/wireless/mediatek/mt76/mt7915/soc.c | 5 +- + drivers/net/wireless/mediatek/mt76/mt7921/init.c | 57 +- + drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 2 +- + drivers/net/wireless/mediatek/mt76/mt7921/main.c | 78 +- + drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 155 +- + drivers/net/wireless/mediatek/mt76/mt7921/mcu.h | 13 + + drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h | 18 +- + drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 2 + + .../net/wireless/mediatek/mt76/mt7921/pci_mac.c | 2 +- + .../net/wireless/mediatek/mt76/mt7921/sdio_mcu.c | 2 +- + drivers/net/wireless/mediatek/mt76/mt7921/usb.c | 12 +- + drivers/net/wireless/mediatek/mt76/mt7925/Kconfig | 30 + + drivers/net/wireless/mediatek/mt76/mt7925/Makefile | 9 + + .../net/wireless/mediatek/mt76/mt7925/debugfs.c | 319 ++ + drivers/net/wireless/mediatek/mt76/mt7925/init.c | 235 ++ + drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 1452 +++++++ + drivers/net/wireless/mediatek/mt76/mt7925/mac.h | 23 + + drivers/net/wireless/mediatek/mt76/mt7925/main.c | 1454 +++++++ + drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 3174 +++++++++++++++ + drivers/net/wireless/mediatek/mt76/mt7925/mcu.h | 537 +++ + drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h | 309 ++ + drivers/net/wireless/mediatek/mt76/mt7925/pci.c | 586 +++ + .../net/wireless/mediatek/mt76/mt7925/pci_mac.c | 148 + + .../net/wireless/mediatek/mt76/mt7925/pci_mcu.c | 53 + + drivers/net/wireless/mediatek/mt76/mt7925/regs.h | 92 + + drivers/net/wireless/mediatek/mt76/mt7925/usb.c | 332 ++ + drivers/net/wireless/mediatek/mt76/mt792x.h | 38 +- + drivers/net/wireless/mediatek/mt76/mt792x_core.c | 30 +- + drivers/net/wireless/mediatek/mt76/mt792x_dma.c | 49 +- + drivers/net/wireless/mediatek/mt76/mt792x_usb.c | 9 + + drivers/net/wireless/mediatek/mt76/mt7996/init.c | 53 +- + drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 115 +- + drivers/net/wireless/mediatek/mt76/mt7996/main.c | 65 +- + drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 359 +- + drivers/net/wireless/mediatek/mt76/mt7996/mcu.h | 37 +- + drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h | 2 +- + drivers/net/wireless/mediatek/mt76/mt7996/regs.h | 8 + + drivers/net/wireless/mediatek/mt76/tx.c | 108 +- + drivers/net/wireless/mediatek/mt7601u/tx.c | 2 +- + drivers/net/wireless/mediatek/mt7601u/usb.c | 1 + + drivers/net/wireless/microchip/wilc1000/cfg80211.c | 4 +- + drivers/net/wireless/microchip/wilc1000/netdev.c | 20 +- + drivers/net/wireless/microchip/wilc1000/netdev.h | 2 + + drivers/net/wireless/microchip/wilc1000/wlan.c | 2 +- + drivers/net/wireless/purelifi/plfxlc/mac.c | 2 +- + drivers/net/wireless/quantenna/qtnfmac/cfg80211.c | 4 +- + drivers/net/wireless/quantenna/qtnfmac/commands.c | 5 +- + drivers/net/wireless/quantenna/qtnfmac/core.c | 2 +- + drivers/net/wireless/quantenna/qtnfmac/event.c | 4 +- + drivers/net/wireless/ralink/rt2x00/rt2800.h | 18 + + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 310 +- + drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 3 + + drivers/net/wireless/ralink/rt2x00/rt2x00.h | 6 + + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 2 +- + .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 + + drivers/net/wireless/realtek/rtlwifi/base.c | 6 - + drivers/net/wireless/realtek/rtlwifi/core.c | 18 +- + drivers/net/wireless/realtek/rtlwifi/ps.c | 17 +- + .../net/wireless/realtek/rtlwifi/rtl8188ee/dm.c | 2 +- + .../net/wireless/realtek/rtlwifi/rtl8188ee/hw.c | 5 - + .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.c | 8 +- + .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.h | 1 - + .../wireless/realtek/rtlwifi/rtl8192c/dm_common.c | 2 +- + .../net/wireless/realtek/rtlwifi/rtl8192ce/hw.c | 5 - + .../net/wireless/realtek/rtlwifi/rtl8192ce/trx.c | 9 +- + .../net/wireless/realtek/rtlwifi/rtl8192ce/trx.h | 1 - + .../net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | 2 +- + .../net/wireless/realtek/rtlwifi/rtl8192cu/sw.c | 1 - + .../net/wireless/realtek/rtlwifi/rtl8192cu/trx.c | 34 +- + .../net/wireless/realtek/rtlwifi/rtl8192cu/trx.h | 7 +- + .../net/wireless/realtek/rtlwifi/rtl8192de/dm.c | 18 +- + .../net/wireless/realtek/rtlwifi/rtl8192de/fw.c | 2 +- + .../net/wireless/realtek/rtlwifi/rtl8192de/hw.c | 4 - + .../net/wireless/realtek/rtlwifi/rtl8192de/trx.c | 8 +- + .../net/wireless/realtek/rtlwifi/rtl8192de/trx.h | 1 - + .../net/wireless/realtek/rtlwifi/rtl8192ee/dm.c | 7 +- + .../net/wireless/realtek/rtlwifi/rtl8192ee/sw.c | 1 - + .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.c | 16 +- + .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.h | 4 - + .../net/wireless/realtek/rtlwifi/rtl8192se/fw.c | 2 +- + .../net/wireless/realtek/rtlwifi/rtl8192se/trx.c | 2 +- + .../net/wireless/realtek/rtlwifi/rtl8192se/trx.h | 4 +- + .../net/wireless/realtek/rtlwifi/rtl8723ae/dm.c | 2 +- + .../wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c | 16 +- + .../net/wireless/realtek/rtlwifi/rtl8723ae/hw.c | 5 - + .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.c | 8 +- + .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.h | 1 - + .../net/wireless/realtek/rtlwifi/rtl8723be/dm.c | 7 +- + .../net/wireless/realtek/rtlwifi/rtl8723be/hw.c | 6 - + .../net/wireless/realtek/rtlwifi/rtl8723be/trx.c | 1 - + .../net/wireless/realtek/rtlwifi/rtl8723be/trx.h | 1 - + .../net/wireless/realtek/rtlwifi/rtl8821ae/dm.c | 6 +- + .../net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 5 - + .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.c | 5 +- + .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.h | 1 - + drivers/net/wireless/realtek/rtlwifi/wifi.h | 15 +- + drivers/net/wireless/realtek/rtw88/debug.c | 4 +- + drivers/net/wireless/realtek/rtw88/debug.h | 12 + + drivers/net/wireless/realtek/rtw88/fw.c | 74 + + drivers/net/wireless/realtek/rtw88/fw.h | 3 + + drivers/net/wireless/realtek/rtw88/main.h | 10 +- + drivers/net/wireless/realtek/rtw88/ps.c | 2 + + drivers/net/wireless/realtek/rtw88/reg.h | 23 + + drivers/net/wireless/realtek/rtw88/regd.c | 24 +- + drivers/net/wireless/realtek/rtw88/regd.h | 2 + + drivers/net/wireless/realtek/rtw88/rtw8821c.c | 67 + + drivers/net/wireless/realtek/rtw88/rtw8821c.h | 1 + + .../net/wireless/realtek/rtw88/rtw8821c_table.c | 1154 ++++-- + .../net/wireless/realtek/rtw88/rtw8822c_table.c | 1239 +++--- + drivers/net/wireless/realtek/rtw88/rtw8822cu.c | 4 +- + drivers/net/wireless/realtek/rtw88/usb.c | 9 +- + drivers/net/wireless/realtek/rtw89/chan.c | 1576 ++++++- + drivers/net/wireless/realtek/rtw89/chan.h | 34 + + drivers/net/wireless/realtek/rtw89/coex.c | 25 +- + drivers/net/wireless/realtek/rtw89/core.c | 465 ++- + drivers/net/wireless/realtek/rtw89/core.h | 429 +- + drivers/net/wireless/realtek/rtw89/debug.c | 286 +- + drivers/net/wireless/realtek/rtw89/fw.c | 712 +++- + drivers/net/wireless/realtek/rtw89/fw.h | 144 +- + drivers/net/wireless/realtek/rtw89/mac.c | 211 +- + drivers/net/wireless/realtek/rtw89/mac.h | 49 +- + drivers/net/wireless/realtek/rtw89/mac80211.c | 19 +- + drivers/net/wireless/realtek/rtw89/mac_be.c | 397 ++ + drivers/net/wireless/realtek/rtw89/pci.c | 3 +- + drivers/net/wireless/realtek/rtw89/phy.c | 535 ++- + drivers/net/wireless/realtek/rtw89/phy.h | 136 +- + drivers/net/wireless/realtek/rtw89/phy_be.c | 576 +++ + drivers/net/wireless/realtek/rtw89/reg.h | 409 +- + drivers/net/wireless/realtek/rtw89/regd.c | 4 +- + drivers/net/wireless/realtek/rtw89/rtw8851b.c | 29 +- + .../net/wireless/realtek/rtw89/rtw8851b_table.c | 1347 +++--- + .../net/wireless/realtek/rtw89/rtw8851b_table.h | 3 - + drivers/net/wireless/realtek/rtw89/rtw8852a.c | 28 +- + .../net/wireless/realtek/rtw89/rtw8852a_table.c | 2 + + .../net/wireless/realtek/rtw89/rtw8852a_table.h | 1 - + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 37 +- + .../net/wireless/realtek/rtw89/rtw8852b_table.c | 333 +- + .../net/wireless/realtek/rtw89/rtw8852b_table.h | 3 - + drivers/net/wireless/realtek/rtw89/rtw8852c.c | 57 +- + drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c | 107 +- + drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h | 3 + + .../wireless/realtek/rtw89/rtw8852c_rfk_table.c | 42 +- + .../net/wireless/realtek/rtw89/rtw8852c_table.c | 3782 +++++++++++++++-- + .../net/wireless/realtek/rtw89/rtw8852c_table.h | 3 - + drivers/net/wireless/realtek/rtw89/txrx.h | 271 ++ + drivers/net/wireless/realtek/rtw89/wow.c | 4 +- + drivers/net/wireless/silabs/wfx/data_tx.c | 125 +- + drivers/net/wireless/silabs/wfx/data_tx.h | 21 +- + drivers/net/wireless/silabs/wfx/hif_tx.c | 43 + + drivers/net/wireless/silabs/wfx/hif_tx.h | 1 + + drivers/net/wireless/silabs/wfx/main.c | 5 + + drivers/net/wireless/silabs/wfx/queue.c | 38 +- + drivers/net/wireless/silabs/wfx/queue.h | 1 + + drivers/net/wireless/silabs/wfx/scan.c | 66 +- + drivers/net/wireless/silabs/wfx/scan.h | 6 + + drivers/net/wireless/silabs/wfx/sta.c | 41 +- + drivers/net/wireless/silabs/wfx/sta.h | 1 - + drivers/net/wireless/silabs/wfx/wfx.h | 8 +- + drivers/net/wireless/st/cw1200/txrx.c | 4 +- + drivers/net/wireless/ti/wl1251/main.c | 2 +- + drivers/net/wireless/ti/wl1251/tx.c | 6 +- + drivers/net/wireless/ti/wl12xx/main.c | 6 +- + drivers/net/wireless/ti/wl18xx/main.c | 7 +- + drivers/net/wireless/ti/wlcore/boot.c | 5 +- + drivers/net/wireless/ti/wlcore/event.c | 2 +- + drivers/net/wireless/ti/wlcore/main.c | 16 +- + drivers/net/wireless/ti/wlcore/wlcore.h | 2 +- + drivers/net/wireless/virtual/mac80211_hwsim.c | 58 +- + drivers/net/wireless/virtual/mac80211_hwsim.h | 19 +- + drivers/net/wwan/iosm/iosm_ipc_chnl_cfg.h | 2 +- + drivers/net/wwan/iosm/iosm_ipc_imem_ops.h | 4 +- + drivers/net/wwan/iosm/iosm_ipc_mux.h | 2 +- + drivers/net/wwan/iosm/iosm_ipc_pm.h | 2 +- + drivers/net/wwan/iosm/iosm_ipc_port.h | 2 +- + drivers/net/wwan/iosm/iosm_ipc_trace.h | 2 +- + drivers/net/wwan/rpmsg_wwan_ctrl.c | 2 +- + drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c | 2 +- + drivers/net/wwan/t7xx/t7xx_state_monitor.c | 3 +- + drivers/net/wwan/t7xx/t7xx_state_monitor.h | 2 +- + drivers/net/wwan/wwan_core.c | 9 +- + drivers/net/xen-netback/interface.c | 5 +- + drivers/ptp/Kconfig | 1 + + drivers/ptp/ptp_chardev.c | 129 +- + drivers/ptp/ptp_clock.c | 45 +- + drivers/ptp/ptp_ocp.c | 369 +- + drivers/ptp/ptp_private.h | 28 +- + drivers/ptp/ptp_sysfs.c | 15 +- + drivers/s390/net/ctcm_main.c | 4 +- + drivers/s390/net/qeth_core_main.c | 2 +- + drivers/ssb/Kconfig | 3 +- + drivers/ssb/main.c | 2 +- + drivers/staging/qlge/qlge_devlink.c | 60 +- + drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c | 9 +- + drivers/vhost/vsock.c | 21 +- + include/linux/avf/virtchnl.h | 15 +- + include/linux/bpf-cgroup-defs.h | 5 + + include/linux/bpf-cgroup.h | 90 +- + include/linux/bpf.h | 64 +- + include/linux/bpf_mem_alloc.h | 1 + + include/linux/bpf_verifier.h | 44 +- + include/linux/brcmphy.h | 10 + + include/linux/btf.h | 1 + + include/linux/can/dev.h | 4 + + include/linux/ceph/mon_client.h | 2 +- + include/linux/cgroup.h | 12 +- + include/linux/compiler_types.h | 32 +- + include/linux/dpll.h | 170 + + include/linux/dsa/sja1105.h | 2 +- + include/linux/ethtool.h | 19 + + include/linux/filter.h | 67 +- + include/linux/fortify-string.h | 4 - + include/linux/i3c/master.h | 11 + + include/linux/ieee80211.h | 106 +- + include/linux/igmp.h | 2 +- + include/linux/ipv6.h | 50 +- + include/linux/kasan.h | 2 + + include/linux/linkmode.h | 18 +- + include/linux/micrel_phy.h | 4 + + include/linux/mlx5/device.h | 1 + + include/linux/mlx5/driver.h | 18 +- + include/linux/mlx5/fs.h | 1 + + include/linux/mlx5/mlx5_ifc.h | 60 +- + include/linux/mm_types.h | 13 +- + include/linux/netdevice.h | 100 +- + include/linux/netfilter.h | 10 + + include/linux/overflow.h | 35 + + include/linux/pci_ids.h | 2 + + include/linux/pds/pds_core_if.h | 1 + + include/linux/percpu.h | 1 + + include/linux/phy.h | 1 + + include/linux/phylink.h | 56 +- + include/linux/posix-clock.h | 35 +- + include/linux/soc/mediatek/mtk_wed.h | 76 +- + include/linux/socket.h | 1 + + include/linux/sockptr.h | 23 + + include/linux/stmmac.h | 2 +- + include/linux/tcp.h | 61 +- + include/linux/trace_events.h | 6 +- + include/linux/udp.h | 66 +- + include/linux/virtio_vsock.h | 10 + + include/net/Space.h | 1 - + include/net/af_vsock.h | 7 + + include/net/bluetooth/bluetooth.h | 2 +- + include/net/bluetooth/hci.h | 3 + + include/net/bluetooth/hci_core.h | 74 +- + include/net/bluetooth/hci_sync.h | 2 + + include/net/cfg80211.h | 257 +- + include/net/devlink.h | 61 +- + include/net/dropreason-core.h | 33 + + include/net/dsa.h | 69 +- + include/net/dsa_stubs.h | 22 +- + include/net/dst.h | 11 +- + include/net/flow_offload.h | 2 +- + include/net/ieee80211_radiotap.h | 6 + + include/net/if_inet6.h | 2 +- + include/net/inet_connection_sock.h | 22 +- + include/net/inet_sock.h | 11 +- + include/net/inet_timewait_sock.h | 3 +- + include/net/ip.h | 15 +- + include/net/ip6_route.h | 19 +- + include/net/ip_fib.h | 2 +- + include/net/ipv6.h | 42 +- + include/net/ipv6_stubs.h | 5 + + include/net/mac80211.h | 134 +- + include/net/mana/hw_channel.h | 2 +- + include/net/mana/mana.h | 2 +- + include/net/net_namespace.h | 15 +- + include/net/netfilter/nf_conntrack.h | 14 +- + include/net/netfilter/nf_conntrack_labels.h | 2 +- + include/net/netfilter/nf_tables.h | 67 +- + include/net/netkit.h | 38 + + include/net/netlink.h | 73 +- + include/net/netns/conntrack.h | 2 +- + include/net/netns/ipv4.h | 3 + + include/net/nexthop.h | 8 +- + include/net/page_pool/helpers.h | 226 +- + include/net/page_pool/types.h | 6 +- + include/net/pkt_cls.h | 6 + + include/net/pkt_sched.h | 8 +- + include/net/regulatory.h | 1 + + include/net/route.h | 10 +- + include/net/sch_generic.h | 4 +- + include/net/sock.h | 41 +- + include/net/tc_act/tc_ct.h | 1 + + include/net/tcp.h | 371 +- + include/net/tcp_ao.h | 362 ++ + include/net/tcx.h | 7 +- + include/net/tls.h | 21 +- + include/net/udp_tunnel.h | 30 +- + include/net/udplite.h | 14 +- + include/net/xdp.h | 19 +- + include/net/xdp_sock.h | 18 + + include/net/xfrm.h | 2 +- + include/trace/events/mptcp.h | 2 +- + .../trace/events/vsock_virtio_transport_common.h | 12 +- + include/uapi/linux/bpf.h | 52 +- + include/uapi/linux/devlink.h | 3 +- + include/uapi/linux/dpll.h | 207 + + include/uapi/linux/if_bridge.h | 18 + + include/uapi/linux/if_link.h | 32 +- + include/uapi/linux/mptcp.h | 172 +- + include/uapi/linux/mptcp_pm.h | 150 + + include/uapi/linux/netdev.h | 16 + + include/uapi/linux/netlink.h | 5 + + include/uapi/linux/nl80211.h | 43 +- + include/uapi/linux/pkt_sched.h | 15 +- + include/uapi/linux/ptp_clock.h | 2 + + include/uapi/linux/rtnetlink.h | 16 +- + include/uapi/linux/snmp.h | 8 +- + include/uapi/linux/tcp.h | 118 + + include/uapi/linux/vm_sockets.h | 17 + + kernel/bpf/bpf_iter.c | 2 - + kernel/bpf/bpf_struct_ops.c | 26 +- + kernel/bpf/btf.c | 35 +- + kernel/bpf/cgroup.c | 28 +- + kernel/bpf/cgroup_iter.c | 65 + + kernel/bpf/core.c | 37 +- + kernel/bpf/cpumap.c | 10 + + kernel/bpf/devmap.c | 10 + + kernel/bpf/hashtab.c | 7 +- + kernel/bpf/helpers.c | 113 +- + kernel/bpf/memalloc.c | 72 +- + kernel/bpf/offload.c | 18 +- + kernel/bpf/ringbuf.c | 3 +- + kernel/bpf/stackmap.c | 2 +- + kernel/bpf/syscall.c | 71 +- + kernel/bpf/task_iter.c | 282 +- + kernel/bpf/tcx.c | 4 +- + kernel/bpf/trampoline.c | 4 +- + kernel/bpf/verifier.c | 1293 +++++- + kernel/cgroup/cgroup.c | 18 +- + kernel/time/posix-clock.c | 36 +- + kernel/trace/bpf_trace.c | 10 +- + kernel/trace/trace_kprobe.c | 14 +- + kernel/trace/trace_syscalls.c | 4 +- + lib/nlattr.c | 22 + + lib/test_bpf.c | 371 ++ + mm/kasan/kasan.h | 1 - + mm/percpu.c | 35 +- + net/802/fddi.c | 1 + + net/802/garp.c | 1 + + net/802/mrp.c | 1 + + net/802/p8022.c | 1 + + net/802/psnap.c | 1 + + net/802/stp.c | 1 + + net/8021q/vlan.c | 1 + + net/Kconfig | 11 +- + net/appletalk/Kconfig | 30 + + net/appletalk/aarp.c | 2 +- + net/appletalk/ddp.c | 36 - + net/atm/atm_sysfs.c | 2 - + net/ax25/af_ax25.c | 2 +- + net/bluetooth/amp.c | 3 +- + net/bluetooth/hci_conn.c | 123 +- + net/bluetooth/hci_core.c | 3 + + net/bluetooth/hci_event.c | 92 +- + net/bluetooth/hci_sync.c | 36 +- + net/bluetooth/hci_sysfs.c | 23 +- + net/bluetooth/iso.c | 38 +- + net/bluetooth/l2cap_sock.c | 2 +- + net/bluetooth/msft.c | 20 +- + net/bridge/br.c | 1 + + net/bridge/br_device.c | 3 +- + net/bridge/br_fdb.c | 71 +- + net/bridge/br_input.c | 2 +- + net/bridge/br_mdb.c | 184 +- + net/bridge/br_multicast.c | 5 +- + net/bridge/br_netfilter_hooks.c | 98 +- + net/bridge/br_netfilter_ipv6.c | 6 +- + net/bridge/br_netlink.c | 17 +- + net/bridge/br_private.h | 26 +- + net/can/j1939/socket.c | 2 +- + net/can/raw.c | 5 +- + net/ceph/mon_client.c | 2 +- + net/core/Makefile | 1 + + net/core/dev.c | 182 +- + net/core/dev.h | 6 + + net/core/dev_addr_lists_test.c | 1 + + net/core/dev_ioctl.c | 2 +- + net/core/dst.c | 10 +- + net/core/filter.c | 83 +- + net/core/gso_test.c | 278 ++ + net/core/netclassid_cgroup.c | 6 + + net/core/netdev-genl.c | 12 +- + net/core/page_pool.c | 31 +- + net/core/pktgen.c | 102 +- + net/core/rtnetlink.c | 152 +- + net/core/selftests.c | 10 +- + net/core/skbuff.c | 27 +- + net/core/sock.c | 228 +- + net/core/xdp.c | 4 +- + net/dccp/ipv4.c | 2 +- + net/dccp/ipv6.c | 10 +- + net/dccp/timer.c | 4 +- + net/devlink/core.c | 223 +- + net/devlink/dev.c | 60 +- + net/devlink/devl_internal.h | 98 +- + net/devlink/dpipe.c | 14 +- + net/devlink/health.c | 411 +- + net/devlink/linecard.c | 83 +- + net/devlink/netlink.c | 358 +- + net/devlink/netlink_gen.c | 757 +++- + net/devlink/netlink_gen.h | 64 +- + net/devlink/param.c | 14 +- + net/devlink/port.c | 66 +- + net/devlink/rate.c | 6 +- + net/devlink/region.c | 8 +- + net/devlink/resource.c | 4 +- + net/devlink/sb.c | 17 +- + net/devlink/trap.c | 9 +- + net/dsa/Makefile | 6 +- + net/dsa/{master.c => conduit.c} | 118 +- + net/dsa/conduit.h | 22 + + net/dsa/dsa.c | 246 +- + net/dsa/dsa.h | 12 +- + net/dsa/master.h | 22 - + net/dsa/netlink.c | 22 +- + net/dsa/port.c | 144 +- + net/dsa/port.h | 7 +- + net/dsa/slave.h | 69 - + net/dsa/switch.c | 20 +- + net/dsa/switch.h | 8 +- + net/dsa/tag.c | 10 +- + net/dsa/tag.h | 26 +- + net/dsa/tag_8021q.c | 22 +- + net/dsa/tag_8021q.h | 2 +- + net/dsa/tag_ar9331.c | 4 +- + net/dsa/tag_brcm.c | 14 +- + net/dsa/tag_dsa.c | 6 +- + net/dsa/tag_gswip.c | 4 +- + net/dsa/tag_hellcreek.c | 4 +- + net/dsa/tag_ksz.c | 20 +- + net/dsa/tag_lan9303.c | 4 +- + net/dsa/tag_mtk.c | 4 +- + net/dsa/tag_none.c | 6 +- + net/dsa/tag_ocelot.c | 22 +- + net/dsa/tag_ocelot_8021q.c | 12 +- + net/dsa/tag_qca.c | 6 +- + net/dsa/tag_rtl4_a.c | 6 +- + net/dsa/tag_rtl8_4.c | 6 +- + net/dsa/tag_rzn1_a5psw.c | 4 +- + net/dsa/tag_sja1105.c | 30 +- + net/dsa/tag_trailer.c | 4 +- + net/dsa/tag_xrs700x.c | 4 +- + net/dsa/{slave.c => user.c} | 1469 +++---- + net/dsa/user.h | 69 + + net/ethtool/common.c | 21 + + net/handshake/genl.c | 2 +- + net/handshake/netlink.c | 2 +- + net/handshake/tlshd.c | 6 +- + net/ipv4/Kconfig | 17 + + net/ipv4/Makefile | 2 + + net/ipv4/af_inet.c | 9 +- + net/ipv4/datagram.c | 6 +- + net/ipv4/igmp.c | 2 - + net/ipv4/inet_diag.c | 4 +- + net/ipv4/ip_forward.c | 4 +- + net/ipv4/ip_output.c | 17 +- + net/ipv4/ip_sockglue.c | 189 +- + net/ipv4/netfilter/iptable_mangle.c | 9 +- + net/ipv4/ping.c | 15 +- + net/ipv4/proc.c | 8 +- + net/ipv4/raw.c | 19 +- + net/ipv4/route.c | 54 +- + net/ipv4/syncookies.c | 36 +- + net/ipv4/sysctl_net_ipv4.c | 17 + + net/ipv4/tcp.c | 276 +- + net/ipv4/tcp_ao.c | 2392 +++++++++++ + net/ipv4/tcp_bbr.c | 13 +- + net/ipv4/tcp_input.c | 209 +- + net/ipv4/tcp_ipv4.c | 384 +- + net/ipv4/tcp_lp.c | 2 +- + net/ipv4/tcp_metrics.c | 22 +- + net/ipv4/tcp_minisocks.c | 69 +- + net/ipv4/tcp_output.c | 316 +- + net/ipv4/tcp_sigpool.c | 358 ++ + net/ipv4/tcp_timer.c | 63 +- + net/ipv4/udp.c | 101 +- + net/ipv4/udp_offload.c | 4 +- + net/ipv4/udp_tunnel_core.c | 51 +- + net/ipv4/udp_tunnel_nic.c | 11 +- + net/ipv4/udplite.c | 1 - + net/ipv4/xfrm4_input.c | 4 +- + net/ipv6/Makefile | 1 + + net/ipv6/addrconf.c | 57 +- + net/ipv6/af_inet6.c | 19 +- + net/ipv6/datagram.c | 15 +- + net/ipv6/icmp.c | 4 +- + net/ipv6/inet6_connection_sock.c | 2 +- + net/ipv6/ioam6_iptunnel.c | 2 +- + net/ipv6/ip6_flowlabel.c | 8 +- + net/ipv6/ip6_output.c | 171 +- + net/ipv6/ip6_udp_tunnel.c | 75 +- + net/ipv6/ipv6_sockglue.c | 242 +- + net/ipv6/mcast.c | 11 +- + net/ipv6/ndisc.c | 6 +- + net/ipv6/netfilter/ip6table_mangle.c | 9 +- + net/ipv6/ping.c | 6 +- + net/ipv6/proc.c | 3 +- + net/ipv6/raw.c | 18 +- + net/ipv6/route.c | 6 +- + net/ipv6/syncookies.c | 5 + + net/ipv6/tcp_ao.c | 168 + + net/ipv6/tcp_ipv6.c | 409 +- + net/ipv6/udp.c | 52 +- + net/ipv6/udplite.c | 1 - + net/ipv6/xfrm6_input.c | 4 +- + net/ipv6/xfrm6_output.c | 2 +- + net/l2tp/l2tp_core.c | 6 +- + net/l2tp/l2tp_eth.c | 34 +- + net/l2tp/l2tp_ip6.c | 6 +- + net/mac80211/Kconfig | 11 + + net/mac80211/Makefile | 2 + + net/mac80211/agg-rx.c | 63 +- + net/mac80211/agg-tx.c | 63 +- + net/mac80211/airtime.c | 10 +- + net/mac80211/cfg.c | 496 +-- + net/mac80211/chan.c | 156 +- + net/mac80211/debugfs.c | 11 +- + net/mac80211/debugfs_key.c | 20 +- + net/mac80211/debugfs_netdev.c | 161 +- + net/mac80211/debugfs_netdev.h | 15 +- + net/mac80211/debugfs_sta.c | 4 +- + net/mac80211/driver-ops.c | 54 +- + net/mac80211/driver-ops.h | 159 +- + net/mac80211/drop.h | 49 +- + net/mac80211/ethtool.c | 20 +- + net/mac80211/ht.c | 60 +- + net/mac80211/ibss.c | 104 +- + net/mac80211/ieee80211_i.h | 223 +- + net/mac80211/iface.c | 180 +- + net/mac80211/key.c | 149 +- + net/mac80211/key.h | 11 +- + net/mac80211/link.c | 63 +- + net/mac80211/main.c | 93 +- + net/mac80211/mesh.c | 24 +- + net/mac80211/mesh_hwmp.c | 2 + + net/mac80211/mesh_pathtbl.c | 22 +- + net/mac80211/mesh_plink.c | 6 +- + net/mac80211/mesh_ps.c | 6 +- + net/mac80211/mesh_sync.c | 4 +- + net/mac80211/mlme.c | 709 ++-- + net/mac80211/ocb.c | 19 +- + net/mac80211/offchannel.c | 120 +- + net/mac80211/pm.c | 13 +- + net/mac80211/rc80211_minstrel_ht.c | 7 +- + net/mac80211/rx.c | 113 +- + net/mac80211/s1g.c | 15 +- + net/mac80211/scan.c | 226 +- + net/mac80211/spectmgmt.c | 13 +- + net/mac80211/sta_info.c | 171 +- + net/mac80211/sta_info.h | 26 +- + net/mac80211/status.c | 111 +- + net/mac80211/tdls.c | 88 +- + net/mac80211/tests/Makefile | 3 + + net/mac80211/tests/elems.c | 101 + + net/mac80211/tests/module.c | 10 + + net/mac80211/trace.h | 11 +- + net/mac80211/tx.c | 73 +- + net/mac80211/util.c | 263 +- + net/mac80211/wep.c | 9 +- + net/mac80211/wpa.c | 42 +- + net/mptcp/Makefile | 3 +- + net/mptcp/ctrl.c | 16 + + net/mptcp/fastopen.c | 1 + + net/mptcp/mptcp_pm_gen.c | 179 + + net/mptcp/mptcp_pm_gen.h | 58 + + net/mptcp/pm.c | 2 +- + net/mptcp/pm_netlink.c | 114 +- + net/mptcp/pm_userspace.c | 89 +- + net/mptcp/protocol.c | 75 +- + net/mptcp/protocol.h | 92 +- + net/mptcp/sockopt.c | 83 +- + net/mptcp/subflow.c | 46 +- + net/netfilter/core.c | 6 +- + net/netfilter/ipvs/ip_vs_sync.c | 16 +- + net/netfilter/nf_conntrack_core.c | 76 +- + net/netfilter/nf_conntrack_helper.c | 7 +- + net/netfilter/nf_conntrack_labels.c | 17 +- + net/netfilter/nf_conntrack_proto_tcp.c | 7 +- + net/netfilter/nf_nat_proto.c | 69 +- + net/netfilter/nf_synproxy_core.c | 2 +- + net/netfilter/nf_tables_api.c | 578 +-- + net/netfilter/nf_tables_core.c | 8 +- + net/netfilter/nf_tables_trace.c | 8 +- + net/netfilter/nfnetlink_queue.c | 15 +- + net/netfilter/nft_dynset.c | 23 +- + net/netfilter/nft_set_bitmap.c | 53 +- + net/netfilter/nft_set_hash.c | 109 +- + net/netfilter/nft_set_pipapo.c | 80 +- + net/netfilter/nft_set_pipapo.h | 4 +- + net/netfilter/nft_set_rbtree.c | 200 +- + net/netlink/genetlink.c | 3 +- + net/netlink/policy.c | 29 +- + net/netrom/af_netrom.c | 2 +- + net/openvswitch/actions.c | 27 +- + net/openvswitch/flow_table.c | 7 +- + net/openvswitch/flow_table.h | 2 +- + net/openvswitch/meter.h | 4 +- + net/packet/internal.h | 2 +- + net/rose/af_rose.c | 2 +- + net/sched/act_ct.c | 41 +- + net/sched/cls_api.c | 26 +- + net/sched/cls_route.c | 37 +- + net/sched/em_meta.c | 2 +- + net/sched/sch_fq.c | 391 +- + net/sched/sch_fq_pie.c | 2 +- + net/sched/sch_frag.c | 4 +- + net/sched/sch_generic.c | 9 +- + net/sched/sch_netem.c | 2 +- + net/sched/sch_qfq.c | 4 +- + net/sched/sch_taprio.c | 2 +- + net/sctp/ipv6.c | 9 +- + net/sctp/protocol.c | 4 +- + net/sctp/sm_make_chunk.c | 2 +- + net/smc/af_smc.c | 2 +- + net/tipc/link.c | 4 +- + net/tls/tls.h | 11 +- + net/tls/tls_device.c | 101 +- + net/tls/tls_device_fallback.c | 23 +- + net/tls/tls_main.c | 62 +- + net/tls/tls_sw.c | 198 +- + net/unix/af_unix.c | 58 +- + net/vmw_vsock/af_vsock.c | 66 +- + net/vmw_vsock/virtio_transport.c | 97 +- + net/vmw_vsock/virtio_transport_common.c | 305 +- + net/vmw_vsock/vsock_loopback.c | 6 + + net/wireless/Kconfig | 11 + + net/wireless/Makefile | 1 + + net/wireless/ap.c | 24 +- + net/wireless/chan.c | 55 +- + net/wireless/core.c | 72 +- + net/wireless/core.h | 64 +- + net/wireless/ibss.c | 76 +- + net/wireless/lib80211_crypt_tkip.c | 12 +- + net/wireless/mesh.c | 28 +- + net/wireless/mlme.c | 23 +- + net/wireless/nl80211.c | 544 +-- + net/wireless/nl80211.h | 7 +- + net/wireless/ocb.c | 43 +- + net/wireless/pmsr.c | 4 +- + net/wireless/rdev-ops.h | 2 +- + net/wireless/reg.c | 99 +- + net/wireless/reg.h | 16 +- + net/wireless/scan.c | 111 +- + net/wireless/sme.c | 82 +- + net/wireless/sysfs.c | 4 +- + net/wireless/tests/Makefile | 3 + + net/wireless/tests/fragmentation.c | 157 + + net/wireless/tests/module.c | 10 + + net/wireless/trace.h | 80 +- + net/wireless/util.c | 60 +- + net/wireless/wext-compat.c | 47 +- + net/wireless/wext-sme.c | 59 +- + net/x25/af_x25.c | 2 +- + net/xdp/xsk.c | 32 +- + net/xdp/xsk_buff_pool.c | 3 + + net/xfrm/xfrm_policy.c | 2 +- + samples/bpf/Makefile | 19 +- + samples/bpf/syscall_tp_kern.c | 15 +- + samples/bpf/syscall_tp_user.c | 45 +- + tools/bpf/bpftool/Documentation/bpftool-cgroup.rst | 16 +- + tools/bpf/bpftool/Documentation/bpftool-net.rst | 8 +- + tools/bpf/bpftool/Documentation/bpftool-prog.rst | 8 +- + tools/bpf/bpftool/bash-completion/bpftool | 14 +- + tools/bpf/bpftool/btf_dumper.c | 2 +- + tools/bpf/bpftool/cgroup.c | 16 +- + tools/bpf/bpftool/gen.c | 58 +- + tools/bpf/bpftool/link.c | 15 + + tools/bpf/bpftool/net.c | 7 +- + tools/bpf/bpftool/prog.c | 7 +- + tools/bpf/bpftool/struct_ops.c | 6 + + tools/include/uapi/linux/bpf.h | 52 +- + tools/include/uapi/linux/if_link.h | 141 + + tools/include/uapi/linux/netdev.h | 16 + + tools/lib/bpf/bpf.c | 16 + + tools/lib/bpf/bpf.h | 5 + + tools/lib/bpf/bpf_helpers.h | 1 + + tools/lib/bpf/bpf_tracing.h | 2 - + tools/lib/bpf/btf.c | 160 + + tools/lib/bpf/elf.c | 143 +- + tools/lib/bpf/libbpf.c | 237 +- + tools/lib/bpf/libbpf.h | 88 + + tools/lib/bpf/libbpf.map | 8 + + tools/lib/bpf/ringbuf.c | 85 +- + tools/net/ynl/Makefile | 1 - + tools/net/ynl/cli.py | 3 +- + tools/net/ynl/generated/Makefile | 6 +- + tools/net/ynl/generated/devlink-user.c | 3861 +++++++++++++++++- + tools/net/ynl/generated/devlink-user.h | 3301 ++++++++++++++- + tools/net/ynl/generated/ethtool-user.h | 82 +- + tools/net/ynl/generated/fou-user.h | 2 +- + tools/net/ynl/generated/handshake-user.h | 12 +- + tools/net/ynl/generated/netdev-user.c | 19 + + tools/net/ynl/generated/netdev-user.h | 7 +- + tools/net/ynl/lib/nlspec.py | 6 + + tools/net/ynl/lib/ynl.c | 12 + + tools/net/ynl/lib/ynl.h | 22 +- + tools/net/ynl/lib/ynl.py | 77 +- + tools/net/ynl/samples/Makefile | 3 + + tools/net/ynl/samples/netdev.c | 8 +- + tools/net/ynl/ynl-gen-c.py | 287 +- + tools/testing/selftests/bpf/DENYLIST.aarch64 | 2 + + tools/testing/selftests/bpf/DENYLIST.s390x | 26 +- + tools/testing/selftests/bpf/Makefile | 56 +- + tools/testing/selftests/bpf/bpf_experimental.h | 346 ++ + tools/testing/selftests/bpf/bpf_kfuncs.h | 14 + + .../selftests/bpf/bpf_testmod/bpf_testmod.c | 5 + + .../selftests/bpf/bpf_testmod/bpf_testmod_kfunc.h | 2 + + tools/testing/selftests/bpf/cgroup_helpers.c | 38 +- + tools/testing/selftests/bpf/config | 2 + + tools/testing/selftests/bpf/liburandom_read.map | 15 + + .../selftests/bpf/map_tests/map_in_map_batch_ops.c | 4 +- + tools/testing/selftests/bpf/netlink_helpers.c | 358 ++ + tools/testing/selftests/bpf/netlink_helpers.h | 46 + + tools/testing/selftests/bpf/network_helpers.c | 34 + + tools/testing/selftests/bpf/network_helpers.h | 1 + + tools/testing/selftests/bpf/prog_tests/align.c | 241 +- + .../selftests/bpf/prog_tests/bloom_filter_map.c | 4 +- + tools/testing/selftests/bpf/prog_tests/bpf_iter.c | 44 +- + tools/testing/selftests/bpf/prog_tests/btf.c | 4 +- + .../selftests/bpf/prog_tests/connect_ping.c | 4 +- + .../testing/selftests/bpf/prog_tests/exceptions.c | 409 ++ + .../testing/selftests/bpf/prog_tests/fib_lookup.c | 83 +- + .../selftests/bpf/prog_tests/fill_link_info.c | 2 +- + tools/testing/selftests/bpf/prog_tests/iters.c | 208 + + .../bpf/prog_tests/kprobe_multi_testmod_test.c | 20 +- + .../testing/selftests/bpf/prog_tests/libbpf_str.c | 6 +- + .../testing/selftests/bpf/prog_tests/linked_list.c | 16 +- + .../testing/selftests/bpf/prog_tests/lwt_helpers.h | 3 +- + tools/testing/selftests/bpf/prog_tests/missed.c | 138 + + .../bpf/prog_tests/module_fentry_shadow.c | 5 + + .../selftests/bpf/prog_tests/percpu_alloc.c | 128 + + .../selftests/bpf/prog_tests/preempted_bpf_ma_op.c | 89 + + .../selftests/bpf/prog_tests/queue_stack_map.c | 2 +- + tools/testing/selftests/bpf/prog_tests/ringbuf.c | 26 + + .../selftests/bpf/prog_tests/ringbuf_multi.c | 15 + + .../selftests/bpf/prog_tests/section_names.c | 45 + + tools/testing/selftests/bpf/prog_tests/sock_addr.c | 612 +++ + .../selftests/bpf/prog_tests/sockmap_basic.c | 8 +- + .../selftests/bpf/prog_tests/sockmap_helpers.h | 2 +- + .../selftests/bpf/prog_tests/sockmap_listen.c | 170 +- + tools/testing/selftests/bpf/prog_tests/tailcalls.c | 269 +- + .../selftests/bpf/prog_tests/task_under_cgroup.c | 11 +- + .../testing/selftests/bpf/prog_tests/tc_helpers.h | 4 + + tools/testing/selftests/bpf/prog_tests/tc_netkit.c | 687 ++++ + tools/testing/selftests/bpf/prog_tests/tc_opts.c | 131 +- + .../testing/selftests/bpf/prog_tests/test_bpf_ma.c | 20 +- + tools/testing/selftests/bpf/prog_tests/timer.c | 4 + + tools/testing/selftests/bpf/prog_tests/uprobe.c | 95 + + .../selftests/bpf/prog_tests/xdp_metadata.c | 2 +- + .../{bpf_iter_task_vma.c => bpf_iter_task_vmas.c} | 0 + .../progs/{bpf_iter_task.c => bpf_iter_tasks.c} | 0 + tools/testing/selftests/bpf/progs/bpf_misc.h | 3 + + .../selftests/bpf/progs/connect_unix_prog.c | 40 + + tools/testing/selftests/bpf/progs/exceptions.c | 368 ++ + .../selftests/bpf/progs/exceptions_assert.c | 135 + + tools/testing/selftests/bpf/progs/exceptions_ext.c | 72 + + .../testing/selftests/bpf/progs/exceptions_fail.c | 347 ++ + .../selftests/bpf/progs/getpeername_unix_prog.c | 39 + + .../selftests/bpf/progs/getsockname_unix_prog.c | 39 + + tools/testing/selftests/bpf/progs/iters.c | 695 ++++ + tools/testing/selftests/bpf/progs/iters_css.c | 72 + + tools/testing/selftests/bpf/progs/iters_css_task.c | 47 + + tools/testing/selftests/bpf/progs/iters_task.c | 41 + + .../selftests/bpf/progs/iters_task_failure.c | 105 + + tools/testing/selftests/bpf/progs/iters_task_vma.c | 44 + + .../testing/selftests/bpf/progs/linked_list_fail.c | 4 +- + tools/testing/selftests/bpf/progs/missed_kprobe.c | 30 + + .../selftests/bpf/progs/missed_kprobe_recursion.c | 48 + + .../selftests/bpf/progs/missed_tp_recursion.c | 41 + + .../selftests/bpf/progs/percpu_alloc_array.c | 190 + + .../bpf/progs/percpu_alloc_cgrp_local_storage.c | 109 + + .../selftests/bpf/progs/percpu_alloc_fail.c | 164 + + .../selftests/bpf/progs/preempted_bpf_ma_op.c | 106 + + tools/testing/selftests/bpf/progs/profiler.inc.h | 2 +- + .../selftests/bpf/progs/recvmsg_unix_prog.c | 39 + + .../selftests/bpf/progs/sendmsg_unix_prog.c | 40 + + .../selftests/bpf/progs/tailcall_bpf2bpf_fentry.c | 18 + + .../selftests/bpf/progs/tailcall_bpf2bpf_fexit.c | 18 + + tools/testing/selftests/bpf/progs/test_bpf_ma.c | 180 +- + tools/testing/selftests/bpf/progs/test_ldsx_insn.c | 9 +- + .../selftests/bpf/progs/test_task_under_cgroup.c | 28 +- + tools/testing/selftests/bpf/progs/test_tc_link.c | 13 + + tools/testing/selftests/bpf/progs/test_uprobe.c | 61 + + tools/testing/selftests/bpf/progs/test_vmlinux.c | 4 +- + tools/testing/selftests/bpf/progs/timer.c | 63 +- + tools/testing/selftests/bpf/progs/verifier_bswap.c | 4 +- + tools/testing/selftests/bpf/progs/verifier_gotol.c | 4 +- + tools/testing/selftests/bpf/progs/verifier_ldsx.c | 152 +- + tools/testing/selftests/bpf/progs/verifier_movsx.c | 4 +- + tools/testing/selftests/bpf/progs/verifier_sdiv.c | 4 +- + .../testing/selftests/bpf/progs/xdp_hw_metadata.c | 2 +- + .../selftests/bpf/progs/xdp_synproxy_kern.c | 4 +- + tools/testing/selftests/bpf/progs/xsk_xdp_progs.c | 22 +- + .../selftests/bpf/test_bpftool_synctypes.py | 9 + + tools/testing/selftests/bpf/test_loader.c | 4 +- + tools/testing/selftests/bpf/test_progs.c | 2 +- + tools/testing/selftests/bpf/test_progs.h | 2 + + tools/testing/selftests/bpf/test_xsk.sh | 40 +- + tools/testing/selftests/bpf/trace_helpers.c | 142 +- + tools/testing/selftests/bpf/trace_helpers.h | 8 +- + tools/testing/selftests/bpf/unpriv_helpers.c | 33 +- + tools/testing/selftests/bpf/urandom_read.c | 15 +- + tools/testing/selftests/bpf/urandom_read_lib1.c | 22 + + tools/testing/selftests/bpf/xdp_features.c | 4 +- + tools/testing/selftests/bpf/xdp_hw_metadata.c | 80 +- + tools/testing/selftests/bpf/xsk.c | 3 +- + tools/testing/selftests/bpf/xsk.h | 2 +- + tools/testing/selftests/bpf/xsk_prereqs.sh | 10 +- + tools/testing/selftests/bpf/xsk_xdp_common.h | 12 + + tools/testing/selftests/bpf/xsk_xdp_metadata.h | 5 - + tools/testing/selftests/bpf/xskxceiver.c | 1024 +++-- + tools/testing/selftests/bpf/xskxceiver.h | 57 +- + .../selftests/drivers/net/netdevsim/devlink.sh | 21 +- + tools/testing/selftests/net/Makefile | 1 + + tools/testing/selftests/net/af_unix/scm_pidfd.c | 1 - + .../testing/selftests/net/af_unix/test_unix_oob.c | 2 - + tools/testing/selftests/net/fdb_flush.sh | 812 ++++ + tools/testing/selftests/net/forwarding/Makefile | 3 +- + .../net/forwarding/bridge_fdb_learning_limit.sh | 283 ++ + .../testing/selftests/net/forwarding/bridge_mdb.sh | 184 +- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 23 +- + tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 1 - + tools/testing/selftests/net/nettest.c | 5 +- + tools/testing/selftests/net/route_localnet.sh | 6 +- + tools/testing/selftests/net/rtnetlink.sh | 985 ++--- + tools/testing/selftests/net/test_vxlan_mdb.sh | 108 +- + tools/testing/selftests/netfilter/Makefile | 2 +- + tools/testing/selftests/netfilter/nf_nat_edemux.sh | 46 +- + tools/testing/selftests/netfilter/xt_string.sh | 128 + + tools/testing/selftests/ptp/ptpchmaskfmt.sh | 14 + + tools/testing/selftests/ptp/testptp.c | 19 +- + tools/testing/selftests/tc-testing/Makefile | 2 +- + tools/testing/selftests/tc-testing/README | 65 +- + tools/testing/selftests/tc-testing/TdcPlugin.py | 4 +- + tools/testing/selftests/tc-testing/TdcResults.py | 3 +- + tools/testing/selftests/tc-testing/config | 9 + + .../selftests/tc-testing/plugin-lib/nsPlugin.py | 194 +- + .../selftests/tc-testing/plugin-lib/rootPlugin.py | 4 +- + .../tc-testing/plugin-lib/valgrindPlugin.py | 5 +- + .../{ => scripts}/taprio_wait_for_admin.sh | 0 + .../tc-testing/tc-tests/actions/connmark.json | 45 + + .../tc-testing/tc-tests/actions/csum.json | 69 + + .../selftests/tc-testing/tc-tests/actions/ct.json | 54 + + .../tc-testing/tc-tests/actions/ctinfo.json | 36 + + .../tc-testing/tc-tests/actions/gact.json | 75 + + .../tc-testing/tc-tests/actions/gate.json | 36 + + .../selftests/tc-testing/tc-tests/actions/ife.json | 144 + + .../tc-testing/tc-tests/actions/mirred.json | 72 + + .../tc-testing/tc-tests/actions/mpls.json | 159 + + .../selftests/tc-testing/tc-tests/actions/nat.json | 81 + + .../tc-testing/tc-tests/actions/pedit.json | 198 + + .../tc-testing/tc-tests/actions/police.json | 102 + + .../tc-testing/tc-tests/actions/sample.json | 87 + + .../tc-testing/tc-tests/actions/simple.json | 27 + + .../tc-testing/tc-tests/actions/skbedit.json | 90 + + .../tc-testing/tc-tests/actions/skbmod.json | 54 + + .../tc-testing/tc-tests/actions/tunnel_key.json | 117 + + .../tc-testing/tc-tests/actions/vlan.json | 108 + + .../selftests/tc-testing/tc-tests/actions/xt.json | 24 + + .../selftests/tc-testing/tc-tests/filters/bpf.json | 10 +- + .../selftests/tc-testing/tc-tests/filters/fw.json | 315 +- + .../tc-testing/tc-tests/filters/matchall.json | 141 +- + .../tc-testing/tc-tests/filters/route.json | 25 + + .../selftests/tc-testing/tc-tests/filters/u32.json | 25 + + .../tc-testing/tc-tests/infra/actions.json | 144 +- + .../tc-testing/tc-tests/infra/filter.json | 9 +- + .../selftests/tc-testing/tc-tests/qdiscs/cake.json | 82 +- + .../selftests/tc-testing/tc-tests/qdiscs/cbs.json | 38 +- + .../tc-testing/tc-tests/qdiscs/choke.json | 30 +- + .../tc-testing/tc-tests/qdiscs/codel.json | 34 +- + .../selftests/tc-testing/tc-tests/qdiscs/drr.json | 10 +- + .../selftests/tc-testing/tc-tests/qdiscs/etf.json | 18 +- + .../selftests/tc-testing/tc-tests/qdiscs/ets.json | 284 +- + .../selftests/tc-testing/tc-tests/qdiscs/fifo.json | 98 +- + .../selftests/tc-testing/tc-tests/qdiscs/fq.json | 68 +- + .../tc-testing/tc-tests/qdiscs/fq_codel.json | 54 +- + .../tc-testing/tc-tests/qdiscs/fq_pie.json | 5 +- + .../selftests/tc-testing/tc-tests/qdiscs/gred.json | 28 +- + .../selftests/tc-testing/tc-tests/qdiscs/hfsc.json | 58 +- + .../selftests/tc-testing/tc-tests/qdiscs/hhf.json | 36 +- + .../selftests/tc-testing/tc-tests/qdiscs/htb.json | 46 +- + .../tc-testing/tc-tests/qdiscs/ingress.json | 36 +- + .../tc-testing/tc-tests/qdiscs/netem.json | 62 +- + .../tc-testing/tc-tests/qdiscs/pfifo_fast.json | 18 +- + .../selftests/tc-testing/tc-tests/qdiscs/plug.json | 30 +- + .../selftests/tc-testing/tc-tests/qdiscs/prio.json | 85 +- + .../selftests/tc-testing/tc-tests/qdiscs/qfq.json | 39 +- + .../selftests/tc-testing/tc-tests/qdiscs/red.json | 34 +- + .../selftests/tc-testing/tc-tests/qdiscs/sfb.json | 48 +- + .../selftests/tc-testing/tc-tests/qdiscs/sfq.json | 40 +- + .../tc-testing/tc-tests/qdiscs/skbprio.json | 16 +- + .../tc-testing/tc-tests/qdiscs/taprio.json | 8 +- + .../selftests/tc-testing/tc-tests/qdiscs/tbf.json | 36 +- + .../selftests/tc-testing/tc-tests/qdiscs/teql.json | 34 +- + tools/testing/selftests/tc-testing/tdc.py | 250 +- + tools/testing/vsock/.gitignore | 1 + + tools/testing/vsock/Makefile | 11 +- + tools/testing/vsock/msg_zerocopy_common.c | 87 + + tools/testing/vsock/msg_zerocopy_common.h | 18 + + tools/testing/vsock/util.c | 311 +- + tools/testing/vsock/util.h | 8 + + tools/testing/vsock/vsock_perf.c | 80 +- + tools/testing/vsock/vsock_test.c | 341 +- + tools/testing/vsock/vsock_test_zerocopy.c | 358 ++ + tools/testing/vsock/vsock_test_zerocopy.h | 15 + + tools/testing/vsock/vsock_uring_test.c | 342 ++ + 1875 files changed, 120521 insertions(+), 33141 deletions(-) + create mode 100644 Documentation/devicetree/bindings/net/loongson,ls1b-gmac.yaml + create mode 100644 Documentation/devicetree/bindings/net/loongson,ls1c-emac.yaml + create mode 100644 Documentation/driver-api/dpll.rst + create mode 100644 Documentation/netlink/specs/dpll.yaml + create mode 100644 Documentation/netlink/specs/mptcp.yaml + delete mode 100644 Documentation/networking/device_drivers/appletalk/cops.rst + delete mode 100644 Documentation/networking/device_drivers/appletalk/index.rst + create mode 100644 Documentation/networking/device_drivers/ethernet/intel/idpf.rst + create mode 100644 Documentation/networking/devlink/i40e.rst + delete mode 100644 Documentation/networking/ipddp.rst + create mode 100644 Documentation/networking/tcp_ao.rst + create mode 100644 drivers/dpll/Kconfig + create mode 100644 drivers/dpll/Makefile + create mode 100644 drivers/dpll/dpll_core.c + create mode 100644 drivers/dpll/dpll_core.h + create mode 100644 drivers/dpll/dpll_netlink.c + create mode 100644 drivers/dpll/dpll_netlink.h + create mode 100644 drivers/dpll/dpll_nl.c + create mode 100644 drivers/dpll/dpll_nl.h + delete mode 100644 drivers/net/appletalk/Kconfig + delete mode 100644 drivers/net/appletalk/Makefile + delete mode 100644 drivers/net/appletalk/cops.c + delete mode 100644 drivers/net/appletalk/cops.h + delete mode 100644 drivers/net/appletalk/cops_ffdrv.h + delete mode 100644 drivers/net/appletalk/cops_ltdrv.h + delete mode 100644 drivers/net/appletalk/ipddp.c + delete mode 100644 drivers/net/appletalk/ipddp.h + create mode 100644 drivers/net/dsa/microchip/ksz9477_acl.c + create mode 100644 drivers/net/dsa/microchip/ksz9477_tc_flower.c + create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c + create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.h + create mode 100644 drivers/net/ethernet/intel/i40e/i40e_debug.h + create mode 100644 drivers/net/ethernet/intel/i40e/i40e_devlink.c + create mode 100644 drivers/net/ethernet/intel/i40e/i40e_devlink.h + create mode 100644 drivers/net/ethernet/intel/i40e/i40e_io.h + delete mode 100644 drivers/net/ethernet/intel/i40e/i40e_osdep.h + delete mode 100644 drivers/net/ethernet/intel/iavf/iavf_client.c + delete mode 100644 drivers/net/ethernet/intel/iavf/iavf_client.h + create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.c + create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.h + create mode 100644 drivers/net/ethernet/intel/idpf/Makefile + create mode 100644 drivers/net/ethernet/intel/idpf/idpf.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_controlq.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_controlq.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_controlq_api.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_controlq_setup.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_dev.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_devids.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_ethtool.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_lan_pf_regs.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_lan_txrx.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_lan_vf_regs.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_lib.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_main.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_mem.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_txrx.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_txrx.h + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_vf_dev.c + create mode 100644 drivers/net/ethernet/intel/idpf/idpf_virtchnl.c + create mode 100644 drivers/net/ethernet/intel/idpf/virtchnl2.h + create mode 100644 drivers/net/ethernet/intel/idpf/virtchnl2_lan_desc.h + create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/dpll.c + create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c + delete mode 100644 drivers/net/ethernet/ti/cpmac.c + create mode 100644 drivers/net/mctp/mctp-i3c.c + create mode 100644 drivers/net/netkit.c + create mode 100644 drivers/net/wireless/ath/ath11k/fw.c + create mode 100644 drivers/net/wireless/ath/ath11k/fw.h + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/Kconfig + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/Makefile + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/debugfs.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/init.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/mac.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/mac.h + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/main.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/mcu.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/mcu.h + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/pci.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/pci_mcu.c + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/regs.h + create mode 100644 drivers/net/wireless/mediatek/mt76/mt7925/usb.c + create mode 100644 include/linux/dpll.h + create mode 100644 include/net/netkit.h + create mode 100644 include/net/tcp_ao.h + create mode 100644 include/uapi/linux/dpll.h + create mode 100644 include/uapi/linux/mptcp_pm.h + create mode 100644 net/appletalk/Kconfig + create mode 100644 net/core/gso_test.c + rename net/dsa/{master.c => conduit.c} (76%) + create mode 100644 net/dsa/conduit.h + delete mode 100644 net/dsa/master.h + delete mode 100644 net/dsa/slave.h + rename net/dsa/{slave.c => user.c} (62%) + create mode 100644 net/dsa/user.h + create mode 100644 net/ipv4/tcp_ao.c + create mode 100644 net/ipv4/tcp_sigpool.c + create mode 100644 net/ipv6/tcp_ao.c + create mode 100644 net/mac80211/tests/Makefile + create mode 100644 net/mac80211/tests/elems.c + create mode 100644 net/mac80211/tests/module.c + create mode 100644 net/mptcp/mptcp_pm_gen.c + create mode 100644 net/mptcp/mptcp_pm_gen.h + create mode 100644 net/wireless/tests/Makefile + create mode 100644 net/wireless/tests/fragmentation.c + create mode 100644 net/wireless/tests/module.c + create mode 100644 tools/testing/selftests/bpf/liburandom_read.map + create mode 100644 tools/testing/selftests/bpf/netlink_helpers.c + create mode 100644 tools/testing/selftests/bpf/netlink_helpers.h + create mode 100644 tools/testing/selftests/bpf/prog_tests/exceptions.c + create mode 100644 tools/testing/selftests/bpf/prog_tests/missed.c + create mode 100644 tools/testing/selftests/bpf/prog_tests/percpu_alloc.c + create mode 100644 tools/testing/selftests/bpf/prog_tests/preempted_bpf_ma_op.c + create mode 100644 tools/testing/selftests/bpf/prog_tests/sock_addr.c + create mode 100644 tools/testing/selftests/bpf/prog_tests/tc_netkit.c + create mode 100644 tools/testing/selftests/bpf/prog_tests/uprobe.c + rename tools/testing/selftests/bpf/progs/{bpf_iter_task_vma.c => bpf_iter_task_vmas.c} (100%) + rename tools/testing/selftests/bpf/progs/{bpf_iter_task.c => bpf_iter_tasks.c} (100%) + create mode 100644 tools/testing/selftests/bpf/progs/connect_unix_prog.c + create mode 100644 tools/testing/selftests/bpf/progs/exceptions.c + create mode 100644 tools/testing/selftests/bpf/progs/exceptions_assert.c + create mode 100644 tools/testing/selftests/bpf/progs/exceptions_ext.c + create mode 100644 tools/testing/selftests/bpf/progs/exceptions_fail.c + create mode 100644 tools/testing/selftests/bpf/progs/getpeername_unix_prog.c + create mode 100644 tools/testing/selftests/bpf/progs/getsockname_unix_prog.c + create mode 100644 tools/testing/selftests/bpf/progs/iters_css.c + create mode 100644 tools/testing/selftests/bpf/progs/iters_css_task.c + create mode 100644 tools/testing/selftests/bpf/progs/iters_task.c + create mode 100644 tools/testing/selftests/bpf/progs/iters_task_failure.c + create mode 100644 tools/testing/selftests/bpf/progs/iters_task_vma.c + create mode 100644 tools/testing/selftests/bpf/progs/missed_kprobe.c + create mode 100644 tools/testing/selftests/bpf/progs/missed_kprobe_recursion.c + create mode 100644 tools/testing/selftests/bpf/progs/missed_tp_recursion.c + create mode 100644 tools/testing/selftests/bpf/progs/percpu_alloc_array.c + create mode 100644 tools/testing/selftests/bpf/progs/percpu_alloc_cgrp_local_storage.c + create mode 100644 tools/testing/selftests/bpf/progs/percpu_alloc_fail.c + create mode 100644 tools/testing/selftests/bpf/progs/preempted_bpf_ma_op.c + create mode 100644 tools/testing/selftests/bpf/progs/recvmsg_unix_prog.c + create mode 100644 tools/testing/selftests/bpf/progs/sendmsg_unix_prog.c + create mode 100644 tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_fentry.c + create mode 100644 tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_fexit.c + create mode 100644 tools/testing/selftests/bpf/progs/test_uprobe.c + create mode 100644 tools/testing/selftests/bpf/xsk_xdp_common.h + delete mode 100644 tools/testing/selftests/bpf/xsk_xdp_metadata.h + create mode 100755 tools/testing/selftests/net/fdb_flush.sh + create mode 100755 tools/testing/selftests/net/forwarding/bridge_fdb_learning_limit.sh + create mode 100755 tools/testing/selftests/netfilter/xt_string.sh + create mode 100644 tools/testing/selftests/ptp/ptpchmaskfmt.sh + rename tools/testing/selftests/tc-testing/{ => scripts}/taprio_wait_for_admin.sh (100%) + create mode 100644 tools/testing/vsock/msg_zerocopy_common.c + create mode 100644 tools/testing/vsock/msg_zerocopy_common.h + create mode 100644 tools/testing/vsock/vsock_test_zerocopy.c + create mode 100644 tools/testing/vsock/vsock_test_zerocopy.h + create mode 100644 tools/testing/vsock/vsock_uring_test.c +Merging bpf-next/for-next (f1c73396133c net: pcs: xpcs: Add 2500BASE-X case in get state for XPCS drivers) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git bpf-next/for-next +Already up to date. +Merging ipsec-next/master (eefed7662ff2 xfrm: policy: fix layer 4 flowi decoding) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next.git ipsec-next/master +Auto-merging include/net/ipv6_stubs.h +Auto-merging net/ipv4/udp.c +Auto-merging net/ipv6/af_inet6.c +Auto-merging net/netfilter/nf_nat_proto.c +Auto-merging net/xfrm/xfrm_interface_core.c +Auto-merging net/xfrm/xfrm_policy.c +Merge made by the 'ort' strategy. + include/net/gro.h | 2 +- + include/net/ipv6_stubs.h | 3 + + include/net/xfrm.h | 18 +-- + include/uapi/linux/xfrm.h | 3 +- + net/ipv4/esp4_offload.c | 6 +- + net/ipv4/icmp.c | 2 +- + net/ipv4/ip_vti.c | 4 +- + net/ipv4/netfilter.c | 2 +- + net/ipv4/udp.c | 16 +++ + net/ipv4/xfrm4_input.c | 95 ++++++++++--- + net/ipv6/af_inet6.c | 1 + + net/ipv6/esp6_offload.c | 10 +- + net/ipv6/icmp.c | 2 +- + net/ipv6/ip6_vti.c | 4 +- + net/ipv6/netfilter.c | 2 +- + net/ipv6/xfrm6_input.c | 103 +++++++++++--- + net/netfilter/nf_nat_proto.c | 2 +- + net/xfrm/xfrm_input.c | 6 +- + net/xfrm/xfrm_interface_core.c | 4 +- + net/xfrm/xfrm_policy.c | 301 +++++++++++++++++------------------------ + 20 files changed, 344 insertions(+), 242 deletions(-) +Merging mlx5-next/mlx5-next (82f9378c443c net/mlx5: Handle IPsec steering upon master unbind/bind) +$ git merge -m Merge branch 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux.git mlx5-next/mlx5-next +Already up to date. +Merging netfilter-next/main (ef113733c288 bareudp: use ports to lookup route) +$ git merge -m Merge branch 'main' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next.git netfilter-next/main +Already up to date. +Merging ipvs-next/main (9cdee0634769 netfilter: nf_tables: Carry reset boolean in nft_set_dump_ctx) +$ git merge -m Merge branch 'main' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs-next.git ipvs-next/main +Already up to date. +Merging bluetooth/master (0783375f2c56 Bluetooth: ISO: Allow binding a PA sync socket) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git bluetooth/master +Merge made by the 'ort' strategy. + net/bluetooth/hci_event.c | 8 +----- + net/bluetooth/iso.c | 67 +++++++++++++++++++++++++++++++++++++++++++---- + 2 files changed, 63 insertions(+), 12 deletions(-) +Merging wireless-next/for-next (cc54d2e2c58a MAINTAINERS: Remove linuxwwan@intel.com mailing list) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git wireless-next/for-next +Already up to date. +Merging wpan-next/master (18b849f12dcc ieee802154: ca8210: Remove stray gpiod_unexport() call) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/wpan/wpan-next.git wpan-next/master +Already up to date. +Merging wpan-staging/staging (18b849f12dcc ieee802154: ca8210: Remove stray gpiod_unexport() call) +$ git merge -m Merge branch 'staging' of git://git.kernel.org/pub/scm/linux/kernel/git/wpan/wpan-next.git wpan-staging/staging +Already up to date. +Merging mtd/mtd/next (ff6abbe85634 mtd: block2mtd: Add a valid holder to blkdev_put()) +$ git merge -m Merge branch 'mtd/next' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git mtd/mtd/next +Auto-merging drivers/mtd/devices/block2mtd.c +CONFLICT (content): Merge conflict in drivers/mtd/devices/block2mtd.c +Auto-merging drivers/mtd/maps/physmap-core.c +Auto-merging drivers/mtd/nand/raw/marvell_nand.c +Recorded preimage for 'drivers/mtd/devices/block2mtd.c' +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +Recorded resolution for 'drivers/mtd/devices/block2mtd.c'. +[master 72f418180082] Merge branch 'mtd/next' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git +$ git diff -M --stat --summary HEAD^.. + .../bindings/mtd/partitions/fixed-partitions.yaml | 19 +++++++++++++++++++ + drivers/mtd/chips/cfi_cmdset_0001.c | 20 ++++++++++++++++++-- + drivers/mtd/chips/map_ram.c | 8 ++++++-- + drivers/mtd/devices/bcm47xxsflash.c | 6 ++---- + drivers/mtd/devices/docg3.c | 5 ++--- + drivers/mtd/devices/phram.c | 6 ++---- + drivers/mtd/devices/powernv_flash.c | 6 ++---- + drivers/mtd/devices/spear_smi.c | 6 ++---- + drivers/mtd/devices/st_spi_fsm.c | 6 ++---- + drivers/mtd/hyperbus/hbmc-am654.c | 6 ++---- + drivers/mtd/hyperbus/rpc-if.c | 6 ++---- + drivers/mtd/lpddr/lpddr2_nvm.c | 6 ++---- + drivers/mtd/lpddr/lpddr_cmds.c | 2 +- + drivers/mtd/maps/lantiq-flash.c | 6 ++---- + drivers/mtd/maps/physmap-core.c | 15 +++++---------- + drivers/mtd/maps/plat-ram.c | 8 +++----- + drivers/mtd/maps/pxa2xx-flash.c | 5 ++--- + drivers/mtd/maps/sa1100-flash.c | 6 ++---- + drivers/mtd/maps/sun_uflash.c | 6 ++---- + drivers/mtd/mtdcore.c | 2 ++ + drivers/mtd/mtdpart.c | 6 +++++- + drivers/mtd/nand/raw/atmel/nand-controller.c | 2 +- + drivers/mtd/nand/raw/cadence-nand-controller.c | 12 +++++------- + drivers/mtd/nand/raw/denali.h | 2 +- + drivers/mtd/nand/raw/ingenic/ingenic_nand_drv.c | 2 +- + drivers/mtd/nand/raw/marvell_nand.c | 2 +- + drivers/mtd/nand/raw/meson_nand.c | 2 +- + drivers/mtd/nand/raw/renesas-nand-controller.c | 2 +- + drivers/mtd/nand/raw/sunxi_nand.c | 2 +- + drivers/mtd/nand/raw/vf610_nfc.c | 10 ++++------ + drivers/mtd/spi-nor/controllers/hisi-sfc.c | 5 ++--- + drivers/mtd/spi-nor/controllers/nxp-spifi.c | 6 ++---- + include/linux/mtd/cfi.h | 2 +- + include/linux/mtd/qinfo.h | 2 +- + 34 files changed, 107 insertions(+), 100 deletions(-) +Merging nand/nand/next (5a985960a4dd mtd: rawnand: meson: check return value of devm_kasprintf()) +$ git merge -m Merge branch 'nand/next' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/nand/next +Auto-merging drivers/mtd/nand/raw/arasan-nand-controller.c +Auto-merging drivers/mtd/nand/raw/cadence-nand-controller.c +Auto-merging drivers/mtd/nand/raw/meson_nand.c +Auto-merging drivers/mtd/nand/raw/nand_base.c +Merge made by the 'ort' strategy. + drivers/mtd/nand/raw/arasan-nand-controller.c | 2 +- + drivers/mtd/nand/raw/cadence-nand-controller.c | 2 +- + drivers/mtd/nand/raw/intel-nand-controller.c | 10 ++ + drivers/mtd/nand/raw/internals.h | 1 - + drivers/mtd/nand/raw/meson_nand.c | 3 + + drivers/mtd/nand/raw/mtk_nand.c | 2 +- + drivers/mtd/nand/raw/nand_base.c | 1 - + drivers/mtd/nand/raw/omap2.c | 8 +- + drivers/mtd/nand/raw/rockchip-nand-controller.c | 5 +- + drivers/mtd/nand/raw/sh_flctl.c | 3 +- + drivers/mtd/nand/raw/tegra_nand.c | 4 + + drivers/mtd/nand/raw/xway_nand.c | 1 - + drivers/mtd/nand/spi/Makefile | 2 +- + drivers/mtd/nand/spi/core.c | 1 + + drivers/mtd/nand/spi/foresee.c | 95 +++++++++++++++++ + drivers/mtd/nand/spi/winbond.c | 45 ++++++++ + drivers/mtd/nand/spi/xtx.c | 134 ++++++++++++++++++++++++ + include/linux/mtd/spinand.h | 1 + + 18 files changed, 305 insertions(+), 15 deletions(-) + create mode 100644 drivers/mtd/nand/spi/foresee.c +Merging spi-nor/spi-nor/next (6823a8383420 mtd: spi-nor: micron-st: use SFDP table for mt25qu512a) +$ git merge -m Merge branch 'spi-nor/next' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git spi-nor/spi-nor/next +Merge made by the 'ort' strategy. + drivers/mtd/spi-nor/Makefile | 2 - + drivers/mtd/spi-nor/atmel.c | 121 +++++++---- + drivers/mtd/spi-nor/catalyst.c | 24 --- + drivers/mtd/spi-nor/core.c | 63 +++--- + drivers/mtd/spi-nor/core.h | 138 ++++++------- + drivers/mtd/spi-nor/eon.c | 74 +++++-- + drivers/mtd/spi-nor/esmt.c | 29 ++- + drivers/mtd/spi-nor/everspin.c | 28 ++- + drivers/mtd/spi-nor/fujitsu.c | 21 -- + drivers/mtd/spi-nor/gigadevice.c | 82 +++++--- + drivers/mtd/spi-nor/intel.c | 23 ++- + drivers/mtd/spi-nor/issi.c | 118 +++++++---- + drivers/mtd/spi-nor/macronix.c | 220 +++++++++++++------- + drivers/mtd/spi-nor/micron-st.c | 423 ++++++++++++++++++++++++++------------- + drivers/mtd/spi-nor/spansion.c | 392 ++++++++++++++++++++++-------------- + drivers/mtd/spi-nor/sst.c | 164 +++++++++------ + drivers/mtd/spi-nor/swp.c | 13 +- + drivers/mtd/spi-nor/sysfs.c | 6 +- + drivers/mtd/spi-nor/winbond.c | 288 ++++++++++++++++---------- + drivers/mtd/spi-nor/xilinx.c | 32 ++- + drivers/mtd/spi-nor/xmc.c | 19 +- + 21 files changed, 1407 insertions(+), 873 deletions(-) + delete mode 100644 drivers/mtd/spi-nor/catalyst.c + delete mode 100644 drivers/mtd/spi-nor/fujitsu.c +Merging crypto/master (f2b88bab69c8 Documentation/module-signing.txt: bring up to date) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git crypto/master +Auto-merging MAINTAINERS +Auto-merging crypto/asymmetric_keys/public_key.c +Auto-merging fs/crypto/keysetup_v1.c +Auto-merging fs/ubifs/ubifs.h +Auto-merging net/mptcp/subflow.c +Merge made by the 'ort' strategy. + Documentation/ABI/testing/debugfs-driver-qat | 24 +- + Documentation/ABI/testing/sysfs-driver-qat | 48 + + Documentation/ABI/testing/sysfs-driver-qat_ras | 41 + + Documentation/ABI/testing/sysfs-driver-qat_rl | 226 +++ + Documentation/admin-guide/module-signing.rst | 17 +- + Documentation/crypto/devel-algos.rst | 4 +- + .../devicetree/bindings/crypto/fsl-imx-sahara.yaml | 43 +- + .../bindings/crypto/qcom,inline-crypto-engine.yaml | 1 + + .../devicetree/bindings/crypto/qcom,prng.yaml | 28 +- + .../devicetree/bindings/rng/amlogic,meson-rng.yaml | 1 + + .../devicetree/bindings/rng/st,stm32-rng.yaml | 20 +- + MAINTAINERS | 2 +- + arch/arm/crypto/nhpoly1305-neon-glue.c | 9 + + arch/arm64/crypto/nhpoly1305-neon-glue.c | 9 + + arch/arm64/crypto/sha1-ce-core.S | 8 +- + arch/arm64/crypto/sha1-ce-glue.c | 21 +- + arch/arm64/crypto/sha2-ce-core.S | 8 +- + arch/arm64/crypto/sha2-ce-glue.c | 39 +- + arch/arm64/crypto/sha256-glue.c | 26 +- + arch/arm64/crypto/sha512-ce-core.S | 8 +- + arch/arm64/crypto/sha512-ce-glue.c | 26 +- + arch/arm64/crypto/sha512-glue.c | 12 +- + arch/loongarch/crypto/crc32-loongarch.c | 2 - + arch/mips/crypto/crc32-mips.c | 2 - + arch/sparc/crypto/crc32c_glue.c | 43 +- + arch/x86/crypto/aesni-intel_asm.S | 4 +- + arch/x86/crypto/aesni-intel_avx-x86_64.S | 4 +- + arch/x86/crypto/aesni-intel_glue.c | 52 +- + arch/x86/crypto/nhpoly1305-avx2-glue.c | 9 + + arch/x86/crypto/nhpoly1305-sse2-glue.c | 9 + + arch/x86/crypto/sha1_ssse3_glue.c | 12 + + arch/x86/crypto/sha256_ssse3_glue.c | 44 + + certs/Kconfig | 6 +- + crypto/Kconfig | 63 +- + crypto/Makefile | 6 +- + crypto/adiantum.c | 78 +- + crypto/aead.c | 6 + + crypto/ahash.c | 406 +++-- + crypto/api.c | 2 +- + crypto/arc4.c | 60 +- + crypto/asymmetric_keys/Kconfig | 3 +- + crypto/asymmetric_keys/Makefile | 3 +- + crypto/asymmetric_keys/mscode_parser.c | 19 +- + crypto/asymmetric_keys/pkcs7.asn1 | 7 + + crypto/asymmetric_keys/pkcs7_parser.c | 22 +- + crypto/asymmetric_keys/pkcs8.asn1 | 6 + + crypto/asymmetric_keys/public_key.c | 8 +- + crypto/asymmetric_keys/selftest.c | 15 +- + crypto/asymmetric_keys/signature.c | 2 +- + crypto/asymmetric_keys/x509.asn1 | 7 + + crypto/asymmetric_keys/x509_akid.asn1 | 29 +- + crypto/asymmetric_keys/x509_cert_parser.c | 36 +- + crypto/asymmetric_keys/x509_parser.h | 9 - + crypto/asymmetric_keys/x509_public_key.c | 8 +- + crypto/authenc.c | 20 +- + crypto/authencesn.c | 28 +- + crypto/cbc.c | 159 +- + crypto/ccm.c | 29 +- + crypto/chacha20poly1305.c | 11 +- + crypto/cmac.c | 39 +- + crypto/cryptd.c | 14 +- + crypto/crypto_engine.c | 8 +- + crypto/ctr.c | 14 +- + crypto/cts.c | 12 +- + crypto/deflate.c | 61 +- + crypto/drbg.c | 2 +- + crypto/ecb.c | 206 ++- + crypto/essiv.c | 20 +- + crypto/gcm.c | 12 +- + crypto/hash.h | 14 +- + crypto/hash_info.c | 6 + + crypto/hctr2.c | 11 +- + crypto/hmac.c | 56 +- + crypto/jitterentropy-kcapi.c | 17 +- + crypto/jitterentropy.c | 342 +++-- + crypto/jitterentropy.h | 5 +- + crypto/lrw.c | 12 +- + crypto/lskcipher.c | 634 ++++++++ + crypto/pcrypt.c | 4 + + crypto/rsa-pkcs1pad.c | 27 +- + crypto/rsaprivkey.asn1 | 7 + + crypto/rsapubkey.asn1 | 7 + + crypto/shash.c | 387 +---- + crypto/skcipher.c | 81 +- + crypto/skcipher.h | 28 + + crypto/testmgr.c | 57 +- + crypto/testmgr.h | 155 -- + crypto/vmac.c | 1 - + crypto/xcbc.c | 32 +- + crypto/xts.c | 33 +- + drivers/char/hw_random/bcm2835-rng.c | 4 +- + drivers/char/hw_random/core.c | 6 + + drivers/char/hw_random/geode-rng.c | 6 +- + drivers/char/hw_random/hisi-rng.c | 2 - + drivers/char/hw_random/imx-rngc.c | 10 +- + drivers/char/hw_random/ks-sa-rng.c | 26 +- + drivers/char/hw_random/meson-rng.c | 80 +- + drivers/char/hw_random/mpfs-rng.c | 2 - + drivers/char/hw_random/n2-drv.c | 10 +- + drivers/char/hw_random/nomadik-rng.c | 1 + + drivers/char/hw_random/octeon-rng.c | 6 +- + drivers/char/hw_random/st-rng.c | 1 + + drivers/char/hw_random/stm32-rng.c | 519 +++++-- + drivers/char/hw_random/xgene-rng.c | 1 - + drivers/char/hw_random/xiphera-trng.c | 2 - + drivers/crypto/Kconfig | 1 + + drivers/crypto/allwinner/sun4i-ss/sun4i-ss-core.c | 7 +- + drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c | 11 +- + drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 11 +- + drivers/crypto/amcc/crypto4xx_core.c | 6 +- + drivers/crypto/amlogic/amlogic-gxl-core.c | 5 +- + drivers/crypto/aspeed/aspeed-acry.c | 6 +- + drivers/crypto/aspeed/aspeed-hace.c | 16 +- + drivers/crypto/atmel-aes.c | 6 +- + drivers/crypto/atmel-sha.c | 8 +- + drivers/crypto/atmel-tdes.c | 6 +- + drivers/crypto/axis/artpec6_crypto.c | 8 +- + drivers/crypto/bcm/cipher.c | 5 +- + drivers/crypto/caam/caamalg.c | 3 +- + drivers/crypto/caam/caamalg_qi2.c | 3 +- + drivers/crypto/caam/jr.c | 22 +- + drivers/crypto/cavium/nitrox/nitrox_hal.c | 2 +- + drivers/crypto/ccp/dbc.c | 74 +- + drivers/crypto/ccp/dbc.h | 29 +- + drivers/crypto/ccp/psp-dev.c | 122 +- + drivers/crypto/ccp/psp-dev.h | 55 + + drivers/crypto/ccp/sev-dev.c | 14 + + drivers/crypto/ccp/sp-dev.h | 4 + + drivers/crypto/ccp/sp-pci.c | 22 +- + drivers/crypto/ccp/sp-platform.c | 6 +- + drivers/crypto/ccp/tee-dev.c | 48 +- + drivers/crypto/ccp/tee-dev.h | 15 +- + drivers/crypto/ccree/cc_driver.c | 6 +- + drivers/crypto/chelsio/chcr_algo.c | 9 +- + drivers/crypto/exynos-rng.c | 6 +- + drivers/crypto/gemini/sl3516-ce-core.c | 6 +- + drivers/crypto/hifn_795x.c | 11 +- + drivers/crypto/hisilicon/debugfs.c | 79 +- + drivers/crypto/hisilicon/hpre/hpre_crypto.c | 25 +- + drivers/crypto/hisilicon/hpre/hpre_main.c | 21 +- + drivers/crypto/hisilicon/qm.c | 520 +++---- + drivers/crypto/hisilicon/qm_common.h | 6 +- + drivers/crypto/hisilicon/sec/sec_drv.c | 6 +- + drivers/crypto/hisilicon/sec2/sec_crypto.c | 32 +- + drivers/crypto/hisilicon/sec2/sec_main.c | 29 +- + drivers/crypto/hisilicon/trng/trng.c | 6 +- + drivers/crypto/hisilicon/zip/zip_crypto.c | 290 +--- + drivers/crypto/hisilicon/zip/zip_main.c | 23 +- + drivers/crypto/img-hash.c | 6 +- + drivers/crypto/inside-secure/safexcel.c | 6 +- + drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c | 6 +- + .../crypto/intel/keembay/keembay-ocs-aes-core.c | 6 +- + drivers/crypto/intel/keembay/keembay-ocs-ecc.c | 6 +- + .../crypto/intel/keembay/keembay-ocs-hcu-core.c | 15 +- + .../crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 245 ++- + .../crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.h | 30 +- + drivers/crypto/intel/qat/qat_4xxx/adf_drv.c | 36 +- + .../crypto/intel/qat/qat_c3xxx/adf_c3xxx_hw_data.c | 1 + + drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c | 1 + + drivers/crypto/intel/qat/qat_c3xxxvf/adf_drv.c | 1 + + .../crypto/intel/qat/qat_c62x/adf_c62x_hw_data.c | 1 + + drivers/crypto/intel/qat/qat_c62x/adf_drv.c | 1 + + drivers/crypto/intel/qat/qat_c62xvf/adf_drv.c | 1 + + drivers/crypto/intel/qat/qat_common/Makefile | 10 + + .../intel/qat/qat_common/adf_accel_devices.h | 61 +- + drivers/crypto/intel/qat/qat_common/adf_admin.c | 156 +- + drivers/crypto/intel/qat/qat_common/adf_admin.h | 27 + + drivers/crypto/intel/qat/qat_common/adf_aer.c | 3 +- + .../crypto/intel/qat/qat_common/adf_cfg_services.c | 20 + + .../crypto/intel/qat/qat_common/adf_cfg_services.h | 24 + + .../crypto/intel/qat/qat_common/adf_cfg_strings.h | 1 + + drivers/crypto/intel/qat/qat_common/adf_clock.c | 1 + + .../crypto/intel/qat/qat_common/adf_cnv_dbgfs.c | 300 ++++ + .../crypto/intel/qat/qat_common/adf_cnv_dbgfs.h | 11 + + .../crypto/intel/qat/qat_common/adf_common_drv.h | 20 +- + drivers/crypto/intel/qat/qat_common/adf_dbgfs.c | 6 + + .../crypto/intel/qat/qat_common/adf_fw_counters.c | 3 +- + .../crypto/intel/qat/qat_common/adf_gen4_hw_data.h | 7 + + drivers/crypto/intel/qat/qat_common/adf_gen4_pm.c | 27 +- + drivers/crypto/intel/qat/qat_common/adf_gen4_pm.h | 50 +- + .../intel/qat/qat_common/adf_gen4_pm_debugfs.c | 266 ++++ + drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c | 1566 ++++++++++++++++++++ + drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h | 825 +++++++++++ + .../crypto/intel/qat/qat_common/adf_gen4_timer.c | 1 + + .../crypto/intel/qat/qat_common/adf_heartbeat.c | 1 + + .../intel/qat/qat_common/adf_heartbeat_dbgfs.c | 1 + + drivers/crypto/intel/qat/qat_common/adf_init.c | 63 +- + drivers/crypto/intel/qat/qat_common/adf_isr.c | 18 + + drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs.c | 48 + + drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs.h | 12 + + drivers/crypto/intel/qat/qat_common/adf_rl.c | 1169 +++++++++++++++ + drivers/crypto/intel/qat/qat_common/adf_rl.h | 176 +++ + drivers/crypto/intel/qat/qat_common/adf_rl_admin.c | 97 ++ + drivers/crypto/intel/qat/qat_common/adf_rl_admin.h | 18 + + drivers/crypto/intel/qat/qat_common/adf_sysfs.c | 112 +- + .../intel/qat/qat_common/adf_sysfs_ras_counters.c | 112 ++ + .../intel/qat/qat_common/adf_sysfs_ras_counters.h | 27 + + drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c | 451 ++++++ + drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.h | 11 + + .../intel/qat/qat_common/adf_transport_debug.c | 4 +- + .../intel/qat/qat_common/icp_qat_fw_init_admin.h | 82 + + drivers/crypto/intel/qat/qat_common/icp_qat_hw.h | 2 + + .../crypto/intel/qat/qat_common/qat_algs_send.c | 46 +- + .../crypto/intel/qat/qat_common/qat_comp_algs.c | 129 +- + drivers/crypto/intel/qat/qat_common/qat_uclo.c | 2 +- + .../intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c | 1 + + drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c | 1 + + drivers/crypto/intel/qat/qat_dh895xccvf/adf_drv.c | 1 + + drivers/crypto/marvell/cesa/cesa.c | 6 +- + drivers/crypto/mxs-dcp.c | 8 +- + drivers/crypto/n2_core.c | 12 +- + drivers/crypto/omap-aes.c | 6 +- + drivers/crypto/omap-des.c | 6 +- + drivers/crypto/omap-sham.c | 22 +- + drivers/crypto/qce/core.c | 5 +- + drivers/crypto/qcom-rng.c | 71 +- + drivers/crypto/rockchip/rk3288_crypto.c | 5 +- + drivers/crypto/rockchip/rk3288_crypto_ahash.c | 3 - + drivers/crypto/s5p-sss.c | 12 +- + drivers/crypto/sa2ul.c | 6 +- + drivers/crypto/sahara.c | 6 +- + drivers/crypto/starfive/jh7110-hash.c | 13 +- + drivers/crypto/stm32/stm32-crc32.c | 17 +- + drivers/crypto/stm32/stm32-cryp.c | 16 +- + drivers/crypto/stm32/stm32-hash.c | 20 - + drivers/crypto/talitos.c | 23 +- + drivers/crypto/vmx/aesp8-ppc.pl | 141 +- + drivers/crypto/xilinx/zynqmp-aes-gcm.c | 6 +- + drivers/crypto/xilinx/zynqmp-sha.c | 7 +- + .../chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c | 2 - + .../chelsio/inline_crypto/ch_ipsec/chcr_ipsec.h | 1 - + .../ethernet/chelsio/inline_crypto/chtls/chtls.h | 1 - + drivers/net/wireguard/cookie.c | 2 +- + drivers/net/wireguard/netlink.c | 2 +- + drivers/net/wireguard/noise.c | 2 +- + fs/crypto/keysetup_v1.c | 2 +- + fs/smb/server/ksmbd_spnego_negtokeninit.asn1 | 8 + + fs/smb/server/ksmbd_spnego_negtokentarg.asn1 | 7 + + fs/ubifs/auth.c | 3 +- + fs/ubifs/replay.c | 1 - + fs/ubifs/ubifs.h | 2 +- + include/crypto/aead.h | 12 + + include/crypto/akcipher.h | 4 +- + include/crypto/algapi.h | 5 - + include/crypto/engine.h | 2 +- + include/crypto/hash.h | 95 +- + include/crypto/hash_info.h | 1 + + include/crypto/internal/hash.h | 9 +- + include/crypto/internal/skcipher.h | 130 +- + include/crypto/sig.h | 2 +- + include/crypto/skcipher.h | 296 +++- + include/linux/crypto.h | 30 +- + include/linux/hisi_acc_qm.h | 39 +- + include/linux/hw_random.h | 1 + + include/linux/oid_registry.h | 23 +- + include/linux/units.h | 4 + + include/linux/verification.h | 1 + + include/uapi/linux/hash_info.h | 3 + + kernel/module/Kconfig | 25 +- + kernel/padata.c | 8 +- + net/bluetooth/smp.c | 3 +- + net/ceph/messenger_v2.c | 4 - + net/ipv4/ah4.c | 19 +- + net/ipv4/netfilter/nf_nat_snmp_basic.asn1 | 8 + + net/ipv6/ah6.c | 19 +- + net/mptcp/subflow.c | 2 +- + net/sunrpc/auth_gss/gss_krb5_crypto.c | 2 +- + net/sunrpc/auth_gss/gss_krb5_unseal.c | 2 - + net/xfrm/Kconfig | 1 + + net/xfrm/xfrm_algo.c | 19 +- + security/integrity/evm/evm_main.c | 3 +- + security/keys/encrypted-keys/encrypted.c | 2 +- + tools/crypto/ccp/dbc.c | 17 +- + tools/crypto/ccp/dbc.py | 8 +- + tools/crypto/ccp/test_dbc.py | 45 +- + 275 files changed, 10688 insertions(+), 3351 deletions(-) + create mode 100644 Documentation/ABI/testing/sysfs-driver-qat_ras + create mode 100644 Documentation/ABI/testing/sysfs-driver-qat_rl + create mode 100644 crypto/lskcipher.c + create mode 100644 crypto/skcipher.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_admin.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_cfg_services.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_cfg_services.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_cnv_dbgfs.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_cnv_dbgfs.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_pm_debugfs.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_rl.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_rl.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_rl_admin.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_rl_admin.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.h + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c + create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.h +Merging drm/drm-next (5258dfd4a6ad usb: typec: altmodes/displayport: fixup drm internal api change vs new user.) +$ git merge -m Merge branch 'drm-next' of git://git.freedesktop.org/git/drm/drm.git drm/drm-next +Auto-merging MAINTAINERS +CONFLICT (modify/delete): arch/ia64/include/asm/fb.h deleted in HEAD and modified in drm/drm-next. Version drm/drm-next of arch/ia64/include/asm/fb.h left in tree. +Auto-merging drivers/accel/ivpu/ivpu_hw_37xx.c +Auto-merging drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +Auto-merging drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +Auto-merging drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +Auto-merging drivers/gpu/drm/display/drm_dp_mst_topology.c +Auto-merging drivers/gpu/drm/i915/gem/i915_gem_shrinker.c +Auto-merging drivers/gpu/drm/i915/gt/intel_gt_mcr.c +Auto-merging drivers/gpu/drm/i915/gt/selftest_migrate.c +Auto-merging drivers/gpu/drm/i915/i915_drv.h +Auto-merging drivers/gpu/drm/i915/i915_perf.c +Auto-merging drivers/gpu/drm/i915/i915_pmu.c +Auto-merging drivers/gpu/drm/msm/msm_drv.c +CONFLICT (content): Merge conflict in drivers/gpu/drm/msm/msm_drv.c +Auto-merging drivers/gpu/drm/msm/msm_drv.h +Auto-merging drivers/gpu/drm/panfrost/panfrost_device.h +Auto-merging drivers/gpu/drm/panfrost/panfrost_drv.c +Auto-merging drivers/gpu/drm/panfrost/panfrost_gem.h +Auto-merging drivers/gpu/drm/qxl/qxl_drv.c +Auto-merging drivers/video/fbdev/Kconfig +Resolved 'drivers/gpu/drm/msm/msm_drv.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git rm -f arch/ia64/include/asm/fb.h +rm 'arch/ia64/include/asm/fb.h' +$ git commit --no-edit -v -a +[master d530632b5481] Merge branch 'drm-next' of git://git.freedesktop.org/git/drm/drm.git +$ git diff -M --stat --summary HEAD^.. + .../ABI/testing/debugfs-driver-habanalabs | 82 +- + Documentation/ABI/testing/sysfs-driver-habanalabs | 64 +- + Documentation/accel/qaic/qaic.rst | 10 + + .../bindings/display/bridge/analogix,anx7814.yaml | 1 + + .../bindings/display/lvds-data-mapping.yaml | 84 + + .../devicetree/bindings/display/lvds.yaml | 77 +- + .../bindings/display/mediatek/mediatek,dp.yaml | 2 + + .../bindings/display/mediatek/mediatek,dsi.yaml | 1 + + .../bindings/display/msm/dp-controller.yaml | 1 + + .../devicetree/bindings/display/msm/gmu.yaml | 47 +- + .../devicetree/bindings/display/msm/gpu.yaml | 4 +- + .../bindings/display/msm/qcom,msm8998-mdss.yaml | 6 + + .../bindings/display/msm/qcom,qcm2290-mdss.yaml | 6 + + .../bindings/display/msm/qcom,sc7180-mdss.yaml | 8 + + .../bindings/display/msm/qcom,sc7280-mdss.yaml | 10 + + .../bindings/display/msm/qcom,sc8280xp-mdss.yaml | 4 + + .../bindings/display/msm/qcom,sdm845-mdss.yaml | 8 + + .../bindings/display/msm/qcom,sm6115-mdss.yaml | 6 + + .../bindings/display/msm/qcom,sm6125-mdss.yaml | 6 + + .../bindings/display/msm/qcom,sm6350-mdss.yaml | 6 + + .../bindings/display/msm/qcom,sm6375-mdss.yaml | 6 + + .../bindings/display/msm/qcom,sm8150-mdss.yaml | 6 + + .../bindings/display/msm/qcom,sm8250-mdss.yaml | 6 + + .../bindings/display/msm/qcom,sm8350-mdss.yaml | 8 + + .../bindings/display/msm/qcom,sm8450-mdss.yaml | 8 + + .../bindings/display/msm/qcom,sm8550-mdss.yaml | 8 + + .../bindings/display/panel/jdi,lpm102a188a.yaml | 94 + + .../display/panel/leadtek,ltk050h3146w.yaml | 1 + + .../bindings/display/panel/newvision,nv3051d.yaml | 5 +- + .../bindings/display/panel/panel-simple.yaml | 28 +- + .../bindings/display/panel/raydium,rm692e5.yaml | 73 + + .../display/rockchip/rockchip,dw-mipi-dsi.yaml | 2 + + .../bindings/display/rockchip/rockchip-vop.yaml | 1 + + Documentation/driver-api/dma-buf.rst | 30 +- + Documentation/gpu/amdgpu/driver-misc.rst | 18 + + Documentation/gpu/amdgpu/thermal.rst | 30 + + Documentation/gpu/drivers.rst | 1 + + Documentation/gpu/drm-mm.rst | 20 +- + Documentation/gpu/drm-uapi.rst | 84 + + Documentation/gpu/drm-usage-stats.rst | 1 + + Documentation/gpu/i915.rst | 27 +- + Documentation/gpu/panfrost.rst | 40 + + Documentation/gpu/rfc/xe.rst | 89 +- + .../userspace-api/dma-buf-alloc-exchange.rst | 389 + + Documentation/userspace-api/index.rst | 1 + + MAINTAINERS | 36 +- + arch/m68k/include/asm/fb.h | 19 +- + arch/mips/include/asm/fb.h | 11 +- + arch/powerpc/include/asm/fb.h | 18 +- + arch/sparc/include/asm/fb.h | 15 +- + arch/x86/include/asm/fb.h | 12 +- + arch/x86/video/fbdev.c | 15 +- + drivers/accel/drm_accel.c | 56 +- + drivers/accel/habanalabs/common/command_buffer.c | 5 +- + .../accel/habanalabs/common/command_submission.c | 508 +- + drivers/accel/habanalabs/common/context.c | 9 +- + drivers/accel/habanalabs/common/debugfs.c | 22 +- + drivers/accel/habanalabs/common/device.c | 425 +- + drivers/accel/habanalabs/common/firmware_if.c | 45 +- + drivers/accel/habanalabs/common/habanalabs.h | 212 +- + drivers/accel/habanalabs/common/habanalabs_drv.c | 186 +- + drivers/accel/habanalabs/common/habanalabs_ioctl.c | 112 +- + drivers/accel/habanalabs/common/irq.c | 180 +- + drivers/accel/habanalabs/common/memory.c | 304 +- + drivers/accel/habanalabs/gaudi/gaudi.c | 17 +- + drivers/accel/habanalabs/gaudi/gaudiP.h | 2 +- + drivers/accel/habanalabs/gaudi/gaudi_coresight.c | 12 + + drivers/accel/habanalabs/gaudi2/gaudi2.c | 487 +- + drivers/accel/habanalabs/gaudi2/gaudi2P.h | 4 +- + drivers/accel/habanalabs/gaudi2/gaudi2_coresight.c | 46 +- + drivers/accel/habanalabs/gaudi2/gaudi2_security.c | 21 +- + drivers/accel/habanalabs/goya/goya.c | 10 +- + drivers/accel/habanalabs/goya/goyaP.h | 2 +- + drivers/accel/habanalabs/goya/goya_coresight.c | 10 + + .../accel/habanalabs/include/gaudi/gaudi_fw_if.h | 32 - + .../include/gaudi2/gaudi2_async_events.h | 7 + + .../include/gaudi2/gaudi2_async_ids_map_extended.h | 16 +- + drivers/accel/ivpu/Makefile | 3 +- + drivers/accel/ivpu/ivpu_debugfs.c | 50 +- + drivers/accel/ivpu/ivpu_debugfs.h | 8 +- + drivers/accel/ivpu/ivpu_drv.c | 71 +- + drivers/accel/ivpu/ivpu_drv.h | 18 +- + drivers/accel/ivpu/ivpu_fw.c | 6 +- + drivers/accel/ivpu/ivpu_fw.h | 2 +- + drivers/accel/ivpu/ivpu_hw_37xx.c | 75 +- + drivers/accel/ivpu/ivpu_hw_37xx_reg.h | 187 +- + drivers/accel/ivpu/ivpu_hw_40xx.c | 7 + + drivers/accel/ivpu/ivpu_ipc.c | 13 +- + drivers/accel/ivpu/ivpu_mmu.c | 117 +- + drivers/accel/ivpu/ivpu_mmu_context.c | 18 +- + drivers/accel/ivpu/ivpu_mmu_context.h | 2 + + drivers/accel/ivpu/ivpu_pm.c | 16 +- + drivers/accel/ivpu/ivpu_pm.h | 2 +- + drivers/accel/qaic/qaic.h | 13 +- + drivers/accel/qaic/qaic_data.c | 187 +- + drivers/accel/qaic/qaic_drv.c | 125 +- + drivers/gpu/drm/Kconfig | 7 + + drivers/gpu/drm/Makefile | 2 +- + drivers/gpu/drm/amd/amdgpu/Makefile | 22 +- + drivers/gpu/drm/amd/amdgpu/aldebaran.c | 39 +- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 85 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 52 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 3 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 6 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 57 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 17 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h | 18 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 11 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 5 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 10 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 431 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 180 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 28 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell.h | 14 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c | 15 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 97 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 3 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c | 166 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.h | 11 + + drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 8 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 25 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h | 11 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 208 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 32 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 6 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 45 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 215 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_mca.c | 186 + + drivers/gpu/drm/amd/amdgpu/amdgpu_mca.h | 61 + + drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 11 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h | 2 + + drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 32 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 149 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 463 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 42 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c | 12 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h | 1 - + drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c | 92 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h | 30 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 6 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 5 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 9 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_smuio.h | 12 + + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 3 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 93 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 37 + + drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 29 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h | 5 + + drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c | 878 + + drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.h | 228 + + drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 12 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 22 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 50 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 4 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 4 + + drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 2 + + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 58 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 31 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c | 10 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c | 656 + + drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.h | 91 + + drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 58 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c | 28 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 31 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h | 1 + + drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h | 5 +- + drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c | 2 +- + drivers/gpu/drm/amd/amdgpu/athub_v1_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/athub_v2_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/athub_v2_1.c | 2 +- + drivers/gpu/drm/amd/amdgpu/athub_v3_0.c | 7 +- + drivers/gpu/drm/amd/amdgpu/atom.c | 19 +- + drivers/gpu/drm/amd/amdgpu/atombios_encoders.c | 1 - + drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 11 +- + drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 6 +- + drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 6 +- + drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 6 +- + drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 6 +- + drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 132 +- + drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 180 +- + drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 89 +- + drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.c | 6 +- + drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c | 141 +- + drivers/gpu/drm/amd/amdgpu/gfxhub_v11_5_0.c | 516 + + .../link_fpga.h => amdgpu/gfxhub_v11_5_0.h} | 15 +- + drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c | 16 +- + drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c | 5 +- + drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c | 6 +- + drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c | 5 +- + drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.c | 5 +- + drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 302 +- + drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c | 208 +- + drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 6 +- + drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 32 +- + drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 33 +- + drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 370 +- + drivers/gpu/drm/amd/amdgpu/hdp_v4_0.c | 18 +- + drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c | 20 +- + drivers/gpu/drm/amd/amdgpu/ih_v6_0.c | 4 - + drivers/gpu/drm/amd/amdgpu/imu_v11_0.c | 9 +- + drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c | 4 +- + drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c | 14 +- + drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 5 + + drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c | 622 + + drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.h | 35 + + drivers/gpu/drm/amd/amdgpu/mes_v10_1.c | 10 +- + drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 62 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c | 2 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c | 160 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c | 14 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c | 4 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c | 7 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c | 7 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c | 5 +- + drivers/gpu/drm/amd/amdgpu/mmhub_v3_3.c | 589 + + drivers/gpu/drm/amd/amdgpu/mmhub_v3_3.h | 29 + + drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c | 2 +- + drivers/gpu/drm/amd/amdgpu/mmsch_v4_0.h | 12 +- + drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h | 6 +- + drivers/gpu/drm/amd/amdgpu/navi10_ih.c | 8 +- + drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c | 2 +- + drivers/gpu/drm/amd/amdgpu/nbio_v4_3.c | 6 +- + drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c | 372 + + drivers/gpu/drm/amd/amdgpu/nbio_v7_11.h | 33 + + drivers/gpu/drm/amd/amdgpu/nbio_v7_2.c | 10 +- + drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c | 11 +- + drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c | 10 +- + drivers/gpu/drm/amd/amdgpu/nv.c | 10 +- + drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h | 4 + + drivers/gpu/drm/amd/amdgpu/psp_v10_0.c | 7 +- + drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 26 +- + drivers/gpu/drm/amd/amdgpu/psp_v13_0_4.c | 2 +- + drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 11 +- + drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 11 +- + drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 59 +- + drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 35 +- + drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 15 +- + drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 20 +- + drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c | 105 +- + drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c | 22 +- + drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c | 19 +- + drivers/gpu/drm/amd/amdgpu/smuio_v13_0.c | 22 + + drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.c | 6 + + drivers/gpu/drm/amd/amdgpu/soc15.c | 28 +- + drivers/gpu/drm/amd/amdgpu/soc21.c | 46 +- + drivers/gpu/drm/amd/amdgpu/ta_xgmi_if.h | 64 +- + drivers/gpu/drm/amd/amdgpu/umc_v12_0.c | 376 + + drivers/gpu/drm/amd/amdgpu/umc_v12_0.h | 127 + + drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c | 424 + + drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.h | 30 + + drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c | 8 + + drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 8 + + drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | 8 + + drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 8 + + drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 8 + + drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 9 +- + drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 14 +- + drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 80 +- + drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 5 + + drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 1779 + + drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.h | 35 + + drivers/gpu/drm/amd/amdgpu/vega20_ih.c | 14 +- + drivers/gpu/drm/amd/amdgpu/vpe_6_1_fw_if.h | 217 + + drivers/gpu/drm/amd/amdgpu/vpe_v6_1.c | 289 + + drivers/gpu/drm/amd/amdgpu/vpe_v6_1.h | 29 + + drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 24 +- + drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 31 +- + drivers/gpu/drm/amd/amdkfd/kfd_device.c | 19 +- + .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 129 +- + drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c | 10 +- + drivers/gpu/drm/amd/amdkfd/kfd_int_process_v10.c | 6 +- + drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c | 6 +- + drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c | 6 +- + drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 156 +- + drivers/gpu/drm/amd/amdkfd/kfd_migrate.h | 6 +- + drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c | 28 +- + drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c | 3 +- + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 4 +- + .../gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 3 +- + drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 318 +- + drivers/gpu/drm/amd/amdkfd/kfd_svm.h | 15 +- + drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 44 +- + drivers/gpu/drm/amd/display/Makefile | 1 + + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 356 +- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 - + .../drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 58 +- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c | 1 + + .../drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 125 +- + .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 22 +- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c | 19 +- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_replay.c | 4 +- + drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c | 53 +- + drivers/gpu/drm/amd/display/dc/Makefile | 7 +- + drivers/gpu/drm/amd/display/dc/basics/Makefile | 9 +- + .../display/dc/{dml/calcs => basics}/bw_fixed.c | 13 +- + .../dc/{dml/calcs => basics}/calcs_logger.h | 0 + .../dc/{dml/calcs => basics}/custom_float.c | 90 +- + .../display/dc/{dml/calcs => basics}/dce_calcs.c | 0 + drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | 3 + + drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | 46 +- + .../amd/display/dc/bios/command_table_helper2.c | 1 + + drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile | 8 + + drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c | 18 + + .../amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.c | 2 +- + .../amd/display/dc/clk_mgr/dcn201/dcn201_clk_mgr.c | 2 - + .../gpu/drm/amd/display/dc/clk_mgr/dcn32/dalsmc.h | 11 +- + .../amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c | 64 + + .../dc/clk_mgr/dcn32/dcn32_clk_mgr_smu_msg.c | 154 +- + .../amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c | 1142 + + .../amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.h | 63 + + .../drm/amd/display/dc/clk_mgr/dcn35/dcn35_smu.c | 471 + + .../drm/amd/display/dc/clk_mgr/dcn35/dcn35_smu.h | 203 + + drivers/gpu/drm/amd/display/dc/core/dc.c | 485 +- + drivers/gpu/drm/amd/display/dc/core/dc_debug.c | 2 + + .../gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 23 + + drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 1709 +- + drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 51 +- + drivers/gpu/drm/amd/display/dc/dc.h | 88 +- + drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 138 +- + drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h | 4 + + drivers/gpu/drm/amd/display/dc/dc_dp_types.h | 59 +- + drivers/gpu/drm/amd/display/dc/dc_helper.c | 7 + + drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 7 - + drivers/gpu/drm/amd/display/dc/dc_stream.h | 9 +- + drivers/gpu/drm/amd/display/dc/dc_types.h | 16 +- + drivers/gpu/drm/amd/display/dc/dce/Makefile | 2 +- + drivers/gpu/drm/amd/display/dc/dce/dce_abm.h | 9 +- + drivers/gpu/drm/amd/display/dc/dce/dce_audio.c | 4 + + .../gpu/drm/amd/display/dc/dce/dce_clock_source.c | 7 +- + drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c | 3 +- + drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c | 4 + + drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.h | 6 + + drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c | 13 +- + drivers/gpu/drm/amd/display/dc/dce100/Makefile | 2 +- + .../drm/amd/display/dc/dce100/dce100_resource.c | 4 +- + drivers/gpu/drm/amd/display/dc/dce110/Makefile | 2 +- + .../drm/amd/display/dc/dce110/dce110_resource.c | 2 +- + drivers/gpu/drm/amd/display/dc/dce112/Makefile | 2 +- + .../drm/amd/display/dc/dce112/dce112_resource.c | 2 +- + drivers/gpu/drm/amd/display/dc/dce120/Makefile | 1 - + .../drm/amd/display/dc/dce120/dce120_resource.c | 6 +- + .../drm/amd/display/dc/dce60/dce60_hw_sequencer.c | 4 +- + drivers/gpu/drm/amd/display/dc/dce80/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dce80/dce80_resource.c | 2 +- + drivers/gpu/drm/amd/display/dc/dcn10/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h | 12 +- + .../display/dc/dcn10/dcn10_hw_sequencer_debug.c | 4 +- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_init.c | 4 +- + .../drm/amd/display/dc/dcn10/dcn10_link_encoder.h | 33 + + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h | 30 + + .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 4 +- + .../amd/display/dc/dcn10/dcn10_stream_encoder.h | 24 +- + drivers/gpu/drm/amd/display/dc/dcn20/Makefile | 2 +- + drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dccg.h | 64 + + drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn20/dcn20_init.c | 9 +- + .../gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 36 +- + .../gpu/drm/amd/display/dc/dcn20/dcn20_resource.h | 4 +- + drivers/gpu/drm/amd/display/dc/dcn20/dcn20_vmid.c | 3 + + drivers/gpu/drm/amd/display/dc/dcn201/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dcn201/dcn201_init.c | 6 +- + .../drm/amd/display/dc/dcn201/dcn201_resource.c | 5 +- + drivers/gpu/drm/amd/display/dc/dcn21/Makefile | 2 +- + drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubp.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c | 9 +- + .../gpu/drm/amd/display/dc/dcn21/dcn21_resource.c | 13 +- + drivers/gpu/drm/amd/display/dc/dcn30/Makefile | 1 - + .../gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c | 104 +- + drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dpp.h | 2 - + drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dwb.h | 2 - + drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c | 8 +- + drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c | 17 - + drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.h | 1 - + drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c | 2 +- + .../gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 5 +- + drivers/gpu/drm/amd/display/dc/dcn301/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dcn301/dcn301_init.c | 8 +- + .../drm/amd/display/dc/dcn301/dcn301_resource.c | 5 +- + drivers/gpu/drm/amd/display/dc/dcn302/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dcn302/dcn302_init.c | 2 +- + .../drm/amd/display/dc/dcn302/dcn302_resource.c | 3 + + drivers/gpu/drm/amd/display/dc/dcn303/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dcn303/dcn303_init.c | 2 +- + .../drm/amd/display/dc/dcn303/dcn303_resource.c | 3 + + drivers/gpu/drm/amd/display/dc/dcn31/Makefile | 2 +- + .../display/dc/dcn31/dcn31_hpo_dp_link_encoder.h | 10 +- + .../gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c | 32 +- + drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubp.c | 6 + + drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubp.h | 3 + + drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c | 6 +- + .../gpu/drm/amd/display/dc/dcn31/dcn31_resource.c | 5 +- + drivers/gpu/drm/amd/display/dc/dcn314/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dcn314/dcn314_dccg.c | 3 +- + .../gpu/drm/amd/display/dc/dcn314/dcn314_dccg.h | 6 + + .../display/dc/dcn314/dcn314_dio_stream_encoder.c | 22 +- + .../display/dc/dcn314/dcn314_dio_stream_encoder.h | 40 + + .../gpu/drm/amd/display/dc/dcn314/dcn314_init.c | 6 +- + .../drm/amd/display/dc/dcn314/dcn314_resource.c | 7 +- + .../drm/amd/display/dc/dcn315/dcn315_resource.c | 7 +- + .../drm/amd/display/dc/dcn316/dcn316_resource.c | 3 +- + drivers/gpu/drm/amd/display/dc/dcn32/Makefile | 2 +- + drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.c | 1 + + .../gpu/drm/amd/display/dc/dcn32/dcn32_hubbub.c | 14 +- + .../gpu/drm/amd/display/dc/dcn32/dcn32_hubbub.h | 6 +- + drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c | 10 +- + .../gpu/drm/amd/display/dc/dcn32/dcn32_mmhubbub.h | 4 - + drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.h | 2 - + drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c | 27 +- + drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h | 3 + + .../gpu/drm/amd/display/dc/dcn32/dcn32_resource.c | 168 +- + .../gpu/drm/amd/display/dc/dcn32/dcn32_resource.h | 169 +- + .../amd/display/dc/dcn32/dcn32_resource_helpers.c | 50 +- + .../drm/amd/display/dc/dcn321/dcn321_resource.c | 45 +- + drivers/gpu/drm/amd/display/dc/dcn35/Makefile | 20 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dccg.c | 796 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dccg.h | 190 + + .../amd/display/dc/dcn35/dcn35_dio_link_encoder.c | 267 + + .../amd/display/dc/dcn35/dcn35_dio_link_encoder.h | 137 + + .../display/dc/dcn35/dcn35_dio_stream_encoder.c | 528 + + .../display/dc/dcn35/dcn35_dio_stream_encoder.h | 326 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dpp.c | 51 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dpp.h | 55 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dsc.c | 58 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dsc.h | 57 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.c | 58 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.h | 59 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_hubbub.c | 609 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_hubbub.h | 153 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubp.c | 104 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubp.h | 59 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_init.c | 169 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_init.h | 32 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.c | 57 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.h | 73 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.c | 51 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.h | 65 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_optc.c | 288 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_optc.h | 72 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.c | 539 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.h | 193 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_resource.c | 2119 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_resource.h | 308 + + drivers/gpu/drm/amd/display/dc/dml/Makefile | 5 +- + .../gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c | 31 +- + .../gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h | 10 +- + .../display/dc/dml/dcn314/display_mode_vba_314.c | 2 + + .../gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c | 827 +- + .../gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h | 3 - + .../dc/dml/dcn32/display_mode_vba_util_32.c | 4 - + .../gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.c | 81 + + .../gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c | 509 + + .../gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.h | 42 + + drivers/gpu/drm/amd/display/dc/dml2/Makefile | 91 + + drivers/gpu/drm/amd/display/dc/dml2/cmntypes.h | 92 + + .../drm/amd/display/dc/dml2/display_mode_core.c | 10313 ++++ + .../drm/amd/display/dc/dml2/display_mode_core.h | 201 + + .../display/dc/dml2/display_mode_core_structs.h | 1970 + + .../amd/display/dc/dml2/display_mode_lib_defines.h | 75 + + .../drm/amd/display/dc/dml2/display_mode_util.c | 796 + + .../drm/amd/display/dc/dml2/display_mode_util.h | 74 + + .../amd/display/dc/dml2/dml2_dc_resource_mgmt.c | 861 + + .../amd/display/dc/dml2/dml2_dc_resource_mgmt.h | 48 + + .../gpu/drm/amd/display/dc/dml2/dml2_dc_types.h | 40 + + .../drm/amd/display/dc/dml2/dml2_internal_types.h | 121 + + .../drm/amd/display/dc/dml2/dml2_mall_phantom.c | 913 + + .../drm/amd/display/dc/dml2/dml2_mall_phantom.h | 50 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c | 308 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.h | 47 + + .../amd/display/dc/dml2/dml2_translation_helper.c | 1201 + + .../amd/display/dc/dml2/dml2_translation_helper.h | 39 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_utils.c | 480 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_utils.h | 144 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c | 745 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h | 212 + + drivers/gpu/drm/amd/display/dc/dml2/dml_assert.h | 30 + + .../gpu/drm/amd/display/dc/dml2/dml_depedencies.h | 31 + + .../amd/display/dc/dml2/dml_display_rq_dlg_calc.c | 585 + + .../amd/display/dc/dml2/dml_display_rq_dlg_calc.h | 63 + + drivers/gpu/drm/amd/display/dc/dml2/dml_logging.h | 29 + + drivers/gpu/drm/amd/display/dc/gpio/hw_factory.c | 1 + + drivers/gpu/drm/amd/display/dc/gpio/hw_translate.c | 1 + + drivers/gpu/drm/amd/display/dc/hwss/Makefile | 183 + + .../drm/amd/display/dc/{ => hwss}/dce/dce_hwseq.c | 0 + .../drm/amd/display/dc/{ => hwss}/dce/dce_hwseq.h | 20 + + .../dce100/dce100_hwseq.c} | 4 +- + .../dce100/dce100_hwseq.h} | 0 + .../dce110/dce110_hwseq.c} | 30 +- + .../dce110/dce110_hwseq.h} | 0 + .../dce112/dce112_hwseq.c} | 4 +- + .../dce112/dce112_hwseq.h} | 0 + .../dce120/dce120_hwseq.c} | 4 +- + .../dce120/dce120_hwseq.h} | 0 + .../dce80/dce80_hwseq.c} | 6 +- + .../dce80/dce80_hwseq.h} | 0 + .../dcn10/dcn10_hwseq.c} | 37 +- + .../dcn10/dcn10_hwseq.h} | 0 + .../amd/display/dc/{ => hwss}/dcn20/dcn20_hwseq.c | 196 +- + .../amd/display/dc/{ => hwss}/dcn20/dcn20_hwseq.h | 11 +- + .../display/dc/{ => hwss}/dcn201/dcn201_hwseq.c | 2 +- + .../display/dc/{ => hwss}/dcn201/dcn201_hwseq.h | 0 + .../amd/display/dc/{ => hwss}/dcn21/dcn21_hwseq.c | 2 +- + .../amd/display/dc/{ => hwss}/dcn21/dcn21_hwseq.h | 0 + .../amd/display/dc/{ => hwss}/dcn30/dcn30_hwseq.c | 47 +- + .../amd/display/dc/{ => hwss}/dcn30/dcn30_hwseq.h | 3 + + .../display/dc/{ => hwss}/dcn301/dcn301_hwseq.c | 0 + .../display/dc/{ => hwss}/dcn301/dcn301_hwseq.h | 0 + .../display/dc/{ => hwss}/dcn302/dcn302_hwseq.c | 0 + .../display/dc/{ => hwss}/dcn302/dcn302_hwseq.h | 0 + .../display/dc/{ => hwss}/dcn303/dcn303_hwseq.c | 0 + .../display/dc/{ => hwss}/dcn303/dcn303_hwseq.h | 0 + .../amd/display/dc/{ => hwss}/dcn31/dcn31_hwseq.c | 2 +- + .../amd/display/dc/{ => hwss}/dcn31/dcn31_hwseq.h | 0 + .../display/dc/{ => hwss}/dcn314/dcn314_hwseq.c | 7 +- + .../display/dc/{ => hwss}/dcn314/dcn314_hwseq.h | 0 + .../amd/display/dc/{ => hwss}/dcn32/dcn32_hwseq.c | 111 +- + .../amd/display/dc/{ => hwss}/dcn32/dcn32_hwseq.h | 9 + + .../drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 1205 + + .../drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h | 85 + + .../amd/display/dc/{inc => hwss}/hw_sequencer.h | 81 +- + .../dc/{inc => hwss}/hw_sequencer_private.h | 2 + + drivers/gpu/drm/amd/display/dc/inc/core_types.h | 39 + + drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h | 10 +- + .../drm/amd/display/dc/inc/hw/clk_mgr_internal.h | 18 +- + drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h | 14 + + drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h | 1 + + drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h | 6 + + drivers/gpu/drm/amd/display/dc/inc/hw/pg_cntl.h | 52 + + .../gpu/drm/amd/display/dc/inc/hw/stream_encoder.h | 5 + + .../drm/amd/display/dc/inc/hw/timing_generator.h | 1 + + drivers/gpu/drm/amd/display/dc/inc/link.h | 1 + + drivers/gpu/drm/amd/display/dc/inc/resource.h | 291 +- + drivers/gpu/drm/amd/display/dc/irq/Makefile | 9 + + .../amd/display/dc/irq/dce110/irq_service_dce110.c | 12 +- + .../amd/display/dc/irq/dce120/irq_service_dce120.c | 12 +- + .../amd/display/dc/irq/dce60/irq_service_dce60.c | 12 +- + .../amd/display/dc/irq/dce80/irq_service_dce80.c | 12 +- + .../amd/display/dc/irq/dcn10/irq_service_dcn10.c | 14 +- + .../amd/display/dc/irq/dcn20/irq_service_dcn20.c | 14 +- + .../amd/display/dc/irq/dcn201/irq_service_dcn201.c | 14 +- + .../amd/display/dc/irq/dcn21/irq_service_dcn21.c | 16 +- + .../amd/display/dc/irq/dcn30/irq_service_dcn30.c | 16 +- + .../amd/display/dc/irq/dcn302/irq_service_dcn302.c | 16 +- + .../amd/display/dc/irq/dcn303/irq_service_dcn303.c | 14 +- + .../amd/display/dc/irq/dcn31/irq_service_dcn31.c | 16 +- + .../amd/display/dc/irq/dcn314/irq_service_dcn314.c | 16 +- + .../amd/display/dc/irq/dcn315/irq_service_dcn315.c | 16 +- + .../amd/display/dc/irq/dcn32/irq_service_dcn32.c | 16 +- + .../amd/display/dc/irq/dcn35/irq_service_dcn35.c | 427 + + .../amd/display/dc/irq/dcn35/irq_service_dcn35.h | 34 + + drivers/gpu/drm/amd/display/dc/irq/irq_service.h | 2 +- + drivers/gpu/drm/amd/display/dc/link/Makefile | 4 +- + .../amd/display/dc/link/accessories/link_dp_cts.c | 117 +- + .../amd/display/dc/link/accessories/link_fpga.c | 95 - + .../drm/amd/display/dc/link/hwss/link_hwss_dpia.c | 2 + + .../gpu/drm/amd/display/dc/link/link_detection.c | 9 + + drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 61 +- + drivers/gpu/drm/amd/display/dc/link/link_factory.c | 4 +- + .../drm/amd/display/dc/link/protocols/link_ddc.c | 2 + + .../display/dc/link/protocols/link_dp_capability.c | 14 +- + .../dc/link/protocols/link_dp_irq_handler.c | 2 + + .../amd/display/dc/link/protocols/link_dp_phy.c | 3 +- + .../dc/link/protocols/link_edp_panel_control.c | 52 +- + .../dc/link/protocols/link_edp_panel_control.h | 3 + + drivers/gpu/drm/amd/display/dc/os_types.h | 1 + + drivers/gpu/drm/amd/display/dmub/dmub_srv.h | 52 +- + drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h | 222 +- + drivers/gpu/drm/amd/display/dmub/src/Makefile | 1 + + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.c | 62 +- + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.h | 17 +- + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c | 552 + + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.h | 282 + + drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 94 +- + drivers/gpu/drm/amd/display/include/dal_types.h | 2 + + .../drm/amd/display/include/ddc_service_types.h | 1 + + drivers/gpu/drm/amd/display/include/logger_types.h | 143 +- + .../drm/amd/display/modules/color/color_gamma.c | 115 +- + .../drm/amd/display/modules/freesync/freesync.c | 9 +- + .../gpu/drm/amd/display/modules/inc/mod_stats.h | 2 +- + .../drm/amd/display/modules/power/power_helpers.c | 20 +- + drivers/gpu/drm/amd/include/amd_shared.h | 7 + + .../amd/include/asic_reg/dcn/dcn_3_5_0_offset.h | 15255 +++++ + .../amd/include/asic_reg/dcn/dcn_3_5_0_sh_mask.h | 53412 +++++++++++++++++ + .../drm/amd/include/asic_reg/gc/gc_11_5_0_offset.h | 10000 ++++ + .../amd/include/asic_reg/gc/gc_11_5_0_sh_mask.h | 36579 ++++++++++++ + .../include/asic_reg/mmhub/mmhub_3_3_0_offset.h | 1395 + + .../include/asic_reg/mmhub/mmhub_3_3_0_sh_mask.h | 6722 +++ + .../amd/include/asic_reg/mp/mp_13_0_6_sh_mask.h | 28 + + .../drm/amd/include/asic_reg/mp/mp_14_0_0_offset.h | 359 + + .../amd/include/asic_reg/mp/mp_14_0_0_sh_mask.h | 534 + + .../amd/include/asic_reg/nbio/nbio_7_11_0_offset.h | 9400 +++ + .../include/asic_reg/nbio/nbio_7_11_0_sh_mask.h | 57857 +++++++++++++++++++ + .../amd/include/asic_reg/umc/umc_12_0_0_offset.h | 33 + + .../amd/include/asic_reg/umc/umc_12_0_0_sh_mask.h | 95 + + .../amd/include/asic_reg/vcn/vcn_4_0_0_offset.h | 422 + + .../amd/include/asic_reg/vcn/vcn_4_0_0_sh_mask.h | 882 + + .../amd/include/asic_reg/vcn/vcn_4_0_5_offset.h | 1797 + + .../amd/include/asic_reg/vcn/vcn_4_0_5_sh_mask.h | 8614 +++ + .../amd/include/asic_reg/vpe/vpe_6_1_0_offset.h | 1553 + + .../amd/include/asic_reg/vpe/vpe_6_1_0_sh_mask.h | 4393 ++ + .../drm/amd/include/ivsrcid/vpe/irqsrcs_vpe_6_1.h | 40 + + drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 16 +- + drivers/gpu/drm/amd/include/kgd_pp_interface.h | 165 +- + drivers/gpu/drm/amd/include/pptable.h | 4 +- + drivers/gpu/drm/amd/include/soc15_hw_ip.h | 1 + + drivers/gpu/drm/amd/include/soc15_ih_clientid.h | 2 + + drivers/gpu/drm/amd/include/umsch_mm_4_0_api_def.h | 437 + + drivers/gpu/drm/amd/pm/Makefile | 1 + + drivers/gpu/drm/amd/pm/amdgpu_dpm.c | 36 +- + drivers/gpu/drm/amd/pm/amdgpu_pm.c | 945 +- + drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h | 19 +- + drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 2 +- + .../gpu/drm/amd/pm/powerplay/hwmgr/pptable_v1_0.h | 16 +- + .../gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.h | 2 +- + .../gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c | 4 +- + .../drm/amd/pm/powerplay/hwmgr/vega10_thermal.c | 4 +- + .../drm/amd/pm/powerplay/hwmgr/vega20_thermal.c | 4 +- + drivers/gpu/drm/amd/pm/swsmu/Makefile | 2 +- + drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 201 +- + drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 35 +- + .../pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_6.h | 91 + + .../pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0_0.h | 282 + + .../amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h | 6 +- + .../amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h | 10 +- + .../amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_pmfw.h | 157 + + .../amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_ppsmc.h | 143 + + drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h | 23 +- + drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h | 4 +- + drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h | 230 + + drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 307 +- + drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 108 +- + .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 158 +- + drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c | 36 +- + drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 77 +- + drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 8 +- + drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 289 +- + drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 36 +- + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 523 +- + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c | 2 +- + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c | 2 +- + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c | 1058 +- + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 472 +- + .../gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c | 18 +- + drivers/gpu/drm/amd/pm/swsmu/smu14/Makefile | 30 + + drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c | 1727 + + .../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c | 1269 + + .../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.h | 28 + + drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 3 + + drivers/gpu/drm/amd/pm/swsmu/smu_internal.h | 2 +- + drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c | 2 +- + drivers/gpu/drm/arm/display/komeda/komeda_drv.c | 9 + + drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 7 + + drivers/gpu/drm/arm/display/komeda/komeda_kms.h | 1 + + .../drm/arm/display/komeda/komeda_pipeline_state.c | 9 +- + drivers/gpu/drm/arm/hdlcd_drv.c | 6 + + drivers/gpu/drm/arm/malidp_drv.c | 6 + + drivers/gpu/drm/armada/armada_drv.c | 8 + + drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 7 + + drivers/gpu/drm/ast/ast_drv.c | 6 + + drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 6 + + drivers/gpu/drm/bridge/Kconfig | 2 + + drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 4 +- + drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 11 +- + drivers/gpu/drm/bridge/analogix/anx7625.c | 3 + + drivers/gpu/drm/bridge/cadence/Kconfig | 1 + + drivers/gpu/drm/bridge/chipone-icn6211.c | 2 +- + drivers/gpu/drm/bridge/ite-it66121.c | 33 +- + drivers/gpu/drm/bridge/lontium-lt8912b.c | 22 +- + drivers/gpu/drm/bridge/lontium-lt9211.c | 2 +- + drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 2 +- + drivers/gpu/drm/bridge/lvds-codec.c | 12 +- + drivers/gpu/drm/bridge/panel.c | 19 +- + drivers/gpu/drm/bridge/samsung-dsim.c | 80 +- + drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c | 6 +- + drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 - + drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 2 - + drivers/gpu/drm/bridge/tc358767.c | 2 +- + drivers/gpu/drm/bridge/tc358768.c | 385 +- + drivers/gpu/drm/bridge/ti-dlpc3433.c | 2 +- + drivers/gpu/drm/bridge/ti-sn65dsi83.c | 2 +- + drivers/gpu/drm/display/drm_dp_cec.c | 23 +- + drivers/gpu/drm/display/drm_dp_helper.c | 47 +- + drivers/gpu/drm/display/drm_dp_mst_topology.c | 168 +- + drivers/gpu/drm/drm_atomic.c | 4 +- + drivers/gpu/drm/drm_atomic_helper.c | 3 + + drivers/gpu/drm/drm_auth.c | 3 +- + drivers/gpu/drm/drm_bridge.c | 4 +- + drivers/gpu/drm/drm_bridge_connector.c | 38 +- + drivers/gpu/drm/drm_buddy.c | 136 +- + drivers/gpu/drm/drm_client.c | 4 +- + drivers/gpu/drm/drm_connector.c | 17 +- + drivers/gpu/drm/drm_crtc_internal.h | 2 +- + drivers/gpu/drm/drm_debugfs.c | 200 +- + drivers/gpu/drm/drm_drv.c | 28 +- + drivers/gpu/drm/drm_edid.c | 40 +- + drivers/gpu/drm/drm_file.c | 48 +- + drivers/gpu/drm/drm_framebuffer.c | 68 +- + drivers/gpu/drm/{drm_gpuva_mgr.c => drm_gpuvm.c} | 407 +- + drivers/gpu/drm/drm_internal.h | 31 +- + drivers/gpu/drm/drm_ioctl.c | 3 + + drivers/gpu/drm/drm_lease.c | 4 +- + drivers/gpu/drm/drm_mode_config.c | 2 - + drivers/gpu/drm/drm_sysfs.c | 22 +- + drivers/gpu/drm/drm_vblank_work.c | 3 + + drivers/gpu/drm/exynos/exynos_drm_dsi.c | 2 +- + drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 8 + + drivers/gpu/drm/gma500/gma_display.h | 1 - + drivers/gpu/drm/gma500/oaktrail_lvds_i2c.c | 2 +- + drivers/gpu/drm/gma500/psb_drv.h | 9 +- + drivers/gpu/drm/gma500/psb_intel_drv.h | 14 - + drivers/gpu/drm/gma500/psb_irq.c | 5 + + drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 6 + + drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 9 + + drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 6 + + drivers/gpu/drm/i915/Makefile | 51 +- + drivers/gpu/drm/i915/display/g4x_dp.c | 10 +- + drivers/gpu/drm/i915/display/g4x_dp.h | 26 + + drivers/gpu/drm/i915/display/g4x_hdmi.c | 6 +- + drivers/gpu/drm/i915/display/g4x_hdmi.h | 12 + + drivers/gpu/drm/i915/display/hsw_ips.c | 1 + + drivers/gpu/drm/i915/display/hsw_ips.h | 35 + + drivers/gpu/drm/i915/display/i9xx_plane.c | 1 + + drivers/gpu/drm/i915/display/i9xx_plane.h | 23 + + drivers/gpu/drm/i915/display/i9xx_wm.h | 17 + + drivers/gpu/drm/i915/display/icl_dsi.c | 13 +- + drivers/gpu/drm/i915/display/intel_acpi.c | 2 +- + drivers/gpu/drm/i915/display/intel_atomic.c | 2 + + drivers/gpu/drm/i915/display/intel_atomic_plane.c | 14 +- + drivers/gpu/drm/i915/display/intel_audio.c | 6 +- + drivers/gpu/drm/i915/display/intel_audio.h | 3 +- + drivers/gpu/drm/i915/display/intel_bios.c | 26 +- + drivers/gpu/drm/i915/display/intel_cdclk.c | 107 +- + drivers/gpu/drm/i915/display/intel_color.c | 156 +- + drivers/gpu/drm/i915/display/intel_color.h | 2 + + drivers/gpu/drm/i915/display/intel_color_regs.h | 286 + + drivers/gpu/drm/i915/display/intel_combo_phy.c | 17 +- + drivers/gpu/drm/i915/display/intel_connector.c | 6 +- + drivers/gpu/drm/i915/display/intel_connector.h | 2 +- + drivers/gpu/drm/i915/display/intel_crt.c | 66 +- + drivers/gpu/drm/i915/display/intel_crt.h | 14 + + drivers/gpu/drm/i915/display/intel_crtc.c | 118 +- + drivers/gpu/drm/i915/display/intel_crtc.h | 6 +- + .../gpu/drm/i915/display/intel_crtc_state_dump.c | 3 + + drivers/gpu/drm/i915/display/intel_cx0_phy.c | 212 +- + drivers/gpu/drm/i915/display/intel_cx0_phy.h | 17 +- + drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h | 13 + + drivers/gpu/drm/i915/display/intel_ddi.c | 40 +- + drivers/gpu/drm/i915/display/intel_display.c | 494 +- + drivers/gpu/drm/i915/display/intel_display.h | 8 +- + drivers/gpu/drm/i915/display/intel_display_core.h | 3 + + .../gpu/drm/i915/display/intel_display_debugfs.c | 38 +- + .../gpu/drm/i915/display/intel_display_device.c | 158 +- + .../gpu/drm/i915/display/intel_display_device.h | 41 +- + .../gpu/drm/i915/display/intel_display_driver.c | 8 + + drivers/gpu/drm/i915/display/intel_display_irq.c | 4 +- + drivers/gpu/drm/i915/display/intel_display_power.c | 10 +- + drivers/gpu/drm/i915/display/intel_display_power.h | 1 - + .../gpu/drm/i915/display/intel_display_power_map.c | 63 +- + .../drm/i915/display/intel_display_power_well.c | 52 +- + .../drm/i915/display/intel_display_power_well.h | 1 + + drivers/gpu/drm/i915/display/intel_display_types.h | 57 +- + drivers/gpu/drm/i915/display/intel_display_wa.c | 48 + + drivers/gpu/drm/i915/display/intel_display_wa.h | 13 + + drivers/gpu/drm/i915/display/intel_dmc.c | 4 +- + drivers/gpu/drm/i915/display/intel_dp.c | 1104 +- + drivers/gpu/drm/i915/display/intel_dp.h | 39 +- + drivers/gpu/drm/i915/display/intel_dp_aux.c | 49 +- + .../gpu/drm/i915/display/intel_dp_aux_backlight.c | 4 +- + drivers/gpu/drm/i915/display/intel_dp_aux_regs.h | 80 +- + drivers/gpu/drm/i915/display/intel_dp_hdcp.c | 87 +- + .../gpu/drm/i915/display/intel_dp_link_training.c | 14 +- + drivers/gpu/drm/i915/display/intel_dp_mst.c | 220 +- + drivers/gpu/drm/i915/display/intel_dpio_phy.h | 96 + + drivers/gpu/drm/i915/display/intel_dpll.c | 57 +- + drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 987 +- + drivers/gpu/drm/i915/display/intel_dpll_mgr.h | 33 +- + drivers/gpu/drm/i915/display/intel_dpt.c | 2 +- + drivers/gpu/drm/i915/display/intel_drrs.c | 1 + + drivers/gpu/drm/i915/display/intel_dsb.c | 235 +- + drivers/gpu/drm/i915/display/intel_dsb.h | 9 +- + drivers/gpu/drm/i915/display/intel_dsb_regs.h | 31 + + drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 3 + + drivers/gpu/drm/i915/display/intel_dvo.c | 13 +- + drivers/gpu/drm/i915/display/intel_dvo.h | 6 + + drivers/gpu/drm/i915/display/intel_fb.c | 63 +- + drivers/gpu/drm/i915/display/intel_fb_pin.c | 3 +- + drivers/gpu/drm/i915/display/intel_fbc.c | 183 +- + drivers/gpu/drm/i915/display/intel_fbc.h | 2 + + drivers/gpu/drm/i915/display/intel_fdi.c | 169 +- + drivers/gpu/drm/i915/display/intel_fdi.h | 8 + + drivers/gpu/drm/i915/display/intel_frontbuffer.c | 35 +- + drivers/gpu/drm/i915/display/intel_frontbuffer.h | 4 + + drivers/gpu/drm/i915/display/intel_gmbus.c | 7 +- + drivers/gpu/drm/i915/display/intel_hdcp.c | 41 +- + drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 617 +- + drivers/gpu/drm/i915/display/intel_hdcp_gsc.h | 1 + + .../gpu/drm/i915/display/intel_hdcp_gsc_message.c | 590 + + .../gpu/drm/i915/display/intel_hdcp_gsc_message.h | 72 + + drivers/gpu/drm/i915/display/intel_hdmi.c | 123 +- + drivers/gpu/drm/i915/display/intel_hotplug.c | 87 +- + drivers/gpu/drm/i915/display/intel_hotplug_irq.c | 24 +- + drivers/gpu/drm/i915/display/intel_link_bw.c | 212 + + drivers/gpu/drm/i915/display/intel_link_bw.h | 37 + + drivers/gpu/drm/i915/display/intel_lpe_audio.h | 18 + + drivers/gpu/drm/i915/display/intel_lspcon.c | 29 +- + drivers/gpu/drm/i915/display/intel_lvds.c | 33 +- + drivers/gpu/drm/i915/display/intel_lvds.h | 19 + + .../gpu/drm/i915/display/intel_modeset_verify.c | 134 +- + .../gpu/drm/i915/display/intel_modeset_verify.h | 11 +- + drivers/gpu/drm/i915/display/intel_overlay.c | 2 + + drivers/gpu/drm/i915/display/intel_overlay.h | 35 + + drivers/gpu/drm/i915/display/intel_panel.c | 19 +- + drivers/gpu/drm/i915/display/intel_pch_display.h | 53 + + drivers/gpu/drm/i915/display/intel_pch_refclk.c | 7 +- + drivers/gpu/drm/i915/display/intel_pch_refclk.h | 23 + + drivers/gpu/drm/i915/display/intel_plane_initial.c | 3 +- + drivers/gpu/drm/i915/display/intel_pmdemand.c | 2 +- + drivers/gpu/drm/i915/display/intel_psr.c | 82 +- + drivers/gpu/drm/i915/display/intel_psr.h | 3 +- + drivers/gpu/drm/i915/display/intel_sdvo.c | 387 +- + drivers/gpu/drm/i915/display/intel_sdvo.h | 13 + + drivers/gpu/drm/i915/display/intel_sdvo_regs.h | 2 +- + drivers/gpu/drm/i915/display/intel_snps_phy.c | 9 +- + drivers/gpu/drm/i915/display/intel_snps_phy.h | 3 +- + drivers/gpu/drm/i915/display/intel_sprite.c | 1 + + drivers/gpu/drm/i915/display/intel_sprite.h | 8 + + drivers/gpu/drm/i915/display/intel_tc.c | 66 +- + drivers/gpu/drm/i915/display/intel_tc.h | 3 +- + drivers/gpu/drm/i915/display/intel_tv.c | 2 +- + drivers/gpu/drm/i915/display/intel_tv.h | 6 + + drivers/gpu/drm/i915/display/intel_vblank.c | 14 + + drivers/gpu/drm/i915/display/intel_vblank.h | 1 + + drivers/gpu/drm/i915/display/intel_vdsc.c | 628 +- + drivers/gpu/drm/i915/display/intel_vdsc_regs.h | 371 +- + drivers/gpu/drm/i915/display/intel_vga.c | 18 +- + drivers/gpu/drm/i915/display/intel_vrr.c | 20 +- + drivers/gpu/drm/i915/display/intel_vrr.h | 1 + + drivers/gpu/drm/i915/display/intel_wm.c | 2 +- + drivers/gpu/drm/i915/display/skl_universal_plane.c | 22 +- + drivers/gpu/drm/i915/display/skl_watermark.c | 40 +- + drivers/gpu/drm/i915/display/skl_watermark.h | 6 +- + drivers/gpu/drm/i915/display/vlv_dsi.c | 130 + + drivers/gpu/drm/i915/display/vlv_dsi.h | 13 + + drivers/gpu/drm/i915/display/vlv_dsi_pll.h | 9 + + drivers/gpu/drm/i915/gem/i915_gem_clflush.c | 3 +- + drivers/gpu/drm/i915/gem/i915_gem_create.c | 4 +- + drivers/gpu/drm/i915/gem/i915_gem_domain.c | 2 +- + drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 24 +- + drivers/gpu/drm/i915/gem/i915_gem_object.c | 1 + + drivers/gpu/drm/i915/gem/i915_gem_object.h | 89 - + .../gpu/drm/i915/gem/i915_gem_object_frontbuffer.h | 103 + + drivers/gpu/drm/i915/gem/i915_gem_phys.c | 1 + + drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 42 +- + .../drm/i915/gem/selftests/i915_gem_client_blt.c | 39 +- + drivers/gpu/drm/i915/gem/selftests/mock_context.c | 2 +- + drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 17 +- + drivers/gpu/drm/i915/gt/gen8_ppgtt.c | 36 +- + drivers/gpu/drm/i915/gt/intel_engine.h | 2 + + drivers/gpu/drm/i915/gt/intel_engine_cs.c | 74 +- + drivers/gpu/drm/i915/gt/intel_engine_pm.c | 2 +- + drivers/gpu/drm/i915/gt/intel_engine_regs.h | 1 + + drivers/gpu/drm/i915/gt/intel_engine_types.h | 13 +- + drivers/gpu/drm/i915/gt/intel_engine_user.c | 17 +- + .../gpu/drm/i915/gt/intel_execlists_submission.c | 4 +- + drivers/gpu/drm/i915/gt/intel_ggtt.c | 265 +- + drivers/gpu/drm/i915/gt/intel_gsc.c | 11 +- + drivers/gpu/drm/i915/gt/intel_gt.c | 77 +- + drivers/gpu/drm/i915/gt/intel_gt.h | 72 +- + drivers/gpu/drm/i915/gt/intel_gt_mcr.c | 28 +- + drivers/gpu/drm/i915/gt/intel_gt_mcr.h | 1 + + drivers/gpu/drm/i915/gt/intel_gt_pm.c | 20 + + drivers/gpu/drm/i915/gt/intel_gt_pm.h | 1 + + drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c | 1 - + drivers/gpu/drm/i915/gt/intel_gt_print.h | 3 + + drivers/gpu/drm/i915/gt/intel_gt_regs.h | 11 +- + drivers/gpu/drm/i915/gt/intel_gtt.c | 5 + + drivers/gpu/drm/i915/gt/intel_gtt.h | 9 +- + drivers/gpu/drm/i915/gt/intel_lrc.c | 74 +- + drivers/gpu/drm/i915/gt/intel_mocs.c | 25 +- + drivers/gpu/drm/i915/gt/intel_rc6.c | 9 +- + drivers/gpu/drm/i915/gt/intel_reset.c | 60 +- + drivers/gpu/drm/i915/gt/intel_reset.h | 2 + + drivers/gpu/drm/i915/gt/intel_rps.c | 2 +- + drivers/gpu/drm/i915/gt/intel_tlb.c | 16 +- + drivers/gpu/drm/i915/gt/intel_workarounds.c | 424 +- + drivers/gpu/drm/i915/gt/selftest_migrate.c | 2 +- + drivers/gpu/drm/i915/gt/selftest_tlb.c | 11 +- + drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h | 33 + + drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c | 8 +- + .../drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c | 20 +- + .../drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h | 6 + + drivers/gpu/drm/i915/gt/uc/intel_guc.c | 70 +- + drivers/gpu/drm/i915/gt/uc/intel_guc.h | 39 + + drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c | 4 +- + drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c | 46 +- + drivers/gpu/drm/i915/gt/uc/intel_guc_ct.h | 2 + + drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h | 2 + + drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c | 63 - + drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h | 2 - + drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 249 +- + drivers/gpu/drm/i915/gt/uc/intel_uc.c | 7 + + drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c | 40 +- + drivers/gpu/drm/i915/gvt/gvt.h | 9 +- + drivers/gpu/drm/i915/gvt/interrupt.c | 17 + + drivers/gpu/drm/i915/gvt/interrupt.h | 31 +- + drivers/gpu/drm/i915/gvt/mmio_context.c | 8 + + drivers/gpu/drm/i915/gvt/mmio_context.h | 10 - + drivers/gpu/drm/i915/i915_debugfs.c | 12 +- + drivers/gpu/drm/i915/i915_driver.c | 20 +- + drivers/gpu/drm/i915/i915_driver.h | 4 +- + drivers/gpu/drm/i915/i915_drv.h | 88 +- + drivers/gpu/drm/i915/i915_gem.c | 2 +- + drivers/gpu/drm/i915/i915_getparam.c | 2 +- + drivers/gpu/drm/i915/i915_gpu_error.c | 15 +- + drivers/gpu/drm/i915/i915_irq.c | 2 + + drivers/gpu/drm/i915/i915_params.c | 5 - + drivers/gpu/drm/i915/i915_params.h | 1 - + drivers/gpu/drm/i915/i915_pci.c | 5 +- + drivers/gpu/drm/i915/i915_perf.c | 118 +- + drivers/gpu/drm/i915/i915_perf_types.h | 6 - + drivers/gpu/drm/i915/i915_pmu.c | 9 +- + drivers/gpu/drm/i915/i915_reg.h | 290 +- + drivers/gpu/drm/i915/i915_scatterlist.h | 10 + + drivers/gpu/drm/i915/i915_ttm_buddy_manager.c | 23 +- + drivers/gpu/drm/i915/i915_vma.c | 1 + + drivers/gpu/drm/i915/i915_vma_resource.c | 2 +- + drivers/gpu/drm/i915/intel_clock_gating.c | 60 +- + drivers/gpu/drm/i915/intel_device_info.c | 50 - + drivers/gpu/drm/i915/intel_device_info.h | 6 +- + drivers/gpu/drm/i915/intel_gvt_mmio_table.c | 4 +- + drivers/gpu/drm/i915/intel_runtime_pm.c | 1 - + drivers/gpu/drm/i915/intel_runtime_pm.h | 4 +- + drivers/gpu/drm/i915/intel_step.c | 6 + + drivers/gpu/drm/i915/intel_step.h | 1 + + drivers/gpu/drm/i915/intel_wakeref.c | 52 +- + drivers/gpu/drm/i915/pxp/intel_pxp.c | 40 +- + drivers/gpu/drm/i915/pxp/intel_pxp.h | 2 +- + .../gpu/drm/i915/pxp/intel_pxp_cmd_interface_43.h | 4 +- + drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.c | 17 +- + drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.h | 10 +- + drivers/gpu/drm/i915/pxp/intel_pxp_huc.c | 4 +- + drivers/gpu/drm/i915/pxp/intel_pxp_pm.c | 18 +- + drivers/gpu/drm/i915/pxp/intel_pxp_pm.h | 5 +- + drivers/gpu/drm/i915/pxp/intel_pxp_tee.c | 21 +- + drivers/gpu/drm/i915/pxp/intel_pxp_types.h | 9 + + drivers/gpu/drm/i915/selftests/i915_request.c | 2 +- + drivers/gpu/drm/i915/selftests/igt_spinner.c | 3 + + drivers/gpu/drm/i915/selftests/mock_gem_device.c | 3 +- + drivers/gpu/drm/i915/soc/intel_gmch.c | 14 + + drivers/gpu/drm/i915/soc/intel_gmch.h | 2 + + drivers/gpu/drm/i915/soc/intel_pch.c | 12 +- + drivers/gpu/drm/i915/soc/intel_pch.h | 2 + + drivers/gpu/drm/imx/dcss/dcss-drv.c | 8 + + drivers/gpu/drm/imx/dcss/dcss-kms.c | 7 + + drivers/gpu/drm/imx/dcss/dcss-kms.h | 1 + + drivers/gpu/drm/imx/ipuv3/dw_hdmi-imx.c | 6 +- + drivers/gpu/drm/imx/ipuv3/imx-drm-core.c | 13 +- + drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 5 +- + drivers/gpu/drm/imx/ipuv3/imx-tve.c | 5 +- + drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c | 5 +- + drivers/gpu/drm/imx/ipuv3/parallel-display.c | 6 +- + drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 70 +- + drivers/gpu/drm/ingenic/ingenic-ipu.c | 5 +- + drivers/gpu/drm/logicvc/logicvc_drm.c | 9 + + drivers/gpu/drm/loongson/lsdc_drv.c | 6 + + drivers/gpu/drm/loongson/lsdc_pixpll.c | 6 +- + drivers/gpu/drm/mcde/mcde_drv.c | 9 + + drivers/gpu/drm/mediatek/mtk_disp_aal.c | 87 +- + drivers/gpu/drm/mediatek/mtk_disp_drv.h | 5 +- + drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 203 +- + drivers/gpu/drm/mediatek/mtk_dp.c | 42 +- + drivers/gpu/drm/mediatek/mtk_dp_reg.h | 23 +- + drivers/gpu/drm/mediatek/mtk_dpi.c | 9 + + drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 83 +- + drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 6 +- + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 34 +- + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 17 + + drivers/gpu/drm/mediatek/mtk_drm_drv.c | 47 +- + drivers/gpu/drm/mediatek/mtk_drm_drv.h | 15 +- + drivers/gpu/drm/mediatek/mtk_drm_gem.c | 9 +- + drivers/gpu/drm/mediatek/mtk_drm_plane.c | 41 +- + drivers/gpu/drm/mediatek/mtk_dsi.c | 48 +- + drivers/gpu/drm/mgag200/mgag200_drv.c | 8 + + drivers/gpu/drm/msm/Makefile | 1 + + drivers/gpu/drm/msm/adreno/a6xx.xml.h | 9 + + drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 209 +- + drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 3 + + drivers/gpu/drm/msm/adreno/a6xx_gmu.xml.h | 8 + + drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 663 +- + drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 69 +- + drivers/gpu/drm/msm/adreno/a6xx_gpu_state.h | 65 +- + drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 88 + + drivers/gpu/drm/msm/adreno/adreno_device.c | 39 +- + drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 +- + drivers/gpu/drm/msm/adreno/adreno_gpu.h | 32 +- + .../drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h | 4 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h | 4 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h | 8 - + .../drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h | 10 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h | 3 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h | 8 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h | 3 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h | 1 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 3 - + .../drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h | 1 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h | 1 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h | 8 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h | 6 - + .../drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h | 13 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h | 12 - + .../gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h | 48 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h | 8 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 55 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 6 +- + .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 62 +- + .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 4 +- + .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 53 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 3 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 20 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 160 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 20 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 58 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 1 + + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 43 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 3 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 21 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 12 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 23 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 21 + + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 4 + + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 20 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 7 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 145 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 42 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 6 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 72 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c | 30 +- + drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h | 4 - + drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 118 +- + drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 111 +- + drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c | 2 +- + drivers/gpu/drm/msm/dp/dp_display.c | 66 +- + drivers/gpu/drm/msm/dp/dp_display.h | 1 + + drivers/gpu/drm/msm/dp/dp_drm.c | 21 +- + drivers/gpu/drm/msm/dp/dp_drm.h | 2 +- + drivers/gpu/drm/msm/dp/dp_link.c | 38 +- + drivers/gpu/drm/msm/dp/dp_panel.c | 132 +- + drivers/gpu/drm/msm/dp/dp_panel.h | 11 +- + drivers/gpu/drm/msm/dsi/dsi.c | 40 +- + drivers/gpu/drm/msm/dsi/dsi.h | 5 +- + drivers/gpu/drm/msm/dsi/dsi.xml.h | 1 + + drivers/gpu/drm/msm/dsi/dsi_host.c | 47 +- + drivers/gpu/drm/msm/dsi/dsi_manager.c | 30 +- + drivers/gpu/drm/msm/hdmi/hdmi.c | 28 +- + drivers/gpu/drm/msm/hdmi/hdmi.h | 5 +- + drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 30 +- + drivers/gpu/drm/msm/hdmi/hdmi_hpd.c | 3 +- + drivers/gpu/drm/msm/hdmi/hdmi_phy.c | 6 +- + drivers/gpu/drm/msm/msm_debugfs.c | 12 +- + drivers/gpu/drm/msm/msm_drv.c | 371 +- + drivers/gpu/drm/msm/msm_drv.h | 17 +- + drivers/gpu/drm/msm/msm_kms.c | 345 + + drivers/gpu/drm/msm/msm_kms.h | 3 + + drivers/gpu/drm/msm/msm_mdss.c | 6 +- + drivers/gpu/drm/msm/msm_ringbuffer.h | 2 + + drivers/gpu/drm/nouveau/Kconfig | 1 + + drivers/gpu/drm/nouveau/dispnv04/disp.c | 2 +- + drivers/gpu/drm/nouveau/dispnv50/disp.c | 536 +- + drivers/gpu/drm/nouveau/dispnv50/disp.h | 6 +- + drivers/gpu/drm/nouveau/dispnv50/head.h | 1 + + drivers/gpu/drm/nouveau/dispnv50/headc57d.c | 14 + + drivers/gpu/drm/nouveau/include/nvif/conn.h | 20 +- + drivers/gpu/drm/nouveau/include/nvif/if0011.h | 21 +- + drivers/gpu/drm/nouveau/include/nvif/if0012.h | 251 +- + drivers/gpu/drm/nouveau/include/nvif/outp.h | 96 +- + drivers/gpu/drm/nouveau/include/nvkm/core/memory.h | 1 + + .../gpu/drm/nouveau/include/nvkm/subdev/instmem.h | 2 +- + drivers/gpu/drm/nouveau/nouveau_backlight.c | 90 +- + drivers/gpu/drm/nouveau/nouveau_bios.c | 8 +- + drivers/gpu/drm/nouveau/nouveau_connector.c | 251 +- + drivers/gpu/drm/nouveau/nouveau_connector.h | 3 +- + drivers/gpu/drm/nouveau/nouveau_debugfs.c | 2 +- + drivers/gpu/drm/nouveau/nouveau_display.c | 8 +- + drivers/gpu/drm/nouveau/nouveau_dp.c | 345 +- + drivers/gpu/drm/nouveau/nouveau_drm.c | 5 +- + drivers/gpu/drm/nouveau/nouveau_encoder.h | 30 +- + drivers/gpu/drm/nouveau/nouveau_exec.c | 4 +- + drivers/gpu/drm/nouveau/nouveau_uvmm.c | 42 +- + drivers/gpu/drm/nouveau/nouveau_uvmm.h | 8 +- + drivers/gpu/drm/nouveau/nvif/client.c | 2 +- + drivers/gpu/drm/nouveau/nvif/conn.c | 36 +- + drivers/gpu/drm/nouveau/nvif/disp.c | 2 +- + drivers/gpu/drm/nouveau/nvif/outp.c | 414 +- + drivers/gpu/drm/nouveau/nvkm/core/firmware.c | 3 +- + drivers/gpu/drm/nouveau/nvkm/core/memory.c | 15 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c | 146 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/conn.c | 10 - + drivers/gpu/drm/nouveau/nvkm/engine/disp/conn.h | 2 - + drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c | 362 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/g84.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/g94.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/ga102.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c | 2 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/gk104.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/gm200.c | 17 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/gp100.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/gt215.c | 38 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c | 2 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h | 15 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp89.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c | 182 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c | 146 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.h | 43 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/tu102.c | 1 + + drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c | 67 +- + drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c | 508 +- + drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c | 10 +- + drivers/gpu/drm/nouveau/nvkm/engine/pm/base.c | 7 +- + drivers/gpu/drm/nouveau/nvkm/engine/pm/priv.h | 2 +- + .../gpu/drm/nouveau/nvkm/subdev/devinit/tu102.c | 12 +- + drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c | 19 +- + drivers/gpu/drm/nouveau/nvkm/subdev/instmem/priv.h | 1 + + drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp100.c | 2 +- + drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c | 2 +- + drivers/gpu/drm/omapdrm/omap_drv.c | 8 + + drivers/gpu/drm/panel/Kconfig | 20 + + drivers/gpu/drm/panel/Makefile | 2 + + drivers/gpu/drm/panel/panel-arm-versatile.c | 2 + + .../gpu/drm/panel/panel-asus-z00t-tm5p5-n35596.c | 9 - + drivers/gpu/drm/panel/panel-boe-bf060y8m-aj0.c | 9 - + drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 8 +- + drivers/gpu/drm/panel/panel-jdi-fhd-r63452.c | 9 - + drivers/gpu/drm/panel/panel-jdi-lpm102a188a.c | 551 + + drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 4 - + drivers/gpu/drm/panel/panel-leadtek-ltk050h3146w.c | 97 +- + drivers/gpu/drm/panel/panel-newvision-nv3051d.c | 7 + + drivers/gpu/drm/panel/panel-novatek-nt35950.c | 9 - + drivers/gpu/drm/panel/panel-novatek-nt36523.c | 12 - + drivers/gpu/drm/panel/panel-orisetech-otm8009a.c | 17 - + drivers/gpu/drm/panel/panel-raydium-rm68200.c | 38 - + drivers/gpu/drm/panel/panel-raydium-rm692e5.c | 423 + + drivers/gpu/drm/panel/panel-samsung-s6e63m0.c | 25 - + .../drm/panel/panel-samsung-s6e88a0-ams452ef01.c | 10 - + drivers/gpu/drm/panel/panel-samsung-sofef00.c | 9 - + drivers/gpu/drm/panel/panel-sharp-ls060t1sx01.c | 10 - + drivers/gpu/drm/panel/panel-simple.c | 82 + + drivers/gpu/drm/panel/panel-sony-td4353-jdi.c | 9 - + .../gpu/drm/panel/panel-sony-tulip-truly-nt35521.c | 18 - + .../gpu/drm/panel/panel-startek-kd070fhfid015.c | 11 - + drivers/gpu/drm/panel/panel-tpo-tpg110.c | 2 + + drivers/gpu/drm/panel/panel-truly-nt35597.c | 20 - + drivers/gpu/drm/panel/panel-visionox-r66451.c | 16 - + drivers/gpu/drm/panel/panel-visionox-rm69299.c | 8 - + drivers/gpu/drm/panel/panel-visionox-vtdr6130.c | 9 - + drivers/gpu/drm/panfrost/Makefile | 2 + + drivers/gpu/drm/panfrost/panfrost_debugfs.c | 21 + + drivers/gpu/drm/panfrost/panfrost_debugfs.h | 14 + + drivers/gpu/drm/panfrost/panfrost_devfreq.c | 8 + + drivers/gpu/drm/panfrost/panfrost_devfreq.h | 3 + + drivers/gpu/drm/panfrost/panfrost_device.c | 2 + + drivers/gpu/drm/panfrost/panfrost_device.h | 13 + + drivers/gpu/drm/panfrost/panfrost_drv.c | 60 +- + drivers/gpu/drm/panfrost/panfrost_gem.c | 30 + + drivers/gpu/drm/panfrost/panfrost_gem.h | 5 + + drivers/gpu/drm/panfrost/panfrost_gpu.c | 45 +- + drivers/gpu/drm/panfrost/panfrost_gpu.h | 4 + + drivers/gpu/drm/panfrost/panfrost_job.c | 28 +- + drivers/gpu/drm/panfrost/panfrost_job.h | 5 + + drivers/gpu/drm/panfrost/panfrost_mmu.c | 5 +- + drivers/gpu/drm/panfrost/panfrost_regs.h | 5 + + drivers/gpu/drm/pl111/pl111_drv.c | 7 + + drivers/gpu/drm/qxl/qxl_drv.c | 7 + + drivers/gpu/drm/radeon/evergreen.c | 7 +- + drivers/gpu/drm/radeon/pptable.h | 2 +- + drivers/gpu/drm/radeon/radeon.h | 4 - + drivers/gpu/drm/radeon/radeon_connectors.c | 2 + + drivers/gpu/drm/radeon/radeon_drv.c | 2 - + drivers/gpu/drm/radeon/radeon_fence.c | 111 +- + drivers/gpu/drm/radeon/radeon_gem.c | 16 - + drivers/gpu/drm/radeon/radeon_ttm.c | 2 - + drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 6 +- + drivers/gpu/drm/rockchip/cdn-dp-core.c | 17 +- + drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 23 +- + drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 24 +- + drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 45 +- + drivers/gpu/drm/rockchip/rockchip_lvds.c | 2 +- + drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 2 +- + drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 55 + + drivers/gpu/drm/solomon/ssd130x.c | 241 +- + drivers/gpu/drm/solomon/ssd130x.h | 4 +- + drivers/gpu/drm/sti/sti_drv.c | 7 + + drivers/gpu/drm/stm/drv.c | 7 + + drivers/gpu/drm/sun4i/sun4i_drv.c | 6 + + drivers/gpu/drm/tegra/dc.c | 9 +- + drivers/gpu/drm/tegra/drm.h | 3 - + drivers/gpu/drm/tegra/dsi.c | 1 + + drivers/gpu/drm/tegra/gem.c | 32 +- + drivers/gpu/drm/tegra/hdmi.c | 3 +- + drivers/gpu/drm/tegra/hub.c | 2 +- + drivers/gpu/drm/tegra/rgb.c | 16 +- + drivers/gpu/drm/tegra/sor.c | 1 + + drivers/gpu/drm/tests/drm_format_helper_test.c | 1097 +- + drivers/gpu/drm/tilcdc/tilcdc_drv.c | 11 +- + drivers/gpu/drm/tiny/bochs.c | 6 + + drivers/gpu/drm/tiny/cirrus.c | 6 + + drivers/gpu/drm/tiny/repaper.c | 2 +- + drivers/gpu/drm/tiny/simpledrm.c | 105 + + drivers/gpu/drm/tve200/tve200_drv.c | 7 + + drivers/gpu/drm/v3d/v3d_drv.h | 2 +- + drivers/gpu/drm/vboxvideo/vbox_drv.c | 10 + + drivers/gpu/drm/vc4/vc4_drv.c | 36 +- + drivers/gpu/drm/vc4/vc4_drv.h | 2 +- + drivers/gpu/drm/virtio/virtgpu_drv.h | 9 +- + drivers/gpu/drm/vmwgfx/vmwgfx_gem.c | 6 +- + drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 6 +- + drivers/gpu/host1x/channel.c | 26 + + drivers/gpu/host1x/channel.h | 4 + + drivers/gpu/host1x/context.c | 4 +- + drivers/gpu/host1x/dev.c | 32 +- + drivers/gpu/host1x/dev.h | 3 +- + drivers/gpu/host1x/hw/intr_hw.c | 46 +- + drivers/hid/Kconfig | 8 +- + drivers/hid/hid-picolcd_fb.c | 73 +- + drivers/media/cec/core/cec-adap.c | 5 + + drivers/media/cec/core/cec-notifier.c | 5 + + drivers/staging/fbtft/Kconfig | 6 +- + drivers/staging/fbtft/fbtft-core.c | 99 +- + drivers/usb/typec/altmodes/displayport.c | 20 +- + drivers/video/fbdev/Kconfig | 35 +- + drivers/video/fbdev/Makefile | 17 +- + drivers/video/fbdev/au1200fb.c | 9 - + drivers/video/fbdev/bw2.c | 17 +- + drivers/video/fbdev/cg14.c | 19 +- + drivers/video/fbdev/cg3.c | 17 +- + drivers/video/fbdev/cg6.c | 17 +- + drivers/video/fbdev/core/Kconfig | 6 + + drivers/video/fbdev/core/Makefile | 2 + + drivers/video/fbdev/core/fb_chrdev.c | 3 +- + drivers/video/fbdev/core/fb_internal.h | 17 + + drivers/video/fbdev/core/fb_logo.c | 508 + + drivers/video/fbdev/core/fbcon.c | 2 + + drivers/video/fbdev/core/fbmem.c | 542 +- + drivers/video/fbdev/ffb.c | 17 +- + drivers/video/fbdev/hyperv_fb.c | 48 +- + drivers/video/fbdev/leo.c | 19 +- + drivers/video/fbdev/mmp/fb/mmpfb.c | 7 - + drivers/video/fbdev/p9100.c | 18 +- + drivers/video/fbdev/sbuslib.h | 37 +- + drivers/video/fbdev/smscufx.c | 85 +- + drivers/video/fbdev/tcx.c | 20 +- + drivers/video/fbdev/udlfb.c | 89 +- + include/asm-generic/fb.h | 12 +- + include/drm/bridge/samsung-dsim.h | 6 +- + include/drm/display/drm_dp_helper.h | 18 +- + include/drm/display/drm_dp_mst_helper.h | 23 +- + include/drm/drm_accel.h | 9 +- + include/drm/drm_atomic.h | 2 +- + include/drm/drm_bridge.h | 6 +- + include/drm/drm_buddy.h | 6 +- + include/drm/drm_client.h | 2 +- + include/drm/drm_connector.h | 17 +- + include/drm/drm_debugfs.h | 13 +- + include/drm/drm_device.h | 14 +- + include/drm/drm_drv.h | 8 + + include/drm/drm_edid.h | 1 + + include/drm/drm_file.h | 17 +- + include/drm/drm_fourcc.h | 5 +- + include/drm/drm_framebuffer.h | 5 - + include/drm/drm_gem.h | 9 + + include/drm/{drm_gpuva_mgr.h => drm_gpuvm.h} | 155 +- + include/drm/i915_pciids.h | 28 +- + include/linux/fb.h | 5 - + .../common => include/linux/habanalabs}/cpucp_if.h | 36 +- + .../linux/habanalabs}/hl_boot_if.h | 7 + + include/linux/iosys-map.h | 4 +- + include/linux/string.h | 40 + + include/trace/events/habanalabs.h | 45 +- + include/uapi/drm/amdgpu_drm.h | 36 +- + include/uapi/drm/habanalabs_accel.h | 68 +- + include/uapi/drm/i915_drm.h | 8 +- + include/uapi/drm/ivpu_accel.h | 18 +- + include/uapi/drm/qaic_accel.h | 24 +- + include/uapi/linux/kfd_ioctl.h | 3 + + kernel/kexec.c | 2 +- + kernel/watch_queue.c | 2 +- + 1299 files changed, 289909 insertions(+), 18111 deletions(-) + create mode 100644 Documentation/devicetree/bindings/display/lvds-data-mapping.yaml + create mode 100644 Documentation/devicetree/bindings/display/panel/jdi,lpm102a188a.yaml + create mode 100644 Documentation/devicetree/bindings/display/panel/raydium,rm692e5.yaml + create mode 100644 Documentation/gpu/panfrost.rst + create mode 100644 Documentation/userspace-api/dma-buf-alloc-exchange.rst + create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/gfxhub_v11_5_0.c + rename drivers/gpu/drm/amd/{display/dc/link/accessories/link_fpga.h => amdgpu/gfxhub_v11_5_0.h} (84%) + create mode 100644 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/mmhub_v3_3.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/mmhub_v3_3.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/nbio_v7_11.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/umc_v12_0.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/umc_v12_0.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/vpe_6_1_fw_if.h + create mode 100644 drivers/gpu/drm/amd/amdgpu/vpe_v6_1.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/vpe_v6_1.h + rename drivers/gpu/drm/amd/display/dc/{dml/calcs => basics}/bw_fixed.c (94%) + rename drivers/gpu/drm/amd/display/dc/{dml/calcs => basics}/calcs_logger.h (100%) + rename drivers/gpu/drm/amd/display/dc/{dml/calcs => basics}/custom_float.c (66%) + rename drivers/gpu/drm/amd/display/dc/{dml/calcs => basics}/dce_calcs.c (100%) + create mode 100644 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c + create mode 100644 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.h + create mode 100644 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_smu.c + create mode 100644 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_smu.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/Makefile + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dccg.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dccg.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dpp.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dpp.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dsc.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dsc.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubbub.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubbub.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubp.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubp.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_init.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_init.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_optc.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_optc.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/Makefile + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/cmntypes.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/display_mode_core_structs.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/display_mode_lib_defines.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/display_mode_util.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/display_mode_util.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_dc_resource_mgmt.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_dc_resource_mgmt.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_dc_types.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_internal_types.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_utils.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_utils.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml_assert.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml_depedencies.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml_display_rq_dlg_calc.c + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml_display_rq_dlg_calc.h + create mode 100644 drivers/gpu/drm/amd/display/dc/dml2/dml_logging.h + create mode 100644 drivers/gpu/drm/amd/display/dc/hwss/Makefile + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dce/dce_hwseq.c (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dce/dce_hwseq.h (98%) + rename drivers/gpu/drm/amd/display/dc/{dce100/dce100_hw_sequencer.c => hwss/dce100/dce100_hwseq.c} (98%) + rename drivers/gpu/drm/amd/display/dc/{dce100/dce100_hw_sequencer.h => hwss/dce100/dce100_hwseq.h} (100%) + rename drivers/gpu/drm/amd/display/dc/{dce110/dce110_hw_sequencer.c => hwss/dce110/dce110_hwseq.c} (99%) + rename drivers/gpu/drm/amd/display/dc/{dce110/dce110_hw_sequencer.h => hwss/dce110/dce110_hwseq.h} (100%) + rename drivers/gpu/drm/amd/display/dc/{dce112/dce112_hw_sequencer.c => hwss/dce112/dce112_hwseq.c} (98%) + rename drivers/gpu/drm/amd/display/dc/{dce112/dce112_hw_sequencer.h => hwss/dce112/dce112_hwseq.h} (100%) + rename drivers/gpu/drm/amd/display/dc/{dce120/dce120_hw_sequencer.c => hwss/dce120/dce120_hwseq.c} (98%) + rename drivers/gpu/drm/amd/display/dc/{dce120/dce120_hw_sequencer.h => hwss/dce120/dce120_hwseq.h} (100%) + rename drivers/gpu/drm/amd/display/dc/{dce80/dce80_hw_sequencer.c => hwss/dce80/dce80_hwseq.c} (94%) + rename drivers/gpu/drm/amd/display/dc/{dce80/dce80_hw_sequencer.h => hwss/dce80/dce80_hwseq.h} (100%) + rename drivers/gpu/drm/amd/display/dc/{dcn10/dcn10_hw_sequencer.c => hwss/dcn10/dcn10_hwseq.c} (99%) + rename drivers/gpu/drm/amd/display/dc/{dcn10/dcn10_hw_sequencer.h => hwss/dcn10/dcn10_hwseq.h} (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn20/dcn20_hwseq.c (96%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn20/dcn20_hwseq.h (97%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn201/dcn201_hwseq.c (99%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn201/dcn201_hwseq.h (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn21/dcn21_hwseq.c (99%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn21/dcn21_hwseq.h (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn30/dcn30_hwseq.c (95%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn30/dcn30_hwseq.h (98%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn301/dcn301_hwseq.c (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn301/dcn301_hwseq.h (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn302/dcn302_hwseq.c (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn302/dcn302_hwseq.h (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn303/dcn303_hwseq.c (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn303/dcn303_hwseq.h (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn31/dcn31_hwseq.c (99%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn31/dcn31_hwseq.h (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn314/dcn314_hwseq.c (99%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn314/dcn314_hwseq.h (100%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn32/dcn32_hwseq.c (94%) + rename drivers/gpu/drm/amd/display/dc/{ => hwss}/dcn32/dcn32_hwseq.h (94%) + create mode 100644 drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c + create mode 100644 drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h + rename drivers/gpu/drm/amd/display/dc/{inc => hwss}/hw_sequencer.h (93%) + rename drivers/gpu/drm/amd/display/dc/{inc => hwss}/hw_sequencer_private.h (98%) + create mode 100644 drivers/gpu/drm/amd/display/dc/inc/hw/pg_cntl.h + create mode 100644 drivers/gpu/drm/amd/display/dc/irq/dcn35/irq_service_dcn35.c + create mode 100644 drivers/gpu/drm/amd/display/dc/irq/dcn35/irq_service_dcn35.h + delete mode 100644 drivers/gpu/drm/amd/display/dc/link/accessories/link_fpga.c + create mode 100644 drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c + create mode 100644 drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_5_0_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_5_0_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_5_0_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_5_0_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_3_0_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_3_0_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/mp/mp_14_0_0_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/mp/mp_14_0_0_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_11_0_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_11_0_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/umc/umc_12_0_0_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/umc/umc_12_0_0_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_5_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_5_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/vpe/vpe_6_1_0_offset.h + create mode 100644 drivers/gpu/drm/amd/include/asic_reg/vpe/vpe_6_1_0_sh_mask.h + create mode 100644 drivers/gpu/drm/amd/include/ivsrcid/vpe/irqsrcs_vpe_6_1.h + create mode 100644 drivers/gpu/drm/amd/include/umsch_mm_4_0_api_def.h + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0_0.h + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_pmfw.h + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_ppsmc.h + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/smu14/Makefile + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c + create mode 100644 drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.h + rename drivers/gpu/drm/{drm_gpuva_mgr.c => drm_gpuvm.c} (78%) + create mode 100644 drivers/gpu/drm/i915/display/intel_color_regs.h + create mode 100644 drivers/gpu/drm/i915/display/intel_display_wa.c + create mode 100644 drivers/gpu/drm/i915/display/intel_display_wa.h + create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c + create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.h + create mode 100644 drivers/gpu/drm/i915/display/intel_link_bw.c + create mode 100644 drivers/gpu/drm/i915/display/intel_link_bw.h + create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h + create mode 100644 drivers/gpu/drm/msm/msm_kms.c + create mode 100644 drivers/gpu/drm/panel/panel-jdi-lpm102a188a.c + create mode 100644 drivers/gpu/drm/panel/panel-raydium-rm692e5.c + create mode 100644 drivers/gpu/drm/panfrost/panfrost_debugfs.c + create mode 100644 drivers/gpu/drm/panfrost/panfrost_debugfs.h + create mode 100644 drivers/video/fbdev/core/fb_logo.c + rename include/drm/{drm_gpuva_mgr.h => drm_gpuvm.h} (78%) + rename {drivers/accel/habanalabs/include/common => include/linux/habanalabs}/cpucp_if.h (98%) + rename {drivers/accel/habanalabs/include/common => include/linux/habanalabs}/hl_boot_if.h (98%) +Merging drm-ci/topic/drm-ci (ad6bfe1b66a5 drm: ci: docs: fix build warning - add missing escape) +$ git merge -m Merge branch 'topic/drm-ci' of git://git.freedesktop.org/git/drm/drm.git drm-ci/topic/drm-ci +Already up to date. +Merging drm-misc/for-linux-next (3db2420422a5 drm/panel-edp: Add AUO B116XTN02, BOE NT116WHM-N21,836X2, NV116WHM-N49 V8.0) +$ git merge -m Merge branch 'for-linux-next' of git://anongit.freedesktop.org/drm/drm-misc drm-misc/for-linux-next +Auto-merging Documentation/devicetree/bindings/vendor-prefixes.yaml +Auto-merging MAINTAINERS +Auto-merging arch/arm64/configs/defconfig +Auto-merging drivers/accel/ivpu/ivpu_drv.c +Auto-merging drivers/accel/ivpu/ivpu_fw.c +Auto-merging drivers/accel/ivpu/ivpu_hw_37xx.c +Auto-merging drivers/accel/ivpu/ivpu_hw_40xx.c +Auto-merging drivers/accel/ivpu/ivpu_ipc.c +Auto-merging drivers/accel/ivpu/ivpu_job.c +Auto-merging drivers/accel/ivpu/ivpu_pm.c +Auto-merging drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +Auto-merging drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +Auto-merging drivers/gpu/drm/amd/amdgpu/cik_sdma.c +Auto-merging drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +Auto-merging drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +Auto-merging drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +Auto-merging drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +Auto-merging drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c +Auto-merging drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c +Auto-merging drivers/gpu/drm/drm_atomic_helper.c +Auto-merging drivers/gpu/drm/nouveau/nouveau_sched.c +Auto-merging drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +Auto-merging drivers/gpu/drm/panel/panel-edp.c +Auto-merging drivers/gpu/drm/scheduler/sched_main.c +Auto-merging drivers/video/fbdev/Kconfig +Auto-merging drivers/video/fbdev/aty/atyfb_base.c +Auto-merging drivers/video/fbdev/core/Kconfig +Auto-merging drivers/video/fbdev/sa1100fb.c +Auto-merging include/drm/gpu_scheduler.h +Merge made by the 'ort' strategy. + Documentation/accel/qaic/aic100.rst | 11 +- + Documentation/accel/qaic/qaic.rst | 28 + + .../display/bridge/fsl,imx93-mipi-dsi.yaml | 115 +++ + .../display/panel/rocktech,jh057n00900.yaml | 2 + + .../bindings/display/solomon,ssd-common.yaml | 42 + + .../bindings/display/solomon,ssd1307fb.yaml | 28 +- + .../bindings/display/solomon,ssd132x.yaml | 89 ++ + .../devicetree/bindings/vendor-prefixes.yaml | 2 + + Documentation/gpu/automated_testing.rst | 20 +- + Documentation/gpu/drm-kms.rst | 2 + + Documentation/gpu/drm-uapi.rst | 8 +- + Documentation/gpu/drm-vm-bind-async.rst | 309 +++++++ + Documentation/gpu/implementation_guidelines.rst | 9 + + Documentation/gpu/index.rst | 1 + + Documentation/gpu/rfc/xe.rst | 4 +- + MAINTAINERS | 14 +- + arch/arm64/configs/defconfig | 1 + + drivers/accel/ivpu/TODO | 11 - + drivers/accel/ivpu/ivpu_drv.c | 18 +- + drivers/accel/ivpu/ivpu_fw.c | 18 +- + drivers/accel/ivpu/ivpu_fw_log.c | 6 +- + drivers/accel/ivpu/ivpu_gem.c | 30 +- + drivers/accel/ivpu/ivpu_gem.h | 22 +- + drivers/accel/ivpu/ivpu_hw_37xx.c | 63 +- + drivers/accel/ivpu/ivpu_hw_40xx.c | 8 +- + drivers/accel/ivpu/ivpu_hw_reg_io.h | 32 +- + drivers/accel/ivpu/ivpu_ipc.c | 40 +- + drivers/accel/ivpu/ivpu_job.c | 8 +- + drivers/accel/ivpu/ivpu_jsm_msg.c | 82 +- + drivers/accel/ivpu/ivpu_jsm_msg.h | 2 + + drivers/accel/ivpu/ivpu_mmu.c | 47 +- + drivers/accel/ivpu/ivpu_pm.c | 15 +- + drivers/accel/ivpu/ivpu_pm.h | 1 + + drivers/accel/qaic/Makefile | 3 +- + drivers/accel/qaic/mhi_controller.c | 42 +- + drivers/accel/qaic/mhi_controller.h | 2 +- + drivers/accel/qaic/qaic.h | 6 + + drivers/accel/qaic/qaic_data.c | 25 +- + drivers/accel/qaic/qaic_drv.c | 48 +- + drivers/accel/qaic/qaic_timesync.c | 395 +++++++++ + drivers/accel/qaic/qaic_timesync.h | 11 + + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 16 + + drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 4 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 21 - + drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 1 - + drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 5 - + drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 5 - + drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 5 - + drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 16 +- + drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 10 +- + drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 10 +- + drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c | 10 +- + drivers/gpu/drm/amd/amdgpu/si_dma.c | 5 - + drivers/gpu/drm/ast/ast_dp.c | 70 +- + drivers/gpu/drm/ast/ast_dp501.c | 38 +- + drivers/gpu/drm/ast/ast_drv.h | 83 +- + drivers/gpu/drm/ast/ast_i2c.c | 20 +- + drivers/gpu/drm/ast/ast_main.c | 24 +- + drivers/gpu/drm/ast/ast_mm.c | 4 +- + drivers/gpu/drm/ast/ast_mode.c | 200 ++--- + drivers/gpu/drm/ast/ast_post.c | 26 +- + drivers/gpu/drm/ast/ast_reg.h | 99 +++ + drivers/gpu/drm/bridge/adv7511/adv7511.h | 16 +- + drivers/gpu/drm/bridge/adv7511/adv7511_cec.c | 14 +- + drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 104 ++- + drivers/gpu/drm/bridge/adv7511/adv7533.c | 7 +- + drivers/gpu/drm/bridge/imx/Kconfig | 11 + + drivers/gpu/drm/bridge/imx/Makefile | 1 + + drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c | 917 +++++++++++++++++++++ + drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 10 +- + .../drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c | 57 +- + drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 97 ++- + drivers/gpu/drm/ci/arm.config | 1 + + drivers/gpu/drm/ci/arm64.config | 2 + + drivers/gpu/drm/ci/build.sh | 8 +- + drivers/gpu/drm/ci/build.yml | 1 + + drivers/gpu/drm/ci/gitlab-ci.yml | 38 +- + drivers/gpu/drm/ci/igt_runner.sh | 31 +- + drivers/gpu/drm/ci/image-tags.yml | 6 +- + drivers/gpu/drm/ci/lava-submit.sh | 6 +- + drivers/gpu/drm/ci/test.yml | 34 +- + drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt | 12 +- + drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt | 20 - + drivers/gpu/drm/ci/xfails/i915-amly-fails.txt | 9 + + drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt | 32 - + drivers/gpu/drm/ci/xfails/i915-apl-fails.txt | 11 - + drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt | 1 - + drivers/gpu/drm/ci/xfails/i915-cml-fails.txt | 14 +- + drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt | 38 - + drivers/gpu/drm/ci/xfails/i915-glk-fails.txt | 17 + + drivers/gpu/drm/ci/xfails/i915-glk-flakes.txt | 41 - + drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt | 7 + + drivers/gpu/drm/ci/xfails/i915-kbl-flakes.txt | 25 - + drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt | 1 - + drivers/gpu/drm/ci/xfails/i915-tgl-flakes.txt | 5 - + drivers/gpu/drm/ci/xfails/i915-whl-flakes.txt | 1 - + .../gpu/drm/ci/xfails/mediatek-mt8173-flakes.txt | 0 + .../gpu/drm/ci/xfails/mediatek-mt8183-fails.txt | 5 +- + .../gpu/drm/ci/xfails/mediatek-mt8183-flakes.txt | 14 - + drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt | 14 +- + drivers/gpu/drm/ci/xfails/meson-g12b-flakes.txt | 4 - + drivers/gpu/drm/ci/xfails/msm-apq8016-flakes.txt | 4 - + drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt | 2 + + drivers/gpu/drm/ci/xfails/msm-apq8096-flakes.txt | 4 - + drivers/gpu/drm/ci/xfails/msm-sc7180-fails.txt | 15 +- + drivers/gpu/drm/ci/xfails/msm-sc7180-flakes.txt | 24 +- + drivers/gpu/drm/ci/xfails/msm-sc7180-skips.txt | 18 +- + drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt | 9 +- + drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt | 19 +- + drivers/gpu/drm/ci/xfails/requirements.txt | 17 + + .../gpu/drm/ci/xfails/rockchip-rk3288-fails.txt | 6 + + .../gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt | 9 - + .../gpu/drm/ci/xfails/rockchip-rk3399-fails.txt | 40 +- + .../gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt | 28 +- + drivers/gpu/drm/ci/xfails/update-xfails.py | 204 +++++ + .../gpu/drm/ci/xfails/virtio_gpu-none-flakes.txt | 0 + drivers/gpu/drm/drm_atomic_helper.c | 4 +- + drivers/gpu/drm/drm_client.c | 13 +- + drivers/gpu/drm/drm_connector.c | 6 + + drivers/gpu/drm/drm_crtc_internal.h | 2 + + drivers/gpu/drm/drm_fourcc.c | 8 + + drivers/gpu/drm/drm_framebuffer.c | 75 +- + drivers/gpu/drm/drm_gpuvm.c | 2 +- + drivers/gpu/drm/drm_ioctl.c | 1 + + drivers/gpu/drm/etnaviv/etnaviv_sched.c | 1 + + drivers/gpu/drm/lima/lima_sched.c | 4 +- + drivers/gpu/drm/msm/msm_ringbuffer.c | 5 +- + drivers/gpu/drm/nouveau/nouveau_sched.c | 1 + + drivers/gpu/drm/panel/Kconfig | 9 + + drivers/gpu/drm/panel/Makefile | 1 + + drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 371 --------- + drivers/gpu/drm/panel/panel-edp.c | 3 + + drivers/gpu/drm/panel/panel-ilitek-ili9882t.c | 779 +++++++++++++++++ + drivers/gpu/drm/panel/panel-sitronix-st7703.c | 127 ++- + drivers/gpu/drm/panfrost/panfrost_job.c | 1 + + drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 2 +- + drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 36 +- + drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 1 + + drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 77 +- + drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 3 - + drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 55 +- + drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 66 +- + drivers/gpu/drm/scheduler/sched_entity.c | 18 +- + drivers/gpu/drm/scheduler/sched_main.c | 74 +- + drivers/gpu/drm/solomon/Kconfig | 12 +- + drivers/gpu/drm/solomon/ssd130x-i2c.c | 18 +- + drivers/gpu/drm/solomon/ssd130x-spi.c | 27 +- + drivers/gpu/drm/solomon/ssd130x.c | 525 ++++++++++-- + drivers/gpu/drm/solomon/ssd130x.h | 17 +- + drivers/gpu/drm/v3d/v3d_sched.c | 5 + + drivers/gpu/drm/vc4/vc4_regs.h | 2 +- + drivers/video/fbdev/68328fb.c | 5 +- + drivers/video/fbdev/Kconfig | 93 ++- + drivers/video/fbdev/amba-clcd.c | 5 +- + drivers/video/fbdev/amifb.c | 2 + + drivers/video/fbdev/arkfb.c | 2 + + drivers/video/fbdev/atafb.c | 2 + + drivers/video/fbdev/aty/atyfb_base.c | 3 + + drivers/video/fbdev/aty/radeon_base.c | 2 + + drivers/video/fbdev/au1100fb.c | 8 +- + drivers/video/fbdev/cirrusfb.c | 2 + + drivers/video/fbdev/cobalt_lcdfb.c | 2 + + drivers/video/fbdev/controlfb.c | 5 +- + drivers/video/fbdev/core/Kconfig | 6 + + drivers/video/fbdev/core/Makefile | 3 +- + drivers/video/fbdev/core/fb_io_fops.c | 3 + + drivers/video/fbdev/cyber2000fb.c | 2 + + drivers/video/fbdev/dnfb.c | 2 + + drivers/video/fbdev/ep93xx-fb.c | 5 +- + drivers/video/fbdev/gbefb.c | 7 +- + drivers/video/fbdev/hgafb.c | 2 + + drivers/video/fbdev/hitfb.c | 4 +- + drivers/video/fbdev/hpfb.c | 2 + + drivers/video/fbdev/i810/i810_main.c | 2 + + drivers/video/fbdev/imsttfb.c | 2 + + drivers/video/fbdev/intelfb/intelfbdrv.c | 4 +- + drivers/video/fbdev/matrox/matroxfb_base.c | 2 + + drivers/video/fbdev/matrox/matroxfb_crtc2.c | 4 +- + drivers/video/fbdev/neofb.c | 2 + + drivers/video/fbdev/nvidia/nvidia.c | 2 + + drivers/video/fbdev/omap2/omapfb/Kconfig | 4 +- + drivers/video/fbdev/omap2/omapfb/omapfb-main.c | 5 +- + drivers/video/fbdev/pm2fb.c | 2 + + drivers/video/fbdev/pm3fb.c | 2 + + drivers/video/fbdev/pvr2fb.c | 14 +- + drivers/video/fbdev/riva/fbdev.c | 2 + + drivers/video/fbdev/s1d13xxxfb.c | 25 +- + drivers/video/fbdev/s3fb.c | 2 + + drivers/video/fbdev/sa1100fb.c | 5 +- + drivers/video/fbdev/savage/savagefb_driver.c | 6 +- + drivers/video/fbdev/sis/sis_main.c | 4 +- + drivers/video/fbdev/sm501fb.c | 4 + + drivers/video/fbdev/sm712fb.c | 1 + + drivers/video/fbdev/stifb.c | 2 + + drivers/video/fbdev/sunxvr500.c | 2 + + drivers/video/fbdev/tdfxfb.c | 6 +- + drivers/video/fbdev/tgafb.c | 2 + + drivers/video/fbdev/tridentfb.c | 2 + + drivers/video/fbdev/vermilion/vermilion.c | 5 +- + drivers/video/fbdev/vga16fb.c | 2 + + drivers/video/fbdev/via/viafbdev.c | 2 + + drivers/video/fbdev/vt8623fb.c | 2 + + include/drm/bridge/dw_mipi_dsi.h | 16 + + include/drm/drm_gpuvm.h | 2 +- + include/drm/gpu_scheduler.h | 9 +- + include/uapi/drm/drm.h | 40 + + include/uapi/drm/drm_fourcc.h | 2 + + include/uapi/drm/drm_mode.h | 26 +- + 208 files changed, 5328 insertions(+), 1727 deletions(-) + create mode 100644 Documentation/devicetree/bindings/display/bridge/fsl,imx93-mipi-dsi.yaml + create mode 100644 Documentation/devicetree/bindings/display/solomon,ssd-common.yaml + create mode 100644 Documentation/devicetree/bindings/display/solomon,ssd132x.yaml + create mode 100644 Documentation/gpu/drm-vm-bind-async.rst + create mode 100644 Documentation/gpu/implementation_guidelines.rst + delete mode 100644 drivers/accel/ivpu/TODO + create mode 100644 drivers/accel/qaic/qaic_timesync.c + create mode 100644 drivers/accel/qaic/qaic_timesync.h + create mode 100644 drivers/gpu/drm/ast/ast_reg.h + create mode 100644 drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c + delete mode 100644 drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/i915-glk-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/i915-tgl-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/i915-whl-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/mediatek-mt8173-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/mediatek-mt8183-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/meson-g12b-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/msm-apq8016-flakes.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/msm-apq8096-flakes.txt + create mode 100644 drivers/gpu/drm/ci/xfails/requirements.txt + delete mode 100644 drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt + create mode 100755 drivers/gpu/drm/ci/xfails/update-xfails.py + delete mode 100644 drivers/gpu/drm/ci/xfails/virtio_gpu-none-flakes.txt + create mode 100644 drivers/gpu/drm/panel/panel-ilitek-ili9882t.c +Merging amdgpu/drm-next (dd3dd9829bf9 drm/amdgpu: Remove unused variables from amdgpu_show_fdinfo) + e5f52a84bf0a ("drm/amd: Disable ASPM for VI w/ all Intel systems") +$ git merge -m Merge branch 'drm-next' of https://gitlab.freedesktop.org/agd5f/linux amdgpu/drm-next +Auto-merging drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +Auto-merging drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +Auto-merging drivers/gpu/drm/amd/amdgpu/vi.c +CONFLICT (content): Merge conflict in drivers/gpu/drm/amd/amdgpu/vi.c +Recorded preimage for 'drivers/gpu/drm/amd/amdgpu/vi.c' +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +Recorded resolution for 'drivers/gpu/drm/amd/amdgpu/vi.c'. +[master 509b8b9e0ae7] Merge branch 'drm-next' of https://gitlab.freedesktop.org/agd5f/linux +$ git diff -M --stat --summary HEAD^.. + drivers/gpu/drm/amd/amdgpu/Makefile | 3 +- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 9 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 40 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 6 + + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 25 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 6 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c | 9 - + drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 136 ++++-- + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 5 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 17 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 8 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c | 2 +- + drivers/gpu/drm/amd/amdgpu/cik.c | 4 - + drivers/gpu/drm/amd/amdgpu/df_v4_6_2.c | 34 ++ + drivers/gpu/drm/amd/amdgpu/df_v4_6_2.h | 31 ++ + drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c | 1 + + drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c | 3 +- + drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 40 +- + drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c | 4 +- + drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c | 9 +- + drivers/gpu/drm/amd/amdgpu/nv.c | 10 +- + drivers/gpu/drm/amd/amdgpu/si.c | 2 - + drivers/gpu/drm/amd/amdgpu/soc15.c | 3 +- + drivers/gpu/drm/amd/amdgpu/soc21.c | 3 +- + drivers/gpu/drm/amd/amdgpu/umc_v12_0.c | 32 +- + drivers/gpu/drm/amd/amdgpu/umc_v8_10.c | 12 +- + drivers/gpu/drm/amd/amdgpu/vi.c | 5 +- + drivers/gpu/drm/amd/amdgpu/vpe_v6_1.c | 18 +- + drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 150 +++--- + drivers/gpu/drm/amd/amdkfd/kfd_migrate.h | 6 +- + drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 154 +++--- + drivers/gpu/drm/amd/amdkfd/kfd_svm.h | 9 +- + drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c | 7 +- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 7 +- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 48 +- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 4 + + .../drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c | 516 +++++++++++---------- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_plane.h | 2 +- + drivers/gpu/drm/amd/display/dc/core/dc.c | 26 +- + drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 11 +- + drivers/gpu/drm/amd/display/dc/dc.h | 4 +- + drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 26 +- + .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 1 + + .../gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 1 + + .../drm/amd/display/dc/dcn201/dcn201_resource.c | 1 + + .../gpu/drm/amd/display/dc/dcn21/dcn21_resource.c | 1 + + .../gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 1 + + .../drm/amd/display/dc/dcn301/dcn301_resource.c | 3 +- + .../drm/amd/display/dc/dcn302/dcn302_resource.c | 1 + + .../gpu/drm/amd/display/dc/dcn303/dcn303_dccg.h | 18 + + .../gpu/drm/amd/display/dc/dcn303/dcn303_init.c | 18 + + .../gpu/drm/amd/display/dc/dcn303/dcn303_init.h | 18 + + .../drm/amd/display/dc/dcn303/dcn303_resource.c | 19 + + .../drm/amd/display/dc/dcn303/dcn303_resource.h | 18 + + drivers/gpu/drm/amd/display/dc/dcn31/Makefile | 2 +- + .../gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c | 23 + + .../gpu/drm/amd/display/dc/dcn31/dcn31_resource.c | 1 + + .../drm/amd/display/dc/dcn314/dcn314_resource.c | 5 +- + .../drm/amd/display/dc/dcn315/dcn315_resource.c | 1 + + .../drm/amd/display/dc/dcn316/dcn316_resource.c | 1 + + drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c | 2 +- + .../gpu/drm/amd/display/dc/dcn32/dcn32_resource.c | 9 +- + .../drm/amd/display/dc/dcn321/dcn321_resource.c | 9 +- + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dpp.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dpp.h | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dsc.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dsc.h | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.h | 2 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_hubbub.c | 2 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_hubbub.h | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubp.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hubp.h | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_init.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_init.h | 2 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.c | 2 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.h | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.h | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_optc.c | 2 + + drivers/gpu/drm/amd/display/dc/dcn35/dcn35_optc.h | 2 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.c | 2 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.h | 2 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_resource.c | 7 + + .../gpu/drm/amd/display/dc/dcn35/dcn35_resource.h | 2 + + drivers/gpu/drm/amd/display/dc/dml2/Makefile | 4 +- + drivers/gpu/drm/amd/display/dc/dml2/cmntypes.h | 2 + + .../drm/amd/display/dc/dml2/display_mode_core.c | 2 + + .../display/dc/dml2/display_mode_core_structs.h | 2 + + .../amd/display/dc/dml2/display_mode_lib_defines.h | 2 + + .../drm/amd/display/dc/dml2/display_mode_util.c | 2 + + .../drm/amd/display/dc/dml2/display_mode_util.h | 2 + + .../amd/display/dc/dml2/dml2_dc_resource_mgmt.c | 148 ++++++ + .../amd/display/dc/dml2/dml2_dc_resource_mgmt.h | 2 + + .../gpu/drm/amd/display/dc/dml2/dml2_dc_types.h | 2 + + .../drm/amd/display/dc/dml2/dml2_internal_types.h | 2 + + .../drm/amd/display/dc/dml2/dml2_mall_phantom.c | 2 + + .../drm/amd/display/dc/dml2/dml2_mall_phantom.h | 2 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c | 2 + + .../amd/display/dc/dml2/dml2_translation_helper.c | 4 + + .../amd/display/dc/dml2/dml2_translation_helper.h | 2 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_utils.c | 2 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c | 2 + + drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h | 18 + + drivers/gpu/drm/amd/display/dc/dml2/dml_assert.h | 2 + + .../gpu/drm/amd/display/dc/dml2/dml_depedencies.h | 2 + + drivers/gpu/drm/amd/display/dc/dml2/dml_logging.h | 2 + + drivers/gpu/drm/amd/display/dc/hdcp/Makefile | 2 +- + .../drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 6 + + .../drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c | 21 +- + .../drm/amd/display/dc/hwss/dcn303/dcn303_hwseq.c | 19 + + .../drm/amd/display/dc/hwss/dcn303/dcn303_hwseq.h | 19 + + .../drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c | 11 + + .../drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c | 39 +- + .../drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h | 3 + + .../drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 10 +- + .../drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h | 2 + + drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h | 1 + + .../amd/display/dc/irq/dcn201/irq_service_dcn201.c | 2 +- + .../amd/display/dc/irq/dcn303/irq_service_dcn303.c | 19 + + .../amd/display/dc/irq/dcn303/irq_service_dcn303.h | 19 + + drivers/gpu/drm/amd/display/dc/irq_types.h | 6 +- + .../amd/display/dc/link/accessories/link_dp_cts.c | 6 + + drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 3 +- + .../dc/link/protocols/link_edp_panel_control.c | 11 +- + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn303.c | 19 + + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn303.h | 19 + + drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 1 + + drivers/gpu/drm/amd/display/include/signal_types.h | 1 - + drivers/gpu/drm/amd/pm/amdgpu_pm.c | 4 +- + .../gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 4 +- + drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 7 +- + .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 10 +- + drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 10 +- + drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 5 +- + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 8 +- + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c | 1 + + 137 files changed, 1461 insertions(+), 685 deletions(-) + create mode 100644 drivers/gpu/drm/amd/amdgpu/df_v4_6_2.c + create mode 100644 drivers/gpu/drm/amd/amdgpu/df_v4_6_2.h +Merging drm-intel/for-linux-next (8d68a0ac9f3f drm/i915/sprite: move sprite_name() to intel_sprite.c) +$ git merge -m Merge branch 'for-linux-next' of git://anongit.freedesktop.org/drm-intel drm-intel/for-linux-next +Auto-merging drivers/gpu/drm/i915/display/intel_display_core.h +Auto-merging drivers/gpu/drm/i915/display/intel_display_debugfs.c +Auto-merging drivers/gpu/drm/i915/display/intel_dp.c +Auto-merging drivers/gpu/drm/i915/display/intel_fb.c +Auto-merging drivers/gpu/drm/i915/i915_driver.c +Auto-merging drivers/gpu/drm/i915/i915_gpu_error.c +Merge made by the 'ort' strategy. + drivers/gpu/drm/i915/Makefile | 2 + + drivers/gpu/drm/i915/display/hsw_ips.c | 4 +- + drivers/gpu/drm/i915/display/i9xx_wm.c | 2 +- + drivers/gpu/drm/i915/display/intel_backlight.c | 9 +- + drivers/gpu/drm/i915/display/intel_bios.c | 6 +- + drivers/gpu/drm/i915/display/intel_crt.c | 4 +- + drivers/gpu/drm/i915/display/intel_cx0_phy.c | 14 ++ + drivers/gpu/drm/i915/display/intel_display.h | 3 +- + drivers/gpu/drm/i915/display/intel_display_core.h | 2 + + .../gpu/drm/i915/display/intel_display_debugfs.c | 14 ++ + .../i915/display/intel_display_debugfs_params.c | 176 +++++++++++++++++ + .../i915/display/intel_display_debugfs_params.h | 13 ++ + .../gpu/drm/i915/display/intel_display_device.c | 13 +- + .../gpu/drm/i915/display/intel_display_device.h | 1 + + .../gpu/drm/i915/display/intel_display_params.c | 217 +++++++++++++++++++++ + .../gpu/drm/i915/display/intel_display_params.h | 61 ++++++ + drivers/gpu/drm/i915/display/intel_display_power.c | 14 +- + drivers/gpu/drm/i915/display/intel_display_reset.c | 2 +- + drivers/gpu/drm/i915/display/intel_dp.c | 6 +- + drivers/gpu/drm/i915/display/intel_dp_aux.c | 99 ++++++---- + .../gpu/drm/i915/display/intel_dp_aux_backlight.c | 4 +- + drivers/gpu/drm/i915/display/intel_dp_aux_regs.h | 14 +- + drivers/gpu/drm/i915/display/intel_dpt.c | 6 +- + drivers/gpu/drm/i915/display/intel_fb.c | 6 +- + drivers/gpu/drm/i915/display/intel_fbc.c | 10 +- + drivers/gpu/drm/i915/display/intel_frontbuffer.c | 2 - + drivers/gpu/drm/i915/display/intel_lvds.c | 4 +- + drivers/gpu/drm/i915/display/intel_opregion.c | 2 +- + drivers/gpu/drm/i915/display/intel_panel.c | 4 +- + drivers/gpu/drm/i915/display/intel_psr.c | 14 +- + drivers/gpu/drm/i915/display/intel_sprite.c | 7 +- + drivers/gpu/drm/i915/display/skl_universal_plane.c | 3 +- + drivers/gpu/drm/i915/display/skl_watermark.c | 5 +- + .../gpu/drm/i915/gem/i915_gem_object_frontbuffer.h | 1 + + drivers/gpu/drm/i915/gvt/handlers.c | 1 - + drivers/gpu/drm/i915/i915_debugfs.c | 4 +- + drivers/gpu/drm/i915/i915_driver.c | 2 + + drivers/gpu/drm/i915/i915_gpu_error.c | 3 + + drivers/gpu/drm/i915/i915_gpu_error.h | 2 + + drivers/gpu/drm/i915/i915_params.c | 89 --------- + drivers/gpu/drm/i915/i915_params.h | 22 --- + drivers/gpu/drm/i915/intel_runtime_pm.h | 2 - + 42 files changed, 653 insertions(+), 216 deletions(-) + create mode 100644 drivers/gpu/drm/i915/display/intel_display_debugfs_params.c + create mode 100644 drivers/gpu/drm/i915/display/intel_display_debugfs_params.h + create mode 100644 drivers/gpu/drm/i915/display/intel_display_params.c + create mode 100644 drivers/gpu/drm/i915/display/intel_display_params.h +Merging drm-tegra/for-next (2429b3c529da drm/tegra: Avoid potential 32-bit integer overflow) +$ git merge -m Merge branch 'for-next' of https://gitlab.freedesktop.org/drm/tegra.git drm-tegra/for-next +Already up to date. +Merging drm-msm/msm-next (b08d26dac1a1 drm/msm/a7xx: actually use a7xx state registers) +$ git merge -m Merge branch 'msm-next' of https://gitlab.freedesktop.org/drm/msm.git drm-msm/msm-next +Already up to date. +Merging drm-msm-lumag/msm-next-lumag (d3b4075b173f drm/msm/dp: use correct lifetime device for devm_drm_bridge_add) +$ git merge -m Merge branch 'msm-next-lumag' of https://gitlab.freedesktop.org/lumag/msm.git drm-msm-lumag/msm-next-lumag +Already up to date. +Merging etnaviv/etnaviv/next (925b10728f20 drm/etnaviv: disable MLCG and pulse eater on GPU reset) +$ git merge -m Merge branch 'etnaviv/next' of https://git.pengutronix.de/git/lst/linux etnaviv/etnaviv/next +Merge made by the 'ort' strategy. + drivers/gpu/drm/etnaviv/etnaviv_drv.c | 95 ++++++++++++++++++++----------- + drivers/gpu/drm/etnaviv/etnaviv_gem.c | 12 ++-- + drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 13 ++++- + drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 4 +- + drivers/gpu/drm/etnaviv/etnaviv_perfmon.c | 4 +- + 5 files changed, 84 insertions(+), 44 deletions(-) +Merging fbdev/for-next (147de49d6ead fbdev: offb: Simplify offb_init_fb()) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev.git fbdev/for-next +Merge made by the 'ort' strategy. + drivers/video/fbdev/offb.c | 8 +++----- + drivers/video/fbdev/omap/omapfb_main.c | 30 +++++++++++------------------- + 2 files changed, 14 insertions(+), 24 deletions(-) +Merging regmap/for-next (798ee4f7ce56 Merge remote-tracking branch 'regmap/for-6.7' into regmap-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git regmap/for-next +Merge made by the 'ort' strategy. + drivers/base/regmap/regmap-debugfs.c | 2 +- + drivers/base/regmap/regmap-kunit.c | 68 ++++++++++++++++++++++++++++++++++-- + 2 files changed, 66 insertions(+), 4 deletions(-) +Merging sound/for-next (f71e0be5d297 ALSA: hda: cs35l41: mark cs35l41_verify_id() static) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git sound/for-next +Auto-merging MAINTAINERS +Auto-merging sound/core/pcm_native.c +Auto-merging sound/pci/hda/hda_intel.c +Auto-merging sound/soc/soc-dai.c +Auto-merging sound/soc/soc-pcm.c +CONFLICT (content): Merge conflict in sound/soc/soc-pcm.c +Auto-merging sound/soc/sof/sof-pci-dev.c +Auto-merging sound/soc/ti/ams-delta.c +Recorded preimage for 'sound/soc/soc-pcm.c' +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +Recorded resolution for 'sound/soc/soc-pcm.c'. +[master 27313e827fa3] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git +$ git diff -M --stat --summary HEAD^.. + .../bindings/sound/audio-graph-port.yaml | 20 +- + .../devicetree/bindings/sound/audio-graph.yaml | 9 +- + .../devicetree/bindings/sound/awinic,aw87390.yaml | 58 ++ + .../devicetree/bindings/sound/awinic,aw88395.yaml | 32 +- + .../devicetree/bindings/sound/cirrus,cs42l43.yaml | 4 +- + .../devicetree/bindings/sound/dai-params.yaml | 11 +- + .../devicetree/bindings/sound/dialog,da7219.yaml | 1 + + .../devicetree/bindings/sound/fsl,qmc-audio.yaml | 1 + + .../bindings/sound/mediatek,mt8188-mt6359.yaml | 1 + + .../sound/mt8186-mt6366-rt1019-rt5682s.yaml | 1 + + .../devicetree/bindings/sound/nxp,tfa9879.yaml | 44 ++ + .../devicetree/bindings/sound/pcm512x.txt | 9 +- + .../bindings/sound/qcom,lpass-tx-macro.yaml | 18 + + .../devicetree/bindings/sound/realtek,rt5616.yaml | 49 ++ + .../devicetree/bindings/sound/richtek,rtq9128.yaml | 61 ++ + Documentation/devicetree/bindings/sound/rt5616.txt | 32 - + .../bindings/sound/starfive,jh7110-pwmdac.yaml | 76 ++ + .../devicetree/bindings/sound/tas5805m.yaml | 5 +- + .../devicetree/bindings/sound/tfa9879.txt | 23 - + .../devicetree/bindings/sound/ti,pcm3168a.yaml | 1 + + Documentation/devicetree/bindings/sound/wm8782.txt | 7 + + Documentation/sound/soc/codec-to-codec.rst | 8 +- + Documentation/sound/soc/dpcm.rst | 3 +- + MAINTAINERS | 24 +- + arch/arm/mach-omap2/board-n8x0.c | 10 + + arch/arm/mach-omap2/pdata-quirks.c | 10 + + arch/sh/boards/mach-ecovec24/setup.c | 2 +- + arch/sh/boards/mach-se/7724/setup.c | 2 +- + drivers/gpio/gpiolib-of.c | 4 + + drivers/soundwire/intel.c | 2 +- + drivers/soundwire/intel_ace2x.c | 2 +- + drivers/soundwire/stream.c | 2 +- + include/linux/platform_data/omap-twl4030.h | 3 - + include/sound/cs35l41.h | 7 +- + include/sound/cs35l56.h | 3 +- + include/sound/graph_card.h | 16 +- + include/sound/hda_register.h | 2 + + include/sound/hdaudio.h | 5 +- + include/sound/hdaudio_ext.h | 3 + + include/sound/max9768.h | 4 - + include/sound/opl3.h | 2 +- + include/sound/simple_card.h | 6 +- + include/sound/simple_card_utils.h | 106 +-- + include/sound/soc-acpi-intel-match.h | 2 + + include/sound/soc-acpi.h | 7 + + include/sound/soc-card.h | 41 +- + include/sound/soc-dapm.h | 2 +- + include/sound/soc.h | 47 +- + include/sound/sof.h | 12 +- + include/sound/sof/ipc4/header.h | 32 +- + include/sound/tas2781-dsp.h | 5 + + include/sound/wavefront.h | 53 +- + include/uapi/sound/asequencer.h | 4 +- + sound/aoa/aoa-gpio.h | 1 - + sound/aoa/aoa.h | 1 - + sound/aoa/codecs/onyx.c | 1 + + sound/aoa/codecs/onyx.h | 1 - + sound/aoa/codecs/tas.c | 2 +- + sound/aoa/fabrics/layout.c | 3 +- + sound/aoa/soundbus/core.c | 2 + + sound/aoa/soundbus/i2sbus/control.c | 1 - + sound/aoa/soundbus/i2sbus/core.c | 1 + + sound/aoa/soundbus/i2sbus/i2sbus.h | 1 - + sound/aoa/soundbus/i2sbus/interface.h | 2 +- + sound/aoa/soundbus/soundbus.h | 2 +- + sound/arm/pxa2xx-pcm-lib.c | 8 +- + sound/core/control_compat.c | 2 +- + sound/core/pcm_native.c | 4 +- + sound/core/rawmidi_compat.c | 4 +- + sound/drivers/aloop.c | 76 +- + sound/hda/ext/hdac_ext_stream.c | 43 ++ + sound/hda/hdac_i915.c | 24 +- + sound/hda/hdac_stream.c | 23 +- + sound/pci/azt3328.c | 2 +- + sound/pci/hda/Kconfig | 18 + + sound/pci/hda/Makefile | 4 + + sound/pci/hda/cirrus_scodec.c | 73 ++ + sound/pci/hda/cirrus_scodec.h | 13 + + sound/pci/hda/cirrus_scodec_test.c | 370 ++++++++++ + sound/pci/hda/cs35l41_hda.c | 321 ++++++--- + sound/pci/hda/cs35l41_hda.h | 3 + + sound/pci/hda/cs35l41_hda_property.c | 11 +- + sound/pci/hda/cs35l56_hda.c | 24 +- + sound/pci/hda/hda_codec.c | 2 +- + sound/pci/hda/hda_component.h | 4 + + sound/pci/hda/hda_controller.c | 2 +- + sound/pci/hda/hda_intel.c | 62 +- + sound/pci/hda/patch_realtek.c | 83 ++- + sound/pci/intel8x0m.c | 2 +- + sound/pci/mixart/mixart_core.h | 70 +- + sound/soc/amd/acp-config.c | 70 ++ + sound/soc/amd/acp-da7219-max98357a.c | 28 +- + sound/soc/amd/acp-es8336.c | 6 +- + sound/soc/amd/acp-pcm-dma.c | 2 +- + sound/soc/amd/acp-rt5645.c | 6 +- + sound/soc/amd/acp/Makefile | 2 +- + sound/soc/amd/acp/acp-legacy-common.c | 8 +- + sound/soc/amd/acp/acp-legacy-mach.c | 102 ++- + sound/soc/amd/acp/acp-mach-common.c | 62 +- + sound/soc/amd/acp/acp-mach.h | 67 ++ + sound/soc/amd/acp/acp-renoir.c | 4 + + sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.c | 444 ++++++++++++ + sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.h | 12 + + sound/soc/amd/acp3x-rt5682-max9836.c | 12 +- + sound/soc/amd/ps/pci-ps.c | 3 +- + sound/soc/amd/ps/ps-sdw-dma.c | 2 +- + sound/soc/amd/raven/acp3x-i2s.c | 2 +- + sound/soc/amd/raven/acp3x-pcm-dma.c | 6 +- + sound/soc/amd/vangogh/acp5x-i2s.c | 2 +- + sound/soc/amd/vangogh/acp5x-mach.c | 12 +- + sound/soc/amd/vangogh/acp5x-pcm-dma.c | 6 +- + sound/soc/apple/mca.c | 28 +- + sound/soc/atmel/atmel-classd.c | 10 +- + sound/soc/atmel/atmel-pcm-dma.c | 8 +- + sound/soc/atmel/atmel-pcm-pdc.c | 4 +- + sound/soc/atmel/atmel-pdmic.c | 12 +- + sound/soc/atmel/atmel_wm8904.c | 5 +- + sound/soc/atmel/mchp-i2s-mcc.c | 2 +- + sound/soc/atmel/mikroe-proto.c | 2 +- + sound/soc/atmel/sam9g20_wm8731.c | 2 +- + sound/soc/atmel/sam9x5_wm8731.c | 2 +- + sound/soc/atmel/tse850-pcm5142.c | 1 - + sound/soc/au1x/db1200.c | 4 +- + sound/soc/au1x/dbdma2.c | 4 +- + sound/soc/au1x/dma.c | 4 +- + sound/soc/au1x/psc-ac97.c | 2 +- + sound/soc/bcm/bcm63xx-pcm-whistler.c | 28 +- + sound/soc/bcm/cygnus-pcm.c | 24 +- + sound/soc/bcm/cygnus-ssp.c | 2 +- + sound/soc/cirrus/edb93xx.c | 6 +- + sound/soc/codecs/Kconfig | 30 +- + sound/soc/codecs/Makefile | 4 + + sound/soc/codecs/adau1701.c | 1 - + sound/soc/codecs/adau1977-spi.c | 1 - + sound/soc/codecs/ak4104.c | 2 +- + sound/soc/codecs/ak4118.c | 2 +- + sound/soc/codecs/ak4375.c | 2 +- + sound/soc/codecs/ak4458.c | 2 +- + sound/soc/codecs/ak4613.c | 2 +- + sound/soc/codecs/ak4642.c | 30 +- + sound/soc/codecs/ak5386.c | 7 +- + sound/soc/codecs/ak5558.c | 2 +- + sound/soc/codecs/audio-iio-aux.c | 17 +- + sound/soc/codecs/aw87390.c | 463 ++++++++++++ + sound/soc/codecs/aw87390.h | 85 +++ + sound/soc/codecs/aw88261.c | 42 +- + sound/soc/codecs/aw88261.h | 4 +- + sound/soc/codecs/aw88395/aw88395.c | 9 +- + sound/soc/codecs/aw88395/aw88395.h | 2 +- + sound/soc/codecs/aw88395/aw88395_device.c | 47 +- + sound/soc/codecs/aw88395/aw88395_device.h | 6 +- + sound/soc/codecs/aw88395/aw88395_lib.c | 25 +- + sound/soc/codecs/aw88395/aw88395_reg.h | 1 + + sound/soc/codecs/cs35l32.c | 2 +- + sound/soc/codecs/cs35l33.c | 2 - + sound/soc/codecs/cs35l34.c | 2 +- + sound/soc/codecs/cs35l35.c | 3 +- + sound/soc/codecs/cs35l36.c | 3 +- + sound/soc/codecs/cs35l41-i2c.c | 13 +- + sound/soc/codecs/cs35l41-lib.c | 66 +- + sound/soc/codecs/cs35l41-spi.c | 11 +- + sound/soc/codecs/cs35l41.c | 94 +-- + sound/soc/codecs/cs35l41.h | 1 - + sound/soc/codecs/cs35l45-tables.c | 3 + + sound/soc/codecs/cs35l45.c | 193 ++++- + sound/soc/codecs/cs35l45.h | 36 +- + sound/soc/codecs/cs35l56-i2c.c | 3 +- + sound/soc/codecs/cs35l56-sdw.c | 2 +- + sound/soc/codecs/cs35l56-shared.c | 68 +- + sound/soc/codecs/cs35l56-spi.c | 3 +- + sound/soc/codecs/cs35l56.c | 16 +- + sound/soc/codecs/cs4270.c | 2 +- + sound/soc/codecs/cs4271.c | 22 +- + sound/soc/codecs/cs42l42.c | 1 - + sound/soc/codecs/cs42l43-jack.c | 38 +- + sound/soc/codecs/cs42l43-sdw.c | 6 +- + sound/soc/codecs/cs42l43.c | 2 +- + sound/soc/codecs/cs42l56.c | 2 +- + sound/soc/codecs/cs42xx8-i2c.c | 16 +- + sound/soc/codecs/cs43130.c | 3 +- + sound/soc/codecs/cs4349.c | 2 +- + sound/soc/codecs/cs47l15.c | 4 +- + sound/soc/codecs/cs47l24.c | 6 +- + sound/soc/codecs/cs47l35.c | 6 +- + sound/soc/codecs/cs47l85.c | 6 +- + sound/soc/codecs/cs47l90.c | 6 +- + sound/soc/codecs/cs47l92.c | 4 +- + sound/soc/codecs/da7213.c | 203 +++++- + sound/soc/codecs/da7213.h | 64 +- + sound/soc/codecs/da7218.c | 29 +- + sound/soc/codecs/da7218.h | 2 +- + sound/soc/codecs/da7219.c | 2 +- + sound/soc/codecs/da9055.c | 1 - + sound/soc/codecs/es8316.c | 50 +- + sound/soc/codecs/es8316.h | 3 + + sound/soc/codecs/es8328.c | 1 - + sound/soc/codecs/gtm601.c | 2 +- + sound/soc/codecs/hdac_hda.c | 29 + + sound/soc/codecs/hdac_hda.h | 1 + + sound/soc/codecs/hdac_hdmi.c | 13 +- + sound/soc/codecs/lpass-macro-common.c | 2 +- + sound/soc/codecs/lpass-macro-common.h | 2 + + sound/soc/codecs/lpass-tx-macro.c | 22 +- + sound/soc/codecs/lpass-wsa-macro.c | 3 + + sound/soc/codecs/max9768.c | 41 +- + sound/soc/codecs/max98357a.c | 1 - + sound/soc/codecs/max98373-i2c.c | 17 - + sound/soc/codecs/max98373.c | 35 +- + sound/soc/codecs/max98373.h | 2 +- + sound/soc/codecs/max98388.c | 3 +- + sound/soc/codecs/max98396.c | 1 - + sound/soc/codecs/max98520.c | 2 - + sound/soc/codecs/max98927.c | 2 - + sound/soc/codecs/mt6351.c | 2 +- + sound/soc/codecs/mt6358.c | 2 +- + sound/soc/codecs/mt6359-accdet.c | 4 - + sound/soc/codecs/mt6359.c | 2 +- + sound/soc/codecs/nau8540.c | 2 +- + sound/soc/codecs/nau8821.c | 3 + + sound/soc/codecs/pcm1681.c | 2 - + sound/soc/codecs/pcm512x-i2c.c | 4 + + sound/soc/codecs/pcm512x.c | 36 +- + sound/soc/codecs/rt1015.c | 13 + + sound/soc/codecs/rt5677-spi.c | 4 +- + sound/soc/codecs/rt715-sdca.c | 4 +- + sound/soc/codecs/rt715.c | 6 +- + sound/soc/codecs/rtq9128.c | 780 +++++++++++++++++++++ + sound/soc/codecs/sgtl5000.c | 2 +- + sound/soc/codecs/sigmadsp.c | 7 +- + sound/soc/codecs/sma1303.c | 2 +- + sound/soc/codecs/sta32x.c | 3 +- + sound/soc/codecs/sta350.c | 3 +- + sound/soc/codecs/tas2781-fmwlib.c | 236 +++---- + sound/soc/codecs/tas5086.c | 6 +- + sound/soc/codecs/tas571x.c | 15 +- + sound/soc/codecs/tlv320aic31xx.c | 6 +- + sound/soc/codecs/tlv320aic32x4-i2c.c | 19 +- + sound/soc/codecs/tlv320aic32x4-spi.c | 18 +- + sound/soc/codecs/tlv320aic32x4.c | 5 +- + sound/soc/codecs/tlv320aic32x4.h | 3 +- + sound/soc/codecs/uda1334.c | 2 +- + sound/soc/codecs/wm5110.c | 6 +- + sound/soc/codecs/wm8510.c | 2 +- + sound/soc/codecs/wm8523.c | 2 +- + sound/soc/codecs/wm8524.c | 2 +- + sound/soc/codecs/wm8580.c | 28 +- + sound/soc/codecs/wm8711.c | 2 +- + sound/soc/codecs/wm8728.c | 2 +- + sound/soc/codecs/wm8731-i2c.c | 2 +- + sound/soc/codecs/wm8731-spi.c | 2 +- + sound/soc/codecs/wm8737.c | 2 +- + sound/soc/codecs/wm8741.c | 2 +- + sound/soc/codecs/wm8750.c | 2 +- + sound/soc/codecs/wm8753.c | 2 +- + sound/soc/codecs/wm8770.c | 2 +- + sound/soc/codecs/wm8776.c | 2 +- + sound/soc/codecs/wm8782.c | 63 +- + sound/soc/codecs/wm8804.c | 1 - + sound/soc/codecs/wm_adsp.c | 10 +- + sound/soc/dwc/dwc-i2s.c | 2 +- + sound/soc/dwc/dwc-pcm.c | 4 +- + sound/soc/fsl/efika-audio-fabric.c | 4 +- + sound/soc/fsl/eukrea-tlv320.c | 6 +- + sound/soc/fsl/fsl-asoc-card.c | 29 +- + sound/soc/fsl/fsl_asrc_dma.c | 10 +- + sound/soc/fsl/fsl_aud2htx.c | 3 +- + sound/soc/fsl/fsl_dma.c | 2 +- + sound/soc/fsl/fsl_mqs.c | 2 +- + sound/soc/fsl/fsl_rpmsg.c | 3 +- + sound/soc/fsl/fsl_sai.c | 3 +- + sound/soc/fsl/fsl_spdif.c | 24 +- + sound/soc/fsl/fsl_ssi.c | 16 +- + sound/soc/fsl/imx-audmix.c | 18 +- + sound/soc/fsl/imx-audmux.c | 1 - + sound/soc/fsl/imx-card.c | 9 +- + sound/soc/fsl/imx-hdmi.c | 4 +- + sound/soc/fsl/imx-pcm-rpmsg.c | 14 +- + sound/soc/fsl/imx-rpmsg.c | 7 +- + sound/soc/fsl/imx-sgtl5000.c | 2 +- + sound/soc/fsl/imx-spdif.c | 2 +- + sound/soc/fsl/mpc5200_dma.c | 25 +- + sound/soc/fsl/mpc5200_psc_ac97.c | 3 +- + sound/soc/fsl/mpc5200_psc_i2s.c | 7 +- + sound/soc/fsl/mpc8610_hpcd.c | 8 +- + sound/soc/fsl/p1022_ds.c | 8 +- + sound/soc/fsl/p1022_rdk.c | 8 +- + sound/soc/fsl/pcm030-audio-fabric.c | 3 +- + sound/soc/generic/audio-graph-card.c | 116 ++- + .../soc/generic/audio-graph-card2-custom-sample.c | 32 +- + sound/soc/generic/audio-graph-card2.c | 110 ++- + sound/soc/generic/simple-card-utils.c | 219 +++--- + sound/soc/generic/simple-card.c | 149 ++-- + sound/soc/generic/test-component.c | 4 +- + sound/soc/google/chv3-i2s.c | 22 +- + sound/soc/img/img-i2s-in.c | 2 +- + sound/soc/img/img-i2s-out.c | 2 +- + sound/soc/intel/atom/sst-mfld-platform-pcm.c | 12 +- + sound/soc/intel/avs/avs.h | 38 +- + sound/soc/intel/avs/board_selection.c | 2 +- + sound/soc/intel/avs/boards/da7219.c | 21 +- + sound/soc/intel/avs/boards/es8336.c | 26 +- + sound/soc/intel/avs/boards/i2s_test.c | 57 +- + sound/soc/intel/avs/boards/max98357a.c | 18 +- + sound/soc/intel/avs/boards/max98373.c | 20 +- + sound/soc/intel/avs/boards/max98927.c | 20 +- + sound/soc/intel/avs/boards/nau8825.c | 26 +- + sound/soc/intel/avs/boards/rt274.c | 22 +- + sound/soc/intel/avs/boards/rt286.c | 27 +- + sound/soc/intel/avs/boards/rt298.c | 26 +- + sound/soc/intel/avs/boards/rt5663.c | 26 +- + sound/soc/intel/avs/boards/rt5682.c | 26 +- + sound/soc/intel/avs/boards/ssm4567.c | 22 +- + sound/soc/intel/avs/cldma.h | 4 +- + sound/soc/intel/avs/core.c | 18 +- + sound/soc/intel/avs/debugfs.c | 4 + + sound/soc/intel/avs/ipc.c | 52 +- + sound/soc/intel/avs/loader.c | 4 + + sound/soc/intel/avs/messages.c | 112 +-- + sound/soc/intel/avs/messages.h | 4 +- + sound/soc/intel/avs/path.c | 31 +- + sound/soc/intel/avs/pcm.c | 78 ++- + sound/soc/intel/avs/probes.c | 2 +- + sound/soc/intel/avs/registers.h | 4 +- + sound/soc/intel/avs/topology.c | 100 ++- + sound/soc/intel/avs/utils.h | 65 ++ + sound/soc/intel/boards/Kconfig | 39 +- + sound/soc/intel/boards/Makefile | 16 +- + sound/soc/intel/boards/bdw-rt5650.c | 6 +- + sound/soc/intel/boards/bdw-rt5677.c | 10 +- + sound/soc/intel/boards/bdw_rt286.c | 8 +- + sound/soc/intel/boards/bxt_da7219_max98357a.c | 8 +- + sound/soc/intel/boards/bxt_rt298.c | 10 +- + sound/soc/intel/boards/bytcht_cx2072x.c | 10 +- + sound/soc/intel/boards/bytcht_da7213.c | 12 +- + sound/soc/intel/boards/bytcht_es8316.c | 8 +- + sound/soc/intel/boards/bytcht_nocodec.c | 4 +- + sound/soc/intel/boards/bytcr_rt5640.c | 10 +- + sound/soc/intel/boards/bytcr_rt5651.c | 10 +- + sound/soc/intel/boards/bytcr_wm5102.c | 6 +- + sound/soc/intel/boards/cht_bsw_max98090_ti.c | 8 +- + sound/soc/intel/boards/cht_bsw_nau8824.c | 8 +- + sound/soc/intel/boards/cht_bsw_rt5645.c | 16 +- + sound/soc/intel/boards/cht_bsw_rt5672.c | 10 +- + sound/soc/intel/boards/cml_rt1011_rt5682.c | 12 +- + sound/soc/intel/boards/ehl_rt5660.c | 8 +- + sound/soc/intel/boards/glk_rt5682_max98357a.c | 12 +- + sound/soc/intel/boards/hsw_rt5640.c | 4 +- + sound/soc/intel/boards/kbl_da7219_max98357a.c | 8 +- + sound/soc/intel/boards/kbl_da7219_max98927.c | 10 +- + sound/soc/intel/boards/kbl_rt5660.c | 8 +- + sound/soc/intel/boards/kbl_rt5663_max98927.c | 12 +- + .../soc/intel/boards/kbl_rt5663_rt5514_max98927.c | 12 +- + sound/soc/intel/boards/skl_hda_dsp_generic.c | 4 +- + sound/soc/intel/boards/skl_nau88l25_max98357a.c | 14 +- + sound/soc/intel/boards/skl_nau88l25_ssm4567.c | 18 +- + sound/soc/intel/boards/skl_rt286.c | 10 +- + sound/soc/intel/boards/sof_board_helpers.c | 204 ++++++ + sound/soc/intel/boards/sof_board_helpers.h | 64 ++ + sound/soc/intel/boards/sof_cirrus_common.c | 2 +- + sound/soc/intel/boards/sof_cirrus_common.h | 9 +- + sound/soc/intel/boards/sof_cs42l42.c | 354 +++------- + .../boards/{sof_da7219_max98373.c => sof_da7219.c} | 407 ++++++----- + sound/soc/intel/boards/sof_es8336.c | 14 +- + sound/soc/intel/boards/sof_hdmi_common.h | 24 + + sound/soc/intel/boards/sof_maxim_common.c | 8 +- + sound/soc/intel/boards/sof_maxim_common.h | 13 +- + sound/soc/intel/boards/sof_nau8825.c | 373 +++------- + sound/soc/intel/boards/sof_nuvoton_common.c | 73 ++ + sound/soc/intel/boards/sof_nuvoton_common.h | 22 + + sound/soc/intel/boards/sof_pcm512x.c | 14 +- + sound/soc/intel/boards/sof_realtek_common.c | 8 +- + sound/soc/intel/boards/sof_realtek_common.h | 37 +- + sound/soc/intel/boards/sof_rt5682.c | 728 ++++++++----------- + sound/soc/intel/boards/sof_sdw.c | 305 ++++---- + sound/soc/intel/boards/sof_sdw_common.h | 21 +- + sound/soc/intel/boards/sof_sdw_cs42l42.c | 2 +- + sound/soc/intel/boards/sof_sdw_cs42l43.c | 156 +++++ + sound/soc/intel/boards/sof_sdw_hdmi.c | 32 +- + sound/soc/intel/boards/sof_sdw_maxim.c | 4 +- + sound/soc/intel/boards/sof_sdw_rt5682.c | 2 +- + sound/soc/intel/boards/sof_sdw_rt700.c | 2 +- + sound/soc/intel/boards/sof_sdw_rt711.c | 2 +- + sound/soc/intel/boards/sof_sdw_rt712_sdca.c | 6 +- + sound/soc/intel/boards/sof_sdw_rt_amp.c | 4 +- + .../soc/intel/boards/sof_sdw_rt_sdca_jack_common.c | 10 +- + sound/soc/intel/boards/sof_ssp_amp.c | 337 ++++----- + sound/soc/intel/boards/sof_ssp_common.c | 101 +++ + sound/soc/intel/boards/sof_ssp_common.h | 71 ++ + sound/soc/intel/boards/sof_wm8804.c | 4 +- + sound/soc/intel/catpt/pcm.c | 12 +- + sound/soc/intel/common/Makefile | 1 + + sound/soc/intel/common/soc-acpi-intel-adl-match.c | 19 + + sound/soc/intel/common/soc-acpi-intel-arl-match.c | 51 ++ + sound/soc/intel/common/soc-acpi-intel-jsl-match.c | 12 +- + sound/soc/intel/common/soc-acpi-intel-mtl-match.c | 150 ++++ + sound/soc/intel/common/soc-acpi-intel-rpl-match.c | 39 ++ + sound/soc/intel/keembay/kmb_platform.c | 17 +- + sound/soc/intel/skylake/skl-pcm.c | 32 +- + sound/soc/intel/skylake/skl.c | 32 +- + sound/soc/kirkwood/armada-370-db.c | 4 +- + sound/soc/kirkwood/kirkwood-dma.c | 2 +- + sound/soc/loongson/loongson_card.c | 4 +- + sound/soc/loongson/loongson_dma.c | 4 +- + sound/soc/mediatek/Kconfig | 2 + + sound/soc/mediatek/common/mtk-afe-fe-dai.c | 22 +- + .../soc/mediatek/common/mtk-afe-platform-driver.c | 4 +- + sound/soc/mediatek/common/mtk-dsp-sof-common.c | 113 ++- + sound/soc/mediatek/common/mtk-dsp-sof-common.h | 8 + + sound/soc/mediatek/mt2701/mt2701-afe-pcm.c | 6 +- + sound/soc/mediatek/mt2701/mt2701-cs42448.c | 60 +- + sound/soc/mediatek/mt2701/mt2701-wm8960.c | 6 +- + sound/soc/mediatek/mt6797/mt6797-afe-pcm.c | 6 +- + sound/soc/mediatek/mt8173/mt8173-afe-pcm.c | 4 +- + sound/soc/mediatek/mt8173/mt8173-max98090.c | 7 +- + sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c | 6 +- + sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c | 8 +- + sound/soc/mediatek/mt8173/mt8173-rt5650.c | 10 +- + sound/soc/mediatek/mt8183/mt8183-afe-pcm.c | 6 +- + sound/soc/mediatek/mt8183/mt8183-da7219-max98357.c | 16 +- + .../mt8183/mt8183-mt6358-ts3a227-max98357.c | 20 +- + sound/soc/mediatek/mt8186/mt8186-afe-gpio.c | 1 - + sound/soc/mediatek/mt8186/mt8186-afe-pcm.c | 12 +- + sound/soc/mediatek/mt8186/mt8186-mt6366-common.c | 2 +- + .../mt8186/mt8186-mt6366-da7219-max98357.c | 16 +- + .../mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c | 59 +- + sound/soc/mediatek/mt8188/mt8188-afe-pcm.c | 8 +- + sound/soc/mediatek/mt8188/mt8188-mt6359.c | 383 +++++++++- + sound/soc/mediatek/mt8192/mt8192-afe-gpio.c | 1 - + sound/soc/mediatek/mt8192/mt8192-afe-pcm.c | 6 +- + .../mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c | 24 +- + sound/soc/mediatek/mt8195/mt8195-afe-pcm.c | 10 +- + sound/soc/mediatek/mt8195/mt8195-mt6359.c | 28 +- + sound/soc/meson/aiu-fifo.c | 2 +- + sound/soc/meson/axg-card.c | 12 +- + sound/soc/meson/axg-fifo.c | 4 +- + sound/soc/meson/axg-fifo.h | 2 +- + sound/soc/meson/axg-tdm.h | 2 +- + sound/soc/meson/gx-card.c | 2 +- + sound/soc/meson/meson-card-utils.c | 6 +- + sound/soc/meson/meson-codec-glue.c | 2 +- + sound/soc/mxs/mxs-saif.c | 1 - + sound/soc/mxs/mxs-sgtl5000.c | 7 +- + sound/soc/pxa/pxa2xx-i2s.c | 4 +- + sound/soc/pxa/spitz.c | 8 +- + sound/soc/qcom/apq8016_sbc.c | 9 +- + sound/soc/qcom/apq8096.c | 10 +- + sound/soc/qcom/common.c | 8 +- + sound/soc/qcom/lpass-apq8016.c | 6 +- + sound/soc/qcom/lpass-cdc-dma.c | 19 +- + sound/soc/qcom/lpass-cpu.c | 44 +- + sound/soc/qcom/lpass-ipq806x.c | 2 +- + sound/soc/qcom/lpass-platform.c | 87 +-- + sound/soc/qcom/lpass-sc7180.c | 6 +- + sound/soc/qcom/lpass-sc7280.c | 6 +- + sound/soc/qcom/lpass.h | 2 +- + sound/soc/qcom/qdsp6/q6afe-clocks.c | 1 + + sound/soc/qcom/qdsp6/q6afe-dai.c | 1 + + sound/soc/qcom/qdsp6/q6afe.c | 1 + + sound/soc/qcom/qdsp6/q6afe.h | 2 - + sound/soc/qcom/qdsp6/q6apm-dai.c | 6 +- + sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 1 + + sound/soc/qcom/qdsp6/q6apm.h | 1 - + sound/soc/qcom/qdsp6/q6asm-dai.c | 13 +- + sound/soc/qcom/qdsp6/q6asm.c | 1 + + sound/soc/qcom/qdsp6/q6asm.h | 1 - + sound/soc/qcom/qdsp6/q6dsp-lpass-clocks.c | 1 - + sound/soc/qcom/qdsp6/q6prm-clocks.c | 2 +- + sound/soc/qcom/qdsp6/q6routing.c | 9 +- + sound/soc/qcom/sc7180.c | 21 +- + sound/soc/qcom/sc7280.c | 30 +- + sound/soc/qcom/sc8280xp.c | 10 +- + sound/soc/qcom/sdm845.c | 38 +- + sound/soc/qcom/sdw.c | 8 +- + sound/soc/qcom/sm8250.c | 12 +- + sound/soc/qcom/storm.c | 4 +- + sound/soc/rockchip/rk3288_hdmi_analog.c | 52 +- + sound/soc/rockchip/rk3399_gru_sound.c | 28 +- + sound/soc/rockchip/rockchip_i2s.c | 10 +- + sound/soc/rockchip/rockchip_i2s_tdm.c | 24 +- + sound/soc/rockchip/rockchip_max98090.c | 12 +- + sound/soc/rockchip/rockchip_pdm.c | 7 +- + sound/soc/rockchip/rockchip_rt5645.c | 10 +- + sound/soc/samsung/aries_wm8994.c | 13 +- + sound/soc/samsung/arndale.c | 12 +- + sound/soc/samsung/bells.c | 16 +- + sound/soc/samsung/i2s.c | 14 +- + sound/soc/samsung/littlemill.c | 16 +- + sound/soc/samsung/lowland.c | 4 +- + sound/soc/samsung/midas_wm1811.c | 12 +- + sound/soc/samsung/odroid.c | 9 +- + sound/soc/samsung/pcm.c | 8 +- + sound/soc/samsung/smdk_spdif.c | 4 +- + sound/soc/samsung/smdk_wm8994.c | 32 +- + sound/soc/samsung/smdk_wm8994pcm.c | 6 +- + sound/soc/samsung/snow.c | 5 +- + sound/soc/samsung/spdif.c | 14 +- + sound/soc/samsung/speyside.c | 8 +- + sound/soc/samsung/tm2_wm5110.c | 24 +- + sound/soc/samsung/tobermory.c | 8 +- + sound/soc/sh/dma-sh7760.c | 34 +- + sound/soc/sh/fsi.c | 5 +- + sound/soc/sh/migor.c | 10 +- + sound/soc/sh/rcar/core.c | 8 +- + sound/soc/sh/rcar/rsnd.h | 4 +- + sound/soc/sh/rcar/src.c | 1 + + sound/soc/sh/rcar/ssi.c | 2 + + sound/soc/sh/rz-ssi.c | 5 +- + sound/soc/soc-component.c | 24 +- + sound/soc/soc-compress.c | 36 +- + sound/soc/soc-core.c | 20 +- + sound/soc/soc-dai.c | 8 +- + sound/soc/soc-dapm.c | 14 +- + sound/soc/soc-generic-dmaengine-pcm.c | 10 +- + sound/soc/soc-link.c | 14 +- + sound/soc/soc-pcm.c | 113 +-- + sound/soc/soc-topology.c | 6 +- + sound/soc/soc-utils.c | 6 +- + sound/soc/sof/Kconfig | 2 +- + sound/soc/sof/Makefile | 6 +- + sound/soc/sof/amd/acp-pcm.c | 2 +- + sound/soc/sof/amd/acp.c | 4 +- + sound/soc/sof/amd/acp.h | 2 +- + sound/soc/sof/amd/pci-rmb.c | 10 +- + sound/soc/sof/amd/pci-rn.c | 10 +- + sound/soc/sof/amd/pci-vangogh.c | 10 +- + sound/soc/sof/core.c | 17 +- + sound/soc/sof/imx/imx8.c | 26 +- + sound/soc/sof/imx/imx8m.c | 16 +- + sound/soc/sof/imx/imx8ulp.c | 16 +- + sound/soc/sof/intel/Kconfig | 14 +- + sound/soc/sof/intel/Makefile | 3 +- + sound/soc/sof/intel/apl.c | 4 +- + sound/soc/sof/intel/bdw.c | 12 +- + sound/soc/sof/intel/byt.c | 36 +- + sound/soc/sof/intel/cnl.c | 4 +- + sound/soc/sof/intel/hda-codec.c | 1 + + sound/soc/sof/intel/hda-common-ops.c | 2 + + sound/soc/sof/intel/hda-dai-ops.c | 26 +- + sound/soc/sof/intel/hda-dai.c | 12 +- + sound/soc/sof/intel/hda-dsp.c | 3 + + sound/soc/sof/intel/hda-loader.c | 44 +- + sound/soc/sof/intel/hda-pcm.c | 4 +- + sound/soc/sof/intel/hda-stream.c | 4 +- + sound/soc/sof/intel/hda.c | 66 +- + sound/soc/sof/intel/hda.h | 8 +- + sound/soc/sof/intel/icl.c | 4 +- + sound/soc/sof/intel/mtl.c | 3 + + sound/soc/sof/intel/pci-apl.c | 36 +- + sound/soc/sof/intel/pci-cnl.c | 54 +- + sound/soc/sof/intel/pci-icl.c | 36 +- + sound/soc/sof/intel/pci-lnl.c | 10 +- + sound/soc/sof/intel/pci-mtl.c | 43 +- + sound/soc/sof/intel/pci-skl.c | 20 +- + sound/soc/sof/intel/pci-tgl.c | 144 ++-- + sound/soc/sof/intel/pci-tng.c | 10 +- + sound/soc/sof/intel/telemetry.c | 95 +++ + sound/soc/sof/intel/telemetry.h | 35 + + sound/soc/sof/intel/tgl.c | 5 +- + sound/soc/sof/ipc.c | 6 +- + sound/soc/sof/ipc3-dtrace.c | 2 +- + sound/soc/sof/ipc3-pcm.c | 6 +- + sound/soc/sof/ipc4-control.c | 175 ++++- + sound/soc/sof/ipc4-mtrace.c | 30 +- + sound/soc/sof/ipc4-pcm.c | 118 +++- + sound/soc/sof/ipc4-priv.h | 3 + + sound/soc/sof/ipc4-telemetry.c | 95 +++ + sound/soc/sof/ipc4-telemetry.h | 73 ++ + sound/soc/sof/ipc4-topology.c | 76 +- + sound/soc/sof/ipc4-topology.h | 22 +- + sound/soc/sof/ipc4.c | 40 +- + sound/soc/sof/mediatek/mt8186/mt8186.c | 28 +- + sound/soc/sof/mediatek/mt8195/mt8195.c | 18 +- + sound/soc/sof/nocodec.c | 2 +- + sound/soc/sof/ops.h | 22 +- + sound/soc/sof/pcm.c | 18 +- + sound/soc/sof/sof-acpi-dev.c | 12 +- + sound/soc/sof/sof-acpi-dev.h | 2 +- + sound/soc/sof/sof-audio.c | 7 + + sound/soc/sof/sof-client-ipc-msg-injector.c | 4 +- + sound/soc/sof/sof-client-probes.c | 6 +- + sound/soc/sof/sof-client.c | 27 +- + sound/soc/sof/sof-of-dev.c | 10 +- + sound/soc/sof/sof-of-dev.h | 2 +- + sound/soc/sof/sof-pci-dev.c | 10 +- + sound/soc/sof/sof-priv.h | 4 +- + sound/soc/sof/xtensa/core.c | 11 + + sound/soc/sprd/sprd-pcm-compress.c | 4 +- + sound/soc/sprd/sprd-pcm-dma.c | 4 +- + sound/soc/starfive/Kconfig | 9 + + sound/soc/starfive/Makefile | 1 + + sound/soc/starfive/jh7110_pwmdac.c | 529 ++++++++++++++ + sound/soc/starfive/jh7110_tdm.c | 2 +- + sound/soc/stm/stm32_adfsdm.c | 24 +- + sound/soc/stm/stm32_i2s.c | 7 +- + sound/soc/stm/stm32_sai.c | 8 +- + sound/soc/stm/stm32_sai_sub.c | 10 +- + sound/soc/stm/stm32_spdifrx.c | 8 +- + sound/soc/sunxi/sun4i-codec.c | 16 +- + sound/soc/sunxi/sun4i-i2s.c | 2 +- + sound/soc/sunxi/sun4i-spdif.c | 7 +- + sound/soc/sunxi/sun50i-codec-analog.c | 3 +- + sound/soc/sunxi/sun50i-dmic.c | 4 +- + sound/soc/sunxi/sun8i-codec-analog.c | 1 - + sound/soc/sunxi/sun8i-codec.c | 2 +- + sound/soc/tegra/tegra186_asrc.c | 3 +- + sound/soc/tegra/tegra186_dspk.c | 2 +- + sound/soc/tegra/tegra20_spdif.c | 2 +- + sound/soc/tegra/tegra210_adx.c | 3 +- + sound/soc/tegra/tegra210_amx.c | 13 +- + sound/soc/tegra/tegra210_dmic.c | 2 +- + sound/soc/tegra/tegra210_i2s.c | 2 +- + sound/soc/tegra/tegra210_mixer.c | 3 +- + sound/soc/tegra/tegra210_mvc.c | 3 +- + sound/soc/tegra/tegra210_ope.c | 3 +- + sound/soc/tegra/tegra210_peq.c | 1 - + sound/soc/tegra/tegra210_sfc.c | 1 - + sound/soc/tegra/tegra30_i2s.c | 1 - + sound/soc/tegra/tegra_asoc_machine.c | 3 +- + sound/soc/tegra/tegra_audio_graph_card.c | 24 +- + sound/soc/tegra/tegra_pcm.c | 4 +- + sound/soc/tegra/tegra_wm8903.c | 4 +- + sound/soc/ti/ams-delta.c | 4 +- + sound/soc/ti/davinci-evm.c | 17 +- + sound/soc/ti/davinci-mcasp.c | 9 +- + sound/soc/ti/j721e-evm.c | 12 +- + sound/soc/ti/n810.c | 37 +- + sound/soc/ti/omap-abe-twl6040.c | 10 +- + sound/soc/ti/omap-dmic.c | 2 +- + sound/soc/ti/omap-hdmi.c | 2 +- + sound/soc/ti/omap-mcbsp-st.c | 2 +- + sound/soc/ti/omap-mcbsp.c | 18 +- + sound/soc/ti/omap-mcpdm.c | 4 +- + sound/soc/ti/omap-twl4030.c | 22 +- + sound/soc/ti/omap3pandora.c | 69 +- + sound/soc/ti/osk5912.c | 5 +- + sound/soc/ti/rx51.c | 25 +- + sound/soc/uniphier/aio-compress.c | 22 +- + sound/soc/uniphier/aio-dma.c | 12 +- + sound/soc/ux500/mop500_ab8500.c | 14 +- + sound/soc/ux500/ux500_pcm.c | 4 +- + sound/soc/xtensa/xtfpga-i2s.c | 4 +- + sound/usb/Makefile | 2 +- + sound/usb/caiaq/device.h | 2 +- + sound/usb/mixer_quirks.c | 9 +- + .../{mixer_scarlett_gen2.c => mixer_scarlett2.c} | 608 ++++++++++++---- + sound/usb/mixer_scarlett2.h | 7 + + sound/usb/mixer_scarlett_gen2.h | 7 - + sound/usb/usx2y/usbusx2y.h | 2 +- + sound/usb/usx2y/usbusx2yaudio.c | 2 +- + sound/virtio/virtio_pcm.c | 6 +- + sound/virtio/virtio_pcm.h | 9 +- + sound/virtio/virtio_pcm_msg.c | 73 +- + sound/virtio/virtio_pcm_ops.c | 125 +++- + tools/testing/selftests/alsa/alsa-local.h | 10 + + tools/testing/selftests/alsa/conf.c | 100 +-- + tools/testing/selftests/alsa/pcm-test.c | 10 + + 656 files changed, 12214 insertions(+), 5723 deletions(-) + create mode 100644 Documentation/devicetree/bindings/sound/awinic,aw87390.yaml + create mode 100644 Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml + create mode 100644 Documentation/devicetree/bindings/sound/realtek,rt5616.yaml + create mode 100644 Documentation/devicetree/bindings/sound/richtek,rtq9128.yaml + delete mode 100644 Documentation/devicetree/bindings/sound/rt5616.txt + create mode 100644 Documentation/devicetree/bindings/sound/starfive,jh7110-pwmdac.yaml + delete mode 100644 Documentation/devicetree/bindings/sound/tfa9879.txt + create mode 100644 sound/pci/hda/cirrus_scodec.c + create mode 100644 sound/pci/hda/cirrus_scodec.h + create mode 100644 sound/pci/hda/cirrus_scodec_test.c + create mode 100644 sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.c + create mode 100644 sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.h + create mode 100644 sound/soc/codecs/aw87390.c + create mode 100644 sound/soc/codecs/aw87390.h + create mode 100644 sound/soc/codecs/rtq9128.c + create mode 100644 sound/soc/intel/avs/utils.h + create mode 100644 sound/soc/intel/boards/sof_board_helpers.c + create mode 100644 sound/soc/intel/boards/sof_board_helpers.h + rename sound/soc/intel/boards/{sof_da7219_max98373.c => sof_da7219.c} (51%) + create mode 100644 sound/soc/intel/boards/sof_hdmi_common.h + create mode 100644 sound/soc/intel/boards/sof_nuvoton_common.c + create mode 100644 sound/soc/intel/boards/sof_nuvoton_common.h + create mode 100644 sound/soc/intel/boards/sof_sdw_cs42l43.c + create mode 100644 sound/soc/intel/boards/sof_ssp_common.c + create mode 100644 sound/soc/intel/boards/sof_ssp_common.h + create mode 100644 sound/soc/intel/common/soc-acpi-intel-arl-match.c + create mode 100644 sound/soc/sof/intel/telemetry.c + create mode 100644 sound/soc/sof/intel/telemetry.h + create mode 100644 sound/soc/sof/ipc4-telemetry.c + create mode 100644 sound/soc/sof/ipc4-telemetry.h + create mode 100644 sound/soc/starfive/jh7110_pwmdac.c + rename sound/usb/{mixer_scarlett_gen2.c => mixer_scarlett2.c} (89%) + create mode 100644 sound/usb/mixer_scarlett2.h + delete mode 100644 sound/usb/mixer_scarlett_gen2.h +Merging ieee1394/for-next (a464d2f75fa1 firewire: Annotate struct fw_node with __counted_by) +$ git merge -m Merge branch 'for-next' of https://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git ieee1394/for-next +Merge made by the 'ort' strategy. + drivers/firewire/core.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +Merging sound-asoc/for-next (bdb7e1922052 ASoC: Merge up workaround for CODECs that play noise on stopped stream) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git sound-asoc/for-next +Auto-merging sound/soc/intel/skylake/skl-pcm.c +Auto-merging sound/soc/soc-pcm.c +CONFLICT (content): Merge conflict in sound/soc/soc-pcm.c +Recorded preimage for 'sound/soc/soc-pcm.c' +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +Recorded resolution for 'sound/soc/soc-pcm.c'. +[master 80618ef50b66] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git +$ git diff -M --stat --summary HEAD^.. + .../devicetree/bindings/sound/awinic,aw88395.yaml | 1 + + .../devicetree/bindings/sound/qcom,sm8250.yaml | 1 + + include/sound/simple_card_utils.h | 2 +- + sound/soc/amd/acp-config.c | 12 + + sound/soc/amd/acp/Kconfig | 18 +- + sound/soc/amd/acp/Makefile | 2 + + sound/soc/amd/acp/acp-i2s.c | 45 + + sound/soc/amd/acp/acp-legacy-common.c | 71 +- + sound/soc/amd/acp/acp-legacy-mach.c | 12 + + sound/soc/amd/acp/acp-mach-common.c | 24 + + sound/soc/amd/acp/acp-mach.h | 2 + + sound/soc/amd/acp/acp-pci.c | 23 +- + sound/soc/amd/acp/acp-platform.c | 27 +- + sound/soc/amd/acp/acp-rembrandt.c | 17 +- + sound/soc/amd/acp/acp-renoir.c | 3 + + sound/soc/amd/acp/acp63.c | 322 ++++ + sound/soc/amd/acp/acp70.c | 254 +++ + sound/soc/amd/acp/amd.h | 71 +- + sound/soc/amd/acp/chip_offset_byte.h | 1 + + sound/soc/amd/mach-config.h | 2 + + sound/soc/codecs/88pm860x-codec.c | 4 +- + sound/soc/codecs/Kconfig | 14 + + sound/soc/codecs/Makefile | 2 + + sound/soc/codecs/adau1373.c | 2 +- + sound/soc/codecs/adav80x.c | 2 +- + sound/soc/codecs/aw88261.c | 2 +- + sound/soc/codecs/aw88395/aw88395_lib.c | 3 + + sound/soc/codecs/aw88395/aw88395_reg.h | 1 + + sound/soc/codecs/aw88399.c | 1911 ++++++++++++++++++++ + sound/soc/codecs/aw88399.h | 599 ++++++ + sound/soc/codecs/cs42l43.c | 6 +- + sound/soc/codecs/es8328.c | 9 +- + sound/soc/codecs/lpass-rx-macro.c | 6 +- + sound/soc/codecs/max9867.c | 8 +- + sound/soc/codecs/rt298.c | 1 - + sound/soc/codecs/rt5682s.c | 4 +- + sound/soc/codecs/rtq9128.c | 6 +- + sound/soc/codecs/wcd9335.c | 18 +- + sound/soc/codecs/wcd938x.c | 4 +- + sound/soc/codecs/wm8962.c | 4 +- + sound/soc/codecs/wm8994.c | 2 +- + sound/soc/codecs/wm8995.c | 2 +- + sound/soc/generic/audio-graph-card.c | 2 +- + .../soc/generic/audio-graph-card2-custom-sample.c | 2 +- + sound/soc/generic/audio-graph-card2.c | 2 +- + sound/soc/generic/simple-card-utils.c | 4 +- + sound/soc/generic/simple-card.c | 2 +- + sound/soc/intel/avs/board_selection.c | 9 + + sound/soc/intel/avs/boards/Kconfig | 10 + + sound/soc/intel/avs/boards/Makefile | 2 + + sound/soc/intel/avs/boards/rt5514.c | 187 ++ + sound/soc/intel/boards/bytcr_wm5102.c | 240 ++- + sound/soc/intel/common/soc-acpi-intel-cht-match.c | 43 + + sound/soc/intel/skylake/skl-pcm.c | 3 + + sound/soc/mediatek/mt7986/mt7986-dai-etdm.c | 23 +- + sound/soc/mediatek/mt7986/mt7986-wm8960.c | 43 +- + sound/soc/mediatek/mt8183/mt8183-dai-i2s.c | 4 +- + sound/soc/mediatek/mt8186/mt8186-dai-adda.c | 2 +- + sound/soc/mediatek/mt8186/mt8186-dai-hw-gain.c | 2 +- + sound/soc/mediatek/mt8186/mt8186-dai-i2s.c | 4 +- + sound/soc/mediatek/mt8186/mt8186-dai-src.c | 4 +- + sound/soc/mediatek/mt8186/mt8186-dai-tdm.c | 2 - + sound/soc/mediatek/mt8188/mt8188-dai-etdm.c | 4 +- + sound/soc/mediatek/mt8192/mt8192-dai-adda.c | 4 +- + sound/soc/mediatek/mt8192/mt8192-dai-i2s.c | 4 +- + sound/soc/meson/axg-card.c | 2 +- + sound/soc/meson/gx-card.c | 2 +- + sound/soc/meson/meson-card-utils.c | 4 +- + sound/soc/meson/meson-card.h | 2 +- + sound/soc/qcom/lpass-apq8016.c | 2 +- + sound/soc/qcom/lpass-cpu.c | 5 +- + sound/soc/qcom/lpass-ipq806x.c | 2 +- + sound/soc/qcom/lpass-sc7180.c | 2 +- + sound/soc/qcom/lpass-sc7280.c | 2 +- + sound/soc/qcom/lpass.h | 2 +- + sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 4 +- + sound/soc/qcom/sc7180.c | 197 +- + sound/soc/rockchip/rockchip_i2s_tdm.c | 6 +- + sound/soc/samsung/speyside.c | 4 +- + sound/soc/soc-pcm.c | 8 +- + sound/soc/sof/amd/Kconfig | 9 + + sound/soc/sof/amd/Makefile | 2 + + sound/soc/sof/amd/acp-loader.c | 78 +- + sound/soc/sof/amd/acp.h | 19 +- + sound/soc/sof/amd/acp63.c | 146 ++ + sound/soc/sof/amd/pci-acp63.c | 106 ++ + sound/soc/starfive/jh7110_pwmdac.c | 5 +- + sound/soc/tegra/tegra_asoc_machine.c | 12 +- + sound/soc/tegra/tegra_audio_graph_card.c | 2 +- + sound/soc/ti/Kconfig | 5 +- + sound/soc/ti/ams-delta.c | 6 +- + sound/soc/uniphier/aio-cpu.c | 4 +- + sound/soc/uniphier/aio-ld11.c | 2 +- + sound/soc/uniphier/aio-pxs2.c | 2 +- + sound/soc/uniphier/aio.h | 2 +- + 95 files changed, 4489 insertions(+), 277 deletions(-) + create mode 100644 sound/soc/amd/acp/acp63.c + create mode 100644 sound/soc/amd/acp/acp70.c + create mode 100644 sound/soc/codecs/aw88399.c + create mode 100644 sound/soc/codecs/aw88399.h + create mode 100644 sound/soc/intel/avs/boards/rt5514.c + create mode 100644 sound/soc/sof/amd/acp63.c + create mode 100644 sound/soc/sof/amd/pci-acp63.c +Merging modules/modules-next (3111add7f414 module: Annotate struct module_notes_attrs with __counted_by) +$ git merge -m Merge branch 'modules-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules/modules-next +Auto-merging MAINTAINERS +Auto-merging include/linux/moduleparam.h +Auto-merging scripts/mod/modpost.c +CONFLICT (content): Merge conflict in scripts/mod/modpost.c +Resolved 'scripts/mod/modpost.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master f7dd3ef5b4e2] Merge branch 'modules-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git +$ git diff -M --stat --summary HEAD^.. + MAINTAINERS | 2 +- + include/linux/module_symbol.h | 2 +- + include/linux/moduleparam.h | 6 +++++- + kernel/module/decompress.c | 4 ++-- + kernel/module/stats.c | 2 +- + kernel/module/sysfs.c | 2 +- + 6 files changed, 11 insertions(+), 7 deletions(-) +$ git am -3 ../patches/0001-fix-up-for-module-Make-is_valid_name-return-bool.patch +Applying: fix up for "module: Make is_valid_name() return bool" +$ git reset HEAD^ +Unstaged changes after reset: +M scripts/mod/modpost.h +$ git add -A . +$ git commit -v -a --amend +[master bee1cf6976c8] Merge branch 'modules-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git + Date: Mon Oct 30 11:47:06 2023 +1100 +Merging input/next (28d3fe323547 Input: walkera0701 - use module_parport_driver macro to simplify the code) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git input/next +Auto-merging drivers/input/touchscreen/exc3000.c +Merge made by the 'ort' strategy. + .../devicetree/bindings/input/fsl,scu-key.yaml | 2 ++ + .../input/touchscreen/cypress,tt21000.yaml | 3 +++ + drivers/input/evdev.c | 2 +- + drivers/input/input-leds.c | 2 +- + drivers/input/joystick/walkera0701.c | 13 +--------- + drivers/input/keyboard/adp5520-keys.c | 6 ++--- + drivers/input/keyboard/cros_ec_keyb.c | 16 ++++-------- + drivers/input/keyboard/ep93xx_keypad.c | 6 ++--- + drivers/input/keyboard/iqs62x-keys.c | 6 ++--- + drivers/input/keyboard/matrix_keypad.c | 6 ++--- + drivers/input/keyboard/omap-keypad.c | 6 ++--- + drivers/input/keyboard/omap4-keypad.c | 6 ++--- + drivers/input/keyboard/samsung-keypad.c | 6 ++--- + drivers/input/keyboard/sh_keysc.c | 6 ++--- + drivers/input/keyboard/spear-keyboard.c | 6 ++--- + drivers/input/keyboard/stmpe-keypad.c | 6 ++--- + drivers/input/keyboard/tegra-kbc.c | 7 ++---- + drivers/input/misc/88pm80x_onkey.c | 5 ++-- + drivers/input/misc/axp20x-pek.c | 11 +------- + drivers/input/misc/da9052_onkey.c | 6 ++--- + drivers/input/misc/da9055_onkey.c | 6 ++--- + drivers/input/misc/ideapad_slidebar.c | 6 ++--- + drivers/input/misc/iqs269a.c | 10 ++------ + drivers/input/misc/kxtj9.c | 29 +++++++++++++--------- + drivers/input/misc/m68kspkr.c | 6 ++--- + drivers/input/misc/max8997_haptic.c | 6 ++--- + drivers/input/misc/mc13783-pwrbutton.c | 6 ++--- + drivers/input/misc/palmas-pwrbutton.c | 6 ++--- + drivers/input/misc/pcap_keys.c | 6 ++--- + drivers/input/misc/pcf50633-input.c | 6 ++--- + drivers/input/misc/pcspkr.c | 6 ++--- + drivers/input/misc/pm8941-pwrkey.c | 6 ++--- + drivers/input/misc/soc_button_array.c | 6 ++--- + drivers/input/misc/sparcspkr.c | 12 +++------ + drivers/input/misc/wistron_btns.c | 6 ++--- + drivers/input/misc/wm831x-on.c | 6 ++--- + drivers/input/mouse/cyapa.c | 14 +++-------- + drivers/input/mouse/navpoint.c | 6 ++--- + drivers/input/rmi4/rmi_bus.c | 2 +- + drivers/input/rmi4/rmi_f34.c | 2 +- + drivers/input/serio/altera_ps2.c | 6 ++--- + drivers/input/serio/ams_delta_serio.c | 6 ++--- + drivers/input/serio/apbps2.c | 6 ++--- + drivers/input/serio/arc_ps2.c | 6 ++--- + drivers/input/serio/ct82c710.c | 6 ++--- + drivers/input/serio/i8042-sparcio.h | 6 ++--- + drivers/input/serio/i8042.c | 6 ++--- + drivers/input/serio/ioc3kbd.c | 6 ++--- + drivers/input/serio/maceps2.c | 6 ++--- + drivers/input/serio/olpc_apsp.c | 6 ++--- + drivers/input/serio/ps2-gpio.c | 5 ++-- + drivers/input/serio/q40kbd.c | 6 ++--- + drivers/input/serio/rpckbd.c | 6 ++--- + drivers/input/serio/sun4i-ps2.c | 6 ++--- + drivers/input/serio/xilinx_ps2.c | 6 ++--- + drivers/input/touchscreen/ad7877.c | 12 ++++----- + drivers/input/touchscreen/ad7879-i2c.c | 7 +++--- + drivers/input/touchscreen/ad7879-spi.c | 7 +++--- + drivers/input/touchscreen/ad7879.c | 10 +++++--- + drivers/input/touchscreen/ad7879.h | 3 +++ + drivers/input/touchscreen/ads7846.c | 18 +++++--------- + drivers/input/touchscreen/cyttsp5.c | 19 ++++++++------ + drivers/input/touchscreen/da9052_tsi.c | 6 ++--- + drivers/input/touchscreen/edt-ft5x06.c | 10 ++------ + drivers/input/touchscreen/elants_i2c.c | 15 +++-------- + drivers/input/touchscreen/exc3000.c | 12 +++------ + drivers/input/touchscreen/hideep.c | 15 +++-------- + drivers/input/touchscreen/hycon-hy46xx.c | 10 ++------ + drivers/input/touchscreen/ili210x.c | 15 ++++------- + drivers/input/touchscreen/ilitek_ts_i2c.c | 12 ++------- + drivers/input/touchscreen/iqs5xx.c | 10 +++----- + drivers/input/touchscreen/mainstone-wm97xx.c | 6 ++--- + drivers/input/touchscreen/mc13783_ts.c | 6 ++--- + drivers/input/touchscreen/melfas_mip4.c | 13 ++-------- + drivers/input/touchscreen/pcap_ts.c | 6 ++--- + drivers/input/touchscreen/raydium_i2c_ts.c | 16 +++--------- + drivers/input/touchscreen/rohm_bu21023.c | 12 ++------- + drivers/input/touchscreen/s6sy761.c | 10 ++------ + drivers/input/touchscreen/stmfts.c | 10 ++------ + drivers/input/touchscreen/stmpe-ts.c | 6 ++--- + drivers/input/touchscreen/sun4i-ts.c | 6 ++--- + drivers/input/touchscreen/ti_am335x_tsc.c | 5 ++-- + drivers/input/touchscreen/tsc2004.c | 7 +++--- + drivers/input/touchscreen/tsc2005.c | 7 +++--- + drivers/input/touchscreen/tsc200x-core.c | 18 ++++++-------- + drivers/input/touchscreen/tsc200x-core.h | 1 + + drivers/input/touchscreen/wdt87xx_i2c.c | 16 +++--------- + drivers/input/touchscreen/wm831x-ts.c | 6 ++--- + drivers/input/touchscreen/wm97xx-core.c | 6 ++--- + include/linux/input.h | 2 +- + include/linux/input/mt.h | 2 +- + 91 files changed, 240 insertions(+), 471 deletions(-) +Merging block/for-next (8aa6053114f3 Merge branch 'for-6.7/block' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.dk/linux-block.git block/for-next +Auto-merging arch/alpha/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/alpha/kernel/syscalls/syscall.tbl +Auto-merging arch/arm/tools/syscall.tbl +CONFLICT (content): Merge conflict in arch/arm/tools/syscall.tbl +Auto-merging arch/arm64/include/asm/unistd.h +CONFLICT (content): Merge conflict in arch/arm64/include/asm/unistd.h +Auto-merging arch/arm64/include/asm/unistd32.h +CONFLICT (content): Merge conflict in arch/arm64/include/asm/unistd32.h +CONFLICT (modify/delete): arch/ia64/kernel/syscalls/syscall.tbl deleted in HEAD and modified in block/for-next. Version block/for-next of arch/ia64/kernel/syscalls/syscall.tbl left in tree. +Auto-merging arch/m68k/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/m68k/kernel/syscalls/syscall.tbl +Auto-merging arch/microblaze/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/microblaze/kernel/syscalls/syscall.tbl +Auto-merging arch/mips/kernel/syscalls/syscall_n32.tbl +CONFLICT (content): Merge conflict in arch/mips/kernel/syscalls/syscall_n32.tbl +Auto-merging arch/mips/kernel/syscalls/syscall_n64.tbl +CONFLICT (content): Merge conflict in arch/mips/kernel/syscalls/syscall_n64.tbl +Auto-merging arch/mips/kernel/syscalls/syscall_o32.tbl +CONFLICT (content): Merge conflict in arch/mips/kernel/syscalls/syscall_o32.tbl +Auto-merging arch/parisc/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/parisc/kernel/syscalls/syscall.tbl +Auto-merging arch/powerpc/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/powerpc/kernel/syscalls/syscall.tbl +Auto-merging arch/s390/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/s390/kernel/syscalls/syscall.tbl +Auto-merging arch/sh/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/sh/kernel/syscalls/syscall.tbl +Auto-merging arch/sparc/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/sparc/kernel/syscalls/syscall.tbl +Auto-merging arch/x86/Kconfig +Auto-merging arch/x86/entry/syscalls/syscall_32.tbl +CONFLICT (content): Merge conflict in arch/x86/entry/syscalls/syscall_32.tbl +Auto-merging arch/x86/entry/syscalls/syscall_64.tbl +Auto-merging arch/xtensa/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/xtensa/kernel/syscalls/syscall.tbl +Auto-merging block/sed-opal.c +Auto-merging drivers/md/md.c +Auto-merging drivers/md/md.h +Auto-merging drivers/md/raid5.c +Auto-merging drivers/nvme/host/auth.c +Auto-merging drivers/nvme/host/pci.c +Auto-merging drivers/nvme/target/nvmet.h +Auto-merging drivers/nvme/target/tcp.c +CONFLICT (content): Merge conflict in drivers/nvme/target/tcp.c +Auto-merging include/linux/bpf-cgroup.h +Auto-merging include/linux/sched.h +Auto-merging include/linux/syscalls.h +Auto-merging include/net/sock.h +Auto-merging include/uapi/asm-generic/unistd.h +CONFLICT (content): Merge conflict in include/uapi/asm-generic/unistd.h +Auto-merging io_uring/io_uring.c +Auto-merging io_uring/io_uring.h +Auto-merging io_uring/kbuf.c +Auto-merging io_uring/rw.c +Auto-merging kernel/bpf/cgroup.c +Auto-merging kernel/exit.c +Auto-merging kernel/sched/core.c +Auto-merging kernel/sys_ni.c +Auto-merging net/core/sock.c +Auto-merging net/socket.c +Auto-merging tools/testing/selftests/net/Makefile +Resolved 'arch/alpha/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/arm/tools/syscall.tbl' using previous resolution. +Resolved 'arch/arm64/include/asm/unistd.h' using previous resolution. +Resolved 'arch/arm64/include/asm/unistd32.h' using previous resolution. +Resolved 'arch/m68k/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/microblaze/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/mips/kernel/syscalls/syscall_n32.tbl' using previous resolution. +Resolved 'arch/mips/kernel/syscalls/syscall_n64.tbl' using previous resolution. +Resolved 'arch/mips/kernel/syscalls/syscall_o32.tbl' using previous resolution. +Resolved 'arch/parisc/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/powerpc/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/s390/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/sh/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/sparc/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/x86/entry/syscalls/syscall_32.tbl' using previous resolution. +Resolved 'arch/xtensa/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'drivers/nvme/target/tcp.c' using previous resolution. +Resolved 'include/uapi/asm-generic/unistd.h' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git rm -f arch/ia64/kernel/syscalls/syscall.tbl +rm 'arch/ia64/kernel/syscalls/syscall.tbl' +$ git commit --no-edit -v -a +[master df622de41414] Merge branch 'for-next' of git://git.kernel.dk/linux-block.git +$ git diff -M --stat --summary HEAD^.. + arch/alpha/kernel/syscalls/syscall.tbl | 3 + + arch/arm/tools/syscall.tbl | 3 + + arch/arm64/include/asm/unistd.h | 2 +- + arch/arm64/include/asm/unistd32.h | 6 + + arch/m68k/kernel/syscalls/syscall.tbl | 3 + + arch/microblaze/kernel/syscalls/syscall.tbl | 3 + + arch/mips/kernel/syscalls/syscall_n32.tbl | 3 + + arch/mips/kernel/syscalls/syscall_n64.tbl | 3 + + arch/mips/kernel/syscalls/syscall_o32.tbl | 3 + + arch/parisc/kernel/syscalls/syscall.tbl | 3 + + arch/powerpc/kernel/syscalls/syscall.tbl | 3 + + arch/powerpc/platforms/pseries/Kconfig | 6 + + arch/powerpc/platforms/pseries/Makefile | 1 + + arch/powerpc/platforms/pseries/plpks_sed_ops.c | 131 ++ + arch/s390/kernel/syscalls/syscall.tbl | 3 + + arch/sh/kernel/syscalls/syscall.tbl | 3 + + arch/sparc/kernel/syscalls/syscall.tbl | 3 + + arch/x86/Kconfig | 2 +- + arch/x86/entry/syscalls/syscall_32.tbl | 3 + + arch/x86/entry/syscalls/syscall_64.tbl | 3 + + arch/xtensa/kernel/syscalls/syscall.tbl | 3 + + block/Kconfig | 1 + + block/badblocks.c | 1680 ++++++++++++++++---- + block/blk-flush.c | 11 +- + block/blk-mq-debugfs.c | 1 - + block/blk-mq.c | 45 +- + block/blk-mq.h | 57 +- + block/partitions/ibm.c | 98 +- + block/sed-opal.c | 18 +- + drivers/block/aoe/aoenet.c | 3 +- + drivers/block/null_blk/main.c | 22 +- + drivers/block/ublk_drv.c | 348 ++-- + drivers/block/virtio_blk.c | 2 - + drivers/cdrom/cdrom.c | 1 - + drivers/md/dm-raid.c | 17 +- + drivers/md/md-autodetect.c | 4 +- + drivers/md/md-bitmap.c | 61 +- + drivers/md/md-cluster.c | 15 +- + drivers/md/md-linear.c | 28 +- + drivers/md/md-linear.h | 2 +- + drivers/md/md.c | 822 +++++----- + drivers/md/md.h | 70 +- + drivers/md/raid1.c | 6 +- + drivers/md/raid10.c | 3 - + drivers/md/raid5-cache.c | 64 +- + drivers/md/raid5.c | 103 +- + drivers/nvme/common/Kconfig | 13 + + drivers/nvme/common/Makefile | 3 +- + drivers/nvme/common/auth.c | 68 +- + drivers/nvme/common/keyring.c | 182 +++ + drivers/nvme/host/Kconfig | 24 +- + drivers/nvme/host/Makefile | 2 +- + drivers/nvme/host/auth.c | 30 +- + drivers/nvme/host/core.c | 14 +- + drivers/nvme/host/fabrics.c | 67 +- + drivers/nvme/host/fabrics.h | 9 + + drivers/nvme/host/nvme.h | 5 +- + drivers/nvme/host/pci.c | 1 - + drivers/nvme/host/sysfs.c | 27 +- + drivers/nvme/host/tcp.c | 184 ++- + drivers/nvme/target/Kconfig | 22 +- + drivers/nvme/target/auth.c | 31 +- + drivers/nvme/target/configfs.c | 128 +- + drivers/nvme/target/fc.c | 3 +- + drivers/nvme/target/nvmet.h | 11 + + drivers/nvme/target/tcp.c | 341 +++- + include/asm-generic/spinlock.h | 16 +- + include/linux/badblocks.h | 30 + + include/linux/blk-mq.h | 2 - + include/linux/bpf-cgroup.h | 9 +- + include/linux/cleanup.h | 39 +- + include/linux/io_uring.h | 19 + + include/linux/io_uring_types.h | 15 +- + include/linux/key.h | 1 + + include/linux/nvme-auth.h | 7 +- + include/linux/nvme-keyring.h | 36 + + include/linux/nvme-tcp.h | 6 + + include/linux/nvme.h | 10 + + include/linux/sched.h | 3 + + include/linux/sched/rt.h | 4 + + include/linux/sed-opal-key.h | 26 + + include/linux/syscalls.h | 10 + + include/net/sock.h | 6 +- + include/uapi/asm-generic/unistd.h | 10 +- + include/uapi/linux/futex.h | 31 +- + include/uapi/linux/io_uring.h | 20 +- + io_uring/Makefile | 4 +- + io_uring/cancel.c | 10 + + io_uring/cancel.h | 4 + + io_uring/futex.c | 386 +++++ + io_uring/futex.h | 36 + + io_uring/io_uring.c | 50 +- + io_uring/io_uring.h | 1 + + io_uring/kbuf.c | 58 +- + io_uring/opdef.c | 58 +- + io_uring/opdef.h | 2 + + io_uring/poll.c | 2 +- + io_uring/rsrc.c | 39 +- + io_uring/rw.c | 92 +- + io_uring/rw.h | 2 + + io_uring/uring_cmd.c | 102 +- + io_uring/waitid.c | 372 +++++ + io_uring/waitid.h | 15 + + kernel/bpf/cgroup.c | 25 +- + kernel/exit.c | 131 +- + kernel/exit.h | 30 + + kernel/futex/core.c | 74 +- + kernel/futex/futex.h | 106 +- + kernel/futex/pi.c | 91 +- + kernel/futex/requeue.c | 23 +- + kernel/futex/syscalls.c | 235 ++- + kernel/futex/waitwake.c | 131 +- + kernel/locking/rtmutex.c | 37 +- + kernel/locking/rwbase_rt.c | 8 + + kernel/locking/rwsem.c | 8 +- + kernel/locking/spinlock_rt.c | 6 + + kernel/locking/test-ww_mutex.c | 48 +- + kernel/locking/ww_rt_mutex.c | 2 +- + kernel/sched/core.c | 64 +- + kernel/sys_ni.c | 3 + + net/core/sock.c | 8 - + net/socket.c | 104 +- + security/keys/key.c | 1 + + tools/include/io_uring/mini_liburing.h | 282 ++++ + tools/include/uapi/linux/io_uring.h | 757 +++++++++ + tools/testing/selftests/bpf/prog_tests/sockopt.c | 113 +- + tools/testing/selftests/net/Makefile | 1 + + tools/testing/selftests/net/io_uring_zerocopy_tx.c | 268 +--- + 128 files changed, 6979 insertions(+), 1950 deletions(-) + create mode 100644 arch/powerpc/platforms/pseries/plpks_sed_ops.c + create mode 100644 drivers/nvme/common/keyring.c + create mode 100644 include/linux/nvme-keyring.h + create mode 100644 include/linux/sed-opal-key.h + create mode 100644 io_uring/futex.c + create mode 100644 io_uring/futex.h + create mode 100644 io_uring/waitid.c + create mode 100644 io_uring/waitid.h + create mode 100644 kernel/exit.h + create mode 100644 tools/include/io_uring/mini_liburing.h + create mode 100644 tools/include/uapi/linux/io_uring.h +Merging device-mapper/for-next (c85b4fb8b8ed dm error: Add support for zoned block devices) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git device-mapper/for-next +Auto-merging MAINTAINERS +Auto-merging drivers/md/dm-cache-metadata.c +Auto-merging drivers/md/dm-crypt.c +Auto-merging drivers/md/dm.c +Merge made by the 'ort' strategy. + MAINTAINERS | 1 + + drivers/md/dm-cache-metadata.c | 6 +- + drivers/md/dm-crypt.c | 5 +- + drivers/md/dm-delay.c | 101 ++++++++++++++++++++++++++----- + drivers/md/dm-ioctl.c | 4 +- + drivers/md/dm-linear.c | 2 +- + drivers/md/dm-log-userspace-base.c | 2 +- + drivers/md/dm-stripe.c | 2 +- + drivers/md/dm-table.c | 23 ++++++- + drivers/md/dm-target.c | 106 +++++++++++++++++++++++++++++++- + drivers/md/dm.c | 121 ++++++++++++++++++++++--------------- + drivers/md/dm.h | 2 + + 12 files changed, 297 insertions(+), 78 deletions(-) +Merging libata/for-next (0e533cba3801 dt-bindings: ata: tegra: Disallow undefined properties) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git libata/for-next +Auto-merging drivers/ata/libata-scsi.c +Auto-merging drivers/scsi/sd.c +Auto-merging include/scsi/scsi_device.h +Merge made by the 'ort' strategy. + .../devicetree/bindings/ata/nvidia,tegra-ahci.yaml | 2 +- + drivers/ata/ahci.c | 6 + + drivers/ata/ahci_imx.c | 10 +- + drivers/ata/ahci_xgene.c | 11 +- + drivers/ata/libahci.c | 2 +- + drivers/ata/libata-core.c | 185 +++++++++++++-------- + drivers/ata/libata-eh.c | 54 +++--- + drivers/ata/libata-sata.c | 5 +- + drivers/ata/libata-scsi.c | 53 +----- + drivers/ata/libata-sff.c | 10 +- + drivers/ata/libata.h | 2 + + drivers/ata/pata_cs5520.c | 2 +- + drivers/ata/sata_mv.c | 9 +- + drivers/scsi/sd.c | 9 +- + include/linux/libata.h | 25 +-- + include/scsi/scsi_device.h | 1 - + 16 files changed, 201 insertions(+), 185 deletions(-) +Merging pcmcia/pcmcia-next (4f733de8b78a pcmcia: tcic: remove unneeded "&" in call to setup_timer()) +$ git merge -m Merge branch 'pcmcia-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux.git pcmcia/pcmcia-next +Merge made by the 'ort' strategy. + drivers/pcmcia/cs.c | 1 + + drivers/pcmcia/ds.c | 14 +++++++++----- + drivers/pcmcia/pcmcia_resource.c | 2 +- + drivers/pcmcia/tcic.c | 2 +- + 4 files changed, 12 insertions(+), 7 deletions(-) +Merging mmc/next (5428a40a308f mmc: Merge branch fixes into next) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git mmc/next +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. + .../devicetree/bindings/mmc/npcm,sdhci.yaml | 45 +++++++ + .../devicetree/bindings/mmc/renesas,sdhi.yaml | 2 + + .../devicetree/bindings/mmc/sdhci-msm.yaml | 9 +- + .../bindings/mmc/starfive,jh7110-mmc.yaml | 2 - + MAINTAINERS | 5 +- + drivers/memstick/host/jmb38x_ms.c | 2 +- + drivers/mmc/core/debugfs.c | 51 +++++++- + drivers/mmc/core/mmc.c | 7 +- + drivers/mmc/core/queue.c | 6 +- + drivers/mmc/host/Kconfig | 12 +- + drivers/mmc/host/Makefile | 1 + + drivers/mmc/host/atmel-mci.c | 9 +- + drivers/mmc/host/dw_mmc-starfive.c | 143 +++++++-------------- + drivers/mmc/host/jz4740_mmc.c | 15 +-- + drivers/mmc/host/mmc_hsq.c | 22 ++++ + drivers/mmc/host/mmc_hsq.h | 11 ++ + drivers/mmc/host/mmci.c | 3 +- + drivers/mmc/host/mmci.h | 2 + + drivers/mmc/host/sdhci-esdhc-imx.c | 52 +++++--- + drivers/mmc/host/sdhci-npcm.c | 94 ++++++++++++++ + drivers/mmc/host/sdhci-pci-core.c | 5 +- + drivers/mmc/host/sdhci-pci-gli.c | 14 ++ + drivers/mmc/host/sdhci-pltfm.c | 38 ++---- + drivers/mmc/host/vub300.c | 22 ++-- + include/linux/mmc/host.h | 1 + + 25 files changed, 387 insertions(+), 186 deletions(-) + create mode 100644 Documentation/devicetree/bindings/mmc/npcm,sdhci.yaml + create mode 100644 drivers/mmc/host/sdhci-npcm.c +Merging mfd/for-mfd-next (e9aec86e211e dt-bindings: mfd: qcom,spmi-pmic: Add pm8916 vm-bms and lbc) +$ git merge -m Merge branch 'for-mfd-next' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git mfd/for-mfd-next +Auto-merging Documentation/devicetree/bindings/mfd/syscon.yaml +Merge made by the 'ort' strategy. + .../ABI/testing/sysfs-driver-intel-m10-bmc | 4 +- + .../devicetree/bindings/arm/arm,integrator.yaml | 39 --- + .../devicetree/bindings/arm/arm,realview.yaml | 37 --- + .../devicetree/bindings/arm/arm,versatile.yaml | 40 +-- + .../bindings/input/twl4030-pwrbutton.txt | 2 +- + .../bindings/leds/backlight/max8925-backlight.txt | 10 - + .../devicetree/bindings/leds/register-bit-led.yaml | 2 +- + .../bindings/mfd/arm,dev-platforms-syscon.yaml | 67 +++++ + Documentation/devicetree/bindings/mfd/max8925.txt | 64 ---- + Documentation/devicetree/bindings/mfd/max8998.txt | 125 -------- + .../devicetree/bindings/mfd/maxim,max5970.yaml | 5 + + .../devicetree/bindings/mfd/maxim,max8925.yaml | 145 +++++++++ + .../devicetree/bindings/mfd/maxim,max8998.yaml | 324 +++++++++++++++++++++ + .../devicetree/bindings/mfd/mediatek,mt6357.yaml | 2 + + Documentation/devicetree/bindings/mfd/mt6397.txt | 4 +- + .../devicetree/bindings/mfd/qcom,spmi-pmic.yaml | 17 +- + .../devicetree/bindings/mfd/qcom,tcsr.yaml | 1 + + .../devicetree/bindings/mfd/qcom-pm8xxx.yaml | 26 +- + .../devicetree/bindings/mfd/rockchip,rk805.yaml | 4 + + .../devicetree/bindings/mfd/rockchip,rk806.yaml | 2 + + .../devicetree/bindings/mfd/rockchip,rk808.yaml | 4 + + .../devicetree/bindings/mfd/rockchip,rk809.yaml | 6 +- + .../devicetree/bindings/mfd/rockchip,rk817.yaml | 3 + + .../devicetree/bindings/mfd/rockchip,rk818.yaml | 4 + + .../bindings/mfd/stericsson,db8500-prcmu.yaml | 2 +- + Documentation/devicetree/bindings/mfd/syscon.yaml | 2 + + .../devicetree/bindings/mfd/ti,lp87524-q1.yaml | 1 + + .../devicetree/bindings/mfd/ti,lp87561-q1.yaml | 1 + + .../devicetree/bindings/mfd/ti,lp87565-q1.yaml | 1 + + Documentation/devicetree/bindings/mfd/ti,twl.yaml | 67 +++++ + .../devicetree/bindings/mfd/twl-family.txt | 46 --- + .../devicetree/bindings/mfd/x-powers,axp152.yaml | 5 +- + .../bindings/power/supply/max8925_battery.txt | 18 -- + drivers/mfd/arizona-i2c.c | 11 +- + drivers/mfd/arizona-spi.c | 3 + + drivers/mfd/atmel-hlcdc.c | 1 + + drivers/mfd/axp20x.c | 66 ++--- + drivers/mfd/db8500-prcmu.c | 4 +- + drivers/mfd/dln2.c | 1 - + drivers/mfd/hi6421-pmic-core.c | 9 +- + drivers/mfd/intel-lpss-pci.c | 13 + + drivers/mfd/iqs62x.c | 2 +- + drivers/mfd/lochnagar-i2c.c | 9 +- + drivers/mfd/lp87565.c | 9 +- + drivers/mfd/lpc_ich.c | 127 ++++++-- + drivers/mfd/madera-i2c.c | 9 +- + drivers/mfd/max14577.c | 14 +- + drivers/mfd/max77541.c | 6 +- + drivers/mfd/max77620.c | 6 +- + drivers/mfd/max77686.c | 2 +- + drivers/mfd/max8907.c | 4 +- + drivers/mfd/max8997.c | 12 +- + drivers/mfd/max8998.c | 12 +- + drivers/mfd/mc13xxx-spi.c | 14 +- + drivers/mfd/mfd-core.c | 17 +- + drivers/mfd/motorola-cpcap.c | 7 +- + drivers/mfd/mxs-lradc.c | 9 +- + drivers/mfd/palmas.c | 60 ++-- + drivers/mfd/qcom-spmi-pmic.c | 117 +++++--- + drivers/mfd/qcom_rpm.c | 8 +- + drivers/mfd/rk8xx-core.c | 7 +- + drivers/mfd/rk8xx-i2c.c | 6 +- + drivers/mfd/rn5t618.c | 11 +- + drivers/mfd/stm32-timers.c | 46 +++ + drivers/mfd/tps65086.c | 2 +- + drivers/mfd/tps65090.c | 2 +- + drivers/mfd/tps65218.c | 2 +- + drivers/mfd/tps6586x.c | 2 +- + drivers/mfd/tps65910.c | 13 +- + drivers/mfd/tps65912-core.c | 2 +- + drivers/mfd/twl-core.c | 18 +- + drivers/mfd/twl4030-power.c | 9 +- + drivers/mfd/twl6030-irq.c | 10 +- + drivers/mfd/wcd934x.c | 2 +- + drivers/mfd/wm831x-i2c.c | 16 +- + drivers/mfd/wm831x-spi.c | 16 +- + drivers/mfd/wm8994-core.c | 11 +- + drivers/spmi/spmi.c | 9 +- + include/linux/mfd/abx500/ab8500.h | 6 - + include/linux/mfd/core.h | 2 +- + include/linux/mfd/lpc_ich.h | 7 +- + include/linux/mfd/stm32-timers.h | 11 + + include/linux/spmi.h | 2 +- + 83 files changed, 1119 insertions(+), 725 deletions(-) + delete mode 100644 Documentation/devicetree/bindings/leds/backlight/max8925-backlight.txt + create mode 100644 Documentation/devicetree/bindings/mfd/arm,dev-platforms-syscon.yaml + delete mode 100644 Documentation/devicetree/bindings/mfd/max8925.txt + delete mode 100644 Documentation/devicetree/bindings/mfd/max8998.txt + create mode 100644 Documentation/devicetree/bindings/mfd/maxim,max8925.yaml + create mode 100644 Documentation/devicetree/bindings/mfd/maxim,max8998.yaml + create mode 100644 Documentation/devicetree/bindings/mfd/ti,twl.yaml + delete mode 100644 Documentation/devicetree/bindings/mfd/twl-family.txt + delete mode 100644 Documentation/devicetree/bindings/power/supply/max8925_battery.txt +Merging backlight/for-backlight-next (d5272d39995f dt-bindings: backlight: Add brightness-levels related common properties) +$ git merge -m Merge branch 'for-backlight-next' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight.git backlight/for-backlight-next +Merge made by the 'ort' strategy. + .../devicetree/bindings/leds/backlight/common.yaml | 17 +++++ + .../bindings/leds/backlight/led-backlight.yaml | 19 ++---- + .../bindings/leds/backlight/mps,mp3309c.yaml | 73 ++++++++++++++++++++++ + .../bindings/leds/backlight/pwm-backlight.yaml | 20 ++---- + drivers/video/backlight/pwm_bl.c | 22 +++++++ + 5 files changed, 120 insertions(+), 31 deletions(-) + create mode 100644 Documentation/devicetree/bindings/leds/backlight/mps,mp3309c.yaml +Merging battery/for-next (469d31745b9f power: reset: vexpress: Use device_get_match_data()) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git battery/for-next +Auto-merging Documentation/devicetree/bindings/vendor-prefixes.yaml +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. + .../bindings/power/reset/gpio-poweroff.yaml | 6 + + .../bindings/power/reset/syscon-poweroff.yaml | 10 +- + .../bindings/power/supply/maxim,max17040.yaml | 31 ++ + .../bindings/power/supply/mitsumi,mm8013.yaml | 38 ++ + .../bindings/power/supply/qcom,pm8916-bms-vm.yaml | 83 +++++ + .../bindings/power/supply/qcom,pm8916-lbc.yaml | 128 +++++++ + .../bindings/power/supply/sbs,sbs-manager.yaml | 6 + + .../power/supply/stericsson,ab8500-battery.txt | 34 -- + .../devicetree/bindings/vendor-prefixes.yaml | 2 + + MAINTAINERS | 5 + + drivers/power/reset/Kconfig | 2 +- + drivers/power/reset/axxia-reset.c | 7 +- + drivers/power/reset/gpio-poweroff.c | 82 +++-- + drivers/power/reset/msm-poweroff.c | 7 +- + drivers/power/reset/nvmem-reboot-mode.c | 4 +- + drivers/power/reset/st-poweroff.c | 7 +- + drivers/power/reset/syscon-poweroff.c | 29 +- + drivers/power/reset/vexpress-poweroff.c | 11 +- + drivers/power/reset/xgene-reboot.c | 7 +- + drivers/power/supply/88pm860x_battery.c | 8 +- + drivers/power/supply/Kconfig | 34 +- + drivers/power/supply/Makefile | 3 + + drivers/power/supply/ab8500_btemp.c | 6 +- + drivers/power/supply/ab8500_chargalg.c | 6 +- + drivers/power/supply/ab8500_charger.c | 6 +- + drivers/power/supply/ab8500_fg.c | 6 +- + drivers/power/supply/acer_a500_battery.c | 6 +- + drivers/power/supply/act8945a_charger.c | 6 +- + drivers/power/supply/axp20x_ac_power.c | 2 +- + drivers/power/supply/axp20x_usb_power.c | 2 +- + drivers/power/supply/bq24190_charger.c | 2 +- + drivers/power/supply/bq24257_charger.c | 76 ++-- + drivers/power/supply/bq2515x_charger.c | 67 ++-- + drivers/power/supply/bq256xx_charger.c | 52 +-- + drivers/power/supply/bq25980_charger.c | 2 +- + drivers/power/supply/charger-manager.c | 12 +- + drivers/power/supply/cpcap-battery.c | 6 +- + drivers/power/supply/cpcap-charger.c | 19 +- + drivers/power/supply/da9030_battery.c | 6 +- + drivers/power/supply/da9052-battery.c | 6 +- + drivers/power/supply/da9150-charger.c | 6 +- + drivers/power/supply/goldfish_battery.c | 5 +- + drivers/power/supply/ipaq_micro_battery.c | 6 +- + drivers/power/supply/isp1704_charger.c | 6 +- + drivers/power/supply/lp8788-charger.c | 6 +- + drivers/power/supply/max14577_charger.c | 6 +- + drivers/power/supply/max17040_battery.c | 27 ++ + drivers/power/supply/max17042_battery.c | 6 +- + drivers/power/supply/max77650-charger.c | 6 +- + drivers/power/supply/max77693_charger.c | 6 +- + drivers/power/supply/max8925_power.c | 5 +- + drivers/power/supply/mm8013.c | 317 +++++++++++++++++ + drivers/power/supply/mt6370-charger.c | 4 +- + drivers/power/supply/pcf50633-charger.c | 6 +- + drivers/power/supply/pm8916_bms_vm.c | 305 +++++++++++++++++ + drivers/power/supply/pm8916_lbc.c | 381 +++++++++++++++++++++ + drivers/power/supply/power_supply_core.c | 10 +- + drivers/power/supply/power_supply_sysfs.c | 12 +- + drivers/power/supply/qcom_pmi8998_charger.c | 3 +- + drivers/power/supply/qcom_smbb.c | 6 +- + drivers/power/supply/rk817_charger.c | 13 + + drivers/power/supply/rt5033_charger.c | 320 +++++++++++++++-- + drivers/power/supply/rx51_battery.c | 6 +- + drivers/power/supply/sbs-battery.c | 8 +- + drivers/power/supply/sc2731_charger.c | 6 +- + drivers/power/supply/surface_battery.c | 2 +- + drivers/power/supply/surface_charger.c | 2 +- + drivers/power/supply/tps65090-charger.c | 6 +- + drivers/power/supply/tps65217_charger.c | 6 +- + drivers/power/supply/twl4030_charger.c | 6 +- + drivers/power/supply/twl4030_madc_battery.c | 6 +- + drivers/power/supply/wm831x_backup.c | 6 +- + drivers/power/supply/wm831x_power.c | 5 +- + drivers/power/supply/wm8350_power.c | 5 +- + drivers/power/supply/wm97xx_battery.c | 5 +- + include/linux/power_supply.h | 1 - + 76 files changed, 1946 insertions(+), 418 deletions(-) + create mode 100644 Documentation/devicetree/bindings/power/supply/mitsumi,mm8013.yaml + create mode 100644 Documentation/devicetree/bindings/power/supply/qcom,pm8916-bms-vm.yaml + create mode 100644 Documentation/devicetree/bindings/power/supply/qcom,pm8916-lbc.yaml + delete mode 100644 Documentation/devicetree/bindings/power/supply/stericsson,ab8500-battery.txt + create mode 100644 drivers/power/supply/mm8013.c + create mode 100644 drivers/power/supply/pm8916_bms_vm.c + create mode 100644 drivers/power/supply/pm8916_lbc.c +Merging regulator/for-next (8af4b4efdac9 Merge remote-tracking branch 'regulator/for-6.7' into regulator-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git regulator/for-next +Merge made by the 'ort' strategy. + .../bindings/regulator/adi,max77503-regulator.yaml | 50 +++ + .../devicetree/bindings/regulator/da9210.txt | 29 -- + .../devicetree/bindings/regulator/dlg,da9210.yaml | 52 +++ + .../bindings/regulator/fixed-regulator.yaml | 5 + + .../bindings/regulator/maxim,max20086.yaml | 1 + + .../bindings/regulator/maxim,max77826.yaml | 2 + + .../regulator/mediatek,mt6358-regulator.yaml | 250 +++++++++++ + .../bindings/regulator/mt6358-regulator.txt | 350 --------------- + .../bindings/regulator/onnn,fan53880.yaml | 2 + + .../bindings/regulator/qcom,rpmh-regulator.yaml | 12 + + .../bindings/regulator/qcom,spmi-regulator.yaml | 68 ++- + drivers/regulator/Kconfig | 10 + + drivers/regulator/Makefile | 1 + + drivers/regulator/da9062-regulator.c | 2 +- + drivers/regulator/da9063-regulator.c | 2 +- + drivers/regulator/da9121-regulator.c | 15 +- + drivers/regulator/da9210-regulator.c | 12 +- + drivers/regulator/fan53555.c | 9 +- + drivers/regulator/fixed.c | 50 +++ + drivers/regulator/lochnagar-regulator.c | 8 +- + drivers/regulator/ltc3589.c | 61 ++- + drivers/regulator/max1586.c | 9 +- + drivers/regulator/max20086-regulator.c | 65 ++- + drivers/regulator/max5970-regulator.c | 145 +++++- + drivers/regulator/max77503-regulator.c | 137 ++++++ + drivers/regulator/mc13xxx.h | 2 +- + drivers/regulator/mp5416.c | 10 +- + drivers/regulator/mp886x.c | 14 +- + drivers/regulator/mt6358-regulator.c | 494 +++++++++++---------- + drivers/regulator/palmas-regulator.c | 8 +- + drivers/regulator/pv88080-regulator.c | 58 +-- + drivers/regulator/qcom-labibb-regulator.c | 7 +- + drivers/regulator/qcom-rpmh-regulator.c | 19 + + drivers/regulator/qcom_rpm-regulator.c | 7 +- + drivers/regulator/qcom_spmi-regulator.c | 103 ++++- + drivers/regulator/rk808-regulator.c | 2 - + drivers/regulator/stm32-booster.c | 5 +- + drivers/regulator/sy8824x.c | 26 +- + drivers/regulator/ti-abb-regulator.c | 22 +- + drivers/regulator/tps51632-regulator.c | 11 - + include/linux/mfd/mt6358/registers.h | 23 + + include/linux/regulator/mt6358-regulator.h | 3 + + 42 files changed, 1294 insertions(+), 867 deletions(-) + create mode 100644 Documentation/devicetree/bindings/regulator/adi,max77503-regulator.yaml + delete mode 100644 Documentation/devicetree/bindings/regulator/da9210.txt + create mode 100644 Documentation/devicetree/bindings/regulator/dlg,da9210.yaml + create mode 100644 Documentation/devicetree/bindings/regulator/mediatek,mt6358-regulator.yaml + delete mode 100644 Documentation/devicetree/bindings/regulator/mt6358-regulator.txt + create mode 100644 drivers/regulator/max77503-regulator.c +Merging security/next (82ed980d6f5d Automated merge of 'dev-staging' into 'next') +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git security/next +Auto-merging Documentation/userspace-api/index.rst +Auto-merging MAINTAINERS +Auto-merging arch/alpha/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/alpha/kernel/syscalls/syscall.tbl +Auto-merging arch/arm/tools/syscall.tbl +CONFLICT (content): Merge conflict in arch/arm/tools/syscall.tbl +Auto-merging arch/arm64/include/asm/unistd.h +CONFLICT (content): Merge conflict in arch/arm64/include/asm/unistd.h +Auto-merging arch/arm64/include/asm/unistd32.h +CONFLICT (content): Merge conflict in arch/arm64/include/asm/unistd32.h +CONFLICT (modify/delete): arch/ia64/kernel/syscalls/syscall.tbl deleted in HEAD and modified in security/next. Version security/next of arch/ia64/kernel/syscalls/syscall.tbl left in tree. +Auto-merging arch/m68k/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/m68k/kernel/syscalls/syscall.tbl +Auto-merging arch/microblaze/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/microblaze/kernel/syscalls/syscall.tbl +Auto-merging arch/mips/kernel/syscalls/syscall_n32.tbl +CONFLICT (content): Merge conflict in arch/mips/kernel/syscalls/syscall_n32.tbl +Auto-merging arch/mips/kernel/syscalls/syscall_n64.tbl +CONFLICT (content): Merge conflict in arch/mips/kernel/syscalls/syscall_n64.tbl +Auto-merging arch/mips/kernel/syscalls/syscall_o32.tbl +CONFLICT (content): Merge conflict in arch/mips/kernel/syscalls/syscall_o32.tbl +Auto-merging arch/parisc/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/parisc/kernel/syscalls/syscall.tbl +Auto-merging arch/powerpc/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/powerpc/kernel/syscalls/syscall.tbl +Auto-merging arch/s390/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/s390/kernel/syscalls/syscall.tbl +Auto-merging arch/sh/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/sh/kernel/syscalls/syscall.tbl +Auto-merging arch/sparc/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/sparc/kernel/syscalls/syscall.tbl +Auto-merging arch/x86/entry/syscalls/syscall_32.tbl +CONFLICT (content): Merge conflict in arch/x86/entry/syscalls/syscall_32.tbl +Auto-merging arch/x86/entry/syscalls/syscall_64.tbl +CONFLICT (content): Merge conflict in arch/x86/entry/syscalls/syscall_64.tbl +Auto-merging arch/xtensa/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/xtensa/kernel/syscalls/syscall.tbl +Auto-merging fs/proc/base.c +Auto-merging include/linux/fs.h +Auto-merging include/linux/syscalls.h +Auto-merging include/uapi/asm-generic/unistd.h +CONFLICT (content): Merge conflict in include/uapi/asm-generic/unistd.h +Auto-merging kernel/sys_ni.c +Auto-merging tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl +Auto-merging tools/perf/arch/powerpc/entry/syscalls/syscall.tbl +Auto-merging tools/perf/arch/s390/entry/syscalls/syscall.tbl +Auto-merging tools/perf/arch/x86/entry/syscalls/syscall_64.tbl +Auto-merging tools/testing/selftests/Makefile +Resolved 'arch/alpha/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/arm/tools/syscall.tbl' using previous resolution. +Resolved 'arch/arm64/include/asm/unistd.h' using previous resolution. +Resolved 'arch/arm64/include/asm/unistd32.h' using previous resolution. +Resolved 'arch/m68k/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/microblaze/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/mips/kernel/syscalls/syscall_n32.tbl' using previous resolution. +Resolved 'arch/mips/kernel/syscalls/syscall_n64.tbl' using previous resolution. +Resolved 'arch/mips/kernel/syscalls/syscall_o32.tbl' using previous resolution. +Resolved 'arch/parisc/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/powerpc/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/s390/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/sh/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/sparc/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'arch/x86/entry/syscalls/syscall_32.tbl' using previous resolution. +Resolved 'arch/x86/entry/syscalls/syscall_64.tbl' using previous resolution. +Resolved 'arch/xtensa/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'include/uapi/asm-generic/unistd.h' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git rm -f arch/ia64/kernel/syscalls/syscall.tbl +rm 'arch/ia64/kernel/syscalls/syscall.tbl' +$ git commit --no-edit -v -a +[master df363ff67d27] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git +$ git diff -M --stat --summary HEAD^.. + Documentation/userspace-api/index.rst | 1 + + Documentation/userspace-api/lsm.rst | 73 ++++++ + MAINTAINERS | 2 + + arch/alpha/kernel/syscalls/syscall.tbl | 3 + + arch/arm/tools/syscall.tbl | 3 + + arch/arm64/include/asm/unistd.h | 2 +- + arch/arm64/include/asm/unistd32.h | 6 + + arch/m68k/kernel/syscalls/syscall.tbl | 3 + + arch/microblaze/kernel/syscalls/syscall.tbl | 3 + + arch/mips/kernel/syscalls/syscall_n32.tbl | 3 + + arch/mips/kernel/syscalls/syscall_n64.tbl | 3 + + arch/mips/kernel/syscalls/syscall_o32.tbl | 3 + + arch/parisc/kernel/syscalls/syscall.tbl | 3 + + arch/powerpc/kernel/syscalls/syscall.tbl | 3 + + arch/s390/kernel/syscalls/syscall.tbl | 3 + + arch/sh/kernel/syscalls/syscall.tbl | 3 + + arch/sparc/kernel/syscalls/syscall.tbl | 3 + + arch/x86/entry/syscalls/syscall_32.tbl | 3 + + arch/x86/entry/syscalls/syscall_64.tbl | 3 + + arch/xtensa/kernel/syscalls/syscall.tbl | 3 + + fs/proc/base.c | 29 +-- + fs/proc/internal.h | 2 +- + include/linux/cred.h | 59 ++++- + include/linux/fs.h | 2 +- + include/linux/lsm_hook_defs.h | 14 +- + include/linux/lsm_hooks.h | 17 +- + include/linux/security.h | 66 +++-- + include/linux/syscalls.h | 6 + + include/uapi/asm-generic/unistd.h | 9 +- + include/uapi/linux/lsm.h | 89 +++++++ + kernel/cred.c | 26 +- + kernel/sys_ni.c | 3 + + security/Makefile | 1 + + security/apparmor/include/procattr.h | 2 +- + security/apparmor/lsm.c | 103 +++++++- + security/apparmor/procattr.c | 10 +- + security/bpf/hooks.c | 9 +- + security/commoncap.c | 12 +- + security/landlock/cred.c | 2 +- + security/landlock/fs.c | 2 +- + security/landlock/ptrace.c | 2 +- + security/landlock/setup.c | 6 + + security/landlock/setup.h | 1 + + security/loadpin/loadpin.c | 9 +- + security/lockdown/lockdown.c | 8 +- + security/lsm_syscalls.c | 120 +++++++++ + security/safesetid/lsm.c | 9 +- + security/security.c | 264 ++++++++++++++++++-- + security/selinux/hooks.c | 153 +++++++++--- + security/smack/smack_lsm.c | 103 +++++++- + security/tomoyo/tomoyo.c | 11 +- + security/yama/yama_lsm.c | 8 +- + .../perf/arch/mips/entry/syscalls/syscall_n64.tbl | 3 + + tools/perf/arch/powerpc/entry/syscalls/syscall.tbl | 3 + + tools/perf/arch/s390/entry/syscalls/syscall.tbl | 3 + + tools/perf/arch/x86/entry/syscalls/syscall_64.tbl | 3 + + tools/testing/selftests/Makefile | 1 + + tools/testing/selftests/lsm/.gitignore | 1 + + tools/testing/selftests/lsm/Makefile | 17 ++ + tools/testing/selftests/lsm/common.c | 89 +++++++ + tools/testing/selftests/lsm/common.h | 33 +++ + tools/testing/selftests/lsm/config | 3 + + .../testing/selftests/lsm/lsm_get_self_attr_test.c | 275 +++++++++++++++++++++ + .../testing/selftests/lsm/lsm_list_modules_test.c | 140 +++++++++++ + .../testing/selftests/lsm/lsm_set_self_attr_test.c | 74 ++++++ + 65 files changed, 1786 insertions(+), 145 deletions(-) + create mode 100644 Documentation/userspace-api/lsm.rst + create mode 100644 include/uapi/linux/lsm.h + create mode 100644 security/lsm_syscalls.c + create mode 100644 tools/testing/selftests/lsm/.gitignore + create mode 100644 tools/testing/selftests/lsm/Makefile + create mode 100644 tools/testing/selftests/lsm/common.c + create mode 100644 tools/testing/selftests/lsm/common.h + create mode 100644 tools/testing/selftests/lsm/config + create mode 100644 tools/testing/selftests/lsm/lsm_get_self_attr_test.c + create mode 100644 tools/testing/selftests/lsm/lsm_list_modules_test.c + create mode 100644 tools/testing/selftests/lsm/lsm_set_self_attr_test.c +Merging apparmor/apparmor-next (6cede10161be apparmor: Fix some kernel-doc comments) +$ git merge -m Merge branch 'apparmor-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jj/linux-apparmor apparmor/apparmor-next +Auto-merging security/apparmor/apparmorfs.c +Auto-merging security/apparmor/lsm.c +CONFLICT (content): Merge conflict in security/apparmor/lsm.c +Auto-merging security/apparmor/policy_unpack.c +Resolved 'security/apparmor/lsm.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master d8b3b2b2400b] Merge branch 'apparmor-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jj/linux-apparmor +$ git diff -M --stat --summary HEAD^.. + security/apparmor/apparmorfs.c | 49 ++-- + security/apparmor/audit.c | 75 +++--- + security/apparmor/capability.c | 33 +-- + security/apparmor/domain.c | 193 +++++++++------ + security/apparmor/file.c | 213 ++++++++++------- + security/apparmor/include/apparmor.h | 3 +- + security/apparmor/include/audit.h | 42 ++-- + security/apparmor/include/capability.h | 3 +- + security/apparmor/include/file.h | 54 +---- + security/apparmor/include/ipc.h | 4 +- + security/apparmor/include/lib.h | 2 + + security/apparmor/include/match.h | 6 - + security/apparmor/include/mount.h | 26 +- + security/apparmor/include/net.h | 25 +- + security/apparmor/include/perms.h | 7 +- + security/apparmor/include/policy.h | 70 ++++-- + security/apparmor/include/policy_ns.h | 14 -- + security/apparmor/include/resource.h | 3 +- + security/apparmor/include/task.h | 11 +- + security/apparmor/ipc.c | 53 +++-- + security/apparmor/label.c | 44 ++-- + security/apparmor/lib.c | 54 ++--- + security/apparmor/lsm.c | 418 ++++++++++++++++++++++++++++----- + security/apparmor/match.c | 48 +--- + security/apparmor/mount.c | 186 +++++++++------ + security/apparmor/net.c | 65 ++--- + security/apparmor/policy.c | 133 +++++++---- + security/apparmor/policy_compat.c | 1 + + security/apparmor/policy_ns.c | 37 --- + security/apparmor/policy_unpack.c | 152 ++++++------ + security/apparmor/resource.c | 54 +++-- + security/apparmor/task.c | 104 +++++--- + 32 files changed, 1335 insertions(+), 847 deletions(-) +Merging integrity/next-integrity (bc4532e9cd3b ima: detect changes to the backing overlay file) +$ git merge -m Merge branch 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity integrity/next-integrity +Auto-merging certs/Kconfig +Auto-merging fs/overlayfs/super.c +CONFLICT (content): Merge conflict in fs/overlayfs/super.c +Auto-merging security/integrity/iint.c +Resolved 'fs/overlayfs/super.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master e84e97dbdf8b] Merge branch 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity +$ git diff -M --stat --summary HEAD^.. + certs/Kconfig | 16 ++++++++++++- + crypto/asymmetric_keys/restrict.c | 4 ++++ + fs/overlayfs/super.c | 2 +- + security/integrity/Kconfig | 44 +++++++++++++++++------------------ + security/integrity/iint.c | 48 ++++++++++++++++++++++++++++++--------- + security/integrity/ima/ima_api.c | 5 ++++ + security/integrity/ima/ima_main.c | 16 ++++++++++++- + security/integrity/integrity.h | 2 ++ + 8 files changed, 101 insertions(+), 36 deletions(-) +Merging safesetid/safesetid-next (64b634830c91 LSM: SafeSetID: add setgroups() testing to selftest) +$ git merge -m Merge branch 'safesetid-next' of https://github.com/micah-morton/linux.git safesetid/safesetid-next +Already up to date. +Merging selinux/next (f5bbdeda34c6 Automated merge of 'dev' into 'next') +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux.git selinux/next +Merge made by the 'ort' strategy. + security/selinux/Kconfig | 10 ++++++++++ + security/selinux/Makefile | 2 ++ + security/selinux/ss/avtab.c | 37 +++++++++++-------------------------- + security/selinux/ss/hashtab.c | 5 +++++ + security/selinux/ss/hashtab.h | 1 + + security/selinux/ss/policydb.c | 6 +++--- + security/selinux/ss/sidtab.c | 2 +- + 7 files changed, 33 insertions(+), 30 deletions(-) +Merging smack/next (3ad49d37cf57 smackfs: Prevent underflow in smk_set_cipso()) +$ git merge -m Merge branch 'next' of git://github.com/cschaufler/smack-next smack/next +Already up to date. +Merging tomoyo/master (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'master' of https://scm.osdn.net/gitroot/tomoyo/tomoyo-test1.git tomoyo/master +Already up to date. +Merging tpmdd/next (03acb9ccec3f keys: Remove unused extern declarations) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git tpmdd/next +Auto-merging security/integrity/Kconfig +Merge made by the 'ort' strategy. + security/integrity/Kconfig | 2 - + security/keys/internal.h | 7 ---- + security/keys/trusted-keys/trusted_core.c | 20 +++++----- + security/keys/trusted-keys/trusted_tee.c | 64 ++++++++++--------------------- + 4 files changed, 30 insertions(+), 63 deletions(-) +Merging watchdog/master (9d08e5909c81 dt-bindings: watchdog: Add support for Amlogic C3 and S4 SoCs) +$ git merge -m Merge branch 'master' of git://www.linux-watchdog.org/linux-watchdog-next.git watchdog/master +Merge made by the 'ort' strategy. + .../bindings/watchdog/amlogic,meson-gxbb-wdt.yaml | 12 ++- + .../devicetree/bindings/watchdog/aspeed-wdt.txt | 18 ++++- + .../bindings/watchdog/fsl-imx7ulp-wdt.yaml | 5 ++ + .../devicetree/bindings/watchdog/qcom-wdt.yaml | 2 + + drivers/watchdog/apple_wdt.c | 25 ++++++ + drivers/watchdog/aspeed_wdt.c | 11 +++ + drivers/watchdog/at91sam9_wdt.c | 20 ++--- + drivers/watchdog/ath79_wdt.c | 19 +---- + drivers/watchdog/gpio_wdt.c | 16 ++-- + drivers/watchdog/imx7ulp_wdt.c | 8 ++ + drivers/watchdog/imx_sc_wdt.c | 5 +- + drivers/watchdog/it87_wdt.c | 8 +- + drivers/watchdog/ixp4xx_wdt.c | 28 ++++++- + drivers/watchdog/marvell_gti_wdt.c | 14 +++- + drivers/watchdog/mlx_wdt.c | 1 + + drivers/watchdog/of_xilinx_wdt.c | 13 ++- + drivers/watchdog/sbsa_gwdt.c | 4 +- + drivers/watchdog/st_lpc_wdt.c | 11 +-- + drivers/watchdog/sunplus_wdt.c | 17 +--- + drivers/watchdog/wdat_wdt.c | 2 +- + include/dt-bindings/watchdog/aspeed-wdt.h | 92 ++++++++++++++++++++++ + 21 files changed, 248 insertions(+), 83 deletions(-) + create mode 100644 include/dt-bindings/watchdog/aspeed-wdt.h +Merging iommu/next (e8cca466a84a Merge branches 'iommu/fixes', 'arm/tegra', 'arm/smmu', 'virtio', 'x86/vt-d', 'x86/amd', 'core' and 's390' into next) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git iommu/next +Auto-merging Documentation/admin-guide/kernel-parameters.txt +Auto-merging arch/arm/configs/multi_v7_defconfig +Auto-merging arch/powerpc/kernel/iommu.c +Auto-merging arch/s390/pci/pci.c +Auto-merging drivers/iommu/Kconfig +CONFLICT (content): Merge conflict in drivers/iommu/Kconfig +Resolved 'drivers/iommu/Kconfig' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master dcf3eb139c69] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git +$ git diff -M --stat --summary HEAD^.. + Documentation/admin-guide/kernel-parameters.txt | 9 +- + .../devicetree/bindings/iommu/arm,smmu.yaml | 2 + + arch/arm/configs/multi_v7_defconfig | 1 - + arch/arm/configs/tegra_defconfig | 1 - + arch/powerpc/kernel/iommu.c | 53 +- + arch/s390/include/asm/pci.h | 11 - + arch/s390/include/asm/pci_clp.h | 3 + + arch/s390/include/asm/pci_dma.h | 119 +-- + arch/s390/pci/Makefile | 2 +- + arch/s390/pci/pci.c | 35 +- + arch/s390/pci/pci_bus.c | 5 - + arch/s390/pci/pci_debug.c | 12 +- + arch/s390/pci/pci_dma.c | 746 --------------- + arch/s390/pci/pci_event.c | 17 +- + arch/s390/pci/pci_sysfs.c | 19 +- + drivers/iommu/Kconfig | 15 +- + drivers/iommu/Makefile | 1 - + drivers/iommu/amd/Kconfig | 9 - + drivers/iommu/amd/Makefile | 1 - + drivers/iommu/amd/amd_iommu.h | 35 +- + drivers/iommu/amd/amd_iommu_types.h | 52 +- + drivers/iommu/amd/init.c | 121 +-- + drivers/iommu/amd/io_pgtable_v2.c | 8 +- + drivers/iommu/amd/iommu.c | 581 +++++------- + drivers/iommu/amd/iommu_v2.c | 996 --------------------- + drivers/iommu/apple-dart.c | 142 +-- + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 71 +- + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 253 +++--- + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 17 +- + drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 2 + + drivers/iommu/arm/arm-smmu/qcom_iommu.c | 45 +- + drivers/iommu/dma-iommu.c | 200 ++++- + drivers/iommu/exynos-iommu.c | 83 +- + drivers/iommu/fsl_pamu_domain.c | 41 +- + drivers/iommu/intel/debugfs.c | 215 ++++- + drivers/iommu/intel/iommu.c | 19 +- + drivers/iommu/intel/iommu.h | 14 + + drivers/iommu/iommu.c | 465 +++++----- + drivers/iommu/iommufd/selftest.c | 30 +- + drivers/iommu/iova.c | 95 +- + drivers/iommu/ipmmu-vmsa.c | 72 +- + drivers/iommu/msm_iommu.c | 35 +- + drivers/iommu/mtk_iommu.c | 35 +- + drivers/iommu/mtk_iommu_v1.c | 28 +- + drivers/iommu/omap-iommu.c | 69 +- + drivers/iommu/omap-iommu.h | 2 +- + drivers/iommu/rockchip-iommu.c | 59 +- + drivers/iommu/s390-iommu.c | 424 ++++++++- + drivers/iommu/sprd-iommu.c | 36 +- + drivers/iommu/sun50i-iommu.c | 80 +- + drivers/iommu/tegra-gart.c | 371 -------- + drivers/iommu/tegra-smmu.c | 58 +- + drivers/iommu/virtio-iommu.c | 4 +- + drivers/memory/tegra/mc.c | 34 - + drivers/memory/tegra/tegra20.c | 28 - + include/linux/amd-iommu.h | 120 --- + include/linux/iommu.h | 38 +- + include/soc/tegra/mc.h | 26 - + 58 files changed, 2149 insertions(+), 3916 deletions(-) + delete mode 100644 arch/s390/pci/pci_dma.c + delete mode 100644 drivers/iommu/amd/iommu_v2.c + delete mode 100644 drivers/iommu/tegra-gart.c +Merging audit/next (47846d51348d audit: don't take task_lock() in audit_exe_compare() code path) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit.git audit/next +Auto-merging kernel/audit_tree.c +Merge made by the 'ort' strategy. + kernel/audit_tree.c | 2 +- + kernel/audit_watch.c | 9 ++++++++- + 2 files changed, 9 insertions(+), 2 deletions(-) +Merging devicetree/for-next (a31226cdc877 dt-bindings: watchdog: cnxt,cx92755-wdt: convert txt to yaml) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git devicetree/for-next +Auto-merging Documentation/devicetree/bindings/arm/cpus.yaml +Auto-merging Documentation/devicetree/bindings/display/panel/panel-simple.yaml +Auto-merging Documentation/devicetree/bindings/timer/fsl,imxgpt.yaml +Auto-merging Documentation/devicetree/bindings/vendor-prefixes.yaml +Auto-merging MAINTAINERS +Auto-merging tools/testing/selftests/Makefile +Merge made by the 'ort' strategy. + Documentation/devicetree/bindings/Makefile | 2 +- + Documentation/devicetree/bindings/arm/cpus.yaml | 1 + + Documentation/devicetree/bindings/arm/psci.yaml | 1 + + .../bindings/display/ilitek,ili9486.yaml | 4 - + .../bindings/display/panel/ilitek,ili9163.yaml | 4 - + .../panel/panel-simple-lvds-dual-ports.yaml | 118 ++++++++++++++ + .../bindings/display/panel/panel-simple.yaml | 10 -- + .../bindings/display/sitronix,st7735r.yaml | 5 - + .../bindings/interrupt-controller/qcom,pdc.yaml | 1 + + .../bindings/remoteproc/renesas,rcar-rproc.yaml | 2 +- + .../bindings/reserved-memory/framebuffer.yaml | 52 ------ + .../bindings/reserved-memory/memory-region.yaml | 40 ----- + .../bindings/reserved-memory/reserved-memory.txt | 2 +- + .../bindings/reserved-memory/reserved-memory.yaml | 181 --------------------- + .../bindings/reserved-memory/shared-dma-pool.yaml | 97 ----------- + .../bindings/sound/mediatek,mt8188-afe.yaml | 2 +- + .../devicetree/bindings/timer/fsl,imxgpt.yaml | 27 +++ + .../devicetree/bindings/usb/rockchip,dwc3.yaml | 2 +- + .../devicetree/bindings/usb/ti,tps6598x.yaml | 5 +- + .../devicetree/bindings/vendor-prefixes.yaml | 2 + + .../bindings/watchdog/atmel,at91rm9200-wdt.yaml | 33 ++++ + .../bindings/watchdog/atmel-at91rm9200-wdt.txt | 9 - + .../bindings/watchdog/cnxt,cx92755-wdt.yaml | 45 +++++ + .../devicetree/bindings/watchdog/da9062-wdt.txt | 34 ---- + .../devicetree/bindings/watchdog/digicolor-wdt.txt | 25 --- + .../bindings/watchdog/dlg,da9062-watchdog.yaml | 50 ++++++ + .../devicetree/bindings/watchdog/fsl,scu-wdt.yaml | 4 +- + .../devicetree/bindings/writing-schema.rst | 5 +- + MAINTAINERS | 1 + + drivers/acpi/arm64/amba.c | 2 +- + drivers/amba/bus.c | 5 +- + drivers/of/platform.c | 2 +- + scripts/dtc/dt-extract-compatibles | 74 +++++++-- + tools/testing/selftests/Makefile | 1 + + tools/testing/selftests/dt/.gitignore | 1 + + tools/testing/selftests/dt/Makefile | 21 +++ + tools/testing/selftests/dt/compatible_ignore_list | 1 + + tools/testing/selftests/dt/ktap_helpers.sh | 70 ++++++++ + .../testing/selftests/dt/test_unprobed_devices.sh | 83 ++++++++++ + 39 files changed, 536 insertions(+), 488 deletions(-) + create mode 100644 Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml + delete mode 100644 Documentation/devicetree/bindings/reserved-memory/framebuffer.yaml + delete mode 100644 Documentation/devicetree/bindings/reserved-memory/memory-region.yaml + delete mode 100644 Documentation/devicetree/bindings/reserved-memory/reserved-memory.yaml + delete mode 100644 Documentation/devicetree/bindings/reserved-memory/shared-dma-pool.yaml + create mode 100644 Documentation/devicetree/bindings/watchdog/atmel,at91rm9200-wdt.yaml + delete mode 100644 Documentation/devicetree/bindings/watchdog/atmel-at91rm9200-wdt.txt + create mode 100644 Documentation/devicetree/bindings/watchdog/cnxt,cx92755-wdt.yaml + delete mode 100644 Documentation/devicetree/bindings/watchdog/da9062-wdt.txt + delete mode 100644 Documentation/devicetree/bindings/watchdog/digicolor-wdt.txt + create mode 100644 Documentation/devicetree/bindings/watchdog/dlg,da9062-watchdog.yaml + create mode 100644 tools/testing/selftests/dt/.gitignore + create mode 100644 tools/testing/selftests/dt/Makefile + create mode 100644 tools/testing/selftests/dt/compatible_ignore_list + create mode 100644 tools/testing/selftests/dt/ktap_helpers.sh + create mode 100755 tools/testing/selftests/dt/test_unprobed_devices.sh +Merging dt-krzk/for-next (d896029c9726 Merge branch 'next/dt64' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-dt.git dt-krzk/for-next +Merge made by the 'ort' strategy. +Merging mailbox/mailbox-for-next (a493208079e2 mailbox: qcom-ipcc: fix incorrect num_chans counting) +$ git merge -m Merge branch 'mailbox-for-next' of git://git.linaro.org/landing-teams/working/fujitsu/integration.git mailbox/mailbox-for-next +Already up to date. +Merging spi/for-next (f6218c7e590f Merge remote-tracking branch 'spi/for-6.7' into spi-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git spi/for-next +Merge made by the 'ort' strategy. + .../bindings/spi/allwinner,sun4i-a10-spi.yaml | 2 + + .../bindings/spi/allwinner,sun6i-a31-spi.yaml | 2 + + .../bindings/spi/arm,pl022-peripheral-props.yaml | 61 ++++ + .../bindings/spi/nvidia,tegra210-quad.yaml | 1 + + .../devicetree/bindings/spi/qcom,spi-qup.yaml | 13 + + .../devicetree/bindings/spi/renesas,rzv2m-csi.yaml | 9 + + .../devicetree/bindings/spi/rockchip-sfc.yaml | 2 + + .../devicetree/bindings/spi/snps,dw-apb-ssi.yaml | 2 + + .../bindings/spi/spi-peripheral-props.yaml | 6 + + .../devicetree/bindings/spi/spi-pl022.yaml | 51 --- + .../devicetree/bindings/spi/st,stm32-spi.yaml | 20 -- + drivers/spi/Kconfig | 3 +- + drivers/spi/spi-ar934x.c | 22 +- + drivers/spi/spi-armada-3700.c | 23 +- + drivers/spi/spi-aspeed-smc.c | 16 +- + drivers/spi/spi-at91-usart.c | 22 +- + drivers/spi/spi-ath79.c | 11 +- + drivers/spi/spi-axi-spi-engine.c | 25 +- + drivers/spi/spi-bcm2835.c | 73 ++-- + drivers/spi/spi-bcm2835aux.c | 23 +- + drivers/spi/spi-cadence-quadspi.c | 45 ++- + drivers/spi/spi-cadence.c | 23 +- + drivers/spi/spi-cavium-thunderx.c | 8 +- + drivers/spi/spi-davinci.c | 11 +- + drivers/spi/spi-dw-bt1.c | 23 +- + drivers/spi/spi-dw-mmio.c | 31 +- + drivers/spi/spi-fsl-dspi.c | 12 +- + drivers/spi/spi-geni-qcom.c | 6 +- + drivers/spi/spi-lantiq-ssc.c | 10 +- + drivers/spi/spi-lm70llp.c | 20 +- + drivers/spi/spi-lp8841-rtc.c | 56 +-- + drivers/spi/spi-meson-spicc.c | 121 +++---- + drivers/spi/spi-meson-spifc.c | 79 ++-- + drivers/spi/spi-microchip-core-qspi.c | 39 +- + drivers/spi/spi-microchip-core.c | 83 ++--- + drivers/spi/spi-mpc512x-psc.c | 54 +-- + drivers/spi/spi-mpc52xx-psc.c | 38 +- + drivers/spi/spi-mpc52xx.c | 56 +-- + drivers/spi/spi-mt65xx.c | 190 +++++----- + drivers/spi/spi-mt7621.c | 50 +-- + drivers/spi/spi-mtk-nor.c | 14 +- + drivers/spi/spi-mtk-snfi.c | 67 +--- + drivers/spi/spi-mux.c | 2 +- + drivers/spi/spi-mxic.c | 68 ++-- + drivers/spi/spi-mxs.c | 70 ++-- + drivers/spi/spi-npcm-fiu.c | 14 +- + drivers/spi/spi-npcm-pspi.c | 68 ++-- + drivers/spi/spi-nxp-fspi.c | 30 +- + drivers/spi/spi-oc-tiny.c | 30 +- + drivers/spi/spi-omap-uwire.c | 32 +- + drivers/spi/spi-omap2-mcspi.c | 396 ++++++++++++++------- + drivers/spi/spi-orion.c | 11 +- + drivers/spi/spi-pci1xxxx.c | 2 +- + drivers/spi/spi-pic32-sqi.c | 27 +- + drivers/spi/spi-pic32.c | 8 +- + drivers/spi/spi-pl022.c | 11 +- + drivers/spi/spi-qup.c | 50 ++- + drivers/spi/spi-rockchip.c | 30 +- + drivers/spi/spi-rzv2m-csi.c | 127 ++++--- + drivers/spi/spi-stm32.c | 3 +- + drivers/spi/spi-tegra20-slink.c | 2 + + drivers/spi/spi.c | 9 +- + drivers/spi/spidev.c | 42 +-- + include/linux/spi/spi.h | 28 +- + 64 files changed, 1210 insertions(+), 1273 deletions(-) + create mode 100644 Documentation/devicetree/bindings/spi/arm,pl022-peripheral-props.yaml +Merging tip/master (1187c0b3a6c2 Merge branch into tip/master: 'x86/tdx') +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git tip/master +Auto-merging Documentation/admin-guide/kernel-parameters.txt +Auto-merging Documentation/admin-guide/sysctl/kernel.rst +Auto-merging arch/alpha/kernel/syscalls/syscall.tbl +CONFLICT (content): Merge conflict in arch/alpha/kernel/syscalls/syscall.tbl +Auto-merging arch/powerpc/perf/core-book3s.c +Auto-merging arch/x86/Kconfig +Auto-merging arch/x86/Makefile +Auto-merging arch/x86/entry/vdso/Makefile +Auto-merging arch/x86/include/asm/bitops.h +Auto-merging arch/x86/kernel/setup.c +Auto-merging arch/x86/mm/numa.c +Auto-merging drivers/clocksource/timer-riscv.c +Auto-merging drivers/gpu/drm/amd/amdkfd/kfd_topology.c +Auto-merging include/linux/compiler.h +Auto-merging include/linux/cpuhotplug.h +Auto-merging include/linux/mm.h +Auto-merging include/linux/mm_types.h +Auto-merging include/linux/pci.h +Auto-merging include/linux/pci_ids.h +CONFLICT (content): Merge conflict in include/linux/pci_ids.h +Auto-merging include/linux/sched.h +Auto-merging include/linux/sched/numa_balancing.h +Auto-merging include/linux/sched/signal.h +Auto-merging kernel/cpu.c +Auto-merging kernel/futex/requeue.c +Auto-merging kernel/sched/core.c +Auto-merging kernel/sched/fair.c +Auto-merging kernel/signal.c +Auto-merging kernel/sysctl.c +Auto-merging mm/mempolicy.c +Auto-merging tools/objtool/noreturns.h +Resolved 'arch/alpha/kernel/syscalls/syscall.tbl' using previous resolution. +Resolved 'include/linux/pci_ids.h' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master 6a523a1e6bf8] Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git +$ git diff -M --stat --summary HEAD^.. + .../testing/sysfs-bus-event_source-devices-caps | 6 + + Documentation/admin-guide/hw-vuln/srso.rst | 24 +- + Documentation/admin-guide/kernel-parameters.txt | 11 + + Documentation/admin-guide/pm/intel_idle.rst | 17 +- + Documentation/admin-guide/sysctl/kernel.rst | 3 +- + Documentation/arch/x86/amd-memory-encryption.rst | 2 +- + Documentation/arch/x86/iommu.rst | 2 +- + Documentation/arch/x86/resctrl.rst | 38 +- + Documentation/arch/x86/topology.rst | 12 +- + .../bindings/timer/cirrus,ep9301-timer.yaml | 49 + + .../devicetree/bindings/timer/renesas,rz-mtu3.yaml | 67 +- + Documentation/scheduler/sched-capacity.rst | 13 +- + Documentation/scheduler/sched-energy.rst | 29 +- + Documentation/scheduler/sched-rt-group.rst | 40 +- + arch/alpha/include/asm/local.h | 33 +- + arch/loongarch/include/asm/local.h | 27 +- + arch/mips/include/asm/local.h | 27 +- + arch/powerpc/include/asm/local.h | 12 +- + arch/powerpc/kernel/smp.c | 4 +- + arch/powerpc/perf/core-book3s.c | 2 +- + arch/s390/kernel/topology.c | 2 +- + arch/x86/Kconfig | 63 +- + arch/x86/Makefile | 4 +- + arch/x86/boot/Makefile | 2 +- + arch/x86/boot/compressed/acpi.c | 14 +- + arch/x86/boot/compressed/cmdline.c | 4 +- + arch/x86/boot/compressed/ident_map_64.c | 7 +- + arch/x86/boot/compressed/kaslr.c | 26 +- + arch/x86/boot/compressed/mem.c | 6 +- + arch/x86/boot/compressed/misc.c | 24 +- + arch/x86/boot/compressed/misc.h | 1 - + arch/x86/boot/compressed/pgtable_64.c | 9 +- + arch/x86/boot/compressed/sev.c | 4 +- + arch/x86/boot/compressed/tdx.c | 6 +- + arch/x86/boot/compressed/vmlinux.lds.S | 6 +- + arch/x86/boot/header.S | 213 ++-- + arch/x86/boot/setup.ld | 14 +- + arch/x86/boot/tools/build.c | 273 +---- + arch/x86/coco/tdx/tdcall.S | 236 +---- + arch/x86/coco/tdx/tdx-shared.c | 28 +- + arch/x86/coco/tdx/tdx.c | 140 ++- + arch/x86/configs/i386_defconfig | 1 + + arch/x86/configs/x86_64_defconfig | 1 + + arch/x86/entry/calling.h | 2 +- + arch/x86/entry/common.c | 113 +- + arch/x86/entry/entry.S | 2 +- + arch/x86/entry/entry_32.S | 4 +- + arch/x86/entry/entry_64.S | 86 +- + arch/x86/entry/entry_64_compat.S | 11 +- + arch/x86/entry/thunk_32.S | 2 +- + arch/x86/entry/thunk_64.S | 2 +- + arch/x86/entry/vdso/Makefile | 3 +- + arch/x86/entry/vdso/vsgx.S | 1 - + arch/x86/events/amd/core.c | 2 +- + arch/x86/events/amd/uncore.c | 1116 +++++++++++++------- + arch/x86/events/core.c | 10 +- + arch/x86/events/intel/core.c | 630 ++++++----- + arch/x86/events/intel/cstate.c | 3 + + arch/x86/events/intel/ds.c | 8 +- + arch/x86/events/intel/lbr.c | 85 +- + arch/x86/events/intel/pt.c | 8 +- + arch/x86/events/intel/uncore.c | 2 +- + arch/x86/events/perf_event.h | 49 +- + arch/x86/events/perf_event_flags.h | 2 + + arch/x86/events/rapl.c | 22 +- + arch/x86/hyperv/hv_vtl.c | 2 +- + arch/x86/hyperv/ivm.c | 12 +- + arch/x86/include/asm/Kbuild | 1 - + arch/x86/include/asm/alternative.h | 4 +- + arch/x86/include/asm/apic.h | 44 +- + arch/x86/include/asm/bitops.h | 9 + + arch/x86/include/asm/boot.h | 2 + + arch/x86/include/asm/cacheinfo.h | 3 - + arch/x86/include/asm/cmpxchg.h | 6 + + arch/x86/include/asm/cpu.h | 20 +- + arch/x86/include/asm/current.h | 7 + + arch/x86/include/asm/elf.h | 3 +- + arch/x86/include/asm/fpu/sched.h | 10 +- + arch/x86/include/asm/hw_irq.h | 6 +- + arch/x86/include/asm/ia32.h | 16 +- + arch/x86/include/asm/init.h | 2 + + arch/x86/include/asm/local.h | 33 +- + arch/x86/include/asm/mce.h | 2 +- + arch/x86/include/asm/mem_encrypt.h | 4 +- + arch/x86/include/asm/microcode.h | 23 +- + arch/x86/include/asm/mpspec.h | 2 +- + arch/x86/include/asm/mshyperv.h | 4 +- + arch/x86/include/asm/msr-index.h | 21 +- + arch/x86/include/asm/nospec-branch.h | 73 +- + arch/x86/include/asm/numa.h | 7 - + arch/x86/include/asm/percpu.h | 278 ++++- + arch/x86/include/asm/perf_event.h | 13 + + arch/x86/include/asm/pgtable.h | 8 + + arch/x86/include/asm/preempt.h | 6 +- + arch/x86/include/asm/processor.h | 66 +- + arch/x86/include/asm/prom.h | 5 + + arch/x86/include/asm/proto.h | 3 + + arch/x86/include/asm/setup.h | 1 + + arch/x86/include/asm/shared/tdx.h | 91 +- + arch/x86/include/asm/smp.h | 4 +- + arch/x86/include/asm/sparsemem.h | 2 + + arch/x86/include/asm/spec-ctrl.h | 11 + + arch/x86/include/asm/svm.h | 6 - + arch/x86/include/asm/syscall.h | 6 +- + arch/x86/include/asm/tdx.h | 11 + + arch/x86/include/asm/topology.h | 12 +- + arch/x86/include/asm/x86_init.h | 2 +- + arch/x86/kernel/Makefile | 1 + + arch/x86/kernel/acpi/boot.c | 4 +- + arch/x86/kernel/amd_nb.c | 12 +- + arch/x86/kernel/apic/apic.c | 29 +- + arch/x86/kernel/apic/apic_common.c | 4 +- + arch/x86/kernel/apic/apic_flat_64.c | 10 +- + arch/x86/kernel/apic/apic_noop.c | 8 +- + arch/x86/kernel/apic/apic_numachip.c | 16 +- + arch/x86/kernel/apic/bigsmp_32.c | 6 +- + arch/x86/kernel/apic/ipi.c | 13 +- + arch/x86/kernel/apic/local.h | 7 +- + arch/x86/kernel/apic/msi.c | 8 +- + arch/x86/kernel/apic/probe_32.c | 12 +- + arch/x86/kernel/apic/x2apic_cluster.c | 1 + + arch/x86/kernel/apic/x2apic_phys.c | 7 +- + arch/x86/kernel/apic/x2apic_uv_x.c | 8 +- + arch/x86/kernel/asm-offsets.c | 33 +- + arch/x86/kernel/callthunks.c | 5 - + arch/x86/kernel/cpu/Makefile | 2 + + arch/x86/kernel/cpu/amd.c | 45 +- + arch/x86/kernel/cpu/bugs.c | 95 +- + arch/x86/kernel/cpu/cacheinfo.c | 49 +- + arch/x86/kernel/cpu/common.c | 135 ++- + arch/x86/kernel/cpu/cpu.h | 3 + + arch/x86/kernel/cpu/debugfs.c | 58 + + arch/x86/kernel/cpu/hygon.c | 48 +- + arch/x86/kernel/cpu/intel.c | 13 - + arch/x86/kernel/cpu/mce/amd.c | 70 +- + arch/x86/kernel/cpu/mce/apei.c | 4 +- + arch/x86/kernel/cpu/mce/core.c | 50 +- + arch/x86/kernel/cpu/mce/intel.c | 20 + + arch/x86/kernel/cpu/mce/internal.h | 4 + + arch/x86/kernel/cpu/microcode/amd.c | 157 ++- + arch/x86/kernel/cpu/microcode/core.c | 708 ++++++++----- + arch/x86/kernel/cpu/microcode/intel.c | 724 +++++-------- + arch/x86/kernel/cpu/microcode/internal.h | 35 +- + arch/x86/kernel/cpu/proc.c | 8 +- + arch/x86/kernel/cpu/resctrl/core.c | 11 +- + arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 14 +- + arch/x86/kernel/cpu/resctrl/internal.h | 31 +- + arch/x86/kernel/cpu/resctrl/rdtgroup.c | 281 +++-- + arch/x86/kernel/cpu/topology.c | 13 +- + arch/x86/kernel/cpu/zhaoxin.c | 14 - + arch/x86/kernel/devicetree.c | 6 +- + arch/x86/kernel/fpu/xstate.c | 1 - + arch/x86/kernel/ftrace_32.S | 2 +- + arch/x86/kernel/ftrace_64.S | 2 +- + arch/x86/kernel/head32.c | 122 ++- + arch/x86/kernel/head64.c | 17 +- + arch/x86/kernel/head_32.S | 12 +- + arch/x86/kernel/head_64.S | 9 +- + arch/x86/kernel/hpet.c | 4 +- + arch/x86/kernel/idt.c | 7 + + arch/x86/kernel/irqflags.S | 2 +- + arch/x86/kernel/kvm.c | 6 +- + arch/x86/kernel/nmi.c | 22 +- + arch/x86/kernel/process_32.c | 7 +- + arch/x86/kernel/process_64.c | 7 +- + arch/x86/kernel/setup.c | 4 +- + arch/x86/kernel/sev.c | 2 +- + arch/x86/kernel/smpboot.c | 111 +- + arch/x86/kernel/unwind_orc.c | 2 +- + arch/x86/kernel/vmlinux.lds.S | 8 +- + arch/x86/kernel/vsmp_64.c | 2 +- + arch/x86/kvm/svm/svm.c | 8 - + arch/x86/lib/checksum_32.S | 2 +- + arch/x86/lib/clear_page_64.S | 2 +- + arch/x86/lib/cmpxchg16b_emu.S | 12 +- + arch/x86/lib/cmpxchg8b_emu.S | 32 +- + arch/x86/lib/copy_page_64.S | 2 +- + arch/x86/lib/copy_user_64.S | 2 +- + arch/x86/lib/copy_user_uncached_64.S | 2 +- + arch/x86/lib/csum-wrappers_64.c | 5 - + arch/x86/lib/getuser.S | 2 +- + arch/x86/lib/hweight.S | 22 +- + arch/x86/lib/memcpy_64.S | 2 +- + arch/x86/lib/memmove_32.S | 2 +- + arch/x86/lib/memmove_64.S | 2 +- + arch/x86/lib/memset_64.S | 2 +- + arch/x86/lib/putuser.S | 3 +- + arch/x86/lib/retpoline.S | 190 ++-- + arch/x86/mm/maccess.c | 19 +- + arch/x86/mm/mem_encrypt.c | 34 + + arch/x86/mm/mem_encrypt_amd.c | 36 - + arch/x86/mm/numa.c | 94 +- + arch/x86/mm/pti.c | 58 +- + arch/x86/platform/uv/uv_nmi.c | 104 +- + arch/x86/platform/uv/uv_time.c | 2 +- + arch/x86/virt/Makefile | 2 + + arch/x86/virt/vmx/Makefile | 2 + + arch/x86/virt/vmx/tdx/Makefile | 2 + + arch/x86/virt/vmx/tdx/seamcall.S | 61 ++ + arch/x86/virt/vmx/tdx/tdxcall.S | 230 +++- + arch/x86/xen/apic.c | 10 +- + arch/x86/xen/xen-asm.S | 10 +- + drivers/acpi/numa/srat.c | 11 +- + drivers/clocksource/Kconfig | 11 + + drivers/clocksource/Makefile | 1 + + drivers/clocksource/timer-atmel-tcb.c | 1 + + drivers/clocksource/timer-ep93xx.c | 190 ++++ + drivers/clocksource/timer-imx-gpt.c | 18 +- + drivers/clocksource/timer-riscv.c | 4 + + drivers/clocksource/timer-sun5i.c | 4 +- + drivers/clocksource/timer-ti-dm.c | 36 +- + drivers/firmware/efi/libstub/Makefile | 7 - + drivers/firmware/efi/libstub/x86-stub.c | 48 +- + drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 2 +- + drivers/hwmon/fam15h_power.c | 7 +- + drivers/idle/intel_idle.c | 18 +- + drivers/irqchip/irq-ls-scfg-msi.c | 12 +- + drivers/irqchip/irq-renesas-rzg2l.c | 1 + + drivers/irqchip/irq-sifive-plic.c | 7 +- + drivers/platform/x86/intel/ifs/load.c | 8 +- + drivers/scsi/lpfc/lpfc_init.c | 8 +- + drivers/virt/acrn/hsm.c | 2 +- + drivers/xen/events/events_fifo.c | 26 +- + drivers/xen/grant-table.c | 10 +- + include/linux/atomic/atomic-arch-fallback.h | 15 +- + include/linux/atomic/atomic-instrumented.h | 10 +- + include/linux/compiler.h | 2 +- + include/linux/cpu.h | 2 + + include/linux/cpuhotplug.h | 1 - + include/linux/irq.h | 26 +- + include/linux/irqdomain.h | 2 +- + include/linux/list.h | 8 + + include/linux/mm.h | 4 +- + include/linux/mm_types.h | 31 +- + include/linux/msi.h | 6 - + include/linux/numa.h | 14 +- + include/linux/objtool.h | 13 +- + include/linux/pci.h | 34 +- + include/linux/pci_ids.h | 1 + + include/linux/perf_event.h | 25 +- + include/linux/preempt.h | 15 +- + include/linux/resctrl.h | 4 +- + include/linux/rtc.h | 17 + + include/linux/sched.h | 7 +- + include/linux/sched/deadline.h | 4 + + include/linux/sched/numa_balancing.h | 10 + + include/linux/sched/sd_flags.h | 7 + + include/linux/sched/signal.h | 3 +- + include/linux/sched/smt.h | 2 +- + include/linux/sched/topology.h | 10 +- + include/linux/sched/types.h | 2 +- + include/linux/sched/vhost_task.h | 7 +- + include/linux/seqlock.h | 52 +- + include/linux/smp.h | 2 +- + include/linux/tick.h | 10 - + include/linux/topology.h | 2 +- + include/trace/events/csd.h | 8 +- + include/trace/events/sched.h | 57 + + include/uapi/linux/perf_event.h | 13 + + include/uapi/linux/sched/types.h | 4 - + init/Makefile | 1 + + kernel/cpu.c | 18 +- + kernel/events/core.c | 153 +-- + kernel/events/ring_buffer.c | 6 + + kernel/freezer.c | 41 +- + kernel/futex/core.c | 12 +- + kernel/futex/requeue.c | 2 +- + kernel/irq/debugfs.c | 1 - + kernel/irq/generic-chip.c | 31 +- + kernel/irq/matrix.c | 6 +- + kernel/irq/msi.c | 12 +- + kernel/locking/lock_events.c | 10 +- + kernel/locking/lockdep_proc.c | 2 +- + kernel/sched/build_utility.c | 1 - + kernel/sched/core.c | 651 +++++------- + kernel/sched/cpudeadline.c | 2 +- + kernel/sched/deadline.c | 73 +- + kernel/sched/debug.c | 7 +- + kernel/sched/fair.c | 432 ++++---- + kernel/sched/features.h | 1 - + kernel/sched/idle.c | 4 +- + kernel/sched/pelt.c | 2 +- + kernel/sched/psi.c | 58 +- + kernel/sched/rt.c | 95 +- + kernel/sched/sched.h | 45 +- + kernel/sched/stop_task.c | 4 +- + kernel/sched/topology.c | 213 ++-- + kernel/signal.c | 33 +- + kernel/smp.c | 26 +- + kernel/sysctl.c | 2 +- + kernel/time/alarmtimer.c | 11 + + kernel/time/tick-sched.c | 222 ++-- + kernel/up.c | 2 +- + lib/cpumask.c | 4 +- + lib/rcuref.c | 2 +- + mm/mempolicy.c | 18 +- + scripts/Makefile.vmlinux | 1 + + scripts/Makefile.vmlinux_o | 3 +- + scripts/atomic/gen-atomic-fallback.sh | 33 +- + scripts/atomic/gen-atomic-instrumented.sh | 3 +- + scripts/faddr2line | 24 +- + tools/objtool/arch/x86/decode.c | 6 +- + tools/objtool/check.c | 16 + + tools/objtool/elf.c | 14 +- + tools/objtool/noreturns.h | 1 + + tools/objtool/objtool.c | 4 +- + tools/testing/selftests/x86/Makefile | 4 + + tools/testing/selftests/x86/lam.c | 6 +- + tools/testing/selftests/x86/nx_stack.c | 212 ++++ + 309 files changed, 6919 insertions(+), 5066 deletions(-) + create mode 100644 Documentation/devicetree/bindings/timer/cirrus,ep9301-timer.yaml + create mode 100644 arch/x86/kernel/cpu/debugfs.c + create mode 100644 arch/x86/virt/Makefile + create mode 100644 arch/x86/virt/vmx/Makefile + create mode 100644 arch/x86/virt/vmx/tdx/Makefile + create mode 100644 arch/x86/virt/vmx/tdx/seamcall.S + create mode 100644 drivers/clocksource/timer-ep93xx.c + create mode 100644 tools/testing/selftests/x86/nx_stack.c +Merging clockevents/timers/drivers/next (0a8b07c77ea0 clocksource: Explicitly include correct DT includes) +$ git merge -m Merge branch 'timers/drivers/next' of git://git.linaro.org/people/daniel.lezcano/linux.git clockevents/timers/drivers/next +Already up to date. +Merging edac/edac-for-next (6f15b178cd63 EDAC/versal: Add a Xilinx Versal memory controller driver) +$ git merge -m Merge branch 'edac-for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git edac/edac-for-next +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. + .../memory-controllers/xlnx,versal-ddrmc-edac.yaml | 57 ++ + MAINTAINERS | 7 + + drivers/edac/Kconfig | 12 + + drivers/edac/Makefile | 1 + + drivers/edac/versal_edac.c | 1069 ++++++++++++++++++++ + include/linux/firmware/xlnx-zynqmp.h | 12 + + 6 files changed, 1158 insertions(+) + create mode 100644 Documentation/devicetree/bindings/memory-controllers/xlnx,versal-ddrmc-edac.yaml + create mode 100644 drivers/edac/versal_edac.c +Merging irqchip/irq/irqchip-next (19b5a44bee16 irqchip: Add support for Amlogic-C3 SoCs) +$ git merge -m Merge branch 'irq/irqchip-next' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git irqchip/irq/irqchip-next +Already up to date. +Merging ftrace/for-next (c7cda5f2ae07 Merge probes/for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git ftrace/for-next +Auto-merging MAINTAINERS +Auto-merging arch/powerpc/kernel/setup-common.c +Auto-merging fs/tracefs/inode.c +Auto-merging include/linux/trace_events.h +Auto-merging kernel/trace/fprobe.c +Auto-merging lib/Kconfig.debug +Auto-merging lib/Makefile +Auto-merging tools/testing/selftests/user_events/abi_test.c +CONFLICT (content): Merge conflict in tools/testing/selftests/user_events/abi_test.c +Resolved 'tools/testing/selftests/user_events/abi_test.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master 7ed478f09c9d] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git +$ git diff -M --stat --summary HEAD^.. + Documentation/filesystems/proc.rst | 8 +- + Documentation/trace/user_events.rst | 21 +- + MAINTAINERS | 7 + + arch/powerpc/kernel/setup-common.c | 1 - + fs/proc/bootconfig.c | 6 + + fs/tracefs/event_inode.c | 882 +++++++++++---------- + fs/tracefs/inode.c | 2 +- + fs/tracefs/internal.h | 37 +- + include/linux/freelist.h | 129 --- + include/linux/kprobes.h | 11 +- + include/linux/objpool.h | 181 +++++ + include/linux/rethook.h | 16 +- + include/linux/seq_buf.h | 7 +- + include/linux/trace_events.h | 2 +- + include/linux/trace_seq.h | 2 + + include/linux/tracefs.h | 30 +- + include/uapi/linux/user_events.h | 11 +- + kernel/kprobes.c | 91 +-- + kernel/trace/fprobe.c | 26 +- + kernel/trace/rethook.c | 100 +-- + kernel/trace/ring_buffer.c | 8 +- + kernel/trace/trace.c | 64 +- + kernel/trace/trace.h | 13 +- + kernel/trace/trace_eprobe.c | 5 +- + kernel/trace/trace_events.c | 333 +++++--- + kernel/trace/trace_events_hist.c | 11 +- + kernel/trace/trace_events_user.c | 36 +- + kernel/trace/trace_seq.c | 6 +- + lib/Kconfig.debug | 11 + + lib/Makefile | 4 +- + lib/objpool.c | 280 +++++++ + lib/seq_buf.c | 22 +- + lib/test_objpool.c | 690 ++++++++++++++++ + samples/kprobes/kretprobe_example.c | 2 +- + .../ftrace/test.d/kprobe/kprobe_args_char.tc | 4 +- + .../ftrace/test.d/kprobe/kprobe_args_string.tc | 4 +- + tools/testing/selftests/user_events/abi_test.c | 55 +- + tools/testing/selftests/user_events/dyn_test.c | 54 +- + 38 files changed, 2245 insertions(+), 927 deletions(-) + delete mode 100644 include/linux/freelist.h + create mode 100644 include/linux/objpool.h + create mode 100644 lib/objpool.c + create mode 100644 lib/test_objpool.c +Merging rcu/rcu/next (5df10099418f srcu: Explain why callbacks invocations can't run concurrently) +$ git merge -m Merge branch 'rcu/next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git rcu/rcu/next +Auto-merging Documentation/admin-guide/kernel-parameters.txt +Auto-merging arch/arm64/kernel/smp.c +Auto-merging arch/powerpc/kernel/smp.c +Auto-merging arch/s390/kernel/smp.c +Auto-merging arch/x86/kernel/smpboot.c +Auto-merging include/linux/interrupt.h +Auto-merging kernel/cpu.c +Auto-merging kernel/rcu/tree.c +Auto-merging kernel/smp.c +Auto-merging mm/slab_common.c +Auto-merging mm/util.c +Merge made by the 'ort' strategy. + .../Expedited-Grace-Periods.rst | 2 +- + .../Memory-Ordering/TreeRCU-callback-registry.svg | 9 - + .../RCU/Design/Memory-Ordering/TreeRCU-gp-fqs.svg | 4 +- + .../RCU/Design/Memory-Ordering/TreeRCU-gp.svg | 13 +- + .../RCU/Design/Memory-Ordering/TreeRCU-hotplug.svg | 4 +- + .../RCU/Design/Requirements/Requirements.rst | 4 +- + Documentation/RCU/checklist.rst | 25 ++- + Documentation/RCU/listRCU.rst | 9 + + Documentation/RCU/torture.rst | 2 +- + Documentation/RCU/whatisRCU.rst | 4 +- + Documentation/admin-guide/kernel-parameters.txt | 77 ++++++- + Documentation/memory-barriers.txt | 7 + + arch/arm64/kernel/smp.c | 4 +- + arch/powerpc/kernel/smp.c | 2 +- + arch/s390/kernel/smp.c | 2 +- + arch/x86/kernel/smpboot.c | 2 +- + include/linux/interrupt.h | 2 +- + include/linux/rcu_notifier.h | 32 +++ + include/linux/rculist.h | 2 +- + include/linux/rcupdate.h | 2 - + include/linux/rcutiny.h | 2 +- + include/linux/rcutree.h | 17 +- + include/linux/slab.h | 5 +- + include/linux/torture.h | 8 +- + kernel/cpu.c | 13 +- + kernel/locking/locktorture.c | 216 +++++++++++++----- + kernel/rcu/rcu.h | 17 +- + kernel/rcu/rcu_segcblist.c | 4 +- + kernel/rcu/rcutorture.c | 37 +++- + kernel/rcu/refscale.c | 6 +- + kernel/rcu/srcutiny.c | 1 + + kernel/rcu/srcutree.c | 92 +++++--- + kernel/rcu/tasks.h | 15 +- + kernel/rcu/tiny.c | 1 + + kernel/rcu/tree.c | 242 +++++++++++++++------ + kernel/rcu/tree.h | 4 + + kernel/rcu/tree_exp.h | 6 +- + kernel/rcu/tree_stall.h | 135 ++++++++---- + kernel/rcu/update.c | 9 +- + kernel/smp.c | 13 +- + kernel/torture.c | 75 +++---- + mm/slab_common.c | 41 +--- + mm/util.c | 4 +- + scripts/checkpatch.pl | 9 - + tools/include/nolibc/Makefile | 1 + + tools/include/nolibc/arch-aarch64.h | 3 - + tools/include/nolibc/arch-loongarch.h | 4 +- + tools/include/nolibc/arch-riscv.h | 3 - + tools/include/nolibc/arch-x86_64.h | 42 ++++ + tools/include/nolibc/crt.h | 23 +- + tools/include/nolibc/nolibc.h | 4 +- + tools/include/nolibc/stdarg.h | 16 ++ + tools/include/nolibc/stdio.h | 3 +- + tools/include/nolibc/string.h | 38 ++-- + tools/include/nolibc/sys.h | 57 +++-- + tools/testing/selftests/nolibc/.gitignore | 1 + + tools/testing/selftests/nolibc/Makefile | 57 +++-- + .../testing/selftests/nolibc/nolibc-test-linkage.c | 26 +++ + .../testing/selftests/nolibc/nolibc-test-linkage.h | 9 + + tools/testing/selftests/nolibc/nolibc-test.c | 28 ++- + .../testing/selftests/rcutorture/bin/functions.sh | 29 +++ + .../selftests/rcutorture/bin/kvm-recheck.sh | 2 +- + tools/testing/selftests/rcutorture/bin/kvm.sh | 17 +- + .../selftests/rcutorture/bin/parse-console.sh | 9 +- + tools/testing/selftests/rcutorture/bin/torture.sh | 2 +- + .../selftests/rcutorture/configs/rcu/TRACE02 | 1 + + 66 files changed, 1090 insertions(+), 465 deletions(-) + create mode 100644 include/linux/rcu_notifier.h + create mode 100644 tools/include/nolibc/stdarg.h + create mode 100644 tools/testing/selftests/nolibc/nolibc-test-linkage.c + create mode 100644 tools/testing/selftests/nolibc/nolibc-test-linkage.h + mode change 100644 => 100755 tools/testing/selftests/rcutorture/bin/functions.sh +Merging kvm/next (2b3f2325e71f Merge tag 'kvm-x86-selftests-6.6-fixes' of https://github.com/kvm-x86/linux into HEAD) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/virt/kvm/kvm.git kvm/next +Already up to date. +Merging kvm-arm/next (054484138f49 Merge branch kvm-arm64/misc into kvmarm/next) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git kvm-arm/next +Auto-merging Documentation/virt/kvm/api.rst +Auto-merging arch/arm64/include/asm/kvm_arm.h +Auto-merging arch/arm64/include/asm/kvm_emulate.h +Auto-merging arch/arm64/include/asm/kvm_host.h +Auto-merging arch/arm64/include/asm/kvm_mmu.h +Auto-merging arch/arm64/include/asm/tlbflush.h +Auto-merging arch/arm64/kernel/traps.c +Auto-merging arch/arm64/kvm/arch_timer.c +Auto-merging arch/arm64/kvm/arm.c +CONFLICT (content): Merge conflict in arch/arm64/kvm/arm.c +Auto-merging arch/arm64/kvm/emulate-nested.c +Auto-merging arch/arm64/kvm/hyp/pgtable.c +Auto-merging arch/arm64/kvm/hyp/vhe/switch.c +Auto-merging arch/arm64/kvm/mmu.c +Auto-merging arch/arm64/kvm/sys_regs.c +Auto-merging include/kvm/arm_arch_timer.h +Auto-merging include/uapi/linux/kvm.h +Auto-merging tools/perf/Makefile.perf +Auto-merging tools/perf/util/Build +Resolved 'arch/arm64/kvm/arm.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master eee94ea3e61e] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git +$ git diff -M --stat --summary HEAD^.. + Documentation/virt/kvm/api.rst | 52 ++ + Documentation/virt/kvm/arm/index.rst | 1 + + Documentation/virt/kvm/arm/vcpu-features.rst | 48 ++ + Documentation/virt/kvm/devices/arm-vgic-v3.rst | 7 + + arch/arm64/include/asm/kvm_arm.h | 4 +- + arch/arm64/include/asm/kvm_emulate.h | 15 +- + arch/arm64/include/asm/kvm_host.h | 61 +- + arch/arm64/include/asm/kvm_hyp.h | 7 +- + arch/arm64/include/asm/kvm_mmu.h | 45 +- + arch/arm64/include/asm/kvm_nested.h | 3 +- + arch/arm64/include/asm/stage2_pgtable.h | 4 +- + arch/arm64/include/asm/sysreg.h | 45 ++ + arch/arm64/include/asm/tlbflush.h | 8 +- + arch/arm64/include/asm/traps.h | 54 +- + arch/arm64/include/uapi/asm/kvm.h | 32 + + arch/arm64/kernel/traps.c | 48 +- + arch/arm64/kvm/arch_timer.c | 6 +- + arch/arm64/kvm/arm.c | 200 ++++- + arch/arm64/kvm/emulate-nested.c | 77 +- + arch/arm64/kvm/hyp/include/hyp/switch.h | 17 + + arch/arm64/kvm/hyp/include/nvhe/fixed_config.h | 3 +- + arch/arm64/kvm/hyp/nvhe/mem_protect.c | 8 +- + arch/arm64/kvm/hyp/nvhe/pkvm.c | 4 +- + arch/arm64/kvm/hyp/nvhe/switch.c | 2 + + arch/arm64/kvm/hyp/pgtable.c | 4 +- + arch/arm64/kvm/hyp/vhe/switch.c | 34 +- + arch/arm64/kvm/hyp/vhe/sysreg-sr.c | 11 +- + arch/arm64/kvm/hyp/vhe/tlb.c | 18 +- + arch/arm64/kvm/hypercalls.c | 36 +- + arch/arm64/kvm/mmio.c | 4 +- + arch/arm64/kvm/mmu.c | 92 +-- + arch/arm64/kvm/pkvm.c | 2 +- + arch/arm64/kvm/pmu-emul.c | 145 +++- + arch/arm64/kvm/reset.c | 56 +- + arch/arm64/kvm/sys_regs.c | 353 +++++++-- + arch/arm64/kvm/trace_arm.h | 25 + + arch/arm64/kvm/vgic/vgic-debug.c | 6 +- + arch/arm64/kvm/vgic/vgic-irqfd.c | 2 +- + arch/arm64/kvm/vgic/vgic-its.c | 49 +- + arch/arm64/kvm/vgic/vgic-kvm-device.c | 11 +- + arch/arm64/kvm/vgic/vgic-mmio-v3.c | 156 ++-- + arch/arm64/kvm/vgic/vgic.c | 12 +- + arch/arm64/kvm/vmid.c | 11 +- + include/kvm/arm_arch_timer.h | 2 +- + include/kvm/arm_pmu.h | 28 +- + include/kvm/arm_psci.h | 2 +- + include/kvm/arm_vgic.h | 4 +- + include/linux/perf/arm_pmuv3.h | 9 +- + include/uapi/linux/kvm.h | 2 + + tools/arch/arm64/include/.gitignore | 1 + + tools/arch/arm64/include/asm/gpr-num.h | 26 + + tools/arch/arm64/include/asm/sysreg.h | 841 +++++---------------- + tools/arch/arm64/tools/Makefile | 38 + + tools/include/perf/arm_pmuv3.h | 308 ++++++++ + tools/perf/Makefile.perf | 15 +- + tools/perf/util/Build | 2 +- + tools/testing/selftests/kvm/Makefile | 25 +- + .../selftests/kvm/aarch64/aarch32_id_regs.c | 4 +- + .../selftests/kvm/aarch64/debug-exceptions.c | 12 +- + .../selftests/kvm/aarch64/page_fault_test.c | 11 +- + tools/testing/selftests/kvm/aarch64/set_id_regs.c | 481 ++++++++++++ + .../selftests/kvm/aarch64/vpmu_counter_access.c | 670 ++++++++++++++++ + .../selftests/kvm/include/aarch64/processor.h | 1 + + .../testing/selftests/kvm/lib/aarch64/processor.c | 6 +- + 64 files changed, 3028 insertions(+), 1238 deletions(-) + create mode 100644 Documentation/virt/kvm/arm/vcpu-features.rst + create mode 100644 tools/arch/arm64/include/.gitignore + create mode 100644 tools/arch/arm64/include/asm/gpr-num.h + create mode 100644 tools/arch/arm64/tools/Makefile + create mode 100644 tools/include/perf/arm_pmuv3.h + create mode 100644 tools/testing/selftests/kvm/aarch64/set_id_regs.c + create mode 100644 tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c +Merging kvms390/next (70fea3019516 KVM: s390: add tracepoint in gmap notifier) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git kvms390/next +Auto-merging arch/s390/kvm/gaccess.c +Auto-merging arch/s390/kvm/kvm-s390.c +Merge made by the 'ort' strategy. + arch/s390/include/asm/kvm_host.h | 7 +++++++ + arch/s390/kvm/gaccess.c | 7 +++++++ + arch/s390/kvm/kvm-s390.c | 11 ++++++++++- + arch/s390/kvm/trace-s390.h | 23 +++++++++++++++++++++++ + arch/s390/kvm/vsie.c | 5 ++++- + 5 files changed, 51 insertions(+), 2 deletions(-) +Merging kvm-ppc/topic/ppc-kvm (b7bce570430e powerpc/kvm: Force cast endianness of KVM shared regs) +$ git merge -m Merge branch 'topic/ppc-kvm' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git kvm-ppc/topic/ppc-kvm +CONFLICT (file location): Documentation/powerpc/kvm-nested.rst added in kvm-ppc/topic/ppc-kvm inside a directory that was renamed in HEAD, suggesting it should perhaps be moved to Documentation/arch/powerpc/kvm-nested.rst. +Auto-merging arch/powerpc/Kconfig.debug +Auto-merging arch/powerpc/kvm/book3s_64_vio.c +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master 0f08a21980fd] Merge branch 'topic/ppc-kvm' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git +$ git diff -M --stat --summary HEAD^.. + Documentation/arch/powerpc/index.rst | 1 + + Documentation/arch/powerpc/kvm-nested.rst | 634 ++++++++++++++++ + arch/powerpc/Kconfig.debug | 12 + + arch/powerpc/include/asm/guest-state-buffer.h | 995 ++++++++++++++++++++++++++ + arch/powerpc/include/asm/hvcall.h | 30 + + arch/powerpc/include/asm/kvm_book3s.h | 220 +++++- + arch/powerpc/include/asm/kvm_book3s_64.h | 8 +- + arch/powerpc/include/asm/kvm_booke.h | 10 + + arch/powerpc/include/asm/kvm_host.h | 22 +- + arch/powerpc/include/asm/kvm_ppc.h | 110 ++- + arch/powerpc/include/asm/plpar_wrappers.h | 267 ++++++- + arch/powerpc/kvm/Makefile | 4 + + arch/powerpc/kvm/book3s.c | 38 +- + arch/powerpc/kvm/book3s_64_mmu_hv.c | 7 +- + arch/powerpc/kvm/book3s_64_mmu_radix.c | 31 +- + arch/powerpc/kvm/book3s_64_vio.c | 4 +- + arch/powerpc/kvm/book3s_hv.c | 360 +++++++--- + arch/powerpc/kvm/book3s_hv.h | 76 ++ + arch/powerpc/kvm/book3s_hv_builtin.c | 11 +- + arch/powerpc/kvm/book3s_hv_nested.c | 44 +- + arch/powerpc/kvm/book3s_hv_nestedv2.c | 994 +++++++++++++++++++++++++ + arch/powerpc/kvm/book3s_hv_p9_entry.c | 4 +- + arch/powerpc/kvm/book3s_hv_ras.c | 4 +- + arch/powerpc/kvm/book3s_hv_rm_mmu.c | 8 +- + arch/powerpc/kvm/book3s_hv_rm_xics.c | 4 +- + arch/powerpc/kvm/book3s_hv_uvmem.c | 2 +- + arch/powerpc/kvm/book3s_xive.c | 12 +- + arch/powerpc/kvm/emulate_loadstore.c | 6 +- + arch/powerpc/kvm/guest-state-buffer.c | 621 ++++++++++++++++ + arch/powerpc/kvm/powerpc.c | 76 +- + arch/powerpc/kvm/test-guest-state-buffer.c | 328 +++++++++ + 31 files changed, 4675 insertions(+), 268 deletions(-) + create mode 100644 Documentation/arch/powerpc/kvm-nested.rst + create mode 100644 arch/powerpc/include/asm/guest-state-buffer.h + create mode 100644 arch/powerpc/kvm/book3s_hv_nestedv2.c + create mode 100644 arch/powerpc/kvm/guest-state-buffer.c + create mode 100644 arch/powerpc/kvm/test-guest-state-buffer.c +Merging kvm-riscv/riscv_kvm_next (d9c00f44e5de KVM: riscv: selftests: Add SBI DBCN extension to get-reg-list test) +$ git merge -m Merge branch 'riscv_kvm_next' of https://github.com/kvm-riscv/linux.git kvm-riscv/riscv_kvm_next +Auto-merging MAINTAINERS +Auto-merging arch/riscv/include/asm/csr.h +CONFLICT (content): Merge conflict in arch/riscv/include/asm/csr.h +Auto-merging arch/riscv/include/asm/hwcap.h +Auto-merging arch/riscv/kernel/cpufeature.c +Recorded preimage for 'arch/riscv/include/asm/csr.h' +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +Recorded resolution for 'arch/riscv/include/asm/csr.h'. +[master 7d284c8d39e7] Merge branch 'riscv_kvm_next' of https://github.com/kvm-riscv/linux.git +$ git diff -M --stat --summary HEAD^.. + .../devicetree/bindings/riscv/extensions.yaml | 12 ++ + MAINTAINERS | 1 + + arch/riscv/include/asm/csr.h | 17 ++ + arch/riscv/include/asm/hwcap.h | 2 + + arch/riscv/include/asm/kvm_host.h | 18 ++ + arch/riscv/include/asm/kvm_vcpu_sbi.h | 7 +- + arch/riscv/include/asm/sbi.h | 7 + + arch/riscv/include/uapi/asm/kvm.h | 12 ++ + arch/riscv/kernel/cpufeature.c | 2 + + arch/riscv/kvm/vcpu.c | 74 +++++-- + arch/riscv/kvm/vcpu_onereg.c | 72 ++++++- + arch/riscv/kvm/vcpu_sbi.c | 61 +++--- + arch/riscv/kvm/vcpu_sbi_replace.c | 32 +++ + tools/testing/selftests/kvm/riscv/get-reg-list.c | 235 +++++++++++++-------- + 14 files changed, 417 insertions(+), 135 deletions(-) +Merging kvm-x86/next (8b6a9d2f7c43 Merge branches 'guest_memfd', 'lam', 'misc', 'mmu' and 'pmu') +$ git merge -m Merge branch 'next' of https://github.com/kvm-x86/linux.git kvm-x86/next +Auto-merging Documentation/virt/kvm/api.rst +CONFLICT (content): Merge conflict in Documentation/virt/kvm/api.rst +Auto-merging arch/arm64/include/asm/kvm_host.h +Auto-merging arch/powerpc/include/asm/kvm_host.h +Auto-merging arch/powerpc/kvm/book3s_hv.c +Auto-merging arch/powerpc/kvm/powerpc.c +Auto-merging arch/riscv/include/asm/kvm_host.h +Auto-merging arch/x86/include/asm/msr-index.h +Auto-merging arch/x86/kvm/mmu/mmu.c +Auto-merging arch/x86/kvm/svm/svm.c +Auto-merging fs/anon_inodes.c +Auto-merging include/linux/pagemap.h +Auto-merging include/uapi/linux/kvm.h +CONFLICT (content): Merge conflict in include/uapi/linux/kvm.h +Auto-merging mm/compaction.c +Auto-merging mm/migrate.c +Auto-merging tools/testing/selftests/kvm/Makefile +Recorded preimage for 'Documentation/virt/kvm/api.rst' +Recorded preimage for 'include/uapi/linux/kvm.h' +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +Recorded resolution for 'Documentation/virt/kvm/api.rst'. +Recorded resolution for 'include/uapi/linux/kvm.h'. +[master a8ffdbcc2c2b] Merge branch 'next' of https://github.com/kvm-x86/linux.git +$ git diff -M --stat --summary HEAD^.. + Documentation/virt/kvm/api.rst | 244 ++++++++- + Documentation/virt/kvm/x86/mmu.rst | 43 +- + arch/arm64/include/asm/kvm_host.h | 2 - + arch/arm64/kvm/Kconfig | 2 +- + arch/mips/include/asm/kvm_host.h | 2 - + arch/mips/kvm/Kconfig | 2 +- + arch/powerpc/include/asm/kvm_host.h | 2 - + arch/powerpc/kvm/Kconfig | 8 +- + arch/powerpc/kvm/book3s_hv.c | 2 +- + arch/powerpc/kvm/powerpc.c | 7 +- + arch/riscv/include/asm/kvm_host.h | 2 - + arch/riscv/kvm/Kconfig | 2 +- + arch/x86/include/asm/cpufeatures.h | 1 + + arch/x86/include/asm/kvm-x86-ops.h | 4 +- + arch/x86/include/asm/kvm_host.h | 44 +- + arch/x86/include/asm/msr-index.h | 1 + + arch/x86/include/uapi/asm/kvm.h | 3 + + arch/x86/kvm/Kconfig | 25 +- + arch/x86/kvm/cpuid.c | 12 +- + arch/x86/kvm/cpuid.h | 16 +- + arch/x86/kvm/debugfs.c | 2 +- + arch/x86/kvm/emulate.c | 27 +- + arch/x86/kvm/governed_features.h | 1 + + arch/x86/kvm/hyperv.c | 10 +- + arch/x86/kvm/kvm_emulate.h | 9 + + arch/x86/kvm/lapic.c | 30 +- + arch/x86/kvm/mmu.h | 15 + + arch/x86/kvm/mmu/mmu.c | 310 ++++++++++- + arch/x86/kvm/mmu/mmu_internal.h | 3 + + arch/x86/kvm/mmu/paging_tmpl.h | 2 +- + arch/x86/kvm/mtrr.c | 2 +- + arch/x86/kvm/smm.c | 1 - + arch/x86/kvm/svm/nested.c | 4 +- + arch/x86/kvm/svm/svm.c | 52 +- + arch/x86/kvm/vmx/nested.c | 11 +- + arch/x86/kvm/vmx/sgx.c | 1 + + arch/x86/kvm/vmx/vmx.c | 111 ++-- + arch/x86/kvm/vmx/vmx.h | 2 + + arch/x86/kvm/x86.c | 292 +++++++--- + arch/x86/kvm/x86.h | 3 + + arch/x86/kvm/xen.c | 59 +- + fs/anon_inodes.c | 1 + + include/linux/kvm_host.h | 143 ++++- + include/linux/kvm_types.h | 1 + + include/linux/pagemap.h | 19 +- + include/uapi/linux/kvm.h | 51 ++ + mm/compaction.c | 43 +- + mm/migrate.c | 2 + + tools/testing/selftests/kvm/Makefile | 4 + + tools/testing/selftests/kvm/dirty_log_test.c | 2 +- + tools/testing/selftests/kvm/guest_memfd_test.c | 221 ++++++++ + .../testing/selftests/kvm/include/kvm_util_base.h | 148 ++++- + tools/testing/selftests/kvm/include/test_util.h | 5 + + tools/testing/selftests/kvm/include/ucall_common.h | 11 + + .../selftests/kvm/include/x86_64/processor.h | 15 + + tools/testing/selftests/kvm/kvm_page_table_test.c | 2 +- + tools/testing/selftests/kvm/lib/kvm_util.c | 233 +++++--- + tools/testing/selftests/kvm/lib/memstress.c | 3 +- + .../testing/selftests/kvm/set_memory_region_test.c | 100 ++++ + tools/testing/selftests/kvm/x86_64/hwcr_msr_test.c | 47 ++ + .../kvm/x86_64/private_mem_conversions_test.c | 487 +++++++++++++++++ + .../kvm/x86_64/private_mem_kvm_exits_test.c | 120 ++++ + .../selftests/kvm/x86_64/ucna_injection_test.c | 2 +- + virt/kvm/Kconfig | 17 + + virt/kvm/Makefile.kvm | 1 + + virt/kvm/dirty_ring.c | 2 +- + virt/kvm/guest_memfd.c | 607 +++++++++++++++++++++ + virt/kvm/kvm_main.c | 505 ++++++++++++++--- + virt/kvm/kvm_mm.h | 26 + + 69 files changed, 3712 insertions(+), 477 deletions(-) + create mode 100644 tools/testing/selftests/kvm/guest_memfd_test.c + create mode 100644 tools/testing/selftests/kvm/x86_64/hwcr_msr_test.c + create mode 100644 tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c + create mode 100644 tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c + create mode 100644 virt/kvm/guest_memfd.c +$ git am -3 ../patches/0001-fix-up-for-KVM-Add-KVM_CREATE_GUEST_MEMFD-ioctl-for-.patch +Applying: fix up for "KVM: Add KVM_CREATE_GUEST_MEMFD ioctl() for guest-specific backing memory" +$ git reset HEAD^ +Unstaged changes after reset: +M virt/kvm/guest_memfd.c +$ git add -A . +$ git commit -v -a --amend +[master bd6afa009a28] Merge branch 'next' of https://github.com/kvm-x86/linux.git + Date: Mon Oct 30 13:10:28 2023 +1100 +Merging xen-tip/linux-next (2c269f42d0f3 xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled) +$ git merge -m Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip.git xen-tip/linux-next +Merge made by the 'ort' strategy. + drivers/xen/Kconfig | 8 +- + drivers/xen/events/events_base.c | 3 +- + drivers/xen/evtchn.c | 2 +- + drivers/xen/privcmd.c | 407 +++++++++++++++++++++++- + drivers/xen/xen-pciback/conf_space.c | 19 +- + drivers/xen/xen-pciback/conf_space_capability.c | 8 +- + drivers/xen/xen-pciback/conf_space_header.c | 21 +- + drivers/xen/xenbus/xenbus_dev_frontend.c | 4 +- + drivers/xen/xenbus/xenbus_probe.c | 2 +- + include/uapi/xen/privcmd.h | 22 +- + include/xen/interface/hvm/ioreq.h | 51 +++ + 11 files changed, 508 insertions(+), 39 deletions(-) + create mode 100644 include/xen/interface/hvm/ioreq.h +Merging percpu/for-next (3fcf62f24c80 Merge branch 'for-6.6' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu.git percpu/for-next +Merge made by the 'ort' strategy. +Merging workqueues/for-next (d5ce8f4ed90b Merge branch 'for-6.7' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git workqueues/for-next +Auto-merging kernel/workqueue.c +Merge made by the 'ort' strategy. + include/linux/workqueue.h | 46 ++- + kernel/workqueue.c | 20 +- + rust/bindings/bindings_helper.h | 1 + + rust/helpers.c | 13 + + rust/kernel/lib.rs | 3 + + rust/kernel/sync/arc.rs | 46 ++- + rust/kernel/workqueue.rs | 679 ++++++++++++++++++++++++++++++++++++++++ + scripts/Makefile.build | 2 +- + 8 files changed, 792 insertions(+), 18 deletions(-) + create mode 100644 rust/kernel/workqueue.rs +Merging drivers-x86/for-next (ac9bc85c49ff platform/x86: wmi: Decouple WMI device removal from wmi_block_list) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git drivers-x86/for-next +Auto-merging arch/x86/include/asm/msr-index.h +Auto-merging drivers/gpio/gpiolib-acpi.c +Auto-merging drivers/platform/mellanox/mlxbf-tmfifo.c +Auto-merging drivers/platform/surface/surface_acpi_notify.c +Auto-merging drivers/platform/x86/asus-nb-wmi.c +Auto-merging drivers/platform/x86/asus-wmi.c +Auto-merging drivers/platform/x86/asus-wmi.h +Auto-merging drivers/platform/x86/intel/ifs/load.c +Auto-merging drivers/platform/x86/intel/ifs/runtest.c +Auto-merging drivers/platform/x86/msi-ec.c +Auto-merging drivers/platform/x86/think-lmi.c +Auto-merging drivers/platform/x86/thinkpad_acpi.c +Merge made by the 'ort' strategy. + .../ABI/testing/sysfs-class-firmware-attributes | 30 + + .../admin-guide/laptops/thinkpad-acpi.rst | 20 + + Documentation/arch/x86/amd_hsmp.rst | 18 + + arch/x86/include/asm/msr-index.h | 1 + + arch/x86/include/uapi/asm/amd_hsmp.h | 109 ++++ + drivers/gpio/gpiolib-acpi.c | 30 +- + drivers/platform/mellanox/mlxbf-bootctl.c | 6 +- + drivers/platform/mellanox/mlxbf-pmc.c | 688 ++++++++++++++++++++- + drivers/platform/mellanox/mlxbf-tmfifo.c | 6 +- + drivers/platform/mellanox/mlxreg-hotplug.c | 6 +- + drivers/platform/mellanox/mlxreg-io.c | 6 +- + drivers/platform/mellanox/mlxreg-lc.c | 8 +- + drivers/platform/mellanox/nvsw-sn2201.c | 6 +- + drivers/platform/surface/surface3-wmi.c | 5 +- + drivers/platform/surface/surface_acpi_notify.c | 6 +- + drivers/platform/surface/surface_aggregator_cdev.c | 5 +- + .../platform/surface/surface_aggregator_registry.c | 5 +- + drivers/platform/surface/surface_dtx.c | 5 +- + drivers/platform/surface/surface_gpe.c | 6 +- + drivers/platform/surface/surface_hotplug.c | 6 +- + drivers/platform/x86/acer-wmi.c | 2 - + drivers/platform/x86/amd/hsmp.c | 243 +++++++- + drivers/platform/x86/amd/pmc/pmc.c | 88 ++- + drivers/platform/x86/asus-nb-wmi.c | 16 + + drivers/platform/x86/asus-wireless.c | 12 +- + drivers/platform/x86/asus-wmi.c | 133 ++++ + drivers/platform/x86/asus-wmi.h | 1 + + .../x86/hp/hp-bioscfg/biosattr-interface.c | 2 +- + drivers/platform/x86/intel/bytcrc_pwrsrc.c | 5 +- + drivers/platform/x86/intel/ifs/core.c | 15 +- + drivers/platform/x86/intel/ifs/ifs.h | 64 +- + drivers/platform/x86/intel/ifs/load.c | 158 ++++- + drivers/platform/x86/intel/ifs/runtest.c | 72 ++- + .../platform/x86/intel/int3472/clk_and_regulator.c | 54 +- + drivers/platform/x86/intel/int3472/common.h | 7 +- + drivers/platform/x86/intel/int3472/discrete.c | 101 ++- + drivers/platform/x86/intel/int3472/led.c | 24 +- + .../x86/intel/speed_select_if/isst_if_mmio.c | 21 +- + .../x86/intel/speed_select_if/isst_tpmi_core.c | 21 +- + drivers/platform/x86/intel/tpmi.c | 81 ++- + .../intel/uncore-frequency/uncore-frequency-tpmi.c | 18 +- + drivers/platform/x86/mlx-platform.c | 31 +- + drivers/platform/x86/msi-ec.c | 483 ++++++++++++++- + drivers/platform/x86/msi-ec.h | 4 +- + drivers/platform/x86/sel3350-platform.c | 6 +- + .../x86/siemens/simatic-ipc-batt-apollolake.c | 6 +- + .../x86/siemens/simatic-ipc-batt-elkhartlake.c | 6 +- + .../platform/x86/siemens/simatic-ipc-batt-f7188x.c | 6 +- + drivers/platform/x86/siemens/simatic-ipc-batt.c | 9 +- + drivers/platform/x86/siemens/simatic-ipc-batt.h | 4 +- + drivers/platform/x86/think-lmi.c | 214 +++++-- + drivers/platform/x86/think-lmi.h | 16 + + drivers/platform/x86/thinkpad_acpi.c | 95 ++- + drivers/platform/x86/wmi.c | 263 ++++---- + drivers/platform/x86/x86-android-tablets/asus.c | 1 + + drivers/platform/x86/x86-android-tablets/core.c | 132 ++-- + drivers/platform/x86/x86-android-tablets/lenovo.c | 29 +- + drivers/platform/x86/x86-android-tablets/other.c | 11 +- + .../x86/x86-android-tablets/x86-android-tablets.h | 7 +- + drivers/platform/x86/xo15-ebook.c | 9 +- + include/linux/intel_tpmi.h | 6 + + include/linux/platform_data/x86/asus-wmi.h | 4 + + include/linux/surface_aggregator/controller.h | 2 +- + include/trace/events/intel_ifs.h | 16 +- + tools/power/x86/intel-speed-select/isst-config.c | 213 +++++-- + tools/power/x86/intel-speed-select/isst-daemon.c | 3 +- + tools/power/x86/intel-speed-select/isst.h | 3 +- + 67 files changed, 3023 insertions(+), 666 deletions(-) +Merging chrome-platform/for-next (47ea0ddb1f56 platform/chrome: cros_ec_lpc: Separate host command and irq disable) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git chrome-platform/for-next +Merge made by the 'ort' strategy. + drivers/platform/chrome/Kconfig | 6 +- + drivers/platform/chrome/Makefile | 5 +- + drivers/platform/chrome/cros_ec.c | 116 +++++++++++++++++---- + drivers/platform/chrome/cros_ec.h | 6 ++ + drivers/platform/chrome/cros_ec_chardev.c | 6 +- + drivers/platform/chrome/cros_ec_debugfs.c | 6 +- + drivers/platform/chrome/cros_ec_lightbar.c | 6 +- + drivers/platform/chrome/cros_ec_lpc.c | 28 +++-- + drivers/platform/chrome/cros_ec_proto.c | 2 +- + drivers/platform/chrome/cros_ec_proto_test.c | 3 +- + ...cros_kunit_util.c => cros_ec_proto_test_util.c} | 4 +- + ...cros_kunit_util.h => cros_ec_proto_test_util.h} | 0 + drivers/platform/chrome/cros_ec_sysfs.c | 6 +- + drivers/platform/chrome/cros_ec_typec.c | 18 ++-- + drivers/platform/chrome/cros_ec_vbc.c | 6 +- + drivers/platform/chrome/cros_typec_switch.c | 5 +- + drivers/platform/chrome/cros_typec_vdm.c | 2 +- + drivers/platform/chrome/cros_typec_vdm.h | 2 +- + drivers/platform/chrome/cros_usbpd_logger.c | 6 +- + drivers/platform/chrome/cros_usbpd_notify.c | 12 +-- + drivers/platform/chrome/wilco_ec/core.c | 5 +- + drivers/platform/chrome/wilco_ec/debugfs.c | 6 +- + drivers/platform/chrome/wilco_ec/event.c | 2 +- + drivers/platform/chrome/wilco_ec/telemetry.c | 6 +- + include/linux/platform_data/cros_ec_proto.h | 2 +- + 25 files changed, 166 insertions(+), 100 deletions(-) + rename drivers/platform/chrome/{cros_kunit_util.c => cros_ec_proto_test_util.c} (98%) + rename drivers/platform/chrome/{cros_kunit_util.h => cros_ec_proto_test_util.h} (100%) +Merging chrome-platform-firmware/for-firmware-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-firmware-next' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git chrome-platform-firmware/for-firmware-next +Already up to date. +Merging hsi/for-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi.git hsi/for-next +Already up to date. +Merging leds/for-next (1b929c02afd3 Linux 6.2-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds.git leds/for-next +Already up to date. +Merging leds-lj/for-leds-next (13f0ccb77e98 leds: lp5521: Add an error check in lp5521_post_init_device) +$ git merge -m Merge branch 'for-leds-next' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/leds.git leds-lj/for-leds-next +Auto-merging drivers/leds/led-core.c +Auto-merging drivers/leds/trigger/ledtrig-netdev.c +Merge made by the 'ort' strategy. + .../testing/sysfs-class-led-driver-turris-omnia | 14 + + Documentation/devicetree/bindings/leds/common.yaml | 4 +- + .../devicetree/bindings/leds/kinetic,ktd202x.yaml | 171 ++++++ + drivers/leds/Kconfig | 1 + + drivers/leds/blink/leds-lgm-sso.c | 6 +- + drivers/leds/flash/leds-aat1290.c | 6 +- + drivers/leds/flash/leds-ktd2692.c | 6 +- + drivers/leds/flash/leds-lm3601x.c | 2 +- + drivers/leds/flash/leds-max77693.c | 6 +- + drivers/leds/flash/leds-mt6360.c | 7 +- + drivers/leds/flash/leds-mt6370-flash.c | 2 +- + drivers/leds/flash/leds-qcom-flash.c | 5 +- + drivers/leds/flash/leds-rt8515.c | 6 +- + drivers/leds/flash/leds-sgm3140.c | 6 +- + drivers/leds/led-core.c | 17 +- + drivers/leds/leds-88pm860x.c | 6 +- + drivers/leds/leds-adp5520.c | 6 +- + drivers/leds/leds-aw200xx.c | 4 +- + drivers/leds/leds-clevo-mail.c | 5 +- + drivers/leds/leds-cr0014114.c | 2 +- + drivers/leds/leds-da903x.c | 6 +- + drivers/leds/leds-da9052.c | 6 +- + drivers/leds/leds-el15203000.c | 2 +- + drivers/leds/leds-gpio.c | 56 +- + drivers/leds/leds-lm3533.c | 6 +- + drivers/leds/leds-lm3692x.c | 2 +- + drivers/leds/leds-lm3697.c | 2 +- + drivers/leds/leds-lp3952.c | 4 +- + drivers/leds/leds-lp5521.c | 2 + + drivers/leds/leds-lp55xx-common.c | 4 +- + drivers/leds/leds-mc13783.c | 6 +- + drivers/leds/leds-mlxreg.c | 6 +- + drivers/leds/leds-mt6323.c | 6 +- + drivers/leds/leds-nic78bx.c | 6 +- + drivers/leds/leds-pca955x.c | 67 +-- + drivers/leds/leds-powernv.c | 5 +- + drivers/leds/leds-pwm.c | 2 +- + drivers/leds/leds-rb532.c | 5 +- + drivers/leds/leds-regulator.c | 5 +- + drivers/leds/leds-sc27xx-bltc.c | 10 +- + drivers/leds/leds-sunfire.c | 8 +- + drivers/leds/leds-tca6507.c | 8 +- + drivers/leds/leds-turris-omnia.c | 362 ++++++++++-- + drivers/leds/leds-wm831x-status.c | 6 +- + drivers/leds/leds-wm8350.c | 5 +- + drivers/leds/rgb/Kconfig | 13 + + drivers/leds/rgb/Makefile | 1 + + drivers/leds/rgb/leds-ktd202x.c | 625 +++++++++++++++++++++ + drivers/leds/rgb/leds-mt6370-rgb.c | 2 +- + drivers/leds/rgb/leds-qcom-lpg.c | 8 +- + .../leds/simple/simatic-ipc-leds-gpio-apollolake.c | 8 +- + drivers/leds/simple/simatic-ipc-leds-gpio-core.c | 4 +- + .../simple/simatic-ipc-leds-gpio-elkhartlake.c | 7 +- + drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c | 8 +- + drivers/leds/simple/simatic-ipc-leds-gpio.h | 6 +- + drivers/leds/trigger/Kconfig | 5 +- + drivers/leds/trigger/ledtrig-cpu.c | 4 +- + drivers/leds/trigger/ledtrig-gpio.c | 137 ++--- + drivers/leds/trigger/ledtrig-netdev.c | 6 +- + 59 files changed, 1348 insertions(+), 365 deletions(-) + create mode 100644 Documentation/devicetree/bindings/leds/kinetic,ktd202x.yaml + create mode 100644 drivers/leds/rgb/leds-ktd202x.c +Merging ipmi/for-next (b00839ca4cca ipmi: refactor deprecated strncpy) +$ git merge -m Merge branch 'for-next' of git://github.com/cminyard/linux-ipmi.git ipmi/for-next +Merge made by the 'ort' strategy. + drivers/char/ipmi/ipmi_msghandler.c | 11 +++-------- + drivers/char/ipmi/ipmi_ssif.c | 2 +- + 2 files changed, 4 insertions(+), 9 deletions(-) +Merging driver-core/driver-core-next (effd7c70eaa0 firmware_loader: Abort all upcoming firmware load request once reboot triggered) +$ git merge -m Merge branch 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git driver-core/driver-core-next +Auto-merging drivers/pci/pci-sysfs.c +Auto-merging fs/kernfs/file.c +Merge made by the 'ort' strategy. + Documentation/process/security-bugs.rst | 33 +++++++++++---- + drivers/base/class.c | 6 +-- + drivers/base/core.c | 1 + + drivers/base/dd.c | 2 +- + drivers/base/firmware_loader/fallback.c | 10 +++-- + drivers/base/firmware_loader/fallback.h | 4 +- + drivers/base/firmware_loader/firmware.h | 1 + + drivers/base/firmware_loader/main.c | 9 +++-- + drivers/base/platform.c | 71 +++++++++++++++++---------------- + drivers/base/test/Kconfig | 4 +- + drivers/base/test/property-entry-test.c | 4 ++ + drivers/pci/pci-sysfs.c | 26 +++++++++++- + fs/debugfs/file.c | 2 +- + fs/kernfs/file.c | 29 +++++++++++++- + fs/sysfs/file.c | 13 ++++++ + include/linux/device.h | 8 ++-- + include/linux/fwnode.h | 2 + + include/linux/ioport.h | 12 +++--- + include/linux/kernfs.h | 1 + + include/linux/property.h | 3 +- + include/linux/sysfs.h | 2 + + kernel/resource.c | 51 +++++++++++------------ + 22 files changed, 194 insertions(+), 100 deletions(-) +Merging usb/usb-next (c70793fb7632 usb: gadget: uvc: Add missing initialization of ssp config descriptor) +$ git merge -m Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb/usb-next +Auto-merging Documentation/devicetree/bindings/usb/rockchip,dwc3.yaml +Auto-merging Documentation/devicetree/bindings/usb/ti,tps6598x.yaml +CONFLICT (content): Merge conflict in Documentation/devicetree/bindings/usb/ti,tps6598x.yaml +Auto-merging arch/arm64/boot/dts/qcom/sm8550-mtp.dts +Auto-merging arch/arm64/boot/dts/qcom/sm8550-qrd.dts +Auto-merging arch/arm64/boot/dts/rockchip/rk3588s.dtsi +CONFLICT (content): Merge conflict in arch/arm64/boot/dts/rockchip/rk3588s.dtsi +Auto-merging drivers/i2c/busses/Kconfig +Auto-merging drivers/platform/chrome/cros_ec_typec.c +Auto-merging drivers/power/supply/tps65217_charger.c +Auto-merging drivers/spi/Kconfig +Auto-merging drivers/thunderbolt/tb.c +Auto-merging drivers/usb/gadget/legacy/inode.c +Auto-merging drivers/usb/typec/altmodes/displayport.c +Resolved 'Documentation/devicetree/bindings/usb/ti,tps6598x.yaml' using previous resolution. +Resolved 'arch/arm64/boot/dts/rockchip/rk3588s.dtsi' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master cfbba8a29721] Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git +$ git diff -M --stat --summary HEAD^.. + Documentation/ABI/testing/configfs-usb-gadget-uac2 | 2 + + Documentation/ABI/testing/sysfs-bus-usb | 9 + + .../ABI/testing/sysfs-class-usb_power_delivery | 7 + + .../phy/qcom,sc8280xp-qmp-usb3-uni-phy.yaml | 2 + + .../bindings/phy/qcom,snps-eusb2-phy.yaml | 7 +- + .../bindings/soc/qcom/qcom,pmic-glink.yaml | 19 + + .../devicetree/bindings/usb/ci-hdrc-usb2.yaml | 7 + + .../devicetree/bindings/usb/fcs,fsa4480.yaml | 43 +- + .../devicetree/bindings/usb/genesys,gl850g.yaml | 3 +- + .../devicetree/bindings/usb/gpio-sbu-mux.yaml | 2 +- + .../devicetree/bindings/usb/nxp,ptn36502.yaml | 94 +++ + .../devicetree/bindings/usb/qcom,dwc3.yaml | 7 + + .../devicetree/bindings/usb/realtek,rtd-dwc3.yaml | 80 ++ + .../devicetree/bindings/usb/rockchip,dwc3.yaml | 60 +- + .../devicetree/bindings/usb/snps,dwc3.yaml | 56 ++ + .../devicetree/bindings/usb/ti,tps6598x.yaml | 81 +- + .../devicetree/bindings/usb/vialab,vl817.yaml | 1 - + Documentation/driver-api/usb/dma.rst | 48 +- + Documentation/usb/gadget-testing.rst | 2 + + arch/arm64/boot/dts/qcom/sm8550-mtp.dts | 1 + + arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 1 + + arch/arm64/boot/dts/rockchip/rk3588s.dtsi | 21 + + drivers/gpio/Kconfig | 4 +- + drivers/gpio/gpio-ljca.c | 244 +++--- + drivers/i2c/busses/Kconfig | 11 + + drivers/i2c/busses/Makefile | 1 + + drivers/i2c/busses/i2c-ljca.c | 343 ++++++++ + drivers/platform/chrome/cros_ec_typec.c | 28 + + drivers/power/supply/tps65217_charger.c | 2 +- + drivers/spi/Kconfig | 11 + + drivers/spi/Makefile | 1 + + drivers/spi/spi-ljca.c | 297 +++++++ + drivers/thunderbolt/clx.c | 47 +- + drivers/thunderbolt/dma_test.c | 14 +- + drivers/thunderbolt/path.c | 7 +- + drivers/thunderbolt/quirks.c | 3 + + drivers/thunderbolt/retimer.c | 1 + + drivers/thunderbolt/switch.c | 337 ++++++-- + drivers/thunderbolt/tb.c | 802 ++++++++++++++---- + drivers/thunderbolt/tb.h | 60 +- + drivers/thunderbolt/tb_regs.h | 19 +- + drivers/thunderbolt/tunnel.c | 263 +++--- + drivers/thunderbolt/tunnel.h | 26 +- + drivers/thunderbolt/usb4.c | 135 ++- + drivers/usb/Kconfig | 10 + + drivers/usb/c67x00/c67x00-hcd.h | 1 - + drivers/usb/cdns3/cdnsp-debug.h | 3 - + drivers/usb/cdns3/cdnsp-gadget.c | 6 +- + drivers/usb/cdns3/cdnsp-gadget.h | 5 - + drivers/usb/cdns3/cdnsp-ring.c | 24 - + drivers/usb/chipidea/Kconfig | 4 + + drivers/usb/chipidea/Makefile | 1 + + drivers/usb/chipidea/ci_hdrc_npcm.c | 114 +++ + drivers/usb/chipidea/ci_hdrc_tegra.c | 16 +- + drivers/usb/chipidea/ci_hdrc_usb2.c | 13 +- + drivers/usb/chipidea/host.c | 48 +- + drivers/usb/chipidea/otg.c | 5 +- + drivers/usb/core/hcd-pci.c | 3 +- + drivers/usb/core/hub.c | 4 + + drivers/usb/core/hub.h | 3 + + drivers/usb/core/port.c | 22 +- + drivers/usb/dwc2/hcd.c | 2 +- + drivers/usb/dwc2/params.c | 21 +- + drivers/usb/dwc3/Kconfig | 11 + + drivers/usb/dwc3/Makefile | 1 + + drivers/usb/dwc3/core.c | 188 ++++- + drivers/usb/dwc3/core.h | 19 + + drivers/usb/dwc3/dwc3-rtk.c | 475 +++++++++++ + drivers/usb/dwc3/dwc3-xilinx.c | 14 +- + drivers/usb/gadget/function/f_ncm.c | 27 +- + drivers/usb/gadget/function/f_uac2.c | 16 +- + drivers/usb/gadget/function/f_uvc.c | 14 +- + drivers/usb/gadget/function/u_ether.c | 2 +- + drivers/usb/gadget/function/u_uac2.h | 8 + + drivers/usb/gadget/legacy/inode.c | 17 +- + drivers/usb/gadget/legacy/raw_gadget.c | 91 ++- + drivers/usb/gadget/udc/aspeed_udc.c | 19 +- + drivers/usb/gadget/udc/at91_udc.c | 3 +- + drivers/usb/gadget/udc/core.c | 19 +- + drivers/usb/gadget/udc/fsl_qe_udc.c | 10 +- + drivers/usb/gadget/udc/fsl_udc_core.c | 3 +- + drivers/usb/gadget/udc/fusb300_udc.c | 7 +- + drivers/usb/gadget/udc/lpc32xx_udc.c | 3 +- + drivers/usb/gadget/udc/m66592-udc.c | 3 +- + drivers/usb/gadget/udc/r8a66597-udc.c | 3 +- + drivers/usb/host/pci-quirks.c | 144 ++-- + drivers/usb/host/pci-quirks.h | 34 +- + drivers/usb/host/xhci-debugfs.c | 2 +- + drivers/usb/host/xhci-ext-caps.h | 27 + + drivers/usb/host/xhci-hub.c | 4 +- + drivers/usb/host/xhci-mem.c | 96 ++- + drivers/usb/host/xhci-mtk-sch.c | 418 ++++++++-- + drivers/usb/host/xhci-mtk.h | 17 +- + drivers/usb/host/xhci-pci.c | 6 +- + drivers/usb/host/xhci-plat.c | 23 +- + drivers/usb/host/xhci-ring.c | 38 +- + drivers/usb/host/xhci-trace.h | 23 +- + drivers/usb/host/xhci.c | 40 +- + drivers/usb/host/xhci.h | 45 +- + drivers/usb/misc/Kconfig | 13 + + drivers/usb/misc/Makefile | 1 + + drivers/usb/misc/onboard_usb_hub.c | 7 +- + drivers/usb/misc/onboard_usb_hub.h | 1 + + drivers/usb/misc/usb-ljca.c | 902 +++++++++++++++++++++ + drivers/usb/misc/usbtest.c | 2 +- + drivers/usb/mon/mon_main.c | 23 +- + drivers/usb/mtu3/mtu3_plat.c | 18 +- + drivers/usb/musb/da8xx.c | 1 + + drivers/usb/musb/musb_dsps.c | 2 +- + drivers/usb/storage/uas-detect.h | 4 +- + drivers/usb/storage/uas.c | 4 +- + drivers/usb/storage/unusual_cypress.h | 2 +- + drivers/usb/storage/usb.c | 20 +- + drivers/usb/storage/usb.h | 4 +- + drivers/usb/storage/usual-tables.c | 17 +- + drivers/usb/typec/altmodes/displayport.c | 5 +- + drivers/usb/typec/anx7411.c | 3 +- + drivers/usb/typec/class.c | 108 ++- + drivers/usb/typec/class.h | 16 + + drivers/usb/typec/mux/Kconfig | 10 + + drivers/usb/typec/mux/Makefile | 1 + + drivers/usb/typec/mux/fsa4480.c | 71 ++ + drivers/usb/typec/mux/intel_pmc_mux.c | 25 + + drivers/usb/typec/mux/ptn36502.c | 444 ++++++++++ + drivers/usb/typec/pd.c | 10 +- + drivers/usb/typec/port-mapper.c | 9 +- + drivers/usb/typec/tcpm/tcpci_rt1711h.c | 46 +- + drivers/usb/typec/tcpm/tcpm.c | 9 +- + drivers/usb/typec/tipd/core.c | 694 +++++++++++++--- + drivers/usb/typec/tipd/tps6598x.h | 36 + + drivers/usb/typec/tipd/trace.h | 92 +++ + drivers/usb/typec/ucsi/displayport.c | 2 +- + drivers/usb/typec/ucsi/ucsi_ccg.c | 4 +- + drivers/usb/typec/ucsi/ucsi_glink.c | 54 +- + drivers/usb/usbip/stub_dev.c | 9 +- + drivers/usb/usbip/vhci_hcd.c | 44 +- + include/linux/thunderbolt.h | 2 +- + include/linux/usb.h | 16 - + include/linux/usb/chipidea.h | 1 + + include/linux/usb/composite.h | 8 + + include/linux/usb/gadget.h | 9 + + include/linux/usb/hcd.h | 17 + + include/linux/usb/ljca.h | 145 ++++ + include/linux/usb/pd.h | 1 + + include/linux/usb/pd_vdo.h | 1 + + include/linux/usb/renesas_usbhs.h | 10 - + include/linux/usb/typec.h | 37 + + include/linux/usb/typec_dp.h | 28 +- + include/linux/usb/typec_tbt.h | 1 + + include/uapi/linux/usb/raw_gadget.h | 14 +- + 150 files changed, 7060 insertions(+), 1327 deletions(-) + create mode 100644 Documentation/devicetree/bindings/usb/nxp,ptn36502.yaml + create mode 100644 Documentation/devicetree/bindings/usb/realtek,rtd-dwc3.yaml + create mode 100644 drivers/i2c/busses/i2c-ljca.c + create mode 100644 drivers/spi/spi-ljca.c + create mode 100644 drivers/usb/chipidea/ci_hdrc_npcm.c + create mode 100644 drivers/usb/dwc3/dwc3-rtk.c + create mode 100644 drivers/usb/misc/usb-ljca.c + create mode 100644 drivers/usb/typec/mux/ptn36502.c + create mode 100644 include/linux/usb/ljca.h +Merging thunderbolt/next (a558892b3456 thunderbolt: Fix one kernel-doc comment) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git thunderbolt/next +Already up to date. +Merging usb-serial/usb-next (8a749fd1a872 Linux 6.6-rc4) +$ git merge -m Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial.git usb-serial/usb-next +Already up to date. +Merging tty/tty-next (64ebf8797249 serdev: Replace custom code with device_match_acpi_handle()) +$ git merge -m Merge branch 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git tty/tty-next +Auto-merging arch/arm/kernel/setup.c +Auto-merging arch/arm64/kernel/efi.c +CONFLICT (modify/delete): arch/ia64/kernel/setup.c deleted in HEAD and modified in tty/tty-next. Version tty/tty-next of arch/ia64/kernel/setup.c left in tree. +Auto-merging arch/loongarch/kernel/setup.c +Auto-merging arch/mips/kernel/setup.c +Auto-merging arch/powerpc/kernel/setup-common.c +Auto-merging arch/riscv/kernel/setup.c +Auto-merging arch/x86/kernel/setup.c +CONFLICT (modify/delete): drivers/firmware/pcdp.c deleted in HEAD and modified in tty/tty-next. Version tty/tty-next of drivers/firmware/pcdp.c left in tree. +Auto-merging drivers/gpu/drm/hyperv/hyperv_drm_drv.c +Auto-merging drivers/tty/hvc/hvcs.c +Auto-merging drivers/tty/serial/8250/8250_port.c +Auto-merging drivers/tty/serial/8250/Kconfig +Auto-merging drivers/tty/tty_io.c +Auto-merging drivers/tty/vt/keyboard.c +Auto-merging drivers/video/fbdev/Kconfig +Auto-merging drivers/video/fbdev/hyperv_fb.c +Auto-merging drivers/video/fbdev/vga16fb.c +Auto-merging include/linux/console.h +Auto-merging kernel/printk/printk.c +Automatic merge failed; fix conflicts and then commit the result. +$ git rm -f arch/ia64/kernel/setup.c drivers/firmware/pcdp.c +rm 'arch/ia64/kernel/setup.c' +rm 'drivers/firmware/pcdp.c' +$ git commit --no-edit -v -a +[master 027449756bf0] Merge branch 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git +$ git diff -M --stat --summary HEAD^.. + Documentation/ABI/testing/sysfs-tty | 15 +- + .../devicetree/bindings/serial/esp,esp32-acm.yaml | 42 ++ + .../devicetree/bindings/serial/esp,esp32-uart.yaml | 51 ++ + .../devicetree/bindings/serial/fsl-imx-uart.yaml | 2 + + .../devicetree/bindings/serial/fsl-mxs-auart.yaml | 13 +- + .../devicetree/bindings/serial/maxim,max310x.txt | 48 -- + .../devicetree/bindings/serial/maxim,max310x.yaml | 74 ++ + .../bindings/serial/nvidia,tegra20-hsuart.yaml | 10 +- + .../devicetree/bindings/serial/nxp,sc16is7xx.txt | 118 ---- + .../devicetree/bindings/serial/nxp,sc16is7xx.yaml | 127 ++++ + .../devicetree/bindings/serial/qcom,msm-uart.yaml | 4 +- + .../bindings/serial/qcom,msm-uartdm.yaml | 4 +- + .../bindings/serial/renesas,em-uart.yaml | 14 +- + .../devicetree/bindings/serial/renesas,hscif.yaml | 4 +- + .../devicetree/bindings/serial/renesas,scif.yaml | 1 + + .../devicetree/bindings/serial/renesas,scifa.yaml | 4 +- + .../devicetree/bindings/serial/renesas,scifb.yaml | 4 +- + .../devicetree/bindings/serial/rs485.yaml | 4 + + .../devicetree/bindings/serial/samsung_uart.yaml | 8 +- + .../devicetree/bindings/serial/serial.yaml | 18 +- + Documentation/driver-api/tty/index.rst | 1 + + Documentation/driver-api/tty/tty_ioctl.rst | 10 + + arch/alpha/kernel/proto.h | 2 + + arch/alpha/kernel/setup.c | 8 +- + arch/alpha/kernel/sys_sio.c | 8 +- + arch/arm/include/asm/setup.h | 5 + + arch/arm/include/asm/vga.h | 1 + + arch/arm/kernel/atags_parse.c | 20 +- + arch/arm/kernel/efi.c | 6 - + arch/arm/kernel/setup.c | 7 +- + arch/arm64/kernel/efi.c | 4 - + arch/arm64/kernel/image-vars.h | 2 + + arch/csky/kernel/setup.c | 12 - + arch/hexagon/kernel/Makefile | 2 - + arch/hexagon/kernel/screen_info.c | 3 - + arch/loongarch/kernel/efi.c | 8 +- + arch/loongarch/kernel/image-vars.h | 2 + + arch/loongarch/kernel/setup.c | 3 - + arch/mips/jazz/setup.c | 9 - + arch/mips/kernel/setup.c | 11 - + arch/mips/mti-malta/malta-setup.c | 4 +- + arch/mips/sibyte/swarm/setup.c | 27 +- + arch/mips/sni/setup.c | 18 +- + arch/nios2/kernel/setup.c | 5 - + arch/powerpc/kernel/setup-common.c | 16 - + arch/riscv/kernel/image-vars.h | 2 + + arch/riscv/kernel/setup.c | 12 - + arch/sh/kernel/setup.c | 5 - + arch/sparc/kernel/setup_32.c | 13 - + arch/sparc/kernel/setup_64.c | 13 - + arch/x86/kernel/setup.c | 2 +- + arch/xtensa/kernel/setup.c | 12 - + drivers/firmware/efi/efi-init.c | 14 +- + drivers/firmware/efi/libstub/efi-stub-entry.c | 8 +- + drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 7 +- + drivers/hv/vmbus_drv.c | 6 +- + drivers/tty/hvc/hvc_xen.c | 39 +- + drivers/tty/hvc/hvcs.c | 2 - + drivers/tty/mxser.c | 2 +- + drivers/tty/n_gsm.c | 3 + + drivers/tty/n_tty.c | 75 +- + drivers/tty/serdev/core.c | 24 +- + drivers/tty/serial/21285.c | 8 +- + drivers/tty/serial/8250/8250_aspeed_vuart.c | 33 +- + drivers/tty/serial/8250/8250_bcm7271.c | 69 +- + drivers/tty/serial/8250/8250_core.c | 14 +- + drivers/tty/serial/8250/8250_dma.c | 8 +- + drivers/tty/serial/8250/8250_dw.c | 35 +- + drivers/tty/serial/8250/8250_exar.c | 63 +- + drivers/tty/serial/8250/8250_fsl.c | 6 +- + drivers/tty/serial/8250/8250_mid.c | 18 +- + drivers/tty/serial/8250/8250_mtk.c | 8 +- + drivers/tty/serial/8250/8250_of.c | 44 +- + drivers/tty/serial/8250/8250_omap.c | 114 ++- + drivers/tty/serial/8250/8250_pci.c | 597 ++++++++++++---- + drivers/tty/serial/8250/8250_pci1xxxx.c | 10 +- + drivers/tty/serial/8250/8250_port.c | 111 ++- + drivers/tty/serial/8250/Kconfig | 2 +- + drivers/tty/serial/8250/Makefile | 44 +- + drivers/tty/serial/Kconfig | 26 + + drivers/tty/serial/Makefile | 126 ++-- + drivers/tty/serial/altera_jtaguart.c | 28 +- + drivers/tty/serial/altera_uart.c | 20 +- + drivers/tty/serial/amba-pl010.c | 20 +- + drivers/tty/serial/amba-pl011.c | 74 +- + drivers/tty/serial/apbuart.c | 8 +- + drivers/tty/serial/ar933x_uart.c | 26 +- + drivers/tty/serial/arc_uart.c | 16 +- + drivers/tty/serial/atmel_serial.c | 24 +- + drivers/tty/serial/bcm63xx_uart.c | 22 +- + drivers/tty/serial/cpm_uart.c | 8 +- + drivers/tty/serial/digicolor-usart.c | 18 +- + drivers/tty/serial/dz.c | 32 +- + drivers/tty/serial/esp32_acm.c | 459 ++++++++++++ + drivers/tty/serial/esp32_uart.c | 784 +++++++++++++++++++++ + drivers/tty/serial/fsl_linflexuart.c | 32 +- + drivers/tty/serial/fsl_lpuart.c | 88 +-- + drivers/tty/serial/icom.c | 26 +- + drivers/tty/serial/imx.c | 128 ++-- + drivers/tty/serial/ip22zilog.c | 36 +- + drivers/tty/serial/jsm/jsm_neo.c | 4 +- + drivers/tty/serial/jsm/jsm_tty.c | 16 +- + drivers/tty/serial/liteuart.c | 20 +- + drivers/tty/serial/lpc32xx_hs.c | 26 +- + drivers/tty/serial/ma35d1_serial.c | 25 +- + drivers/tty/serial/max310x.c | 2 +- + drivers/tty/serial/mcf.c | 20 +- + drivers/tty/serial/men_z135_uart.c | 8 +- + drivers/tty/serial/meson_uart.c | 48 +- + drivers/tty/serial/milbeaut_usio.c | 16 +- + drivers/tty/serial/mpc52xx_uart.c | 12 +- + drivers/tty/serial/mps2-uart.c | 16 +- + drivers/tty/serial/msm_serial.c | 38 +- + drivers/tty/serial/mvebu-uart.c | 18 +- + drivers/tty/serial/omap-serial.c | 38 +- + drivers/tty/serial/owl-uart.c | 26 +- + drivers/tty/serial/pch_uart.c | 10 +- + drivers/tty/serial/pic32_uart.c | 20 +- + drivers/tty/serial/pmac_zilog.c | 52 +- + drivers/tty/serial/pxa.c | 30 +- + drivers/tty/serial/qcom_geni_serial.c | 8 +- + drivers/tty/serial/rda-uart.c | 34 +- + drivers/tty/serial/rp2.c | 20 +- + drivers/tty/serial/sa1100.c | 20 +- + drivers/tty/serial/samsung_tty.c | 171 +---- + drivers/tty/serial/sb1250-duart.c | 12 +- + drivers/tty/serial/sc16is7xx.c | 83 ++- + drivers/tty/serial/serial-tegra.c | 32 +- + drivers/tty/serial/serial_core.c | 131 ++-- + drivers/tty/serial/serial_mctrl_gpio.c | 4 +- + drivers/tty/serial/serial_port.c | 4 +- + drivers/tty/serial/serial_txx9.c | 26 +- + drivers/tty/serial/sh-sci.c | 68 +- + drivers/tty/serial/sifive.c | 16 +- + drivers/tty/serial/sprd_serial.c | 30 +- + drivers/tty/serial/st-asc.c | 18 +- + drivers/tty/serial/stm32-usart.c | 51 +- + drivers/tty/serial/sunhv.c | 28 +- + drivers/tty/serial/sunplus-uart.c | 26 +- + drivers/tty/serial/sunsab.c | 34 +- + drivers/tty/serial/sunsu.c | 46 +- + drivers/tty/serial/sunzilog.c | 42 +- + drivers/tty/serial/timbuart.c | 8 +- + drivers/tty/serial/uartlite.c | 18 +- + drivers/tty/serial/ucc_uart.c | 4 +- + drivers/tty/serial/vt8500_serial.c | 8 +- + drivers/tty/serial/xilinx_uartps.c | 58 +- + drivers/tty/sysrq.c | 3 +- + drivers/tty/tty.h | 13 +- + drivers/tty/tty_buffer.c | 5 +- + drivers/tty/tty_io.c | 130 ++-- + drivers/tty/tty_ioctl.c | 234 +++--- + drivers/tty/tty_jobctrl.c | 17 +- + drivers/tty/tty_port.c | 6 +- + drivers/tty/vcc.c | 16 +- + drivers/tty/vt/consolemap.c | 2 +- + drivers/tty/vt/keyboard.c | 7 +- + drivers/tty/vt/vc_screen.c | 32 +- + drivers/tty/vt/vt.c | 29 +- + drivers/video/console/Kconfig | 11 +- + drivers/video/console/dummycon.c | 7 +- + drivers/video/console/vgacon.c | 68 +- + drivers/video/fbdev/Kconfig | 2 +- + drivers/video/fbdev/hyperv_fb.c | 8 +- + drivers/video/fbdev/vga16fb.c | 9 +- + include/linux/console.h | 9 +- + include/linux/serial_core.h | 91 ++- + include/linux/tty.h | 25 +- + include/uapi/linux/gsmmux.h | 1 + + include/uapi/linux/serial_core.h | 21 +- + include/uapi/linux/serial_reg.h | 1 + + kernel/printk/printk.c | 12 +- + 172 files changed, 4058 insertions(+), 2329 deletions(-) + create mode 100644 Documentation/devicetree/bindings/serial/esp,esp32-acm.yaml + create mode 100644 Documentation/devicetree/bindings/serial/esp,esp32-uart.yaml + delete mode 100644 Documentation/devicetree/bindings/serial/maxim,max310x.txt + create mode 100644 Documentation/devicetree/bindings/serial/maxim,max310x.yaml + delete mode 100644 Documentation/devicetree/bindings/serial/nxp,sc16is7xx.txt + create mode 100644 Documentation/devicetree/bindings/serial/nxp,sc16is7xx.yaml + create mode 100644 Documentation/driver-api/tty/tty_ioctl.rst + delete mode 100644 arch/hexagon/kernel/screen_info.c + create mode 100644 drivers/tty/serial/esp32_acm.c + create mode 100644 drivers/tty/serial/esp32_uart.c +Merging char-misc/char-misc-next (fa10f413091a cdx: add sysfs for subsystem, class and revision) +$ git merge -m Merge branch 'char-misc-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git char-misc/char-misc-next +Auto-merging Documentation/devicetree/bindings/eeprom/at24.yaml +Auto-merging Documentation/devicetree/bindings/nvmem/allwinner,sun4i-a10-sid.yaml +Auto-merging Documentation/devicetree/bindings/trivial-devices.yaml +Auto-merging MAINTAINERS +Auto-merging arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts +Auto-merging drivers/android/binderfs.c +Auto-merging drivers/char/hpet.c +Auto-merging drivers/char/mem.c +Auto-merging drivers/gpu/drm/i915/pxp/intel_pxp_tee.c +Auto-merging drivers/iio/accel/kionix-kx022a.c +Auto-merging drivers/iio/adc/exynos_adc.c +Auto-merging drivers/misc/ibmvmc.c +Auto-merging drivers/misc/pci_endpoint_test.c +Auto-merging drivers/mtd/mtdcore.c +Auto-merging drivers/nvmem/imx-ocotp.c +Auto-merging scripts/mod/file2alias.c +Merge made by the 'ort' strategy. + Documentation/ABI/testing/sysfs-bus-cdx | 66 +- + Documentation/ABI/testing/sysfs-bus-iio | 75 + + .../ABI/testing/sysfs-bus-iio-adc-mcp3564 | 53 + + .../ABI/testing/sysfs-bus-iio-resolver-ad2s1210 | 27 + + Documentation/devicetree/bindings/eeprom/at24.yaml | 1 + + .../bindings/iio/accel/kionix,kx022a.yaml | 14 +- + .../devicetree/bindings/iio/adc/lltc,ltc2497.yaml | 20 +- + .../bindings/iio/adc/microchip,mcp3564.yaml | 205 +++ + .../bindings/iio/adc/microchip,mcp3911.yaml | 6 + + .../devicetree/bindings/iio/adc/ti,ads1015.yaml | 3 + + .../bindings/iio/adc/ti,twl6030-gpadc.yaml | 43 + + .../bindings/iio/amplifiers/adi,hmc425a.yaml | 12 +- + .../bindings/iio/imu/invensense,mpu6050.yaml | 5 + + .../devicetree/bindings/iio/imu/st,lsm6dsx.yaml | 3 + + .../bindings/iio/pressure/rohm,bm1390.yaml | 52 + + .../bindings/iio/resolver/adi,ad2s1210.yaml | 177 ++ + .../bindings/interconnect/qcom,msm8939.yaml | 74 + + .../bindings/interconnect/qcom,msm8996.yaml | 126 ++ + .../bindings/interconnect/qcom,qcm2290.yaml | 60 +- + .../bindings/interconnect/qcom,rpm-common.yaml | 28 + + .../devicetree/bindings/interconnect/qcom,rpm.yaml | 250 +-- + .../bindings/interconnect/qcom,rpmh.yaml | 1 + + .../bindings/interconnect/qcom,sdm660.yaml | 108 ++ + .../bindings/interconnect/qcom,sdx75-rpmh.yaml | 92 + + Documentation/devicetree/bindings/mtd/mtd.yaml | 7 +- + .../bindings/mtd/partitions/nvmem-cells.yaml | 1 + + .../devicetree/bindings/net/ti,cc1352p7.yaml | 51 + + .../bindings/nvmem/allwinner,sun4i-a10-sid.yaml | 1 + + .../bindings/nvmem/amlogic,meson-gxbb-efuse.yaml | 1 + + .../bindings/nvmem/amlogic,meson6-efuse.yaml | 1 + + .../devicetree/bindings/nvmem/apple,efuses.yaml | 1 + + .../devicetree/bindings/nvmem/imx-ocotp.yaml | 1 + + .../devicetree/bindings/nvmem/mediatek,efuse.yaml | 1 + + .../bindings/nvmem/microchip,sama7g5-otpc.yaml | 1 + + .../devicetree/bindings/nvmem/mxs-ocotp.yaml | 1 + + .../bindings/nvmem/nvmem-deprecated-cells.yaml | 28 + + Documentation/devicetree/bindings/nvmem/nvmem.yaml | 9 - + .../devicetree/bindings/nvmem/qcom,qfprom.yaml | 1 + + .../devicetree/bindings/nvmem/qcom,sec-qfprom.yaml | 1 + + .../devicetree/bindings/nvmem/qcom,spmi-sdam.yaml | 1 + + .../devicetree/bindings/nvmem/rockchip,otp.yaml | 1 + + .../devicetree/bindings/nvmem/rockchip-efuse.yaml | 1 + + .../bindings/nvmem/socionext,uniphier-efuse.yaml | 1 + + .../bindings/nvmem/sunplus,sp7021-ocotp.yaml | 1 + + .../devicetree/bindings/nvmem/u-boot,env.yaml | 2 + + .../bindings/rtc/amlogic,meson6-rtc.yaml | 1 + + .../devicetree/bindings/trivial-devices.yaml | 2 + + .../bindings/usb/realtek,rtd-type-c.yaml | 82 + + Documentation/misc-devices/eeprom.rst | 107 -- + Documentation/misc-devices/index.rst | 1 - + Documentation/process/stable-kernel-rules.rst | 13 + + MAINTAINERS | 36 +- + arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts | 6 + + drivers/accessibility/speakup/kobjects.c | 25 +- + drivers/android/binderfs.c | 2 +- + drivers/cdx/Makefile | 2 + + drivers/cdx/cdx.c | 264 ++- + drivers/cdx/cdx.h | 22 +- + drivers/cdx/controller/cdx_controller.c | 20 + + drivers/cdx/controller/mc_cdx_pcol.h | 54 + + drivers/cdx/controller/mcdi_functions.c | 31 + + drivers/cdx/controller/mcdi_functions.h | 18 + + drivers/char/hpet.c | 2 +- + drivers/char/mem.c | 4 + + drivers/char/xilinx_hwicap/xilinx_hwicap.c | 138 +- + drivers/comedi/Kconfig | 45 +- + drivers/comedi/drivers.c | 3 +- + drivers/comedi/drivers/8255.c | 2 +- + drivers/comedi/drivers/8255_pci.c | 15 +- + drivers/comedi/drivers/adl_pci9111.c | 8 +- + drivers/comedi/drivers/adl_pci9118.c | 8 +- + drivers/comedi/drivers/adv_pci1710.c | 8 +- + drivers/comedi/drivers/adv_pci_dio.c | 14 +- + drivers/comedi/drivers/aio_aio12_8.c | 10 +- + drivers/comedi/drivers/amplc_dio200_common.c | 104 +- + drivers/comedi/drivers/amplc_dio200_pci.c | 12 +- + drivers/comedi/drivers/amplc_pc236_common.c | 2 +- + drivers/comedi/drivers/amplc_pci224.c | 8 +- + drivers/comedi/drivers/amplc_pci230.c | 10 +- + drivers/comedi/drivers/cb_das16_cs.c | 8 +- + drivers/comedi/drivers/cb_pcidas.c | 23 +- + drivers/comedi/drivers/cb_pcidas64.c | 7 +- + drivers/comedi/drivers/cb_pcidda.c | 2 +- + drivers/comedi/drivers/cb_pcimdas.c | 12 +- + drivers/comedi/drivers/cb_pcimdda.c | 2 +- + drivers/comedi/drivers/comedi_8254.c | 236 ++- + drivers/comedi/drivers/comedi_8255.c | 135 +- + drivers/comedi/drivers/daqboard2000.c | 4 +- + drivers/comedi/drivers/das08.c | 11 +- + drivers/comedi/drivers/das16.c | 10 +- + drivers/comedi/drivers/das16m1.c | 22 +- + drivers/comedi/drivers/das1800.c | 8 +- + drivers/comedi/drivers/das6402.c | 8 +- + drivers/comedi/drivers/das800.c | 8 +- + drivers/comedi/drivers/dmm32at.c | 3 +- + drivers/comedi/drivers/me4000.c | 6 +- + drivers/comedi/drivers/ni_at_a2150.c | 8 +- + drivers/comedi/drivers/ni_at_ao.c | 8 +- + drivers/comedi/drivers/ni_atmio16d.c | 2 +- + drivers/comedi/drivers/ni_daq_dio24.c | 2 +- + drivers/comedi/drivers/ni_labpc_common.c | 51 +- + drivers/comedi/drivers/ni_mio_common.c | 74 +- + drivers/comedi/drivers/pcl711.c | 8 +- + drivers/comedi/drivers/pcl724.c | 6 +- + drivers/comedi/drivers/pcl812.c | 10 +- + drivers/comedi/drivers/pcl816.c | 8 +- + drivers/comedi/drivers/pcl818.c | 8 +- + drivers/comedi/drivers/pcm3724.c | 2 +- + drivers/comedi/drivers/rtd520.c | 6 +- + drivers/extcon/Kconfig | 11 + + drivers/extcon/Makefile | 1 + + drivers/extcon/extcon-max77693.c | 7 + + drivers/extcon/extcon-max77843.c | 7 + + drivers/extcon/extcon-rtk-type-c.c | 1794 ++++++++++++++++++++ + drivers/firmware/xilinx/zynqmp.c | 2 +- + drivers/fpga/altera-hps2fpga.c | 12 +- + drivers/fpga/altera-ps-spi.c | 46 +- + drivers/fpga/versal-fpga.c | 2 +- + drivers/fpga/xilinx-pr-decoupler.c | 17 +- + drivers/gpu/drm/i915/pxp/intel_pxp_tee.c | 8 +- + drivers/greybus/Kconfig | 10 + + drivers/greybus/Makefile | 2 + + drivers/greybus/gb-beagleplay.c | 501 ++++++ + .../amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.c | 7 + + .../amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.h | 3 + + .../hid_descriptor/amd_sfh_hid_report_desc.h | 21 + + drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_desc.c | 9 + + drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.h | 15 + + drivers/iio/accel/Kconfig | 10 +- + drivers/iio/accel/adxl345.h | 21 +- + drivers/iio/accel/adxl345_core.c | 47 +- + drivers/iio/accel/adxl345_i2c.c | 20 +- + drivers/iio/accel/adxl345_spi.c | 20 +- + drivers/iio/accel/bma180.c | 27 +- + drivers/iio/accel/fxls8962af.h | 1 - + drivers/iio/accel/hid-sensor-accel-3d.c | 6 +- + drivers/iio/accel/kionix-kx022a-i2c.c | 24 +- + drivers/iio/accel/kionix-kx022a-spi.c | 19 +- + drivers/iio/accel/kionix-kx022a.c | 351 +++- + drivers/iio/accel/kionix-kx022a.h | 114 +- + drivers/iio/accel/mma8452.c | 28 +- + drivers/iio/accel/msa311.c | 2 +- + drivers/iio/accel/mxc4005.c | 8 + + drivers/iio/adc/Kconfig | 29 +- + drivers/iio/adc/Makefile | 2 + + drivers/iio/adc/ab8500-gpadc.c | 6 +- + drivers/iio/adc/ad4130.c | 15 +- + drivers/iio/adc/ad7192.c | 269 +-- + drivers/iio/adc/at91-sama5d2_adc.c | 6 +- + drivers/iio/adc/at91_adc.c | 114 +- + drivers/iio/adc/axp20x_adc.c | 6 +- + drivers/iio/adc/bcm_iproc_adc.c | 6 +- + drivers/iio/adc/dln2-adc.c | 5 +- + drivers/iio/adc/ep93xx_adc.c | 6 +- + drivers/iio/adc/exynos_adc.c | 6 +- + drivers/iio/adc/fsl-imx25-gcq.c | 6 +- + drivers/iio/adc/hx711.c | 6 +- + drivers/iio/adc/imx8qxp-adc.c | 6 +- + drivers/iio/adc/imx93_adc.c | 6 +- + drivers/iio/adc/ltc2309.c | 246 +++ + drivers/iio/adc/ltc2497.c | 5 +- + drivers/iio/adc/max1363.c | 87 +- + drivers/iio/adc/mcp3564.c | 1513 +++++++++++++++++ + drivers/iio/adc/mcp3911.c | 562 ++++-- + drivers/iio/adc/meson_saradc.c | 22 +- + drivers/iio/adc/mp2629_adc.c | 6 +- + drivers/iio/adc/mt6577_auxadc.c | 72 +- + drivers/iio/adc/mxs-lradc-adc.c | 6 +- + drivers/iio/adc/npcm_adc.c | 6 +- + drivers/iio/adc/palmas_gpadc.c | 2 +- + drivers/iio/adc/qcom-pm8xxx-xoadc.c | 6 +- + drivers/iio/adc/rcar-gyroadc.c | 6 +- + drivers/iio/adc/spear_adc.c | 64 +- + drivers/iio/adc/stm32-adc-core.c | 12 +- + drivers/iio/adc/stm32-adc.c | 8 +- + drivers/iio/adc/stm32-dfsdm-adc.c | 6 +- + drivers/iio/adc/stm32-dfsdm-core.c | 6 +- + drivers/iio/adc/sun4i-gpadc-iio.c | 8 +- + drivers/iio/adc/ti-adc081c.c | 12 +- + drivers/iio/adc/ti-ads1015.c | 7 +- + drivers/iio/adc/ti_am335x_adc.c | 6 +- + drivers/iio/adc/twl4030-madc.c | 6 +- + drivers/iio/adc/twl6030-gpadc.c | 16 +- + drivers/iio/adc/vf610_adc.c | 6 +- + drivers/iio/addac/Kconfig | 1 + + drivers/iio/addac/ad74413r.c | 24 +- + drivers/iio/addac/stx104.c | 61 +- + drivers/iio/amplifiers/hmc425a.c | 17 + + drivers/iio/chemical/atlas-ezo-sensor.c | 6 +- + drivers/iio/chemical/atlas-sensor.c | 32 +- + drivers/iio/chemical/sgp30.c | 24 +- + drivers/iio/chemical/vz89x.c | 16 +- + drivers/iio/dac/dpot-dac.c | 6 +- + drivers/iio/dac/lpc18xx_dac.c | 6 +- + drivers/iio/dac/mcp4725.c | 42 +- + drivers/iio/dac/stm32-dac-core.c | 15 +- + drivers/iio/dac/stm32-dac.c | 9 +- + drivers/iio/dac/ti-dac5571.c | 48 +- + drivers/iio/dac/vf610_dac.c | 6 +- + drivers/iio/frequency/adf4350.c | 75 +- + drivers/iio/gyro/hid-sensor-gyro-3d.c | 6 +- + drivers/iio/humidity/hid-sensor-humidity.c | 6 +- + drivers/iio/humidity/si7005.c | 7 + + drivers/iio/iio_core.h | 3 - + drivers/iio/imu/adis16475.c | 238 ++- + drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c | 13 + + drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 3 + + drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 2 +- + drivers/iio/industrialio-core.c | 4 + + drivers/iio/industrialio-event.c | 55 + + drivers/iio/light/cm3605.c | 6 +- + drivers/iio/light/hid-sensor-als.c | 134 +- + drivers/iio/light/hid-sensor-prox.c | 6 +- + drivers/iio/light/lm3533-als.c | 6 +- + drivers/iio/light/opt4001.c | 2 +- + drivers/iio/magnetometer/ak8975.c | 97 +- + drivers/iio/magnetometer/hid-sensor-magn-3d.c | 6 +- + drivers/iio/magnetometer/yamaha-yas530.c | 4 +- + drivers/iio/orientation/hid-sensor-incl-3d.c | 6 +- + drivers/iio/orientation/hid-sensor-rotation.c | 6 +- + .../iio/position/hid-sensor-custom-intel-hinge.c | 6 +- + drivers/iio/potentiometer/ad5110.c | 21 +- + drivers/iio/potentiometer/ds1803.c | 13 +- + drivers/iio/pressure/Kconfig | 9 + + drivers/iio/pressure/Makefile | 1 + + drivers/iio/pressure/hid-sensor-press.c | 6 +- + drivers/iio/pressure/ms5637.c | 6 +- + drivers/iio/pressure/rohm-bm1390.c | 934 ++++++++++ + drivers/iio/proximity/cros_ec_mkbp_proximity.c | 6 +- + drivers/iio/proximity/srf04.c | 6 +- + drivers/iio/proximity/sx9310.c | 46 +- + drivers/iio/resolver/Kconfig | 13 + + drivers/iio/resolver/Makefile | 1 + + drivers/iio/resolver/ad2s1210.c | 1519 +++++++++++++++++ + drivers/iio/temperature/hid-sensor-temperature.c | 6 +- + drivers/iio/temperature/mlx90614.c | 2 +- + drivers/iio/temperature/tmp117.c | 94 +- + drivers/iio/trigger/iio-trig-interrupt.c | 6 +- + drivers/iio/trigger/stm32-timer-trigger.c | 6 +- + drivers/interconnect/imx/imx.h | 9 +- + drivers/interconnect/qcom/Kconfig | 9 + + drivers/interconnect/qcom/Makefile | 2 + + drivers/interconnect/qcom/icc-rpm-clocks.c | 6 + + drivers/interconnect/qcom/icc-rpm.c | 90 +- + drivers/interconnect/qcom/icc-rpm.h | 15 + + drivers/interconnect/qcom/icc-rpmh.c | 4 +- + drivers/interconnect/qcom/icc-rpmh.h | 2 +- + drivers/interconnect/qcom/msm8974.c | 4 +- + drivers/interconnect/qcom/msm8996.c | 8 +- + drivers/interconnect/qcom/osm-l3.c | 3 +- + drivers/interconnect/qcom/qcm2290.c | 9 +- + drivers/interconnect/qcom/qdu1000.c | 3 +- + drivers/interconnect/qcom/sa8775p.c | 2 +- + drivers/interconnect/qcom/sc7180.c | 3 +- + drivers/interconnect/qcom/sc7280.c | 3 +- + drivers/interconnect/qcom/sc8180x.c | 3 +- + drivers/interconnect/qcom/sc8280xp.c | 3 +- + drivers/interconnect/qcom/sdm660.c | 4 + + drivers/interconnect/qcom/sdm670.c | 3 +- + drivers/interconnect/qcom/sdm845.c | 3 +- + drivers/interconnect/qcom/sdx55.c | 2 +- + drivers/interconnect/qcom/sdx65.c | 2 +- + drivers/interconnect/qcom/sdx75.c | 1107 ++++++++++++ + drivers/interconnect/qcom/sdx75.h | 97 ++ + drivers/interconnect/qcom/sm6350.c | 3 +- + drivers/interconnect/qcom/sm8150.c | 3 +- + drivers/interconnect/qcom/sm8250.c | 3 +- + drivers/interconnect/qcom/sm8350.c | 3 +- + drivers/interconnect/qcom/sm8450.c | 2 +- + drivers/interconnect/qcom/sm8550.c | 2 +- + drivers/mcb/mcb-core.c | 7 +- + drivers/mcb/mcb-parse.c | 2 +- + drivers/misc/bcm-vk/bcm_vk_msg.c | 2 +- + drivers/misc/bcm-vk/bcm_vk_msg.h | 2 +- + drivers/misc/c2port/core.c | 2 +- + drivers/misc/cxl/file.c | 21 +- + drivers/misc/eeprom/Kconfig | 14 - + drivers/misc/eeprom/Makefile | 1 - + drivers/misc/eeprom/eeprom.c | 214 --- + drivers/misc/eeprom/idt_89hpesx.c | 11 +- + drivers/misc/ibmvmc.c | 4 +- + drivers/misc/mei/bus.c | 92 +- + drivers/misc/mei/client.c | 20 +- + drivers/misc/mei/dma-ring.c | 6 +- + drivers/misc/mei/hbm.c | 6 +- + drivers/misc/mei/hw-me-regs.h | 3 + + drivers/misc/mei/hw-me.c | 77 +- + drivers/misc/mei/hw-me.h | 4 + + drivers/misc/mei/hw.h | 12 +- + drivers/misc/mei/init.c | 27 +- + drivers/misc/mei/interrupt.c | 6 +- + drivers/misc/mei/main.c | 8 +- + drivers/misc/mei/mei_dev.h | 51 +- + drivers/misc/mei/pxp/mei_pxp.c | 88 +- + drivers/misc/ocxl/file.c | 27 +- + drivers/misc/pci_endpoint_test.c | 4 + + drivers/misc/phantom.c | 24 +- + drivers/misc/pvpanic/pvpanic-mmio.c | 58 +- + drivers/misc/pvpanic/pvpanic-pci.c | 58 +- + drivers/misc/pvpanic/pvpanic.c | 76 +- + drivers/misc/pvpanic/pvpanic.h | 10 +- + drivers/misc/ti-st/st_core.c | 7 +- + drivers/misc/ti-st/st_kim.c | 5 +- + drivers/misc/uacce/uacce.c | 17 +- + drivers/mtd/mtdcore.c | 3 +- + drivers/nvmem/apple-efuses.c | 1 + + drivers/nvmem/core.c | 10 +- + drivers/nvmem/imx-ocotp-scu.c | 1 + + drivers/nvmem/imx-ocotp.c | 1 + + drivers/nvmem/meson-efuse.c | 1 + + drivers/nvmem/meson-mx-efuse.c | 1 + + drivers/nvmem/microchip-otpc.c | 1 + + drivers/nvmem/mtk-efuse.c | 1 + + drivers/nvmem/mxs-ocotp.c | 10 +- + drivers/nvmem/qcom-spmi-sdam.c | 1 + + drivers/nvmem/qfprom.c | 7 +- + drivers/nvmem/rave-sp-eeprom.c | 1 + + drivers/nvmem/rockchip-efuse.c | 1 + + drivers/nvmem/sc27xx-efuse.c | 1 + + drivers/nvmem/sec-qfprom.c | 1 + + drivers/nvmem/sprd-efuse.c | 1 + + drivers/nvmem/stm32-romem.c | 8 +- + drivers/nvmem/sunplus-ocotp.c | 1 + + drivers/nvmem/sunxi_sid.c | 1 + + drivers/nvmem/uniphier-efuse.c | 1 + + drivers/nvmem/zynqmp_nvmem.c | 1 + + drivers/parport/procfs.c | 53 +- + drivers/parport/share.c | 26 +- + drivers/rapidio/devices/rio_mport_cdev.c | 16 +- + drivers/rapidio/rio_cm.c | 18 +- + drivers/rtc/nvmem.c | 1 + + drivers/staging/iio/Kconfig | 1 - + drivers/staging/iio/Makefile | 1 - + drivers/staging/iio/frequency/ad9832.c | 15 +- + drivers/staging/iio/frequency/ad9834.c | 21 +- + drivers/staging/iio/impedance-analyzer/ad5933.c | 22 +- + drivers/staging/iio/resolver/Kconfig | 18 - + drivers/staging/iio/resolver/Makefile | 6 - + drivers/staging/iio/resolver/ad2s1210.c | 716 -------- + drivers/tee/tee_core.c | 21 +- + drivers/vfio/cdx/main.c | 1 + + drivers/w1/slaves/w1_ds250x.c | 1 + + include/drm/i915_pxp_tee_interface.h | 6 +- + include/dt-bindings/interconnect/qcom,sdx75.h | 102 ++ + include/linux/cdx/cdx_bus.h | 41 +- + include/linux/comedi/comedi_8254.h | 51 +- + include/linux/comedi/comedi_8255.h | 24 +- + include/linux/comedi/comedidev.h | 2 +- + include/linux/hid-sensor-ids.h | 4 + + include/linux/iio/iio.h | 12 +- + include/linux/iio/sw_device.h | 3 - + include/linux/iio/sw_trigger.h | 3 - + include/linux/mei_cl_bus.h | 12 +- + include/linux/mod_devicetable.h | 10 + + include/linux/nvmem-provider.h | 4 +- + include/linux/parport.h | 2 - + include/uapi/linux/counter.h | 2 +- + include/uapi/linux/iio/types.h | 4 + + include/uapi/linux/mei.h | 14 +- + scripts/mod/devicetable-offsets.c | 4 + + scripts/mod/file2alias.c | 8 + + tools/iio/iio_event_monitor.c | 8 + + tools/iio/iio_generic_buffer.c | 13 +- + 363 files changed, 13498 insertions(+), 3654 deletions(-) + create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-adc-mcp3564 + create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-resolver-ad2s1210 + create mode 100644 Documentation/devicetree/bindings/iio/adc/microchip,mcp3564.yaml + create mode 100644 Documentation/devicetree/bindings/iio/adc/ti,twl6030-gpadc.yaml + create mode 100644 Documentation/devicetree/bindings/iio/pressure/rohm,bm1390.yaml + create mode 100644 Documentation/devicetree/bindings/iio/resolver/adi,ad2s1210.yaml + create mode 100644 Documentation/devicetree/bindings/interconnect/qcom,msm8939.yaml + create mode 100644 Documentation/devicetree/bindings/interconnect/qcom,msm8996.yaml + create mode 100644 Documentation/devicetree/bindings/interconnect/qcom,rpm-common.yaml + create mode 100644 Documentation/devicetree/bindings/interconnect/qcom,sdm660.yaml + create mode 100644 Documentation/devicetree/bindings/interconnect/qcom,sdx75-rpmh.yaml + create mode 100644 Documentation/devicetree/bindings/net/ti,cc1352p7.yaml + create mode 100644 Documentation/devicetree/bindings/nvmem/nvmem-deprecated-cells.yaml + create mode 100644 Documentation/devicetree/bindings/usb/realtek,rtd-type-c.yaml + delete mode 100644 Documentation/misc-devices/eeprom.rst + create mode 100644 drivers/extcon/extcon-rtk-type-c.c + create mode 100644 drivers/greybus/gb-beagleplay.c + create mode 100644 drivers/iio/adc/ltc2309.c + create mode 100644 drivers/iio/adc/mcp3564.c + create mode 100644 drivers/iio/pressure/rohm-bm1390.c + create mode 100644 drivers/iio/resolver/ad2s1210.c + create mode 100644 drivers/interconnect/qcom/sdx75.c + create mode 100644 drivers/interconnect/qcom/sdx75.h + delete mode 100644 drivers/misc/eeprom/eeprom.c + delete mode 100644 drivers/staging/iio/resolver/Kconfig + delete mode 100644 drivers/staging/iio/resolver/Makefile + delete mode 100644 drivers/staging/iio/resolver/ad2s1210.c + create mode 100644 include/dt-bindings/interconnect/qcom,sdx75.h +Merging accel/habanalabs-next (08057253366d Merge tag 'drm-habanalabs-next-2023-10-10' of https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux into drm-next) +$ git merge -m Merge branch 'habanalabs-next' of git://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux.git accel/habanalabs-next +Already up to date. +Merging coresight/next (fa55e63584f2 Documentation: coresight: fix `make refcheckdocs` warning) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/coresight/linux.git coresight/next +Auto-merging MAINTAINERS +Merge made by the 'ort' strategy. + .../ABI/testing/sysfs-bus-coresight-devices-tmc | 16 + + .../ABI/testing/sysfs-bus-coresight-devices-tpdm | 159 +++++ + Documentation/arch/arm64/silicon-errata.rst | 10 + + .../bindings/arm/qcom,coresight-tpdm.yaml | 20 + + Documentation/trace/coresight/coresight.rst | 6 +- + MAINTAINERS | 1 - + drivers/hwtracing/coresight/coresight-core.c | 3 + + drivers/hwtracing/coresight/coresight-etm-perf.c | 6 +- + drivers/hwtracing/coresight/coresight-etm4x-core.c | 52 +- + drivers/hwtracing/coresight/coresight-tmc-core.c | 15 +- + drivers/hwtracing/coresight/coresight-tmc-etr.c | 111 +++- + drivers/hwtracing/coresight/coresight-tmc.h | 3 + + drivers/hwtracing/coresight/coresight-tpda.c | 126 +++- + drivers/hwtracing/coresight/coresight-tpda.h | 2 + + drivers/hwtracing/coresight/coresight-tpdm.c | 718 ++++++++++++++++++++- + drivers/hwtracing/coresight/coresight-tpdm.h | 161 +++++ + drivers/hwtracing/coresight/coresight-trbe.c | 23 +- + drivers/hwtracing/coresight/coresight-trbe.h | 2 + + drivers/hwtracing/ptt/hisi_ptt.c | 33 +- + drivers/hwtracing/ptt/hisi_ptt.h | 1 + + include/linux/coresight.h | 1 + + 21 files changed, 1411 insertions(+), 58 deletions(-) +Merging fastrpc/for-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/srini/fastrpc.git fastrpc/for-next +Already up to date. +Merging fpga/for-next (d79eed22ba97 fpga: versal: Add support for 44-bit DMA operations) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/fpga/linux-fpga.git fpga/for-next +Already up to date. +Merging icc/icc-next (d4c720a19e9a Merge branch 'icc-platform-remove' into icc-next) +$ git merge -m Merge branch 'icc-next' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc.git icc/icc-next +Already up to date. +Merging iio/togreg (89e2233386a5 iio: proximity: sx9324: Switch to device_property_match_property_string()) +$ git merge -m Merge branch 'togreg' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git iio/togreg +Auto-merging MAINTAINERS +Auto-merging include/linux/property.h +Merge made by the 'ort' strategy. + Documentation/ABI/testing/sysfs-bus-iio | 18 + + .../bindings/iio/adc/maxim,max34408.yaml | 139 ++ + .../devicetree/bindings/iio/imu/bosch,bmi323.yaml | 77 + + MAINTAINERS | 7 + + drivers/base/property.c | 37 +- + drivers/iio/adc/Kconfig | 11 + + drivers/iio/adc/Makefile | 1 + + drivers/iio/adc/max34408.c | 276 +++ + drivers/iio/frequency/adf4377.c | 16 +- + drivers/iio/frequency/admv1014.c | 31 +- + drivers/iio/imu/Kconfig | 1 + + drivers/iio/imu/Makefile | 1 + + drivers/iio/imu/bmi323/Kconfig | 33 + + drivers/iio/imu/bmi323/Makefile | 7 + + drivers/iio/imu/bmi323/bmi323.h | 209 ++ + drivers/iio/imu/bmi323/bmi323_core.c | 2139 ++++++++++++++++++++ + drivers/iio/imu/bmi323/bmi323_i2c.c | 121 ++ + drivers/iio/imu/bmi323/bmi323_spi.c | 92 + + drivers/iio/magnetometer/tmag5273.c | 10 +- + drivers/iio/proximity/sx9324.c | 24 +- + drivers/iio/resolver/ad2s1210.c | 160 +- + include/linux/property.h | 12 + + 22 files changed, 3341 insertions(+), 81 deletions(-) + create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml + create mode 100644 Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml + create mode 100644 drivers/iio/adc/max34408.c + create mode 100644 drivers/iio/imu/bmi323/Kconfig + create mode 100644 drivers/iio/imu/bmi323/Makefile + create mode 100644 drivers/iio/imu/bmi323/bmi323.h + create mode 100644 drivers/iio/imu/bmi323/bmi323_core.c + create mode 100644 drivers/iio/imu/bmi323/bmi323_i2c.c + create mode 100644 drivers/iio/imu/bmi323/bmi323_spi.c +Merging phy-next/next (d688c8264b8e phy: Remove duplicated include in phy-ralink-usb.c) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy.git phy-next/next +Auto-merging Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-usb3-uni-phy.yaml +CONFLICT (content): Merge conflict in Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-usb3-uni-phy.yaml +Resolved 'Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-usb3-uni-phy.yaml' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master fb3b92dfb567] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy.git +$ git diff -M --stat --summary HEAD^.. + .../bindings/phy/marvell,pxa1928-usb-phy.yaml | 47 ++++ + .../devicetree/bindings/phy/mediatek,dsi-phy.yaml | 1 + + .../bindings/phy/mediatek,mt7628-usbphy.yaml | 74 ++++++ + .../devicetree/bindings/phy/phy-stih407-usb.txt | 24 -- + .../devicetree/bindings/phy/pxa1928-usb-phy.txt | 18 -- + .../bindings/phy/qcom,ipq5332-usb-hsphy.yaml | 4 +- + .../bindings/phy/qcom,msm8996-qmp-usb3-phy.yaml | 287 --------------------- + .../bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml | 2 + + .../phy/qcom,sc8280xp-qmp-usb3-uni-phy.yaml | 55 +++- + .../bindings/phy/qcom,snps-eusb2-repeater.yaml | 21 ++ + .../devicetree/bindings/phy/ralink-usb-phy.txt | 23 -- + .../bindings/phy/st,stih407-usb2-phy.yaml | 63 +++++ + drivers/phy/Kconfig | 2 +- + drivers/phy/allwinner/phy-sun4i-usb.c | 2 +- + drivers/phy/broadcom/phy-bcm-ns-usb3.c | 9 +- + drivers/phy/marvell/phy-berlin-usb.c | 7 +- + drivers/phy/motorola/phy-cpcap-usb.c | 7 - + drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c | 146 ++++++++--- + drivers/phy/qualcomm/phy-qcom-m31.c | 59 ++++- + drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 50 ++-- + drivers/phy/qualcomm/phy-qcom-qmp-pcie.c | 37 +++ + drivers/phy/qualcomm/phy-qcom-qmp-pcs-misc-v4.h | 17 ++ + drivers/phy/qualcomm/phy-qcom-qmp-pcs-usb-v6.h | 29 +-- + drivers/phy/qualcomm/phy-qcom-qmp-pcs-v5_20.h | 2 + + drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6.h | 20 +- + drivers/phy/qualcomm/phy-qcom-qmp-ufs.c | 142 ++++++++++ + drivers/phy/qualcomm/phy-qcom-qmp-usb.c | 225 ++++++++-------- + drivers/phy/qualcomm/phy-qcom-qmp.h | 8 - + drivers/phy/ralink/phy-ralink-usb.c | 9 +- + drivers/phy/realtek/phy-rtk-usb2.c | 2 +- + drivers/phy/realtek/phy-rtk-usb3.c | 2 +- + drivers/phy/renesas/r8a779f0-ether-serdes.c | 16 +- + drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 2 - + drivers/phy/rockchip/phy-rockchip-pcie.c | 11 +- + drivers/phy/rockchip/phy-rockchip-usb.c | 10 +- + drivers/phy/ti/phy-dm816x-usb.c | 11 +- + drivers/phy/ti/phy-omap-control.c | 9 +- + drivers/phy/ti/phy-omap-usb2.c | 11 +- + drivers/phy/ti/phy-ti-pipe3.c | 14 +- + 39 files changed, 828 insertions(+), 650 deletions(-) + create mode 100644 Documentation/devicetree/bindings/phy/marvell,pxa1928-usb-phy.yaml + create mode 100644 Documentation/devicetree/bindings/phy/mediatek,mt7628-usbphy.yaml + delete mode 100644 Documentation/devicetree/bindings/phy/phy-stih407-usb.txt + delete mode 100644 Documentation/devicetree/bindings/phy/pxa1928-usb-phy.txt + delete mode 100644 Documentation/devicetree/bindings/phy/qcom,msm8996-qmp-usb3-phy.yaml + delete mode 100644 Documentation/devicetree/bindings/phy/ralink-usb-phy.txt + create mode 100644 Documentation/devicetree/bindings/phy/st,stih407-usb2-phy.yaml + create mode 100644 drivers/phy/qualcomm/phy-qcom-qmp-pcs-misc-v4.h +Merging soundwire/next (4ea2b6d3128e soundwire: dmi-quirks: update HP Omen match) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire.git soundwire/next +Auto-merging drivers/soundwire/bus.c +Merge made by the 'ort' strategy. + drivers/soundwire/bus.c | 12 +++++++----- + drivers/soundwire/dmi-quirks.c | 2 +- + drivers/soundwire/qcom.c | 18 +++++++++++++++--- + 3 files changed, 23 insertions(+), 9 deletions(-) +Merging extcon/extcon-next (b3edc3463d64 extcon: realtek: add the error handler for nvmem_cell_read) +$ git merge -m Merge branch 'extcon-next' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon.git extcon/extcon-next +Already up to date. +Merging gnss/gnss-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'gnss-next' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/gnss.git gnss/gnss-next +Already up to date. +Merging vfio/next (2b88119e35b0 vfio/mtty: Enable migration support) +$ git merge -m Merge branch 'next' of git://github.com/awilliam/linux-vfio.git vfio/next +Auto-merging drivers/cdx/cdx.c +Auto-merging drivers/cdx/controller/cdx_controller.c +Auto-merging drivers/cdx/controller/mcdi_functions.c +Auto-merging drivers/cdx/controller/mcdi_functions.h +Auto-merging drivers/vfio/cdx/main.c +Auto-merging include/linux/cdx/cdx_bus.h +Merge made by the 'ort' strategy. + drivers/cdx/cdx.c | 32 ++ + drivers/cdx/controller/cdx_controller.c | 4 + + drivers/cdx/controller/mcdi_functions.c | 58 +++ + drivers/cdx/controller/mcdi_functions.h | 13 + + drivers/gpu/drm/i915/gvt/kvmgt.c | 2 +- + drivers/vfio/cdx/main.c | 57 ++- + drivers/vfio/cdx/private.h | 2 + + drivers/vfio/pci/mlx5/cmd.c | 103 ++-- + drivers/vfio/pci/mlx5/cmd.h | 28 +- + drivers/vfio/pci/mlx5/main.c | 285 ++++++++--- + drivers/vfio/vfio_main.c | 10 + + include/linux/cdx/cdx_bus.h | 18 + + include/uapi/linux/vfio.h | 47 +- + samples/vfio-mdev/mbochs.c | 2 +- + samples/vfio-mdev/mdpy.c | 2 +- + samples/vfio-mdev/mtty.c | 827 +++++++++++++++++++++++++++++--- + 16 files changed, 1298 insertions(+), 192 deletions(-) +Merging w1/for-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-w1.git w1/for-next +Already up to date. +Merging staging/staging-next (41196b0bbe8a staging: vt6655: Type encoding info dropped from variable name "byRxRate") +$ git merge -m Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git staging/staging-next +Auto-merging Documentation/networking/device_drivers/index.rst +Auto-merging MAINTAINERS +CONFLICT (modify/delete): drivers/staging/qlge/qlge_devlink.c deleted in staging/staging-next and modified in HEAD. Version HEAD of drivers/staging/qlge/qlge_devlink.c left in tree. +Auto-merging include/linux/mod_devicetable.h +Auto-merging scripts/mod/devicetable-offsets.c +Auto-merging scripts/mod/file2alias.c +Automatic merge failed; fix conflicts and then commit the result. +$ git rm -f drivers/staging/qlge/qlge_devlink.c +rm 'drivers/staging/qlge/qlge_devlink.c' +$ git commit --no-edit -v -a +[master 96f1a929fdf2] Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git +$ git diff -M --stat --summary HEAD^.. + Documentation/networking/device_drivers/index.rst | 1 - + .../networking/device_drivers/qlogic/index.rst | 18 - + .../networking/device_drivers/qlogic/qlge.rst | 118 - + MAINTAINERS | 9 - + arch/parisc/configs/generic-64bit_defconfig | 1 - + drivers/staging/Kconfig | 4 - + drivers/staging/Makefile | 2 - + drivers/staging/fbtft/fbtft.h | 5 +- + drivers/staging/fieldbus/anybuss/arcx-anybus.c | 17 +- + drivers/staging/gdm724x/gdm_tty.c | 1 + + drivers/staging/greybus/audio_manager_private.h | 7 +- + drivers/staging/greybus/authentication.c | 19 +- + drivers/staging/greybus/bootrom.c | 2 - + drivers/staging/greybus/camera.c | 13 +- + drivers/staging/greybus/fw-management.c | 19 +- + drivers/staging/greybus/raw.c | 23 +- + drivers/staging/ks7010/ks7010_sdio.c | 4 +- + drivers/staging/octeon/ethernet.c | 6 +- + drivers/staging/octeon/octeon-stubs.h | 50 +- + drivers/staging/olpc_dcon/olpc_dcon.c | 2 +- + drivers/staging/pi433/pi433_if.c | 21 +- + drivers/staging/qlge/Kconfig | 11 - + drivers/staging/qlge/Makefile | 8 - + drivers/staging/qlge/TODO | 33 - + drivers/staging/qlge/qlge.h | 2293 --------- + drivers/staging/qlge/qlge_dbg.c | 1311 ------ + drivers/staging/qlge/qlge_devlink.c | 139 - + drivers/staging/qlge/qlge_devlink.h | 9 - + drivers/staging/qlge/qlge_ethtool.c | 746 --- + drivers/staging/qlge/qlge_main.c | 4845 -------------------- + drivers/staging/qlge/qlge_mpi.c | 1273 ----- + drivers/staging/rtl8192e/dot11d.c | 3 - + drivers/staging/rtl8192e/rtl8192e/r8190P_def.h | 2 - + drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c | 175 +- + drivers/staging/rtl8192e/rtl8192e/r8192E_dev.h | 3 - + drivers/staging/rtl8192e/rtl8192e/r8192E_hw.h | 104 +- + drivers/staging/rtl8192e/rtl8192e/r8192E_phy.c | 17 +- + drivers/staging/rtl8192e/rtl8192e/r8192E_phyreg.h | 60 - + drivers/staging/rtl8192e/rtl8192e/rtl_cam.c | 120 +- + drivers/staging/rtl8192e/rtl8192e/rtl_cam.h | 1 - + drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 366 +- + drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 18 +- + drivers/staging/rtl8192e/rtl8192e/rtl_dm.c | 309 +- + drivers/staging/rtl8192e/rtl8192e/rtl_dm.h | 27 - + drivers/staging/rtl8192e/rtl8192e/rtl_pci.c | 2 +- + drivers/staging/rtl8192e/rtl8192e/rtl_ps.c | 9 +- + drivers/staging/rtl8192e/rtl8192e/rtl_wx.c | 273 +- + drivers/staging/rtl8192e/rtl819x_BAProc.c | 292 +- + drivers/staging/rtl8192e/rtl819x_HT.h | 2 +- + drivers/staging/rtl8192e/rtl819x_HTProc.c | 115 +- + drivers/staging/rtl8192e/rtl819x_Qos.h | 130 +- + drivers/staging/rtl8192e/rtl819x_TS.h | 8 +- + drivers/staging/rtl8192e/rtl819x_TSProc.c | 254 +- + drivers/staging/rtl8192e/rtllib.h | 308 +- + drivers/staging/rtl8192e/rtllib_crypt_ccmp.c | 19 +- + drivers/staging/rtl8192e/rtllib_crypt_tkip.c | 40 +- + drivers/staging/rtl8192e/rtllib_crypt_wep.c | 2 +- + drivers/staging/rtl8192e/rtllib_debug.h | 49 - + drivers/staging/rtl8192e/rtllib_module.c | 8 +- + drivers/staging/rtl8192e/rtllib_rx.c | 455 +- + drivers/staging/rtl8192e/rtllib_softmac.c | 489 +- + drivers/staging/rtl8192e/rtllib_softmac_wx.c | 51 +- + drivers/staging/rtl8192e/rtllib_tx.c | 569 ++- + drivers/staging/rtl8192e/rtllib_wx.c | 2 +- + drivers/staging/rtl8192u/Kconfig | 12 - + drivers/staging/rtl8192u/Makefile | 27 - + drivers/staging/rtl8192u/TODO | 16 - + drivers/staging/rtl8192u/authors | 1 - + drivers/staging/rtl8192u/changes | 4 - + drivers/staging/rtl8192u/ieee80211/dot11d.c | 174 - + drivers/staging/rtl8192u/ieee80211/dot11d.h | 57 - + drivers/staging/rtl8192u/ieee80211/ieee80211.h | 2385 ---------- + .../staging/rtl8192u/ieee80211/ieee80211_crypt.c | 235 - + .../staging/rtl8192u/ieee80211/ieee80211_crypt.h | 86 - + .../rtl8192u/ieee80211/ieee80211_crypt_ccmp.c | 421 -- + .../rtl8192u/ieee80211/ieee80211_crypt_tkip.c | 718 --- + .../rtl8192u/ieee80211/ieee80211_crypt_wep.c | 247 - + .../staging/rtl8192u/ieee80211/ieee80211_module.c | 287 -- + drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | 2430 ---------- + .../staging/rtl8192u/ieee80211/ieee80211_softmac.c | 3056 ------------ + .../rtl8192u/ieee80211/ieee80211_softmac_wx.c | 598 --- + drivers/staging/rtl8192u/ieee80211/ieee80211_tx.c | 839 ---- + drivers/staging/rtl8192u/ieee80211/ieee80211_wx.c | 810 ---- + drivers/staging/rtl8192u/ieee80211/rtl819x_BA.h | 54 - + .../staging/rtl8192u/ieee80211/rtl819x_BAProc.c | 700 --- + drivers/staging/rtl8192u/ieee80211/rtl819x_HT.h | 302 -- + .../staging/rtl8192u/ieee80211/rtl819x_HTProc.c | 1295 ------ + drivers/staging/rtl8192u/ieee80211/rtl819x_Qos.h | 82 - + drivers/staging/rtl8192u/ieee80211/rtl819x_TS.h | 102 - + .../staging/rtl8192u/ieee80211/rtl819x_TSProc.c | 534 --- + drivers/staging/rtl8192u/r8180_93cx6.c | 170 - + drivers/staging/rtl8192u/r8180_93cx6.h | 25 - + drivers/staging/rtl8192u/r8190_rtl8256.c | 294 -- + drivers/staging/rtl8192u/r8190_rtl8256.h | 24 - + drivers/staging/rtl8192u/r8192U.h | 1129 ----- + drivers/staging/rtl8192u/r8192U_core.c | 4800 ------------------- + drivers/staging/rtl8192u/r8192U_debugfs.c | 188 - + drivers/staging/rtl8192u/r8192U_dm.c | 2821 ------------ + drivers/staging/rtl8192u/r8192U_dm.h | 176 - + drivers/staging/rtl8192u/r8192U_hw.h | 246 - + drivers/staging/rtl8192u/r8192U_wx.c | 943 ---- + drivers/staging/rtl8192u/r8192U_wx.h | 24 - + drivers/staging/rtl8192u/r819xU_cmdpkt.c | 508 -- + drivers/staging/rtl8192u/r819xU_cmdpkt.h | 190 - + drivers/staging/rtl8192u/r819xU_firmware.c | 340 -- + drivers/staging/rtl8192u/r819xU_firmware.h | 19 - + drivers/staging/rtl8192u/r819xU_firmware_img.c | 549 --- + drivers/staging/rtl8192u/r819xU_firmware_img.h | 26 - + drivers/staging/rtl8192u/r819xU_phy.c | 1646 ------- + drivers/staging/rtl8192u/r819xU_phy.h | 81 - + drivers/staging/rtl8192u/r819xU_phyreg.h | 143 - + drivers/staging/rtl8723bs/hal/rtl8723b_phycfg.c | 6 +- + drivers/staging/rts5208/rtsx.c | 24 +- + drivers/staging/rts5208/rtsx.h | 66 +- + drivers/staging/sm750fb/ddk750_mode.c | 94 +- + drivers/staging/sm750fb/ddk750_mode.h | 2 +- + drivers/staging/sm750fb/sm750_hw.c | 2 +- + drivers/staging/vc04_services/Makefile | 1 + + .../staging/vc04_services/bcm2835-audio/bcm2835.c | 32 +- + .../staging/vc04_services/bcm2835-audio/bcm2835.h | 1 - + .../vc04_services/bcm2835-camera/bcm2835-camera.c | 31 +- + .../vc04_services/interface/vchiq_arm/vchiq_arm.c | 227 +- + .../vc04_services/interface/vchiq_arm/vchiq_arm.h | 3 - + .../vc04_services/interface/vchiq_arm/vchiq_bus.c | 99 + + .../vc04_services/interface/vchiq_arm/vchiq_bus.h | 57 + + .../interface/vchiq_arm/vchiq_connected.c | 2 +- + .../vc04_services/interface/vchiq_arm/vchiq_core.c | 405 +- + .../vc04_services/interface/vchiq_arm/vchiq_core.h | 67 +- + .../interface/vchiq_arm/vchiq_debugfs.c | 103 - + .../vc04_services/interface/vchiq_arm/vchiq_dev.c | 66 +- + drivers/staging/vme_user/vme.c | 256 +- + drivers/staging/vme_user/vme.h | 6 +- + drivers/staging/vme_user/vme_fake.c | 77 +- + drivers/staging/vme_user/vme_tsi148.c | 9 +- + drivers/staging/vme_user/vme_tsi148.h | 692 ++- + drivers/staging/vme_user/vme_user.c | 26 +- + drivers/staging/vt6655/baseband.c | 86 +- + drivers/staging/vt6655/card.c | 194 +- + drivers/staging/vt6655/card.h | 10 +- + drivers/staging/vt6655/channel.c | 28 +- + drivers/staging/vt6655/device.h | 28 +- + drivers/staging/vt6655/device_main.c | 46 +- + drivers/staging/vt6655/dpc.c | 2 +- + drivers/staging/vt6655/rf.c | 18 +- + drivers/staging/vt6655/rf.h | 2 +- + drivers/staging/wlan-ng/hfa384x_usb.c | 2 +- + drivers/staging/wlan-ng/p80211conv.c | 12 +- + drivers/staging/wlan-ng/p80211netdev.h | 3 - + drivers/staging/wlan-ng/prism2fw.c | 2 +- + drivers/staging/wlan-ng/prism2mgmt.h | 12 +- + drivers/staging/wlan-ng/prism2sta.c | 179 +- + include/linux/mod_devicetable.h | 4 + + scripts/mod/devicetable-offsets.c | 3 + + scripts/mod/file2alias.c | 9 + + 154 files changed, 2711 insertions(+), 45389 deletions(-) + delete mode 100644 Documentation/networking/device_drivers/qlogic/index.rst + delete mode 100644 Documentation/networking/device_drivers/qlogic/qlge.rst + delete mode 100644 drivers/staging/qlge/Kconfig + delete mode 100644 drivers/staging/qlge/Makefile + delete mode 100644 drivers/staging/qlge/TODO + delete mode 100644 drivers/staging/qlge/qlge.h + delete mode 100644 drivers/staging/qlge/qlge_dbg.c + delete mode 100644 drivers/staging/qlge/qlge_devlink.c + delete mode 100644 drivers/staging/qlge/qlge_devlink.h + delete mode 100644 drivers/staging/qlge/qlge_ethtool.c + delete mode 100644 drivers/staging/qlge/qlge_main.c + delete mode 100644 drivers/staging/qlge/qlge_mpi.c + delete mode 100644 drivers/staging/rtl8192e/rtllib_debug.h + delete mode 100644 drivers/staging/rtl8192u/Kconfig + delete mode 100644 drivers/staging/rtl8192u/Makefile + delete mode 100644 drivers/staging/rtl8192u/TODO + delete mode 100644 drivers/staging/rtl8192u/authors + delete mode 100644 drivers/staging/rtl8192u/changes + delete mode 100644 drivers/staging/rtl8192u/ieee80211/dot11d.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/dot11d.h + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211.h + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt.h + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_module.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_softmac.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_softmac_wx.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_tx.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/ieee80211_wx.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/rtl819x_BA.h + delete mode 100644 drivers/staging/rtl8192u/ieee80211/rtl819x_BAProc.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/rtl819x_HT.h + delete mode 100644 drivers/staging/rtl8192u/ieee80211/rtl819x_HTProc.c + delete mode 100644 drivers/staging/rtl8192u/ieee80211/rtl819x_Qos.h + delete mode 100644 drivers/staging/rtl8192u/ieee80211/rtl819x_TS.h + delete mode 100644 drivers/staging/rtl8192u/ieee80211/rtl819x_TSProc.c + delete mode 100644 drivers/staging/rtl8192u/r8180_93cx6.c + delete mode 100644 drivers/staging/rtl8192u/r8180_93cx6.h + delete mode 100644 drivers/staging/rtl8192u/r8190_rtl8256.c + delete mode 100644 drivers/staging/rtl8192u/r8190_rtl8256.h + delete mode 100644 drivers/staging/rtl8192u/r8192U.h + delete mode 100644 drivers/staging/rtl8192u/r8192U_core.c + delete mode 100644 drivers/staging/rtl8192u/r8192U_debugfs.c + delete mode 100644 drivers/staging/rtl8192u/r8192U_dm.c + delete mode 100644 drivers/staging/rtl8192u/r8192U_dm.h + delete mode 100644 drivers/staging/rtl8192u/r8192U_hw.h + delete mode 100644 drivers/staging/rtl8192u/r8192U_wx.c + delete mode 100644 drivers/staging/rtl8192u/r8192U_wx.h + delete mode 100644 drivers/staging/rtl8192u/r819xU_cmdpkt.c + delete mode 100644 drivers/staging/rtl8192u/r819xU_cmdpkt.h + delete mode 100644 drivers/staging/rtl8192u/r819xU_firmware.c + delete mode 100644 drivers/staging/rtl8192u/r819xU_firmware.h + delete mode 100644 drivers/staging/rtl8192u/r819xU_firmware_img.c + delete mode 100644 drivers/staging/rtl8192u/r819xU_firmware_img.h + delete mode 100644 drivers/staging/rtl8192u/r819xU_phy.c + delete mode 100644 drivers/staging/rtl8192u/r819xU_phy.h + delete mode 100644 drivers/staging/rtl8192u/r819xU_phyreg.h + create mode 100644 drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c + create mode 100644 drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.h +Merging counter-next/counter-next (7904cdf1397c counter: chrdev: remove a typo in header file comment) +$ git merge -m Merge branch 'counter-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter.git counter-next/counter-next +Already up to date. +Merging mux/for-next (44c026a73be8 Linux 6.4-rc3) +$ git merge -m Merge branch 'for-next' of https://gitlab.com/peda-linux/mux.git mux/for-next +Already up to date. +Merging dmaengine/next (03f25d53b145 dmaengine: stm32-mdma: correct desc prep when channel running) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine.git dmaengine/next +Auto-merging MAINTAINERS +Auto-merging drivers/dma/fsl-edma-common.h +Auto-merging drivers/dma/fsl-edma-main.c +Auto-merging drivers/dma/mediatek/mtk-uart-apdma.c +Auto-merging drivers/dma/stm32-dma.c +Auto-merging drivers/dma/stm32-mdma.c +Merge made by the 'ort' strategy. + Documentation/ABI/stable/sysfs-driver-dma-idxd | 6 + + .../devicetree/bindings/dma/qcom,gpi.yaml | 2 + + MAINTAINERS | 8 + + drivers/dma/Kconfig | 2 +- + drivers/dma/altera-msgdma.c | 6 +- + drivers/dma/apple-admac.c | 8 +- + drivers/dma/at_hdmac.c | 8 +- + drivers/dma/at_xdmac.c | 6 +- + drivers/dma/bcm-sba-raid.c | 6 +- + drivers/dma/bcm2835-dma.c | 6 +- + drivers/dma/bestcomm/bestcomm.c | 6 +- + drivers/dma/dma-axi-dmac.c | 11 +- + drivers/dma/dma-jz4780.c | 6 +- + drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c | 156 ++++++++++++----- + drivers/dma/dw-axi-dmac/dw-axi-dmac.h | 6 +- + drivers/dma/dw/platform.c | 6 +- + drivers/dma/ep93xx_dma.c | 2 +- + drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c | 1 - + drivers/dma/fsl-edma-common.h | 2 +- + drivers/dma/fsl-edma-main.c | 19 +-- + drivers/dma/fsl-qdma.c | 5 +- + drivers/dma/fsl_raid.c | 6 +- + drivers/dma/fsldma.c | 6 +- + drivers/dma/hisi_dma.c | 2 +- + drivers/dma/idma64.c | 6 +- + drivers/dma/idxd/Makefile | 6 +- + drivers/dma/idxd/cdev.c | 7 + + drivers/dma/idxd/dma.c | 6 + + drivers/dma/idxd/idxd.h | 9 + + drivers/dma/idxd/irq.c | 4 +- + drivers/dma/idxd/sysfs.c | 34 ++++ + drivers/dma/img-mdc-dma.c | 6 +- + drivers/dma/imx-dma.c | 6 +- + drivers/dma/imx-sdma.c | 5 +- + drivers/dma/k3dma.c | 30 ++-- + drivers/dma/mcf-edma-main.c | 6 +- + drivers/dma/mediatek/mtk-cqdma.c | 6 +- + drivers/dma/mediatek/mtk-hsdma.c | 6 +- + drivers/dma/mediatek/mtk-uart-apdma.c | 6 +- + drivers/dma/mmp_pdma.c | 10 +- + drivers/dma/mmp_tdma.c | 35 +--- + drivers/dma/moxart-dma.c | 11 +- + drivers/dma/mpc512x_dma.c | 6 +- + drivers/dma/mv_xor.c | 11 +- + drivers/dma/mv_xor_v2.c | 6 +- + drivers/dma/nbpfaxi.c | 6 +- + drivers/dma/owl-dma.c | 6 +- + drivers/dma/ppc4xx/adma.c | 5 +- + drivers/dma/pxa_dma.c | 26 ++- + drivers/dma/qcom/bam_dma.c | 8 +- + drivers/dma/qcom/hidma.c | 8 +- + drivers/dma/qcom/qcom_adm.c | 6 +- + drivers/dma/sa11x0-dma.c | 12 +- + drivers/dma/sf-pdma/sf-pdma.c | 6 +- + drivers/dma/sf-pdma/sf-pdma.h | 2 +- + drivers/dma/sh/rcar-dmac.c | 6 +- + drivers/dma/sh/rz-dmac.c | 6 +- + drivers/dma/sh/shdmac.c | 6 +- + drivers/dma/sh/usb-dmac.c | 8 +- + drivers/dma/sprd-dma.c | 22 ++- + drivers/dma/st_fdma.c | 18 +- + drivers/dma/st_fdma.h | 2 +- + drivers/dma/stm32-dma.c | 19 +-- + drivers/dma/stm32-mdma.c | 13 +- + drivers/dma/sun4i-dma.c | 6 +- + drivers/dma/sun6i-dma.c | 6 +- + drivers/dma/tegra186-gpc-dma.c | 8 +- + drivers/dma/tegra20-apb-dma.c | 6 +- + drivers/dma/tegra210-adma.c | 8 +- + drivers/dma/ti/cppi41.c | 5 +- + drivers/dma/ti/edma.c | 12 +- + drivers/dma/ti/omap-dma.c | 11 +- + drivers/dma/timb_dma.c | 5 +- + drivers/dma/txx9dmac.c | 10 +- + drivers/dma/uniphier-xdmac.c | 8 +- + drivers/dma/xgene-dma.c | 6 +- + drivers/dma/xilinx/xdma-regs.h | 2 + + drivers/dma/xilinx/xdma.c | 187 +++++++++++++++++++-- + drivers/dma/xilinx/xilinx_dma.c | 8 +- + drivers/dma/xilinx/xilinx_dpdma.c | 6 +- + drivers/dma/xilinx/zynqmp_dma.c | 6 +- + include/linux/dmaengine.h | 2 - + include/uapi/linux/idxd.h | 1 + + 83 files changed, 577 insertions(+), 425 deletions(-) +Merging cgroup/for-next (b9a477034b11 Merge branch 'for-6.7' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git cgroup/for-next +Auto-merging Documentation/admin-guide/cgroup-v2.rst +Auto-merging Documentation/admin-guide/kernel-parameters.txt +Auto-merging kernel/cgroup/cgroup.c +Merge made by the 'ort' strategy. + Documentation/admin-guide/cgroup-v2.rst | 130 +- + Documentation/admin-guide/kernel-parameters.txt | 4 + + kernel/cgroup/cgroup.c | 30 +- + kernel/cgroup/cpuset.c | 1332 +++++++++++++++------ + tools/testing/selftests/cgroup/test_cpuset_prs.sh | 463 ++++--- + 5 files changed, 1439 insertions(+), 520 deletions(-) +Merging scsi/for-next (e76fe87efdfb Merge branch 'misc' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git scsi/for-next +Auto-merging MAINTAINERS +Auto-merging drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +Auto-merging drivers/scsi/sd.c +Merge made by the 'ort' strategy. + .../devicetree/bindings/ufs/ufs-common.yaml | 35 +- + MAINTAINERS | 3 +- + drivers/infiniband/ulp/srpt/ib_srpt.c | 3 + + drivers/message/fusion/mptctl.c | 19 +- + drivers/message/fusion/mptfc.c | 94 ++-- + drivers/message/fusion/mptsas.c | 16 +- + drivers/message/fusion/mptscsih.c | 55 +- + drivers/message/fusion/mptscsih.h | 1 + + drivers/scsi/Kconfig | 15 - + drivers/scsi/aic7xxx/aic79xx_osm.c | 32 +- + drivers/scsi/aic7xxx/aic7xxx_osm.c | 131 ++--- + drivers/scsi/bnx2fc/bnx2fc.h | 1 + + drivers/scsi/bnx2fc/bnx2fc_hwi.c | 14 +- + drivers/scsi/bnx2fc/bnx2fc_io.c | 94 ++-- + drivers/scsi/cxgbi/libcxgbi.c | 2 +- + drivers/scsi/device_handler/scsi_dh_hp_sw.c | 81 +-- + drivers/scsi/device_handler/scsi_dh_rdac.c | 21 +- + drivers/scsi/elx/efct/efct_lio.c | 5 + + drivers/scsi/esas2r/esas2r_ioctl.c | 16 +- + drivers/scsi/fnic/fnic_fcs.c | 11 +- + drivers/scsi/hisi_sas/hisi_sas.h | 3 +- + drivers/scsi/hisi_sas/hisi_sas_main.c | 7 +- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 116 ++--- + drivers/scsi/ibmvscsi/ibmvfc.c | 493 +++++++++++++----- + drivers/scsi/ibmvscsi/ibmvfc.h | 50 +- + drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 3 + + drivers/scsi/imm.c | 70 +-- + drivers/scsi/imm.h | 4 - + drivers/scsi/ips.c | 18 - + drivers/scsi/libfc/fc_lport.c | 6 + + drivers/scsi/libsas/sas_discover.c | 2 +- + drivers/scsi/libsas/sas_init.c | 4 +- + drivers/scsi/libsas/sas_internal.h | 12 + + drivers/scsi/lpfc/lpfc_els.c | 23 + + drivers/scsi/lpfc/lpfc_hbadisc.c | 8 +- + drivers/scsi/lpfc/lpfc_logmsg.h | 2 +- + drivers/scsi/lpfc/lpfc_nportdisc.c | 18 +- + drivers/scsi/lpfc/lpfc_nvme.c | 6 +- + drivers/scsi/lpfc/lpfc_sli.c | 4 +- + drivers/scsi/lpfc/lpfc_version.h | 2 +- + drivers/scsi/megaraid.c | 42 +- + drivers/scsi/megaraid/megaraid_sas.h | 4 +- + drivers/scsi/megaraid/megaraid_sas_base.c | 4 +- + drivers/scsi/megaraid/megaraid_sas_fusion.c | 3 + + drivers/scsi/mpi3mr/mpi3mr_os.c | 63 ++- + drivers/scsi/pm8001/pm8001_hwi.c | 89 +--- + drivers/scsi/pm8001/pm8001_init.c | 285 +++++----- + drivers/scsi/pm8001/pm8001_sas.h | 11 +- + drivers/scsi/pm8001/pm80xx_hwi.c | 59 +-- + drivers/scsi/pmcraid.c | 60 ++- + drivers/scsi/qedf/qedf.h | 5 +- + drivers/scsi/qedf/qedf_io.c | 75 +-- + drivers/scsi/qedf/qedf_main.c | 19 +- + drivers/scsi/qla1280.c | 42 +- + drivers/scsi/qla2xxx/qla_os.c | 5 +- + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 6 + + drivers/scsi/scsi.c | 2 +- + drivers/scsi/scsi_debug.c | 575 ++++++++++++++++++++- + drivers/scsi/scsi_lib.c | 5 +- + drivers/scsi/scsi_transport_spi.c | 4 +- + drivers/scsi/sd.c | 48 +- + drivers/scsi/sr.c | 3 +- + drivers/scsi/sym53c8xx_2/sym_glue.c | 189 ++++--- + drivers/target/iscsi/Kconfig | 9 +- + drivers/target/iscsi/iscsi_target.c | 6 - + drivers/target/iscsi/iscsi_target_configfs.c | 5 +- + drivers/target/iscsi/iscsi_target_erl1.c | 2 +- + drivers/target/iscsi/iscsi_target_tmr.c | 2 +- + drivers/target/loopback/tcm_loop.c | 4 +- + drivers/target/sbp/sbp_target.c | 3 + + drivers/target/target_core_alua.c | 1 - + drivers/target/target_core_configfs.c | 22 + + drivers/target/target_core_device.c | 1 + + drivers/target/target_core_fabric_configfs.c | 24 + + drivers/target/target_core_transport.c | 116 +++-- + drivers/target/target_core_user.c | 2 +- + drivers/target/tcm_fc/tfc_conf.c | 3 + + drivers/ufs/core/ufshcd.c | 260 +++++++--- + drivers/ufs/host/cdns-pltfrm.c | 5 +- + drivers/ufs/host/tc-dwc-g210-pltfrm.c | 6 +- + drivers/ufs/host/ti-j721e-ufs.c | 6 +- + drivers/ufs/host/ufs-exynos.c | 15 +- + drivers/ufs/host/ufs-hisi.c | 5 +- + drivers/ufs/host/ufs-mediatek.c | 7 +- + drivers/ufs/host/ufs-qcom.c | 216 ++++++-- + drivers/ufs/host/ufs-qcom.h | 20 +- + drivers/ufs/host/ufs-renesas.c | 6 +- + drivers/ufs/host/ufs-sprd.c | 5 +- + drivers/ufs/host/ufshcd-pci.c | 5 +- + drivers/ufs/host/ufshcd-pltfrm.c | 93 +++- + drivers/ufs/host/ufshcd-pltfrm.h | 2 +- + drivers/usb/gadget/function/f_tcm.c | 3 + + drivers/vhost/scsi.c | 5 +- + drivers/xen/xen-scsiback.c | 3 + + include/scsi/libsas.h | 17 - + include/target/target_core_base.h | 10 + + include/target/target_core_fabric.h | 19 +- + include/trace/events/ufs.h | 15 +- + include/ufs/ufs.h | 3 +- + include/ufs/ufshcd.h | 14 +- + 100 files changed, 2710 insertions(+), 1328 deletions(-) +Merging scsi-mkp/for-next (a75a16c62a25 scsi: ufs: core: Leave space for '' in utf8 desc string) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git scsi-mkp/for-next +Auto-merging drivers/ufs/core/ufshcd.c +Auto-merging include/scsi/scsi_host.h +Merge made by the 'ort' strategy. + drivers/message/fusion/mptfc.c | 2 +- + drivers/scsi/aic7xxx/aic79xx_osm.c | 6 ++++-- + drivers/scsi/megaraid.c | 11 +++++++---- + drivers/scsi/mpt3sas/mpt3sas_base.c | 4 ++-- + drivers/scsi/pmcraid.c | 11 +++++++---- + drivers/scsi/scsi_lib.c | 32 +++++++++++++++----------------- + drivers/scsi/snic/snic_scsi.c | 14 ++++---------- + drivers/target/target_core_transport.c | 2 +- + drivers/ufs/core/ufshcd.c | 8 ++++---- + include/scsi/scsi_host.h | 3 +++ + 10 files changed, 48 insertions(+), 45 deletions(-) +Merging vhost/linux-next (276d5784878e vdpa_sim: implement .reset_map support) +$ git merge -m Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost/linux-next +Auto-merging MAINTAINERS +Auto-merging drivers/block/virtio_blk.c +Auto-merging drivers/vhost/scsi.c +Auto-merging drivers/virtio/virtio_balloon.c +Auto-merging include/linux/mlx5/mlx5_ifc.h +Merge made by the 'ort' strategy. + Documentation/ABI/testing/sysfs-bus-vdpa | 4 +- + MAINTAINERS | 6 + + drivers/block/virtio_blk.c | 4 +- + drivers/vdpa/mlx5/core/mlx5_vdpa.h | 32 +++-- + drivers/vdpa/mlx5/core/mr.c | 213 +++++++++++++++++++------------ + drivers/vdpa/mlx5/core/resources.c | 6 +- + drivers/vdpa/mlx5/net/mlx5_vnet.c | 137 +++++++++++++++----- + drivers/vdpa/vdpa_sim/vdpa_sim.c | 52 ++++++-- + drivers/vdpa/vdpa_user/vduse_dev.c | 40 +++--- + drivers/vhost/scsi.c | 2 +- + drivers/vhost/vdpa.c | 79 +++++++++++- + drivers/virtio/virtio_balloon.c | 2 +- + drivers/virtio/virtio_pci_modern.c | 36 ++++++ + drivers/virtio/virtio_pci_modern_dev.c | 6 +- + drivers/virtio/virtio_vdpa.c | 2 +- + include/linux/mlx5/mlx5_ifc.h | 8 +- + include/linux/mlx5/mlx5_ifc_vdpa.h | 7 +- + include/linux/vdpa.h | 41 +++++- + include/linux/virtio_pci_modern.h | 35 +++-- + include/uapi/linux/vhost.h | 8 ++ + include/uapi/linux/vhost_types.h | 7 + + include/uapi/linux/virtio_config.h | 5 + + 22 files changed, 546 insertions(+), 186 deletions(-) +Merging rpmsg/for-next (6dc66a309673 Merge branches 'hwspinlock-next', 'rpmsg-next' and 'rproc-next' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux.git rpmsg/for-next +Auto-merging arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +Auto-merging arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi +Merge made by the 'ort' strategy. + .../devicetree/bindings/remoteproc/mtk,scp.yaml | 176 ++++++- + .../devicetree/bindings/remoteproc/qcom,adsp.yaml | 20 +- + .../bindings/remoteproc/qcom,msm8996-mss-pil.yaml | 2 - + .../bindings/remoteproc/qcom,sc7180-pas.yaml | 81 +++- + .../bindings/remoteproc/qcom,sm6375-pas.yaml | 145 ++++++ + .../bindings/remoteproc/ti,pru-rproc.yaml | 23 + + arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 2 +- + arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi | 2 +- + drivers/hwspinlock/qcom_hwspinlock.c | 1 - + drivers/remoteproc/mtk_common.h | 39 +- + drivers/remoteproc/mtk_scp.c | 536 ++++++++++++++++----- + drivers/remoteproc/mtk_scp_ipi.c | 4 +- + drivers/remoteproc/qcom_q6v5_mss.c | 1 - + drivers/remoteproc/qcom_q6v5_pas.c | 19 + + drivers/remoteproc/st_remoteproc.c | 16 +- + drivers/remoteproc/stm32_rproc.c | 4 +- + drivers/remoteproc/xlnx_r5_remoteproc.c | 112 ++--- + drivers/rpmsg/rpmsg_core.c | 2 +- + drivers/rpmsg/rpmsg_ns.c | 2 +- + drivers/rpmsg/virtio_rpmsg_bus.c | 6 +- + 20 files changed, 938 insertions(+), 255 deletions(-) + create mode 100644 Documentation/devicetree/bindings/remoteproc/qcom,sm6375-pas.yaml +Merging gpio/for-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git gpio/for-next +Already up to date. +Merging gpio-brgl/gpio/for-next (9bc633117d6a hte: tegra194: add GPIOLIB dependency) +$ git merge -m Merge branch 'gpio/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git gpio-brgl/gpio/for-next +Auto-merging MAINTAINERS +Auto-merging arch/arm/mach-omap1/board-ams-delta.c +Auto-merging drivers/gpio/Kconfig +Auto-merging drivers/gpio/gpio-ljca.c +CONFLICT (content): Merge conflict in drivers/gpio/gpio-ljca.c +Auto-merging drivers/gpio/gpio-sim.c +Auto-merging drivers/gpio/gpio-tb10x.c +Auto-merging drivers/gpio/gpio-vf610.c +CONFLICT (content): Merge conflict in drivers/gpio/gpio-vf610.c +Auto-merging drivers/gpio/gpiolib-acpi.c +Auto-merging drivers/gpio/gpiolib-of.c +Auto-merging drivers/i2c/muxes/i2c-mux-gpio.c +Auto-merging drivers/mtd/nand/raw/ingenic/ingenic_nand_drv.c +Resolved 'drivers/gpio/gpio-ljca.c' using previous resolution. +Resolved 'drivers/gpio/gpio-vf610.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master 3faaff9e9aa8] Merge branch 'gpio/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git +$ git diff -M --stat --summary HEAD^.. + .../devicetree/bindings/gpio/fsl-imx-gpio.yaml | 8 + + .../devicetree/bindings/gpio/gpio-vf610.yaml | 40 ++- + .../devicetree/bindings/gpio/intel,ixp4xx-gpio.txt | 38 --- + .../bindings/gpio/intel,ixp4xx-gpio.yaml | 73 +++++ + .../devicetree/bindings/gpio/loongson,ls-gpio.yaml | 21 +- + Documentation/driver-api/gpio/consumer.rst | 4 + + MAINTAINERS | 2 +- + arch/arm/mach-omap1/board-ams-delta.c | 36 ++- + arch/arm/mach-omap1/board-palmte.c | 5 - + drivers/gpio/Kconfig | 4 +- + drivers/gpio/gpio-altera.c | 6 +- + drivers/gpio/gpio-amdpt.c | 6 +- + drivers/gpio/gpio-brcmstb.c | 6 +- + drivers/gpio/gpio-cadence.c | 6 +- + drivers/gpio/gpio-davinci.c | 9 +- + drivers/gpio/gpio-dln2.c | 6 +- + drivers/gpio/gpio-dwapb.c | 1 - + drivers/gpio/gpio-eic-sprd.c | 73 +++-- + drivers/gpio/gpio-f7188x.c | 138 ++++----- + drivers/gpio/gpio-ftgpio010.c | 6 +- + drivers/gpio/gpio-fxl6408.c | 2 +- + drivers/gpio/gpio-grgpio.c | 6 +- + drivers/gpio/gpio-hisi.c | 2 +- + drivers/gpio/gpio-loongson-64bit.c | 119 +++++++- + drivers/gpio/gpio-lpc18xx.c | 6 +- + drivers/gpio/gpio-mb86s7x.c | 7 +- + drivers/gpio/gpio-mm-lantiq.c | 6 +- + drivers/gpio/gpio-mmio.c | 4 +- + drivers/gpio/gpio-mockup.c | 88 +++--- + drivers/gpio/gpio-mpc5200.c | 8 +- + drivers/gpio/gpio-mpc8xxx.c | 6 +- + drivers/gpio/gpio-mvebu.c | 10 +- + drivers/gpio/gpio-omap.c | 9 +- + drivers/gpio/gpio-pca953x.c | 307 +++++++++------------ + drivers/gpio/gpio-rcar.c | 5 +- + drivers/gpio/gpio-rockchip.c | 6 +- + drivers/gpio/gpio-sim.c | 76 +++-- + drivers/gpio/gpio-tb10x.c | 6 +- + drivers/gpio/gpio-ts5500.c | 6 +- + drivers/gpio/gpio-uniphier.c | 6 +- + drivers/gpio/gpio-vf610.c | 56 +++- + drivers/gpio/gpio-xgene-sb.c | 7 +- + drivers/gpio/gpio-xgs-iproc.c | 6 +- + drivers/gpio/gpio-xilinx.c | 6 +- + drivers/gpio/gpio-zynq.c | 5 +- + drivers/gpio/gpiolib-acpi.c | 40 +-- + drivers/gpio/gpiolib-cdev.c | 4 +- + drivers/gpio/gpiolib-of.c | 86 ++++-- + drivers/gpio/gpiolib-swnode.c | 33 ++- + drivers/gpio/gpiolib-sysfs.c | 2 +- + drivers/gpio/gpiolib.c | 304 ++++++++++++++++---- + drivers/gpio/gpiolib.h | 14 +- + drivers/hte/Kconfig | 1 + + drivers/hte/hte-tegra194.c | 30 +- + drivers/i2c/muxes/i2c-mux-gpio.c | 12 +- + drivers/mtd/nand/raw/ingenic/ingenic_nand_drv.c | 12 - + drivers/pinctrl/pinctrl-da9062.c | 7 +- + include/linux/gpio/consumer.h | 16 -- + include/linux/gpio/driver.h | 47 +++- + include/linux/platform_data/gpio-omap.h | 3 - + include/linux/platform_data/pca953x.h | 13 - + 61 files changed, 1123 insertions(+), 754 deletions(-) + delete mode 100644 Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt + create mode 100644 Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.yaml +Merging gpio-intel/for-next (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git gpio-intel/for-next +Already up to date. +Merging pinctrl/for-next (e2b0bac1aae4 dt-bindings: pinctrl: qcom,sa8775p-tlmm: add missing wakeup-parent) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git pinctrl/for-next +Auto-merging arch/arm/boot/dts/qcom/qcom-msm8226.dtsi +Auto-merging drivers/pinctrl/intel/pinctrl-intel.c +Auto-merging drivers/pinctrl/nuvoton/pinctrl-wpcm450.c +Auto-merging drivers/pinctrl/qcom/pinctrl-lpass-lpi.c +Auto-merging drivers/pinctrl/tegra/pinctrl-tegra.c +Auto-merging include/linux/string.h +Merge made by the 'ort' strategy. + .../bindings/mfd/brcm,bcm63268-gpio-sysctl.yaml | 18 +- + .../bindings/mfd/brcm,bcm6362-gpio-sysctl.yaml | 2 +- + .../bindings/mfd/brcm,bcm6368-gpio-sysctl.yaml | 2 +- + .../bindings/pinctrl/amlogic,meson-pinctrl-a1.yaml | 1 + + .../bindings/pinctrl/brcm,bcm6318-pinctrl.yaml | 5 + + .../bindings/pinctrl/brcm,bcm63268-pinctrl.yaml | 25 +- + .../bindings/pinctrl/brcm,bcm6328-pinctrl.yaml | 5 + + .../bindings/pinctrl/brcm,bcm6358-pinctrl.yaml | 5 +- + .../bindings/pinctrl/brcm,bcm6362-pinctrl.yaml | 7 +- + .../bindings/pinctrl/brcm,bcm6368-pinctrl.yaml | 7 +- + .../bindings/pinctrl/nuvoton,npcm845-pinctrl.yaml | 217 ++ + .../bindings/pinctrl/qcom,mdm9607-tlmm.yaml | 3 +- + .../bindings/pinctrl/qcom,msm8226-pinctrl.yaml | 4 +- + .../bindings/pinctrl/qcom,sa8775p-tlmm.yaml | 1 + + .../bindings/pinctrl/qcom,sc7280-pinctrl.yaml | 4 + + .../bindings/pinctrl/realtek,rtd1315e-pinctrl.yaml | 188 ++ + .../bindings/pinctrl/realtek,rtd1319d-pinctrl.yaml | 187 ++ + .../bindings/pinctrl/realtek,rtd1619b-pinctrl.yaml | 186 ++ + .../bindings/pinctrl/renesas,rzg2l-pinctrl.yaml | 21 + + .../bindings/pinctrl/renesas,rzv2m-pinctrl.yaml | 1 + + .../bindings/pinctrl/rockchip,pinctrl.yaml | 2 + + .../bindings/pinctrl/st,stm32-pinctrl.yaml | 3 +- + arch/arm/boot/dts/qcom/qcom-msm8226.dtsi | 33 + + drivers/pinctrl/Kconfig | 1 + + drivers/pinctrl/Makefile | 1 + + drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c | 19 +- + drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c | 19 +- + drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c | 7 +- + drivers/pinctrl/berlin/berlin.c | 8 +- + drivers/pinctrl/cirrus/pinctrl-madera-core.c | 6 +- + drivers/pinctrl/core.c | 6 +- + drivers/pinctrl/freescale/pinctrl-mxs.c | 13 +- + drivers/pinctrl/intel/pinctrl-baytrail.c | 21 +- + drivers/pinctrl/intel/pinctrl-broxton.c | 3 +- + drivers/pinctrl/intel/pinctrl-cherryview.c | 157 +- + drivers/pinctrl/intel/pinctrl-denverton.c | 7 + + drivers/pinctrl/intel/pinctrl-intel.c | 198 +- + drivers/pinctrl/intel/pinctrl-intel.h | 2 +- + drivers/pinctrl/intel/pinctrl-lynxpoint.c | 34 +- + drivers/pinctrl/intel/pinctrl-merrifield.c | 2 +- + drivers/pinctrl/intel/pinctrl-moorefield.c | 2 +- + drivers/pinctrl/mediatek/pinctrl-moore.c | 9 +- + drivers/pinctrl/mediatek/pinctrl-mt7981.c | 16 +- + drivers/pinctrl/mediatek/pinctrl-paris.c | 4 +- + drivers/pinctrl/meson/Kconfig | 6 + + drivers/pinctrl/meson/Makefile | 1 + + drivers/pinctrl/meson/pinctrl-amlogic-t7.c | 1611 +++++++++++++ + drivers/pinctrl/nomadik/pinctrl-abx500.c | 5 +- + drivers/pinctrl/nuvoton/Kconfig | 17 +- + drivers/pinctrl/nuvoton/Makefile | 1 + + drivers/pinctrl/nuvoton/pinctrl-npcm7xx.c | 15 +- + drivers/pinctrl/nuvoton/pinctrl-npcm8xx.c | 2491 ++++++++++++++++++++ + drivers/pinctrl/nuvoton/pinctrl-wpcm450.c | 12 +- + drivers/pinctrl/pinconf-generic.c | 20 +- + drivers/pinctrl/pinconf.c | 14 +- + drivers/pinctrl/pinctrl-amd.c | 6 +- + drivers/pinctrl/pinctrl-artpec6.c | 6 +- + drivers/pinctrl/pinctrl-as3722.c | 5 +- + drivers/pinctrl/pinctrl-cy8c95x0.c | 4 +- + drivers/pinctrl/pinctrl-mcp23s08.h | 8 + + drivers/pinctrl/pinctrl-mcp23s08_i2c.c | 93 +- + drivers/pinctrl/pinctrl-mcp23s08_spi.c | 97 +- + drivers/pinctrl/pinctrl-rockchip.c | 6 +- + drivers/pinctrl/pinctrl-single.c | 21 +- + drivers/pinctrl/pinctrl-stmfx.c | 16 +- + drivers/pinctrl/pinctrl-sx150x.c | 7 +- + drivers/pinctrl/pinctrl-tb10x.c | 6 +- + drivers/pinctrl/pinctrl-utils.c | 6 +- + drivers/pinctrl/pinmux.c | 6 +- + drivers/pinctrl/qcom/pinctrl-apq8064.c | 2 +- + drivers/pinctrl/qcom/pinctrl-apq8084.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ipq4019.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ipq5018.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ipq5332.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ipq6018.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ipq8064.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ipq8074.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ipq9574.c | 2 +- + drivers/pinctrl/qcom/pinctrl-lpass-lpi.c | 4 +- + drivers/pinctrl/qcom/pinctrl-lpass-lpi.h | 2 +- + drivers/pinctrl/qcom/pinctrl-mdm9607.c | 2 +- + drivers/pinctrl/qcom/pinctrl-mdm9615.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm.c | 4 +- + drivers/pinctrl/qcom/pinctrl-msm.h | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8226.c | 22 +- + drivers/pinctrl/qcom/pinctrl-msm8660.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8909.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8916.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8953.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8960.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8976.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8994.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8996.c | 16 +- + drivers/pinctrl/qcom/pinctrl-msm8998.c | 2 +- + drivers/pinctrl/qcom/pinctrl-msm8x74.c | 14 +- + drivers/pinctrl/qcom/pinctrl-qcm2290.c | 2 +- + drivers/pinctrl/qcom/pinctrl-qcs404.c | 2 +- + drivers/pinctrl/qcom/pinctrl-qdf2xxx.c | 2 +- + drivers/pinctrl/qcom/pinctrl-qdu1000.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sa8775p.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sc7180.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sc7280-lpass-lpi.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sc7280.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sc8180x.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sc8280xp-lpass-lpi.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sc8280xp.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sdm660.c | 16 +- + drivers/pinctrl/qcom/pinctrl-sdm670.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sdm845.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sdx55.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sdx65.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sdx75.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm6115-lpass-lpi.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm6115.c | 14 +- + drivers/pinctrl/qcom/pinctrl-sm6125.c | 19 +- + drivers/pinctrl/qcom/pinctrl-sm6350.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm6375.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm7150.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8150.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8250-lpass-lpi.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8250.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8350-lpass-lpi.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8350.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8450-lpass-lpi.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8450.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8550-lpass-lpi.c | 2 +- + drivers/pinctrl/qcom/pinctrl-sm8550.c | 2 +- + drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 5 +- + drivers/pinctrl/qcom/pinctrl-spmi-mpp.c | 5 +- + drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | 6 +- + drivers/pinctrl/qcom/pinctrl-ssbi-mpp.c | 6 +- + drivers/pinctrl/realtek/Kconfig | 23 + + drivers/pinctrl/realtek/Makefile | 6 + + drivers/pinctrl/realtek/pinctrl-rtd.c | 596 +++++ + drivers/pinctrl/realtek/pinctrl-rtd.h | 124 + + drivers/pinctrl/realtek/pinctrl-rtd1315e.c | 1440 +++++++++++ + drivers/pinctrl/realtek/pinctrl-rtd1319d.c | 1610 +++++++++++++ + drivers/pinctrl/realtek/pinctrl-rtd1619b.c | 1601 +++++++++++++ + drivers/pinctrl/renesas/pfc-r8a7778.c | 38 + + drivers/pinctrl/renesas/pfc-r8a7779.c | 2 +- + drivers/pinctrl/renesas/pinctrl-rzg2l.c | 717 ++++-- + drivers/pinctrl/renesas/pinctrl-rzn1.c | 6 +- + drivers/pinctrl/samsung/pinctrl-exynos.c | 2 +- + drivers/pinctrl/samsung/pinctrl-exynos.h | 2 +- + drivers/pinctrl/samsung/pinctrl-samsung.c | 56 +- + drivers/pinctrl/samsung/pinctrl-samsung.h | 4 +- + drivers/pinctrl/sprd/pinctrl-sprd-sc9860.c | 2 +- + drivers/pinctrl/sprd/pinctrl-sprd.c | 3 +- + drivers/pinctrl/sprd/pinctrl-sprd.h | 2 +- + drivers/pinctrl/sunxi/pinctrl-sun50i-h616.c | 380 ++- + drivers/pinctrl/tegra/pinctrl-tegra.c | 8 +- + drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 11 +- + drivers/pinctrl/uniphier/pinctrl-uniphier-core.c | 2 +- + .../dt-bindings/gpio/amlogic,t7-periphs-pinctrl.h | 179 ++ + include/linux/array_size.h | 13 + + include/linux/kernel.h | 7 +- + include/linux/pinctrl/machine.h | 2 +- + include/linux/string.h | 1 + + 158 files changed, 12163 insertions(+), 847 deletions(-) + create mode 100644 Documentation/devicetree/bindings/pinctrl/nuvoton,npcm845-pinctrl.yaml + create mode 100644 Documentation/devicetree/bindings/pinctrl/realtek,rtd1315e-pinctrl.yaml + create mode 100644 Documentation/devicetree/bindings/pinctrl/realtek,rtd1319d-pinctrl.yaml + create mode 100644 Documentation/devicetree/bindings/pinctrl/realtek,rtd1619b-pinctrl.yaml + create mode 100644 drivers/pinctrl/meson/pinctrl-amlogic-t7.c + create mode 100644 drivers/pinctrl/nuvoton/pinctrl-npcm8xx.c + create mode 100644 drivers/pinctrl/realtek/Kconfig + create mode 100644 drivers/pinctrl/realtek/Makefile + create mode 100644 drivers/pinctrl/realtek/pinctrl-rtd.c + create mode 100644 drivers/pinctrl/realtek/pinctrl-rtd.h + create mode 100644 drivers/pinctrl/realtek/pinctrl-rtd1315e.c + create mode 100644 drivers/pinctrl/realtek/pinctrl-rtd1319d.c + create mode 100644 drivers/pinctrl/realtek/pinctrl-rtd1619b.c + create mode 100644 include/dt-bindings/gpio/amlogic,t7-periphs-pinctrl.h + create mode 100644 include/linux/array_size.h +Merging pinctrl-intel/for-next (8d751da9f1d7 pinctrl: intel: fetch community only when we need it) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/intel.git pinctrl-intel/for-next +Already up to date. +Merging pinctrl-renesas/renesas-pinctrl (583d80732055 pinctrl: renesas: rzn1: Convert to platform remove callback returning void) +$ git merge -m Merge branch 'renesas-pinctrl' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git pinctrl-renesas/renesas-pinctrl +Already up to date. +Merging pinctrl-samsung/for-next (8aec97decfd0 pinctrl: samsung: do not offset pinctrl numberspaces) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung.git pinctrl-samsung/for-next +Already up to date. +Merging pwm/for-next (4bb36d126cb3 pwm: samsung: Document new member .channel in struct samsung_pwm_chip) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm.git pwm/for-next +Auto-merging drivers/gpio/gpio-mvebu.c +Auto-merging drivers/gpu/drm/bridge/ti-sn65dsi86.c +Auto-merging drivers/leds/rgb/leds-qcom-lpg.c +Merge made by the 'ort' strategy. + Documentation/devicetree/bindings/pwm/mxs-pwm.yaml | 13 +- + drivers/gpio/gpio-mvebu.c | 1 - + drivers/gpu/drm/bridge/ti-sn65dsi86.c | 1 - + drivers/leds/rgb/leds-qcom-lpg.c | 1 - + drivers/pwm/Kconfig | 20 ++- + drivers/pwm/Makefile | 1 + + drivers/pwm/core.c | 55 ++---- + drivers/pwm/pwm-ab8500.c | 1 - + drivers/pwm/pwm-apple.c | 1 - + drivers/pwm/pwm-atmel-hlcdc.c | 1 - + drivers/pwm/pwm-atmel-tcb.c | 1 - + drivers/pwm/pwm-atmel.c | 3 +- + drivers/pwm/pwm-bcm-iproc.c | 38 +--- + drivers/pwm/pwm-bcm-kona.c | 1 - + drivers/pwm/pwm-bcm2835.c | 38 ++-- + drivers/pwm/pwm-berlin.c | 63 ++----- + drivers/pwm/pwm-brcmstb.c | 49 ++--- + drivers/pwm/pwm-clk.c | 1 - + drivers/pwm/pwm-clps711x.c | 1 - + drivers/pwm/pwm-crc.c | 5 +- + drivers/pwm/pwm-cros-ec.c | 67 ++----- + drivers/pwm/pwm-dwc-core.c | 184 +++++++++++++++++++ + drivers/pwm/pwm-dwc.c | 197 +-------------------- + drivers/pwm/pwm-dwc.h | 60 +++++++ + drivers/pwm/pwm-ep93xx.c | 1 - + drivers/pwm/pwm-fsl-ftm.c | 1 - + drivers/pwm/pwm-hibvt.c | 1 - + drivers/pwm/pwm-img.c | 1 - + drivers/pwm/pwm-imx-tpm.c | 30 +--- + drivers/pwm/pwm-imx1.c | 1 - + drivers/pwm/pwm-imx27.c | 1 - + drivers/pwm/pwm-intel-lgm.c | 1 - + drivers/pwm/pwm-iqs620a.c | 1 - + drivers/pwm/pwm-jz4740.c | 46 ++--- + drivers/pwm/pwm-keembay.c | 1 - + drivers/pwm/pwm-lp3943.c | 22 +-- + drivers/pwm/pwm-lpc18xx-sct.c | 1 - + drivers/pwm/pwm-lpc32xx.c | 1 - + drivers/pwm/pwm-lpss.c | 1 - + drivers/pwm/pwm-mediatek.c | 1 - + drivers/pwm/pwm-meson.c | 1 - + drivers/pwm/pwm-microchip-core.c | 1 - + drivers/pwm/pwm-mtk-disp.c | 25 +-- + drivers/pwm/pwm-mxs.c | 1 - + drivers/pwm/pwm-ntxec.c | 1 - + drivers/pwm/pwm-omap-dmtimer.c | 3 +- + drivers/pwm/pwm-pca9685.c | 1 - + drivers/pwm/pwm-pxa.c | 3 +- + drivers/pwm/pwm-raspberrypi-poe.c | 1 - + drivers/pwm/pwm-rcar.c | 1 - + drivers/pwm/pwm-renesas-tpu.c | 23 ++- + drivers/pwm/pwm-rockchip.c | 1 - + drivers/pwm/pwm-rz-mtu3.c | 1 - + drivers/pwm/pwm-samsung.c | 152 ++++++++-------- + drivers/pwm/pwm-sifive.c | 1 - + drivers/pwm/pwm-sl28cpld.c | 1 - + drivers/pwm/pwm-spear.c | 41 ++--- + drivers/pwm/pwm-sprd.c | 29 ++- + drivers/pwm/pwm-sti.c | 30 ++-- + drivers/pwm/pwm-stm32-lp.c | 1 - + drivers/pwm/pwm-stm32.c | 1 - + drivers/pwm/pwm-stmpe.c | 1 - + drivers/pwm/pwm-sun4i.c | 1 - + drivers/pwm/pwm-sunplus.c | 1 - + drivers/pwm/pwm-tegra.c | 1 - + drivers/pwm/pwm-tiecap.c | 1 - + drivers/pwm/pwm-tiehrpwm.c | 1 - + drivers/pwm/pwm-twl-led.c | 2 - + drivers/pwm/pwm-twl.c | 2 - + drivers/pwm/pwm-visconti.c | 1 - + drivers/pwm/pwm-vt8500.c | 43 +---- + drivers/pwm/pwm-xilinx.c | 1 - + drivers/staging/greybus/pwm.c | 1 - + include/linux/pwm.h | 24 +-- + 74 files changed, 537 insertions(+), 776 deletions(-) + create mode 100644 drivers/pwm/pwm-dwc-core.c + create mode 100644 drivers/pwm/pwm-dwc.h +Merging userns/for-next (05bd6e0242b4 Merge of unpriv-ipc-sysctls-for-v6.2, and fix-atomic_lock_inc_below-for-v6.2 for testing in linux-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace.git userns/for-next +Auto-merging Documentation/admin-guide/sysctl/kernel.rst +Auto-merging ipc/ipc_sysctl.c +Auto-merging ipc/mq_sysctl.c +Auto-merging kernel/ucount.c +Merge made by the 'ort' strategy. + Documentation/admin-guide/sysctl/kernel.rst | 14 ++++++++--- + ipc/ipc_sysctl.c | 37 +++++++++++++++++++++++++++-- + ipc/mq_sysctl.c | 36 ++++++++++++++++++++++++++++ + kernel/ucount.c | 16 ++++++------- + 4 files changed, 89 insertions(+), 14 deletions(-) +Merging ktest/for-next (7dc8e24f0e09 ktest: Restore stty setting at first in dodie) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest.git ktest/for-next +Already up to date. +Merging kselftest/next (5247e6dbed00 selftests/resctrl: Fix MBM test failure when MBA unavailable) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git kselftest/next +Auto-merging Makefile +Auto-merging tools/testing/selftests/clone3/clone3.c +CONFLICT (content): Merge conflict in tools/testing/selftests/clone3/clone3.c +Auto-merging tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_char.tc +Auto-merging tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_string.tc +Auto-merging tools/testing/selftests/kvm/include/test_util.h +Auto-merging tools/testing/selftests/mm/mremap_test.c +Resolved 'tools/testing/selftests/clone3/clone3.c' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master 1216ad2e7561] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git +$ git diff -M --stat --summary HEAD^.. + Documentation/dev-tools/kselftest.rst | 6 +- + Makefile | 4 +- + .../x86/amd_pstate_tracer/amd_pstate_trace.py | 3 +- + tools/testing/selftests/amd-pstate/gitsource.sh | 17 +- + tools/testing/selftests/amd-pstate/run.sh | 21 +- + tools/testing/selftests/amd-pstate/tbench.sh | 4 +- + tools/testing/selftests/cachestat/test_cachestat.c | 2 +- + tools/testing/selftests/capabilities/Makefile | 2 +- + tools/testing/selftests/capabilities/test_execve.c | 8 - + .../testing/selftests/capabilities/validate_cap.c | 8 - + tools/testing/selftests/clone3/clone3.c | 272 +++++++++++++++------ + .../clone3/clone3_cap_checkpoint_restore.c | 2 - + .../selftests/clone3/clone3_clear_sighand.c | 4 - + tools/testing/selftests/clone3/clone3_selftests.h | 13 - + tools/testing/selftests/clone3/clone3_set_tid.c | 2 - + tools/testing/selftests/core/close_range_test.c | 28 --- + tools/testing/selftests/damon/debugfs_attrs.sh | 0 + .../damon/debugfs_duplicate_context_creation.sh | 0 + .../selftests/damon/debugfs_empty_targets.sh | 0 + .../damon/debugfs_huge_count_read_write.sh | 0 + .../selftests/damon/debugfs_rm_non_contexts.sh | 0 + tools/testing/selftests/damon/debugfs_schemes.sh | 0 + .../testing/selftests/damon/debugfs_target_ids.sh | 0 + tools/testing/selftests/damon/lru_sort.sh | 0 + tools/testing/selftests/damon/reclaim.sh | 0 + tools/testing/selftests/damon/sysfs.sh | 0 + .../damon/sysfs_update_removed_scheme_dir.sh | 0 + tools/testing/selftests/dmabuf-heaps/.gitignore | 1 + + tools/testing/selftests/efivarfs/create-read.c | 2 + + tools/testing/selftests/exec/execveat.c | 87 ++++--- + tools/testing/selftests/firmware/fw_namespace.c | 4 - + .../ftrace/test.d/kprobe/kprobe_args_char.tc | 6 + + .../ftrace/test.d/kprobe/kprobe_args_string.tc | 3 + + .../ftrace/test.d/kprobe/kprobe_args_syntax.tc | 4 + + tools/testing/selftests/kselftest.h | 46 ++-- + tools/testing/selftests/kvm/include/test_util.h | 8 +- + tools/testing/selftests/mm/mremap_test.c | 2 +- + tools/testing/selftests/mm/pkey-helpers.h | 2 +- + tools/testing/selftests/openat2/openat2_test.c | 2 +- + tools/testing/selftests/pidfd/pidfd_fdinfo_test.c | 2 +- + tools/testing/selftests/pidfd/pidfd_test.c | 12 +- + tools/testing/selftests/resctrl/Makefile | 2 +- + tools/testing/selftests/resctrl/cache.c | 7 +- + tools/testing/selftests/resctrl/cat_test.c | 21 +- + tools/testing/selftests/resctrl/cmt_test.c | 37 ++- + tools/testing/selftests/resctrl/mba_test.c | 6 +- + tools/testing/selftests/resctrl/mbm_test.c | 11 +- + tools/testing/selftests/resctrl/resctrl.h | 24 +- + tools/testing/selftests/resctrl/resctrl_tests.c | 182 ++++++++------ + tools/testing/selftests/resctrl/resctrl_val.c | 86 +++++-- + tools/testing/selftests/resctrl/resctrlfs.c | 158 ++++-------- + tools/testing/selftests/rseq/param_test.c | 20 +- + tools/testing/selftests/sigaltstack/sas.c | 2 +- + .../selftests/static_keys/test_static_keys.sh | 8 +- + tools/testing/selftests/tdx/.gitignore | 1 + + tools/testing/selftests/timers/nsleep-lat.c | 26 +- + tools/testing/selftests/timers/posix_timers.c | 81 +++--- + tools/testing/selftests/uevent/uevent_filtering.c | 8 +- + tools/testing/selftests/user_events/.gitignore | 4 + + 59 files changed, 697 insertions(+), 564 deletions(-) + mode change 100644 => 100755 tools/testing/selftests/damon/debugfs_attrs.sh + mode change 100644 => 100755 tools/testing/selftests/damon/debugfs_duplicate_context_creation.sh + mode change 100644 => 100755 tools/testing/selftests/damon/debugfs_empty_targets.sh + mode change 100644 => 100755 tools/testing/selftests/damon/debugfs_huge_count_read_write.sh + mode change 100644 => 100755 tools/testing/selftests/damon/debugfs_rm_non_contexts.sh + mode change 100644 => 100755 tools/testing/selftests/damon/debugfs_schemes.sh + mode change 100644 => 100755 tools/testing/selftests/damon/debugfs_target_ids.sh + mode change 100644 => 100755 tools/testing/selftests/damon/lru_sort.sh + mode change 100644 => 100755 tools/testing/selftests/damon/reclaim.sh + mode change 100644 => 100755 tools/testing/selftests/damon/sysfs.sh + mode change 100644 => 100755 tools/testing/selftests/damon/sysfs_update_removed_scheme_dir.sh + create mode 100644 tools/testing/selftests/dmabuf-heaps/.gitignore + create mode 100644 tools/testing/selftests/tdx/.gitignore + create mode 100644 tools/testing/selftests/user_events/.gitignore +Merging kunit/test (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'test' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git kunit/test +Already up to date. +Merging kunit-next/kunit (8040345fdae4 kunit: test: Fix the possible memory leak in executor_test) +$ git merge -m Merge branch 'kunit' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git kunit-next/kunit +Merge made by the 'ort' strategy. + include/kunit/test.h | 14 +- + lib/kunit/assert.c | 14 +- + lib/kunit/debugfs.c | 36 ++- + lib/kunit/executor.c | 23 +- + lib/kunit/executor_test.c | 36 +-- + lib/kunit/kunit-example-test.c | 5 +- + lib/kunit/kunit-test.c | 56 ++++- + lib/kunit/string-stream-test.c | 525 +++++++++++++++++++++++++++++++++++++++-- + lib/kunit/string-stream.c | 100 ++++++-- + lib/kunit/string-stream.h | 16 +- + lib/kunit/test.c | 56 +---- + 11 files changed, 734 insertions(+), 147 deletions(-) +Merging livepatching/for-next (602bf1830798 Merge branch 'for-6.7' into for-next) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching livepatching/for-next +Merge made by the 'ort' strategy. + kernel/livepatch/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +Merging rtc/rtc-next (cfb67623ce28 dt-bindings: rtc: Add Mstar SSD202D RTC) +$ git merge -m Merge branch 'rtc-next' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git rtc/rtc-next +Merge made by the 'ort' strategy. + .../devicetree/bindings/rtc/cirrus,ep9301-rtc.yaml | 42 ++++ + .../devicetree/bindings/rtc/epson,rtc7301.txt | 16 -- + .../devicetree/bindings/rtc/epson,rtc7301.yaml | 51 +++++ + .../devicetree/bindings/rtc/maxim,mcp795.txt | 11 - + .../bindings/rtc/microcrystal,rv3032.yaml | 2 + + .../devicetree/bindings/rtc/mstar,ssd202d-rtc.yaml | 35 +++ + .../devicetree/bindings/rtc/nxp,pcf2123.yaml | 47 ++++ + .../devicetree/bindings/rtc/nxp,pcf8523.txt | 18 -- + .../devicetree/bindings/rtc/nxp,pcf8523.yaml | 45 ++++ + .../devicetree/bindings/rtc/nxp,rtc-2123.txt | 17 -- + .../devicetree/bindings/rtc/trivial-rtc.yaml | 2 + + drivers/rtc/Kconfig | 13 +- + drivers/rtc/Makefile | 1 + + drivers/rtc/rtc-at91rm9200.c | 14 +- + drivers/rtc/rtc-brcmstb-waketimer.c | 47 +++- + drivers/rtc/rtc-efi.c | 2 +- + drivers/rtc/rtc-ep93xx.c | 8 + + drivers/rtc/rtc-imxdi.c | 14 +- + drivers/rtc/rtc-mv.c | 14 +- + drivers/rtc/rtc-omap.c | 8 +- + drivers/rtc/rtc-pcap.c | 6 - + drivers/rtc/rtc-pcf85363.c | 2 +- + drivers/rtc/rtc-pxa.c | 13 +- + drivers/rtc/rtc-r7301.c | 35 ++- + drivers/rtc/rtc-sh.c | 16 +- + drivers/rtc/rtc-ssd202d.c | 249 +++++++++++++++++++++ + 26 files changed, 620 insertions(+), 108 deletions(-) + create mode 100644 Documentation/devicetree/bindings/rtc/cirrus,ep9301-rtc.yaml + delete mode 100644 Documentation/devicetree/bindings/rtc/epson,rtc7301.txt + create mode 100644 Documentation/devicetree/bindings/rtc/epson,rtc7301.yaml + delete mode 100644 Documentation/devicetree/bindings/rtc/maxim,mcp795.txt + create mode 100644 Documentation/devicetree/bindings/rtc/mstar,ssd202d-rtc.yaml + create mode 100644 Documentation/devicetree/bindings/rtc/nxp,pcf2123.yaml + delete mode 100644 Documentation/devicetree/bindings/rtc/nxp,pcf8523.txt + create mode 100644 Documentation/devicetree/bindings/rtc/nxp,pcf8523.yaml + delete mode 100644 Documentation/devicetree/bindings/rtc/nxp,rtc-2123.txt + create mode 100644 drivers/rtc/rtc-ssd202d.c +Merging nvdimm/libnvdimm-for-next (9ea459e477dc libnvdimm: remove kernel-doc warnings:) +$ git merge -m Merge branch 'libnvdimm-for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm.git nvdimm/libnvdimm-for-next +Merge made by the 'ort' strategy. + drivers/dax/bus.c | 2 +- + drivers/nvdimm/badrange.c | 4 ++-- + drivers/nvdimm/nd.h | 2 +- + drivers/nvdimm/of_pmem.c | 8 +++++++- + drivers/nvdimm/region_devs.c | 10 +++++----- + tools/testing/nvdimm/test/ndtest.c | 17 +++++++++-------- + tools/testing/nvdimm/test/nfit.c | 14 +++++++------- + 7 files changed, 32 insertions(+), 25 deletions(-) +Merging at24/at24/for-next (3774740fb221 eeprom: at24: add ST M24C64-D Additional Write lockable page support) +$ git merge -m Merge branch 'at24/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git at24/at24/for-next +Already up to date. +Merging ntb/ntb-next (9341b37ec17a ntb_perf: Fix printk format) +$ git merge -m Merge branch 'ntb-next' of https://github.com/jonmason/ntb.git ntb/ntb-next +Merge made by the 'ort' strategy. + drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +- + drivers/ntb/test/ntb_perf.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) +Merging seccomp/for-next/seccomp (31c65705a8cf perf/benchmark: fix seccomp_unotify benchmark for 32-bit) +$ git merge -m Merge branch 'for-next/seccomp' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git seccomp/for-next/seccomp +Already up to date. +Merging fsi/next (f04d61a379d6 fsi: fix some spelling mistakes in comment) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi.git fsi/next +Already up to date. +Merging slimbus/for-next (06c2afb862f9 Linux 6.5-rc1) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/srini/slimbus.git slimbus/for-next +Already up to date. +Merging nvmem/for-next (ca7384334d9b Revert "nvmem: add new config option") + ca7384334d9b ("Revert "nvmem: add new config option"") +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git nvmem/for-next +Auto-merging drivers/mtd/mtdcore.c +Auto-merging drivers/nvmem/core.c +Auto-merging include/linux/nvmem-provider.h +Merge made by the 'ort' strategy. +Merging xarray/main (2a15de80dd0f idr: fix param name in idr_alloc_cyclic() doc) +$ git merge -m Merge branch 'main' of git://git.infradead.org/users/willy/xarray.git xarray/main +Already up to date. +Merging hyperv/hyperv-next (ce9ecca0238b Linux 6.6-rc2) +$ git merge -m Merge branch 'hyperv-next' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git hyperv/hyperv-next +Already up to date. +Merging auxdisplay/auxdisplay (35b464e32c8b auxdisplay: hd44780: move cursor home after clear display command) +$ git merge -m Merge branch 'auxdisplay' of https://github.com/ojeda/linux.git auxdisplay/auxdisplay +Already up to date. +Merging kgdb/kgdb/for-next (dd712d3d4580 kgdb: Flush console before entering kgdb on panic) +$ git merge -m Merge branch 'kgdb/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux.git kgdb/kgdb/for-next +Merge made by the 'ort' strategy. + kernel/debug/debug_core.c | 3 +++ + 1 file changed, 3 insertions(+) +Merging hmm/hmm (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'hmm' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git hmm/hmm +Already up to date. +Merging cfi/cfi/next (06c2afb862f9 Linux 6.5-rc1) +$ git merge -m Merge branch 'cfi/next' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git cfi/cfi/next +Already up to date. +Merging mhi/mhi-next (12606ba1d46b bus: mhi: ep: Do not allocate event ring element on stack) +$ git merge -m Merge branch 'mhi-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mani/mhi.git mhi/mhi-next +Merge made by the 'ort' strategy. + drivers/bus/mhi/ep/main.c | 68 ++++++++++++++++++++++++++++++++++------------- + 1 file changed, 50 insertions(+), 18 deletions(-) +Merging memblock/for-next (0f5e4adb608c memblock: report failures when memblock_can_resize is not set) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock.git memblock/for-next +Auto-merging mm/memblock.c +Merge made by the 'ort' strategy. + mm/memblock.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +Merging cxl/next (2630b3957abe Merge branch 'for-6.7/cxl-committed' into cxl/next) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git cxl/next +Auto-merging MAINTAINERS +Auto-merging drivers/acpi/Kconfig +Auto-merging drivers/pci/pcie/aer.c +CONFLICT (content): Merge conflict in drivers/pci/pcie/aer.c +Auto-merging include/linux/acpi.h +Auto-merging lib/Kconfig +Auto-merging lib/Makefile +Recorded preimage for 'drivers/pci/pcie/aer.c' +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +Recorded resolution for 'drivers/pci/pcie/aer.c'. +[master 57d37443ab78] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git +$ git diff -M --stat --summary HEAD^.. + Documentation/ABI/testing/sysfs-bus-cxl | 30 ++++ + MAINTAINERS | 3 + + drivers/acpi/Kconfig | 1 + + drivers/acpi/tables.c | 173 -------------------- + drivers/cxl/acpi.c | 3 + + drivers/cxl/core/core.h | 1 + + drivers/cxl/core/hdm.c | 55 +++---- + drivers/cxl/core/mbox.c | 7 +- + drivers/cxl/core/memdev.c | 4 +- + drivers/cxl/core/pci.c | 272 +++++++++++++++++++++++++++++--- + drivers/cxl/core/port.c | 182 +++++++++++++++------ + drivers/cxl/core/region.c | 2 +- + drivers/cxl/core/regs.c | 73 ++++++--- + drivers/cxl/cxl.h | 32 ++-- + drivers/cxl/cxlmem.h | 4 +- + drivers/cxl/mem.c | 7 +- + drivers/cxl/pci.c | 19 +-- + drivers/cxl/port.c | 3 + + drivers/pci/pcie/Kconfig | 9 ++ + drivers/pci/pcie/aer.c | 154 +++++++++++++++++- + include/linux/acpi.h | 42 ++--- + include/linux/aer.h | 2 +- + include/linux/fw_table.h | 43 +++++ + lib/Kconfig | 3 + + lib/Makefile | 2 + + lib/fw_table.c | 189 ++++++++++++++++++++++ + tools/testing/cxl/test/mem.c | 4 +- + 27 files changed, 951 insertions(+), 368 deletions(-) + create mode 100644 include/linux/fw_table.h + create mode 100644 lib/fw_table.c +Merging zstd/zstd-next (2aa14b1ab2c4 zstd: import usptream v1.5.2) +$ git merge -m Merge branch 'zstd-next' of https://github.com/terrelln/linux.git zstd/zstd-next +Already up to date. +Merging efi/next (5329aa5101f7 efivarfs: Add uid/gid mount options) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git efi/next +Auto-merging fs/efivarfs/inode.c +Auto-merging fs/efivarfs/super.c +Merge made by the 'ort' strategy. + fs/efivarfs/inode.c | 4 +++ + fs/efivarfs/internal.h | 9 +++++++ + fs/efivarfs/super.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 81 insertions(+) +Merging unicode/for-next (b500d6d7243d unicode: Handle memory allocation failures in mkutf8data) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/krisman/unicode.git unicode/for-next +Merge made by the 'ort' strategy. + fs/unicode/mkutf8data.c | 38 ++++++++++++++++++++++++-------------- + 1 file changed, 24 insertions(+), 14 deletions(-) +Merging slab/slab/for-next (90f055df1121 mm/slub: refactor calculate_order() and calc_slab_order()) +$ git merge -m Merge branch 'slab/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab.git slab/slab/for-next +Merge made by the 'ort' strategy. + mm/slub.c | 73 +++++++++++++++++++++++++++++++-------------------------------- + 1 file changed, 36 insertions(+), 37 deletions(-) +Merging random/master (512dee0c00ad Merge tag 'x86-urgent-2023-01-04' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip) +$ git merge -m Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git random/master +Already up to date. +Merging landlock/next (f12f8f84509a selftests/landlock: Add tests for FS topology changes with network rules) +$ git merge -m Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/mic/linux.git landlock/next +Auto-merging security/landlock/fs.c +Auto-merging security/landlock/setup.c +Merge made by the 'ort' strategy. + Documentation/userspace-api/landlock.rst | 99 +- + include/uapi/linux/landlock.h | 55 + + samples/landlock/sandboxer.c | 115 +- + security/landlock/Kconfig | 1 + + security/landlock/Makefile | 2 + + security/landlock/fs.c | 232 ++-- + security/landlock/limits.h | 6 + + security/landlock/net.c | 200 +++ + security/landlock/net.h | 33 + + security/landlock/ruleset.c | 405 ++++-- + security/landlock/ruleset.h | 185 ++- + security/landlock/setup.c | 2 + + security/landlock/syscalls.c | 158 ++- + tools/testing/selftests/landlock/base_test.c | 2 +- + tools/testing/selftests/landlock/common.h | 13 + + tools/testing/selftests/landlock/config | 4 + + tools/testing/selftests/landlock/fs_test.c | 69 +- + tools/testing/selftests/landlock/net_test.c | 1738 ++++++++++++++++++++++++++ + 18 files changed, 2967 insertions(+), 352 deletions(-) + create mode 100644 security/landlock/net.c + create mode 100644 security/landlock/net.h + create mode 100644 tools/testing/selftests/landlock/net_test.c +$ git am -3 ../patches/0001-fixup-for-landlock-Support-network-rules-with-TCP-bi.patch +Applying: fixup for "landlock: Support network rules with TCP bind and connect" +$ git reset HEAD^ +Unstaged changes after reset: +M security/landlock/net.c +$ git add -A . +$ git commit -v -a --amend +[master 6b3196c5f625] Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/mic/linux.git + Date: Mon Oct 30 15:04:54 2023 +1100 +Merging rust/rust-next (3857af38e57a docs: rust: add "The Rust experiment" section) +$ git merge -m Merge branch 'rust-next' of https://github.com/Rust-for-Linux/linux.git rust/rust-next +Auto-merging MAINTAINERS +Auto-merging arch/x86/Makefile +Auto-merging rust/Makefile +Auto-merging rust/kernel/sync/arc.rs +Merge made by the 'ort' strategy. + Documentation/process/changes.rst | 2 +- + Documentation/rust/index.rst | 19 ++++ + MAINTAINERS | 3 +- + arch/x86/Makefile | 1 + + rust/Makefile | 8 +- + rust/alloc/alloc.rs | 21 ---- + rust/alloc/boxed.rs | 56 +++++++---- + rust/alloc/lib.rs | 13 +-- + rust/alloc/raw_vec.rs | 30 ++++-- + rust/alloc/vec/drain_filter.rs | 199 -------------------------------------- + rust/alloc/vec/extract_if.rs | 115 ++++++++++++++++++++++ + rust/alloc/vec/mod.rs | 110 ++++++++++----------- + rust/alloc/vec/spec_extend.rs | 8 +- + rust/compiler_builtins.rs | 1 + + rust/kernel/init.rs | 20 ++-- + rust/kernel/print.rs | 1 + + rust/kernel/sync/arc.rs | 2 +- + rust/kernel/sync/condvar.rs | 1 - + rust/kernel/sync/lock.rs | 1 - + rust/kernel/task.rs | 2 +- + scripts/min-tool-version.sh | 2 +- + 21 files changed, 279 insertions(+), 336 deletions(-) + delete mode 100644 rust/alloc/vec/drain_filter.rs + create mode 100644 rust/alloc/vec/extract_if.rs +Merging sysctl/sysctl-next (ccee9a2a8c00 intel drm: Remove now superfluous sentinel element from ctl_table array) +$ git merge -m Merge branch 'sysctl-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git sysctl/sysctl-next +Auto-merging arch/arm64/kernel/fpsimd.c +Auto-merging arch/arm64/kernel/process.c +Auto-merging arch/s390/kernel/topology.c +Auto-merging arch/s390/mm/pgalloc.c +Auto-merging arch/x86/kernel/cpu/intel.c +Auto-merging drivers/char/hpet.c +Auto-merging drivers/gpu/drm/i915/i915_perf.c +Auto-merging drivers/md/md.c +Auto-merging drivers/misc/sgi-xp/xpc_main.c +Auto-merging drivers/parport/procfs.c +Auto-merging drivers/perf/arm_pmuv3.c +Auto-merging drivers/tty/tty_io.c +Merge made by the 'ort' strategy. + arch/arm/kernel/isa.c | 4 ++-- + arch/arm64/kernel/armv8_deprecated.c | 8 +++----- + arch/arm64/kernel/fpsimd.c | 2 -- + arch/arm64/kernel/process.c | 1 - + arch/csky/abiv1/alignment.c | 1 - + arch/powerpc/kernel/idle.c | 1 - + arch/powerpc/platforms/pseries/mobility.c | 1 - + arch/riscv/kernel/vector.c | 1 - + arch/s390/appldata/appldata_base.c | 4 +--- + arch/s390/kernel/debug.c | 1 - + arch/s390/kernel/topology.c | 1 - + arch/s390/mm/cmm.c | 1 - + arch/s390/mm/pgalloc.c | 1 - + arch/x86/entry/vdso/vdso32-setup.c | 1 - + arch/x86/kernel/cpu/intel.c | 1 - + arch/x86/kernel/itmt.c | 1 - + drivers/base/firmware_loader/fallback_table.c | 1 - + drivers/char/hpet.c | 1 - + drivers/char/ipmi/ipmi_poweroff.c | 1 - + drivers/char/random.c | 1 - + drivers/gpu/drm/i915/i915_perf.c | 1 - + drivers/hv/hv_common.c | 1 - + drivers/infiniband/core/iwcm.c | 1 - + drivers/infiniband/core/ucma.c | 1 - + drivers/macintosh/mac_hid.c | 1 - + drivers/md/md.c | 1 - + drivers/misc/sgi-xp/xpc_main.c | 2 -- + drivers/net/vrf.c | 1 - + drivers/parport/procfs.c | 28 +++++++++++---------------- + drivers/perf/arm_pmuv3.c | 1 - + drivers/scsi/scsi_sysctl.c | 1 - + drivers/scsi/sg.c | 1 - + drivers/tty/tty_io.c | 1 - + drivers/xen/balloon.c | 1 - + 34 files changed, 17 insertions(+), 59 deletions(-) +Merging execve/for-next/execve (21ca59b365c0 binfmt_misc: enable sandboxed mounts) +$ git merge -m Merge branch 'for-next/execve' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git execve/for-next/execve +Auto-merging fs/binfmt_elf_fdpic.c +Auto-merging fs/binfmt_misc.c +Auto-merging include/linux/mm.h +Auto-merging kernel/user_namespace.c +Auto-merging mm/mmap.c +Auto-merging mm/nommu.c +Merge made by the 'ort' strategy. + fs/binfmt_elf.c | 215 ++++++++--------------- + fs/binfmt_elf_fdpic.c | 20 ++- + fs/binfmt_misc.c | 386 ++++++++++++++++++++++++++++++++++------- + include/linux/binfmts.h | 10 ++ + include/linux/mm.h | 3 +- + include/linux/user_namespace.h | 8 + + include/uapi/linux/elf.h | 2 +- + kernel/user.c | 13 ++ + kernel/user_namespace.c | 3 + + mm/mmap.c | 6 - + mm/nommu.c | 5 - + 11 files changed, 443 insertions(+), 228 deletions(-) +Merging bitmap/bitmap-for-next (bdcb37a5d8de buildid: reduce header file dependencies for module) +$ git merge -m Merge branch 'bitmap-for-next' of https://github.com/norov/linux.git bitmap/bitmap-for-next +Auto-merging MAINTAINERS +Auto-merging lib/Makefile +Auto-merging lib/cpumask.c +Merge made by the 'ort' strategy. + MAINTAINERS | 2 + + include/linux/bitmap-str.h | 16 ++ + include/linux/bitmap.h | 87 ++++-- + include/linux/buildid.h | 3 +- + include/linux/cpumask.h | 113 +++++--- + lib/Makefile | 2 +- + lib/bitmap-str.c | 510 ++++++++++++++++++++++++++++++++++ + lib/bitmap.c | 680 +-------------------------------------------- + lib/cpumask.c | 17 +- + lib/test_bitmap.c | 24 ++ + 10 files changed, 700 insertions(+), 754 deletions(-) + create mode 100644 include/linux/bitmap-str.h + create mode 100644 lib/bitmap-str.c +Merging hte/for-next (fc62d5e214df hte: Use kasprintf() instead of fixed buffer formatting) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/pateldipen1984/linux.git hte/for-next +Auto-merging drivers/hte/Kconfig +CONFLICT (content): Merge conflict in drivers/hte/Kconfig +Auto-merging drivers/hte/hte-tegra194.c +Resolved 'drivers/hte/Kconfig' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master 95bef89664ce] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/pateldipen1984/linux.git +$ git diff -M --stat --summary HEAD^.. + drivers/hte/Kconfig | 4 ++-- + drivers/hte/hte-tegra194-test.c | 4 +++- + drivers/hte/hte-tegra194.c | 26 +++++++++++++------------- + drivers/hte/hte.c | 15 +++++---------- + 4 files changed, 23 insertions(+), 26 deletions(-) +Merging kspp/for-next/kspp (9cca73d7b4bf hwmon: (acpi_power_meter) replace open-coded kmemdup_nul) +$ git merge -m Merge branch 'for-next/kspp' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git kspp/for-next/kspp +Auto-merging MAINTAINERS +Auto-merging drivers/block/drbd/drbd_int.h +Auto-merging drivers/cpufreq/cpufreq.c +Auto-merging drivers/md/dm-crypt.c +Auto-merging drivers/md/dm-raid.c +Auto-merging drivers/md/dm-stripe.c +Auto-merging drivers/usb/gadget/function/f_fs.c +Auto-merging drivers/usb/host/xhci.h +Auto-merging fs/afs/internal.h +Auto-merging include/linux/crash_core.h +Auto-merging include/linux/cred.h +Auto-merging include/linux/kvm_host.h +Auto-merging include/linux/string.h +Auto-merging kernel/cred.c +Merge made by the 'ort' strategy. + MAINTAINERS | 6 ++ + arch/arm/configs/hardening.config | 7 ++ + arch/arm64/configs/hardening.config | 22 ++++++ + arch/powerpc/configs/hardening.config | 10 +++ + arch/sparc/kernel/cpumap.c | 2 +- + arch/um/os-Linux/drivers/ethertap_user.c | 2 +- + arch/x86/configs/hardening.config | 14 ++++ + drivers/accel/ivpu/ivpu_job.h | 2 +- + drivers/auxdisplay/panel.c | 7 +- + drivers/block/drbd/drbd_int.h | 2 +- + drivers/bus/fsl-mc/dprc.c | 12 ++-- + drivers/char/virtio_console.c | 2 +- + drivers/cpufreq/cpufreq.c | 4 +- + drivers/cpuidle/dt_idle_states.c | 4 +- + drivers/edac/edac_mc_sysfs.c | 4 +- + drivers/firmware/tegra/bpmp-debugfs.c | 4 +- + drivers/gpu/drm/gud/gud_pipe.c | 2 +- + drivers/gpu/drm/nouveau/nouveau_svm.c | 5 +- + drivers/hid/hid-prodikeys.c | 8 +-- + drivers/hwmon/acpi_power_meter.c | 5 +- + drivers/hwmon/asus_wmi_sensors.c | 2 +- + drivers/hwmon/ibmpowernv.c | 2 +- + drivers/irqchip/irq-imx-intmux.c | 2 +- + drivers/isdn/capi/kcapi.c | 4 +- + drivers/isdn/mISDN/clock.c | 2 +- + drivers/mailbox/zynqmp-ipi-mailbox.c | 2 +- + drivers/md/dm-bio-prison-v1.c | 2 +- + drivers/md/dm-crypt.c | 2 +- + drivers/md/dm-raid.c | 2 +- + drivers/md/dm-stats.c | 2 +- + drivers/md/dm-stripe.c | 2 +- + drivers/misc/lkdtm/bugs.c | 30 +++++++- + drivers/reset/core.c | 4 +- + drivers/thermal/qcom/tsens.h | 2 +- + drivers/usb/atm/usbatm.c | 3 +- + drivers/usb/gadget/function/f_fs.c | 2 +- + drivers/usb/gadget/function/f_midi.c | 4 +- + drivers/usb/host/ohci.h | 2 +- + drivers/usb/host/xhci.h | 2 +- + drivers/virt/acrn/acrn_drv.h | 2 +- + drivers/virt/acrn/mm.c | 2 +- + fs/afs/internal.h | 4 +- + fs/nfs/filelayout/filelayout.h | 2 +- + fs/nfs/flexfilelayout/flexfilelayout.h | 2 +- + fs/ocfs2/slot_map.c | 2 +- + include/linux/ceph/osd_client.h | 2 +- + include/linux/crash_core.h | 2 +- + include/linux/cred.h | 7 +- + include/linux/kvm_host.h | 2 +- + include/linux/platform_data/gsc_hwmon.h | 2 +- + include/linux/string.h | 7 +- + init/version.c | 6 +- + kernel/configs/hardening.config | 98 +++++++++++++++++++++++++++ + kernel/cred.c | 2 +- + kernel/groups.c | 2 +- + lib/kobject_uevent.c | 8 +-- + scripts/gcc-plugins/randomize_layout_plugin.c | 11 ++- + security/integrity/ima/ima_modsig.c | 6 +- + tools/testing/selftests/lkdtm/config | 1 - + tools/testing/selftests/lkdtm/tests.txt | 3 +- + 60 files changed, 280 insertions(+), 90 deletions(-) + create mode 100644 arch/arm/configs/hardening.config + create mode 100644 arch/arm64/configs/hardening.config + create mode 100644 arch/powerpc/configs/hardening.config + create mode 100644 arch/x86/configs/hardening.config + create mode 100644 kernel/configs/hardening.config +Merging kspp-gustavo/for-next/kspp (4d8cbf6dbcda fs: omfs: Use flexible-array member in struct omfs_extent) +$ git merge -m Merge branch 'for-next/kspp' of git://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git kspp-gustavo/for-next/kspp +Already up to date. +Merging nolibc/nolibc (0bb80ecc33a8 Linux 6.6-rc1) +$ git merge -m Merge branch 'nolibc' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git nolibc/nolibc +Already up to date. +Merging tsm/tsm-next (f4738f56d1dc virt: tdx-guest: Add Quote generation support using TSM_REPORTS) +$ git merge -m Merge branch 'tsm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/linux tsm/tsm-next +Auto-merging MAINTAINERS +Auto-merging arch/x86/coco/tdx/tdx.c +Auto-merging arch/x86/include/asm/shared/tdx.h +Auto-merging arch/x86/include/asm/tdx.h +Auto-merging include/linux/slab.h +Merge made by the 'ort' strategy. + Documentation/ABI/testing/configfs-tsm | 82 ++++++ + MAINTAINERS | 8 + + arch/x86/coco/tdx/tdx.c | 21 ++ + arch/x86/include/asm/shared/tdx.h | 1 + + arch/x86/include/asm/tdx.h | 2 + + drivers/virt/Kconfig | 6 +- + drivers/virt/Makefile | 4 +- + drivers/virt/coco/Kconfig | 14 ++ + drivers/virt/coco/Makefile | 8 + + drivers/virt/coco/sev-guest/Kconfig | 1 + + drivers/virt/coco/sev-guest/sev-guest.c | 214 ++++++++++++++-- + drivers/virt/coco/tdx-guest/Kconfig | 1 + + drivers/virt/coco/tdx-guest/tdx-guest.c | 229 ++++++++++++++++- + drivers/virt/coco/tsm.c | 425 ++++++++++++++++++++++++++++++++ + include/linux/slab.h | 2 + + include/linux/tsm.h | 69 ++++++ + include/uapi/linux/psp-sev.h | 1 + + include/uapi/linux/sev-guest.h | 4 +- + 18 files changed, 1055 insertions(+), 37 deletions(-) + create mode 100644 Documentation/ABI/testing/configfs-tsm + create mode 100644 drivers/virt/coco/Kconfig + create mode 100644 drivers/virt/coco/Makefile + create mode 100644 drivers/virt/coco/tsm.c + create mode 100644 include/linux/tsm.h +Merging iommufd/for-next (03476e687eb0 iommu/vt-d: Disallow read-only mappings to nest parent domain) +$ git merge -m Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git iommufd/for-next +Auto-merging drivers/iommu/Kconfig +Auto-merging drivers/iommu/amd/Kconfig +Auto-merging drivers/iommu/amd/amd_iommu_types.h +Auto-merging drivers/iommu/amd/iommu.c +Auto-merging drivers/iommu/intel/Kconfig +Auto-merging drivers/iommu/intel/iommu.c +Auto-merging drivers/iommu/intel/iommu.h +Auto-merging drivers/iommu/iommufd/selftest.c +CONFLICT (content): Merge conflict in drivers/iommu/iommufd/selftest.c +Auto-merging drivers/vfio/pci/mlx5/main.c +Auto-merging drivers/vfio/pci/pds/Kconfig +Auto-merging drivers/vfio/vfio_main.c +Auto-merging include/linux/iommu.h +CONFLICT (content): Merge conflict in include/linux/iommu.h +Resolved 'drivers/iommu/iommufd/selftest.c' using previous resolution. +Resolved 'include/linux/iommu.h' using previous resolution. +Automatic merge failed; fix conflicts and then commit the result. +$ git commit --no-edit -v -a +[master e2c0150dda99] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git +$ git diff -M --stat --summary HEAD^.. + drivers/iommu/Kconfig | 4 + + drivers/iommu/amd/Kconfig | 1 + + drivers/iommu/amd/amd_iommu_types.h | 12 + + drivers/iommu/amd/io_pgtable.c | 68 ++++ + drivers/iommu/amd/iommu.c | 147 ++++++++- + drivers/iommu/intel/Kconfig | 1 + + drivers/iommu/intel/Makefile | 2 +- + drivers/iommu/intel/iommu.c | 156 +++++++++- + drivers/iommu/intel/iommu.h | 64 +++- + drivers/iommu/intel/nested.c | 117 +++++++ + drivers/iommu/intel/pasid.c | 221 +++++++++++++ + drivers/iommu/intel/pasid.h | 6 + + drivers/iommu/iommufd/Makefile | 1 + + drivers/iommu/iommufd/device.c | 174 +++++++---- + drivers/iommu/iommufd/hw_pagetable.c | 304 ++++++++++++++---- + drivers/iommu/iommufd/io_pagetable.c | 172 ++++++++++ + drivers/iommu/iommufd/iommufd_private.h | 84 ++++- + drivers/iommu/iommufd/iommufd_test.h | 39 +++ + drivers/{vfio => iommu/iommufd}/iova_bitmap.c | 5 +- + drivers/iommu/iommufd/main.c | 17 +- + drivers/iommu/iommufd/selftest.c | 321 ++++++++++++++++++- + drivers/iommu/iommufd/vfio_compat.c | 6 +- + drivers/vfio/Makefile | 3 +- + drivers/vfio/pci/mlx5/Kconfig | 1 + + drivers/vfio/pci/mlx5/main.c | 1 + + drivers/vfio/pci/pds/Kconfig | 1 + + drivers/vfio/pci/pds/pci_drv.c | 1 + + drivers/vfio/vfio_main.c | 1 + + include/linux/io-pgtable.h | 4 + + include/linux/iommu.h | 146 ++++++++- + include/linux/iova_bitmap.h | 26 ++ + include/uapi/linux/iommufd.h | 180 ++++++++++- + tools/testing/selftests/iommu/iommufd.c | 379 ++++++++++++++++++++++- + tools/testing/selftests/iommu/iommufd_fail_nth.c | 7 +- + tools/testing/selftests/iommu/iommufd_utils.h | 233 +++++++++++++- + 35 files changed, 2694 insertions(+), 211 deletions(-) + create mode 100644 drivers/iommu/intel/nested.c + rename drivers/{vfio => iommu/iommufd}/iova_bitmap.c (98%) +$ git am -3 ../patches/0001-fix-up-for-crypto-ahash-remove-crypto_ahash_alignmas.patch +Applying: fix up for "crypto: ahash - remove crypto_ahash_alignmask" diff --git a/localversion-next b/localversion-next new file mode 100644 index 00000000000000..5c837eea6fe958 --- /dev/null +++ b/localversion-next @@ -0,0 +1 @@ +-next-20231030 From b6e2b2ea608f3afaa00f767062dd206acba327f3 Mon Sep 17 00:00:00 2001 From: Matthew Maurer Date: Thu, 14 Sep 2023 23:37:36 +0000 Subject: [PATCH 513/515] rust: Use From instances for JSON encoder This makes it easier to deal with nested objects or arrays. Signed-off-by: Matthew Maurer --- scripts/generate_rust_target.rs | 44 +++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs index 3c6cbe2b278d30..545481b7d8b188 100644 --- a/scripts/generate_rust_target.rs +++ b/scripts/generate_rust_target.rs @@ -47,33 +47,33 @@ impl Display for Value { } } -struct TargetSpec(Object); - -impl TargetSpec { - fn new() -> TargetSpec { - TargetSpec(Vec::new()) +impl From for Value { + fn from(value: bool) -> Self { + Self::Boolean(value) } } -trait Push { - fn push(&mut self, key: &str, value: T); +impl From for Value { + fn from(value: i32) -> Self { + Self::Number(value) + } } -impl Push for TargetSpec { - fn push(&mut self, key: &str, value: bool) { - self.0.push((key.to_string(), Value::Boolean(value))); +impl From for Value { + fn from(value: String) -> Self { + Self::String(value) } } -impl Push for TargetSpec { - fn push(&mut self, key: &str, value: i32) { - self.0.push((key.to_string(), Value::Number(value))); +impl From<&str> for Value { + fn from(value: &str) -> Self { + Self::String(value.to_string()) } } -impl Push for TargetSpec { - fn push(&mut self, key: &str, value: String) { - self.0.push((key.to_string(), Value::String(value))); +impl From for Value { + fn from(object: Object) -> Self { + Self::Object(object) } } @@ -83,9 +83,15 @@ impl Push<&str> for TargetSpec { } } -impl Push for TargetSpec { - fn push(&mut self, key: &str, value: Object) { - self.0.push((key.to_string(), Value::Object(value))); +struct TargetSpec(Object); + +impl TargetSpec { + fn new() -> TargetSpec { + TargetSpec(Vec::new()) + } + + fn push(&mut self, key: &str, value: impl Into) { + self.0.push((key.to_string(), value.into())); } } From 49654b3848628031ac12b849bfa1a48fdbf4da6c Mon Sep 17 00:00:00 2001 From: Matthew Maurer Date: Thu, 14 Sep 2023 23:38:39 +0000 Subject: [PATCH 514/515] rust: Support arrays in target JSON Some configurations, such as enabled sanitizers, are arrays Signed-off-by: Matthew Maurer --- scripts/generate_rust_target.rs | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs index 545481b7d8b188..e780ded38a3c83 100644 --- a/scripts/generate_rust_target.rs +++ b/scripts/generate_rust_target.rs @@ -20,12 +20,24 @@ enum Value { Boolean(bool), Number(i32), String(String), + Array(Vec), Object(Object), } type Object = Vec<(String, Value)>; -/// Minimal "almost JSON" generator (e.g. no `null`s, no arrays, no escaping), +fn comma_sep(seq: &[T], formatter: &mut Formatter<'_>, f: impl Fn(&mut Formatter<'_>, &T) -> Result) -> Result { + if let [ref rest @ .., ref last] = seq[..] { + for v in rest { + f(formatter, v)?; + formatter.write_str(",")?; + } + f(formatter, last)?; + } + Ok(()) +} + +/// Minimal "almost JSON" generator (e.g. no `null`s, no escaping), /// enough for this purpose. impl Display for Value { fn fmt(&self, formatter: &mut Formatter<'_>) -> Result { @@ -33,14 +45,15 @@ impl Display for Value { Value::Boolean(boolean) => write!(formatter, "{}", boolean), Value::Number(number) => write!(formatter, "{}", number), Value::String(string) => write!(formatter, "\"{}\"", string), + Value::Array(values) => { + formatter.write_str("[")?; + comma_sep(&values[..], formatter, |formatter, v| v.fmt(formatter))?; + formatter.write_str("]") + } Value::Object(object) => { formatter.write_str("{")?; - if let [ref rest @ .., ref last] = object[..] { - for (key, value) in rest { - write!(formatter, "\"{}\": {},", key, value)?; - } - write!(formatter, "\"{}\": {}", last.0, last.1)?; - } + comma_sep(&object[..], formatter, |formatter, v| + write!(formatter, "\"{}\": {}", v.0, v.1))?; formatter.write_str("}") } } @@ -77,9 +90,9 @@ impl From for Value { } } -impl Push<&str> for TargetSpec { - fn push(&mut self, key: &str, value: &str) { - self.push(key, value.to_string()); +impl , const N: usize> From<[T; N]> for Value { + fn from(i: [T; N]) -> Self { + Self::Array(i.into_iter().map(|v| v.into()).collect()) } } From 8eaa5a937ce44dedd4ab3fda2e2aac56390e5365 Mon Sep 17 00:00:00 2001 From: Matthew Maurer Date: Fri, 15 Sep 2023 00:05:06 +0000 Subject: [PATCH 515/515] rust: Enable KCFI support when available On newer clang, a flag is available which makes KCFI compatibility with rustc possible without significant contortions. Signed-off-by: Matthew Maurer --- Makefile | 15 +++++++++++++-- init/Kconfig | 1 + rust/Makefile | 2 +- scripts/generate_rust_target.rs | 1 + 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 690cde550acd3b..5e60e371a0da31 100644 --- a/Makefile +++ b/Makefile @@ -967,8 +967,19 @@ export CC_FLAGS_LTO endif ifdef CONFIG_CFI_CLANG -CC_FLAGS_CFI := -fsanitize=kcfi -KBUILD_CFLAGS += $(CC_FLAGS_CFI) +CC_FLAGS_CFI := -fsanitize=kcfi +ifdef CONFIG_RUST +# If Rust is enabled, this flag is required to support cross-language +# integer types. +# This addresses the problem that on e.g. i686, int != long, and Rust +# maps both to i32. +# See https://rcvalle.com/docs/rust-cfi-design-doc.pdf for details. +CC_FLAGS_CFI += -fsanitize-cfi-icall-experimental-normalize-integers +RS_FLAGS_CFI := -Zsanitizer=kcfi -Zsanitizer-cfi-normalize-integers +KBUILD_RSFLAGS += RS_FLAGS_CFI +export RS_FLAGS_CFI +endif +KBUILD_CFLAGS += $(CC_FLAGS_CFI) export CC_FLAGS_CFI endif diff --git a/init/Kconfig b/init/Kconfig index 9ffb103fc927bc..e88925e655398b 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1889,6 +1889,7 @@ config RUST depends on !GCC_PLUGINS depends on !RANDSTRUCT depends on !DEBUG_INFO_BTF || PAHOLE_HAS_LANG_EXCLUDE + depends on !CFI_CLANG || $(cc-option,-fsanitize=kcfi,-fsanitize-cfi-icall-experimental-normalize-integers) select CONSTRUCTORS help Enables Rust support in the kernel. diff --git a/rust/Makefile b/rust/Makefile index 543b37f6c77f12..662b61b9c57035 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -364,7 +364,7 @@ $(obj)/bindings/bindings_helpers_generated.rs: $(src)/helpers.c FORCE quiet_cmd_exports = EXPORTS $@ cmd_exports = \ $(NM) -p --defined-only $< \ - | awk '/ (T|R|D) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@ + | awk '$$2~/(T|R|D)/ && $$3!~/__cfi/ {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@ $(obj)/exports_core_generated.h: $(obj)/core.o FORCE $(call if_changed,exports) diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs index e780ded38a3c83..1a35570f53b4a6 100644 --- a/scripts/generate_rust_target.rs +++ b/scripts/generate_rust_target.rs @@ -179,6 +179,7 @@ fn main() { } ts.push("features", features); ts.push("llvm-target", "x86_64-linux-gnu"); + ts.push("supported-sanitizers", ["kcfi"]); ts.push("target-pointer-width", "64"); } else { panic!("Unsupported architecture");