qaic_data.c 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. */
  3. /* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. */
  4. #include <linux/bitfield.h>
  5. #include <linux/bits.h>
  6. #include <linux/completion.h>
  7. #include <linux/delay.h>
  8. #include <linux/dma-buf.h>
  9. #include <linux/dma-mapping.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/kref.h>
  12. #include <linux/list.h>
  13. #include <linux/math64.h>
  14. #include <linux/mm.h>
  15. #include <linux/moduleparam.h>
  16. #include <linux/scatterlist.h>
  17. #include <linux/spinlock.h>
  18. #include <linux/srcu.h>
  19. #include <linux/types.h>
  20. #include <linux/uaccess.h>
  21. #include <linux/wait.h>
  22. #include <drm/drm_file.h>
  23. #include <drm/drm_gem.h>
  24. #include <drm/drm_prime.h>
  25. #include <drm/drm_print.h>
  26. #include <uapi/drm/qaic_accel.h>
  27. #include "qaic.h"
  28. #define SEM_VAL_MASK GENMASK_ULL(11, 0)
  29. #define SEM_INDEX_MASK GENMASK_ULL(4, 0)
  30. #define BULK_XFER BIT(3)
  31. #define GEN_COMPLETION BIT(4)
  32. #define INBOUND_XFER 1
  33. #define OUTBOUND_XFER 2
  34. #define REQHP_OFF 0x0 /* we read this */
  35. #define REQTP_OFF 0x4 /* we write this */
  36. #define RSPHP_OFF 0x8 /* we write this */
  37. #define RSPTP_OFF 0xc /* we read this */
  38. #define ENCODE_SEM(val, index, sync, cmd, flags) \
  39. ({ \
  40. FIELD_PREP(GENMASK(11, 0), (val)) | \
  41. FIELD_PREP(GENMASK(20, 16), (index)) | \
  42. FIELD_PREP(BIT(22), (sync)) | \
  43. FIELD_PREP(GENMASK(26, 24), (cmd)) | \
  44. FIELD_PREP(GENMASK(30, 29), (flags)) | \
  45. FIELD_PREP(BIT(31), (cmd) ? 1 : 0); \
  46. })
  47. #define NUM_EVENTS 128
  48. #define NUM_DELAYS 10
  49. #define fifo_at(base, offset) ((base) + (offset) * get_dbc_req_elem_size())
  50. static unsigned int wait_exec_default_timeout_ms = 5000; /* 5 sec default */
  51. module_param(wait_exec_default_timeout_ms, uint, 0600);
  52. MODULE_PARM_DESC(wait_exec_default_timeout_ms, "Default timeout for DRM_IOCTL_QAIC_WAIT_BO");
  53. static unsigned int datapath_poll_interval_us = 100; /* 100 usec default */
  54. module_param(datapath_poll_interval_us, uint, 0600);
  55. MODULE_PARM_DESC(datapath_poll_interval_us,
  56. "Amount of time to sleep between activity when datapath polling is enabled");
  57. struct dbc_req {
  58. /*
  59. * A request ID is assigned to each memory handle going in DMA queue.
  60. * As a single memory handle can enqueue multiple elements in DMA queue
  61. * all of them will have the same request ID.
  62. */
  63. __le16 req_id;
  64. /* Future use */
  65. __u8 seq_id;
  66. /*
  67. * Special encoded variable
  68. * 7 0 - Do not force to generate MSI after DMA is completed
  69. * 1 - Force to generate MSI after DMA is completed
  70. * 6:5 Reserved
  71. * 4 1 - Generate completion element in the response queue
  72. * 0 - No Completion Code
  73. * 3 0 - DMA request is a Link list transfer
  74. * 1 - DMA request is a Bulk transfer
  75. * 2 Reserved
  76. * 1:0 00 - No DMA transfer involved
  77. * 01 - DMA transfer is part of inbound transfer
  78. * 10 - DMA transfer has outbound transfer
  79. * 11 - NA
  80. */
  81. __u8 cmd;
  82. __le32 resv;
  83. /* Source address for the transfer */
  84. __le64 src_addr;
  85. /* Destination address for the transfer */
  86. __le64 dest_addr;
  87. /* Length of transfer request */
  88. __le32 len;
  89. __le32 resv2;
  90. /* Doorbell address */
  91. __le64 db_addr;
  92. /*
  93. * Special encoded variable
  94. * 7 1 - Doorbell(db) write
  95. * 0 - No doorbell write
  96. * 6:2 Reserved
  97. * 1:0 00 - 32 bit access, db address must be aligned to 32bit-boundary
  98. * 01 - 16 bit access, db address must be aligned to 16bit-boundary
  99. * 10 - 8 bit access, db address must be aligned to 8bit-boundary
  100. * 11 - Reserved
  101. */
  102. __u8 db_len;
  103. __u8 resv3;
  104. __le16 resv4;
  105. /* 32 bit data written to doorbell address */
  106. __le32 db_data;
  107. /*
  108. * Special encoded variable
  109. * All the fields of sem_cmdX are passed from user and all are ORed
  110. * together to form sem_cmd.
  111. * 0:11 Semaphore value
  112. * 15:12 Reserved
  113. * 20:16 Semaphore index
  114. * 21 Reserved
  115. * 22 Semaphore Sync
  116. * 23 Reserved
  117. * 26:24 Semaphore command
  118. * 28:27 Reserved
  119. * 29 Semaphore DMA out bound sync fence
  120. * 30 Semaphore DMA in bound sync fence
  121. * 31 Enable semaphore command
  122. */
  123. __le32 sem_cmd0;
  124. __le32 sem_cmd1;
  125. __le32 sem_cmd2;
  126. __le32 sem_cmd3;
  127. } __packed;
  128. struct dbc_rsp {
  129. /* Request ID of the memory handle whose DMA transaction is completed */
  130. __le16 req_id;
  131. /* Status of the DMA transaction. 0 : Success otherwise failure */
  132. __le16 status;
  133. } __packed;
  134. static inline bool bo_queued(struct qaic_bo *bo)
  135. {
  136. return !list_empty(&bo->xfer_list);
  137. }
  138. inline int get_dbc_req_elem_size(void)
  139. {
  140. return sizeof(struct dbc_req);
  141. }
  142. inline int get_dbc_rsp_elem_size(void)
  143. {
  144. return sizeof(struct dbc_rsp);
  145. }
  146. static void free_slice(struct kref *kref)
  147. {
  148. struct bo_slice *slice = container_of(kref, struct bo_slice, ref_count);
  149. slice->bo->total_slice_nents -= slice->nents;
  150. list_del(&slice->slice);
  151. drm_gem_object_put(&slice->bo->base);
  152. sg_free_table(slice->sgt);
  153. kfree(slice->sgt);
  154. kfree(slice->reqs);
  155. kfree(slice);
  156. }
  157. static int clone_range_of_sgt_for_slice(struct qaic_device *qdev, struct sg_table **sgt_out,
  158. struct sg_table *sgt_in, u64 size, u64 offset)
  159. {
  160. struct scatterlist *sg, *sgn, *sgf, *sgl;
  161. unsigned int len, nents, offf, offl;
  162. struct sg_table *sgt;
  163. size_t total_len;
  164. int ret, j;
  165. /* find out number of relevant nents needed for this mem */
  166. total_len = 0;
  167. sgf = NULL;
  168. sgl = NULL;
  169. nents = 0;
  170. offf = 0;
  171. offl = 0;
  172. size = size ? size : PAGE_SIZE;
  173. for_each_sgtable_dma_sg(sgt_in, sg, j) {
  174. len = sg_dma_len(sg);
  175. if (!len)
  176. continue;
  177. if (offset >= total_len && offset < total_len + len) {
  178. sgf = sg;
  179. offf = offset - total_len;
  180. }
  181. if (sgf)
  182. nents++;
  183. if (offset + size >= total_len &&
  184. offset + size <= total_len + len) {
  185. sgl = sg;
  186. offl = offset + size - total_len;
  187. break;
  188. }
  189. total_len += len;
  190. }
  191. if (!sgf || !sgl) {
  192. ret = -EINVAL;
  193. goto out;
  194. }
  195. sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);
  196. if (!sgt) {
  197. ret = -ENOMEM;
  198. goto out;
  199. }
  200. ret = sg_alloc_table(sgt, nents, GFP_KERNEL);
  201. if (ret)
  202. goto free_sgt;
  203. /* copy relevant sg node and fix page and length */
  204. sgn = sgf;
  205. for_each_sgtable_dma_sg(sgt, sg, j) {
  206. memcpy(sg, sgn, sizeof(*sg));
  207. if (sgn == sgf) {
  208. sg_dma_address(sg) += offf;
  209. sg_dma_len(sg) -= offf;
  210. sg_set_page(sg, sg_page(sgn), sg_dma_len(sg), offf);
  211. } else {
  212. offf = 0;
  213. }
  214. if (sgn == sgl) {
  215. sg_dma_len(sg) = offl - offf;
  216. sg_set_page(sg, sg_page(sgn), offl - offf, offf);
  217. sg_mark_end(sg);
  218. break;
  219. }
  220. sgn = sg_next(sgn);
  221. }
  222. *sgt_out = sgt;
  223. return ret;
  224. free_sgt:
  225. kfree(sgt);
  226. out:
  227. *sgt_out = NULL;
  228. return ret;
  229. }
  230. static int encode_reqs(struct qaic_device *qdev, struct bo_slice *slice,
  231. struct qaic_attach_slice_entry *req)
  232. {
  233. __le64 db_addr = cpu_to_le64(req->db_addr);
  234. __le32 db_data = cpu_to_le32(req->db_data);
  235. struct scatterlist *sg;
  236. __u8 cmd = BULK_XFER;
  237. int presync_sem;
  238. u64 dev_addr;
  239. __u8 db_len;
  240. int i;
  241. if (!slice->no_xfer)
  242. cmd |= (slice->dir == DMA_TO_DEVICE ? INBOUND_XFER : OUTBOUND_XFER);
  243. if (req->db_len && !IS_ALIGNED(req->db_addr, req->db_len / 8))
  244. return -EINVAL;
  245. presync_sem = req->sem0.presync + req->sem1.presync + req->sem2.presync + req->sem3.presync;
  246. if (presync_sem > 1)
  247. return -EINVAL;
  248. presync_sem = req->sem0.presync << 0 | req->sem1.presync << 1 |
  249. req->sem2.presync << 2 | req->sem3.presync << 3;
  250. switch (req->db_len) {
  251. case 32:
  252. db_len = BIT(7);
  253. break;
  254. case 16:
  255. db_len = BIT(7) | 1;
  256. break;
  257. case 8:
  258. db_len = BIT(7) | 2;
  259. break;
  260. case 0:
  261. db_len = 0; /* doorbell is not active for this command */
  262. break;
  263. default:
  264. return -EINVAL; /* should never hit this */
  265. }
  266. /*
  267. * When we end up splitting up a single request (ie a buf slice) into
  268. * multiple DMA requests, we have to manage the sync data carefully.
  269. * There can only be one presync sem. That needs to be on every xfer
  270. * so that the DMA engine doesn't transfer data before the receiver is
  271. * ready. We only do the doorbell and postsync sems after the xfer.
  272. * To guarantee previous xfers for the request are complete, we use a
  273. * fence.
  274. */
  275. dev_addr = req->dev_addr;
  276. for_each_sgtable_dma_sg(slice->sgt, sg, i) {
  277. slice->reqs[i].cmd = cmd;
  278. slice->reqs[i].src_addr = cpu_to_le64(slice->dir == DMA_TO_DEVICE ?
  279. sg_dma_address(sg) : dev_addr);
  280. slice->reqs[i].dest_addr = cpu_to_le64(slice->dir == DMA_TO_DEVICE ?
  281. dev_addr : sg_dma_address(sg));
  282. /*
  283. * sg_dma_len(sg) returns size of a DMA segment, maximum DMA
  284. * segment size is set to UINT_MAX by qaic and hence return
  285. * values of sg_dma_len(sg) can never exceed u32 range. So,
  286. * by down sizing we are not corrupting the value.
  287. */
  288. slice->reqs[i].len = cpu_to_le32((u32)sg_dma_len(sg));
  289. switch (presync_sem) {
  290. case BIT(0):
  291. slice->reqs[i].sem_cmd0 = cpu_to_le32(ENCODE_SEM(req->sem0.val,
  292. req->sem0.index,
  293. req->sem0.presync,
  294. req->sem0.cmd,
  295. req->sem0.flags));
  296. break;
  297. case BIT(1):
  298. slice->reqs[i].sem_cmd1 = cpu_to_le32(ENCODE_SEM(req->sem1.val,
  299. req->sem1.index,
  300. req->sem1.presync,
  301. req->sem1.cmd,
  302. req->sem1.flags));
  303. break;
  304. case BIT(2):
  305. slice->reqs[i].sem_cmd2 = cpu_to_le32(ENCODE_SEM(req->sem2.val,
  306. req->sem2.index,
  307. req->sem2.presync,
  308. req->sem2.cmd,
  309. req->sem2.flags));
  310. break;
  311. case BIT(3):
  312. slice->reqs[i].sem_cmd3 = cpu_to_le32(ENCODE_SEM(req->sem3.val,
  313. req->sem3.index,
  314. req->sem3.presync,
  315. req->sem3.cmd,
  316. req->sem3.flags));
  317. break;
  318. }
  319. dev_addr += sg_dma_len(sg);
  320. }
  321. /* add post transfer stuff to last segment */
  322. i--;
  323. slice->reqs[i].cmd |= GEN_COMPLETION;
  324. slice->reqs[i].db_addr = db_addr;
  325. slice->reqs[i].db_len = db_len;
  326. slice->reqs[i].db_data = db_data;
  327. /*
  328. * Add a fence if we have more than one request going to the hardware
  329. * representing the entirety of the user request, and the user request
  330. * has no presync condition.
  331. * Fences are expensive, so we try to avoid them. We rely on the
  332. * hardware behavior to avoid needing one when there is a presync
  333. * condition. When a presync exists, all requests for that same
  334. * presync will be queued into a fifo. Thus, since we queue the
  335. * post xfer activity only on the last request we queue, the hardware
  336. * will ensure that the last queued request is processed last, thus
  337. * making sure the post xfer activity happens at the right time without
  338. * a fence.
  339. */
  340. if (i && !presync_sem)
  341. req->sem0.flags |= (slice->dir == DMA_TO_DEVICE ?
  342. QAIC_SEM_INSYNCFENCE : QAIC_SEM_OUTSYNCFENCE);
  343. slice->reqs[i].sem_cmd0 = cpu_to_le32(ENCODE_SEM(req->sem0.val, req->sem0.index,
  344. req->sem0.presync, req->sem0.cmd,
  345. req->sem0.flags));
  346. slice->reqs[i].sem_cmd1 = cpu_to_le32(ENCODE_SEM(req->sem1.val, req->sem1.index,
  347. req->sem1.presync, req->sem1.cmd,
  348. req->sem1.flags));
  349. slice->reqs[i].sem_cmd2 = cpu_to_le32(ENCODE_SEM(req->sem2.val, req->sem2.index,
  350. req->sem2.presync, req->sem2.cmd,
  351. req->sem2.flags));
  352. slice->reqs[i].sem_cmd3 = cpu_to_le32(ENCODE_SEM(req->sem3.val, req->sem3.index,
  353. req->sem3.presync, req->sem3.cmd,
  354. req->sem3.flags));
  355. return 0;
  356. }
  357. static int qaic_map_one_slice(struct qaic_device *qdev, struct qaic_bo *bo,
  358. struct qaic_attach_slice_entry *slice_ent)
  359. {
  360. struct sg_table *sgt = NULL;
  361. struct bo_slice *slice;
  362. int ret;
  363. ret = clone_range_of_sgt_for_slice(qdev, &sgt, bo->sgt, slice_ent->size, slice_ent->offset);
  364. if (ret)
  365. goto out;
  366. slice = kmalloc(sizeof(*slice), GFP_KERNEL);
  367. if (!slice) {
  368. ret = -ENOMEM;
  369. goto free_sgt;
  370. }
  371. slice->reqs = kcalloc(sgt->nents, sizeof(*slice->reqs), GFP_KERNEL);
  372. if (!slice->reqs) {
  373. ret = -ENOMEM;
  374. goto free_slice;
  375. }
  376. slice->no_xfer = !slice_ent->size;
  377. slice->sgt = sgt;
  378. slice->nents = sgt->nents;
  379. slice->dir = bo->dir;
  380. slice->bo = bo;
  381. slice->size = slice_ent->size;
  382. slice->offset = slice_ent->offset;
  383. ret = encode_reqs(qdev, slice, slice_ent);
  384. if (ret)
  385. goto free_req;
  386. bo->total_slice_nents += sgt->nents;
  387. kref_init(&slice->ref_count);
  388. drm_gem_object_get(&bo->base);
  389. list_add_tail(&slice->slice, &bo->slices);
  390. return 0;
  391. free_req:
  392. kfree(slice->reqs);
  393. free_slice:
  394. kfree(slice);
  395. free_sgt:
  396. sg_free_table(sgt);
  397. kfree(sgt);
  398. out:
  399. return ret;
  400. }
  401. static int create_sgt(struct qaic_device *qdev, struct sg_table **sgt_out, u64 size)
  402. {
  403. struct scatterlist *sg;
  404. struct sg_table *sgt;
  405. struct page **pages;
  406. int *pages_order;
  407. int buf_extra;
  408. int max_order;
  409. int nr_pages;
  410. int ret = 0;
  411. int i, j, k;
  412. int order;
  413. if (size) {
  414. nr_pages = DIV_ROUND_UP(size, PAGE_SIZE);
  415. /*
  416. * calculate how much extra we are going to allocate, to remove
  417. * later
  418. */
  419. buf_extra = (PAGE_SIZE - size % PAGE_SIZE) % PAGE_SIZE;
  420. max_order = min(MAX_PAGE_ORDER, get_order(size));
  421. } else {
  422. /* allocate a single page for book keeping */
  423. nr_pages = 1;
  424. buf_extra = 0;
  425. max_order = 0;
  426. }
  427. pages = kvmalloc_array(nr_pages, sizeof(*pages) + sizeof(*pages_order), GFP_KERNEL);
  428. if (!pages) {
  429. ret = -ENOMEM;
  430. goto out;
  431. }
  432. pages_order = (void *)pages + sizeof(*pages) * nr_pages;
  433. /*
  434. * Allocate requested memory using alloc_pages. It is possible to allocate
  435. * the requested memory in multiple chunks by calling alloc_pages
  436. * multiple times. Use SG table to handle multiple allocated pages.
  437. */
  438. i = 0;
  439. while (nr_pages > 0) {
  440. order = min(get_order(nr_pages * PAGE_SIZE), max_order);
  441. while (1) {
  442. pages[i] = alloc_pages(GFP_KERNEL | GFP_HIGHUSER |
  443. __GFP_NOWARN | __GFP_ZERO |
  444. (order ? __GFP_NORETRY : __GFP_RETRY_MAYFAIL),
  445. order);
  446. if (pages[i])
  447. break;
  448. if (!order--) {
  449. ret = -ENOMEM;
  450. goto free_partial_alloc;
  451. }
  452. }
  453. max_order = order;
  454. pages_order[i] = order;
  455. nr_pages -= 1 << order;
  456. if (nr_pages <= 0)
  457. /* account for over allocation */
  458. buf_extra += abs(nr_pages) * PAGE_SIZE;
  459. i++;
  460. }
  461. sgt = kmalloc(sizeof(*sgt), GFP_KERNEL);
  462. if (!sgt) {
  463. ret = -ENOMEM;
  464. goto free_partial_alloc;
  465. }
  466. if (sg_alloc_table(sgt, i, GFP_KERNEL)) {
  467. ret = -ENOMEM;
  468. goto free_sgt;
  469. }
  470. /* Populate the SG table with the allocated memory pages */
  471. sg = sgt->sgl;
  472. for (k = 0; k < i; k++, sg = sg_next(sg)) {
  473. /* Last entry requires special handling */
  474. if (k < i - 1) {
  475. sg_set_page(sg, pages[k], PAGE_SIZE << pages_order[k], 0);
  476. } else {
  477. sg_set_page(sg, pages[k], (PAGE_SIZE << pages_order[k]) - buf_extra, 0);
  478. sg_mark_end(sg);
  479. }
  480. }
  481. kvfree(pages);
  482. *sgt_out = sgt;
  483. return ret;
  484. free_sgt:
  485. kfree(sgt);
  486. free_partial_alloc:
  487. for (j = 0; j < i; j++)
  488. __free_pages(pages[j], pages_order[j]);
  489. kvfree(pages);
  490. out:
  491. *sgt_out = NULL;
  492. return ret;
  493. }
  494. static bool invalid_sem(struct qaic_sem *sem)
  495. {
  496. if (sem->val & ~SEM_VAL_MASK || sem->index & ~SEM_INDEX_MASK ||
  497. !(sem->presync == 0 || sem->presync == 1) || sem->pad ||
  498. sem->flags & ~(QAIC_SEM_INSYNCFENCE | QAIC_SEM_OUTSYNCFENCE) ||
  499. sem->cmd > QAIC_SEM_WAIT_GT_0)
  500. return true;
  501. return false;
  502. }
  503. static int qaic_validate_req(struct qaic_device *qdev, struct qaic_attach_slice_entry *slice_ent,
  504. u32 count, u64 total_size)
  505. {
  506. u64 total;
  507. int i;
  508. for (i = 0; i < count; i++) {
  509. if (!(slice_ent[i].db_len == 32 || slice_ent[i].db_len == 16 ||
  510. slice_ent[i].db_len == 8 || slice_ent[i].db_len == 0) ||
  511. invalid_sem(&slice_ent[i].sem0) || invalid_sem(&slice_ent[i].sem1) ||
  512. invalid_sem(&slice_ent[i].sem2) || invalid_sem(&slice_ent[i].sem3))
  513. return -EINVAL;
  514. if (check_add_overflow(slice_ent[i].offset, slice_ent[i].size, &total) ||
  515. total > total_size)
  516. return -EINVAL;
  517. }
  518. return 0;
  519. }
  520. static void qaic_free_sgt(struct sg_table *sgt)
  521. {
  522. struct scatterlist *sg;
  523. if (!sgt)
  524. return;
  525. for (sg = sgt->sgl; sg; sg = sg_next(sg))
  526. if (sg_page(sg))
  527. __free_pages(sg_page(sg), get_order(sg->length));
  528. sg_free_table(sgt);
  529. kfree(sgt);
  530. }
  531. static void qaic_gem_print_info(struct drm_printer *p, unsigned int indent,
  532. const struct drm_gem_object *obj)
  533. {
  534. struct qaic_bo *bo = to_qaic_bo(obj);
  535. drm_printf_indent(p, indent, "BO DMA direction %d\n", bo->dir);
  536. }
  537. static const struct vm_operations_struct drm_vm_ops = {
  538. .open = drm_gem_vm_open,
  539. .close = drm_gem_vm_close,
  540. };
  541. static int qaic_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
  542. {
  543. struct qaic_bo *bo = to_qaic_bo(obj);
  544. unsigned long offset = 0;
  545. struct scatterlist *sg;
  546. int ret = 0;
  547. if (obj->import_attach)
  548. return -EINVAL;
  549. for (sg = bo->sgt->sgl; sg; sg = sg_next(sg)) {
  550. if (sg_page(sg)) {
  551. ret = remap_pfn_range(vma, vma->vm_start + offset, page_to_pfn(sg_page(sg)),
  552. sg->length, vma->vm_page_prot);
  553. if (ret)
  554. goto out;
  555. offset += sg->length;
  556. }
  557. }
  558. out:
  559. return ret;
  560. }
  561. static void qaic_free_object(struct drm_gem_object *obj)
  562. {
  563. struct qaic_bo *bo = to_qaic_bo(obj);
  564. if (obj->import_attach) {
  565. /* DMABUF/PRIME Path */
  566. drm_prime_gem_destroy(obj, NULL);
  567. } else {
  568. /* Private buffer allocation path */
  569. qaic_free_sgt(bo->sgt);
  570. }
  571. mutex_destroy(&bo->lock);
  572. drm_gem_object_release(obj);
  573. kfree(bo);
  574. }
  575. static const struct drm_gem_object_funcs qaic_gem_funcs = {
  576. .free = qaic_free_object,
  577. .print_info = qaic_gem_print_info,
  578. .mmap = qaic_gem_object_mmap,
  579. .vm_ops = &drm_vm_ops,
  580. };
  581. static void qaic_init_bo(struct qaic_bo *bo, bool reinit)
  582. {
  583. if (reinit) {
  584. bo->sliced = false;
  585. reinit_completion(&bo->xfer_done);
  586. } else {
  587. mutex_init(&bo->lock);
  588. init_completion(&bo->xfer_done);
  589. }
  590. complete_all(&bo->xfer_done);
  591. INIT_LIST_HEAD(&bo->slices);
  592. INIT_LIST_HEAD(&bo->xfer_list);
  593. }
  594. static struct qaic_bo *qaic_alloc_init_bo(void)
  595. {
  596. struct qaic_bo *bo;
  597. bo = kzalloc(sizeof(*bo), GFP_KERNEL);
  598. if (!bo)
  599. return ERR_PTR(-ENOMEM);
  600. qaic_init_bo(bo, false);
  601. return bo;
  602. }
  603. int qaic_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  604. {
  605. struct qaic_create_bo *args = data;
  606. int usr_rcu_id, qdev_rcu_id;
  607. struct drm_gem_object *obj;
  608. struct qaic_device *qdev;
  609. struct qaic_user *usr;
  610. struct qaic_bo *bo;
  611. size_t size;
  612. int ret;
  613. if (args->pad)
  614. return -EINVAL;
  615. size = PAGE_ALIGN(args->size);
  616. if (size == 0)
  617. return -EINVAL;
  618. usr = file_priv->driver_priv;
  619. usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
  620. if (!usr->qddev) {
  621. ret = -ENODEV;
  622. goto unlock_usr_srcu;
  623. }
  624. qdev = usr->qddev->qdev;
  625. qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
  626. if (qdev->dev_state != QAIC_ONLINE) {
  627. ret = -ENODEV;
  628. goto unlock_dev_srcu;
  629. }
  630. bo = qaic_alloc_init_bo();
  631. if (IS_ERR(bo)) {
  632. ret = PTR_ERR(bo);
  633. goto unlock_dev_srcu;
  634. }
  635. obj = &bo->base;
  636. drm_gem_private_object_init(dev, obj, size);
  637. obj->funcs = &qaic_gem_funcs;
  638. ret = create_sgt(qdev, &bo->sgt, size);
  639. if (ret)
  640. goto free_bo;
  641. ret = drm_gem_create_mmap_offset(obj);
  642. if (ret)
  643. goto free_bo;
  644. ret = drm_gem_handle_create(file_priv, obj, &args->handle);
  645. if (ret)
  646. goto free_bo;
  647. bo->handle = args->handle;
  648. drm_gem_object_put(obj);
  649. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  650. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  651. return 0;
  652. free_bo:
  653. drm_gem_object_put(obj);
  654. unlock_dev_srcu:
  655. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  656. unlock_usr_srcu:
  657. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  658. return ret;
  659. }
  660. int qaic_mmap_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  661. {
  662. struct qaic_mmap_bo *args = data;
  663. int usr_rcu_id, qdev_rcu_id;
  664. struct drm_gem_object *obj;
  665. struct qaic_device *qdev;
  666. struct qaic_user *usr;
  667. int ret = 0;
  668. usr = file_priv->driver_priv;
  669. usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
  670. if (!usr->qddev) {
  671. ret = -ENODEV;
  672. goto unlock_usr_srcu;
  673. }
  674. qdev = usr->qddev->qdev;
  675. qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
  676. if (qdev->dev_state != QAIC_ONLINE) {
  677. ret = -ENODEV;
  678. goto unlock_dev_srcu;
  679. }
  680. obj = drm_gem_object_lookup(file_priv, args->handle);
  681. if (!obj) {
  682. ret = -ENOENT;
  683. goto unlock_dev_srcu;
  684. }
  685. args->offset = drm_vma_node_offset_addr(&obj->vma_node);
  686. drm_gem_object_put(obj);
  687. unlock_dev_srcu:
  688. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  689. unlock_usr_srcu:
  690. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  691. return ret;
  692. }
  693. struct drm_gem_object *qaic_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf)
  694. {
  695. struct dma_buf_attachment *attach;
  696. struct drm_gem_object *obj;
  697. struct qaic_bo *bo;
  698. int ret;
  699. bo = qaic_alloc_init_bo();
  700. if (IS_ERR(bo)) {
  701. ret = PTR_ERR(bo);
  702. goto out;
  703. }
  704. obj = &bo->base;
  705. get_dma_buf(dma_buf);
  706. attach = dma_buf_attach(dma_buf, dev->dev);
  707. if (IS_ERR(attach)) {
  708. ret = PTR_ERR(attach);
  709. goto attach_fail;
  710. }
  711. if (!attach->dmabuf->size) {
  712. ret = -EINVAL;
  713. goto size_align_fail;
  714. }
  715. drm_gem_private_object_init(dev, obj, attach->dmabuf->size);
  716. /*
  717. * skipping dma_buf_map_attachment() as we do not know the direction
  718. * just yet. Once the direction is known in the subsequent IOCTL to
  719. * attach slicing, we can do it then.
  720. */
  721. obj->funcs = &qaic_gem_funcs;
  722. obj->import_attach = attach;
  723. obj->resv = dma_buf->resv;
  724. return obj;
  725. size_align_fail:
  726. dma_buf_detach(dma_buf, attach);
  727. attach_fail:
  728. dma_buf_put(dma_buf);
  729. kfree(bo);
  730. out:
  731. return ERR_PTR(ret);
  732. }
  733. static int qaic_prepare_import_bo(struct qaic_bo *bo, struct qaic_attach_slice_hdr *hdr)
  734. {
  735. struct drm_gem_object *obj = &bo->base;
  736. struct sg_table *sgt;
  737. int ret;
  738. sgt = dma_buf_map_attachment(obj->import_attach, hdr->dir);
  739. if (IS_ERR(sgt)) {
  740. ret = PTR_ERR(sgt);
  741. return ret;
  742. }
  743. bo->sgt = sgt;
  744. return 0;
  745. }
  746. static int qaic_prepare_export_bo(struct qaic_device *qdev, struct qaic_bo *bo,
  747. struct qaic_attach_slice_hdr *hdr)
  748. {
  749. int ret;
  750. ret = dma_map_sgtable(&qdev->pdev->dev, bo->sgt, hdr->dir, 0);
  751. if (ret)
  752. return -EFAULT;
  753. return 0;
  754. }
  755. static int qaic_prepare_bo(struct qaic_device *qdev, struct qaic_bo *bo,
  756. struct qaic_attach_slice_hdr *hdr)
  757. {
  758. int ret;
  759. if (bo->base.import_attach)
  760. ret = qaic_prepare_import_bo(bo, hdr);
  761. else
  762. ret = qaic_prepare_export_bo(qdev, bo, hdr);
  763. bo->dir = hdr->dir;
  764. bo->dbc = &qdev->dbc[hdr->dbc_id];
  765. bo->nr_slice = hdr->count;
  766. return ret;
  767. }
  768. static void qaic_unprepare_import_bo(struct qaic_bo *bo)
  769. {
  770. dma_buf_unmap_attachment(bo->base.import_attach, bo->sgt, bo->dir);
  771. bo->sgt = NULL;
  772. }
  773. static void qaic_unprepare_export_bo(struct qaic_device *qdev, struct qaic_bo *bo)
  774. {
  775. dma_unmap_sgtable(&qdev->pdev->dev, bo->sgt, bo->dir, 0);
  776. }
  777. static void qaic_unprepare_bo(struct qaic_device *qdev, struct qaic_bo *bo)
  778. {
  779. if (bo->base.import_attach)
  780. qaic_unprepare_import_bo(bo);
  781. else
  782. qaic_unprepare_export_bo(qdev, bo);
  783. bo->dir = 0;
  784. bo->dbc = NULL;
  785. bo->nr_slice = 0;
  786. }
  787. static void qaic_free_slices_bo(struct qaic_bo *bo)
  788. {
  789. struct bo_slice *slice, *temp;
  790. list_for_each_entry_safe(slice, temp, &bo->slices, slice)
  791. kref_put(&slice->ref_count, free_slice);
  792. if (WARN_ON_ONCE(bo->total_slice_nents != 0))
  793. bo->total_slice_nents = 0;
  794. bo->nr_slice = 0;
  795. }
  796. static int qaic_attach_slicing_bo(struct qaic_device *qdev, struct qaic_bo *bo,
  797. struct qaic_attach_slice_hdr *hdr,
  798. struct qaic_attach_slice_entry *slice_ent)
  799. {
  800. int ret, i;
  801. for (i = 0; i < hdr->count; i++) {
  802. ret = qaic_map_one_slice(qdev, bo, &slice_ent[i]);
  803. if (ret) {
  804. qaic_free_slices_bo(bo);
  805. return ret;
  806. }
  807. }
  808. if (bo->total_slice_nents > bo->dbc->nelem) {
  809. qaic_free_slices_bo(bo);
  810. return -ENOSPC;
  811. }
  812. return 0;
  813. }
  814. int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  815. {
  816. struct qaic_attach_slice_entry *slice_ent;
  817. struct qaic_attach_slice *args = data;
  818. int rcu_id, usr_rcu_id, qdev_rcu_id;
  819. struct dma_bridge_chan *dbc;
  820. struct drm_gem_object *obj;
  821. struct qaic_device *qdev;
  822. unsigned long arg_size;
  823. struct qaic_user *usr;
  824. u8 __user *user_data;
  825. struct qaic_bo *bo;
  826. int ret;
  827. if (args->hdr.count == 0)
  828. return -EINVAL;
  829. arg_size = args->hdr.count * sizeof(*slice_ent);
  830. if (arg_size / args->hdr.count != sizeof(*slice_ent))
  831. return -EINVAL;
  832. if (!(args->hdr.dir == DMA_TO_DEVICE || args->hdr.dir == DMA_FROM_DEVICE))
  833. return -EINVAL;
  834. if (args->data == 0)
  835. return -EINVAL;
  836. usr = file_priv->driver_priv;
  837. usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
  838. if (!usr->qddev) {
  839. ret = -ENODEV;
  840. goto unlock_usr_srcu;
  841. }
  842. qdev = usr->qddev->qdev;
  843. qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
  844. if (qdev->dev_state != QAIC_ONLINE) {
  845. ret = -ENODEV;
  846. goto unlock_dev_srcu;
  847. }
  848. if (args->hdr.dbc_id >= qdev->num_dbc) {
  849. ret = -EINVAL;
  850. goto unlock_dev_srcu;
  851. }
  852. user_data = u64_to_user_ptr(args->data);
  853. slice_ent = kzalloc(arg_size, GFP_KERNEL);
  854. if (!slice_ent) {
  855. ret = -EINVAL;
  856. goto unlock_dev_srcu;
  857. }
  858. ret = copy_from_user(slice_ent, user_data, arg_size);
  859. if (ret) {
  860. ret = -EFAULT;
  861. goto free_slice_ent;
  862. }
  863. obj = drm_gem_object_lookup(file_priv, args->hdr.handle);
  864. if (!obj) {
  865. ret = -ENOENT;
  866. goto free_slice_ent;
  867. }
  868. ret = qaic_validate_req(qdev, slice_ent, args->hdr.count, obj->size);
  869. if (ret)
  870. goto put_bo;
  871. bo = to_qaic_bo(obj);
  872. ret = mutex_lock_interruptible(&bo->lock);
  873. if (ret)
  874. goto put_bo;
  875. if (bo->sliced) {
  876. ret = -EINVAL;
  877. goto unlock_bo;
  878. }
  879. dbc = &qdev->dbc[args->hdr.dbc_id];
  880. rcu_id = srcu_read_lock(&dbc->ch_lock);
  881. if (dbc->usr != usr) {
  882. ret = -EINVAL;
  883. goto unlock_ch_srcu;
  884. }
  885. ret = qaic_prepare_bo(qdev, bo, &args->hdr);
  886. if (ret)
  887. goto unlock_ch_srcu;
  888. ret = qaic_attach_slicing_bo(qdev, bo, &args->hdr, slice_ent);
  889. if (ret)
  890. goto unprepare_bo;
  891. if (args->hdr.dir == DMA_TO_DEVICE)
  892. dma_sync_sgtable_for_cpu(&qdev->pdev->dev, bo->sgt, args->hdr.dir);
  893. bo->sliced = true;
  894. list_add_tail(&bo->bo_list, &bo->dbc->bo_lists);
  895. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  896. mutex_unlock(&bo->lock);
  897. kfree(slice_ent);
  898. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  899. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  900. return 0;
  901. unprepare_bo:
  902. qaic_unprepare_bo(qdev, bo);
  903. unlock_ch_srcu:
  904. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  905. unlock_bo:
  906. mutex_unlock(&bo->lock);
  907. put_bo:
  908. drm_gem_object_put(obj);
  909. free_slice_ent:
  910. kfree(slice_ent);
  911. unlock_dev_srcu:
  912. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  913. unlock_usr_srcu:
  914. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  915. return ret;
  916. }
  917. static inline u32 fifo_space_avail(u32 head, u32 tail, u32 q_size)
  918. {
  919. u32 avail = head - tail - 1;
  920. if (head <= tail)
  921. avail += q_size;
  922. return avail;
  923. }
  924. static inline int copy_exec_reqs(struct qaic_device *qdev, struct bo_slice *slice, u32 dbc_id,
  925. u32 head, u32 *ptail)
  926. {
  927. struct dma_bridge_chan *dbc = &qdev->dbc[dbc_id];
  928. struct dbc_req *reqs = slice->reqs;
  929. u32 tail = *ptail;
  930. u32 avail;
  931. avail = fifo_space_avail(head, tail, dbc->nelem);
  932. if (avail < slice->nents)
  933. return -EAGAIN;
  934. if (tail + slice->nents > dbc->nelem) {
  935. avail = dbc->nelem - tail;
  936. avail = min_t(u32, avail, slice->nents);
  937. memcpy(fifo_at(dbc->req_q_base, tail), reqs, sizeof(*reqs) * avail);
  938. reqs += avail;
  939. avail = slice->nents - avail;
  940. if (avail)
  941. memcpy(dbc->req_q_base, reqs, sizeof(*reqs) * avail);
  942. } else {
  943. memcpy(fifo_at(dbc->req_q_base, tail), reqs, sizeof(*reqs) * slice->nents);
  944. }
  945. *ptail = (tail + slice->nents) % dbc->nelem;
  946. return 0;
  947. }
  948. static inline int copy_partial_exec_reqs(struct qaic_device *qdev, struct bo_slice *slice,
  949. u64 resize, struct dma_bridge_chan *dbc, u32 head,
  950. u32 *ptail)
  951. {
  952. struct dbc_req *reqs = slice->reqs;
  953. struct dbc_req *last_req;
  954. u32 tail = *ptail;
  955. u64 last_bytes;
  956. u32 first_n;
  957. u32 avail;
  958. avail = fifo_space_avail(head, tail, dbc->nelem);
  959. /*
  960. * After this for loop is complete, first_n represents the index
  961. * of the last DMA request of this slice that needs to be
  962. * transferred after resizing and last_bytes represents DMA size
  963. * of that request.
  964. */
  965. last_bytes = resize;
  966. for (first_n = 0; first_n < slice->nents; first_n++)
  967. if (last_bytes > le32_to_cpu(reqs[first_n].len))
  968. last_bytes -= le32_to_cpu(reqs[first_n].len);
  969. else
  970. break;
  971. if (avail < (first_n + 1))
  972. return -EAGAIN;
  973. if (first_n) {
  974. if (tail + first_n > dbc->nelem) {
  975. avail = dbc->nelem - tail;
  976. avail = min_t(u32, avail, first_n);
  977. memcpy(fifo_at(dbc->req_q_base, tail), reqs, sizeof(*reqs) * avail);
  978. last_req = reqs + avail;
  979. avail = first_n - avail;
  980. if (avail)
  981. memcpy(dbc->req_q_base, last_req, sizeof(*reqs) * avail);
  982. } else {
  983. memcpy(fifo_at(dbc->req_q_base, tail), reqs, sizeof(*reqs) * first_n);
  984. }
  985. }
  986. /*
  987. * Copy over the last entry. Here we need to adjust len to the left over
  988. * size, and set src and dst to the entry it is copied to.
  989. */
  990. last_req = fifo_at(dbc->req_q_base, (tail + first_n) % dbc->nelem);
  991. memcpy(last_req, reqs + slice->nents - 1, sizeof(*reqs));
  992. /*
  993. * last_bytes holds size of a DMA segment, maximum DMA segment size is
  994. * set to UINT_MAX by qaic and hence last_bytes can never exceed u32
  995. * range. So, by down sizing we are not corrupting the value.
  996. */
  997. last_req->len = cpu_to_le32((u32)last_bytes);
  998. last_req->src_addr = reqs[first_n].src_addr;
  999. last_req->dest_addr = reqs[first_n].dest_addr;
  1000. if (!last_bytes)
  1001. /* Disable DMA transfer */
  1002. last_req->cmd = GENMASK(7, 2) & reqs[first_n].cmd;
  1003. *ptail = (tail + first_n + 1) % dbc->nelem;
  1004. return 0;
  1005. }
  1006. static int send_bo_list_to_device(struct qaic_device *qdev, struct drm_file *file_priv,
  1007. struct qaic_execute_entry *exec, unsigned int count,
  1008. bool is_partial, struct dma_bridge_chan *dbc, u32 head,
  1009. u32 *tail)
  1010. {
  1011. struct qaic_partial_execute_entry *pexec = (struct qaic_partial_execute_entry *)exec;
  1012. struct drm_gem_object *obj;
  1013. struct bo_slice *slice;
  1014. unsigned long flags;
  1015. struct qaic_bo *bo;
  1016. int i, j;
  1017. int ret;
  1018. for (i = 0; i < count; i++) {
  1019. /*
  1020. * ref count will be decremented when the transfer of this
  1021. * buffer is complete. It is inside dbc_irq_threaded_fn().
  1022. */
  1023. obj = drm_gem_object_lookup(file_priv,
  1024. is_partial ? pexec[i].handle : exec[i].handle);
  1025. if (!obj) {
  1026. ret = -ENOENT;
  1027. goto failed_to_send_bo;
  1028. }
  1029. bo = to_qaic_bo(obj);
  1030. ret = mutex_lock_interruptible(&bo->lock);
  1031. if (ret)
  1032. goto failed_to_send_bo;
  1033. if (!bo->sliced) {
  1034. ret = -EINVAL;
  1035. goto unlock_bo;
  1036. }
  1037. if (is_partial && pexec[i].resize > bo->base.size) {
  1038. ret = -EINVAL;
  1039. goto unlock_bo;
  1040. }
  1041. spin_lock_irqsave(&dbc->xfer_lock, flags);
  1042. if (bo_queued(bo)) {
  1043. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1044. ret = -EINVAL;
  1045. goto unlock_bo;
  1046. }
  1047. bo->req_id = dbc->next_req_id++;
  1048. list_for_each_entry(slice, &bo->slices, slice) {
  1049. for (j = 0; j < slice->nents; j++)
  1050. slice->reqs[j].req_id = cpu_to_le16(bo->req_id);
  1051. if (is_partial && (!pexec[i].resize || pexec[i].resize <= slice->offset))
  1052. /* Configure the slice for no DMA transfer */
  1053. ret = copy_partial_exec_reqs(qdev, slice, 0, dbc, head, tail);
  1054. else if (is_partial && pexec[i].resize < slice->offset + slice->size)
  1055. /* Configure the slice to be partially DMA transferred */
  1056. ret = copy_partial_exec_reqs(qdev, slice,
  1057. pexec[i].resize - slice->offset, dbc,
  1058. head, tail);
  1059. else
  1060. ret = copy_exec_reqs(qdev, slice, dbc->id, head, tail);
  1061. if (ret) {
  1062. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1063. goto unlock_bo;
  1064. }
  1065. }
  1066. reinit_completion(&bo->xfer_done);
  1067. list_add_tail(&bo->xfer_list, &dbc->xfer_list);
  1068. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1069. dma_sync_sgtable_for_device(&qdev->pdev->dev, bo->sgt, bo->dir);
  1070. mutex_unlock(&bo->lock);
  1071. }
  1072. return 0;
  1073. unlock_bo:
  1074. mutex_unlock(&bo->lock);
  1075. failed_to_send_bo:
  1076. if (likely(obj))
  1077. drm_gem_object_put(obj);
  1078. for (j = 0; j < i; j++) {
  1079. spin_lock_irqsave(&dbc->xfer_lock, flags);
  1080. bo = list_last_entry(&dbc->xfer_list, struct qaic_bo, xfer_list);
  1081. obj = &bo->base;
  1082. list_del_init(&bo->xfer_list);
  1083. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1084. dma_sync_sgtable_for_cpu(&qdev->pdev->dev, bo->sgt, bo->dir);
  1085. drm_gem_object_put(obj);
  1086. }
  1087. return ret;
  1088. }
  1089. static void update_profiling_data(struct drm_file *file_priv,
  1090. struct qaic_execute_entry *exec, unsigned int count,
  1091. bool is_partial, u64 received_ts, u64 submit_ts, u32 queue_level)
  1092. {
  1093. struct qaic_partial_execute_entry *pexec = (struct qaic_partial_execute_entry *)exec;
  1094. struct drm_gem_object *obj;
  1095. struct qaic_bo *bo;
  1096. int i;
  1097. for (i = 0; i < count; i++) {
  1098. /*
  1099. * Since we already committed the BO to hardware, the only way
  1100. * this should fail is a pending signal. We can't cancel the
  1101. * submit to hardware, so we have to just skip the profiling
  1102. * data. In case the signal is not fatal to the process, we
  1103. * return success so that the user doesn't try to resubmit.
  1104. */
  1105. obj = drm_gem_object_lookup(file_priv,
  1106. is_partial ? pexec[i].handle : exec[i].handle);
  1107. if (!obj)
  1108. break;
  1109. bo = to_qaic_bo(obj);
  1110. bo->perf_stats.req_received_ts = received_ts;
  1111. bo->perf_stats.req_submit_ts = submit_ts;
  1112. bo->perf_stats.queue_level_before = queue_level;
  1113. queue_level += bo->total_slice_nents;
  1114. drm_gem_object_put(obj);
  1115. }
  1116. }
  1117. static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv,
  1118. bool is_partial)
  1119. {
  1120. struct qaic_execute *args = data;
  1121. struct qaic_execute_entry *exec;
  1122. struct dma_bridge_chan *dbc;
  1123. int usr_rcu_id, qdev_rcu_id;
  1124. struct qaic_device *qdev;
  1125. struct qaic_user *usr;
  1126. u8 __user *user_data;
  1127. unsigned long n;
  1128. u64 received_ts;
  1129. u32 queue_level;
  1130. u64 submit_ts;
  1131. int rcu_id;
  1132. u32 head;
  1133. u32 tail;
  1134. u64 size;
  1135. int ret;
  1136. received_ts = ktime_get_ns();
  1137. size = is_partial ? sizeof(struct qaic_partial_execute_entry) : sizeof(*exec);
  1138. n = (unsigned long)size * args->hdr.count;
  1139. if (args->hdr.count == 0 || n / args->hdr.count != size)
  1140. return -EINVAL;
  1141. user_data = u64_to_user_ptr(args->data);
  1142. exec = kcalloc(args->hdr.count, size, GFP_KERNEL);
  1143. if (!exec)
  1144. return -ENOMEM;
  1145. if (copy_from_user(exec, user_data, n)) {
  1146. ret = -EFAULT;
  1147. goto free_exec;
  1148. }
  1149. usr = file_priv->driver_priv;
  1150. usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
  1151. if (!usr->qddev) {
  1152. ret = -ENODEV;
  1153. goto unlock_usr_srcu;
  1154. }
  1155. qdev = usr->qddev->qdev;
  1156. qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
  1157. if (qdev->dev_state != QAIC_ONLINE) {
  1158. ret = -ENODEV;
  1159. goto unlock_dev_srcu;
  1160. }
  1161. if (args->hdr.dbc_id >= qdev->num_dbc) {
  1162. ret = -EINVAL;
  1163. goto unlock_dev_srcu;
  1164. }
  1165. dbc = &qdev->dbc[args->hdr.dbc_id];
  1166. rcu_id = srcu_read_lock(&dbc->ch_lock);
  1167. if (!dbc->usr || dbc->usr->handle != usr->handle) {
  1168. ret = -EPERM;
  1169. goto release_ch_rcu;
  1170. }
  1171. ret = mutex_lock_interruptible(&dbc->req_lock);
  1172. if (ret)
  1173. goto release_ch_rcu;
  1174. head = readl(dbc->dbc_base + REQHP_OFF);
  1175. tail = readl(dbc->dbc_base + REQTP_OFF);
  1176. if (head == U32_MAX || tail == U32_MAX) {
  1177. /* PCI link error */
  1178. ret = -ENODEV;
  1179. goto unlock_req_lock;
  1180. }
  1181. queue_level = head <= tail ? tail - head : dbc->nelem - (head - tail);
  1182. ret = send_bo_list_to_device(qdev, file_priv, exec, args->hdr.count, is_partial, dbc,
  1183. head, &tail);
  1184. if (ret)
  1185. goto unlock_req_lock;
  1186. /* Finalize commit to hardware */
  1187. submit_ts = ktime_get_ns();
  1188. writel(tail, dbc->dbc_base + REQTP_OFF);
  1189. mutex_unlock(&dbc->req_lock);
  1190. update_profiling_data(file_priv, exec, args->hdr.count, is_partial, received_ts,
  1191. submit_ts, queue_level);
  1192. if (datapath_polling)
  1193. schedule_work(&dbc->poll_work);
  1194. unlock_req_lock:
  1195. if (ret)
  1196. mutex_unlock(&dbc->req_lock);
  1197. release_ch_rcu:
  1198. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1199. unlock_dev_srcu:
  1200. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  1201. unlock_usr_srcu:
  1202. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  1203. free_exec:
  1204. kfree(exec);
  1205. return ret;
  1206. }
  1207. int qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1208. {
  1209. return __qaic_execute_bo_ioctl(dev, data, file_priv, false);
  1210. }
  1211. int qaic_partial_execute_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1212. {
  1213. return __qaic_execute_bo_ioctl(dev, data, file_priv, true);
  1214. }
  1215. /*
  1216. * Our interrupt handling is a bit more complicated than a simple ideal, but
  1217. * sadly necessary.
  1218. *
  1219. * Each dbc has a completion queue. Entries in the queue correspond to DMA
  1220. * requests which the device has processed. The hardware already has a built
  1221. * in irq mitigation. When the device puts an entry into the queue, it will
  1222. * only trigger an interrupt if the queue was empty. Therefore, when adding
  1223. * the Nth event to a non-empty queue, the hardware doesn't trigger an
  1224. * interrupt. This means the host doesn't get additional interrupts signaling
  1225. * the same thing - the queue has something to process.
  1226. * This behavior can be overridden in the DMA request.
  1227. * This means that when the host receives an interrupt, it is required to
  1228. * drain the queue.
  1229. *
  1230. * This behavior is what NAPI attempts to accomplish, although we can't use
  1231. * NAPI as we don't have a netdev. We use threaded irqs instead.
  1232. *
  1233. * However, there is a situation where the host drains the queue fast enough
  1234. * that every event causes an interrupt. Typically this is not a problem as
  1235. * the rate of events would be low. However, that is not the case with
  1236. * lprnet for example. On an Intel Xeon D-2191 where we run 8 instances of
  1237. * lprnet, the host receives roughly 80k interrupts per second from the device
  1238. * (per /proc/interrupts). While NAPI documentation indicates the host should
  1239. * just chug along, sadly that behavior causes instability in some hosts.
  1240. *
  1241. * Therefore, we implement an interrupt disable scheme similar to NAPI. The
  1242. * key difference is that we will delay after draining the queue for a small
  1243. * time to allow additional events to come in via polling. Using the above
  1244. * lprnet workload, this reduces the number of interrupts processed from
  1245. * ~80k/sec to about 64 in 5 minutes and appears to solve the system
  1246. * instability.
  1247. */
  1248. irqreturn_t dbc_irq_handler(int irq, void *data)
  1249. {
  1250. struct dma_bridge_chan *dbc = data;
  1251. int rcu_id;
  1252. u32 head;
  1253. u32 tail;
  1254. rcu_id = srcu_read_lock(&dbc->ch_lock);
  1255. if (datapath_polling) {
  1256. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1257. /*
  1258. * Normally datapath_polling will not have irqs enabled, but
  1259. * when running with only one MSI the interrupt is shared with
  1260. * MHI so it cannot be disabled. Return ASAP instead.
  1261. */
  1262. return IRQ_HANDLED;
  1263. }
  1264. if (!dbc->usr) {
  1265. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1266. return IRQ_HANDLED;
  1267. }
  1268. head = readl(dbc->dbc_base + RSPHP_OFF);
  1269. if (head == U32_MAX) { /* PCI link error */
  1270. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1271. return IRQ_NONE;
  1272. }
  1273. tail = readl(dbc->dbc_base + RSPTP_OFF);
  1274. if (tail == U32_MAX) { /* PCI link error */
  1275. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1276. return IRQ_NONE;
  1277. }
  1278. if (head == tail) { /* queue empty */
  1279. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1280. return IRQ_NONE;
  1281. }
  1282. if (!dbc->qdev->single_msi)
  1283. disable_irq_nosync(irq);
  1284. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1285. return IRQ_WAKE_THREAD;
  1286. }
  1287. void irq_polling_work(struct work_struct *work)
  1288. {
  1289. struct dma_bridge_chan *dbc = container_of(work, struct dma_bridge_chan, poll_work);
  1290. unsigned long flags;
  1291. int rcu_id;
  1292. u32 head;
  1293. u32 tail;
  1294. rcu_id = srcu_read_lock(&dbc->ch_lock);
  1295. while (1) {
  1296. if (dbc->qdev->dev_state != QAIC_ONLINE) {
  1297. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1298. return;
  1299. }
  1300. if (!dbc->usr) {
  1301. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1302. return;
  1303. }
  1304. spin_lock_irqsave(&dbc->xfer_lock, flags);
  1305. if (list_empty(&dbc->xfer_list)) {
  1306. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1307. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1308. return;
  1309. }
  1310. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1311. head = readl(dbc->dbc_base + RSPHP_OFF);
  1312. if (head == U32_MAX) { /* PCI link error */
  1313. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1314. return;
  1315. }
  1316. tail = readl(dbc->dbc_base + RSPTP_OFF);
  1317. if (tail == U32_MAX) { /* PCI link error */
  1318. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1319. return;
  1320. }
  1321. if (head != tail) {
  1322. irq_wake_thread(dbc->irq, dbc);
  1323. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1324. return;
  1325. }
  1326. cond_resched();
  1327. usleep_range(datapath_poll_interval_us, 2 * datapath_poll_interval_us);
  1328. }
  1329. }
  1330. irqreturn_t dbc_irq_threaded_fn(int irq, void *data)
  1331. {
  1332. struct dma_bridge_chan *dbc = data;
  1333. int event_count = NUM_EVENTS;
  1334. int delay_count = NUM_DELAYS;
  1335. struct qaic_device *qdev;
  1336. struct qaic_bo *bo, *i;
  1337. struct dbc_rsp *rsp;
  1338. unsigned long flags;
  1339. int rcu_id;
  1340. u16 status;
  1341. u16 req_id;
  1342. u32 head;
  1343. u32 tail;
  1344. rcu_id = srcu_read_lock(&dbc->ch_lock);
  1345. qdev = dbc->qdev;
  1346. head = readl(dbc->dbc_base + RSPHP_OFF);
  1347. if (head == U32_MAX) /* PCI link error */
  1348. goto error_out;
  1349. read_fifo:
  1350. if (!event_count) {
  1351. event_count = NUM_EVENTS;
  1352. cond_resched();
  1353. }
  1354. /*
  1355. * if this channel isn't assigned or gets unassigned during processing
  1356. * we have nothing further to do
  1357. */
  1358. if (!dbc->usr)
  1359. goto error_out;
  1360. tail = readl(dbc->dbc_base + RSPTP_OFF);
  1361. if (tail == U32_MAX) /* PCI link error */
  1362. goto error_out;
  1363. if (head == tail) { /* queue empty */
  1364. if (delay_count) {
  1365. --delay_count;
  1366. usleep_range(100, 200);
  1367. goto read_fifo; /* check for a new event */
  1368. }
  1369. goto normal_out;
  1370. }
  1371. delay_count = NUM_DELAYS;
  1372. while (head != tail) {
  1373. if (!event_count)
  1374. break;
  1375. --event_count;
  1376. rsp = dbc->rsp_q_base + head * sizeof(*rsp);
  1377. req_id = le16_to_cpu(rsp->req_id);
  1378. status = le16_to_cpu(rsp->status);
  1379. if (status)
  1380. pci_dbg(qdev->pdev, "req_id %d failed with status %d\n", req_id, status);
  1381. spin_lock_irqsave(&dbc->xfer_lock, flags);
  1382. /*
  1383. * A BO can receive multiple interrupts, since a BO can be
  1384. * divided into multiple slices and a buffer receives as many
  1385. * interrupts as slices. So until it receives interrupts for
  1386. * all the slices we cannot mark that buffer complete.
  1387. */
  1388. list_for_each_entry_safe(bo, i, &dbc->xfer_list, xfer_list) {
  1389. if (bo->req_id == req_id)
  1390. bo->nr_slice_xfer_done++;
  1391. else
  1392. continue;
  1393. if (bo->nr_slice_xfer_done < bo->nr_slice)
  1394. break;
  1395. /*
  1396. * At this point we have received all the interrupts for
  1397. * BO, which means BO execution is complete.
  1398. */
  1399. dma_sync_sgtable_for_cpu(&qdev->pdev->dev, bo->sgt, bo->dir);
  1400. bo->nr_slice_xfer_done = 0;
  1401. list_del_init(&bo->xfer_list);
  1402. bo->perf_stats.req_processed_ts = ktime_get_ns();
  1403. complete_all(&bo->xfer_done);
  1404. drm_gem_object_put(&bo->base);
  1405. break;
  1406. }
  1407. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1408. head = (head + 1) % dbc->nelem;
  1409. }
  1410. /*
  1411. * Update the head pointer of response queue and let the device know
  1412. * that we have consumed elements from the queue.
  1413. */
  1414. writel(head, dbc->dbc_base + RSPHP_OFF);
  1415. /* elements might have been put in the queue while we were processing */
  1416. goto read_fifo;
  1417. normal_out:
  1418. if (!qdev->single_msi && likely(!datapath_polling))
  1419. enable_irq(irq);
  1420. else if (unlikely(datapath_polling))
  1421. schedule_work(&dbc->poll_work);
  1422. /* checking the fifo and enabling irqs is a race, missed event check */
  1423. tail = readl(dbc->dbc_base + RSPTP_OFF);
  1424. if (tail != U32_MAX && head != tail) {
  1425. if (!qdev->single_msi && likely(!datapath_polling))
  1426. disable_irq_nosync(irq);
  1427. goto read_fifo;
  1428. }
  1429. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1430. return IRQ_HANDLED;
  1431. error_out:
  1432. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1433. if (!qdev->single_msi && likely(!datapath_polling))
  1434. enable_irq(irq);
  1435. else if (unlikely(datapath_polling))
  1436. schedule_work(&dbc->poll_work);
  1437. return IRQ_HANDLED;
  1438. }
  1439. int qaic_wait_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1440. {
  1441. struct qaic_wait *args = data;
  1442. int usr_rcu_id, qdev_rcu_id;
  1443. struct dma_bridge_chan *dbc;
  1444. struct drm_gem_object *obj;
  1445. struct qaic_device *qdev;
  1446. unsigned long timeout;
  1447. struct qaic_user *usr;
  1448. struct qaic_bo *bo;
  1449. int rcu_id;
  1450. int ret;
  1451. if (args->pad != 0)
  1452. return -EINVAL;
  1453. usr = file_priv->driver_priv;
  1454. usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
  1455. if (!usr->qddev) {
  1456. ret = -ENODEV;
  1457. goto unlock_usr_srcu;
  1458. }
  1459. qdev = usr->qddev->qdev;
  1460. qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
  1461. if (qdev->dev_state != QAIC_ONLINE) {
  1462. ret = -ENODEV;
  1463. goto unlock_dev_srcu;
  1464. }
  1465. if (args->dbc_id >= qdev->num_dbc) {
  1466. ret = -EINVAL;
  1467. goto unlock_dev_srcu;
  1468. }
  1469. dbc = &qdev->dbc[args->dbc_id];
  1470. rcu_id = srcu_read_lock(&dbc->ch_lock);
  1471. if (dbc->usr != usr) {
  1472. ret = -EPERM;
  1473. goto unlock_ch_srcu;
  1474. }
  1475. obj = drm_gem_object_lookup(file_priv, args->handle);
  1476. if (!obj) {
  1477. ret = -ENOENT;
  1478. goto unlock_ch_srcu;
  1479. }
  1480. bo = to_qaic_bo(obj);
  1481. timeout = args->timeout ? args->timeout : wait_exec_default_timeout_ms;
  1482. timeout = msecs_to_jiffies(timeout);
  1483. ret = wait_for_completion_interruptible_timeout(&bo->xfer_done, timeout);
  1484. if (!ret) {
  1485. ret = -ETIMEDOUT;
  1486. goto put_obj;
  1487. }
  1488. if (ret > 0)
  1489. ret = 0;
  1490. if (!dbc->usr)
  1491. ret = -EPERM;
  1492. put_obj:
  1493. drm_gem_object_put(obj);
  1494. unlock_ch_srcu:
  1495. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1496. unlock_dev_srcu:
  1497. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  1498. unlock_usr_srcu:
  1499. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  1500. return ret;
  1501. }
  1502. int qaic_perf_stats_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1503. {
  1504. struct qaic_perf_stats_entry *ent = NULL;
  1505. struct qaic_perf_stats *args = data;
  1506. int usr_rcu_id, qdev_rcu_id;
  1507. struct drm_gem_object *obj;
  1508. struct qaic_device *qdev;
  1509. struct qaic_user *usr;
  1510. struct qaic_bo *bo;
  1511. int ret, i;
  1512. usr = file_priv->driver_priv;
  1513. usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
  1514. if (!usr->qddev) {
  1515. ret = -ENODEV;
  1516. goto unlock_usr_srcu;
  1517. }
  1518. qdev = usr->qddev->qdev;
  1519. qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
  1520. if (qdev->dev_state != QAIC_ONLINE) {
  1521. ret = -ENODEV;
  1522. goto unlock_dev_srcu;
  1523. }
  1524. if (args->hdr.dbc_id >= qdev->num_dbc) {
  1525. ret = -EINVAL;
  1526. goto unlock_dev_srcu;
  1527. }
  1528. ent = kcalloc(args->hdr.count, sizeof(*ent), GFP_KERNEL);
  1529. if (!ent) {
  1530. ret = -EINVAL;
  1531. goto unlock_dev_srcu;
  1532. }
  1533. ret = copy_from_user(ent, u64_to_user_ptr(args->data), args->hdr.count * sizeof(*ent));
  1534. if (ret) {
  1535. ret = -EFAULT;
  1536. goto free_ent;
  1537. }
  1538. for (i = 0; i < args->hdr.count; i++) {
  1539. obj = drm_gem_object_lookup(file_priv, ent[i].handle);
  1540. if (!obj) {
  1541. ret = -ENOENT;
  1542. goto free_ent;
  1543. }
  1544. bo = to_qaic_bo(obj);
  1545. /*
  1546. * perf stats ioctl is called before wait ioctl is complete then
  1547. * the latency information is invalid.
  1548. */
  1549. if (bo->perf_stats.req_processed_ts < bo->perf_stats.req_submit_ts) {
  1550. ent[i].device_latency_us = 0;
  1551. } else {
  1552. ent[i].device_latency_us = div_u64((bo->perf_stats.req_processed_ts -
  1553. bo->perf_stats.req_submit_ts), 1000);
  1554. }
  1555. ent[i].submit_latency_us = div_u64((bo->perf_stats.req_submit_ts -
  1556. bo->perf_stats.req_received_ts), 1000);
  1557. ent[i].queue_level_before = bo->perf_stats.queue_level_before;
  1558. ent[i].num_queue_element = bo->total_slice_nents;
  1559. drm_gem_object_put(obj);
  1560. }
  1561. if (copy_to_user(u64_to_user_ptr(args->data), ent, args->hdr.count * sizeof(*ent)))
  1562. ret = -EFAULT;
  1563. free_ent:
  1564. kfree(ent);
  1565. unlock_dev_srcu:
  1566. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  1567. unlock_usr_srcu:
  1568. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  1569. return ret;
  1570. }
  1571. static void detach_slice_bo(struct qaic_device *qdev, struct qaic_bo *bo)
  1572. {
  1573. qaic_free_slices_bo(bo);
  1574. qaic_unprepare_bo(qdev, bo);
  1575. qaic_init_bo(bo, true);
  1576. list_del(&bo->bo_list);
  1577. drm_gem_object_put(&bo->base);
  1578. }
  1579. int qaic_detach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1580. {
  1581. struct qaic_detach_slice *args = data;
  1582. int rcu_id, usr_rcu_id, qdev_rcu_id;
  1583. struct dma_bridge_chan *dbc;
  1584. struct drm_gem_object *obj;
  1585. struct qaic_device *qdev;
  1586. struct qaic_user *usr;
  1587. unsigned long flags;
  1588. struct qaic_bo *bo;
  1589. int ret;
  1590. if (args->pad != 0)
  1591. return -EINVAL;
  1592. usr = file_priv->driver_priv;
  1593. usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
  1594. if (!usr->qddev) {
  1595. ret = -ENODEV;
  1596. goto unlock_usr_srcu;
  1597. }
  1598. qdev = usr->qddev->qdev;
  1599. qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
  1600. if (qdev->dev_state != QAIC_ONLINE) {
  1601. ret = -ENODEV;
  1602. goto unlock_dev_srcu;
  1603. }
  1604. obj = drm_gem_object_lookup(file_priv, args->handle);
  1605. if (!obj) {
  1606. ret = -ENOENT;
  1607. goto unlock_dev_srcu;
  1608. }
  1609. bo = to_qaic_bo(obj);
  1610. ret = mutex_lock_interruptible(&bo->lock);
  1611. if (ret)
  1612. goto put_bo;
  1613. if (!bo->sliced) {
  1614. ret = -EINVAL;
  1615. goto unlock_bo;
  1616. }
  1617. dbc = bo->dbc;
  1618. rcu_id = srcu_read_lock(&dbc->ch_lock);
  1619. if (dbc->usr != usr) {
  1620. ret = -EINVAL;
  1621. goto unlock_ch_srcu;
  1622. }
  1623. /* Check if BO is committed to H/W for DMA */
  1624. spin_lock_irqsave(&dbc->xfer_lock, flags);
  1625. if (bo_queued(bo)) {
  1626. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1627. ret = -EBUSY;
  1628. goto unlock_ch_srcu;
  1629. }
  1630. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1631. detach_slice_bo(qdev, bo);
  1632. unlock_ch_srcu:
  1633. srcu_read_unlock(&dbc->ch_lock, rcu_id);
  1634. unlock_bo:
  1635. mutex_unlock(&bo->lock);
  1636. put_bo:
  1637. drm_gem_object_put(obj);
  1638. unlock_dev_srcu:
  1639. srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
  1640. unlock_usr_srcu:
  1641. srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
  1642. return ret;
  1643. }
  1644. static void empty_xfer_list(struct qaic_device *qdev, struct dma_bridge_chan *dbc)
  1645. {
  1646. unsigned long flags;
  1647. struct qaic_bo *bo;
  1648. spin_lock_irqsave(&dbc->xfer_lock, flags);
  1649. while (!list_empty(&dbc->xfer_list)) {
  1650. bo = list_first_entry(&dbc->xfer_list, typeof(*bo), xfer_list);
  1651. list_del_init(&bo->xfer_list);
  1652. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1653. bo->nr_slice_xfer_done = 0;
  1654. bo->req_id = 0;
  1655. bo->perf_stats.req_received_ts = 0;
  1656. bo->perf_stats.req_submit_ts = 0;
  1657. bo->perf_stats.req_processed_ts = 0;
  1658. bo->perf_stats.queue_level_before = 0;
  1659. dma_sync_sgtable_for_cpu(&qdev->pdev->dev, bo->sgt, bo->dir);
  1660. complete_all(&bo->xfer_done);
  1661. drm_gem_object_put(&bo->base);
  1662. spin_lock_irqsave(&dbc->xfer_lock, flags);
  1663. }
  1664. spin_unlock_irqrestore(&dbc->xfer_lock, flags);
  1665. }
  1666. int disable_dbc(struct qaic_device *qdev, u32 dbc_id, struct qaic_user *usr)
  1667. {
  1668. if (!qdev->dbc[dbc_id].usr || qdev->dbc[dbc_id].usr->handle != usr->handle)
  1669. return -EPERM;
  1670. qdev->dbc[dbc_id].usr = NULL;
  1671. synchronize_srcu(&qdev->dbc[dbc_id].ch_lock);
  1672. return 0;
  1673. }
  1674. /**
  1675. * enable_dbc - Enable the DBC. DBCs are disabled by removing the context of
  1676. * user. Add user context back to DBC to enable it. This function trusts the
  1677. * DBC ID passed and expects the DBC to be disabled.
  1678. * @qdev: Qranium device handle
  1679. * @dbc_id: ID of the DBC
  1680. * @usr: User context
  1681. */
  1682. void enable_dbc(struct qaic_device *qdev, u32 dbc_id, struct qaic_user *usr)
  1683. {
  1684. qdev->dbc[dbc_id].usr = usr;
  1685. }
  1686. void wakeup_dbc(struct qaic_device *qdev, u32 dbc_id)
  1687. {
  1688. struct dma_bridge_chan *dbc = &qdev->dbc[dbc_id];
  1689. dbc->usr = NULL;
  1690. empty_xfer_list(qdev, dbc);
  1691. synchronize_srcu(&dbc->ch_lock);
  1692. /*
  1693. * Threads holding channel lock, may add more elements in the xfer_list.
  1694. * Flush out these elements from xfer_list.
  1695. */
  1696. empty_xfer_list(qdev, dbc);
  1697. }
  1698. void release_dbc(struct qaic_device *qdev, u32 dbc_id)
  1699. {
  1700. struct qaic_bo *bo, *bo_temp;
  1701. struct dma_bridge_chan *dbc;
  1702. dbc = &qdev->dbc[dbc_id];
  1703. if (!dbc->in_use)
  1704. return;
  1705. wakeup_dbc(qdev, dbc_id);
  1706. dma_free_coherent(&qdev->pdev->dev, dbc->total_size, dbc->req_q_base, dbc->dma_addr);
  1707. dbc->total_size = 0;
  1708. dbc->req_q_base = NULL;
  1709. dbc->dma_addr = 0;
  1710. dbc->nelem = 0;
  1711. dbc->usr = NULL;
  1712. list_for_each_entry_safe(bo, bo_temp, &dbc->bo_lists, bo_list) {
  1713. drm_gem_object_get(&bo->base);
  1714. mutex_lock(&bo->lock);
  1715. detach_slice_bo(qdev, bo);
  1716. mutex_unlock(&bo->lock);
  1717. drm_gem_object_put(&bo->base);
  1718. }
  1719. dbc->in_use = false;
  1720. wake_up(&dbc->dbc_release);
  1721. }
  1722. void qaic_data_get_fifo_info(struct dma_bridge_chan *dbc, u32 *head, u32 *tail)
  1723. {
  1724. if (!dbc || !head || !tail)
  1725. return;
  1726. *head = readl(dbc->dbc_base + REQHP_OFF);
  1727. *tail = readl(dbc->dbc_base + REQTP_OFF);
  1728. }