hw/cxl/mbox: Add Get Background Operation Status Command
For now, provide this command on type 3 main mailbox only. Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Message-Id: <20231023160806.13206-15-Jonathan.Cameron@huawei.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
				
					committed by
					
						
						Michael S. Tsirkin
					
				
			
			
				
	
			
			
			
						parent
						
							25a52959f9
						
					
				
				
					commit
					9dd15ab6e6
				
			@@ -50,6 +50,7 @@
 | 
				
			|||||||
enum {
 | 
					enum {
 | 
				
			||||||
    INFOSTAT    = 0x00,
 | 
					    INFOSTAT    = 0x00,
 | 
				
			||||||
        #define IS_IDENTIFY   0x1
 | 
					        #define IS_IDENTIFY   0x1
 | 
				
			||||||
 | 
					        #define BACKGROUND_OPERATION_STATUS    0x2
 | 
				
			||||||
    EVENTS      = 0x01,
 | 
					    EVENTS      = 0x01,
 | 
				
			||||||
        #define GET_RECORDS   0x0
 | 
					        #define GET_RECORDS   0x0
 | 
				
			||||||
        #define CLEAR_RECORDS   0x1
 | 
					        #define CLEAR_RECORDS   0x1
 | 
				
			||||||
@@ -452,6 +453,36 @@ static CXLRetCode cmd_get_physical_port_state(const struct cxl_cmd *cmd,
 | 
				
			|||||||
    return CXL_MBOX_SUCCESS;
 | 
					    return CXL_MBOX_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* CXL r3.0 8.2.9.1.2 */
 | 
				
			||||||
 | 
					static CXLRetCode cmd_infostat_bg_op_sts(const struct cxl_cmd *cmd,
 | 
				
			||||||
 | 
					                                         uint8_t *payload_in,
 | 
				
			||||||
 | 
					                                         size_t len_in,
 | 
				
			||||||
 | 
					                                         uint8_t *payload_out,
 | 
				
			||||||
 | 
					                                         size_t *len_out,
 | 
				
			||||||
 | 
					                                         CXLCCI *cci)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					        uint8_t status;
 | 
				
			||||||
 | 
					        uint8_t rsvd;
 | 
				
			||||||
 | 
					        uint16_t opcode;
 | 
				
			||||||
 | 
					        uint16_t returncode;
 | 
				
			||||||
 | 
					        uint16_t vendor_ext_status;
 | 
				
			||||||
 | 
					    } QEMU_PACKED *bg_op_status;
 | 
				
			||||||
 | 
					    QEMU_BUILD_BUG_ON(sizeof(*bg_op_status) != 8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bg_op_status = (void *)payload_out;
 | 
				
			||||||
 | 
					    memset(bg_op_status, 0, sizeof(*bg_op_status));
 | 
				
			||||||
 | 
					    bg_op_status->status = cci->bg.complete_pct << 1;
 | 
				
			||||||
 | 
					    if (cci->bg.runtime > 0) {
 | 
				
			||||||
 | 
					        bg_op_status->status |= 1U << 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    bg_op_status->opcode = cci->bg.opcode;
 | 
				
			||||||
 | 
					    bg_op_status->returncode = cci->bg.ret_code;
 | 
				
			||||||
 | 
					    *len_out = sizeof(*bg_op_status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return CXL_MBOX_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* 8.2.9.2.1 */
 | 
					/* 8.2.9.2.1 */
 | 
				
			||||||
static CXLRetCode cmd_firmware_update_get_info(const struct cxl_cmd *cmd,
 | 
					static CXLRetCode cmd_firmware_update_get_info(const struct cxl_cmd *cmd,
 | 
				
			||||||
                                               uint8_t *payload_in,
 | 
					                                               uint8_t *payload_in,
 | 
				
			||||||
@@ -1111,6 +1142,8 @@ static const struct cxl_cmd cxl_cmd_set[256][256] = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static const struct cxl_cmd cxl_cmd_set_sw[256][256] = {
 | 
					static const struct cxl_cmd cxl_cmd_set_sw[256][256] = {
 | 
				
			||||||
    [INFOSTAT][IS_IDENTIFY] = { "IDENTIFY", cmd_infostat_identify, 0, 0 },
 | 
					    [INFOSTAT][IS_IDENTIFY] = { "IDENTIFY", cmd_infostat_identify, 0, 0 },
 | 
				
			||||||
 | 
					    [INFOSTAT][BACKGROUND_OPERATION_STATUS] = { "BACKGROUND_OPERATION_STATUS",
 | 
				
			||||||
 | 
					        cmd_infostat_bg_op_sts, 0, 0 },
 | 
				
			||||||
    [TIMESTAMP][GET] = { "TIMESTAMP_GET", cmd_timestamp_get, 0, 0 },
 | 
					    [TIMESTAMP][GET] = { "TIMESTAMP_GET", cmd_timestamp_get, 0, 0 },
 | 
				
			||||||
    [TIMESTAMP][SET] = { "TIMESTAMP_SET", cmd_timestamp_set, 0,
 | 
					    [TIMESTAMP][SET] = { "TIMESTAMP_SET", cmd_timestamp_set, 0,
 | 
				
			||||||
                         IMMEDIATE_POLICY_CHANGE },
 | 
					                         IMMEDIATE_POLICY_CHANGE },
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user