Commit 24306dc6 authored by Matan Barak's avatar Matan Barak Committed by Doug Ledford

IB/core: Add timestamp_mask and hca_core_clock to query_device

In order to expose timestamp we need to expose two new attributes in
query_device to be used for CQ completion time-stamping:

timestamp_mask - how many bits are valid in the timestamp, where timestamp
values could be 64bits the most.

hca_core_clock - timestamp is given in HW cycles, the frequency in KHZ units
of the HCA, necessary in order to convert cycles to seconds.

This is added both to ib_query_device and its respective uverbs counterpart.
Signed-off-by: default avatarMatan Barak <matanb@mellanox.com>
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 565197dd
...@@ -539,6 +539,8 @@ EXPORT_SYMBOL(ib_dispatch_event); ...@@ -539,6 +539,8 @@ EXPORT_SYMBOL(ib_dispatch_event);
int ib_query_device(struct ib_device *device, int ib_query_device(struct ib_device *device,
struct ib_device_attr *device_attr) struct ib_device_attr *device_attr)
{ {
memset(device_attr, 0, sizeof(*device_attr));
return device->query_device(device, device_attr); return device->query_device(device, device_attr);
} }
EXPORT_SYMBOL(ib_query_device); EXPORT_SYMBOL(ib_query_device);
......
...@@ -3426,6 +3426,8 @@ int ib_uverbs_ex_query_device(struct ib_uverbs_file *file, ...@@ -3426,6 +3426,8 @@ int ib_uverbs_ex_query_device(struct ib_uverbs_file *file,
if (ucore->outlen < resp.response_length) if (ucore->outlen < resp.response_length)
return -ENOSPC; return -ENOSPC;
memset(&attr, 0, sizeof(attr));
err = device->query_device(device, &attr); err = device->query_device(device, &attr);
if (err) if (err)
return err; return err;
...@@ -3450,6 +3452,18 @@ int ib_uverbs_ex_query_device(struct ib_uverbs_file *file, ...@@ -3450,6 +3452,18 @@ int ib_uverbs_ex_query_device(struct ib_uverbs_file *file,
#endif #endif
resp.response_length += sizeof(resp.odp_caps); resp.response_length += sizeof(resp.odp_caps);
if (ucore->outlen < resp.response_length + sizeof(resp.timestamp_mask))
goto end;
resp.timestamp_mask = attr.timestamp_mask;
resp.response_length += sizeof(resp.timestamp_mask);
if (ucore->outlen < resp.response_length + sizeof(resp.hca_core_clock))
goto end;
resp.hca_core_clock = attr.hca_core_clock;
resp.response_length += sizeof(resp.hca_core_clock);
end: end:
err = ib_copy_to_udata(ucore, &resp, resp.response_length); err = ib_copy_to_udata(ucore, &resp, resp.response_length);
if (err) if (err)
......
...@@ -227,6 +227,8 @@ struct ib_device_attr { ...@@ -227,6 +227,8 @@ struct ib_device_attr {
int sig_prot_cap; int sig_prot_cap;
int sig_guard_cap; int sig_guard_cap;
struct ib_odp_caps odp_caps; struct ib_odp_caps odp_caps;
uint64_t timestamp_mask;
uint64_t hca_core_clock; /* in KHZ */
}; };
enum ib_mtu { enum ib_mtu {
......
...@@ -223,6 +223,8 @@ struct ib_uverbs_ex_query_device_resp { ...@@ -223,6 +223,8 @@ struct ib_uverbs_ex_query_device_resp {
__u32 comp_mask; __u32 comp_mask;
__u32 response_length; __u32 response_length;
struct ib_uverbs_odp_caps odp_caps; struct ib_uverbs_odp_caps odp_caps;
__u64 timestamp_mask;
__u64 hca_core_clock; /* in KHZ */
}; };
struct ib_uverbs_query_port { struct ib_uverbs_query_port {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment