@@ -89,6 +89,12 @@ static struct cxl_cel_entry mock_cel[] = {
89
89
.effect = cpu_to_le16 (EFFECT (CONF_CHANGE_COLD_RESET ) |
90
90
EFFECT (CONF_CHANGE_IMMEDIATE )),
91
91
},
92
+ {
93
+ .opcode = cpu_to_le16 (CXL_MBOX_OP_SANITIZE ),
94
+ .effect = cpu_to_le16 (EFFECT (DATA_CHANGE_IMMEDIATE ) |
95
+ EFFECT (SECURITY_CHANGE_IMMEDIATE ) |
96
+ EFFECT (BACKGROUND_OP )),
97
+ },
92
98
};
93
99
94
100
/* See CXL 2.0 Table 181 Get Health Info Output Payload */
@@ -152,6 +158,7 @@ struct cxl_mockmem_data {
152
158
struct cxl_memdev_state * mds ;
153
159
u8 event_buf [SZ_4K ];
154
160
u64 timestamp ;
161
+ unsigned long sanitize_timeout ;
155
162
};
156
163
157
164
static struct mock_event_log * event_find_log (struct device * dev , int log_type )
@@ -567,9 +574,26 @@ static int mock_partition_info(struct cxl_mbox_cmd *cmd)
567
574
return 0 ;
568
575
}
569
576
577
+ void cxl_mockmem_sanitize_work (struct work_struct * work )
578
+ {
579
+ struct cxl_memdev_state * mds =
580
+ container_of (work , typeof (* mds ), security .poll_dwork .work );
581
+
582
+ mutex_lock (& mds -> mbox_mutex );
583
+ if (mds -> security .sanitize_node )
584
+ sysfs_notify_dirent (mds -> security .sanitize_node );
585
+ mds -> security .sanitize_active = false;
586
+ mutex_unlock (& mds -> mbox_mutex );
587
+
588
+ dev_dbg (mds -> cxlds .dev , "sanitize complete\n" );
589
+ }
590
+
570
591
static int mock_sanitize (struct cxl_mockmem_data * mdata ,
571
592
struct cxl_mbox_cmd * cmd )
572
593
{
594
+ struct cxl_memdev_state * mds = mdata -> mds ;
595
+ int rc = 0 ;
596
+
573
597
if (cmd -> size_in != 0 )
574
598
return - EINVAL ;
575
599
@@ -585,7 +609,16 @@ static int mock_sanitize(struct cxl_mockmem_data *mdata,
585
609
return - ENXIO ;
586
610
}
587
611
588
- return 0 ; /* assume less than 2 secs, no bg */
612
+ mutex_lock (& mds -> mbox_mutex );
613
+ if (schedule_delayed_work (& mds -> security .poll_dwork ,
614
+ msecs_to_jiffies (mdata -> sanitize_timeout ))) {
615
+ mds -> security .sanitize_active = true;
616
+ dev_dbg (mds -> cxlds .dev , "sanitize issued\n" );
617
+ } else
618
+ rc = - EBUSY ;
619
+ mutex_unlock (& mds -> mbox_mutex );
620
+
621
+ return rc ;
589
622
}
590
623
591
624
static int mock_secure_erase (struct cxl_mockmem_data * mdata ,
@@ -1419,6 +1452,7 @@ static int cxl_mock_mem_probe(struct platform_device *pdev)
1419
1452
mds -> mbox_send = cxl_mock_mbox_send ;
1420
1453
mds -> payload_size = SZ_4K ;
1421
1454
mds -> event .buf = (struct cxl_get_event_payload * ) mdata -> event_buf ;
1455
+ INIT_DELAYED_WORK (& mds -> security .poll_dwork , cxl_mockmem_sanitize_work );
1422
1456
1423
1457
cxlds = & mds -> cxlds ;
1424
1458
cxlds -> serial = pdev -> id ;
@@ -1458,6 +1492,10 @@ static int cxl_mock_mem_probe(struct platform_device *pdev)
1458
1492
if (rc )
1459
1493
return rc ;
1460
1494
1495
+ rc = devm_cxl_sanitize_setup_notifier (& pdev -> dev , cxlmd );
1496
+ if (rc )
1497
+ return rc ;
1498
+
1461
1499
cxl_mem_get_event_records (mds , CXLDEV_EVENT_STATUS_ALL );
1462
1500
1463
1501
return 0 ;
@@ -1526,10 +1564,38 @@ static ssize_t fw_buf_checksum_show(struct device *dev,
1526
1564
1527
1565
static DEVICE_ATTR_RO (fw_buf_checksum );
1528
1566
1567
+ static ssize_t sanitize_timeout_show (struct device * dev ,
1568
+ struct device_attribute * attr , char * buf )
1569
+ {
1570
+ struct cxl_mockmem_data * mdata = dev_get_drvdata (dev );
1571
+
1572
+ return sysfs_emit (buf , "%lu\n" , mdata -> sanitize_timeout );
1573
+ }
1574
+
1575
+ static ssize_t sanitize_timeout_store (struct device * dev ,
1576
+ struct device_attribute * attr ,
1577
+ const char * buf , size_t count )
1578
+ {
1579
+ struct cxl_mockmem_data * mdata = dev_get_drvdata (dev );
1580
+ unsigned long val ;
1581
+ int rc ;
1582
+
1583
+ rc = kstrtoul (buf , 0 , & val );
1584
+ if (rc )
1585
+ return rc ;
1586
+
1587
+ mdata -> sanitize_timeout = val ;
1588
+
1589
+ return count ;
1590
+ }
1591
+
1592
+ static DEVICE_ATTR_RW (sanitize_timeout );
1593
+
1529
1594
static struct attribute * cxl_mock_mem_attrs [] = {
1530
1595
& dev_attr_security_lock .attr ,
1531
1596
& dev_attr_event_trigger .attr ,
1532
1597
& dev_attr_fw_buf_checksum .attr ,
1598
+ & dev_attr_sanitize_timeout .attr ,
1533
1599
NULL
1534
1600
};
1535
1601
ATTRIBUTE_GROUPS (cxl_mock_mem );
0 commit comments