15d6d1dddSLuis R. Rodriguez // SPDX-License-Identifier: GPL-2.0
25d6d1dddSLuis R. Rodriguez
35d6d1dddSLuis R. Rodriguez #include <linux/types.h>
45d6d1dddSLuis R. Rodriguez #include <linux/kconfig.h>
55d6d1dddSLuis R. Rodriguez #include <linux/list.h>
65d6d1dddSLuis R. Rodriguez #include <linux/slab.h>
76aad36d4SXiaoming Ni #include <linux/export.h>
85d6d1dddSLuis R. Rodriguez #include <linux/security.h>
95d6d1dddSLuis R. Rodriguez #include <linux/highmem.h>
105d6d1dddSLuis R. Rodriguez #include <linux/umh.h>
115d6d1dddSLuis R. Rodriguez #include <linux/sysctl.h>
125d6d1dddSLuis R. Rodriguez
135d6d1dddSLuis R. Rodriguez #include "fallback.h"
145d6d1dddSLuis R. Rodriguez #include "firmware.h"
155d6d1dddSLuis R. Rodriguez
165d6d1dddSLuis R. Rodriguez /*
175d6d1dddSLuis R. Rodriguez * firmware fallback configuration table
185d6d1dddSLuis R. Rodriguez */
195d6d1dddSLuis R. Rodriguez
205d6d1dddSLuis R. Rodriguez struct firmware_fallback_config fw_fallback_config = {
215d6d1dddSLuis R. Rodriguez .force_sysfs_fallback = IS_ENABLED(CONFIG_FW_LOADER_USER_HELPER_FALLBACK),
225d6d1dddSLuis R. Rodriguez .loading_timeout = 60,
235d6d1dddSLuis R. Rodriguez .old_timeout = 60,
245d6d1dddSLuis R. Rodriguez };
25cdd30ebbSPeter Zijlstra EXPORT_SYMBOL_NS_GPL(fw_fallback_config, "FIRMWARE_LOADER_PRIVATE");
265d6d1dddSLuis R. Rodriguez
27eec4844fSMatteo Croce #ifdef CONFIG_SYSCTL
28*1751f872SJoel Granados static const struct ctl_table firmware_config_table[] = {
29ceb18132SLuis R. Rodriguez {
30ceb18132SLuis R. Rodriguez .procname = "force_sysfs_fallback",
31ceb18132SLuis R. Rodriguez .data = &fw_fallback_config.force_sysfs_fallback,
32ceb18132SLuis R. Rodriguez .maxlen = sizeof(unsigned int),
33ceb18132SLuis R. Rodriguez .mode = 0644,
34ceb18132SLuis R. Rodriguez .proc_handler = proc_douintvec_minmax,
35eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO,
36eec4844fSMatteo Croce .extra2 = SYSCTL_ONE,
37ceb18132SLuis R. Rodriguez },
382cd7a1c6SLuis R. Rodriguez {
392cd7a1c6SLuis R. Rodriguez .procname = "ignore_sysfs_fallback",
402cd7a1c6SLuis R. Rodriguez .data = &fw_fallback_config.ignore_sysfs_fallback,
412cd7a1c6SLuis R. Rodriguez .maxlen = sizeof(unsigned int),
422cd7a1c6SLuis R. Rodriguez .mode = 0644,
432cd7a1c6SLuis R. Rodriguez .proc_handler = proc_douintvec_minmax,
44eec4844fSMatteo Croce .extra1 = SYSCTL_ZERO,
45eec4844fSMatteo Croce .extra2 = SYSCTL_ONE,
462cd7a1c6SLuis R. Rodriguez },
47ceb18132SLuis R. Rodriguez };
486aad36d4SXiaoming Ni
496aad36d4SXiaoming Ni static struct ctl_table_header *firmware_config_sysct_table_header;
register_firmware_config_sysctl(void)506aad36d4SXiaoming Ni int register_firmware_config_sysctl(void)
516aad36d4SXiaoming Ni {
526aad36d4SXiaoming Ni firmware_config_sysct_table_header =
536aad36d4SXiaoming Ni register_sysctl("kernel/firmware_config",
546aad36d4SXiaoming Ni firmware_config_table);
556aad36d4SXiaoming Ni if (!firmware_config_sysct_table_header)
566aad36d4SXiaoming Ni return -ENOMEM;
576aad36d4SXiaoming Ni return 0;
586aad36d4SXiaoming Ni }
59cdd30ebbSPeter Zijlstra EXPORT_SYMBOL_NS_GPL(register_firmware_config_sysctl, "FIRMWARE_LOADER_PRIVATE");
606aad36d4SXiaoming Ni
unregister_firmware_config_sysctl(void)616aad36d4SXiaoming Ni void unregister_firmware_config_sysctl(void)
626aad36d4SXiaoming Ni {
636aad36d4SXiaoming Ni unregister_sysctl_table(firmware_config_sysct_table_header);
646aad36d4SXiaoming Ni firmware_config_sysct_table_header = NULL;
656aad36d4SXiaoming Ni }
66cdd30ebbSPeter Zijlstra EXPORT_SYMBOL_NS_GPL(unregister_firmware_config_sysctl, "FIRMWARE_LOADER_PRIVATE");
676aad36d4SXiaoming Ni
686aad36d4SXiaoming Ni #endif /* CONFIG_SYSCTL */
69