@ -28,6 +28,11 @@
# define CXL_DC_EVENT_LOG_SIZE 8
# define CXL_NUM_EXTENTS_SUPPORTED 512
# define CXL_NUM_TAGS_SUPPORTED 0
# define CXL_ALERTS_LIFE_USED_WARN_THRESH (1 << 0)
# define CXL_ALERTS_OVER_TEMP_WARN_THRESH (1 << 1)
# define CXL_ALERTS_UNDER_TEMP_WARN_THRESH (1 << 2)
# define CXL_ALERTS_COR_VMEM_ERR_WARN_THRESH (1 << 3)
# define CXL_ALERTS_COR_PMEM_ERR_WARN_THRESH (1 << 4)
/*
* How to add a new command , example . The command set FOO , with cmd BAR .
@ -86,6 +91,9 @@ enum {
# define GET_PARTITION_INFO 0x0
# define GET_LSA 0x2
# define SET_LSA 0x3
HEALTH_INFO_ALERTS = 0x42 ,
# define GET_ALERT_CONFIG 0x1
# define SET_ALERT_CONFIG 0x2
SANITIZE = 0x44 ,
# define OVERWRITE 0x0
# define SECURE_ERASE 0x1
@ -1610,6 +1618,97 @@ static CXLRetCode cmd_ccls_set_lsa(const struct cxl_cmd *cmd,
return CXL_MBOX_SUCCESS ;
}
/* CXL r3.2 Section 8.2.10.9.3.2 Get Alert Configuration (Opcode 4201h) */
static CXLRetCode cmd_get_alert_config ( const struct cxl_cmd * cmd ,
uint8_t * payload_in ,
size_t len_in ,
uint8_t * payload_out ,
size_t * len_out ,
CXLCCI * cci )
{
CXLType3Dev * ct3d = CXL_TYPE3 ( cci - > d ) ;
CXLAlertConfig * out = ( CXLAlertConfig * ) payload_out ;
memcpy ( out , & ct3d - > alert_config , sizeof ( ct3d - > alert_config ) ) ;
* len_out = sizeof ( ct3d - > alert_config ) ;
return CXL_MBOX_SUCCESS ;
}
/* CXL r3.2 Section 8.2.10.9.3.3 Set Alert Configuration (Opcode 4202h) */
static CXLRetCode cmd_set_alert_config ( const struct cxl_cmd * cmd ,
uint8_t * payload_in ,
size_t len_in ,
uint8_t * payload_out ,
size_t * len_out ,
CXLCCI * cci )
{
CXLType3Dev * ct3d = CXL_TYPE3 ( cci - > d ) ;
CXLAlertConfig * alert_config = & ct3d - > alert_config ;
struct {
uint8_t valid_alert_actions ;
uint8_t enable_alert_actions ;
uint8_t life_used_warn_thresh ;
uint8_t rsvd ;
uint16_t over_temp_warn_thresh ;
uint16_t under_temp_warn_thresh ;
uint16_t cor_vmem_err_warn_thresh ;
uint16_t cor_pmem_err_warn_thresh ;
} QEMU_PACKED * in = ( void * ) payload_in ;
if ( in - > valid_alert_actions & CXL_ALERTS_LIFE_USED_WARN_THRESH ) {
/*
* CXL r3 .2 Table 8 - 149 The life used warning threshold shall be
* less than the life used critical alert value .
*/
if ( in - > life_used_warn_thresh > =
alert_config - > life_used_crit_alert_thresh ) {
return CXL_MBOX_INVALID_INPUT ;
}
alert_config - > life_used_warn_thresh = in - > life_used_warn_thresh ;
alert_config - > enable_alerts | = CXL_ALERTS_LIFE_USED_WARN_THRESH ;
}
if ( in - > valid_alert_actions & CXL_ALERTS_OVER_TEMP_WARN_THRESH ) {
/*
* CXL r3 .2 Table 8 - 149 The Device Over - Temperature Warning Threshold
* shall be less than the the Device Over - Temperature Critical
* Alert Threshold .
*/
if ( in - > over_temp_warn_thresh > =
alert_config - > over_temp_crit_alert_thresh ) {
return CXL_MBOX_INVALID_INPUT ;
}
alert_config - > over_temp_warn_thresh = in - > over_temp_warn_thresh ;
alert_config - > enable_alerts | = CXL_ALERTS_OVER_TEMP_WARN_THRESH ;
}
if ( in - > valid_alert_actions & CXL_ALERTS_UNDER_TEMP_WARN_THRESH ) {
/*
* CXL r3 .2 Table 8 - 149 The Device Under - Temperature Warning Threshold
* shall be higher than the the Device Under - Temperature Critical
* Alert Threshold .
*/
if ( in - > under_temp_warn_thresh < =
alert_config - > under_temp_crit_alert_thresh ) {
return CXL_MBOX_INVALID_INPUT ;
}
alert_config - > under_temp_warn_thresh = in - > under_temp_warn_thresh ;
alert_config - > enable_alerts | = CXL_ALERTS_UNDER_TEMP_WARN_THRESH ;
}
if ( in - > valid_alert_actions & CXL_ALERTS_COR_VMEM_ERR_WARN_THRESH ) {
alert_config - > cor_vmem_err_warn_thresh = in - > cor_vmem_err_warn_thresh ;
alert_config - > enable_alerts | = CXL_ALERTS_COR_VMEM_ERR_WARN_THRESH ;
}
if ( in - > valid_alert_actions & CXL_ALERTS_COR_PMEM_ERR_WARN_THRESH ) {
alert_config - > cor_pmem_err_warn_thresh = in - > cor_pmem_err_warn_thresh ;
alert_config - > enable_alerts | = CXL_ALERTS_COR_PMEM_ERR_WARN_THRESH ;
}
return CXL_MBOX_SUCCESS ;
}
/* Perform the actual device zeroing */
static void __do_sanitization ( CXLType3Dev * ct3d )
{
@ -3173,6 +3272,12 @@ static const struct cxl_cmd cxl_cmd_set[256][256] = {
[ CCLS ] [ GET_LSA ] = { " CCLS_GET_LSA " , cmd_ccls_get_lsa , 8 , 0 } ,
[ CCLS ] [ SET_LSA ] = { " CCLS_SET_LSA " , cmd_ccls_set_lsa ,
~ 0 , CXL_MBOX_IMMEDIATE_CONFIG_CHANGE | CXL_MBOX_IMMEDIATE_DATA_CHANGE } ,
[ HEALTH_INFO_ALERTS ] [ GET_ALERT_CONFIG ] = {
" HEALTH_INFO_ALERTS_GET_ALERT_CONFIG " ,
cmd_get_alert_config , 0 , 0 } ,
[ HEALTH_INFO_ALERTS ] [ SET_ALERT_CONFIG ] = {
" HEALTH_INFO_ALERTS_SET_ALERT_CONFIG " ,
cmd_set_alert_config , 12 , CXL_MBOX_IMMEDIATE_POLICY_CHANGE } ,
[ SANITIZE ] [ OVERWRITE ] = { " SANITIZE_OVERWRITE " , cmd_sanitize_overwrite , 0 ,
( CXL_MBOX_IMMEDIATE_DATA_CHANGE |
CXL_MBOX_SECURITY_STATE_CHANGE |