Commit 4016d6bf authored by Rodrigo Vivi's avatar Rodrigo Vivi

drm/xe/uapi: Crystal Reference Clock updates

First of all, let's remove the duplication.
But also, let's rename it to remove the word 'frequency'
out of it. In general, the first thing people think of frequency
is the frequency in which the GTs are operating to execute the
GPU instructions.

While this frequency here is a crystal reference clock frequency
which is the base of everything else, and in this case of this
uAPI it is used to calculate a better and precise timestamp.

v2: (Suggested by Jose) Remove the engine_cs and keep the GT info one
since it might be useful for other SRIOV cases where the engine_cs
will be zeroed. So, grabbing from the GT_LIST should be cleaner.

v3: Keep comment on put_user() call (José Roberto de Souza)

Cc: Matt Roper <matthew.d.roper@intel.com>
Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Cc: Jose Souza <jose.souza@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarFrancois Dugast <francois.dugast@intel.com>
Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
parent cad4a0d6
...@@ -75,11 +75,11 @@ int xe_gt_clock_init(struct xe_gt *gt) ...@@ -75,11 +75,11 @@ int xe_gt_clock_init(struct xe_gt *gt)
freq >>= 3 - REG_FIELD_GET(RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK, c0); freq >>= 3 - REG_FIELD_GET(RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK, c0);
} }
gt->info.clock_freq = freq; gt->info.reference_clock = freq;
return 0; return 0;
} }
u64 xe_gt_clock_cycles_to_ns(const struct xe_gt *gt, u64 count) u64 xe_gt_clock_cycles_to_ns(const struct xe_gt *gt, u64 count)
{ {
return DIV_ROUND_CLOSEST_ULL(count * NSEC_PER_SEC, gt->info.clock_freq); return DIV_ROUND_CLOSEST_ULL(count * NSEC_PER_SEC, gt->info.reference_clock);
} }
...@@ -107,8 +107,8 @@ struct xe_gt { ...@@ -107,8 +107,8 @@ struct xe_gt {
enum xe_gt_type type; enum xe_gt_type type;
/** @id: Unique ID of this GT within the PCI Device */ /** @id: Unique ID of this GT within the PCI Device */
u8 id; u8 id;
/** @clock_freq: clock frequency */ /** @reference_clock: clock frequency */
u32 clock_freq; u32 reference_clock;
/** @engine_mask: mask of engines present on GT */ /** @engine_mask: mask of engines present on GT */
u64 engine_mask; u64 engine_mask;
/** /**
......
...@@ -147,8 +147,6 @@ query_engine_cycles(struct xe_device *xe, ...@@ -147,8 +147,6 @@ query_engine_cycles(struct xe_device *xe,
if (!hwe) if (!hwe)
return -EINVAL; return -EINVAL;
resp.engine_frequency = gt->info.clock_freq;
xe_device_mem_access_get(xe); xe_device_mem_access_get(xe);
xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
...@@ -165,9 +163,6 @@ query_engine_cycles(struct xe_device *xe, ...@@ -165,9 +163,6 @@ query_engine_cycles(struct xe_device *xe,
resp.width = 36; resp.width = 36;
/* Only write to the output fields of user query */ /* Only write to the output fields of user query */
if (put_user(resp.engine_frequency, &query_ptr->engine_frequency))
return -EFAULT;
if (put_user(resp.cpu_timestamp, &query_ptr->cpu_timestamp)) if (put_user(resp.cpu_timestamp, &query_ptr->cpu_timestamp))
return -EFAULT; return -EFAULT;
...@@ -383,7 +378,7 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query ...@@ -383,7 +378,7 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query
else else
gt_list->gt_list[id].type = DRM_XE_QUERY_GT_TYPE_MAIN; gt_list->gt_list[id].type = DRM_XE_QUERY_GT_TYPE_MAIN;
gt_list->gt_list[id].gt_id = gt->info.id; gt_list->gt_list[id].gt_id = gt->info.id;
gt_list->gt_list[id].clock_freq = gt->info.clock_freq; gt_list->gt_list[id].reference_clock = gt->info.reference_clock;
if (!IS_DGFX(xe)) if (!IS_DGFX(xe))
gt_list->gt_list[id].near_mem_regions = 0x1; gt_list->gt_list[id].near_mem_regions = 0x1;
else else
......
...@@ -281,8 +281,8 @@ struct drm_xe_mem_region { ...@@ -281,8 +281,8 @@ struct drm_xe_mem_region {
* in .data. struct drm_xe_query_engine_cycles is allocated by the user and * in .data. struct drm_xe_query_engine_cycles is allocated by the user and
* .data points to this allocated structure. * .data points to this allocated structure.
* *
* The query returns the engine cycles and the frequency that can * The query returns the engine cycles, which along with GT's @reference_clock,
* be used to calculate the engine timestamp. In addition the * can be used to calculate the engine timestamp. In addition the
* query returns a set of cpu timestamps that indicate when the command * query returns a set of cpu timestamps that indicate when the command
* streamer cycle count was captured. * streamer cycle count was captured.
*/ */
...@@ -310,9 +310,6 @@ struct drm_xe_query_engine_cycles { ...@@ -310,9 +310,6 @@ struct drm_xe_query_engine_cycles {
*/ */
__u64 engine_cycles; __u64 engine_cycles;
/** @engine_frequency: Frequency of the engine cycles in Hz. */
__u64 engine_frequency;
/** /**
* @cpu_timestamp: CPU timestamp in ns. The timestamp is captured before * @cpu_timestamp: CPU timestamp in ns. The timestamp is captured before
* reading the engine_cycles register using the reference clockid set by the * reading the engine_cycles register using the reference clockid set by the
...@@ -383,8 +380,8 @@ struct drm_xe_gt { ...@@ -383,8 +380,8 @@ struct drm_xe_gt {
__u16 type; __u16 type;
/** @gt_id: Unique ID of this GT within the PCI Device */ /** @gt_id: Unique ID of this GT within the PCI Device */
__u16 gt_id; __u16 gt_id;
/** @clock_freq: A clock frequency for timestamp */ /** @reference_clock: A clock frequency for timestamp */
__u32 clock_freq; __u32 reference_clock;
/** /**
* @near_mem_regions: Bit mask of instances from * @near_mem_regions: Bit mask of instances from
* drm_xe_query_mem_regions that are nearest to the current engines * drm_xe_query_mem_regions that are nearest to the current engines
......
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