habanalabs_ioctl.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright 2016-2022 HabanaLabs, Ltd.
  4. * All Rights Reserved.
  5. */
  6. #define pr_fmt(fmt) "habanalabs: " fmt
  7. #include <uapi/misc/habanalabs.h>
  8. #include "habanalabs.h"
  9. #include <linux/kernel.h>
  10. #include <linux/fs.h>
  11. #include <linux/uaccess.h>
  12. #include <linux/slab.h>
  13. #include <linux/vmalloc.h>
  14. static u32 hl_debug_struct_size[HL_DEBUG_OP_TIMESTAMP + 1] = {
  15. [HL_DEBUG_OP_ETR] = sizeof(struct hl_debug_params_etr),
  16. [HL_DEBUG_OP_ETF] = sizeof(struct hl_debug_params_etf),
  17. [HL_DEBUG_OP_STM] = sizeof(struct hl_debug_params_stm),
  18. [HL_DEBUG_OP_FUNNEL] = 0,
  19. [HL_DEBUG_OP_BMON] = sizeof(struct hl_debug_params_bmon),
  20. [HL_DEBUG_OP_SPMU] = sizeof(struct hl_debug_params_spmu),
  21. [HL_DEBUG_OP_TIMESTAMP] = 0
  22. };
  23. static int device_status_info(struct hl_device *hdev, struct hl_info_args *args)
  24. {
  25. struct hl_info_device_status dev_stat = {0};
  26. u32 size = args->return_size;
  27. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  28. if ((!size) || (!out))
  29. return -EINVAL;
  30. dev_stat.status = hl_device_status(hdev);
  31. return copy_to_user(out, &dev_stat,
  32. min((size_t)size, sizeof(dev_stat))) ? -EFAULT : 0;
  33. }
  34. static int hw_ip_info(struct hl_device *hdev, struct hl_info_args *args)
  35. {
  36. struct hl_info_hw_ip_info hw_ip = {0};
  37. u32 size = args->return_size;
  38. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  39. struct asic_fixed_properties *prop = &hdev->asic_prop;
  40. u64 sram_kmd_size, dram_kmd_size, dram_available_size;
  41. if ((!size) || (!out))
  42. return -EINVAL;
  43. sram_kmd_size = (prop->sram_user_base_address -
  44. prop->sram_base_address);
  45. dram_kmd_size = (prop->dram_user_base_address -
  46. prop->dram_base_address);
  47. hw_ip.device_id = hdev->asic_funcs->get_pci_id(hdev);
  48. hw_ip.sram_base_address = prop->sram_user_base_address;
  49. hw_ip.dram_base_address =
  50. hdev->mmu_enable && prop->dram_supports_virtual_memory ?
  51. prop->dmmu.start_addr : prop->dram_user_base_address;
  52. hw_ip.tpc_enabled_mask = prop->tpc_enabled_mask & 0xFF;
  53. hw_ip.tpc_enabled_mask_ext = prop->tpc_enabled_mask;
  54. hw_ip.sram_size = prop->sram_size - sram_kmd_size;
  55. dram_available_size = prop->dram_size - dram_kmd_size;
  56. if (hdev->mmu_enable == MMU_EN_ALL)
  57. hw_ip.dram_size = DIV_ROUND_DOWN_ULL(dram_available_size,
  58. prop->dram_page_size) * prop->dram_page_size;
  59. else
  60. hw_ip.dram_size = dram_available_size;
  61. if (hw_ip.dram_size > PAGE_SIZE)
  62. hw_ip.dram_enabled = 1;
  63. hw_ip.dram_page_size = prop->dram_page_size;
  64. hw_ip.device_mem_alloc_default_page_size = prop->device_mem_alloc_default_page_size;
  65. hw_ip.num_of_events = prop->num_of_events;
  66. memcpy(hw_ip.cpucp_version, prop->cpucp_info.cpucp_version,
  67. min(VERSION_MAX_LEN, HL_INFO_VERSION_MAX_LEN));
  68. memcpy(hw_ip.card_name, prop->cpucp_info.card_name,
  69. min(CARD_NAME_MAX_LEN, HL_INFO_CARD_NAME_MAX_LEN));
  70. hw_ip.cpld_version = le32_to_cpu(prop->cpucp_info.cpld_version);
  71. hw_ip.module_id = le32_to_cpu(prop->cpucp_info.card_location);
  72. hw_ip.psoc_pci_pll_nr = prop->psoc_pci_pll_nr;
  73. hw_ip.psoc_pci_pll_nf = prop->psoc_pci_pll_nf;
  74. hw_ip.psoc_pci_pll_od = prop->psoc_pci_pll_od;
  75. hw_ip.psoc_pci_pll_div_factor = prop->psoc_pci_pll_div_factor;
  76. hw_ip.decoder_enabled_mask = prop->decoder_enabled_mask;
  77. hw_ip.mme_master_slave_mode = prop->mme_master_slave_mode;
  78. hw_ip.first_available_interrupt_id = prop->first_available_user_interrupt;
  79. hw_ip.number_of_user_interrupts = prop->user_interrupt_count;
  80. hw_ip.edma_enabled_mask = prop->edma_enabled_mask;
  81. hw_ip.server_type = prop->server_type;
  82. hw_ip.security_enabled = prop->fw_security_enabled;
  83. return copy_to_user(out, &hw_ip,
  84. min((size_t) size, sizeof(hw_ip))) ? -EFAULT : 0;
  85. }
  86. static int hw_events_info(struct hl_device *hdev, bool aggregate,
  87. struct hl_info_args *args)
  88. {
  89. u32 size, max_size = args->return_size;
  90. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  91. void *arr;
  92. if ((!max_size) || (!out))
  93. return -EINVAL;
  94. arr = hdev->asic_funcs->get_events_stat(hdev, aggregate, &size);
  95. return copy_to_user(out, arr, min(max_size, size)) ? -EFAULT : 0;
  96. }
  97. static int events_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  98. {
  99. u32 max_size = args->return_size;
  100. u64 events_mask;
  101. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  102. if ((max_size < sizeof(u64)) || (!out))
  103. return -EINVAL;
  104. mutex_lock(&hpriv->notifier_event.lock);
  105. events_mask = hpriv->notifier_event.events_mask;
  106. hpriv->notifier_event.events_mask = 0;
  107. mutex_unlock(&hpriv->notifier_event.lock);
  108. return copy_to_user(out, &events_mask, sizeof(u64)) ? -EFAULT : 0;
  109. }
  110. static int dram_usage_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  111. {
  112. struct hl_device *hdev = hpriv->hdev;
  113. struct hl_info_dram_usage dram_usage = {0};
  114. u32 max_size = args->return_size;
  115. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  116. struct asic_fixed_properties *prop = &hdev->asic_prop;
  117. u64 dram_kmd_size;
  118. if ((!max_size) || (!out))
  119. return -EINVAL;
  120. dram_kmd_size = (prop->dram_user_base_address -
  121. prop->dram_base_address);
  122. dram_usage.dram_free_mem = (prop->dram_size - dram_kmd_size) -
  123. atomic64_read(&hdev->dram_used_mem);
  124. if (hpriv->ctx)
  125. dram_usage.ctx_dram_mem =
  126. atomic64_read(&hpriv->ctx->dram_phys_mem);
  127. return copy_to_user(out, &dram_usage,
  128. min((size_t) max_size, sizeof(dram_usage))) ? -EFAULT : 0;
  129. }
  130. static int hw_idle(struct hl_device *hdev, struct hl_info_args *args)
  131. {
  132. struct hl_info_hw_idle hw_idle = {0};
  133. u32 max_size = args->return_size;
  134. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  135. if ((!max_size) || (!out))
  136. return -EINVAL;
  137. hw_idle.is_idle = hdev->asic_funcs->is_device_idle(hdev,
  138. hw_idle.busy_engines_mask_ext,
  139. HL_BUSY_ENGINES_MASK_EXT_SIZE, NULL);
  140. hw_idle.busy_engines_mask =
  141. lower_32_bits(hw_idle.busy_engines_mask_ext[0]);
  142. return copy_to_user(out, &hw_idle,
  143. min((size_t) max_size, sizeof(hw_idle))) ? -EFAULT : 0;
  144. }
  145. static int debug_coresight(struct hl_device *hdev, struct hl_ctx *ctx, struct hl_debug_args *args)
  146. {
  147. struct hl_debug_params *params;
  148. void *input = NULL, *output = NULL;
  149. int rc;
  150. params = kzalloc(sizeof(*params), GFP_KERNEL);
  151. if (!params)
  152. return -ENOMEM;
  153. params->reg_idx = args->reg_idx;
  154. params->enable = args->enable;
  155. params->op = args->op;
  156. if (args->input_ptr && args->input_size) {
  157. input = kzalloc(hl_debug_struct_size[args->op], GFP_KERNEL);
  158. if (!input) {
  159. rc = -ENOMEM;
  160. goto out;
  161. }
  162. if (copy_from_user(input, u64_to_user_ptr(args->input_ptr),
  163. args->input_size)) {
  164. rc = -EFAULT;
  165. dev_err(hdev->dev, "failed to copy input debug data\n");
  166. goto out;
  167. }
  168. params->input = input;
  169. }
  170. if (args->output_ptr && args->output_size) {
  171. output = kzalloc(args->output_size, GFP_KERNEL);
  172. if (!output) {
  173. rc = -ENOMEM;
  174. goto out;
  175. }
  176. params->output = output;
  177. params->output_size = args->output_size;
  178. }
  179. rc = hdev->asic_funcs->debug_coresight(hdev, ctx, params);
  180. if (rc) {
  181. dev_err(hdev->dev,
  182. "debug coresight operation failed %d\n", rc);
  183. goto out;
  184. }
  185. if (output && copy_to_user((void __user *) (uintptr_t) args->output_ptr,
  186. output, args->output_size)) {
  187. dev_err(hdev->dev, "copy to user failed in debug ioctl\n");
  188. rc = -EFAULT;
  189. goto out;
  190. }
  191. out:
  192. kfree(params);
  193. kfree(output);
  194. kfree(input);
  195. return rc;
  196. }
  197. static int device_utilization(struct hl_device *hdev, struct hl_info_args *args)
  198. {
  199. struct hl_info_device_utilization device_util = {0};
  200. u32 max_size = args->return_size;
  201. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  202. int rc;
  203. if ((!max_size) || (!out))
  204. return -EINVAL;
  205. rc = hl_device_utilization(hdev, &device_util.utilization);
  206. if (rc)
  207. return -EINVAL;
  208. return copy_to_user(out, &device_util,
  209. min((size_t) max_size, sizeof(device_util))) ? -EFAULT : 0;
  210. }
  211. static int get_clk_rate(struct hl_device *hdev, struct hl_info_args *args)
  212. {
  213. struct hl_info_clk_rate clk_rate = {0};
  214. u32 max_size = args->return_size;
  215. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  216. int rc;
  217. if ((!max_size) || (!out))
  218. return -EINVAL;
  219. rc = hl_fw_get_clk_rate(hdev, &clk_rate.cur_clk_rate_mhz, &clk_rate.max_clk_rate_mhz);
  220. if (rc)
  221. return rc;
  222. return copy_to_user(out, &clk_rate, min_t(size_t, max_size, sizeof(clk_rate)))
  223. ? -EFAULT : 0;
  224. }
  225. static int get_reset_count(struct hl_device *hdev, struct hl_info_args *args)
  226. {
  227. struct hl_info_reset_count reset_count = {0};
  228. u32 max_size = args->return_size;
  229. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  230. if ((!max_size) || (!out))
  231. return -EINVAL;
  232. reset_count.hard_reset_cnt = hdev->reset_info.hard_reset_cnt;
  233. reset_count.soft_reset_cnt = hdev->reset_info.compute_reset_cnt;
  234. return copy_to_user(out, &reset_count,
  235. min((size_t) max_size, sizeof(reset_count))) ? -EFAULT : 0;
  236. }
  237. static int time_sync_info(struct hl_device *hdev, struct hl_info_args *args)
  238. {
  239. struct hl_info_time_sync time_sync = {0};
  240. u32 max_size = args->return_size;
  241. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  242. if ((!max_size) || (!out))
  243. return -EINVAL;
  244. time_sync.device_time = hdev->asic_funcs->get_device_time(hdev);
  245. time_sync.host_time = ktime_get_raw_ns();
  246. return copy_to_user(out, &time_sync,
  247. min((size_t) max_size, sizeof(time_sync))) ? -EFAULT : 0;
  248. }
  249. static int pci_counters_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  250. {
  251. struct hl_device *hdev = hpriv->hdev;
  252. struct hl_info_pci_counters pci_counters = {0};
  253. u32 max_size = args->return_size;
  254. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  255. int rc;
  256. if ((!max_size) || (!out))
  257. return -EINVAL;
  258. rc = hl_fw_cpucp_pci_counters_get(hdev, &pci_counters);
  259. if (rc)
  260. return rc;
  261. return copy_to_user(out, &pci_counters,
  262. min((size_t) max_size, sizeof(pci_counters))) ? -EFAULT : 0;
  263. }
  264. static int clk_throttle_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  265. {
  266. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  267. struct hl_device *hdev = hpriv->hdev;
  268. struct hl_info_clk_throttle clk_throttle = {0};
  269. ktime_t end_time, zero_time = ktime_set(0, 0);
  270. u32 max_size = args->return_size;
  271. int i;
  272. if ((!max_size) || (!out))
  273. return -EINVAL;
  274. mutex_lock(&hdev->clk_throttling.lock);
  275. clk_throttle.clk_throttling_reason = hdev->clk_throttling.current_reason;
  276. for (i = 0 ; i < HL_CLK_THROTTLE_TYPE_MAX ; i++) {
  277. if (!(hdev->clk_throttling.aggregated_reason & BIT(i)))
  278. continue;
  279. clk_throttle.clk_throttling_timestamp_us[i] =
  280. ktime_to_us(hdev->clk_throttling.timestamp[i].start);
  281. if (ktime_compare(hdev->clk_throttling.timestamp[i].end, zero_time))
  282. end_time = hdev->clk_throttling.timestamp[i].end;
  283. else
  284. end_time = ktime_get();
  285. clk_throttle.clk_throttling_duration_ns[i] =
  286. ktime_to_ns(ktime_sub(end_time,
  287. hdev->clk_throttling.timestamp[i].start));
  288. }
  289. mutex_unlock(&hdev->clk_throttling.lock);
  290. return copy_to_user(out, &clk_throttle,
  291. min((size_t) max_size, sizeof(clk_throttle))) ? -EFAULT : 0;
  292. }
  293. static int cs_counters_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  294. {
  295. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  296. struct hl_info_cs_counters cs_counters = {0};
  297. struct hl_device *hdev = hpriv->hdev;
  298. struct hl_cs_counters_atomic *cntr;
  299. u32 max_size = args->return_size;
  300. cntr = &hdev->aggregated_cs_counters;
  301. if ((!max_size) || (!out))
  302. return -EINVAL;
  303. cs_counters.total_out_of_mem_drop_cnt =
  304. atomic64_read(&cntr->out_of_mem_drop_cnt);
  305. cs_counters.total_parsing_drop_cnt =
  306. atomic64_read(&cntr->parsing_drop_cnt);
  307. cs_counters.total_queue_full_drop_cnt =
  308. atomic64_read(&cntr->queue_full_drop_cnt);
  309. cs_counters.total_device_in_reset_drop_cnt =
  310. atomic64_read(&cntr->device_in_reset_drop_cnt);
  311. cs_counters.total_max_cs_in_flight_drop_cnt =
  312. atomic64_read(&cntr->max_cs_in_flight_drop_cnt);
  313. cs_counters.total_validation_drop_cnt =
  314. atomic64_read(&cntr->validation_drop_cnt);
  315. if (hpriv->ctx) {
  316. cs_counters.ctx_out_of_mem_drop_cnt =
  317. atomic64_read(
  318. &hpriv->ctx->cs_counters.out_of_mem_drop_cnt);
  319. cs_counters.ctx_parsing_drop_cnt =
  320. atomic64_read(
  321. &hpriv->ctx->cs_counters.parsing_drop_cnt);
  322. cs_counters.ctx_queue_full_drop_cnt =
  323. atomic64_read(
  324. &hpriv->ctx->cs_counters.queue_full_drop_cnt);
  325. cs_counters.ctx_device_in_reset_drop_cnt =
  326. atomic64_read(
  327. &hpriv->ctx->cs_counters.device_in_reset_drop_cnt);
  328. cs_counters.ctx_max_cs_in_flight_drop_cnt =
  329. atomic64_read(
  330. &hpriv->ctx->cs_counters.max_cs_in_flight_drop_cnt);
  331. cs_counters.ctx_validation_drop_cnt =
  332. atomic64_read(
  333. &hpriv->ctx->cs_counters.validation_drop_cnt);
  334. }
  335. return copy_to_user(out, &cs_counters,
  336. min((size_t) max_size, sizeof(cs_counters))) ? -EFAULT : 0;
  337. }
  338. static int sync_manager_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  339. {
  340. struct hl_device *hdev = hpriv->hdev;
  341. struct asic_fixed_properties *prop = &hdev->asic_prop;
  342. struct hl_info_sync_manager sm_info = {0};
  343. u32 max_size = args->return_size;
  344. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  345. if ((!max_size) || (!out))
  346. return -EINVAL;
  347. if (args->dcore_id >= HL_MAX_DCORES)
  348. return -EINVAL;
  349. sm_info.first_available_sync_object =
  350. prop->first_available_user_sob[args->dcore_id];
  351. sm_info.first_available_monitor =
  352. prop->first_available_user_mon[args->dcore_id];
  353. sm_info.first_available_cq =
  354. prop->first_available_cq[args->dcore_id];
  355. return copy_to_user(out, &sm_info, min_t(size_t, (size_t) max_size,
  356. sizeof(sm_info))) ? -EFAULT : 0;
  357. }
  358. static int total_energy_consumption_info(struct hl_fpriv *hpriv,
  359. struct hl_info_args *args)
  360. {
  361. struct hl_device *hdev = hpriv->hdev;
  362. struct hl_info_energy total_energy = {0};
  363. u32 max_size = args->return_size;
  364. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  365. int rc;
  366. if ((!max_size) || (!out))
  367. return -EINVAL;
  368. rc = hl_fw_cpucp_total_energy_get(hdev,
  369. &total_energy.total_energy_consumption);
  370. if (rc)
  371. return rc;
  372. return copy_to_user(out, &total_energy,
  373. min((size_t) max_size, sizeof(total_energy))) ? -EFAULT : 0;
  374. }
  375. static int pll_frequency_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  376. {
  377. struct hl_device *hdev = hpriv->hdev;
  378. struct hl_pll_frequency_info freq_info = { {0} };
  379. u32 max_size = args->return_size;
  380. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  381. int rc;
  382. if ((!max_size) || (!out))
  383. return -EINVAL;
  384. rc = hl_fw_cpucp_pll_info_get(hdev, args->pll_index, freq_info.output);
  385. if (rc)
  386. return rc;
  387. return copy_to_user(out, &freq_info,
  388. min((size_t) max_size, sizeof(freq_info))) ? -EFAULT : 0;
  389. }
  390. static int power_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  391. {
  392. struct hl_device *hdev = hpriv->hdev;
  393. u32 max_size = args->return_size;
  394. struct hl_power_info power_info = {0};
  395. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  396. int rc;
  397. if ((!max_size) || (!out))
  398. return -EINVAL;
  399. rc = hl_fw_cpucp_power_get(hdev, &power_info.power);
  400. if (rc)
  401. return rc;
  402. return copy_to_user(out, &power_info,
  403. min((size_t) max_size, sizeof(power_info))) ? -EFAULT : 0;
  404. }
  405. static int open_stats_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  406. {
  407. struct hl_device *hdev = hpriv->hdev;
  408. u32 max_size = args->return_size;
  409. struct hl_open_stats_info open_stats_info = {0};
  410. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  411. if ((!max_size) || (!out))
  412. return -EINVAL;
  413. open_stats_info.last_open_period_ms = jiffies64_to_msecs(
  414. hdev->last_open_session_duration_jif);
  415. open_stats_info.open_counter = hdev->open_counter;
  416. open_stats_info.is_compute_ctx_active = hdev->is_compute_ctx_active;
  417. open_stats_info.compute_ctx_in_release = hdev->compute_ctx_in_release;
  418. return copy_to_user(out, &open_stats_info,
  419. min((size_t) max_size, sizeof(open_stats_info))) ? -EFAULT : 0;
  420. }
  421. static int dram_pending_rows_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  422. {
  423. struct hl_device *hdev = hpriv->hdev;
  424. u32 max_size = args->return_size;
  425. u32 pend_rows_num = 0;
  426. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  427. int rc;
  428. if ((!max_size) || (!out))
  429. return -EINVAL;
  430. rc = hl_fw_dram_pending_row_get(hdev, &pend_rows_num);
  431. if (rc)
  432. return rc;
  433. return copy_to_user(out, &pend_rows_num,
  434. min_t(size_t, max_size, sizeof(pend_rows_num))) ? -EFAULT : 0;
  435. }
  436. static int dram_replaced_rows_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  437. {
  438. struct hl_device *hdev = hpriv->hdev;
  439. u32 max_size = args->return_size;
  440. struct cpucp_hbm_row_info info = {0};
  441. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  442. int rc;
  443. if ((!max_size) || (!out))
  444. return -EINVAL;
  445. rc = hl_fw_dram_replaced_row_get(hdev, &info);
  446. if (rc)
  447. return rc;
  448. return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
  449. }
  450. static int last_err_open_dev_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  451. {
  452. struct hl_info_last_err_open_dev_time info = {0};
  453. struct hl_device *hdev = hpriv->hdev;
  454. u32 max_size = args->return_size;
  455. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  456. if ((!max_size) || (!out))
  457. return -EINVAL;
  458. info.timestamp = ktime_to_ns(hdev->last_successful_open_ktime);
  459. return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
  460. }
  461. static int cs_timeout_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  462. {
  463. struct hl_info_cs_timeout_event info = {0};
  464. struct hl_device *hdev = hpriv->hdev;
  465. u32 max_size = args->return_size;
  466. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  467. if ((!max_size) || (!out))
  468. return -EINVAL;
  469. info.seq = hdev->captured_err_info.cs_timeout.seq;
  470. info.timestamp = ktime_to_ns(hdev->captured_err_info.cs_timeout.timestamp);
  471. return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
  472. }
  473. static int razwi_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  474. {
  475. struct hl_device *hdev = hpriv->hdev;
  476. u32 max_size = args->return_size;
  477. struct hl_info_razwi_event info = {0};
  478. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  479. if ((!max_size) || (!out))
  480. return -EINVAL;
  481. info.timestamp = ktime_to_ns(hdev->captured_err_info.razwi.timestamp);
  482. info.addr = hdev->captured_err_info.razwi.addr;
  483. info.engine_id_1 = hdev->captured_err_info.razwi.engine_id_1;
  484. info.engine_id_2 = hdev->captured_err_info.razwi.engine_id_2;
  485. info.no_engine_id = hdev->captured_err_info.razwi.non_engine_initiator;
  486. info.error_type = hdev->captured_err_info.razwi.type;
  487. return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
  488. }
  489. static int undefined_opcode_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  490. {
  491. struct hl_device *hdev = hpriv->hdev;
  492. u32 max_size = args->return_size;
  493. struct hl_info_undefined_opcode_event info = {0};
  494. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  495. if ((!max_size) || (!out))
  496. return -EINVAL;
  497. info.timestamp = ktime_to_ns(hdev->captured_err_info.undef_opcode.timestamp);
  498. info.engine_id = hdev->captured_err_info.undef_opcode.engine_id;
  499. info.cq_addr = hdev->captured_err_info.undef_opcode.cq_addr;
  500. info.cq_size = hdev->captured_err_info.undef_opcode.cq_size;
  501. info.stream_id = hdev->captured_err_info.undef_opcode.stream_id;
  502. info.cb_addr_streams_len = hdev->captured_err_info.undef_opcode.cb_addr_streams_len;
  503. memcpy(info.cb_addr_streams, hdev->captured_err_info.undef_opcode.cb_addr_streams,
  504. sizeof(info.cb_addr_streams));
  505. return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
  506. }
  507. static int dev_mem_alloc_page_sizes_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  508. {
  509. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  510. struct hl_info_dev_memalloc_page_sizes info = {0};
  511. struct hl_device *hdev = hpriv->hdev;
  512. u32 max_size = args->return_size;
  513. if ((!max_size) || (!out))
  514. return -EINVAL;
  515. /*
  516. * Future ASICs that will support multiple DRAM page sizes will support only "powers of 2"
  517. * pages (unlike some of the ASICs before supporting multiple page sizes).
  518. * For this reason for all ASICs that not support multiple page size the function will
  519. * return an empty bitmask indicating that multiple page sizes is not supported.
  520. */
  521. info.page_order_bitmask = hdev->asic_prop.dmmu.supported_pages_mask;
  522. return copy_to_user(out, &info, min_t(size_t, max_size, sizeof(info))) ? -EFAULT : 0;
  523. }
  524. static int sec_attest_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  525. {
  526. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  527. struct cpucp_sec_attest_info *sec_attest_info;
  528. struct hl_info_sec_attest *info;
  529. u32 max_size = args->return_size;
  530. int rc;
  531. if ((!max_size) || (!out))
  532. return -EINVAL;
  533. sec_attest_info = kmalloc(sizeof(*sec_attest_info), GFP_KERNEL);
  534. if (!sec_attest_info)
  535. return -ENOMEM;
  536. info = kmalloc(sizeof(*info), GFP_KERNEL);
  537. if (!info) {
  538. rc = -ENOMEM;
  539. goto free_sec_attest_info;
  540. }
  541. rc = hl_fw_get_sec_attest_info(hpriv->hdev, sec_attest_info, args->sec_attest_nonce);
  542. if (rc)
  543. goto free_info;
  544. info->nonce = le32_to_cpu(sec_attest_info->nonce);
  545. info->pcr_quote_len = le16_to_cpu(sec_attest_info->pcr_quote_len);
  546. info->pub_data_len = le16_to_cpu(sec_attest_info->pub_data_len);
  547. info->certificate_len = le16_to_cpu(sec_attest_info->certificate_len);
  548. info->pcr_num_reg = sec_attest_info->pcr_num_reg;
  549. info->pcr_reg_len = sec_attest_info->pcr_reg_len;
  550. info->quote_sig_len = sec_attest_info->quote_sig_len;
  551. memcpy(&info->pcr_data, &sec_attest_info->pcr_data, sizeof(info->pcr_data));
  552. memcpy(&info->pcr_quote, &sec_attest_info->pcr_quote, sizeof(info->pcr_quote));
  553. memcpy(&info->public_data, &sec_attest_info->public_data, sizeof(info->public_data));
  554. memcpy(&info->certificate, &sec_attest_info->certificate, sizeof(info->certificate));
  555. memcpy(&info->quote_sig, &sec_attest_info->quote_sig, sizeof(info->quote_sig));
  556. rc = copy_to_user(out, info,
  557. min_t(size_t, max_size, sizeof(*info))) ? -EFAULT : 0;
  558. free_info:
  559. kfree(info);
  560. free_sec_attest_info:
  561. kfree(sec_attest_info);
  562. return rc;
  563. }
  564. static int eventfd_register(struct hl_fpriv *hpriv, struct hl_info_args *args)
  565. {
  566. int rc;
  567. /* check if there is already a registered on that process */
  568. mutex_lock(&hpriv->notifier_event.lock);
  569. if (hpriv->notifier_event.eventfd) {
  570. mutex_unlock(&hpriv->notifier_event.lock);
  571. return -EINVAL;
  572. }
  573. hpriv->notifier_event.eventfd = eventfd_ctx_fdget(args->eventfd);
  574. if (IS_ERR(hpriv->notifier_event.eventfd)) {
  575. rc = PTR_ERR(hpriv->notifier_event.eventfd);
  576. hpriv->notifier_event.eventfd = NULL;
  577. mutex_unlock(&hpriv->notifier_event.lock);
  578. return rc;
  579. }
  580. mutex_unlock(&hpriv->notifier_event.lock);
  581. return 0;
  582. }
  583. static int eventfd_unregister(struct hl_fpriv *hpriv, struct hl_info_args *args)
  584. {
  585. mutex_lock(&hpriv->notifier_event.lock);
  586. if (!hpriv->notifier_event.eventfd) {
  587. mutex_unlock(&hpriv->notifier_event.lock);
  588. return -EINVAL;
  589. }
  590. eventfd_ctx_put(hpriv->notifier_event.eventfd);
  591. hpriv->notifier_event.eventfd = NULL;
  592. mutex_unlock(&hpriv->notifier_event.lock);
  593. return 0;
  594. }
  595. static int engine_status_info(struct hl_fpriv *hpriv, struct hl_info_args *args)
  596. {
  597. void __user *out = (void __user *) (uintptr_t) args->return_pointer;
  598. u32 status_buf_size = args->return_size;
  599. struct hl_device *hdev = hpriv->hdev;
  600. struct engines_data eng_data;
  601. int rc;
  602. if ((status_buf_size < SZ_1K) || (status_buf_size > HL_ENGINES_DATA_MAX_SIZE) || (!out))
  603. return -EINVAL;
  604. eng_data.actual_size = 0;
  605. eng_data.allocated_buf_size = status_buf_size;
  606. eng_data.buf = vmalloc(status_buf_size);
  607. if (!eng_data.buf)
  608. return -ENOMEM;
  609. hdev->asic_funcs->is_device_idle(hdev, NULL, 0, &eng_data);
  610. if (eng_data.actual_size > eng_data.allocated_buf_size) {
  611. dev_err(hdev->dev,
  612. "Engines data size (%d Bytes) is bigger than allocated size (%u Bytes)\n",
  613. eng_data.actual_size, status_buf_size);
  614. vfree(eng_data.buf);
  615. return -ENOMEM;
  616. }
  617. args->user_buffer_actual_size = eng_data.actual_size;
  618. rc = copy_to_user(out, eng_data.buf, min_t(size_t, status_buf_size, eng_data.actual_size)) ?
  619. -EFAULT : 0;
  620. vfree(eng_data.buf);
  621. return rc;
  622. }
  623. static int _hl_info_ioctl(struct hl_fpriv *hpriv, void *data,
  624. struct device *dev)
  625. {
  626. enum hl_device_status status;
  627. struct hl_info_args *args = data;
  628. struct hl_device *hdev = hpriv->hdev;
  629. int rc;
  630. /*
  631. * Information is returned for the following opcodes even if the device
  632. * is disabled or in reset.
  633. */
  634. switch (args->op) {
  635. case HL_INFO_HW_IP_INFO:
  636. return hw_ip_info(hdev, args);
  637. case HL_INFO_DEVICE_STATUS:
  638. return device_status_info(hdev, args);
  639. case HL_INFO_RESET_COUNT:
  640. return get_reset_count(hdev, args);
  641. case HL_INFO_HW_EVENTS:
  642. return hw_events_info(hdev, false, args);
  643. case HL_INFO_HW_EVENTS_AGGREGATE:
  644. return hw_events_info(hdev, true, args);
  645. case HL_INFO_CS_COUNTERS:
  646. return cs_counters_info(hpriv, args);
  647. case HL_INFO_CLK_THROTTLE_REASON:
  648. return clk_throttle_info(hpriv, args);
  649. case HL_INFO_SYNC_MANAGER:
  650. return sync_manager_info(hpriv, args);
  651. case HL_INFO_OPEN_STATS:
  652. return open_stats_info(hpriv, args);
  653. case HL_INFO_LAST_ERR_OPEN_DEV_TIME:
  654. return last_err_open_dev_info(hpriv, args);
  655. case HL_INFO_CS_TIMEOUT_EVENT:
  656. return cs_timeout_info(hpriv, args);
  657. case HL_INFO_RAZWI_EVENT:
  658. return razwi_info(hpriv, args);
  659. case HL_INFO_UNDEFINED_OPCODE_EVENT:
  660. return undefined_opcode_info(hpriv, args);
  661. case HL_INFO_DEV_MEM_ALLOC_PAGE_SIZES:
  662. return dev_mem_alloc_page_sizes_info(hpriv, args);
  663. case HL_INFO_GET_EVENTS:
  664. return events_info(hpriv, args);
  665. default:
  666. break;
  667. }
  668. if (!hl_device_operational(hdev, &status)) {
  669. dev_warn_ratelimited(dev,
  670. "Device is %s. Can't execute INFO IOCTL\n",
  671. hdev->status[status]);
  672. return -EBUSY;
  673. }
  674. switch (args->op) {
  675. case HL_INFO_DRAM_USAGE:
  676. rc = dram_usage_info(hpriv, args);
  677. break;
  678. case HL_INFO_HW_IDLE:
  679. rc = hw_idle(hdev, args);
  680. break;
  681. case HL_INFO_DEVICE_UTILIZATION:
  682. rc = device_utilization(hdev, args);
  683. break;
  684. case HL_INFO_CLK_RATE:
  685. rc = get_clk_rate(hdev, args);
  686. break;
  687. case HL_INFO_TIME_SYNC:
  688. return time_sync_info(hdev, args);
  689. case HL_INFO_PCI_COUNTERS:
  690. return pci_counters_info(hpriv, args);
  691. case HL_INFO_TOTAL_ENERGY:
  692. return total_energy_consumption_info(hpriv, args);
  693. case HL_INFO_PLL_FREQUENCY:
  694. return pll_frequency_info(hpriv, args);
  695. case HL_INFO_POWER:
  696. return power_info(hpriv, args);
  697. case HL_INFO_DRAM_REPLACED_ROWS:
  698. return dram_replaced_rows_info(hpriv, args);
  699. case HL_INFO_DRAM_PENDING_ROWS:
  700. return dram_pending_rows_info(hpriv, args);
  701. case HL_INFO_SECURED_ATTESTATION:
  702. return sec_attest_info(hpriv, args);
  703. case HL_INFO_REGISTER_EVENTFD:
  704. return eventfd_register(hpriv, args);
  705. case HL_INFO_UNREGISTER_EVENTFD:
  706. return eventfd_unregister(hpriv, args);
  707. case HL_INFO_ENGINE_STATUS:
  708. return engine_status_info(hpriv, args);
  709. default:
  710. dev_err(dev, "Invalid request %d\n", args->op);
  711. rc = -EINVAL;
  712. break;
  713. }
  714. return rc;
  715. }
  716. static int hl_info_ioctl(struct hl_fpriv *hpriv, void *data)
  717. {
  718. return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev);
  719. }
  720. static int hl_info_ioctl_control(struct hl_fpriv *hpriv, void *data)
  721. {
  722. return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev_ctrl);
  723. }
  724. static int hl_debug_ioctl(struct hl_fpriv *hpriv, void *data)
  725. {
  726. struct hl_debug_args *args = data;
  727. struct hl_device *hdev = hpriv->hdev;
  728. enum hl_device_status status;
  729. int rc = 0;
  730. if (!hl_device_operational(hdev, &status)) {
  731. dev_warn_ratelimited(hdev->dev,
  732. "Device is %s. Can't execute DEBUG IOCTL\n",
  733. hdev->status[status]);
  734. return -EBUSY;
  735. }
  736. switch (args->op) {
  737. case HL_DEBUG_OP_ETR:
  738. case HL_DEBUG_OP_ETF:
  739. case HL_DEBUG_OP_STM:
  740. case HL_DEBUG_OP_FUNNEL:
  741. case HL_DEBUG_OP_BMON:
  742. case HL_DEBUG_OP_SPMU:
  743. case HL_DEBUG_OP_TIMESTAMP:
  744. if (!hdev->in_debug) {
  745. dev_err_ratelimited(hdev->dev,
  746. "Rejecting debug configuration request because device not in debug mode\n");
  747. return -EFAULT;
  748. }
  749. args->input_size = min(args->input_size, hl_debug_struct_size[args->op]);
  750. rc = debug_coresight(hdev, hpriv->ctx, args);
  751. break;
  752. case HL_DEBUG_OP_SET_MODE:
  753. rc = hl_device_set_debug_mode(hdev, hpriv->ctx, (bool) args->enable);
  754. break;
  755. default:
  756. dev_err(hdev->dev, "Invalid request %d\n", args->op);
  757. rc = -EINVAL;
  758. break;
  759. }
  760. return rc;
  761. }
  762. #define HL_IOCTL_DEF(ioctl, _func) \
  763. [_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func}
  764. static const struct hl_ioctl_desc hl_ioctls[] = {
  765. HL_IOCTL_DEF(HL_IOCTL_INFO, hl_info_ioctl),
  766. HL_IOCTL_DEF(HL_IOCTL_CB, hl_cb_ioctl),
  767. HL_IOCTL_DEF(HL_IOCTL_CS, hl_cs_ioctl),
  768. HL_IOCTL_DEF(HL_IOCTL_WAIT_CS, hl_wait_ioctl),
  769. HL_IOCTL_DEF(HL_IOCTL_MEMORY, hl_mem_ioctl),
  770. HL_IOCTL_DEF(HL_IOCTL_DEBUG, hl_debug_ioctl)
  771. };
  772. static const struct hl_ioctl_desc hl_ioctls_control[] = {
  773. HL_IOCTL_DEF(HL_IOCTL_INFO, hl_info_ioctl_control)
  774. };
  775. static long _hl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg,
  776. const struct hl_ioctl_desc *ioctl, struct device *dev)
  777. {
  778. struct hl_fpriv *hpriv = filep->private_data;
  779. unsigned int nr = _IOC_NR(cmd);
  780. char stack_kdata[128] = {0};
  781. char *kdata = NULL;
  782. unsigned int usize, asize;
  783. hl_ioctl_t *func;
  784. u32 hl_size;
  785. int retcode;
  786. /* Do not trust userspace, use our own definition */
  787. func = ioctl->func;
  788. if (unlikely(!func)) {
  789. dev_dbg(dev, "no function\n");
  790. retcode = -ENOTTY;
  791. goto out_err;
  792. }
  793. hl_size = _IOC_SIZE(ioctl->cmd);
  794. usize = asize = _IOC_SIZE(cmd);
  795. if (hl_size > asize)
  796. asize = hl_size;
  797. cmd = ioctl->cmd;
  798. if (cmd & (IOC_IN | IOC_OUT)) {
  799. if (asize <= sizeof(stack_kdata)) {
  800. kdata = stack_kdata;
  801. } else {
  802. kdata = kzalloc(asize, GFP_KERNEL);
  803. if (!kdata) {
  804. retcode = -ENOMEM;
  805. goto out_err;
  806. }
  807. }
  808. }
  809. if (cmd & IOC_IN) {
  810. if (copy_from_user(kdata, (void __user *)arg, usize)) {
  811. retcode = -EFAULT;
  812. goto out_err;
  813. }
  814. } else if (cmd & IOC_OUT) {
  815. memset(kdata, 0, usize);
  816. }
  817. retcode = func(hpriv, kdata);
  818. if ((cmd & IOC_OUT) && copy_to_user((void __user *)arg, kdata, usize))
  819. retcode = -EFAULT;
  820. out_err:
  821. if (retcode)
  822. dev_dbg(dev, "error in ioctl: pid=%d, cmd=0x%02x, nr=0x%02x\n",
  823. task_pid_nr(current), cmd, nr);
  824. if (kdata != stack_kdata)
  825. kfree(kdata);
  826. return retcode;
  827. }
  828. long hl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
  829. {
  830. struct hl_fpriv *hpriv = filep->private_data;
  831. struct hl_device *hdev = hpriv->hdev;
  832. const struct hl_ioctl_desc *ioctl = NULL;
  833. unsigned int nr = _IOC_NR(cmd);
  834. if (!hdev) {
  835. pr_err_ratelimited("Sending ioctl after device was removed! Please close FD\n");
  836. return -ENODEV;
  837. }
  838. if ((nr >= HL_COMMAND_START) && (nr < HL_COMMAND_END)) {
  839. ioctl = &hl_ioctls[nr];
  840. } else {
  841. dev_err(hdev->dev, "invalid ioctl: pid=%d, nr=0x%02x\n",
  842. task_pid_nr(current), nr);
  843. return -ENOTTY;
  844. }
  845. return _hl_ioctl(filep, cmd, arg, ioctl, hdev->dev);
  846. }
  847. long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg)
  848. {
  849. struct hl_fpriv *hpriv = filep->private_data;
  850. struct hl_device *hdev = hpriv->hdev;
  851. const struct hl_ioctl_desc *ioctl = NULL;
  852. unsigned int nr = _IOC_NR(cmd);
  853. if (!hdev) {
  854. pr_err_ratelimited("Sending ioctl after device was removed! Please close FD\n");
  855. return -ENODEV;
  856. }
  857. if (nr == _IOC_NR(HL_IOCTL_INFO)) {
  858. ioctl = &hl_ioctls_control[nr];
  859. } else {
  860. dev_err(hdev->dev_ctrl, "invalid ioctl: pid=%d, nr=0x%02x\n",
  861. task_pid_nr(current), nr);
  862. return -ENOTTY;
  863. }
  864. return _hl_ioctl(filep, cmd, arg, ioctl, hdev->dev_ctrl);
  865. }