mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 06:04:23 +08:00
modules-6.4-rc1
The summary of the changes for this pull requests is: * Song Liu's new struct module_memory replacement * Nick Alcock's MODULE_LICENSE() removal for non-modules * My cleanups and enhancements to reduce the areas where we vmalloc module memory for duplicates, and the respective debug code which proves the remaining vmalloc pressure comes from userspace. Most of the changes have been in linux-next for quite some time except the minor fixes I made to check if a module was already loaded prior to allocating the final module memory with vmalloc and the respective debug code it introduces to help clarify the issue. Although the functional change is small it is rather safe as it can only *help* reduce vmalloc space for duplicates and is confirmed to fix a bootup issue with over 400 CPUs with KASAN enabled. I don't expect stable kernels to pick up that fix as the cleanups would have also had to have been picked up. Folks on larger CPU systems with modules will want to just upgrade if vmalloc space has been an issue on bootup. Given the size of this request, here's some more elaborate details on this pull request. The functional change change in this pull request is the very first patch from Song Liu which replaces the struct module_layout with a new struct module memory. The old data structure tried to put together all types of supported module memory types in one data structure, the new one abstracts the differences in memory types in a module to allow each one to provide their own set of details. This paves the way in the future so we can deal with them in a cleaner way. If you look at changes they also provide a nice cleanup of how we handle these different memory areas in a module. This change has been in linux-next since before the merge window opened for v6.3 so to provide more than a full kernel cycle of testing. It's a good thing as quite a bit of fixes have been found for it. Jason Baron then made dynamic debug a first class citizen module user by using module notifier callbacks to allocate / remove module specific dynamic debug information. Nick Alcock has done quite a bit of work cross-tree to remove module license tags from things which cannot possibly be module at my request so to: a) help him with his longer term tooling goals which require a deterministic evaluation if a piece a symbol code could ever be part of a module or not. But quite recently it is has been made clear that tooling is not the only one that would benefit. Disambiguating symbols also helps efforts such as live patching, kprobes and BPF, but for other reasons and R&D on this area is active with no clear solution in sight. b) help us inch closer to the now generally accepted long term goal of automating all the MODULE_LICENSE() tags from SPDX license tags In so far as a) is concerned, although module license tags are a no-op for non-modules, tools which would want create a mapping of possible modules can only rely on the module license tag after the commit8b41fc4454
("kbuild: create modules.builtin without Makefile.modbuiltin or tristate.conf"). Nick has been working on this *for years* and AFAICT I was the only one to suggest two alternatives to this approach for tooling. The complexity in one of my suggested approaches lies in that we'd need a possible-obj-m and a could-be-module which would check if the object being built is part of any kconfig build which could ever lead to it being part of a module, and if so define a new define -DPOSSIBLE_MODULE [0]. A more obvious yet theoretical approach I've suggested would be to have a tristate in kconfig imply the same new -DPOSSIBLE_MODULE as well but that means getting kconfig symbol names mapping to modules always, and I don't think that's the case today. I am not aware of Nick or anyone exploring either of these options. Quite recently Josh Poimboeuf has pointed out that live patching, kprobes and BPF would benefit from resolving some part of the disambiguation as well but for other reasons. The function granularity KASLR (fgkaslr) patches were mentioned but Joe Lawrence has clarified this effort has been dropped with no clear solution in sight [1]. In the meantime removing module license tags from code which could never be modules is welcomed for both objectives mentioned above. Some developers have also welcomed these changes as it has helped clarify when a module was never possible and they forgot to clean this up, and so you'll see quite a bit of Nick's patches in other pull requests for this merge window. I just picked up the stragglers after rc3. LWN has good coverage on the motivation behind this work [2] and the typical cross-tree issues he ran into along the way. The only concrete blocker issue he ran into was that we should not remove the MODULE_LICENSE() tags from files which have no SPDX tags yet, even if they can never be modules. Nick ended up giving up on his efforts due to having to do this vetting and backlash he ran into from folks who really did *not understand* the core of the issue nor were providing any alternative / guidance. I've gone through his changes and dropped the patches which dropped the module license tags where an SPDX license tag was missing, it only consisted of 11 drivers. To see if a pull request deals with a file which lacks SPDX tags you can just use: ./scripts/spdxcheck.py -f \ $(git diff --name-only commid-id | xargs echo) You'll see a core module file in this pull request for the above, but that's not related to his changes. WE just need to add the SPDX license tag for the kernel/module/kmod.c file in the future but it demonstrates the effectiveness of the script. Most of Nick's changes were spread out through different trees, and I just picked up the slack after rc3 for the last kernel was out. Those changes have been in linux-next for over two weeks. The cleanups, debug code I added and final fix I added for modules were motivated by David Hildenbrand's report of boot failing on a systems with over 400 CPUs when KASAN was enabled due to running out of virtual memory space. Although the functional change only consists of 3 lines in the patch "module: avoid allocation if module is already present and ready", proving that this was the best we can do on the modules side took quite a bit of effort and new debug code. The initial cleanups I did on the modules side of things has been in linux-next since around rc3 of the last kernel, the actual final fix for and debug code however have only been in linux-next for about a week or so but I think it is worth getting that code in for this merge window as it does help fix / prove / evaluate the issues reported with larger number of CPUs. Userspace is not yet fixed as it is taking a bit of time for folks to understand the crux of the issue and find a proper resolution. Worst come to worst, I have a kludge-of-concept [3] of how to make kernel_read*() calls for modules unique / converge them, but I'm currently inclined to just see if userspace can fix this instead. [0] https://lore.kernel.org/all/Y/kXDqW+7d71C4wz@bombadil.infradead.org/ [1] https://lkml.kernel.org/r/025f2151-ce7c-5630-9b90-98742c97ac65@redhat.com [2] https://lwn.net/Articles/927569/ [3] https://lkml.kernel.org/r/20230414052840.1994456-3-mcgrof@kernel.org -----BEGIN PGP SIGNATURE----- iQJGBAABCgAwFiEENnNq2KuOejlQLZofziMdCjCSiKcFAmRG4m0SHG1jZ3JvZkBr ZXJuZWwub3JnAAoJEM4jHQowkoinQ2oP/0xlvKwJg6Ey8fHZF0qv8VOskE80zoLF hMazU3xfqLA+1TQvouW1YBxt3jwS3t1Ehs+NrV+nY9Yzcm0MzRX/n3fASJVe7nRr oqWWQU+voYl5Pw1xsfdp6C8IXpBQorpYby3Vp0MAMoZyl2W2YrNo36NV488wM9KC jD4HF5Z6xpnPSZTRR7AgW9mo7FdAtxPeKJ76Bch7lH8U6omT7n36WqTw+5B1eAYU YTOvrjRs294oqmWE+LeebyiOOXhH/yEYx4JNQgCwPdxwnRiGJWKsk5va0hRApqF/ WW8dIqdEnjsa84lCuxnmWgbcPK8cgmlO0rT0DyneACCldNlldCW1LJ0HOwLk9pea p3JFAsBL7TKue4Tos6I7/4rx1ufyBGGIigqw9/VX5g0Iif+3BhWnqKRfz+p9wiMa Fl7cU6u7yC68CHu1HBSisK16cYMCPeOnTSd89upHj8JU/t74O6k/ARvjrQ9qmNUt c5U+OY+WpNJ1nXQydhY/yIDhFdYg8SSpNuIO90r4L8/8jRQYXNG80FDd1UtvVDuy eq0r2yZ8C0XHSlOT9QHaua/tWV/aaKtyC/c0hDRrigfUrq8UOlGujMXbUnrmrWJI tLJLAc7ePWAAoZXGSHrt0U27l029GzLwRdKqJ6kkDANVnTeOdV+mmBg9zGh3/Mp6 agiwdHUMVN7X =56WK -----END PGP SIGNATURE----- Merge tag 'modules-6.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux Pull module updates from Luis Chamberlain: "The summary of the changes for this pull requests is: - Song Liu's new struct module_memory replacement - Nick Alcock's MODULE_LICENSE() removal for non-modules - My cleanups and enhancements to reduce the areas where we vmalloc module memory for duplicates, and the respective debug code which proves the remaining vmalloc pressure comes from userspace. Most of the changes have been in linux-next for quite some time except the minor fixes I made to check if a module was already loaded prior to allocating the final module memory with vmalloc and the respective debug code it introduces to help clarify the issue. Although the functional change is small it is rather safe as it can only *help* reduce vmalloc space for duplicates and is confirmed to fix a bootup issue with over 400 CPUs with KASAN enabled. I don't expect stable kernels to pick up that fix as the cleanups would have also had to have been picked up. Folks on larger CPU systems with modules will want to just upgrade if vmalloc space has been an issue on bootup. Given the size of this request, here's some more elaborate details: The functional change change in this pull request is the very first patch from Song Liu which replaces the 'struct module_layout' with a new 'struct module_memory'. The old data structure tried to put together all types of supported module memory types in one data structure, the new one abstracts the differences in memory types in a module to allow each one to provide their own set of details. This paves the way in the future so we can deal with them in a cleaner way. If you look at changes they also provide a nice cleanup of how we handle these different memory areas in a module. This change has been in linux-next since before the merge window opened for v6.3 so to provide more than a full kernel cycle of testing. It's a good thing as quite a bit of fixes have been found for it. Jason Baron then made dynamic debug a first class citizen module user by using module notifier callbacks to allocate / remove module specific dynamic debug information. Nick Alcock has done quite a bit of work cross-tree to remove module license tags from things which cannot possibly be module at my request so to: a) help him with his longer term tooling goals which require a deterministic evaluation if a piece a symbol code could ever be part of a module or not. But quite recently it is has been made clear that tooling is not the only one that would benefit. Disambiguating symbols also helps efforts such as live patching, kprobes and BPF, but for other reasons and R&D on this area is active with no clear solution in sight. b) help us inch closer to the now generally accepted long term goal of automating all the MODULE_LICENSE() tags from SPDX license tags In so far as a) is concerned, although module license tags are a no-op for non-modules, tools which would want create a mapping of possible modules can only rely on the module license tag after the commit8b41fc4454
("kbuild: create modules.builtin without Makefile.modbuiltin or tristate.conf"). Nick has been working on this *for years* and AFAICT I was the only one to suggest two alternatives to this approach for tooling. The complexity in one of my suggested approaches lies in that we'd need a possible-obj-m and a could-be-module which would check if the object being built is part of any kconfig build which could ever lead to it being part of a module, and if so define a new define -DPOSSIBLE_MODULE [0]. A more obvious yet theoretical approach I've suggested would be to have a tristate in kconfig imply the same new -DPOSSIBLE_MODULE as well but that means getting kconfig symbol names mapping to modules always, and I don't think that's the case today. I am not aware of Nick or anyone exploring either of these options. Quite recently Josh Poimboeuf has pointed out that live patching, kprobes and BPF would benefit from resolving some part of the disambiguation as well but for other reasons. The function granularity KASLR (fgkaslr) patches were mentioned but Joe Lawrence has clarified this effort has been dropped with no clear solution in sight [1]. In the meantime removing module license tags from code which could never be modules is welcomed for both objectives mentioned above. Some developers have also welcomed these changes as it has helped clarify when a module was never possible and they forgot to clean this up, and so you'll see quite a bit of Nick's patches in other pull requests for this merge window. I just picked up the stragglers after rc3. LWN has good coverage on the motivation behind this work [2] and the typical cross-tree issues he ran into along the way. The only concrete blocker issue he ran into was that we should not remove the MODULE_LICENSE() tags from files which have no SPDX tags yet, even if they can never be modules. Nick ended up giving up on his efforts due to having to do this vetting and backlash he ran into from folks who really did *not understand* the core of the issue nor were providing any alternative / guidance. I've gone through his changes and dropped the patches which dropped the module license tags where an SPDX license tag was missing, it only consisted of 11 drivers. To see if a pull request deals with a file which lacks SPDX tags you can just use: ./scripts/spdxcheck.py -f \ $(git diff --name-only commid-id | xargs echo) You'll see a core module file in this pull request for the above, but that's not related to his changes. WE just need to add the SPDX license tag for the kernel/module/kmod.c file in the future but it demonstrates the effectiveness of the script. Most of Nick's changes were spread out through different trees, and I just picked up the slack after rc3 for the last kernel was out. Those changes have been in linux-next for over two weeks. The cleanups, debug code I added and final fix I added for modules were motivated by David Hildenbrand's report of boot failing on a systems with over 400 CPUs when KASAN was enabled due to running out of virtual memory space. Although the functional change only consists of 3 lines in the patch "module: avoid allocation if module is already present and ready", proving that this was the best we can do on the modules side took quite a bit of effort and new debug code. The initial cleanups I did on the modules side of things has been in linux-next since around rc3 of the last kernel, the actual final fix for and debug code however have only been in linux-next for about a week or so but I think it is worth getting that code in for this merge window as it does help fix / prove / evaluate the issues reported with larger number of CPUs. Userspace is not yet fixed as it is taking a bit of time for folks to understand the crux of the issue and find a proper resolution. Worst come to worst, I have a kludge-of-concept [3] of how to make kernel_read*() calls for modules unique / converge them, but I'm currently inclined to just see if userspace can fix this instead" Link: https://lore.kernel.org/all/Y/kXDqW+7d71C4wz@bombadil.infradead.org/ [0] Link: https://lkml.kernel.org/r/025f2151-ce7c-5630-9b90-98742c97ac65@redhat.com [1] Link: https://lwn.net/Articles/927569/ [2] Link: https://lkml.kernel.org/r/20230414052840.1994456-3-mcgrof@kernel.org [3] * tag 'modules-6.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux: (121 commits) module: add debugging auto-load duplicate module support module: stats: fix invalid_mod_bytes typo module: remove use of uninitialized variable len module: fix building stats for 32-bit targets module: stats: include uapi/linux/module.h module: avoid allocation if module is already present and ready module: add debug stats to help identify memory pressure module: extract patient module check into helper modules/kmod: replace implementation with a semaphore Change DEFINE_SEMAPHORE() to take a number argument module: fix kmemleak annotations for non init ELF sections module: Ignore L0 and rename is_arm_mapping_symbol() module: Move is_arm_mapping_symbol() to module_symbol.h module: Sync code of is_arm_mapping_symbol() scripts/gdb: use mem instead of core_layout to get the module address interconnect: remove module-related code interconnect: remove MODULE_LICENSE in non-modules zswap: remove MODULE_LICENSE in non-modules zpool: remove MODULE_LICENSE in non-modules x86/mm/dump_pagetables: remove MODULE_LICENSE in non-modules ...
This commit is contained in:
commit
b6a7828502
@ -3363,6 +3363,12 @@
|
||||
specified, <module>.async_probe takes precedence for
|
||||
the specific module.
|
||||
|
||||
module.enable_dups_trace
|
||||
[KNL] When CONFIG_MODULE_DEBUG_AUTOLOAD_DUPS is set,
|
||||
this means that duplicate request_module() calls will
|
||||
trigger a WARN_ON() instead of a pr_warn(). Note that
|
||||
if MODULE_DEBUG_AUTOLOAD_DUPS_TRACE is set, WARN_ON()s
|
||||
will always be issued and this option does nothing.
|
||||
module.sig_enforce
|
||||
[KNL] When CONFIG_MODULE_SIG is set, this means that
|
||||
modules without (valid) signatures will fail to load.
|
||||
|
@ -220,12 +220,30 @@ relay interface
|
||||
Module Support
|
||||
==============
|
||||
|
||||
Module Loading
|
||||
--------------
|
||||
Kernel module auto-loading
|
||||
--------------------------
|
||||
|
||||
.. kernel-doc:: kernel/kmod.c
|
||||
.. kernel-doc:: kernel/module/kmod.c
|
||||
:export:
|
||||
|
||||
Module debugging
|
||||
----------------
|
||||
|
||||
.. kernel-doc:: kernel/module/stats.c
|
||||
:doc: module debugging statistics overview
|
||||
|
||||
dup_failed_modules - tracks duplicate failed modules
|
||||
****************************************************
|
||||
|
||||
.. kernel-doc:: kernel/module/stats.c
|
||||
:doc: dup_failed_modules - tracks duplicate failed modules
|
||||
|
||||
module statistics debugfs counters
|
||||
**********************************
|
||||
|
||||
.. kernel-doc:: kernel/module/stats.c
|
||||
:doc: module statistics debugfs counters
|
||||
|
||||
Inter Module support
|
||||
--------------------
|
||||
|
||||
|
@ -226,7 +226,7 @@ kernel/relay.c
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
kernel/kmod.c
|
||||
kernel/module/kmod.c
|
||||
|
||||
模块接口支持
|
||||
------------
|
||||
|
13
MAINTAINERS
13
MAINTAINERS
@ -11601,16 +11601,6 @@ F: include/linux/kmemleak.h
|
||||
F: mm/kmemleak.c
|
||||
F: samples/kmemleak/kmemleak-test.c
|
||||
|
||||
KMOD KERNEL MODULE LOADER - USERMODE HELPER
|
||||
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-modules@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/linux/kmod.h
|
||||
F: kernel/kmod.c
|
||||
F: lib/test_kmod.c
|
||||
F: tools/testing/selftests/kmod/
|
||||
|
||||
KMSAN
|
||||
M: Alexander Potapenko <glider@google.com>
|
||||
R: Marco Elver <elver@google.com>
|
||||
@ -14186,8 +14176,11 @@ 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/module.h
|
||||
F: include/linux/kmod.h
|
||||
F: kernel/module/
|
||||
F: scripts/module*
|
||||
F: lib/test_kmod.c
|
||||
F: tools/testing/selftests/kmod/
|
||||
|
||||
MONOLITHIC POWER SYSTEM PMIC DRIVER
|
||||
M: Saravanan Sekar <sravanhome@gmail.com>
|
||||
|
@ -369,6 +369,8 @@ void *unwind_add_table(struct module *module, const void *table_start,
|
||||
unsigned long table_size)
|
||||
{
|
||||
struct unwind_table *table;
|
||||
struct module_memory *core_text;
|
||||
struct module_memory *init_text;
|
||||
|
||||
if (table_size <= 0)
|
||||
return NULL;
|
||||
@ -377,11 +379,11 @@ void *unwind_add_table(struct module *module, const void *table_start,
|
||||
if (!table)
|
||||
return NULL;
|
||||
|
||||
init_unwind_table(table, module->name,
|
||||
module->core_layout.base, module->core_layout.size,
|
||||
module->init_layout.base, module->init_layout.size,
|
||||
table_start, table_size,
|
||||
NULL, 0);
|
||||
core_text = &module->mem[MOD_TEXT];
|
||||
init_text = &module->mem[MOD_INIT_TEXT];
|
||||
|
||||
init_unwind_table(table, module->name, core_text->base, core_text->size,
|
||||
init_text->base, init_text->size, table_start, table_size, NULL, 0);
|
||||
|
||||
init_unwind_hdr(table, unw_hdr_alloc);
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
/* Not needed, but used in some headers pulled in by decompressors */
|
||||
extern char * strstr(const char * s1, const char *s2);
|
||||
extern size_t strlen(const char *s);
|
||||
extern int strcmp(const char *cs, const char *ct);
|
||||
extern int memcmp(const void *cs, const void *ct, size_t count);
|
||||
extern char * strchrnul(const char *, int);
|
||||
|
||||
|
@ -28,11 +28,6 @@ static const u32 fixed_plts[] = {
|
||||
#endif
|
||||
};
|
||||
|
||||
static bool in_init(const struct module *mod, unsigned long loc)
|
||||
{
|
||||
return loc - (u32)mod->init_layout.base < mod->init_layout.size;
|
||||
}
|
||||
|
||||
static void prealloc_fixed(struct mod_plt_sec *pltsec, struct plt_entries *plt)
|
||||
{
|
||||
int i;
|
||||
@ -50,8 +45,8 @@ static void prealloc_fixed(struct mod_plt_sec *pltsec, struct plt_entries *plt)
|
||||
|
||||
u32 get_module_plt(struct module *mod, unsigned long loc, Elf32_Addr val)
|
||||
{
|
||||
struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
|
||||
&mod->arch.init;
|
||||
struct mod_plt_sec *pltsec = !within_module_init(loc, mod) ?
|
||||
&mod->arch.core : &mod->arch.init;
|
||||
struct plt_entries *plt;
|
||||
int idx;
|
||||
|
||||
|
@ -65,17 +65,12 @@ static bool plt_entries_equal(const struct plt_entry *a,
|
||||
(q + aarch64_insn_adrp_get_offset(le32_to_cpu(b->adrp)));
|
||||
}
|
||||
|
||||
static bool in_init(const struct module *mod, void *loc)
|
||||
{
|
||||
return (u64)loc - (u64)mod->init_layout.base < mod->init_layout.size;
|
||||
}
|
||||
|
||||
u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
|
||||
void *loc, const Elf64_Rela *rela,
|
||||
Elf64_Sym *sym)
|
||||
{
|
||||
struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
|
||||
&mod->arch.init;
|
||||
struct mod_plt_sec *pltsec = !within_module_init((unsigned long)loc, mod) ?
|
||||
&mod->arch.core : &mod->arch.init;
|
||||
struct plt_entry *plt = (struct plt_entry *)sechdrs[pltsec->plt_shndx].sh_addr;
|
||||
int i = pltsec->plt_num_entries;
|
||||
int j = i - 1;
|
||||
@ -105,8 +100,8 @@ u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
|
||||
u64 module_emit_veneer_for_adrp(struct module *mod, Elf64_Shdr *sechdrs,
|
||||
void *loc, u64 val)
|
||||
{
|
||||
struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
|
||||
&mod->arch.init;
|
||||
struct mod_plt_sec *pltsec = !within_module_init((unsigned long)loc, mod) ?
|
||||
&mod->arch.core : &mod->arch.init;
|
||||
struct plt_entry *plt = (struct plt_entry *)sechdrs[pltsec->plt_shndx].sh_addr;
|
||||
int i = pltsec->plt_num_entries++;
|
||||
u32 br;
|
||||
|
@ -485,19 +485,19 @@ module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
static inline bool
|
||||
in_init (const struct module *mod, uint64_t addr)
|
||||
{
|
||||
return addr - (uint64_t) mod->init_layout.base < mod->init_layout.size;
|
||||
return within_module_init(addr, mod);
|
||||
}
|
||||
|
||||
static inline int
|
||||
static inline bool
|
||||
in_core (const struct module *mod, uint64_t addr)
|
||||
{
|
||||
return addr - (uint64_t) mod->core_layout.base < mod->core_layout.size;
|
||||
return within_module_core(addr, mod);
|
||||
}
|
||||
|
||||
static inline int
|
||||
static inline bool
|
||||
is_internal (const struct module *mod, uint64_t value)
|
||||
{
|
||||
return in_init(mod, value) || in_core(mod, value);
|
||||
@ -677,7 +677,8 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
|
||||
break;
|
||||
|
||||
case RV_BDREL:
|
||||
val -= (uint64_t) (in_init(mod, val) ? mod->init_layout.base : mod->core_layout.base);
|
||||
val -= (uint64_t) (in_init(mod, val) ? mod->mem[MOD_INIT_TEXT].base :
|
||||
mod->mem[MOD_TEXT].base);
|
||||
break;
|
||||
|
||||
case RV_LTV:
|
||||
@ -812,15 +813,18 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
|
||||
* addresses have been selected...
|
||||
*/
|
||||
uint64_t gp;
|
||||
if (mod->core_layout.size > MAX_LTOFF)
|
||||
struct module_memory *mod_mem;
|
||||
|
||||
mod_mem = &mod->mem[MOD_DATA];
|
||||
if (mod_mem->size > MAX_LTOFF)
|
||||
/*
|
||||
* This takes advantage of fact that SHF_ARCH_SMALL gets allocated
|
||||
* at the end of the module.
|
||||
*/
|
||||
gp = mod->core_layout.size - MAX_LTOFF / 2;
|
||||
gp = mod_mem->size - MAX_LTOFF / 2;
|
||||
else
|
||||
gp = mod->core_layout.size / 2;
|
||||
gp = (uint64_t) mod->core_layout.base + ((gp + 7) & -8);
|
||||
gp = mod_mem->size / 2;
|
||||
gp = (uint64_t) mod_mem->base + ((gp + 7) & -8);
|
||||
mod->arch.gp = gp;
|
||||
DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp);
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ extern void pci_console_init(const char *arg);
|
||||
static unsigned long long max_memory = ULLONG_MAX;
|
||||
static unsigned long long reserve_low_mem;
|
||||
|
||||
DEFINE_SEMAPHORE(octeon_bootbus_sem);
|
||||
DEFINE_SEMAPHORE(octeon_bootbus_sem, 1);
|
||||
EXPORT_SYMBOL(octeon_bootbus_sem);
|
||||
|
||||
static struct octeon_boot_descriptor *octeon_boot_desc_ptr;
|
||||
|
@ -199,18 +199,17 @@ static void layout_sections(struct module *mod, const Elf_Ehdr *hdr,
|
||||
for (m = 0; m < ARRAY_SIZE(masks); ++m) {
|
||||
for (i = 0; i < hdr->e_shnum; ++i) {
|
||||
Elf_Shdr *s = &sechdrs[i];
|
||||
struct module_memory *mod_mem;
|
||||
|
||||
mod_mem = &mod->mem[MOD_TEXT];
|
||||
|
||||
if ((s->sh_flags & masks[m][0]) != masks[m][0]
|
||||
|| (s->sh_flags & masks[m][1])
|
||||
|| s->sh_entsize != ~0UL)
|
||||
continue;
|
||||
s->sh_entsize =
|
||||
get_offset((unsigned long *)&mod->core_layout.size, s);
|
||||
get_offset((unsigned long *)&mod_mem->size, s);
|
||||
}
|
||||
|
||||
if (m == 0)
|
||||
mod->core_layout.text_size = mod->core_layout.size;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -641,7 +640,7 @@ static int vpe_elfload(struct vpe *v)
|
||||
layout_sections(&mod, hdr, sechdrs, secstrings);
|
||||
}
|
||||
|
||||
v->load_addr = alloc_progmem(mod.core_layout.size);
|
||||
v->load_addr = alloc_progmem(mod.mem[MOD_TEXT].size);
|
||||
if (!v->load_addr)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -27,9 +27,9 @@
|
||||
* We are not doing SEGREL32 handling correctly. According to the ABI, we
|
||||
* should do a value offset, like this:
|
||||
* if (in_init(me, (void *)val))
|
||||
* val -= (uint32_t)me->init_layout.base;
|
||||
* val -= (uint32_t)me->mem[MOD_INIT_TEXT].base;
|
||||
* else
|
||||
* val -= (uint32_t)me->core_layout.base;
|
||||
* val -= (uint32_t)me->mem[MOD_TEXT].base;
|
||||
* However, SEGREL32 is used only for PARISC unwind entries, and we want
|
||||
* those entries to have an absolute address, and not just an offset.
|
||||
*
|
||||
@ -76,25 +76,6 @@
|
||||
* allows us to allocate up to 4095 GOT entries. */
|
||||
#define MAX_GOTS 4095
|
||||
|
||||
/* three functions to determine where in the module core
|
||||
* or init pieces the location is */
|
||||
static inline int in_init(struct module *me, void *loc)
|
||||
{
|
||||
return (loc >= me->init_layout.base &&
|
||||
loc <= (me->init_layout.base + me->init_layout.size));
|
||||
}
|
||||
|
||||
static inline int in_core(struct module *me, void *loc)
|
||||
{
|
||||
return (loc >= me->core_layout.base &&
|
||||
loc <= (me->core_layout.base + me->core_layout.size));
|
||||
}
|
||||
|
||||
static inline int in_local(struct module *me, void *loc)
|
||||
{
|
||||
return in_init(me, loc) || in_core(me, loc);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
struct got_entry {
|
||||
Elf32_Addr addr;
|
||||
@ -302,6 +283,7 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
||||
{
|
||||
unsigned long gots = 0, fdescs = 0, len;
|
||||
unsigned int i;
|
||||
struct module_memory *mod_mem;
|
||||
|
||||
len = hdr->e_shnum * sizeof(me->arch.section[0]);
|
||||
me->arch.section = kzalloc(len, GFP_KERNEL);
|
||||
@ -346,14 +328,15 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
||||
me->arch.section[s].stub_entries += count;
|
||||
}
|
||||
|
||||
mod_mem = &me->mem[MOD_TEXT];
|
||||
/* align things a bit */
|
||||
me->core_layout.size = ALIGN(me->core_layout.size, 16);
|
||||
me->arch.got_offset = me->core_layout.size;
|
||||
me->core_layout.size += gots * sizeof(struct got_entry);
|
||||
mod_mem->size = ALIGN(mod_mem->size, 16);
|
||||
me->arch.got_offset = mod_mem->size;
|
||||
mod_mem->size += gots * sizeof(struct got_entry);
|
||||
|
||||
me->core_layout.size = ALIGN(me->core_layout.size, 16);
|
||||
me->arch.fdesc_offset = me->core_layout.size;
|
||||
me->core_layout.size += fdescs * sizeof(Elf_Fdesc);
|
||||
mod_mem->size = ALIGN(mod_mem->size, 16);
|
||||
me->arch.fdesc_offset = mod_mem->size;
|
||||
mod_mem->size += fdescs * sizeof(Elf_Fdesc);
|
||||
|
||||
me->arch.got_max = gots;
|
||||
me->arch.fdesc_max = fdescs;
|
||||
@ -371,7 +354,7 @@ static Elf64_Word get_got(struct module *me, unsigned long value, long addend)
|
||||
|
||||
BUG_ON(value == 0);
|
||||
|
||||
got = me->core_layout.base + me->arch.got_offset;
|
||||
got = me->mem[MOD_TEXT].base + me->arch.got_offset;
|
||||
for (i = 0; got[i].addr; i++)
|
||||
if (got[i].addr == value)
|
||||
goto out;
|
||||
@ -389,7 +372,7 @@ static Elf64_Word get_got(struct module *me, unsigned long value, long addend)
|
||||
#ifdef CONFIG_64BIT
|
||||
static Elf_Addr get_fdesc(struct module *me, unsigned long value)
|
||||
{
|
||||
Elf_Fdesc *fdesc = me->core_layout.base + me->arch.fdesc_offset;
|
||||
Elf_Fdesc *fdesc = me->mem[MOD_TEXT].base + me->arch.fdesc_offset;
|
||||
|
||||
if (!value) {
|
||||
printk(KERN_ERR "%s: zero OPD requested!\n", me->name);
|
||||
@ -407,7 +390,7 @@ static Elf_Addr get_fdesc(struct module *me, unsigned long value)
|
||||
|
||||
/* Create new one */
|
||||
fdesc->addr = value;
|
||||
fdesc->gp = (Elf_Addr)me->core_layout.base + me->arch.got_offset;
|
||||
fdesc->gp = (Elf_Addr)me->mem[MOD_TEXT].base + me->arch.got_offset;
|
||||
return (Elf_Addr)fdesc;
|
||||
}
|
||||
#endif /* CONFIG_64BIT */
|
||||
@ -742,7 +725,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
loc, val);
|
||||
val += addend;
|
||||
/* can we reach it locally? */
|
||||
if (in_local(me, (void *)val)) {
|
||||
if (within_module(val, me)) {
|
||||
/* this is the case where the symbol is local
|
||||
* to the module, but in a different section,
|
||||
* so stub the jump in case it's more than 22
|
||||
@ -801,7 +784,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
break;
|
||||
case R_PARISC_FPTR64:
|
||||
/* 64-bit function address */
|
||||
if(in_local(me, (void *)(val + addend))) {
|
||||
if (within_module(val + addend, me)) {
|
||||
*loc64 = get_fdesc(me, val+addend);
|
||||
pr_debug("FDESC for %s at %llx points to %llx\n",
|
||||
strtab + sym->st_name, *loc64,
|
||||
@ -839,7 +822,7 @@ register_unwind_table(struct module *me,
|
||||
|
||||
table = (unsigned char *)sechdrs[me->arch.unwind_section].sh_addr;
|
||||
end = table + sechdrs[me->arch.unwind_section].sh_size;
|
||||
gp = (Elf_Addr)me->core_layout.base + me->arch.got_offset;
|
||||
gp = (Elf_Addr)me->mem[MOD_TEXT].base + me->arch.got_offset;
|
||||
|
||||
pr_debug("register_unwind_table(), sect = %d at 0x%p - 0x%p (gp=0x%lx)\n",
|
||||
me->arch.unwind_section, table, end, gp);
|
||||
@ -977,7 +960,7 @@ void module_arch_cleanup(struct module *mod)
|
||||
#ifdef CONFIG_64BIT
|
||||
void *dereference_module_function_descriptor(struct module *mod, void *ptr)
|
||||
{
|
||||
unsigned long start_opd = (Elf64_Addr)mod->core_layout.base +
|
||||
unsigned long start_opd = (Elf64_Addr)mod->mem[MOD_TEXT].base +
|
||||
mod->arch.fdesc_offset;
|
||||
unsigned long end_opd = start_opd +
|
||||
mod->arch.fdesc_count * sizeof(Elf64_Fdesc);
|
||||
|
@ -163,8 +163,7 @@ static uint32_t do_plt_call(void *location,
|
||||
|
||||
pr_debug("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location);
|
||||
/* Init, or core PLT? */
|
||||
if (location >= mod->core_layout.base
|
||||
&& location < mod->core_layout.base + mod->core_layout.size)
|
||||
if (within_module_core((unsigned long)location, mod))
|
||||
entry = (void *)sechdrs[mod->arch.core_plt_section].sh_addr;
|
||||
else
|
||||
entry = (void *)sechdrs[mod->arch.init_plt_section].sh_addr;
|
||||
@ -322,14 +321,14 @@ notrace int module_trampoline_target(struct module *mod, unsigned long addr,
|
||||
|
||||
int module_finalize_ftrace(struct module *module, const Elf_Shdr *sechdrs)
|
||||
{
|
||||
module->arch.tramp = do_plt_call(module->core_layout.base,
|
||||
module->arch.tramp = do_plt_call(module->mem[MOD_TEXT].base,
|
||||
(unsigned long)ftrace_caller,
|
||||
sechdrs, module);
|
||||
if (!module->arch.tramp)
|
||||
return -ENOENT;
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
|
||||
module->arch.tramp_regs = do_plt_call(module->core_layout.base,
|
||||
module->arch.tramp_regs = do_plt_call(module->mem[MOD_TEXT].base,
|
||||
(unsigned long)ftrace_regs_caller,
|
||||
sechdrs, module);
|
||||
if (!module->arch.tramp_regs)
|
||||
|
@ -126,6 +126,7 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
Elf_Rela *rela;
|
||||
char *strings;
|
||||
int nrela, i, j;
|
||||
struct module_memory *mod_mem;
|
||||
|
||||
/* Find symbol table and string table. */
|
||||
symtab = NULL;
|
||||
@ -173,14 +174,15 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
|
||||
/* Increase core size by size of got & plt and set start
|
||||
offsets for got and plt. */
|
||||
me->core_layout.size = ALIGN(me->core_layout.size, 4);
|
||||
me->arch.got_offset = me->core_layout.size;
|
||||
me->core_layout.size += me->arch.got_size;
|
||||
me->arch.plt_offset = me->core_layout.size;
|
||||
mod_mem = &me->mem[MOD_TEXT];
|
||||
mod_mem->size = ALIGN(mod_mem->size, 4);
|
||||
me->arch.got_offset = mod_mem->size;
|
||||
mod_mem->size += me->arch.got_size;
|
||||
me->arch.plt_offset = mod_mem->size;
|
||||
if (me->arch.plt_size) {
|
||||
if (IS_ENABLED(CONFIG_EXPOLINE) && !nospec_disable)
|
||||
me->arch.plt_size += PLT_ENTRY_SIZE;
|
||||
me->core_layout.size += me->arch.plt_size;
|
||||
mod_mem->size += me->arch.plt_size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -304,7 +306,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
case R_390_GOTPLT64: /* 64 bit offset to jump slot. */
|
||||
case R_390_GOTPLTENT: /* 32 bit rel. offset to jump slot >> 1. */
|
||||
if (info->got_initialized == 0) {
|
||||
Elf_Addr *gotent = me->core_layout.base +
|
||||
Elf_Addr *gotent = me->mem[MOD_TEXT].base +
|
||||
me->arch.got_offset +
|
||||
info->got_offset;
|
||||
|
||||
@ -329,7 +331,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
rc = apply_rela_bits(loc, val, 0, 64, 0, write);
|
||||
else if (r_type == R_390_GOTENT ||
|
||||
r_type == R_390_GOTPLTENT) {
|
||||
val += (Elf_Addr) me->core_layout.base - loc;
|
||||
val += (Elf_Addr) me->mem[MOD_TEXT].base - loc;
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 1, write);
|
||||
}
|
||||
break;
|
||||
@ -345,7 +347,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
char *plt_base;
|
||||
char *ip;
|
||||
|
||||
plt_base = me->core_layout.base + me->arch.plt_offset;
|
||||
plt_base = me->mem[MOD_TEXT].base + me->arch.plt_offset;
|
||||
ip = plt_base + info->plt_offset;
|
||||
*(int *)insn = 0x0d10e310; /* basr 1,0 */
|
||||
*(int *)&insn[4] = 0x100c0004; /* lg 1,12(1) */
|
||||
@ -375,7 +377,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
val - loc + 0xffffUL < 0x1ffffeUL) ||
|
||||
(r_type == R_390_PLT32DBL &&
|
||||
val - loc + 0xffffffffULL < 0x1fffffffeULL)))
|
||||
val = (Elf_Addr) me->core_layout.base +
|
||||
val = (Elf_Addr) me->mem[MOD_TEXT].base +
|
||||
me->arch.plt_offset +
|
||||
info->plt_offset;
|
||||
val += rela->r_addend - loc;
|
||||
@ -397,7 +399,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
case R_390_GOTOFF32: /* 32 bit offset to GOT. */
|
||||
case R_390_GOTOFF64: /* 64 bit offset to GOT. */
|
||||
val = val + rela->r_addend -
|
||||
((Elf_Addr) me->core_layout.base + me->arch.got_offset);
|
||||
((Elf_Addr) me->mem[MOD_TEXT].base + me->arch.got_offset);
|
||||
if (r_type == R_390_GOTOFF16)
|
||||
rc = apply_rela_bits(loc, val, 0, 16, 0, write);
|
||||
else if (r_type == R_390_GOTOFF32)
|
||||
@ -407,7 +409,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
break;
|
||||
case R_390_GOTPC: /* 32 bit PC relative offset to GOT. */
|
||||
case R_390_GOTPCDBL: /* 32 bit PC rel. off. to GOT shifted by 1. */
|
||||
val = (Elf_Addr) me->core_layout.base + me->arch.got_offset +
|
||||
val = (Elf_Addr) me->mem[MOD_TEXT].base + me->arch.got_offset +
|
||||
rela->r_addend - loc;
|
||||
if (r_type == R_390_GOTPC)
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 0, write);
|
||||
@ -515,7 +517,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
!nospec_disable && me->arch.plt_size) {
|
||||
unsigned int *ij;
|
||||
|
||||
ij = me->core_layout.base + me->arch.plt_offset +
|
||||
ij = me->mem[MOD_TEXT].base + me->arch.plt_offset +
|
||||
me->arch.plt_size - PLT_ENTRY_SIZE;
|
||||
ij[0] = 0xc6000000; /* exrl %r0,.+10 */
|
||||
ij[1] = 0x0005a7f4; /* j . */
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/jump_label.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
@ -72,6 +71,4 @@ static int __init blake2s_mod_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(blake2s_mod_init);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
subsys_initcall(blake2s_mod_init);
|
||||
|
@ -330,8 +330,8 @@ void noinline callthunks_patch_module_calls(struct callthunk_sites *cs,
|
||||
struct module *mod)
|
||||
{
|
||||
struct core_text ct = {
|
||||
.base = (unsigned long)mod->core_layout.base,
|
||||
.end = (unsigned long)mod->core_layout.base + mod->core_layout.size,
|
||||
.base = (unsigned long)mod->mem[MOD_TEXT].base,
|
||||
.end = (unsigned long)mod->mem[MOD_TEXT].base + mod->mem[MOD_TEXT].size,
|
||||
.name = mod->name,
|
||||
};
|
||||
|
||||
|
@ -1177,7 +1177,7 @@ static const struct {
|
||||
static struct ratelimit_state bld_ratelimit;
|
||||
|
||||
static unsigned int sysctl_sld_mitigate = 1;
|
||||
static DEFINE_SEMAPHORE(buslock_sem);
|
||||
static DEFINE_SEMAPHORE(buslock_sem, 1);
|
||||
|
||||
#ifdef CONFIG_PROC_SYSCTL
|
||||
static struct ctl_table sld_sysctls[] = {
|
||||
|
@ -362,8 +362,8 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
}
|
||||
if (locks) {
|
||||
void *lseg = (void *)locks->sh_addr;
|
||||
void *text = me->core_layout.base;
|
||||
void *text_end = text + me->core_layout.text_size;
|
||||
void *text = me->mem[MOD_TEXT].base;
|
||||
void *text_end = text + me->mem[MOD_TEXT].size;
|
||||
alternatives_smp_module_add(me, me->name,
|
||||
lseg, lseg + locks->sh_size,
|
||||
text, text_end);
|
||||
|
@ -71,6 +71,5 @@ static void __exit pt_dump_debug_exit(void)
|
||||
|
||||
module_init(pt_dump_debug_init);
|
||||
module_exit(pt_dump_debug_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>");
|
||||
MODULE_DESCRIPTION("Kernel debugging helper that dumps pagetables");
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include <keys/user-type.h>
|
||||
#include "asymmetric_keys.h"
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
const char *const key_being_used_for[NR__KEY_BEING_USED_FOR] = {
|
||||
[VERIFYING_MODULE_SIGNATURE] = "mod sig",
|
||||
|
@ -24,7 +24,6 @@
|
||||
|
||||
MODULE_AUTHOR("samuel.thibault@ens-lyon.org");
|
||||
MODULE_DESCRIPTION("braille device");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/*
|
||||
* Braille device support part.
|
||||
|
@ -126,4 +126,3 @@ static struct platform_driver integrator_ap_lm_driver = {
|
||||
module_platform_driver(integrator_ap_lm_driver);
|
||||
MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
|
||||
MODULE_DESCRIPTION("Integrator AP Logical Module driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -416,4 +416,3 @@ module_platform_driver(bt1_apb_driver);
|
||||
|
||||
MODULE_AUTHOR("Serge Semin <Sergey.Semin@baikalelectronics.ru>");
|
||||
MODULE_DESCRIPTION("Baikal-T1 APB-bus driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -309,4 +309,3 @@ module_platform_driver(bt1_axi_driver);
|
||||
|
||||
MODULE_AUTHOR("Serge Semin <Sergey.Semin@baikalelectronics.ru>");
|
||||
MODULE_DESCRIPTION("Baikal-T1 AXI-bus driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -423,4 +423,3 @@ static struct platform_driver ixp4xx_exp_driver = {
|
||||
module_platform_driver(ixp4xx_exp_driver);
|
||||
MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
|
||||
MODULE_DESCRIPTION("Intel IXP4xx external bus driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -403,4 +403,3 @@ static struct platform_driver qcom_ebi2_driver = {
|
||||
module_platform_driver(qcom_ebi2_driver);
|
||||
MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
|
||||
MODULE_DESCRIPTION("Qualcomm EBI2 driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -386,4 +386,3 @@ module_platform_driver(qcom_ssc_block_bus_driver);
|
||||
|
||||
MODULE_DESCRIPTION("A driver for handling the init sequence needed for accessing the SSC block on (some) qcom SoCs over AHB");
|
||||
MODULE_AUTHOR("Michael Srba <Michael.Srba@seznam.cz>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Simple Power-Managed Bus Driver
|
||||
*
|
||||
@ -138,4 +139,3 @@ module_platform_driver(simple_pm_bus_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Simple Power-Managed Bus Driver");
|
||||
MODULE_AUTHOR("Geert Uytterhoeven <geert+renesas@glider.be>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -949,4 +949,3 @@ module_platform_driver(bm1880_clk_driver);
|
||||
|
||||
MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
|
||||
MODULE_DESCRIPTION("Clock driver for Bitmain BM1880 SoC");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -513,4 +513,3 @@ MODULE_DESCRIPTION("Microchip PolarFire SoC Clock Driver");
|
||||
MODULE_AUTHOR("Padmarao Begari <padmarao.begari@microchip.com>");
|
||||
MODULE_AUTHOR("Daire McNamara <daire.mcnamara@microchip.com>");
|
||||
MODULE_AUTHOR("Conor Dooley <conor.dooley@microchip.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1127,4 +1127,3 @@ void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks,
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Renesas CPG/MSSR Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1440,4 +1440,3 @@ static int __init rzg2l_cpg_init(void)
|
||||
subsys_initcall(rzg2l_cpg_init);
|
||||
|
||||
MODULE_DESCRIPTION("Renesas RZ/G2L CPG Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -363,4 +363,3 @@ module_exit(em_sti_exit);
|
||||
|
||||
MODULE_AUTHOR("Magnus Damm");
|
||||
MODULE_DESCRIPTION("Renesas Emma Mobile STI Timer Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1174,4 +1174,3 @@ module_exit(sh_cmt_exit);
|
||||
|
||||
MODULE_AUTHOR("Magnus Damm");
|
||||
MODULE_DESCRIPTION("SuperH CMT Timer Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -530,4 +530,3 @@ module_exit(sh_mtu2_exit);
|
||||
|
||||
MODULE_AUTHOR("Magnus Damm");
|
||||
MODULE_DESCRIPTION("SuperH MTU2 Timer Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -674,4 +674,3 @@ module_exit(sh_tmu_exit);
|
||||
|
||||
MODULE_AUTHOR("Magnus Damm");
|
||||
MODULE_DESCRIPTION("SuperH TMU Timer Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -218,4 +218,3 @@ module_platform_driver(stm32_clkevent_lp_driver);
|
||||
|
||||
MODULE_ALIAS("platform:stm32-lptimer-timer");
|
||||
MODULE_DESCRIPTION("STMicroelectronics STM32 clockevent low power driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -511,4 +511,3 @@ module_platform_driver(tegra186_wdt_driver);
|
||||
|
||||
MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
|
||||
MODULE_DESCRIPTION("NVIDIA Tegra186 timers driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1283,5 +1283,4 @@ static struct platform_driver omap_dm_timer_driver = {
|
||||
module_platform_driver(omap_dm_timer_driver);
|
||||
|
||||
MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Texas Instruments Inc");
|
||||
|
@ -407,4 +407,3 @@ static int add_default_cma_heap(void)
|
||||
}
|
||||
module_init(add_default_cma_heap);
|
||||
MODULE_DESCRIPTION("DMA-BUF CMA Heap");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -440,4 +440,3 @@ static int system_heap_create(void)
|
||||
return 0;
|
||||
}
|
||||
module_init(system_heap_create);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -430,4 +430,3 @@ module_init(udmabuf_dev_init)
|
||||
module_exit(udmabuf_dev_exit)
|
||||
|
||||
MODULE_AUTHOR("Gerd Hoffmann <kraxel@redhat.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1431,4 +1431,3 @@ subsys_initcall(ep93xx_dma_module_init);
|
||||
|
||||
MODULE_AUTHOR("Mika Westerberg <mika.westerberg@iki.fi>");
|
||||
MODULE_DESCRIPTION("EP93xx DMA driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1797,6 +1797,5 @@ static int __init ipu_init(void)
|
||||
subsys_initcall(ipu_init);
|
||||
|
||||
MODULE_DESCRIPTION("IPU core driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Guennadi Liakhovetski <lg@denx.de>");
|
||||
MODULE_ALIAS("platform:ipu-core");
|
||||
|
@ -917,4 +917,3 @@ static struct platform_driver mv_xor_v2_driver = {
|
||||
module_platform_driver(mv_xor_v2_driver);
|
||||
|
||||
MODULE_DESCRIPTION("DMA engine driver for Marvell's Version 2 of XOR engine");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1047,6 +1047,5 @@ static void __exit shdma_exit(void)
|
||||
}
|
||||
module_exit(shdma_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("SH-DMA driver base library");
|
||||
MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
|
||||
|
@ -398,4 +398,3 @@ arch_initcall(stm32_dmamux_init);
|
||||
MODULE_DESCRIPTION("DMA Router driver for STM32 DMA MUX");
|
||||
MODULE_AUTHOR("M'boumba Cedric Madianga <cedric.madianga@gmail.com>");
|
||||
MODULE_AUTHOR("Pierre-Yves Mordret <pierre-yves.mordret@st.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1814,4 +1814,3 @@ subsys_initcall(stm32_mdma_init);
|
||||
MODULE_DESCRIPTION("Driver for STM32 MDMA controller");
|
||||
MODULE_AUTHOR("M'boumba Cedric Madianga <cedric.madianga@gmail.com>");
|
||||
MODULE_AUTHOR("Pierre-Yves Mordret <pierre-yves.mordret@st.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -255,4 +255,3 @@ char *bcm47xx_nvram_get_contents(size_t *nvram_size)
|
||||
}
|
||||
EXPORT_SYMBOL(bcm47xx_nvram_get_contents);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -158,7 +158,7 @@ void efi_call_virt_check_flags(unsigned long flags, const char *call)
|
||||
* none of the remaining functions are actually ever called at runtime.
|
||||
* So let's just use a single lock to serialize all Runtime Services calls.
|
||||
*/
|
||||
static DEFINE_SEMAPHORE(efi_runtime_lock);
|
||||
static DEFINE_SEMAPHORE(efi_runtime_lock, 1);
|
||||
|
||||
/*
|
||||
* Expose the EFI runtime lock to the UV platform
|
||||
|
@ -21,7 +21,7 @@
|
||||
/* Private pointer to registered efivars */
|
||||
static struct efivars *__efivars;
|
||||
|
||||
static DEFINE_SEMAPHORE(efivars_lock);
|
||||
static DEFINE_SEMAPHORE(efivars_lock, 1);
|
||||
|
||||
static efi_status_t check_var_size(bool nonblocking, u32 attributes,
|
||||
unsigned long size)
|
||||
|
@ -949,6 +949,5 @@ struct hwspinlock *devm_hwspin_lock_request_specific(struct device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_hwspin_lock_request_specific);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("Hardware spinlock interface");
|
||||
MODULE_AUTHOR("Ohad Ben-Cohen <ohad@wizery.com>");
|
||||
|
@ -62,11 +62,6 @@ MODULE_AUTHOR("Roland Dreier");
|
||||
MODULE_DESCRIPTION("InfiniBand SCSI RDMA Protocol initiator");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
#if !defined(CONFIG_DYNAMIC_DEBUG)
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)
|
||||
#define DYNAMIC_DEBUG_BRANCH(descriptor) false
|
||||
#endif
|
||||
|
||||
static unsigned int srp_sg_tablesize;
|
||||
static unsigned int cmd_sg_entries;
|
||||
static unsigned int indirect_sg_entries;
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/interconnect.h>
|
||||
#include <linux/interconnect-provider.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
@ -1106,7 +1105,3 @@ static int __init icc_init(void)
|
||||
}
|
||||
|
||||
device_initcall(icc_init);
|
||||
|
||||
MODULE_AUTHOR("Georgi Djakov <georgi.djakov@linaro.org>");
|
||||
MODULE_DESCRIPTION("Interconnect Driver Core");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1076,4 +1076,3 @@ builtin_platform_driver_probe(sun50i_iommu_driver, sun50i_iommu_probe);
|
||||
MODULE_DESCRIPTION("Allwinner H6 IOMMU driver");
|
||||
MODULE_AUTHOR("Maxime Ripard <maxime@cerno.tech>");
|
||||
MODULE_AUTHOR("zhuxianbin <zhuxianbin@allwinnertech.com>");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -26,7 +26,6 @@
|
||||
|
||||
MODULE_AUTHOR("Talel Shenhar");
|
||||
MODULE_DESCRIPTION("Amazon's Annapurna Labs Interrupt Controller Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
enum al_fic_state {
|
||||
AL_FIC_UNCONFIGURED = 0,
|
||||
|
@ -430,4 +430,3 @@ module_platform_driver(ls_scfg_msi_driver);
|
||||
|
||||
MODULE_AUTHOR("Minghuan Lian <Minghuan.Lian@nxp.com>");
|
||||
MODULE_DESCRIPTION("Freescale Layerscape SCFG MSI controller driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -392,5 +392,4 @@ module_platform_driver(mbigen_platform_driver);
|
||||
|
||||
MODULE_AUTHOR("Jun Ma <majun258@huawei.com>");
|
||||
MODULE_AUTHOR("Yun Wu <wuyun.wu@huawei.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("HiSilicon MBI Generator driver");
|
||||
|
@ -276,5 +276,4 @@ IRQCHIP_MATCH("microchip,sama7g5-eic", mchp_eic_init)
|
||||
IRQCHIP_PLATFORM_DRIVER_END(mchp_eic)
|
||||
|
||||
MODULE_DESCRIPTION("Microchip External Interrupt Controller");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Claudiu Beznea <claudiu.beznea@microchip.com>");
|
||||
|
@ -608,4 +608,3 @@ module_exit(intc_irqpin_exit);
|
||||
|
||||
MODULE_AUTHOR("Magnus Damm");
|
||||
MODULE_DESCRIPTION("Renesas INTC External IRQ Pin Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -270,4 +270,3 @@ module_exit(irqc_exit);
|
||||
|
||||
MODULE_AUTHOR("Magnus Damm");
|
||||
MODULE_DESCRIPTION("Renesas IRQC Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -281,4 +281,3 @@ module_exit(rza1_irqc_exit);
|
||||
|
||||
MODULE_AUTHOR("Geert Uytterhoeven <geert+renesas@glider.be>");
|
||||
MODULE_DESCRIPTION("Renesas RZ/A1 IRQC Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -390,4 +390,3 @@ IRQCHIP_MATCH("renesas,rzg2l-irqc", rzg2l_irqc_init)
|
||||
IRQCHIP_PLATFORM_DRIVER_END(rzg2l_irqc)
|
||||
MODULE_AUTHOR("Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>");
|
||||
MODULE_DESCRIPTION("Renesas RZ/G2L IRQC Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -92,4 +92,3 @@ module_platform_driver(sl28cpld_intc_driver);
|
||||
|
||||
MODULE_DESCRIPTION("sl28cpld Interrupt Controller Driver");
|
||||
MODULE_AUTHOR("Michael Walle <michael@walle.cc>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -743,4 +743,3 @@ module_platform_driver(ti_sci_inta_irq_domain_driver);
|
||||
|
||||
MODULE_AUTHOR("Lokesh Vutla <lokeshvutla@ti.com>");
|
||||
MODULE_DESCRIPTION("K3 Interrupt Aggregator driver over TI SCI protocol");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -303,4 +303,3 @@ module_platform_driver(ti_sci_intr_irq_domain_driver);
|
||||
|
||||
MODULE_AUTHOR("Lokesh Vutla <lokeshvutla@ticom>");
|
||||
MODULE_DESCRIPTION("K3 Interrupt Router driver over TI SCI protocol");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -80,7 +80,7 @@ static struct adb_driver *adb_controller;
|
||||
BLOCKING_NOTIFIER_HEAD(adb_client_list);
|
||||
static int adb_got_sleep;
|
||||
static int adb_inited;
|
||||
static DEFINE_SEMAPHORE(adb_probe_mutex);
|
||||
static DEFINE_SEMAPHORE(adb_probe_mutex, 1);
|
||||
static int sleepy_trackpad;
|
||||
static int autopoll_devs;
|
||||
int __adb_probe_sync;
|
||||
|
@ -259,7 +259,7 @@ config MTK_CMDQ_MBOX
|
||||
during the vblank.
|
||||
|
||||
config ZYNQMP_IPI_MBOX
|
||||
bool "Xilinx ZynqMP IPI Mailbox"
|
||||
tristate "Xilinx ZynqMP IPI Mailbox"
|
||||
depends on ARCH_ZYNQMP && OF
|
||||
help
|
||||
Say yes here to add support for Xilinx IPI mailbox driver.
|
||||
|
@ -254,7 +254,6 @@ static struct platform_driver rockchip_mbox_driver = {
|
||||
|
||||
module_platform_driver(rockchip_mbox_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("Rockchip mailbox: communicate between CPU cores and MCU");
|
||||
MODULE_AUTHOR("Addy Ke <addy.ke@rock-chips.com>");
|
||||
MODULE_AUTHOR("Caesar Wang <wxt@rock-chips.com>");
|
||||
|
@ -198,4 +198,3 @@ module_exit(altr_sysmgr_exit);
|
||||
|
||||
MODULE_AUTHOR("Thor Thayer <>");
|
||||
MODULE_DESCRIPTION("SOCFPGA System Manager driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -297,7 +297,7 @@ const u32 dmae_reg_go_c[] = {
|
||||
|
||||
/* Global resources for unloading a previously loaded device */
|
||||
#define BNX2X_PREV_WAIT_NEEDED 1
|
||||
static DEFINE_SEMAPHORE(bnx2x_prev_sem);
|
||||
static DEFINE_SEMAPHORE(bnx2x_prev_sem, 1);
|
||||
static LIST_HEAD(bnx2x_prev_list);
|
||||
|
||||
/* Forward declaration */
|
||||
|
@ -2111,4 +2111,3 @@ module_exit(nvmem_exit);
|
||||
MODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org");
|
||||
MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com");
|
||||
MODULE_DESCRIPTION("nvmem Driver Core");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -616,4 +616,3 @@ static struct platform_driver intel_cbphy_driver = {
|
||||
module_platform_driver(intel_cbphy_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel Combo-phy driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1724,4 +1724,3 @@ module_exit(s500_pinctrl_exit);
|
||||
MODULE_AUTHOR("Actions Semi Inc.");
|
||||
MODULE_AUTHOR("Cristian Ciocaltea <cristian.ciocaltea@gmail.com>");
|
||||
MODULE_DESCRIPTION("Actions Semi S500 SoC Pinctrl Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1908,4 +1908,3 @@ module_exit(s700_pinctrl_exit);
|
||||
|
||||
MODULE_AUTHOR("Actions Semi Inc.");
|
||||
MODULE_DESCRIPTION("Actions Semi S700 Soc Pinctrl Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1827,4 +1827,3 @@ module_exit(s900_pinctrl_exit);
|
||||
MODULE_AUTHOR("Actions Semi Inc.");
|
||||
MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
|
||||
MODULE_DESCRIPTION("Actions Semi S900 SoC Pinctrl Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -299,5 +299,4 @@ static struct platform_driver ns_pinctrl_driver = {
|
||||
module_platform_driver(ns_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Rafał Miłecki");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DEVICE_TABLE(of, ns_pinctrl_of_match_table);
|
||||
|
@ -1670,5 +1670,4 @@ static int __init mt8188_pinctrl_init(void)
|
||||
|
||||
arch_initcall(mt8188_pinctrl_init);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("MediaTek MT8188 Pinctrl Driver");
|
||||
|
@ -1431,5 +1431,4 @@ static int __init mt8192_pinctrl_init(void)
|
||||
}
|
||||
arch_initcall(mt8192_pinctrl_init);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("MediaTek MT8192 Pinctrl Driver");
|
||||
|
@ -495,6 +495,5 @@ static int __init mtk_pinctrl_init(void)
|
||||
}
|
||||
arch_initcall(mtk_pinctrl_init);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("MediaTek MT8365 Pinctrl Driver");
|
||||
MODULE_AUTHOR("Zhiyong Tao <zhiyong.tao@mediatek.com>");
|
||||
|
@ -2046,7 +2046,6 @@ static int __init npcm7xx_pinctrl_register(void)
|
||||
}
|
||||
arch_initcall(npcm7xx_pinctrl_register);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("jordan_hargrave@dell.com");
|
||||
MODULE_AUTHOR("tomer.maimon@nuvoton.com");
|
||||
MODULE_DESCRIPTION("Nuvoton NPCM7XX Pinctrl and GPIO driver");
|
||||
|
@ -1213,6 +1213,5 @@ static struct platform_driver amd_gpio_driver = {
|
||||
|
||||
module_platform_driver(amd_gpio_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Ken Xue <Ken.Xue@amd.com>, Jeff Wu <Jeff.Wu@amd.com>");
|
||||
MODULE_DESCRIPTION("AMD GPIO pinctrl driver");
|
||||
|
@ -1407,4 +1407,3 @@ core_initcall(rza1_pinctrl_init);
|
||||
|
||||
MODULE_AUTHOR("Jacopo Mondi <jacopo+renesas@jmondi.org");
|
||||
MODULE_DESCRIPTION("Pin and gpio controller driver for Reneas RZ/A1 SoC");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -514,4 +514,3 @@ core_initcall(rza2_pinctrl_init);
|
||||
|
||||
MODULE_AUTHOR("Chris Brandt <chris.brandt@renesas.com>");
|
||||
MODULE_DESCRIPTION("Pin and gpio controller driver for RZ/A2 SoC");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1570,4 +1570,3 @@ core_initcall(rzg2l_pinctrl_init);
|
||||
|
||||
MODULE_AUTHOR("Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>");
|
||||
MODULE_DESCRIPTION("Pin and gpio controller driver for RZ/G2L family");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -952,4 +952,3 @@ subsys_initcall(_pinctrl_drv_register);
|
||||
|
||||
MODULE_AUTHOR("Phil Edworthy <phil.edworthy@renesas.com>");
|
||||
MODULE_DESCRIPTION("Renesas RZ/N1 pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1117,4 +1117,3 @@ core_initcall(rzv2m_pinctrl_init);
|
||||
|
||||
MODULE_AUTHOR("Phil Edworthy <phil.edworthy@renesas.com>");
|
||||
MODULE_DESCRIPTION("Pin and gpio controller driver for RZ/V2M");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -13,7 +13,7 @@
|
||||
* Protects against simultaneous tests on multiple cores, or
|
||||
* reloading can file while a test is in progress
|
||||
*/
|
||||
static DEFINE_SEMAPHORE(ifs_sem);
|
||||
static DEFINE_SEMAPHORE(ifs_sem, 1);
|
||||
|
||||
/*
|
||||
* The sysfs interface to check additional details of last test
|
||||
|
@ -84,4 +84,3 @@ module_platform_driver(as3722_poweroff_driver);
|
||||
MODULE_DESCRIPTION("Power off driver for ams AS3722 PMIC Device");
|
||||
MODULE_ALIAS("platform:as3722-power-off");
|
||||
MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -105,5 +105,4 @@ module_platform_driver(gpio_poweroff_driver);
|
||||
|
||||
MODULE_AUTHOR("Jamie Lentin <jm@lentin.co.uk>");
|
||||
MODULE_DESCRIPTION("GPIO poweroff driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:poweroff-gpio");
|
||||
|
@ -139,4 +139,3 @@ module_platform_driver(gpio_restart_driver);
|
||||
|
||||
MODULE_AUTHOR("David Riley <davidriley@chromium.org>");
|
||||
MODULE_DESCRIPTION("GPIO restart driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -169,5 +169,4 @@ module_platform_driver(rsctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>");
|
||||
MODULE_DESCRIPTION("Texas Instruments keystone reset driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:" KBUILD_MODNAME);
|
||||
|
@ -317,4 +317,3 @@ module_platform_driver(ltc2952_poweroff_driver);
|
||||
|
||||
MODULE_AUTHOR("René Moll <rene.moll@xsens.com>");
|
||||
MODULE_DESCRIPTION("LTC PowerPath power-off driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -97,4 +97,3 @@ module_platform_driver(mt6323_pwrc_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Poweroff driver for MT6323 PMIC");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -79,5 +79,4 @@ module_platform_driver(regulator_poweroff_driver);
|
||||
|
||||
MODULE_AUTHOR("Michael Klein <michael@fossekall.de>");
|
||||
MODULE_DESCRIPTION("Regulator poweroff driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:poweroff-regulator");
|
||||
|
@ -59,5 +59,4 @@ module_platform_driver(restart_poweroff_driver);
|
||||
|
||||
MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch");
|
||||
MODULE_DESCRIPTION("restart poweroff driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:poweroff-restart");
|
||||
|
@ -95,4 +95,3 @@ module_platform_driver(tps65086_restart_driver);
|
||||
|
||||
MODULE_AUTHOR("Emil Renner Berthing <kernel@esmil.dk>");
|
||||
MODULE_DESCRIPTION("TPS65086 restart driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1485,4 +1485,3 @@ MODULE_DESCRIPTION("Universal power supply monitor class");
|
||||
MODULE_AUTHOR("Ian Molton <spyro@f2s.com>, "
|
||||
"Szabolcs Gyurko, "
|
||||
"Anton Vorontsov <cbou@mail.ru>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -271,6 +271,5 @@ static struct platform_driver wm97xx_bat_driver = {
|
||||
|
||||
module_platform_driver(wm97xx_bat_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
|
||||
MODULE_DESCRIPTION("WM97xx battery driver");
|
||||
|
@ -183,4 +183,3 @@ module_platform_driver(stm32_pwr_driver);
|
||||
|
||||
MODULE_DESCRIPTION("STM32MP1 PWR voltage regulator driver");
|
||||
MODULE_AUTHOR("Pascal Paillet <p.paillet@st.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user