diff options
Diffstat (limited to 'lib/test_firmware.c')
| -rw-r--r-- | lib/test_firmware.c | 55 | 
1 files changed, 52 insertions, 3 deletions
diff --git a/lib/test_firmware.c b/lib/test_firmware.c index 83ea6c4e623c..251213c872b5 100644 --- a/lib/test_firmware.c +++ b/lib/test_firmware.c @@ -18,6 +18,7 @@  #include <linux/device.h>  #include <linux/fs.h>  #include <linux/miscdevice.h> +#include <linux/sizes.h>  #include <linux/slab.h>  #include <linux/uaccess.h>  #include <linux/delay.h> @@ -26,6 +27,7 @@  #define TEST_FIRMWARE_NAME	"test-firmware.bin"  #define TEST_FIRMWARE_NUM_REQS	4 +#define TEST_FIRMWARE_BUF_SIZE	SZ_1K  static DEFINE_MUTEX(test_fw_mutex);  static const struct firmware *test_firmware; @@ -45,6 +47,8 @@ struct test_batched_req {   * test_config - represents configuration for the test for different triggers   *   * @name: the name of the firmware file to look for + * @into_buf: when the into_buf is used if this is true + *	request_firmware_into_buf() will be used instead.   * @sync_direct: when the sync trigger is used if this is true   *	request_firmware_direct() will be used instead.   * @send_uevent: whether or not to send a uevent for async requests @@ -83,6 +87,7 @@ struct test_batched_req {   */  struct test_config {  	char *name; +	bool into_buf;  	bool sync_direct;  	bool send_uevent;  	u8 num_requests; @@ -176,6 +181,7 @@ static int __test_firmware_config_init(void)  	test_fw_config->num_requests = TEST_FIRMWARE_NUM_REQS;  	test_fw_config->send_uevent = true; +	test_fw_config->into_buf = false;  	test_fw_config->sync_direct = false;  	test_fw_config->req_firmware = request_firmware;  	test_fw_config->test_result = 0; @@ -245,6 +251,9 @@ static ssize_t config_show(struct device *dev,  			"FW_ACTION_HOTPLUG" :  			"FW_ACTION_NOHOTPLUG");  	len += scnprintf(buf+len, PAGE_SIZE - len, +			"into_buf:\t\t%s\n", +			test_fw_config->into_buf ? "true" : "false"); +	len += scnprintf(buf+len, PAGE_SIZE - len,  			"sync_direct:\t\t%s\n",  			test_fw_config->sync_direct ? "true" : "false");  	len += scnprintf(buf+len, PAGE_SIZE - len, @@ -393,6 +402,23 @@ static ssize_t config_num_requests_show(struct device *dev,  }  static DEVICE_ATTR_RW(config_num_requests); +static ssize_t config_into_buf_store(struct device *dev, +				     struct device_attribute *attr, +				     const char *buf, size_t count) +{ +	return test_dev_config_update_bool(buf, +					   count, +					   &test_fw_config->into_buf); +} + +static ssize_t config_into_buf_show(struct device *dev, +				    struct device_attribute *attr, +				    char *buf) +{ +	return test_dev_config_show_bool(buf, test_fw_config->into_buf); +} +static DEVICE_ATTR_RW(config_into_buf); +  static ssize_t config_sync_direct_store(struct device *dev,  					struct device_attribute *attr,  					const char *buf, size_t count) @@ -522,7 +548,7 @@ static ssize_t trigger_async_request_store(struct device *dev,  		rc = count;  	} else {  		pr_err("failed to async load firmware\n"); -		rc = -ENODEV; +		rc = -ENOMEM;  	}  out: @@ -585,7 +611,26 @@ static int test_fw_run_batch_request(void *data)  		return -EINVAL;  	} -	req->rc = test_fw_config->req_firmware(&req->fw, req->name, req->dev); +	if (test_fw_config->into_buf) { +		void *test_buf; + +		test_buf = kzalloc(TEST_FIRMWARE_BUF_SIZE, GFP_KERNEL); +		if (!test_buf) +			return -ENOSPC; + +		req->rc = request_firmware_into_buf(&req->fw, +						    req->name, +						    req->dev, +						    test_buf, +						    TEST_FIRMWARE_BUF_SIZE); +		if (!req->fw) +			kfree(test_buf); +	} else { +		req->rc = test_fw_config->req_firmware(&req->fw, +						       req->name, +						       req->dev); +	} +  	if (req->rc) {  		pr_info("#%u: batched sync load failed: %d\n",  			req->idx, req->rc); @@ -849,6 +894,7 @@ static struct attribute *test_dev_attrs[] = {  	TEST_FW_DEV_ATTR(config),  	TEST_FW_DEV_ATTR(config_name),  	TEST_FW_DEV_ATTR(config_num_requests), +	TEST_FW_DEV_ATTR(config_into_buf),  	TEST_FW_DEV_ATTR(config_sync_direct),  	TEST_FW_DEV_ATTR(config_send_uevent),  	TEST_FW_DEV_ATTR(config_read_fw_idx), @@ -886,8 +932,11 @@ static int __init test_firmware_init(void)  		return -ENOMEM;  	rc = __test_firmware_config_init(); -	if (rc) +	if (rc) { +		kfree(test_fw_config); +		pr_err("could not init firmware test config: %d\n", rc);  		return rc; +	}  	rc = misc_register(&test_fw_misc_device);  	if (rc) {  |