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