1 #ifndef TARGET_CORE_BACKEND_CONFIGFS_H
2 #define TARGET_CORE_BACKEND_CONFIGFS_H
3 
4 #include <target/configfs_macros.h>
5 
6 #define DEF_TB_DEV_ATTRIB_SHOW(_backend, _name)				\
7 static ssize_t _backend##_dev_show_attr_##_name(			\
8 	struct se_dev_attrib *da,					\
9 	char *page)							\
10 {									\
11 	return snprintf(page, PAGE_SIZE, "%u\n",			\
12 			(u32)da->da_dev->dev_attrib._name);		\
13 }
14 
15 #define DEF_TB_DEV_ATTRIB_STORE(_backend, _name)			\
16 static ssize_t _backend##_dev_store_attr_##_name(			\
17 	struct se_dev_attrib *da,					\
18 	const char *page,						\
19 	size_t count)							\
20 {									\
21 	unsigned long val;						\
22 	int ret;							\
23 									\
24 	ret = kstrtoul(page, 0, &val);					\
25 	if (ret < 0) {							\
26 		pr_err("kstrtoul() failed with ret: %d\n", ret);	\
27 		return -EINVAL;						\
28 	}								\
29 	ret = se_dev_set_##_name(da->da_dev, (u32)val);			\
30 									\
31 	return (!ret) ? count : -EINVAL;				\
32 }
33 
34 #define DEF_TB_DEV_ATTRIB(_backend, _name)				\
35 DEF_TB_DEV_ATTRIB_SHOW(_backend, _name);				\
36 DEF_TB_DEV_ATTRIB_STORE(_backend, _name);
37 
38 #define DEF_TB_DEV_ATTRIB_RO(_backend, name)				\
39 DEF_TB_DEV_ATTRIB_SHOW(_backend, name);
40 
41 CONFIGFS_EATTR_STRUCT(target_backend_dev_attrib, se_dev_attrib);
42 #define TB_DEV_ATTR(_backend, _name, _mode)				\
43 static struct target_backend_dev_attrib_attribute _backend##_dev_attrib_##_name = \
44 		__CONFIGFS_EATTR(_name, _mode,				\
45 		_backend##_dev_show_attr_##_name,			\
46 		_backend##_dev_store_attr_##_name);
47 
48 #define TB_DEV_ATTR_RO(_backend, _name)						\
49 static struct target_backend_dev_attrib_attribute _backend##_dev_attrib_##_name = \
50 	__CONFIGFS_EATTR_RO(_name,					\
51 	_backend##_dev_show_attr_##_name);
52 
53 /*
54  * Default list of target backend device attributes as defined by
55  * struct se_dev_attrib
56  */
57 
58 #define DEF_TB_DEFAULT_ATTRIBS(_backend)				\
59 	DEF_TB_DEV_ATTRIB(_backend, emulate_model_alias);		\
60 	TB_DEV_ATTR(_backend, emulate_model_alias, S_IRUGO | S_IWUSR);	\
61 	DEF_TB_DEV_ATTRIB(_backend, emulate_dpo);			\
62 	TB_DEV_ATTR(_backend, emulate_dpo, S_IRUGO | S_IWUSR);		\
63 	DEF_TB_DEV_ATTRIB(_backend, emulate_fua_write);			\
64 	TB_DEV_ATTR(_backend, emulate_fua_write, S_IRUGO | S_IWUSR);	\
65 	DEF_TB_DEV_ATTRIB(_backend, emulate_fua_read);			\
66 	TB_DEV_ATTR(_backend, emulate_fua_read, S_IRUGO | S_IWUSR);	\
67 	DEF_TB_DEV_ATTRIB(_backend, emulate_write_cache);		\
68 	TB_DEV_ATTR(_backend, emulate_write_cache, S_IRUGO | S_IWUSR);	\
69 	DEF_TB_DEV_ATTRIB(_backend, emulate_ua_intlck_ctrl);		\
70 	TB_DEV_ATTR(_backend, emulate_ua_intlck_ctrl, S_IRUGO | S_IWUSR); \
71 	DEF_TB_DEV_ATTRIB(_backend, emulate_tas);			\
72 	TB_DEV_ATTR(_backend, emulate_tas, S_IRUGO | S_IWUSR);		\
73 	DEF_TB_DEV_ATTRIB(_backend, emulate_tpu);			\
74 	TB_DEV_ATTR(_backend, emulate_tpu, S_IRUGO | S_IWUSR);		\
75 	DEF_TB_DEV_ATTRIB(_backend, emulate_tpws);			\
76 	TB_DEV_ATTR(_backend, emulate_tpws, S_IRUGO | S_IWUSR);		\
77 	DEF_TB_DEV_ATTRIB(_backend, emulate_caw);			\
78 	TB_DEV_ATTR(_backend, emulate_caw, S_IRUGO | S_IWUSR);		\
79 	DEF_TB_DEV_ATTRIB(_backend, emulate_3pc);			\
80 	TB_DEV_ATTR(_backend, emulate_3pc, S_IRUGO | S_IWUSR);		\
81 	DEF_TB_DEV_ATTRIB(_backend, pi_prot_type);			\
82 	TB_DEV_ATTR(_backend, pi_prot_type, S_IRUGO | S_IWUSR);		\
83 	DEF_TB_DEV_ATTRIB_RO(_backend, hw_pi_prot_type);		\
84 	TB_DEV_ATTR_RO(_backend, hw_pi_prot_type);			\
85 	DEF_TB_DEV_ATTRIB(_backend, pi_prot_format);			\
86 	TB_DEV_ATTR(_backend, pi_prot_format, S_IRUGO | S_IWUSR);	\
87 	DEF_TB_DEV_ATTRIB(_backend, enforce_pr_isids);			\
88 	TB_DEV_ATTR(_backend, enforce_pr_isids, S_IRUGO | S_IWUSR);	\
89 	DEF_TB_DEV_ATTRIB(_backend, is_nonrot);				\
90 	TB_DEV_ATTR(_backend, is_nonrot, S_IRUGO | S_IWUSR);		\
91 	DEF_TB_DEV_ATTRIB(_backend, emulate_rest_reord);		\
92 	TB_DEV_ATTR(_backend, emulate_rest_reord, S_IRUGO | S_IWUSR);	\
93 	DEF_TB_DEV_ATTRIB(_backend, force_pr_aptpl);			\
94 	TB_DEV_ATTR(_backend, force_pr_aptpl, S_IRUGO | S_IWUSR);	\
95 	DEF_TB_DEV_ATTRIB_RO(_backend, hw_block_size);			\
96 	TB_DEV_ATTR_RO(_backend, hw_block_size);			\
97 	DEF_TB_DEV_ATTRIB(_backend, block_size);			\
98 	TB_DEV_ATTR(_backend, block_size, S_IRUGO | S_IWUSR);		\
99 	DEF_TB_DEV_ATTRIB_RO(_backend, hw_max_sectors);			\
100 	TB_DEV_ATTR_RO(_backend, hw_max_sectors);			\
101 	DEF_TB_DEV_ATTRIB(_backend, optimal_sectors);			\
102 	TB_DEV_ATTR(_backend, optimal_sectors, S_IRUGO | S_IWUSR);	\
103 	DEF_TB_DEV_ATTRIB_RO(_backend, hw_queue_depth);			\
104 	TB_DEV_ATTR_RO(_backend, hw_queue_depth);			\
105 	DEF_TB_DEV_ATTRIB(_backend, queue_depth);			\
106 	TB_DEV_ATTR(_backend, queue_depth, S_IRUGO | S_IWUSR);		\
107 	DEF_TB_DEV_ATTRIB(_backend, max_unmap_lba_count);		\
108 	TB_DEV_ATTR(_backend, max_unmap_lba_count, S_IRUGO | S_IWUSR);	\
109 	DEF_TB_DEV_ATTRIB(_backend, max_unmap_block_desc_count);	\
110 	TB_DEV_ATTR(_backend, max_unmap_block_desc_count, S_IRUGO | S_IWUSR); \
111 	DEF_TB_DEV_ATTRIB(_backend, unmap_granularity);			\
112 	TB_DEV_ATTR(_backend, unmap_granularity, S_IRUGO | S_IWUSR);	\
113 	DEF_TB_DEV_ATTRIB(_backend, unmap_granularity_alignment);	\
114 	TB_DEV_ATTR(_backend, unmap_granularity_alignment, S_IRUGO | S_IWUSR); \
115 	DEF_TB_DEV_ATTRIB(_backend, max_write_same_len);		\
116 	TB_DEV_ATTR(_backend, max_write_same_len, S_IRUGO | S_IWUSR);
117 
118 #endif /* TARGET_CORE_BACKEND_CONFIGFS_H */
119