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