162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/types.h>
462306a36Sopenharmony_ci#include <linux/kconfig.h>
562306a36Sopenharmony_ci#include <linux/list.h>
662306a36Sopenharmony_ci#include <linux/slab.h>
762306a36Sopenharmony_ci#include <linux/export.h>
862306a36Sopenharmony_ci#include <linux/security.h>
962306a36Sopenharmony_ci#include <linux/highmem.h>
1062306a36Sopenharmony_ci#include <linux/umh.h>
1162306a36Sopenharmony_ci#include <linux/sysctl.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "fallback.h"
1462306a36Sopenharmony_ci#include "firmware.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/*
1762306a36Sopenharmony_ci * firmware fallback configuration table
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct firmware_fallback_config fw_fallback_config = {
2162306a36Sopenharmony_ci	.force_sysfs_fallback = IS_ENABLED(CONFIG_FW_LOADER_USER_HELPER_FALLBACK),
2262306a36Sopenharmony_ci	.loading_timeout = 60,
2362306a36Sopenharmony_ci	.old_timeout = 60,
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ciEXPORT_SYMBOL_NS_GPL(fw_fallback_config, FIRMWARE_LOADER_PRIVATE);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#ifdef CONFIG_SYSCTL
2862306a36Sopenharmony_cistatic struct ctl_table firmware_config_table[] = {
2962306a36Sopenharmony_ci	{
3062306a36Sopenharmony_ci		.procname	= "force_sysfs_fallback",
3162306a36Sopenharmony_ci		.data		= &fw_fallback_config.force_sysfs_fallback,
3262306a36Sopenharmony_ci		.maxlen         = sizeof(unsigned int),
3362306a36Sopenharmony_ci		.mode           = 0644,
3462306a36Sopenharmony_ci		.proc_handler   = proc_douintvec_minmax,
3562306a36Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
3662306a36Sopenharmony_ci		.extra2		= SYSCTL_ONE,
3762306a36Sopenharmony_ci	},
3862306a36Sopenharmony_ci	{
3962306a36Sopenharmony_ci		.procname	= "ignore_sysfs_fallback",
4062306a36Sopenharmony_ci		.data		= &fw_fallback_config.ignore_sysfs_fallback,
4162306a36Sopenharmony_ci		.maxlen         = sizeof(unsigned int),
4262306a36Sopenharmony_ci		.mode           = 0644,
4362306a36Sopenharmony_ci		.proc_handler   = proc_douintvec_minmax,
4462306a36Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
4562306a36Sopenharmony_ci		.extra2		= SYSCTL_ONE,
4662306a36Sopenharmony_ci	},
4762306a36Sopenharmony_ci	{ }
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic struct ctl_table_header *firmware_config_sysct_table_header;
5162306a36Sopenharmony_ciint register_firmware_config_sysctl(void)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	firmware_config_sysct_table_header =
5462306a36Sopenharmony_ci		register_sysctl("kernel/firmware_config",
5562306a36Sopenharmony_ci				firmware_config_table);
5662306a36Sopenharmony_ci	if (!firmware_config_sysct_table_header)
5762306a36Sopenharmony_ci		return -ENOMEM;
5862306a36Sopenharmony_ci	return 0;
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ciEXPORT_SYMBOL_NS_GPL(register_firmware_config_sysctl, FIRMWARE_LOADER_PRIVATE);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_civoid unregister_firmware_config_sysctl(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	unregister_sysctl_table(firmware_config_sysct_table_header);
6562306a36Sopenharmony_ci	firmware_config_sysct_table_header = NULL;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ciEXPORT_SYMBOL_NS_GPL(unregister_firmware_config_sysctl, FIRMWARE_LOADER_PRIVATE);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#endif /* CONFIG_SYSCTL */
70