@@ -279,6 +279,61 @@ static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
279
279
sys_##_prefix##_##_name##_show, \
280
280
sys_##_prefix##_##_name##_store)
281
281
282
+ #define IPL_ATTR_SCP_DATA_SHOW_FN (_prefix , _ipl_block ) \
283
+ static ssize_t sys_##_prefix##_scp_data_show(struct file *filp, \
284
+ struct kobject *kobj, \
285
+ struct bin_attribute *attr, \
286
+ char *buf, loff_t off, \
287
+ size_t count) \
288
+ { \
289
+ size_t size = _ipl_block.scp_data_len; \
290
+ void *scp_data = _ipl_block.scp_data; \
291
+ \
292
+ return memory_read_from_buffer(buf, count, &off, \
293
+ scp_data, size); \
294
+ }
295
+
296
+ #define IPL_ATTR_SCP_DATA_STORE_FN (_prefix , _ipl_block_hdr , _ipl_block , _ipl_bp_len , _ipl_bp0_len )\
297
+ static ssize_t sys_##_prefix##_scp_data_store(struct file *filp, \
298
+ struct kobject *kobj, \
299
+ struct bin_attribute *attr, \
300
+ char *buf, loff_t off, \
301
+ size_t count) \
302
+ { \
303
+ size_t scpdata_len = count; \
304
+ size_t padding; \
305
+ \
306
+ if (off) \
307
+ return -EINVAL; \
308
+ \
309
+ memcpy(_ipl_block.scp_data, buf, count); \
310
+ if (scpdata_len % 8) { \
311
+ padding = 8 - (scpdata_len % 8); \
312
+ memset(_ipl_block.scp_data + scpdata_len, \
313
+ 0, padding); \
314
+ scpdata_len += padding; \
315
+ } \
316
+ \
317
+ _ipl_block_hdr.len = _ipl_bp_len + scpdata_len; \
318
+ _ipl_block.len = _ipl_bp0_len + scpdata_len; \
319
+ _ipl_block.scp_data_len = scpdata_len; \
320
+ \
321
+ return count; \
322
+ }
323
+
324
+ #define DEFINE_IPL_ATTR_SCP_DATA_RO (_prefix , _ipl_block , _size ) \
325
+ IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block) \
326
+ static struct bin_attribute sys_##_prefix##_scp_data_attr = \
327
+ __BIN_ATTR(scp_data, 0444, sys_##_prefix##_scp_data_show, \
328
+ NULL, _size)
329
+
330
+ #define DEFINE_IPL_ATTR_SCP_DATA_RW (_prefix , _ipl_block_hdr , _ipl_block , _ipl_bp_len , _ipl_bp0_len , _size )\
331
+ IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block) \
332
+ IPL_ATTR_SCP_DATA_STORE_FN(_prefix, _ipl_block_hdr, _ipl_block, _ipl_bp_len, _ipl_bp0_len)\
333
+ static struct bin_attribute sys_##_prefix##_scp_data_attr = \
334
+ __BIN_ATTR(scp_data, 0644, sys_##_prefix##_scp_data_show, \
335
+ sys_##_prefix##_scp_data_store, _size)
336
+
282
337
/*
283
338
* ipl section
284
339
*/
@@ -377,71 +432,38 @@ static ssize_t sys_ipl_device_show(struct kobject *kobj,
377
432
static struct kobj_attribute sys_ipl_device_attr =
378
433
__ATTR (device , 0444 , sys_ipl_device_show , NULL );
379
434
380
- static ssize_t ipl_parameter_read (struct file * filp , struct kobject * kobj ,
381
- struct bin_attribute * attr , char * buf ,
382
- loff_t off , size_t count )
435
+ static ssize_t sys_ipl_parameter_read (struct file * filp , struct kobject * kobj ,
436
+ struct bin_attribute * attr , char * buf ,
437
+ loff_t off , size_t count )
383
438
{
384
439
return memory_read_from_buffer (buf , count , & off , & ipl_block ,
385
440
ipl_block .hdr .len );
386
441
}
387
- static struct bin_attribute ipl_parameter_attr =
388
- __BIN_ATTR (binary_parameter , 0444 , ipl_parameter_read , NULL ,
442
+ static struct bin_attribute sys_ipl_parameter_attr =
443
+ __BIN_ATTR (binary_parameter , 0444 , sys_ipl_parameter_read , NULL ,
389
444
PAGE_SIZE );
390
445
391
- static ssize_t ipl_scp_data_read (struct file * filp , struct kobject * kobj ,
392
- struct bin_attribute * attr , char * buf ,
393
- loff_t off , size_t count )
394
- {
395
- unsigned int size = ipl_block .fcp .scp_data_len ;
396
- void * scp_data = & ipl_block .fcp .scp_data ;
397
-
398
- return memory_read_from_buffer (buf , count , & off , scp_data , size );
399
- }
400
-
401
- static ssize_t ipl_nvme_scp_data_read (struct file * filp , struct kobject * kobj ,
402
- struct bin_attribute * attr , char * buf ,
403
- loff_t off , size_t count )
404
- {
405
- unsigned int size = ipl_block .nvme .scp_data_len ;
406
- void * scp_data = & ipl_block .nvme .scp_data ;
407
-
408
- return memory_read_from_buffer (buf , count , & off , scp_data , size );
409
- }
410
-
411
- static ssize_t ipl_eckd_scp_data_read (struct file * filp , struct kobject * kobj ,
412
- struct bin_attribute * attr , char * buf ,
413
- loff_t off , size_t count )
414
- {
415
- unsigned int size = ipl_block .eckd .scp_data_len ;
416
- void * scp_data = & ipl_block .eckd .scp_data ;
417
-
418
- return memory_read_from_buffer (buf , count , & off , scp_data , size );
419
- }
420
-
421
- static struct bin_attribute ipl_scp_data_attr =
422
- __BIN_ATTR (scp_data , 0444 , ipl_scp_data_read , NULL , PAGE_SIZE );
423
-
424
- static struct bin_attribute ipl_nvme_scp_data_attr =
425
- __BIN_ATTR (scp_data , 0444 , ipl_nvme_scp_data_read , NULL , PAGE_SIZE );
426
-
427
- static struct bin_attribute ipl_eckd_scp_data_attr =
428
- __BIN_ATTR (scp_data , 0444 , ipl_eckd_scp_data_read , NULL , PAGE_SIZE );
446
+ DEFINE_IPL_ATTR_SCP_DATA_RO (ipl_fcp , ipl_block .fcp , PAGE_SIZE );
429
447
430
448
static struct bin_attribute * ipl_fcp_bin_attrs [] = {
431
- & ipl_parameter_attr ,
432
- & ipl_scp_data_attr ,
449
+ & sys_ipl_parameter_attr ,
450
+ & sys_ipl_fcp_scp_data_attr ,
433
451
NULL ,
434
452
};
435
453
454
+ DEFINE_IPL_ATTR_SCP_DATA_RO (ipl_nvme , ipl_block .nvme , PAGE_SIZE );
455
+
436
456
static struct bin_attribute * ipl_nvme_bin_attrs [] = {
437
- & ipl_parameter_attr ,
438
- & ipl_nvme_scp_data_attr ,
457
+ & sys_ipl_parameter_attr ,
458
+ & sys_ipl_nvme_scp_data_attr ,
439
459
NULL ,
440
460
};
441
461
462
+ DEFINE_IPL_ATTR_SCP_DATA_RO (ipl_eckd , ipl_block .eckd , PAGE_SIZE );
463
+
442
464
static struct bin_attribute * ipl_eckd_bin_attrs [] = {
443
- & ipl_parameter_attr ,
444
- & ipl_eckd_scp_data_attr ,
465
+ & sys_ipl_parameter_attr ,
466
+ & sys_ipl_eckd_scp_data_attr ,
445
467
NULL ,
446
468
};
447
469
@@ -780,44 +802,10 @@ static struct kobj_attribute sys_reipl_ccw_vmparm_attr =
780
802
781
803
/* FCP reipl device attributes */
782
804
783
- static ssize_t reipl_fcp_scpdata_read (struct file * filp , struct kobject * kobj ,
784
- struct bin_attribute * attr ,
785
- char * buf , loff_t off , size_t count )
786
- {
787
- size_t size = reipl_block_fcp -> fcp .scp_data_len ;
788
- void * scp_data = reipl_block_fcp -> fcp .scp_data ;
789
-
790
- return memory_read_from_buffer (buf , count , & off , scp_data , size );
791
- }
792
-
793
- static ssize_t reipl_fcp_scpdata_write (struct file * filp , struct kobject * kobj ,
794
- struct bin_attribute * attr ,
795
- char * buf , loff_t off , size_t count )
796
- {
797
- size_t scpdata_len = count ;
798
- size_t padding ;
799
-
800
-
801
- if (off )
802
- return - EINVAL ;
803
-
804
- memcpy (reipl_block_fcp -> fcp .scp_data , buf , count );
805
- if (scpdata_len % 8 ) {
806
- padding = 8 - (scpdata_len % 8 );
807
- memset (reipl_block_fcp -> fcp .scp_data + scpdata_len ,
808
- 0 , padding );
809
- scpdata_len += padding ;
810
- }
811
-
812
- reipl_block_fcp -> hdr .len = IPL_BP_FCP_LEN + scpdata_len ;
813
- reipl_block_fcp -> fcp .len = IPL_BP0_FCP_LEN + scpdata_len ;
814
- reipl_block_fcp -> fcp .scp_data_len = scpdata_len ;
815
-
816
- return count ;
817
- }
818
- static struct bin_attribute sys_reipl_fcp_scp_data_attr =
819
- __BIN_ATTR (scp_data , 0644 , reipl_fcp_scpdata_read ,
820
- reipl_fcp_scpdata_write , DIAG308_SCPDATA_SIZE );
805
+ DEFINE_IPL_ATTR_SCP_DATA_RW (reipl_fcp , reipl_block_fcp -> hdr ,
806
+ reipl_block_fcp -> fcp ,
807
+ IPL_BP_FCP_LEN , IPL_BP0_FCP_LEN ,
808
+ DIAG308_SCPDATA_SIZE );
821
809
822
810
static struct bin_attribute * reipl_fcp_bin_attrs [] = {
823
811
& sys_reipl_fcp_scp_data_attr ,
@@ -938,44 +926,10 @@ static struct kobj_attribute sys_reipl_fcp_clear_attr =
938
926
939
927
/* NVME reipl device attributes */
940
928
941
- static ssize_t reipl_nvme_scpdata_read (struct file * filp , struct kobject * kobj ,
942
- struct bin_attribute * attr ,
943
- char * buf , loff_t off , size_t count )
944
- {
945
- size_t size = reipl_block_nvme -> nvme .scp_data_len ;
946
- void * scp_data = reipl_block_nvme -> nvme .scp_data ;
947
-
948
- return memory_read_from_buffer (buf , count , & off , scp_data , size );
949
- }
950
-
951
- static ssize_t reipl_nvme_scpdata_write (struct file * filp , struct kobject * kobj ,
952
- struct bin_attribute * attr ,
953
- char * buf , loff_t off , size_t count )
954
- {
955
- size_t scpdata_len = count ;
956
- size_t padding ;
957
-
958
- if (off )
959
- return - EINVAL ;
960
-
961
- memcpy (reipl_block_nvme -> nvme .scp_data , buf , count );
962
- if (scpdata_len % 8 ) {
963
- padding = 8 - (scpdata_len % 8 );
964
- memset (reipl_block_nvme -> nvme .scp_data + scpdata_len ,
965
- 0 , padding );
966
- scpdata_len += padding ;
967
- }
968
-
969
- reipl_block_nvme -> hdr .len = IPL_BP_NVME_LEN + scpdata_len ;
970
- reipl_block_nvme -> nvme .len = IPL_BP0_NVME_LEN + scpdata_len ;
971
- reipl_block_nvme -> nvme .scp_data_len = scpdata_len ;
972
-
973
- return count ;
974
- }
975
-
976
- static struct bin_attribute sys_reipl_nvme_scp_data_attr =
977
- __BIN_ATTR (scp_data , 0644 , reipl_nvme_scpdata_read ,
978
- reipl_nvme_scpdata_write , DIAG308_SCPDATA_SIZE );
929
+ DEFINE_IPL_ATTR_SCP_DATA_RW (reipl_nvme , reipl_block_nvme -> hdr ,
930
+ reipl_block_nvme -> nvme ,
931
+ IPL_BP_NVME_LEN , IPL_BP0_NVME_LEN ,
932
+ DIAG308_SCPDATA_SIZE );
979
933
980
934
static struct bin_attribute * reipl_nvme_bin_attrs [] = {
981
935
& sys_reipl_nvme_scp_data_attr ,
@@ -1071,44 +1025,10 @@ static struct attribute_group reipl_ccw_attr_group_lpar = {
1071
1025
1072
1026
/* ECKD reipl device attributes */
1073
1027
1074
- static ssize_t reipl_eckd_scpdata_read (struct file * filp , struct kobject * kobj ,
1075
- struct bin_attribute * attr ,
1076
- char * buf , loff_t off , size_t count )
1077
- {
1078
- size_t size = reipl_block_eckd -> eckd .scp_data_len ;
1079
- void * scp_data = reipl_block_eckd -> eckd .scp_data ;
1080
-
1081
- return memory_read_from_buffer (buf , count , & off , scp_data , size );
1082
- }
1083
-
1084
- static ssize_t reipl_eckd_scpdata_write (struct file * filp , struct kobject * kobj ,
1085
- struct bin_attribute * attr ,
1086
- char * buf , loff_t off , size_t count )
1087
- {
1088
- size_t scpdata_len = count ;
1089
- size_t padding ;
1090
-
1091
- if (off )
1092
- return - EINVAL ;
1093
-
1094
- memcpy (reipl_block_eckd -> eckd .scp_data , buf , count );
1095
- if (scpdata_len % 8 ) {
1096
- padding = 8 - (scpdata_len % 8 );
1097
- memset (reipl_block_eckd -> eckd .scp_data + scpdata_len ,
1098
- 0 , padding );
1099
- scpdata_len += padding ;
1100
- }
1101
-
1102
- reipl_block_eckd -> hdr .len = IPL_BP_ECKD_LEN + scpdata_len ;
1103
- reipl_block_eckd -> eckd .len = IPL_BP0_ECKD_LEN + scpdata_len ;
1104
- reipl_block_eckd -> eckd .scp_data_len = scpdata_len ;
1105
-
1106
- return count ;
1107
- }
1108
-
1109
- static struct bin_attribute sys_reipl_eckd_scp_data_attr =
1110
- __BIN_ATTR (scp_data , 0644 , reipl_eckd_scpdata_read ,
1111
- reipl_eckd_scpdata_write , DIAG308_SCPDATA_SIZE );
1028
+ DEFINE_IPL_ATTR_SCP_DATA_RW (reipl_eckd , reipl_block_eckd -> hdr ,
1029
+ reipl_block_eckd -> eckd ,
1030
+ IPL_BP_ECKD_LEN , IPL_BP0_ECKD_LEN ,
1031
+ DIAG308_SCPDATA_SIZE );
1112
1032
1113
1033
static struct bin_attribute * reipl_eckd_bin_attrs [] = {
1114
1034
& sys_reipl_eckd_scp_data_attr ,
0 commit comments