Skip to content

Commit

Permalink
hw/cxl/device: Timestamp implementation (8.2.9.3)
Browse files Browse the repository at this point in the history
Errata F4 to CXL 2.0 clarified the meaning of the timer as the
sum of the value set with the timestamp set command and the number
of nano seconds since it was last set.

Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20220429144110.25167-10-Jonathan.Cameron@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Ben Widawsky authored and mstsirkin committed May 13, 2022
1 parent 57c02b3 commit 557a79c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
42 changes: 42 additions & 0 deletions hw/cxl/cxl-mailbox-utils.c
Expand Up @@ -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 */
Expand Down Expand Up @@ -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] = {
Expand All @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions include/hw/cxl/cxl_device.h
Expand Up @@ -111,6 +111,12 @@ typedef struct cxl_device_state {
size_t cel_size;
};

struct {
bool set;
uint64_t last_set;
uint64_t host_set;
} timestamp;

/* memory region for persistent memory, HDM */
uint64_t pmem_size;
} CXLDeviceState;
Expand Down

0 comments on commit 557a79c

Please sign in to comment.