GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / accel / habanalabs / common / habanalabs_ioctl.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 /*
4  * Copyright 2016-2022 HabanaLabs, Ltd.
5  * All Rights Reserved.
6  */
7
8 #define pr_fmt(fmt)     "habanalabs: " fmt
9
10 #include <uapi/drm/habanalabs_accel.h>
11 #include "habanalabs.h"
12
13 #include <linux/fs.h>
14 #include <linux/kernel.h>
15 #include <linux/pci.h>
16 #include <linux/slab.h>
17 #include <linux/uaccess.h>
18 #include <linux/vmalloc.h>
19
20 #include <asm/msr.h>
21
22 /* make sure there is space for all the signed info */
23 static_assert(sizeof(struct cpucp_info) <= SEC_DEV_INFO_BUF_SZ);
24
25 static u32 hl_debug_struct_size[HL_DEBUG_OP_TIMESTAMP + 1] = {
26         [HL_DEBUG_OP_ETR] = sizeof(struct hl_debug_params_etr),
27         [HL_DEBUG_OP_ETF] = sizeof(struct hl_debug_params_etf),
28         [HL_DEBUG_OP_STM] = sizeof(struct hl_debug_params_stm),
29         [HL_DEBUG_OP_FUNNEL] = 0,
30         [HL_DEBUG_OP_BMON] = sizeof(struct hl_debug_params_bmon),
31         [HL_DEBUG_OP_SPMU] = sizeof(struct hl_debug_params_spmu),
32         [HL_DEBUG_OP_TIMESTAMP] = 0
33
34 };
35
36 static int device_status_info(struct hl_device *hdev, struct hl_info_args *args)
37 {
38         struct hl_info_device_status dev_stat = {0};
39         u32 size = args->return_size;
40         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
41
42         if ((!size) || (!out))
43                 return -EINVAL;
44
45         dev_stat.status = hl_device_status(hdev);
46
47         return copy_to_user(out, &dev_stat,
48                         min((size_t)size, sizeof(dev_stat))) ? -EFAULT : 0;
49 }
50
51 static int hw_ip_info(struct hl_device *hdev, struct hl_info_args *args)
52 {
53         struct hl_info_hw_ip_info hw_ip = {0};
54         u32 size = args->return_size;
55         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
56         struct asic_fixed_properties *prop = &hdev->asic_prop;
57         u64 sram_kmd_size, dram_kmd_size, dram_available_size;
58
59         if ((!size) || (!out))
60                 return -EINVAL;
61
62         sram_kmd_size = (prop->sram_user_base_address -
63                                 prop->sram_base_address);
64         dram_kmd_size = (prop->dram_user_base_address -
65                                 prop->dram_base_address);
66
67         hw_ip.device_id = hdev->asic_funcs->get_pci_id(hdev);
68         hw_ip.sram_base_address = prop->sram_user_base_address;
69         hw_ip.dram_base_address =
70                         prop->dram_supports_virtual_memory ?
71                         prop->dmmu.start_addr : prop->dram_user_base_address;
72         hw_ip.tpc_enabled_mask = prop->tpc_enabled_mask & 0xFF;
73         hw_ip.tpc_enabled_mask_ext = prop->tpc_enabled_mask;
74
75         hw_ip.sram_size = prop->sram_size - sram_kmd_size;
76
77         dram_available_size = prop->dram_size - dram_kmd_size;
78
79         hw_ip.dram_size = DIV_ROUND_DOWN_ULL(dram_available_size, prop->dram_page_size) *
80                                 prop->dram_page_size;
81
82         if (hw_ip.dram_size > PAGE_SIZE)
83                 hw_ip.dram_enabled = 1;
84
85         hw_ip.dram_page_size = prop->dram_page_size;
86         hw_ip.device_mem_alloc_default_page_size = prop->device_mem_alloc_default_page_size;
87         hw_ip.num_of_events = prop->num_of_events;
88
89         memcpy(hw_ip.cpucp_version, prop->cpucp_info.cpucp_version,
90                 min(VERSION_MAX_LEN, HL_INFO_VERSION_MAX_LEN));
91
92         memcpy(hw_ip.card_name, prop->cpucp_info.card_name,
93                 min(CARD_NAME_MAX_LEN, HL_INFO_CARD_NAME_MAX_LEN));
94
95         hw_ip.cpld_version = le32_to_cpu(prop->cpucp_info.cpld_version);
96         hw_ip.module_id = le32_to_cpu(prop->cpucp_info.card_location);
97
98         hw_ip.psoc_pci_pll_nr = prop->psoc_pci_pll_nr;
99         hw_ip.psoc_pci_pll_nf = prop->psoc_pci_pll_nf;
100         hw_ip.psoc_pci_pll_od = prop->psoc_pci_pll_od;
101         hw_ip.psoc_pci_pll_div_factor = prop->psoc_pci_pll_div_factor;
102
103         hw_ip.decoder_enabled_mask = prop->decoder_enabled_mask;
104         hw_ip.mme_master_slave_mode = prop->mme_master_slave_mode;
105         hw_ip.first_available_interrupt_id = prop->first_available_user_interrupt;
106         hw_ip.number_of_user_interrupts = prop->user_interrupt_count;
107         hw_ip.tpc_interrupt_id = prop->tpc_interrupt_id;
108
109         hw_ip.edma_enabled_mask = prop->edma_enabled_mask;
110         hw_ip.server_type = prop->server_type;
111         hw_ip.security_enabled = prop->fw_security_enabled;
112         hw_ip.revision_id = hdev->pdev->revision;
113         hw_ip.rotator_enabled_mask = prop->rotator_enabled_mask;
114         hw_ip.engine_core_interrupt_reg_addr = prop->engine_core_interrupt_reg_addr;
115         hw_ip.reserved_dram_size = dram_kmd_size;
116
117         return copy_to_user(out, &hw_ip,
118                 min((size_t) size, sizeof(hw_ip))) ? -EFAULT : 0;
119 }
120
121 static int hw_events_info(struct hl_device *hdev, bool aggregate,
122                         struct hl_info_args *args)
123 {
124         u32 size, max_size = args->return_size;
125         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
126         void *arr;
127
128         if ((!max_size) || (!out))
129                 return -EINVAL;
130
131         arr = hdev->asic_funcs->get_events_stat(hdev, aggregate, &size);
132         if (!arr) {
133                 dev_err(hdev->dev, "Events info not supported\n");
134                 return -EOPNOTSUPP;
135         }
136
137         return copy_to_user(out, arr, min(max_size, size)) ? -EFAULT : 0;
138 }
139
140 static int events_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
141 {
142         u32 max_size = args->return_size;
143         u64 events_mask;
144         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
145
146         if ((max_size < sizeof(u64)) || (!out))
147                 return -EINVAL;
148
149         mutex_lock(&hpriv->notifier_event.lock);
150         events_mask = hpriv->notifier_event.events_mask;
151         hpriv->notifier_event.events_mask = 0;
152         mutex_unlock(&hpriv->notifier_event.lock);
153
154         return copy_to_user(out, &events_mask, sizeof(u64)) ? -EFAULT : 0;
155 }
156
157 static int dram_usage_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
158 {
159         struct hl_device *hdev = hpriv->hdev;
160         struct hl_info_dram_usage dram_usage = {0};
161         u32 max_size = args->return_size;
162         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
163         struct asic_fixed_properties *prop = &hdev->asic_prop;
164         u64 dram_kmd_size;
165
166         if ((!max_size) || (!out))
167                 return -EINVAL;
168
169         dram_kmd_size = (prop->dram_user_base_address -
170                                 prop->dram_base_address);
171         dram_usage.dram_free_mem = (prop->dram_size - dram_kmd_size) -
172                                         atomic64_read(&hdev->dram_used_mem);
173         if (hpriv->ctx)
174                 dram_usage.ctx_dram_mem =
175                         atomic64_read(&hpriv->ctx->dram_phys_mem);
176
177         return copy_to_user(out, &dram_usage,
178                 min((size_t) max_size, sizeof(dram_usage))) ? -EFAULT : 0;
179 }
180
181 static int hw_idle(struct hl_device *hdev, struct hl_info_args *args)
182 {
183         struct hl_info_hw_idle hw_idle = {0};
184         u32 max_size = args->return_size;
185         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
186
187         if ((!max_size) || (!out))
188                 return -EINVAL;
189
190         hw_idle.is_idle = hdev->asic_funcs->is_device_idle(hdev,
191                                         hw_idle.busy_engines_mask_ext,
192                                         HL_BUSY_ENGINES_MASK_EXT_SIZE, NULL);
193         hw_idle.busy_engines_mask =
194                         lower_32_bits(hw_idle.busy_engines_mask_ext[0]);
195
196         return copy_to_user(out, &hw_idle,
197                 min((size_t) max_size, sizeof(hw_idle))) ? -EFAULT : 0;
198 }
199
200 static int debug_coresight(struct hl_device *hdev, struct hl_ctx *ctx, struct hl_debug_args *args)
201 {
202         struct hl_debug_params *params;
203         void *input = NULL, *output = NULL;
204         int rc;
205
206         params = kzalloc(sizeof(*params), GFP_KERNEL);
207         if (!params)
208                 return -ENOMEM;
209
210         params->reg_idx = args->reg_idx;
211         params->enable = args->enable;
212         params->op = args->op;
213
214         if (args->input_ptr && args->input_size) {
215                 input = kzalloc(hl_debug_struct_size[args->op], GFP_KERNEL);
216                 if (!input) {
217                         rc = -ENOMEM;
218                         goto out;
219                 }
220
221                 if (copy_from_user(input, u64_to_user_ptr(args->input_ptr),
222                                         args->input_size)) {
223                         rc = -EFAULT;
224                         dev_err(hdev->dev, "failed to copy input debug data\n");
225                         goto out;
226                 }
227
228                 params->input = input;
229         }
230
231         if (args->output_ptr && args->output_size) {
232                 output = kzalloc(args->output_size, GFP_KERNEL);
233                 if (!output) {
234                         rc = -ENOMEM;
235                         goto out;
236                 }
237
238                 params->output = output;
239                 params->output_size = args->output_size;
240         }
241
242         rc = hdev->asic_funcs->debug_coresight(hdev, ctx, params);
243         if (rc) {
244                 dev_err(hdev->dev,
245                         "debug coresight operation failed %d\n", rc);
246                 goto out;
247         }
248
249         if (output && copy_to_user((void __user *) (uintptr_t) args->output_ptr,
250                                         output, args->output_size)) {
251                 dev_err(hdev->dev, "copy to user failed in debug ioctl\n");
252                 rc = -EFAULT;
253                 goto out;
254         }
255
256
257 out:
258         kfree(params);
259         kfree(output);
260         kfree(input);
261
262         return rc;
263 }
264
265 static int device_utilization(struct hl_device *hdev, struct hl_info_args *args)
266 {
267         struct hl_info_device_utilization device_util = {0};
268         u32 max_size = args->return_size;
269         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
270         int rc;
271
272         if ((!max_size) || (!out))
273                 return -EINVAL;
274
275         rc = hl_device_utilization(hdev, &device_util.utilization);
276         if (rc)
277                 return -EINVAL;
278
279         return copy_to_user(out, &device_util,
280                 min((size_t) max_size, sizeof(device_util))) ? -EFAULT : 0;
281 }
282
283 static int get_clk_rate(struct hl_device *hdev, struct hl_info_args *args)
284 {
285         struct hl_info_clk_rate clk_rate = {0};
286         u32 max_size = args->return_size;
287         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
288         int rc;
289
290         if ((!max_size) || (!out))
291                 return -EINVAL;
292
293         rc = hl_fw_get_clk_rate(hdev, &clk_rate.cur_clk_rate_mhz, &clk_rate.max_clk_rate_mhz);
294         if (rc)
295                 return rc;
296
297         return copy_to_user(out, &clk_rate, min_t(size_t, max_size, sizeof(clk_rate)))
298                                                                                 ? -EFAULT : 0;
299 }
300
301 static int get_reset_count(struct hl_device *hdev, struct hl_info_args *args)
302 {
303         struct hl_info_reset_count reset_count = {0};
304         u32 max_size = args->return_size;
305         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
306
307         if ((!max_size) || (!out))
308                 return -EINVAL;
309
310         reset_count.hard_reset_cnt = hdev->reset_info.hard_reset_cnt;
311         reset_count.soft_reset_cnt = hdev->reset_info.compute_reset_cnt;
312
313         return copy_to_user(out, &reset_count,
314                 min((size_t) max_size, sizeof(reset_count))) ? -EFAULT : 0;
315 }
316
317 static int time_sync_info(struct hl_device *hdev, struct hl_info_args *args)
318 {
319         struct hl_info_time_sync time_sync = {0};
320         u32 max_size = args->return_size;
321         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
322
323         if ((!max_size) || (!out))
324                 return -EINVAL;
325
326         time_sync.device_time = hdev->asic_funcs->get_device_time(hdev);
327         time_sync.host_time = ktime_get_raw_ns();
328         time_sync.tsc_time = rdtsc();
329
330         return copy_to_user(out, &time_sync,
331                 min((size_t) max_size, sizeof(time_sync))) ? -EFAULT : 0;
332 }
333
334 static int pci_counters_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
335 {
336         struct hl_device *hdev = hpriv->hdev;
337         struct hl_info_pci_counters pci_counters = {0};
338         u32 max_size = args->return_size;
339         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
340         int rc;
341
342         if ((!max_size) || (!out))
343                 return -EINVAL;
344
345         rc = hl_fw_cpucp_pci_counters_get(hdev, &pci_counters);
346         if (rc)
347                 return rc;
348
349         return copy_to_user(out, &pci_counters,
350                 min((size_t) max_size, sizeof(pci_counters))) ? -EFAULT : 0;
351 }
352
353 static int clk_throttle_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
354 {
355         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
356         struct hl_device *hdev = hpriv->hdev;
357         struct hl_info_clk_throttle clk_throttle = {0};
358         ktime_t end_time, zero_time = ktime_set(0, 0);
359         u32 max_size = args->return_size;
360         int i;
361
362         if ((!max_size) || (!out))
363                 return -EINVAL;
364
365         mutex_lock(&hdev->clk_throttling.lock);
366
367         clk_throttle.clk_throttling_reason = hdev->clk_throttling.current_reason;
368
369         for (i = 0 ; i < HL_CLK_THROTTLE_TYPE_MAX ; i++) {
370                 if (!(hdev->clk_throttling.aggregated_reason & BIT(i)))
371                         continue;
372
373                 clk_throttle.clk_throttling_timestamp_us[i] =
374                         ktime_to_us(hdev->clk_throttling.timestamp[i].start);
375
376                 if (ktime_compare(hdev->clk_throttling.timestamp[i].end, zero_time))
377                         end_time = hdev->clk_throttling.timestamp[i].end;
378                 else
379                         end_time = ktime_get();
380
381                 clk_throttle.clk_throttling_duration_ns[i] =
382                         ktime_to_ns(ktime_sub(end_time,
383                                 hdev->clk_throttling.timestamp[i].start));
384
385         }
386         mutex_unlock(&hdev->clk_throttling.lock);
387
388         return copy_to_user(out, &clk_throttle,
389                 min((size_t) max_size, sizeof(clk_throttle))) ? -EFAULT : 0;
390 }
391
392 static int cs_counters_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
393 {
394         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
395         struct hl_info_cs_counters cs_counters = {0};
396         struct hl_device *hdev = hpriv->hdev;
397         struct hl_cs_counters_atomic *cntr;
398         u32 max_size = args->return_size;
399
400         cntr = &hdev->aggregated_cs_counters;
401
402         if ((!max_size) || (!out))
403                 return -EINVAL;
404
405         cs_counters.total_out_of_mem_drop_cnt =
406                         atomic64_read(&cntr->out_of_mem_drop_cnt);
407         cs_counters.total_parsing_drop_cnt =
408                         atomic64_read(&cntr->parsing_drop_cnt);
409         cs_counters.total_queue_full_drop_cnt =
410                         atomic64_read(&cntr->queue_full_drop_cnt);
411         cs_counters.total_device_in_reset_drop_cnt =
412                         atomic64_read(&cntr->device_in_reset_drop_cnt);
413         cs_counters.total_max_cs_in_flight_drop_cnt =
414                         atomic64_read(&cntr->max_cs_in_flight_drop_cnt);
415         cs_counters.total_validation_drop_cnt =
416                         atomic64_read(&cntr->validation_drop_cnt);
417
418         if (hpriv->ctx) {
419                 cs_counters.ctx_out_of_mem_drop_cnt =
420                                 atomic64_read(
421                                 &hpriv->ctx->cs_counters.out_of_mem_drop_cnt);
422                 cs_counters.ctx_parsing_drop_cnt =
423                                 atomic64_read(
424                                 &hpriv->ctx->cs_counters.parsing_drop_cnt);
425                 cs_counters.ctx_queue_full_drop_cnt =
426                                 atomic64_read(
427                                 &hpriv->ctx->cs_counters.queue_full_drop_cnt);
428                 cs_counters.ctx_device_in_reset_drop_cnt =
429                                 atomic64_read(
430                         &hpriv->ctx->cs_counters.device_in_reset_drop_cnt);
431                 cs_counters.ctx_max_cs_in_flight_drop_cnt =
432                                 atomic64_read(
433                         &hpriv->ctx->cs_counters.max_cs_in_flight_drop_cnt);
434                 cs_counters.ctx_validation_drop_cnt =
435                                 atomic64_read(
436                                 &hpriv->ctx->cs_counters.validation_drop_cnt);
437         }
438
439         return copy_to_user(out, &cs_counters,
440                 min((size_t) max_size, sizeof(cs_counters))) ? -EFAULT : 0;
441 }
442
443 static int sync_manager_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
444 {
445         struct hl_device *hdev = hpriv->hdev;
446         struct asic_fixed_properties *prop = &hdev->asic_prop;
447         struct hl_info_sync_manager sm_info = {0};
448         u32 max_size = args->return_size;
449         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
450
451         if ((!max_size) || (!out))
452                 return -EINVAL;
453
454         if (args->dcore_id >= HL_MAX_DCORES)
455                 return -EINVAL;
456
457         sm_info.first_available_sync_object =
458                         prop->first_available_user_sob[args->dcore_id];
459         sm_info.first_available_monitor =
460                         prop->first_available_user_mon[args->dcore_id];
461         sm_info.first_available_cq =
462                         prop->first_available_cq[args->dcore_id];
463
464         return copy_to_user(out, &sm_info, min_t(size_t, (size_t) max_size,
465                         sizeof(sm_info))) ? -EFAULT : 0;
466 }
467
468 static int total_energy_consumption_info(struct hl_fpriv *hpriv,
469                         struct hl_info_args *args)
470 {
471         struct hl_device *hdev = hpriv->hdev;
472         struct hl_info_energy total_energy = {0};
473         u32 max_size = args->return_size;
474         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
475         int rc;
476
477         if ((!max_size) || (!out))
478                 return -EINVAL;
479
480         rc = hl_fw_cpucp_total_energy_get(hdev,
481                         &total_energy.total_energy_consumption);
482         if (rc)
483                 return rc;
484
485         return copy_to_user(out, &total_energy,
486                 min((size_t) max_size, sizeof(total_energy))) ? -EFAULT : 0;
487 }
488
489 static int pll_frequency_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
490 {
491         struct hl_device *hdev = hpriv->hdev;
492         struct hl_pll_frequency_info freq_info = { {0} };
493         u32 max_size = args->return_size;
494         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
495         int rc;
496
497         if ((!max_size) || (!out))
498                 return -EINVAL;
499
500         rc = hl_fw_cpucp_pll_info_get(hdev, args->pll_index, freq_info.output);
501         if (rc)
502                 return rc;
503
504         return copy_to_user(out, &freq_info,
505                 min((size_t) max_size, sizeof(freq_info))) ? -EFAULT : 0;
506 }
507
508 static int power_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
509 {
510         struct hl_device *hdev = hpriv->hdev;
511         u32 max_size = args->return_size;
512         struct hl_power_info power_info = {0};
513         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
514         int rc;
515
516         if ((!max_size) || (!out))
517                 return -EINVAL;
518
519         rc = hl_fw_cpucp_power_get(hdev, &power_info.power);
520         if (rc)
521                 return rc;
522
523         return copy_to_user(out, &power_info,
524                 min((size_t) max_size, sizeof(power_info))) ? -EFAULT : 0;
525 }
526
527 static int open_stats_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
528 {
529         struct hl_device *hdev = hpriv->hdev;
530         u32 max_size = args->return_size;
531         struct hl_open_stats_info open_stats_info = {0};
532         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
533
534         if ((!max_size) || (!out))
535                 return -EINVAL;
536
537         open_stats_info.last_open_period_ms = jiffies64_to_msecs(
538                 hdev->last_open_session_duration_jif);
539         open_stats_info.open_counter = hdev->open_counter;
540         open_stats_info.is_compute_ctx_active = hdev->is_compute_ctx_active;
541         open_stats_info.compute_ctx_in_release = hdev->compute_ctx_in_release;
542
543         return copy_to_user(out, &open_stats_info,
544                 min((size_t) max_size, sizeof(open_stats_info))) ? -EFAULT : 0;
545 }
546
547 static int dram_pending_rows_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
548 {
549         struct hl_device *hdev = hpriv->hdev;
550         u32 max_size = args->return_size;
551         u32 pend_rows_num = 0;
552         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
553         int rc;
554
555         if ((!max_size) || (!out))
556                 return -EINVAL;
557
558         rc = hl_fw_dram_pending_row_get(hdev, &pend_rows_num);
559         if (rc)
560                 return rc;
561
562         return copy_to_user(out, &pend_rows_num,
563                         min_t(size_t, max_size, sizeof(pend_rows_num))) ? -EFAULT : 0;
564 }
565
566 static int dram_replaced_rows_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
567 {
568         struct hl_device *hdev = hpriv->hdev;
569         u32 max_size = args->return_size;
570         struct cpucp_hbm_row_info info = {0};
571         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
572         int rc;
573
574         if ((!max_size) || (!out))
575                 return -EINVAL;
576
577         rc = hl_fw_dram_replaced_row_get(hdev, &info);
578         if (rc)
579                 return rc;
580
581         return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
582 }
583
584 static int last_err_open_dev_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
585 {
586         struct hl_info_last_err_open_dev_time info = {0};
587         struct hl_device *hdev = hpriv->hdev;
588         u32 max_size = args->return_size;
589         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
590
591         if ((!max_size) || (!out))
592                 return -EINVAL;
593
594         info.timestamp = ktime_to_ns(hdev->last_successful_open_ktime);
595
596         return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
597 }
598
599 static int cs_timeout_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
600 {
601         struct hl_info_cs_timeout_event info = {0};
602         struct hl_device *hdev = hpriv->hdev;
603         u32 max_size = args->return_size;
604         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
605
606         if ((!max_size) || (!out))
607                 return -EINVAL;
608
609         info.seq = hdev->captured_err_info.cs_timeout.seq;
610         info.timestamp = ktime_to_ns(hdev->captured_err_info.cs_timeout.timestamp);
611
612         return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
613 }
614
615 static int razwi_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
616 {
617         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
618         struct hl_device *hdev = hpriv->hdev;
619         u32 max_size = args->return_size;
620         struct razwi_info *razwi_info;
621
622         if ((!max_size) || (!out))
623                 return -EINVAL;
624
625         razwi_info = &hdev->captured_err_info.razwi_info;
626         if (!razwi_info->razwi_info_available)
627                 return 0;
628
629         return copy_to_user(out, &razwi_info->razwi,
630                         min_t(size_t, max_size, sizeof(struct hl_info_razwi_event))) ? -EFAULT : 0;
631 }
632
633 static int undefined_opcode_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
634 {
635         struct hl_device *hdev = hpriv->hdev;
636         u32 max_size = args->return_size;
637         struct hl_info_undefined_opcode_event info = {0};
638         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
639
640         if ((!max_size) || (!out))
641                 return -EINVAL;
642
643         info.timestamp = ktime_to_ns(hdev->captured_err_info.undef_opcode.timestamp);
644         info.engine_id = hdev->captured_err_info.undef_opcode.engine_id;
645         info.cq_addr = hdev->captured_err_info.undef_opcode.cq_addr;
646         info.cq_size = hdev->captured_err_info.undef_opcode.cq_size;
647         info.stream_id = hdev->captured_err_info.undef_opcode.stream_id;
648         info.cb_addr_streams_len = hdev->captured_err_info.undef_opcode.cb_addr_streams_len;
649         memcpy(info.cb_addr_streams, hdev->captured_err_info.undef_opcode.cb_addr_streams,
650                         sizeof(info.cb_addr_streams));
651
652         return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
653 }
654
655 static int dev_mem_alloc_page_sizes_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
656 {
657         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
658         struct hl_info_dev_memalloc_page_sizes info = {0};
659         struct hl_device *hdev = hpriv->hdev;
660         u32 max_size = args->return_size;
661
662         if ((!max_size) || (!out))
663                 return -EINVAL;
664
665         /*
666          * Future ASICs that will support multiple DRAM page sizes will support only "powers of 2"
667          * pages (unlike some of the ASICs before supporting multiple page sizes).
668          * For this reason for all ASICs that not support multiple page size the function will
669          * return an empty bitmask indicating that multiple page sizes is not supported.
670          */
671         info.page_order_bitmask = hdev->asic_prop.dmmu.supported_pages_mask;
672
673         return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
674 }
675
676 static int sec_attest_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
677 {
678         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
679         struct cpucp_sec_attest_info *sec_attest_info;
680         struct hl_info_sec_attest *info;
681         u32 max_size = args->return_size;
682         int rc;
683
684         if ((!max_size) || (!out))
685                 return -EINVAL;
686
687         sec_attest_info = kmalloc(sizeof(*sec_attest_info), GFP_KERNEL);
688         if (!sec_attest_info)
689                 return -ENOMEM;
690
691         info = kzalloc(sizeof(*info), GFP_KERNEL);
692         if (!info) {
693                 rc = -ENOMEM;
694                 goto free_sec_attest_info;
695         }
696
697         rc = hl_fw_get_sec_attest_info(hpriv->hdev, sec_attest_info, args->sec_attest_nonce);
698         if (rc)
699                 goto free_info;
700
701         info->nonce = le32_to_cpu(sec_attest_info->nonce);
702         info->pcr_quote_len = le16_to_cpu(sec_attest_info->pcr_quote_len);
703         info->pub_data_len = le16_to_cpu(sec_attest_info->pub_data_len);
704         info->certificate_len = le16_to_cpu(sec_attest_info->certificate_len);
705         info->pcr_num_reg = sec_attest_info->pcr_num_reg;
706         info->pcr_reg_len = sec_attest_info->pcr_reg_len;
707         info->quote_sig_len = sec_attest_info->quote_sig_len;
708         memcpy(&info->pcr_data, &sec_attest_info->pcr_data, sizeof(info->pcr_data));
709         memcpy(&info->pcr_quote, &sec_attest_info->pcr_quote, sizeof(info->pcr_quote));
710         memcpy(&info->public_data, &sec_attest_info->public_data, sizeof(info->public_data));
711         memcpy(&info->certificate, &sec_attest_info->certificate, sizeof(info->certificate));
712         memcpy(&info->quote_sig, &sec_attest_info->quote_sig, sizeof(info->quote_sig));
713
714         rc = copy_to_user(out, info,
715                                 min_t(size_t, max_size, sizeof(*info))) ? -EFAULT : 0;
716
717 free_info:
718         kfree(info);
719 free_sec_attest_info:
720         kfree(sec_attest_info);
721
722         return rc;
723 }
724
725 static int dev_info_signed(struct hl_fpriv *hpriv, struct hl_info_args *args)
726 {
727         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
728         struct cpucp_dev_info_signed *dev_info_signed;
729         struct hl_info_signed *info;
730         u32 max_size = args->return_size;
731         int rc;
732
733         if ((!max_size) || (!out))
734                 return -EINVAL;
735
736         dev_info_signed = kzalloc(sizeof(*dev_info_signed), GFP_KERNEL);
737         if (!dev_info_signed)
738                 return -ENOMEM;
739
740         info = kzalloc(sizeof(*info), GFP_KERNEL);
741         if (!info) {
742                 rc = -ENOMEM;
743                 goto free_dev_info_signed;
744         }
745
746         rc = hl_fw_get_dev_info_signed(hpriv->hdev,
747                                         dev_info_signed, args->sec_attest_nonce);
748         if (rc)
749                 goto free_info;
750
751         info->nonce = le32_to_cpu(dev_info_signed->nonce);
752         info->info_sig_len = dev_info_signed->info_sig_len;
753         info->pub_data_len = le16_to_cpu(dev_info_signed->pub_data_len);
754         info->certificate_len = le16_to_cpu(dev_info_signed->certificate_len);
755         info->dev_info_len = sizeof(struct cpucp_info);
756         memcpy(&info->info_sig, &dev_info_signed->info_sig, sizeof(info->info_sig));
757         memcpy(&info->public_data, &dev_info_signed->public_data, sizeof(info->public_data));
758         memcpy(&info->certificate, &dev_info_signed->certificate, sizeof(info->certificate));
759         memcpy(&info->dev_info, &dev_info_signed->info, info->dev_info_len);
760
761         rc = copy_to_user(out, info, min_t(size_t, max_size, sizeof(*info))) ? -EFAULT : 0;
762
763 free_info:
764         kfree(info);
765 free_dev_info_signed:
766         kfree(dev_info_signed);
767
768         return rc;
769 }
770
771
772 static int eventfd_register(struct hl_fpriv *hpriv, struct hl_info_args *args)
773 {
774         int rc;
775
776         /* check if there is already a registered on that process */
777         mutex_lock(&hpriv->notifier_event.lock);
778         if (hpriv->notifier_event.eventfd) {
779                 mutex_unlock(&hpriv->notifier_event.lock);
780                 return -EINVAL;
781         }
782
783         hpriv->notifier_event.eventfd = eventfd_ctx_fdget(args->eventfd);
784         if (IS_ERR(hpriv->notifier_event.eventfd)) {
785                 rc = PTR_ERR(hpriv->notifier_event.eventfd);
786                 hpriv->notifier_event.eventfd = NULL;
787                 mutex_unlock(&hpriv->notifier_event.lock);
788                 return rc;
789         }
790
791         mutex_unlock(&hpriv->notifier_event.lock);
792         return 0;
793 }
794
795 static int eventfd_unregister(struct hl_fpriv *hpriv, struct hl_info_args *args)
796 {
797         mutex_lock(&hpriv->notifier_event.lock);
798         if (!hpriv->notifier_event.eventfd) {
799                 mutex_unlock(&hpriv->notifier_event.lock);
800                 return -EINVAL;
801         }
802
803         eventfd_ctx_put(hpriv->notifier_event.eventfd);
804         hpriv->notifier_event.eventfd = NULL;
805         mutex_unlock(&hpriv->notifier_event.lock);
806         return 0;
807 }
808
809 static int engine_status_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
810 {
811         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
812         u32 status_buf_size = args->return_size;
813         struct hl_device *hdev = hpriv->hdev;
814         struct engines_data eng_data;
815         int rc;
816
817         if ((status_buf_size < SZ_1K) || (status_buf_size > HL_ENGINES_DATA_MAX_SIZE) || (!out))
818                 return -EINVAL;
819
820         eng_data.actual_size = 0;
821         eng_data.allocated_buf_size = status_buf_size;
822         eng_data.buf = vmalloc(status_buf_size);
823         if (!eng_data.buf)
824                 return -ENOMEM;
825
826         hdev->asic_funcs->is_device_idle(hdev, NULL, 0, &eng_data);
827
828         if (eng_data.actual_size > eng_data.allocated_buf_size) {
829                 dev_err(hdev->dev,
830                         "Engines data size (%d Bytes) is bigger than allocated size (%u Bytes)\n",
831                         eng_data.actual_size, status_buf_size);
832                 vfree(eng_data.buf);
833                 return -ENOMEM;
834         }
835
836         args->user_buffer_actual_size = eng_data.actual_size;
837         rc = copy_to_user(out, eng_data.buf, min_t(size_t, status_buf_size, eng_data.actual_size)) ?
838                                 -EFAULT : 0;
839
840         vfree(eng_data.buf);
841
842         return rc;
843 }
844
845 static int page_fault_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
846 {
847         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
848         struct hl_device *hdev = hpriv->hdev;
849         u32 max_size = args->return_size;
850         struct page_fault_info *pgf_info;
851
852         if ((!max_size) || (!out))
853                 return -EINVAL;
854
855         pgf_info = &hdev->captured_err_info.page_fault_info;
856         if (!pgf_info->page_fault_info_available)
857                 return 0;
858
859         return copy_to_user(out, &pgf_info->page_fault,
860                         min_t(size_t, max_size, sizeof(struct hl_page_fault_info))) ? -EFAULT : 0;
861 }
862
863 static int user_mappings_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
864 {
865         void __user *out = (void __user *) (uintptr_t) args->return_pointer;
866         u32 user_buf_size = args->return_size;
867         struct hl_device *hdev = hpriv->hdev;
868         struct page_fault_info *pgf_info;
869         u64 actual_size;
870
871         if (!out)
872                 return -EINVAL;
873
874         pgf_info = &hdev->captured_err_info.page_fault_info;
875         if (!pgf_info->page_fault_info_available)
876                 return 0;
877
878         args->array_size = pgf_info->num_of_user_mappings;
879
880         actual_size = pgf_info->num_of_user_mappings * sizeof(struct hl_user_mapping);
881         if (user_buf_size < actual_size)
882                 return -ENOMEM;
883
884         return copy_to_user(out, pgf_info->user_mappings, actual_size) ? -EFAULT : 0;
885 }
886
887 static int hw_err_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
888 {
889         void __user *user_buf = (void __user *) (uintptr_t) args->return_pointer;
890         struct hl_device *hdev = hpriv->hdev;
891         u32 user_buf_size = args->return_size;
892         struct hw_err_info *info;
893         int rc;
894
895         if (!user_buf)
896                 return -EINVAL;
897
898         info = &hdev->captured_err_info.hw_err;
899         if (!info->event_info_available)
900                 return 0;
901
902         if (user_buf_size < sizeof(struct hl_info_hw_err_event))
903                 return -ENOMEM;
904
905         rc = copy_to_user(user_buf, &info->event, sizeof(struct hl_info_hw_err_event));
906         return rc ? -EFAULT : 0;
907 }
908
909 static int fw_err_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
910 {
911         void __user *user_buf = (void __user *) (uintptr_t) args->return_pointer;
912         struct hl_device *hdev = hpriv->hdev;
913         u32 user_buf_size = args->return_size;
914         struct fw_err_info *info;
915         int rc;
916
917         if (!user_buf)
918                 return -EINVAL;
919
920         info = &hdev->captured_err_info.fw_err;
921         if (!info->event_info_available)
922                 return 0;
923
924         if (user_buf_size < sizeof(struct hl_info_fw_err_event))
925                 return -ENOMEM;
926
927         rc = copy_to_user(user_buf, &info->event, sizeof(struct hl_info_fw_err_event));
928         return rc ? -EFAULT : 0;
929 }
930
931 static int engine_err_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
932 {
933         void __user *user_buf = (void __user *) (uintptr_t) args->return_pointer;
934         struct hl_device *hdev = hpriv->hdev;
935         u32 user_buf_size = args->return_size;
936         struct engine_err_info *info;
937         int rc;
938
939         if (!user_buf)
940                 return -EINVAL;
941
942         info = &hdev->captured_err_info.engine_err;
943         if (!info->event_info_available)
944                 return 0;
945
946         if (user_buf_size < sizeof(struct hl_info_engine_err_event))
947                 return -ENOMEM;
948
949         rc = copy_to_user(user_buf, &info->event, sizeof(struct hl_info_engine_err_event));
950         return rc ? -EFAULT : 0;
951 }
952
953 static int send_fw_generic_request(struct hl_device *hdev, struct hl_info_args *info_args)
954 {
955         void __user *buff = (void __user *) (uintptr_t) info_args->return_pointer;
956         u32 size = info_args->return_size;
957         dma_addr_t dma_handle;
958         bool need_input_buff;
959         void *fw_buff;
960         int rc = 0;
961
962         switch (info_args->fw_sub_opcode) {
963         case HL_PASSTHROUGH_VERSIONS:
964                 need_input_buff = false;
965                 break;
966         default:
967                 return -EINVAL;
968         }
969
970         if (size > SZ_1M) {
971                 dev_err(hdev->dev, "buffer size cannot exceed 1MB\n");
972                 return -EINVAL;
973         }
974
975         fw_buff = hl_cpu_accessible_dma_pool_alloc(hdev, size, &dma_handle);
976         if (!fw_buff)
977                 return -ENOMEM;
978
979
980         if (need_input_buff && copy_from_user(fw_buff, buff, size)) {
981                 dev_dbg(hdev->dev, "Failed to copy from user FW buff\n");
982                 rc = -EFAULT;
983                 goto free_buff;
984         }
985
986         rc = hl_fw_send_generic_request(hdev, info_args->fw_sub_opcode, dma_handle, &size);
987         if (rc)
988                 goto free_buff;
989
990         if (copy_to_user(buff, fw_buff, min(size, info_args->return_size))) {
991                 dev_dbg(hdev->dev, "Failed to copy to user FW generic req output\n");
992                 rc = -EFAULT;
993         }
994
995 free_buff:
996         hl_cpu_accessible_dma_pool_free(hdev, info_args->return_size, fw_buff);
997
998         return rc;
999 }
1000
1001 static int _hl_info_ioctl(struct hl_fpriv *hpriv, void *data,
1002                                 struct device *dev)
1003 {
1004         enum hl_device_status status;
1005         struct hl_info_args *args = data;
1006         struct hl_device *hdev = hpriv->hdev;
1007         int rc;
1008
1009         if (args->pad) {
1010                 dev_dbg(hdev->dev, "Padding bytes must be 0\n");
1011                 return -EINVAL;
1012         }
1013
1014         /*
1015          * Information is returned for the following opcodes even if the device
1016          * is disabled or in reset.
1017          */
1018         switch (args->op) {
1019         case HL_INFO_HW_IP_INFO:
1020                 return hw_ip_info(hdev, args);
1021
1022         case HL_INFO_DEVICE_STATUS:
1023                 return device_status_info(hdev, args);
1024
1025         case HL_INFO_RESET_COUNT:
1026                 return get_reset_count(hdev, args);
1027
1028         case HL_INFO_HW_EVENTS:
1029                 return hw_events_info(hdev, false, args);
1030
1031         case HL_INFO_HW_EVENTS_AGGREGATE:
1032                 return hw_events_info(hdev, true, args);
1033
1034         case HL_INFO_CS_COUNTERS:
1035                 return cs_counters_info(hpriv, args);
1036
1037         case HL_INFO_CLK_THROTTLE_REASON:
1038                 return clk_throttle_info(hpriv, args);
1039
1040         case HL_INFO_SYNC_MANAGER:
1041                 return sync_manager_info(hpriv, args);
1042
1043         case HL_INFO_OPEN_STATS:
1044                 return open_stats_info(hpriv, args);
1045
1046         case HL_INFO_LAST_ERR_OPEN_DEV_TIME:
1047                 return last_err_open_dev_info(hpriv, args);
1048
1049         case HL_INFO_CS_TIMEOUT_EVENT:
1050                 return cs_timeout_info(hpriv, args);
1051
1052         case HL_INFO_RAZWI_EVENT:
1053                 return razwi_info(hpriv, args);
1054
1055         case HL_INFO_UNDEFINED_OPCODE_EVENT:
1056                 return undefined_opcode_info(hpriv, args);
1057
1058         case HL_INFO_DEV_MEM_ALLOC_PAGE_SIZES:
1059                 return dev_mem_alloc_page_sizes_info(hpriv, args);
1060
1061         case HL_INFO_GET_EVENTS:
1062                 return events_info(hpriv, args);
1063
1064         case HL_INFO_PAGE_FAULT_EVENT:
1065                 return page_fault_info(hpriv, args);
1066
1067         case HL_INFO_USER_MAPPINGS:
1068                 return user_mappings_info(hpriv, args);
1069
1070         case HL_INFO_UNREGISTER_EVENTFD:
1071                 return eventfd_unregister(hpriv, args);
1072
1073         case HL_INFO_HW_ERR_EVENT:
1074                 return hw_err_info(hpriv, args);
1075
1076         case HL_INFO_FW_ERR_EVENT:
1077                 return fw_err_info(hpriv, args);
1078
1079         case HL_INFO_USER_ENGINE_ERR_EVENT:
1080                 return engine_err_info(hpriv, args);
1081
1082         case HL_INFO_DRAM_USAGE:
1083                 return dram_usage_info(hpriv, args);
1084         default:
1085                 break;
1086         }
1087
1088         if (!hl_device_operational(hdev, &status)) {
1089                 dev_dbg_ratelimited(dev,
1090                         "Device is %s. Can't execute INFO IOCTL\n",
1091                         hdev->status[status]);
1092                 return -EBUSY;
1093         }
1094
1095         switch (args->op) {
1096         case HL_INFO_HW_IDLE:
1097                 rc = hw_idle(hdev, args);
1098                 break;
1099
1100         case HL_INFO_DEVICE_UTILIZATION:
1101                 rc = device_utilization(hdev, args);
1102                 break;
1103
1104         case HL_INFO_CLK_RATE:
1105                 rc = get_clk_rate(hdev, args);
1106                 break;
1107
1108         case HL_INFO_TIME_SYNC:
1109                 return time_sync_info(hdev, args);
1110
1111         case HL_INFO_PCI_COUNTERS:
1112                 return pci_counters_info(hpriv, args);
1113
1114         case HL_INFO_TOTAL_ENERGY:
1115                 return total_energy_consumption_info(hpriv, args);
1116
1117         case HL_INFO_PLL_FREQUENCY:
1118                 return pll_frequency_info(hpriv, args);
1119
1120         case HL_INFO_POWER:
1121                 return power_info(hpriv, args);
1122
1123
1124         case HL_INFO_DRAM_REPLACED_ROWS:
1125                 return dram_replaced_rows_info(hpriv, args);
1126
1127         case HL_INFO_DRAM_PENDING_ROWS:
1128                 return dram_pending_rows_info(hpriv, args);
1129
1130         case HL_INFO_SECURED_ATTESTATION:
1131                 return sec_attest_info(hpriv, args);
1132
1133         case HL_INFO_REGISTER_EVENTFD:
1134                 return eventfd_register(hpriv, args);
1135
1136         case HL_INFO_ENGINE_STATUS:
1137                 return engine_status_info(hpriv, args);
1138
1139         case HL_INFO_FW_GENERIC_REQ:
1140                 return send_fw_generic_request(hdev, args);
1141
1142         case HL_INFO_DEV_SIGNED:
1143                 return dev_info_signed(hpriv, args);
1144
1145         default:
1146                 dev_err(dev, "Invalid request %d\n", args->op);
1147                 rc = -EINVAL;
1148                 break;
1149         }
1150
1151         return rc;
1152 }
1153
1154 int hl_info_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
1155 {
1156         struct hl_fpriv *hpriv = file_priv->driver_priv;
1157
1158         return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev);
1159 }
1160
1161 static int hl_info_ioctl_control(struct hl_fpriv *hpriv, void *data)
1162 {
1163         struct hl_info_args *args = data;
1164
1165         switch (args->op) {
1166         case HL_INFO_GET_EVENTS:
1167         case HL_INFO_UNREGISTER_EVENTFD:
1168         case HL_INFO_REGISTER_EVENTFD:
1169                 return -EOPNOTSUPP;
1170         default:
1171                 break;
1172         }
1173
1174         return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev_ctrl);
1175 }
1176
1177 int hl_debug_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
1178 {
1179         struct hl_fpriv *hpriv = file_priv->driver_priv;
1180         struct hl_device *hdev = hpriv->hdev;
1181         struct hl_debug_args *args = data;
1182         enum hl_device_status status;
1183
1184         int rc = 0;
1185
1186         if (!hl_device_operational(hdev, &status)) {
1187                 dev_dbg_ratelimited(hdev->dev,
1188                         "Device is %s. Can't execute DEBUG IOCTL\n",
1189                         hdev->status[status]);
1190                 return -EBUSY;
1191         }
1192
1193         switch (args->op) {
1194         case HL_DEBUG_OP_ETR:
1195         case HL_DEBUG_OP_ETF:
1196         case HL_DEBUG_OP_STM:
1197         case HL_DEBUG_OP_FUNNEL:
1198         case HL_DEBUG_OP_BMON:
1199         case HL_DEBUG_OP_SPMU:
1200         case HL_DEBUG_OP_TIMESTAMP:
1201                 if (!hdev->in_debug) {
1202                         dev_err_ratelimited(hdev->dev,
1203                                 "Rejecting debug configuration request because device not in debug mode\n");
1204                         return -EFAULT;
1205                 }
1206                 args->input_size = min(args->input_size, hl_debug_struct_size[args->op]);
1207                 rc = debug_coresight(hdev, hpriv->ctx, args);
1208                 break;
1209
1210         case HL_DEBUG_OP_SET_MODE:
1211                 rc = hl_device_set_debug_mode(hdev, hpriv->ctx, (bool) args->enable);
1212                 break;
1213
1214         default:
1215                 dev_err(hdev->dev, "Invalid request %d\n", args->op);
1216                 rc = -EINVAL;
1217                 break;
1218         }
1219
1220         return rc;
1221 }
1222
1223 #define HL_IOCTL_DEF(ioctl, _func) \
1224         [_IOC_NR(ioctl) - HL_COMMAND_START] = {.cmd = ioctl, .func = _func}
1225
1226 static const struct hl_ioctl_desc hl_ioctls_control[] = {
1227         HL_IOCTL_DEF(DRM_IOCTL_HL_INFO, hl_info_ioctl_control)
1228 };
1229
1230 static long _hl_ioctl(struct hl_fpriv *hpriv, unsigned int cmd, unsigned long arg,
1231                         const struct hl_ioctl_desc *ioctl, struct device *dev)
1232 {
1233         unsigned int nr = _IOC_NR(cmd);
1234         char stack_kdata[128] = {0};
1235         char *kdata = NULL;
1236         unsigned int usize, asize;
1237         hl_ioctl_t *func;
1238         u32 hl_size;
1239         int retcode;
1240
1241         /* Do not trust userspace, use our own definition */
1242         func = ioctl->func;
1243
1244         if (unlikely(!func)) {
1245                 dev_dbg(dev, "no function\n");
1246                 retcode = -ENOTTY;
1247                 goto out_err;
1248         }
1249
1250         hl_size = _IOC_SIZE(ioctl->cmd);
1251         usize = asize = _IOC_SIZE(cmd);
1252         if (hl_size > asize)
1253                 asize = hl_size;
1254
1255         cmd = ioctl->cmd;
1256
1257         if (cmd & (IOC_IN | IOC_OUT)) {
1258                 if (asize <= sizeof(stack_kdata)) {
1259                         kdata = stack_kdata;
1260                 } else {
1261                         kdata = kzalloc(asize, GFP_KERNEL);
1262                         if (!kdata) {
1263                                 retcode = -ENOMEM;
1264                                 goto out_err;
1265                         }
1266                 }
1267         }
1268
1269         if (cmd & IOC_IN) {
1270                 if (copy_from_user(kdata, (void __user *)arg, usize)) {
1271                         retcode = -EFAULT;
1272                         goto out_err;
1273                 }
1274         }
1275
1276         retcode = func(hpriv, kdata);
1277
1278         if ((cmd & IOC_OUT) && copy_to_user((void __user *)arg, kdata, usize))
1279                 retcode = -EFAULT;
1280
1281 out_err:
1282         if (retcode) {
1283                 char task_comm[TASK_COMM_LEN];
1284
1285                 dev_dbg_ratelimited(dev,
1286                                 "error in ioctl: pid=%d, comm=\"%s\", cmd=%#010x, nr=%#04x\n",
1287                                 task_pid_nr(current), get_task_comm(task_comm, current), cmd, nr);
1288         }
1289
1290         if (kdata != stack_kdata)
1291                 kfree(kdata);
1292
1293         return retcode;
1294 }
1295
1296 long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg)
1297 {
1298         struct hl_fpriv *hpriv = filep->private_data;
1299         struct hl_device *hdev = hpriv->hdev;
1300         const struct hl_ioctl_desc *ioctl = NULL;
1301         unsigned int nr = _IOC_NR(cmd);
1302
1303         if (!hdev) {
1304                 pr_err_ratelimited("Sending ioctl after device was removed! Please close FD\n");
1305                 return -ENODEV;
1306         }
1307
1308         if (nr == _IOC_NR(DRM_IOCTL_HL_INFO)) {
1309                 ioctl = &hl_ioctls_control[nr - HL_COMMAND_START];
1310         } else {
1311                 char task_comm[TASK_COMM_LEN];
1312
1313                 dev_dbg_ratelimited(hdev->dev_ctrl,
1314                                 "invalid ioctl: pid=%d, comm=\"%s\", cmd=%#010x, nr=%#04x\n",
1315                                 task_pid_nr(current), get_task_comm(task_comm, current), cmd, nr);
1316                 return -ENOTTY;
1317         }
1318
1319         return _hl_ioctl(hpriv, cmd, arg, ioctl, hdev->dev_ctrl);
1320 }