|
@@ -44,6 +44,9 @@ enum {
|
|
|
#define CLEAR_RECORDS 0x1
|
|
|
#define GET_INTERRUPT_POLICY 0x2
|
|
|
#define SET_INTERRUPT_POLICY 0x3
|
|
|
+ TIMESTAMP = 0x03,
|
|
|
+ #define GET 0x0
|
|
|
+ #define SET 0x1
|
|
|
};
|
|
|
|
|
|
/* 8.2.8.4.5.1 Command Return Codes */
|
|
@@ -106,9 +109,46 @@ DEFINE_MAILBOX_HANDLER_NOP(events_clear_records);
|
|
|
DEFINE_MAILBOX_HANDLER_ZEROED(events_get_interrupt_policy, 4);
|
|
|
DEFINE_MAILBOX_HANDLER_NOP(events_set_interrupt_policy);
|
|
|
|
|
|
+/* 8.2.9.3.1 */
|
|
|
+static ret_code cmd_timestamp_get(struct cxl_cmd *cmd,
|
|
|
+ CXLDeviceState *cxl_dstate,
|
|
|
+ uint16_t *len)
|
|
|
+{
|
|
|
+ uint64_t time, delta;
|
|
|
+ uint64_t final_time = 0;
|
|
|
+
|
|
|
+ if (cxl_dstate->timestamp.set) {
|
|
|
+ /* First find the delta from the last time the host set the time. */
|
|
|
+ time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
|
|
+ delta = time - cxl_dstate->timestamp.last_set;
|
|
|
+ final_time = cxl_dstate->timestamp.host_set + delta;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Then adjust the actual time */
|
|
|
+ stq_le_p(cmd->payload, final_time);
|
|
|
+ *len = 8;
|
|
|
+
|
|
|
+ return CXL_MBOX_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/* 8.2.9.3.2 */
|
|
|
+static ret_code cmd_timestamp_set(struct cxl_cmd *cmd,
|
|
|
+ CXLDeviceState *cxl_dstate,
|
|
|
+ uint16_t *len)
|
|
|
+{
|
|
|
+ cxl_dstate->timestamp.set = true;
|
|
|
+ cxl_dstate->timestamp.last_set = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
|
|
+
|
|
|
+ cxl_dstate->timestamp.host_set = le64_to_cpu(*(uint64_t *)cmd->payload);
|
|
|
+
|
|
|
+ *len = 0;
|
|
|
+ return CXL_MBOX_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
static QemuUUID cel_uuid;
|
|
|
|
|
|
#define IMMEDIATE_CONFIG_CHANGE (1 << 1)
|
|
|
+#define IMMEDIATE_POLICY_CHANGE (1 << 3)
|
|
|
#define IMMEDIATE_LOG_CHANGE (1 << 4)
|
|
|
|
|
|
static struct cxl_cmd cxl_cmd_set[256][256] = {
|
|
@@ -120,6 +160,8 @@ static struct cxl_cmd cxl_cmd_set[256][256] = {
|
|
|
cmd_events_get_interrupt_policy, 0, 0 },
|
|
|
[EVENTS][SET_INTERRUPT_POLICY] = { "EVENTS_SET_INTERRUPT_POLICY",
|
|
|
cmd_events_set_interrupt_policy, 4, IMMEDIATE_CONFIG_CHANGE },
|
|
|
+ [TIMESTAMP][GET] = { "TIMESTAMP_GET", cmd_timestamp_get, 0, 0 },
|
|
|
+ [TIMESTAMP][SET] = { "TIMESTAMP_SET", cmd_timestamp_set, 8, IMMEDIATE_POLICY_CHANGE },
|
|
|
};
|
|
|
|
|
|
void cxl_process_mailbox(CXLDeviceState *cxl_dstate)
|