xref: /linux/drivers/base/firmware_loader/fallback_table.c (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
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>
7*6aad36d4SXiaoming 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 };
2548ebea50SLuis Chamberlain EXPORT_SYMBOL_NS_GPL(fw_fallback_config, FIRMWARE_LOADER_PRIVATE);
265d6d1dddSLuis R. Rodriguez 
27eec4844fSMatteo Croce #ifdef CONFIG_SYSCTL
28*6aad36d4SXiaoming Ni static 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 };
48*6aad36d4SXiaoming Ni 
49*6aad36d4SXiaoming Ni static struct ctl_table_header *firmware_config_sysct_table_header;
register_firmware_config_sysctl(void)50*6aad36d4SXiaoming Ni int register_firmware_config_sysctl(void)
51*6aad36d4SXiaoming Ni {
52*6aad36d4SXiaoming Ni 	firmware_config_sysct_table_header =
53*6aad36d4SXiaoming Ni 		register_sysctl("kernel/firmware_config",
54*6aad36d4SXiaoming Ni 				firmware_config_table);
55*6aad36d4SXiaoming Ni 	if (!firmware_config_sysct_table_header)
56*6aad36d4SXiaoming Ni 		return -ENOMEM;
57*6aad36d4SXiaoming Ni 	return 0;
58*6aad36d4SXiaoming Ni }
59*6aad36d4SXiaoming Ni EXPORT_SYMBOL_NS_GPL(register_firmware_config_sysctl, FIRMWARE_LOADER_PRIVATE);
60*6aad36d4SXiaoming Ni 
unregister_firmware_config_sysctl(void)61*6aad36d4SXiaoming Ni void unregister_firmware_config_sysctl(void)
62*6aad36d4SXiaoming Ni {
63*6aad36d4SXiaoming Ni 	unregister_sysctl_table(firmware_config_sysct_table_header);
64*6aad36d4SXiaoming Ni 	firmware_config_sysct_table_header = NULL;
65*6aad36d4SXiaoming Ni }
66*6aad36d4SXiaoming Ni EXPORT_SYMBOL_NS_GPL(unregister_firmware_config_sysctl, FIRMWARE_LOADER_PRIVATE);
67*6aad36d4SXiaoming Ni 
68*6aad36d4SXiaoming Ni #endif /* CONFIG_SYSCTL */
69