diff options
Diffstat (limited to 'drivers/edgetpu/edgetpu-usage-stats.c')
-rw-r--r-- | drivers/edgetpu/edgetpu-usage-stats.c | 142 |
1 files changed, 131 insertions, 11 deletions
diff --git a/drivers/edgetpu/edgetpu-usage-stats.c b/drivers/edgetpu/edgetpu-usage-stats.c index 1404674..c13b42e 100644 --- a/drivers/edgetpu/edgetpu-usage-stats.c +++ b/drivers/edgetpu/edgetpu-usage-stats.c @@ -17,6 +17,7 @@ #include "abrolhos-pm.h" static enum tpu_pwr_state tpu_states_arr[] = { + TPU_ACTIVE_UUD, TPU_ACTIVE_SUD, TPU_ACTIVE_UD, TPU_ACTIVE_NOM, @@ -151,6 +152,22 @@ static void edgetpu_counter_update( mutex_unlock(&ustats->usage_stats_lock); } +static void edgetpu_counter_clear( + struct edgetpu_dev *etdev, + enum edgetpu_usage_counter_type counter_type) +{ + struct edgetpu_usage_stats *ustats = etdev->usage_stats; + + if (!ustats) + return; + if (counter_type >= EDGETPU_COUNTER_COUNT) + return; + + mutex_lock(&ustats->usage_stats_lock); + ustats->counter[counter_type] = 0; + mutex_unlock(&ustats->usage_stats_lock); +} + static void edgetpu_max_watermark_update( struct edgetpu_dev *etdev, struct edgetpu_usage_max_watermark *max_watermark) @@ -364,7 +381,7 @@ static ssize_t tpu_usage_clear(struct device *dev, return count; } -static DEVICE_ATTR(tpu_usage, 0644, tpu_usage_show, tpu_usage_clear); +static DEVICE_ATTR(tpu_usage, 0664, tpu_usage_show, tpu_usage_clear); static ssize_t device_utilization_show(struct device *dev, struct device_attribute *attr, @@ -403,7 +420,19 @@ static ssize_t tpu_active_cycle_count_show(struct device *dev, EDGETPU_COUNTER_TPU_ACTIVE_CYCLES); return scnprintf(buf, PAGE_SIZE, "%llu\n", val); } -static DEVICE_ATTR_RO(tpu_active_cycle_count); + +static ssize_t tpu_active_cycle_count_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + edgetpu_counter_clear(etdev, EDGETPU_COUNTER_TPU_ACTIVE_CYCLES); + return count; +} +static DEVICE_ATTR(tpu_active_cycle_count, 0664, tpu_active_cycle_count_show, + tpu_active_cycle_count_store); static ssize_t tpu_throttle_stall_count_show(struct device *dev, struct device_attribute *attr, @@ -416,7 +445,20 @@ static ssize_t tpu_throttle_stall_count_show(struct device *dev, EDGETPU_COUNTER_TPU_THROTTLE_STALLS); return scnprintf(buf, PAGE_SIZE, "%llu\n", val); } -static DEVICE_ATTR_RO(tpu_throttle_stall_count); + +static ssize_t tpu_throttle_stall_count_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + edgetpu_counter_clear(etdev, EDGETPU_COUNTER_TPU_THROTTLE_STALLS); + return count; +} +static DEVICE_ATTR(tpu_throttle_stall_count, 0664, + tpu_throttle_stall_count_show, + tpu_throttle_stall_count_store); static ssize_t inference_count_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -428,7 +470,19 @@ static ssize_t inference_count_show(struct device *dev, EDGETPU_COUNTER_INFERENCES); return scnprintf(buf, PAGE_SIZE, "%llu\n", val); } -static DEVICE_ATTR_RO(inference_count); + +static ssize_t inference_count_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + edgetpu_counter_clear(etdev, EDGETPU_COUNTER_INFERENCES); + return count; +} +static DEVICE_ATTR(inference_count, 0664, inference_count_show, + inference_count_store); static ssize_t tpu_op_count_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -440,7 +494,18 @@ static ssize_t tpu_op_count_show(struct device *dev, EDGETPU_COUNTER_TPU_OPS); return scnprintf(buf, PAGE_SIZE, "%llu\n", val); } -static DEVICE_ATTR_RO(tpu_op_count); + +static ssize_t tpu_op_count_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + edgetpu_counter_clear(etdev, EDGETPU_COUNTER_TPU_OPS); + return count; +} +static DEVICE_ATTR(tpu_op_count, 0664, tpu_op_count_show, tpu_op_count_store); static ssize_t param_cache_hit_count_show(struct device *dev, struct device_attribute *attr, @@ -453,7 +518,19 @@ static ssize_t param_cache_hit_count_show(struct device *dev, EDGETPU_COUNTER_PARAM_CACHE_HITS); return scnprintf(buf, PAGE_SIZE, "%llu\n", val); } -static DEVICE_ATTR_RO(param_cache_hit_count); + +static ssize_t param_cache_hit_count_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + edgetpu_counter_clear(etdev, EDGETPU_COUNTER_PARAM_CACHE_HITS); + return count; +} +static DEVICE_ATTR(param_cache_hit_count, 0664, param_cache_hit_count_show, + param_cache_hit_count_store); static ssize_t param_cache_miss_count_show(struct device *dev, struct device_attribute *attr, @@ -466,7 +543,19 @@ static ssize_t param_cache_miss_count_show(struct device *dev, EDGETPU_COUNTER_PARAM_CACHE_MISSES); return scnprintf(buf, PAGE_SIZE, "%llu\n", val); } -static DEVICE_ATTR_RO(param_cache_miss_count); + +static ssize_t param_cache_miss_count_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + edgetpu_counter_clear(etdev, EDGETPU_COUNTER_PARAM_CACHE_MISSES); + return count; +} +static DEVICE_ATTR(param_cache_miss_count, 0664, param_cache_miss_count_show, + param_cache_miss_count_store); static ssize_t context_preempt_count_show(struct device *dev, struct device_attribute *attr, @@ -479,7 +568,19 @@ static ssize_t context_preempt_count_show(struct device *dev, EDGETPU_COUNTER_CONTEXT_PREEMPTS); return scnprintf(buf, PAGE_SIZE, "%llu\n", val); } -static DEVICE_ATTR_RO(context_preempt_count); + +static ssize_t context_preempt_count_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + edgetpu_counter_clear(etdev, EDGETPU_COUNTER_CONTEXT_PREEMPTS); + return count; +} +static DEVICE_ATTR(context_preempt_count, 0664, context_preempt_count_show, + context_preempt_count_store); static ssize_t outstanding_commands_max_show( struct device *dev, struct device_attribute *attr, char *buf) @@ -507,7 +608,9 @@ static ssize_t outstanding_commands_max_store( return count; } -static DEVICE_ATTR_RW(outstanding_commands_max); +static DEVICE_ATTR(outstanding_commands_max, 0664, + outstanding_commands_max_show, + outstanding_commands_max_store); static ssize_t preempt_depth_max_show( struct device *dev, struct device_attribute *attr, char *buf) @@ -535,7 +638,8 @@ static ssize_t preempt_depth_max_store( return count; } -static DEVICE_ATTR_RW(preempt_depth_max); +static DEVICE_ATTR(preempt_depth_max, 0664, preempt_depth_max_show, + preempt_depth_max_store); static ssize_t fw_thread_stats_show( struct device *dev, struct device_attribute *attr, char *buf) @@ -559,7 +663,23 @@ static ssize_t fw_thread_stats_show( mutex_unlock(&ustats->usage_stats_lock); return ret; } -static DEVICE_ATTR_RO(fw_thread_stats); + +static ssize_t fw_thread_stats_store( + struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + struct edgetpu_usage_stats *ustats = etdev->usage_stats; + int i; + + mutex_lock(&ustats->usage_stats_lock); + for (i = 0; i < EDGETPU_FW_THREAD_COUNT; i++) + ustats->thread_stack_max[i] = 0; + mutex_unlock(&ustats->usage_stats_lock); + return count; +} +static DEVICE_ATTR(fw_thread_stats, 0664, fw_thread_stats_show, + fw_thread_stats_store); static struct attribute *usage_stats_dev_attrs[] = { &dev_attr_tpu_usage.attr, |