mali_kbase_mem.c 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515
  1. /*
  2. *
  3. * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
  4. *
  5. * This program is free software and is provided to you under the terms of the
  6. * GNU General Public License version 2 as published by the Free Software
  7. * Foundation, and any use by you of this program is subject to the terms
  8. * of such GNU licence.
  9. *
  10. * A copy of the licence is included with the program, and can also be obtained
  11. * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  12. * Boston, MA 02110-1301, USA.
  13. *
  14. */
  15. /**
  16. * @file mali_kbase_mem.c
  17. * Base kernel memory APIs
  18. */
  19. #ifdef CONFIG_DMA_SHARED_BUFFER
  20. #include <linux/dma-buf.h>
  21. #endif /* CONFIG_DMA_SHARED_BUFFER */
  22. #ifdef CONFIG_UMP
  23. #include <linux/ump.h>
  24. #endif /* CONFIG_UMP */
  25. #include <linux/kernel.h>
  26. #include <linux/bug.h>
  27. #include <linux/compat.h>
  28. #include <mali_kbase_config.h>
  29. #include <mali_kbase.h>
  30. #include <mali_midg_regmap.h>
  31. #include <mali_kbase_cache_policy.h>
  32. #include <mali_kbase_hw.h>
  33. #include <mali_kbase_gator.h>
  34. #include <mali_kbase_hwaccess_time.h>
  35. #include <mali_kbase_tlstream.h>
  36. /**
  37. * @brief Check the zone compatibility of two regions.
  38. */
  39. static int kbase_region_tracker_match_zone(struct kbase_va_region *reg1,
  40. struct kbase_va_region *reg2)
  41. {
  42. return ((reg1->flags & KBASE_REG_ZONE_MASK) ==
  43. (reg2->flags & KBASE_REG_ZONE_MASK));
  44. }
  45. KBASE_EXPORT_TEST_API(kbase_region_tracker_match_zone);
  46. /* This function inserts a region into the tree. */
  47. static void kbase_region_tracker_insert(struct kbase_context *kctx, struct kbase_va_region *new_reg)
  48. {
  49. u64 start_pfn = new_reg->start_pfn;
  50. struct rb_node **link = &(kctx->reg_rbtree.rb_node);
  51. struct rb_node *parent = NULL;
  52. /* Find the right place in the tree using tree search */
  53. while (*link) {
  54. struct kbase_va_region *old_reg;
  55. parent = *link;
  56. old_reg = rb_entry(parent, struct kbase_va_region, rblink);
  57. /* RBTree requires no duplicate entries. */
  58. KBASE_DEBUG_ASSERT(old_reg->start_pfn != start_pfn);
  59. if (old_reg->start_pfn > start_pfn)
  60. link = &(*link)->rb_left;
  61. else
  62. link = &(*link)->rb_right;
  63. }
  64. /* Put the new node there, and rebalance tree */
  65. rb_link_node(&(new_reg->rblink), parent, link);
  66. rb_insert_color(&(new_reg->rblink), &(kctx->reg_rbtree));
  67. }
  68. /* Find allocated region enclosing free range. */
  69. static struct kbase_va_region *kbase_region_tracker_find_region_enclosing_range_free(
  70. struct kbase_context *kctx, u64 start_pfn, size_t nr_pages)
  71. {
  72. struct rb_node *rbnode;
  73. struct kbase_va_region *reg;
  74. u64 end_pfn = start_pfn + nr_pages;
  75. rbnode = kctx->reg_rbtree.rb_node;
  76. while (rbnode) {
  77. u64 tmp_start_pfn, tmp_end_pfn;
  78. reg = rb_entry(rbnode, struct kbase_va_region, rblink);
  79. tmp_start_pfn = reg->start_pfn;
  80. tmp_end_pfn = reg->start_pfn + reg->nr_pages;
  81. /* If start is lower than this, go left. */
  82. if (start_pfn < tmp_start_pfn)
  83. rbnode = rbnode->rb_left;
  84. /* If end is higher than this, then go right. */
  85. else if (end_pfn > tmp_end_pfn)
  86. rbnode = rbnode->rb_right;
  87. else /* Enclosing */
  88. return reg;
  89. }
  90. return NULL;
  91. }
  92. /* Find region enclosing given address. */
  93. struct kbase_va_region *kbase_region_tracker_find_region_enclosing_address(struct kbase_context *kctx, u64 gpu_addr)
  94. {
  95. struct rb_node *rbnode;
  96. struct kbase_va_region *reg;
  97. u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
  98. KBASE_DEBUG_ASSERT(NULL != kctx);
  99. lockdep_assert_held(&kctx->reg_lock);
  100. rbnode = kctx->reg_rbtree.rb_node;
  101. while (rbnode) {
  102. u64 tmp_start_pfn, tmp_end_pfn;
  103. reg = rb_entry(rbnode, struct kbase_va_region, rblink);
  104. tmp_start_pfn = reg->start_pfn;
  105. tmp_end_pfn = reg->start_pfn + reg->nr_pages;
  106. /* If start is lower than this, go left. */
  107. if (gpu_pfn < tmp_start_pfn)
  108. rbnode = rbnode->rb_left;
  109. /* If end is higher than this, then go right. */
  110. else if (gpu_pfn >= tmp_end_pfn)
  111. rbnode = rbnode->rb_right;
  112. else /* Enclosing */
  113. return reg;
  114. }
  115. return NULL;
  116. }
  117. KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_enclosing_address);
  118. /* Find region with given base address */
  119. struct kbase_va_region *kbase_region_tracker_find_region_base_address(struct kbase_context *kctx, u64 gpu_addr)
  120. {
  121. u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
  122. struct rb_node *rbnode;
  123. struct kbase_va_region *reg;
  124. KBASE_DEBUG_ASSERT(NULL != kctx);
  125. lockdep_assert_held(&kctx->reg_lock);
  126. rbnode = kctx->reg_rbtree.rb_node;
  127. while (rbnode) {
  128. reg = rb_entry(rbnode, struct kbase_va_region, rblink);
  129. if (reg->start_pfn > gpu_pfn)
  130. rbnode = rbnode->rb_left;
  131. else if (reg->start_pfn < gpu_pfn)
  132. rbnode = rbnode->rb_right;
  133. else
  134. return reg;
  135. }
  136. return NULL;
  137. }
  138. KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_base_address);
  139. /* Find region meeting given requirements */
  140. static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(struct kbase_context *kctx, struct kbase_va_region *reg_reqs, size_t nr_pages, size_t align)
  141. {
  142. struct rb_node *rbnode;
  143. struct kbase_va_region *reg;
  144. /* Note that this search is a linear search, as we do not have a target
  145. address in mind, so does not benefit from the rbtree search */
  146. rbnode = rb_first(&(kctx->reg_rbtree));
  147. while (rbnode) {
  148. reg = rb_entry(rbnode, struct kbase_va_region, rblink);
  149. if ((reg->nr_pages >= nr_pages) &&
  150. (reg->flags & KBASE_REG_FREE) &&
  151. kbase_region_tracker_match_zone(reg, reg_reqs)) {
  152. /* Check alignment */
  153. u64 start_pfn = (reg->start_pfn + align - 1) & ~(align - 1);
  154. if ((start_pfn >= reg->start_pfn) &&
  155. (start_pfn <= (reg->start_pfn + reg->nr_pages - 1)) &&
  156. ((start_pfn + nr_pages - 1) <= (reg->start_pfn + reg->nr_pages - 1)))
  157. return reg;
  158. }
  159. rbnode = rb_next(rbnode);
  160. }
  161. return NULL;
  162. }
  163. /**
  164. * @brief Remove a region object from the global list.
  165. *
  166. * The region reg is removed, possibly by merging with other free and
  167. * compatible adjacent regions. It must be called with the context
  168. * region lock held. The associated memory is not released (see
  169. * kbase_free_alloced_region). Internal use only.
  170. */
  171. static int kbase_remove_va_region(struct kbase_context *kctx, struct kbase_va_region *reg)
  172. {
  173. struct rb_node *rbprev;
  174. struct kbase_va_region *prev = NULL;
  175. struct rb_node *rbnext;
  176. struct kbase_va_region *next = NULL;
  177. int merged_front = 0;
  178. int merged_back = 0;
  179. int err = 0;
  180. /* Try to merge with the previous block first */
  181. rbprev = rb_prev(&(reg->rblink));
  182. if (rbprev) {
  183. prev = rb_entry(rbprev, struct kbase_va_region, rblink);
  184. if ((prev->flags & KBASE_REG_FREE) && kbase_region_tracker_match_zone(prev, reg)) {
  185. /* We're compatible with the previous VMA, merge with it */
  186. prev->nr_pages += reg->nr_pages;
  187. rb_erase(&(reg->rblink), &kctx->reg_rbtree);
  188. reg = prev;
  189. merged_front = 1;
  190. }
  191. }
  192. /* Try to merge with the next block second */
  193. /* Note we do the lookup here as the tree may have been rebalanced. */
  194. rbnext = rb_next(&(reg->rblink));
  195. if (rbnext) {
  196. /* We're compatible with the next VMA, merge with it */
  197. next = rb_entry(rbnext, struct kbase_va_region, rblink);
  198. if ((next->flags & KBASE_REG_FREE) && kbase_region_tracker_match_zone(next, reg)) {
  199. next->start_pfn = reg->start_pfn;
  200. next->nr_pages += reg->nr_pages;
  201. rb_erase(&(reg->rblink), &kctx->reg_rbtree);
  202. merged_back = 1;
  203. if (merged_front) {
  204. /* We already merged with prev, free it */
  205. kbase_free_alloced_region(reg);
  206. }
  207. }
  208. }
  209. /* If we failed to merge then we need to add a new block */
  210. if (!(merged_front || merged_back)) {
  211. /*
  212. * We didn't merge anything. Add a new free
  213. * placeholder and remove the original one.
  214. */
  215. struct kbase_va_region *free_reg;
  216. free_reg = kbase_alloc_free_region(kctx, reg->start_pfn, reg->nr_pages, reg->flags & KBASE_REG_ZONE_MASK);
  217. if (!free_reg) {
  218. err = -ENOMEM;
  219. goto out;
  220. }
  221. rb_replace_node(&(reg->rblink), &(free_reg->rblink), &(kctx->reg_rbtree));
  222. }
  223. out:
  224. return err;
  225. }
  226. KBASE_EXPORT_TEST_API(kbase_remove_va_region);
  227. /**
  228. * @brief Insert a VA region to the list, replacing the current at_reg.
  229. */
  230. static int kbase_insert_va_region_nolock(struct kbase_context *kctx, struct kbase_va_region *new_reg, struct kbase_va_region *at_reg, u64 start_pfn, size_t nr_pages)
  231. {
  232. int err = 0;
  233. /* Must be a free region */
  234. KBASE_DEBUG_ASSERT((at_reg->flags & KBASE_REG_FREE) != 0);
  235. /* start_pfn should be contained within at_reg */
  236. KBASE_DEBUG_ASSERT((start_pfn >= at_reg->start_pfn) && (start_pfn < at_reg->start_pfn + at_reg->nr_pages));
  237. /* at least nr_pages from start_pfn should be contained within at_reg */
  238. KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= at_reg->start_pfn + at_reg->nr_pages);
  239. new_reg->start_pfn = start_pfn;
  240. new_reg->nr_pages = nr_pages;
  241. /* Regions are a whole use, so swap and delete old one. */
  242. if (at_reg->start_pfn == start_pfn && at_reg->nr_pages == nr_pages) {
  243. rb_replace_node(&(at_reg->rblink), &(new_reg->rblink), &(kctx->reg_rbtree));
  244. kbase_free_alloced_region(at_reg);
  245. }
  246. /* New region replaces the start of the old one, so insert before. */
  247. else if (at_reg->start_pfn == start_pfn) {
  248. at_reg->start_pfn += nr_pages;
  249. KBASE_DEBUG_ASSERT(at_reg->nr_pages >= nr_pages);
  250. at_reg->nr_pages -= nr_pages;
  251. kbase_region_tracker_insert(kctx, new_reg);
  252. }
  253. /* New region replaces the end of the old one, so insert after. */
  254. else if ((at_reg->start_pfn + at_reg->nr_pages) == (start_pfn + nr_pages)) {
  255. at_reg->nr_pages -= nr_pages;
  256. kbase_region_tracker_insert(kctx, new_reg);
  257. }
  258. /* New region splits the old one, so insert and create new */
  259. else {
  260. struct kbase_va_region *new_front_reg;
  261. new_front_reg = kbase_alloc_free_region(kctx,
  262. at_reg->start_pfn,
  263. start_pfn - at_reg->start_pfn,
  264. at_reg->flags & KBASE_REG_ZONE_MASK);
  265. if (new_front_reg) {
  266. at_reg->nr_pages -= nr_pages + new_front_reg->nr_pages;
  267. at_reg->start_pfn = start_pfn + nr_pages;
  268. kbase_region_tracker_insert(kctx, new_front_reg);
  269. kbase_region_tracker_insert(kctx, new_reg);
  270. } else {
  271. err = -ENOMEM;
  272. }
  273. }
  274. return err;
  275. }
  276. /**
  277. * @brief Add a VA region to the list.
  278. */
  279. int kbase_add_va_region(struct kbase_context *kctx,
  280. struct kbase_va_region *reg, u64 addr,
  281. size_t nr_pages, size_t align)
  282. {
  283. struct kbase_va_region *tmp;
  284. u64 gpu_pfn = addr >> PAGE_SHIFT;
  285. int err = 0;
  286. KBASE_DEBUG_ASSERT(NULL != kctx);
  287. KBASE_DEBUG_ASSERT(NULL != reg);
  288. lockdep_assert_held(&kctx->reg_lock);
  289. if (!align)
  290. align = 1;
  291. /* must be a power of 2 */
  292. KBASE_DEBUG_ASSERT((align & (align - 1)) == 0);
  293. KBASE_DEBUG_ASSERT(nr_pages > 0);
  294. /* Path 1: Map a specific address. Find the enclosing region, which *must* be free. */
  295. if (gpu_pfn) {
  296. struct device *dev = kctx->kbdev->dev;
  297. KBASE_DEBUG_ASSERT(!(gpu_pfn & (align - 1)));
  298. tmp = kbase_region_tracker_find_region_enclosing_range_free(kctx, gpu_pfn, nr_pages);
  299. if (!tmp) {
  300. dev_warn(dev, "Enclosing region not found: 0x%08llx gpu_pfn, %zu nr_pages", gpu_pfn, nr_pages);
  301. err = -ENOMEM;
  302. goto exit;
  303. }
  304. if ((!kbase_region_tracker_match_zone(tmp, reg)) ||
  305. (!(tmp->flags & KBASE_REG_FREE))) {
  306. dev_warn(dev, "Zone mismatch: %lu != %lu", tmp->flags & KBASE_REG_ZONE_MASK, reg->flags & KBASE_REG_ZONE_MASK);
  307. dev_warn(dev, "!(tmp->flags & KBASE_REG_FREE): tmp->start_pfn=0x%llx tmp->flags=0x%lx tmp->nr_pages=0x%zx gpu_pfn=0x%llx nr_pages=0x%zx\n", tmp->start_pfn, tmp->flags, tmp->nr_pages, gpu_pfn, nr_pages);
  308. dev_warn(dev, "in function %s (%p, %p, 0x%llx, 0x%zx, 0x%zx)\n", __func__, kctx, reg, addr, nr_pages, align);
  309. err = -ENOMEM;
  310. goto exit;
  311. }
  312. err = kbase_insert_va_region_nolock(kctx, reg, tmp, gpu_pfn, nr_pages);
  313. if (err) {
  314. dev_warn(dev, "Failed to insert va region");
  315. err = -ENOMEM;
  316. goto exit;
  317. }
  318. goto exit;
  319. }
  320. /* Path 2: Map any free address which meets the requirements. */
  321. {
  322. u64 start_pfn;
  323. /*
  324. * Depending on the zone the allocation request is for
  325. * we might need to retry it.
  326. */
  327. do {
  328. tmp = kbase_region_tracker_find_region_meeting_reqs(
  329. kctx, reg, nr_pages, align);
  330. if (tmp) {
  331. start_pfn = (tmp->start_pfn + align - 1) &
  332. ~(align - 1);
  333. err = kbase_insert_va_region_nolock(kctx, reg,
  334. tmp, start_pfn, nr_pages);
  335. break;
  336. }
  337. /*
  338. * If the allocation is not from the same zone as JIT
  339. * then don't retry, we're out of VA and there is
  340. * nothing which can be done about it.
  341. */
  342. if ((reg->flags & KBASE_REG_ZONE_MASK) !=
  343. KBASE_REG_ZONE_CUSTOM_VA)
  344. break;
  345. } while (kbase_jit_evict(kctx));
  346. if (!tmp)
  347. err = -ENOMEM;
  348. }
  349. exit:
  350. return err;
  351. }
  352. KBASE_EXPORT_TEST_API(kbase_add_va_region);
  353. /**
  354. * @brief Initialize the internal region tracker data structure.
  355. */
  356. static void kbase_region_tracker_ds_init(struct kbase_context *kctx,
  357. struct kbase_va_region *same_va_reg,
  358. struct kbase_va_region *exec_reg,
  359. struct kbase_va_region *custom_va_reg)
  360. {
  361. kctx->reg_rbtree = RB_ROOT;
  362. kbase_region_tracker_insert(kctx, same_va_reg);
  363. /* exec and custom_va_reg doesn't always exist */
  364. if (exec_reg && custom_va_reg) {
  365. kbase_region_tracker_insert(kctx, exec_reg);
  366. kbase_region_tracker_insert(kctx, custom_va_reg);
  367. }
  368. }
  369. void kbase_region_tracker_term(struct kbase_context *kctx)
  370. {
  371. struct rb_node *rbnode;
  372. struct kbase_va_region *reg;
  373. do {
  374. rbnode = rb_first(&(kctx->reg_rbtree));
  375. if (rbnode) {
  376. rb_erase(rbnode, &(kctx->reg_rbtree));
  377. reg = rb_entry(rbnode, struct kbase_va_region, rblink);
  378. kbase_free_alloced_region(reg);
  379. }
  380. } while (rbnode);
  381. }
  382. /**
  383. * Initialize the region tracker data structure.
  384. */
  385. int kbase_region_tracker_init(struct kbase_context *kctx)
  386. {
  387. struct kbase_va_region *same_va_reg;
  388. struct kbase_va_region *exec_reg = NULL;
  389. struct kbase_va_region *custom_va_reg = NULL;
  390. size_t same_va_bits = sizeof(void *) * BITS_PER_BYTE;
  391. u64 custom_va_size = KBASE_REG_ZONE_CUSTOM_VA_SIZE;
  392. u64 gpu_va_limit = (1ULL << kctx->kbdev->gpu_props.mmu.va_bits) >> PAGE_SHIFT;
  393. u64 same_va_pages;
  394. int err;
  395. /* Take the lock as kbase_free_alloced_region requires it */
  396. kbase_gpu_vm_lock(kctx);
  397. #if defined(CONFIG_ARM64)
  398. same_va_bits = VA_BITS;
  399. #elif defined(CONFIG_X86_64)
  400. same_va_bits = 47;
  401. #elif defined(CONFIG_64BIT)
  402. #error Unsupported 64-bit architecture
  403. #endif
  404. #ifdef CONFIG_64BIT
  405. if (kctx->is_compat)
  406. same_va_bits = 32;
  407. else if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA))
  408. same_va_bits = 33;
  409. #endif
  410. if (kctx->kbdev->gpu_props.mmu.va_bits < same_va_bits) {
  411. err = -EINVAL;
  412. goto fail_unlock;
  413. }
  414. same_va_pages = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1;
  415. /* all have SAME_VA */
  416. same_va_reg = kbase_alloc_free_region(kctx, 1,
  417. same_va_pages,
  418. KBASE_REG_ZONE_SAME_VA);
  419. if (!same_va_reg) {
  420. err = -ENOMEM;
  421. goto fail_unlock;
  422. }
  423. #ifdef CONFIG_64BIT
  424. /* 32-bit clients have exec and custom VA zones */
  425. if (kctx->is_compat) {
  426. #endif
  427. if (gpu_va_limit <= KBASE_REG_ZONE_CUSTOM_VA_BASE) {
  428. err = -EINVAL;
  429. goto fail_free_same_va;
  430. }
  431. /* If the current size of TMEM is out of range of the
  432. * virtual address space addressable by the MMU then
  433. * we should shrink it to fit
  434. */
  435. if ((KBASE_REG_ZONE_CUSTOM_VA_BASE + KBASE_REG_ZONE_CUSTOM_VA_SIZE) >= gpu_va_limit)
  436. custom_va_size = gpu_va_limit - KBASE_REG_ZONE_CUSTOM_VA_BASE;
  437. exec_reg = kbase_alloc_free_region(kctx,
  438. KBASE_REG_ZONE_EXEC_BASE,
  439. KBASE_REG_ZONE_EXEC_SIZE,
  440. KBASE_REG_ZONE_EXEC);
  441. if (!exec_reg) {
  442. err = -ENOMEM;
  443. goto fail_free_same_va;
  444. }
  445. custom_va_reg = kbase_alloc_free_region(kctx,
  446. KBASE_REG_ZONE_CUSTOM_VA_BASE,
  447. custom_va_size, KBASE_REG_ZONE_CUSTOM_VA);
  448. if (!custom_va_reg) {
  449. err = -ENOMEM;
  450. goto fail_free_exec;
  451. }
  452. #ifdef CONFIG_64BIT
  453. }
  454. #endif
  455. kbase_region_tracker_ds_init(kctx, same_va_reg, exec_reg, custom_va_reg);
  456. kctx->same_va_end = same_va_pages + 1;
  457. kbase_gpu_vm_unlock(kctx);
  458. return 0;
  459. fail_free_exec:
  460. kbase_free_alloced_region(exec_reg);
  461. fail_free_same_va:
  462. kbase_free_alloced_region(same_va_reg);
  463. fail_unlock:
  464. kbase_gpu_vm_unlock(kctx);
  465. return err;
  466. }
  467. int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages)
  468. {
  469. #ifdef CONFIG_64BIT
  470. struct kbase_va_region *same_va;
  471. struct kbase_va_region *custom_va_reg;
  472. u64 same_va_bits;
  473. u64 total_va_size;
  474. int err;
  475. /*
  476. * Nothing to do for 32-bit clients, JIT uses the existing
  477. * custom VA zone.
  478. */
  479. if (kctx->is_compat)
  480. return 0;
  481. #if defined(CONFIG_ARM64)
  482. same_va_bits = VA_BITS;
  483. #elif defined(CONFIG_X86_64)
  484. same_va_bits = 47;
  485. #elif defined(CONFIG_64BIT)
  486. #error Unsupported 64-bit architecture
  487. #endif
  488. if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA))
  489. same_va_bits = 33;
  490. total_va_size = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1;
  491. kbase_gpu_vm_lock(kctx);
  492. /*
  493. * Modify the same VA free region after creation. Be careful to ensure
  494. * that allocations haven't been made as they could cause an overlap
  495. * to happen with existing same VA allocations and the custom VA zone.
  496. */
  497. same_va = kbase_region_tracker_find_region_base_address(kctx,
  498. PAGE_SIZE);
  499. if (!same_va) {
  500. err = -ENOMEM;
  501. goto fail_unlock;
  502. }
  503. /* The region flag or region size has changed since creation so bail. */
  504. if ((!(same_va->flags & KBASE_REG_FREE)) ||
  505. (same_va->nr_pages != total_va_size)) {
  506. err = -ENOMEM;
  507. goto fail_unlock;
  508. }
  509. /* It's safe to adjust the same VA zone now */
  510. same_va->nr_pages -= jit_va_pages;
  511. kctx->same_va_end -= jit_va_pages;
  512. /*
  513. * Create a custom VA zone at the end of the VA for allocations which
  514. * JIT can use so it doesn't have to allocate VA from the kernel.
  515. */
  516. custom_va_reg = kbase_alloc_free_region(kctx,
  517. kctx->same_va_end,
  518. jit_va_pages,
  519. KBASE_REG_ZONE_CUSTOM_VA);
  520. if (!custom_va_reg) {
  521. /*
  522. * The context will be destroyed if we fail here so no point
  523. * reverting the change we made to same_va.
  524. */
  525. err = -ENOMEM;
  526. goto fail_unlock;
  527. }
  528. kbase_region_tracker_insert(kctx, custom_va_reg);
  529. kbase_gpu_vm_unlock(kctx);
  530. return 0;
  531. fail_unlock:
  532. kbase_gpu_vm_unlock(kctx);
  533. return err;
  534. #else
  535. return 0;
  536. #endif
  537. }
  538. int kbase_mem_init(struct kbase_device *kbdev)
  539. {
  540. struct kbasep_mem_device *memdev;
  541. KBASE_DEBUG_ASSERT(kbdev);
  542. memdev = &kbdev->memdev;
  543. kbdev->mem_pool_max_size_default = KBASE_MEM_POOL_MAX_SIZE_KCTX;
  544. /* Initialize memory usage */
  545. atomic_set(&memdev->used_pages, 0);
  546. return kbase_mem_pool_init(&kbdev->mem_pool,
  547. KBASE_MEM_POOL_MAX_SIZE_KBDEV, kbdev, NULL);
  548. }
  549. void kbase_mem_halt(struct kbase_device *kbdev)
  550. {
  551. CSTD_UNUSED(kbdev);
  552. }
  553. void kbase_mem_term(struct kbase_device *kbdev)
  554. {
  555. struct kbasep_mem_device *memdev;
  556. int pages;
  557. KBASE_DEBUG_ASSERT(kbdev);
  558. memdev = &kbdev->memdev;
  559. pages = atomic_read(&memdev->used_pages);
  560. if (pages != 0)
  561. dev_warn(kbdev->dev, "%s: %d pages in use!\n", __func__, pages);
  562. kbase_mem_pool_term(&kbdev->mem_pool);
  563. }
  564. KBASE_EXPORT_TEST_API(kbase_mem_term);
  565. /**
  566. * @brief Allocate a free region object.
  567. *
  568. * The allocated object is not part of any list yet, and is flagged as
  569. * KBASE_REG_FREE. No mapping is allocated yet.
  570. *
  571. * zone is KBASE_REG_ZONE_CUSTOM_VA, KBASE_REG_ZONE_SAME_VA, or KBASE_REG_ZONE_EXEC
  572. *
  573. */
  574. struct kbase_va_region *kbase_alloc_free_region(struct kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone)
  575. {
  576. struct kbase_va_region *new_reg;
  577. KBASE_DEBUG_ASSERT(kctx != NULL);
  578. /* zone argument should only contain zone related region flags */
  579. KBASE_DEBUG_ASSERT((zone & ~KBASE_REG_ZONE_MASK) == 0);
  580. KBASE_DEBUG_ASSERT(nr_pages > 0);
  581. /* 64-bit address range is the max */
  582. KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= (U64_MAX / PAGE_SIZE));
  583. new_reg = kzalloc(sizeof(*new_reg), GFP_KERNEL);
  584. if (!new_reg)
  585. return NULL;
  586. new_reg->cpu_alloc = NULL; /* no alloc bound yet */
  587. new_reg->gpu_alloc = NULL; /* no alloc bound yet */
  588. new_reg->kctx = kctx;
  589. new_reg->flags = zone | KBASE_REG_FREE;
  590. new_reg->flags |= KBASE_REG_GROWABLE;
  591. new_reg->start_pfn = start_pfn;
  592. new_reg->nr_pages = nr_pages;
  593. return new_reg;
  594. }
  595. KBASE_EXPORT_TEST_API(kbase_alloc_free_region);
  596. /**
  597. * @brief Free a region object.
  598. *
  599. * The described region must be freed of any mapping.
  600. *
  601. * If the region is not flagged as KBASE_REG_FREE, the region's
  602. * alloc object will be released.
  603. * It is a bug if no alloc object exists for non-free regions.
  604. *
  605. */
  606. void kbase_free_alloced_region(struct kbase_va_region *reg)
  607. {
  608. if (!(reg->flags & KBASE_REG_FREE)) {
  609. /*
  610. * The physical allocation should have been removed from the
  611. * eviction list before this function is called. However, in the
  612. * case of abnormal process termination or the app leaking the
  613. * memory kbase_mem_free_region is not called so it can still be
  614. * on the list at termination time of the region tracker.
  615. */
  616. if (!list_empty(&reg->gpu_alloc->evict_node)) {
  617. /*
  618. * Unlink the physical allocation before unmaking it
  619. * evictable so that the allocation isn't grown back to
  620. * its last backed size as we're going to unmap it
  621. * anyway.
  622. */
  623. reg->cpu_alloc->reg = NULL;
  624. if (reg->cpu_alloc != reg->gpu_alloc)
  625. reg->gpu_alloc->reg = NULL;
  626. /*
  627. * If a region has been made evictable then we must
  628. * unmake it before trying to free it.
  629. * If the memory hasn't been reclaimed it will be
  630. * unmapped and freed below, if it has been reclaimed
  631. * then the operations below are no-ops.
  632. */
  633. if (reg->flags & KBASE_REG_DONT_NEED) {
  634. KBASE_DEBUG_ASSERT(reg->cpu_alloc->type ==
  635. KBASE_MEM_TYPE_NATIVE);
  636. kbase_mem_evictable_unmake(reg->gpu_alloc);
  637. }
  638. }
  639. /*
  640. * Remove the region from the sticky resource metadata
  641. * list should it be there.
  642. */
  643. kbase_sticky_resource_release(reg->kctx, NULL,
  644. reg->start_pfn << PAGE_SHIFT);
  645. kbase_mem_phy_alloc_put(reg->cpu_alloc);
  646. kbase_mem_phy_alloc_put(reg->gpu_alloc);
  647. /* To detect use-after-free in debug builds */
  648. KBASE_DEBUG_CODE(reg->flags |= KBASE_REG_FREE);
  649. }
  650. kfree(reg);
  651. }
  652. KBASE_EXPORT_TEST_API(kbase_free_alloced_region);
  653. void kbase_mmu_update(struct kbase_context *kctx)
  654. {
  655. KBASE_DEBUG_ASSERT(NULL != kctx);
  656. lockdep_assert_held(&kctx->kbdev->js_data.runpool_irq.lock);
  657. /* ASSERT that the context has a valid as_nr, which is only the case
  658. * when it's scheduled in.
  659. *
  660. * as_nr won't change because the caller has the runpool_irq lock */
  661. KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
  662. lockdep_assert_held(&kctx->kbdev->as[kctx->as_nr].transaction_mutex);
  663. kctx->kbdev->mmu_mode->update(kctx);
  664. }
  665. KBASE_EXPORT_TEST_API(kbase_mmu_update);
  666. void kbase_mmu_disable(struct kbase_context *kctx)
  667. {
  668. KBASE_DEBUG_ASSERT(NULL != kctx);
  669. /* ASSERT that the context has a valid as_nr, which is only the case
  670. * when it's scheduled in.
  671. *
  672. * as_nr won't change because the caller has the runpool_irq lock */
  673. KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
  674. kctx->kbdev->mmu_mode->disable_as(kctx->kbdev, kctx->as_nr);
  675. }
  676. KBASE_EXPORT_TEST_API(kbase_mmu_disable);
  677. void kbase_mmu_disable_as(struct kbase_device *kbdev, int as_nr)
  678. {
  679. kbdev->mmu_mode->disable_as(kbdev, as_nr);
  680. }
  681. int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align)
  682. {
  683. int err;
  684. size_t i = 0;
  685. unsigned long attr;
  686. unsigned long mask = ~KBASE_REG_MEMATTR_MASK;
  687. if ((kctx->kbdev->system_coherency == COHERENCY_ACE) &&
  688. (reg->flags & KBASE_REG_SHARE_BOTH))
  689. attr = KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_OUTER_WA);
  690. else
  691. attr = KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_WRITE_ALLOC);
  692. KBASE_DEBUG_ASSERT(NULL != kctx);
  693. KBASE_DEBUG_ASSERT(NULL != reg);
  694. err = kbase_add_va_region(kctx, reg, addr, nr_pages, align);
  695. if (err)
  696. return err;
  697. if (reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
  698. u64 stride;
  699. struct kbase_mem_phy_alloc *alloc;
  700. alloc = reg->gpu_alloc;
  701. stride = alloc->imported.alias.stride;
  702. KBASE_DEBUG_ASSERT(alloc->imported.alias.aliased);
  703. for (i = 0; i < alloc->imported.alias.nents; i++) {
  704. if (alloc->imported.alias.aliased[i].alloc) {
  705. err = kbase_mmu_insert_pages(kctx,
  706. reg->start_pfn + (i * stride),
  707. alloc->imported.alias.aliased[i].alloc->pages + alloc->imported.alias.aliased[i].offset,
  708. alloc->imported.alias.aliased[i].length,
  709. reg->flags);
  710. if (err)
  711. goto bad_insert;
  712. kbase_mem_phy_alloc_gpu_mapped(alloc->imported.alias.aliased[i].alloc);
  713. } else {
  714. err = kbase_mmu_insert_single_page(kctx,
  715. reg->start_pfn + i * stride,
  716. page_to_phys(kctx->aliasing_sink_page),
  717. alloc->imported.alias.aliased[i].length,
  718. (reg->flags & mask) | attr);
  719. if (err)
  720. goto bad_insert;
  721. }
  722. }
  723. } else {
  724. err = kbase_mmu_insert_pages(kctx, reg->start_pfn,
  725. kbase_get_gpu_phy_pages(reg),
  726. kbase_reg_current_backed_size(reg),
  727. reg->flags);
  728. if (err)
  729. goto bad_insert;
  730. kbase_mem_phy_alloc_gpu_mapped(reg->gpu_alloc);
  731. }
  732. return err;
  733. bad_insert:
  734. if (reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
  735. u64 stride;
  736. stride = reg->gpu_alloc->imported.alias.stride;
  737. KBASE_DEBUG_ASSERT(reg->gpu_alloc->imported.alias.aliased);
  738. while (i--)
  739. if (reg->gpu_alloc->imported.alias.aliased[i].alloc) {
  740. kbase_mmu_teardown_pages(kctx, reg->start_pfn + (i * stride), reg->gpu_alloc->imported.alias.aliased[i].length);
  741. kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc->imported.alias.aliased[i].alloc);
  742. }
  743. }
  744. kbase_remove_va_region(kctx, reg);
  745. return err;
  746. }
  747. KBASE_EXPORT_TEST_API(kbase_gpu_mmap);
  748. int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg)
  749. {
  750. int err;
  751. if (reg->start_pfn == 0)
  752. return 0;
  753. if (reg->gpu_alloc && reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
  754. size_t i;
  755. err = kbase_mmu_teardown_pages(kctx, reg->start_pfn, reg->nr_pages);
  756. KBASE_DEBUG_ASSERT(reg->gpu_alloc->imported.alias.aliased);
  757. for (i = 0; i < reg->gpu_alloc->imported.alias.nents; i++)
  758. if (reg->gpu_alloc->imported.alias.aliased[i].alloc)
  759. kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc->imported.alias.aliased[i].alloc);
  760. } else {
  761. err = kbase_mmu_teardown_pages(kctx, reg->start_pfn, kbase_reg_current_backed_size(reg));
  762. kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc);
  763. }
  764. if (err)
  765. return err;
  766. err = kbase_remove_va_region(kctx, reg);
  767. return err;
  768. }
  769. static struct kbase_cpu_mapping *kbasep_find_enclosing_cpu_mapping_of_region(const struct kbase_va_region *reg, unsigned long uaddr, size_t size)
  770. {
  771. struct kbase_cpu_mapping *map;
  772. struct list_head *pos;
  773. KBASE_DEBUG_ASSERT(NULL != reg);
  774. KBASE_DEBUG_ASSERT(reg->cpu_alloc);
  775. if ((uintptr_t) uaddr + size < (uintptr_t) uaddr) /* overflow check */
  776. return NULL;
  777. list_for_each(pos, &reg->cpu_alloc->mappings) {
  778. map = list_entry(pos, struct kbase_cpu_mapping, mappings_list);
  779. if (map->vm_start <= uaddr && map->vm_end >= uaddr + size)
  780. return map;
  781. }
  782. return NULL;
  783. }
  784. KBASE_EXPORT_TEST_API(kbasep_find_enclosing_cpu_mapping_of_region);
  785. int kbasep_find_enclosing_cpu_mapping_offset(
  786. struct kbase_context *kctx, u64 gpu_addr,
  787. unsigned long uaddr, size_t size, u64 * offset)
  788. {
  789. struct kbase_cpu_mapping *map = NULL;
  790. const struct kbase_va_region *reg;
  791. int err = -EINVAL;
  792. KBASE_DEBUG_ASSERT(kctx != NULL);
  793. kbase_gpu_vm_lock(kctx);
  794. reg = kbase_region_tracker_find_region_enclosing_address(kctx, gpu_addr);
  795. if (reg && !(reg->flags & KBASE_REG_FREE)) {
  796. map = kbasep_find_enclosing_cpu_mapping_of_region(reg, uaddr,
  797. size);
  798. if (map) {
  799. *offset = (uaddr - PTR_TO_U64(map->vm_start)) +
  800. (map->page_off << PAGE_SHIFT);
  801. err = 0;
  802. }
  803. }
  804. kbase_gpu_vm_unlock(kctx);
  805. return err;
  806. }
  807. KBASE_EXPORT_TEST_API(kbasep_find_enclosing_cpu_mapping_offset);
  808. void kbase_sync_single(struct kbase_context *kctx,
  809. phys_addr_t cpu_pa, phys_addr_t gpu_pa,
  810. off_t offset, size_t size, enum kbase_sync_type sync_fn)
  811. {
  812. struct page *cpu_page;
  813. cpu_page = pfn_to_page(PFN_DOWN(cpu_pa));
  814. if (likely(cpu_pa == gpu_pa)) {
  815. dma_addr_t dma_addr;
  816. BUG_ON(!cpu_page);
  817. BUG_ON(offset + size > PAGE_SIZE);
  818. dma_addr = kbase_dma_addr(cpu_page) + offset;
  819. if (sync_fn == KBASE_SYNC_TO_CPU)
  820. dma_sync_single_for_cpu(kctx->kbdev->dev, dma_addr,
  821. size, DMA_BIDIRECTIONAL);
  822. else if (sync_fn == KBASE_SYNC_TO_DEVICE)
  823. dma_sync_single_for_device(kctx->kbdev->dev, dma_addr,
  824. size, DMA_BIDIRECTIONAL);
  825. } else {
  826. void *src = NULL;
  827. void *dst = NULL;
  828. struct page *gpu_page;
  829. if (WARN(!gpu_pa, "No GPU PA found for infinite cache op"))
  830. return;
  831. gpu_page = pfn_to_page(PFN_DOWN(gpu_pa));
  832. if (sync_fn == KBASE_SYNC_TO_DEVICE) {
  833. src = ((unsigned char *)kmap(cpu_page)) + offset;
  834. dst = ((unsigned char *)kmap(gpu_page)) + offset;
  835. } else if (sync_fn == KBASE_SYNC_TO_CPU) {
  836. dma_sync_single_for_cpu(kctx->kbdev->dev,
  837. kbase_dma_addr(gpu_page) + offset,
  838. size, DMA_BIDIRECTIONAL);
  839. src = ((unsigned char *)kmap(gpu_page)) + offset;
  840. dst = ((unsigned char *)kmap(cpu_page)) + offset;
  841. }
  842. memcpy(dst, src, size);
  843. kunmap(gpu_page);
  844. kunmap(cpu_page);
  845. if (sync_fn == KBASE_SYNC_TO_DEVICE)
  846. dma_sync_single_for_device(kctx->kbdev->dev,
  847. kbase_dma_addr(gpu_page) + offset,
  848. size, DMA_BIDIRECTIONAL);
  849. }
  850. }
  851. static int kbase_do_syncset(struct kbase_context *kctx,
  852. struct base_syncset *set, enum kbase_sync_type sync_fn)
  853. {
  854. int err = 0;
  855. struct basep_syncset *sset = &set->basep_sset;
  856. struct kbase_va_region *reg;
  857. struct kbase_cpu_mapping *map;
  858. unsigned long start;
  859. size_t size;
  860. phys_addr_t *cpu_pa;
  861. phys_addr_t *gpu_pa;
  862. u64 page_off, page_count;
  863. u64 i;
  864. off_t offset;
  865. kbase_os_mem_map_lock(kctx);
  866. kbase_gpu_vm_lock(kctx);
  867. /* find the region where the virtual address is contained */
  868. reg = kbase_region_tracker_find_region_enclosing_address(kctx,
  869. sset->mem_handle.basep.handle);
  870. if (!reg) {
  871. dev_warn(kctx->kbdev->dev, "Can't find region at VA 0x%016llX",
  872. sset->mem_handle.basep.handle);
  873. err = -EINVAL;
  874. goto out_unlock;
  875. }
  876. if (!(reg->flags & KBASE_REG_CPU_CACHED))
  877. goto out_unlock;
  878. start = (uintptr_t)sset->user_addr;
  879. size = (size_t)sset->size;
  880. map = kbasep_find_enclosing_cpu_mapping_of_region(reg, start, size);
  881. if (!map) {
  882. dev_warn(kctx->kbdev->dev, "Can't find CPU mapping 0x%016lX for VA 0x%016llX",
  883. start, sset->mem_handle.basep.handle);
  884. err = -EINVAL;
  885. goto out_unlock;
  886. }
  887. offset = start & (PAGE_SIZE - 1);
  888. page_off = map->page_off + ((start - map->vm_start) >> PAGE_SHIFT);
  889. page_count = (size + offset + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
  890. cpu_pa = kbase_get_cpu_phy_pages(reg);
  891. gpu_pa = kbase_get_gpu_phy_pages(reg);
  892. /* Sync first page */
  893. if (cpu_pa[page_off]) {
  894. size_t sz = MIN(((size_t) PAGE_SIZE - offset), size);
  895. kbase_sync_single(kctx, cpu_pa[page_off], gpu_pa[page_off],
  896. offset, sz, sync_fn);
  897. }
  898. /* Sync middle pages (if any) */
  899. for (i = 1; page_count > 2 && i < page_count - 1; i++) {
  900. /* we grow upwards, so bail on first non-present page */
  901. if (!cpu_pa[page_off + i])
  902. break;
  903. kbase_sync_single(kctx, cpu_pa[page_off + i],
  904. gpu_pa[page_off + i], 0, PAGE_SIZE, sync_fn);
  905. }
  906. /* Sync last page (if any) */
  907. if (page_count > 1 && cpu_pa[page_off + page_count - 1]) {
  908. size_t sz = ((start + size - 1) & ~PAGE_MASK) + 1;
  909. kbase_sync_single(kctx, cpu_pa[page_off + page_count - 1],
  910. gpu_pa[page_off + page_count - 1], 0, sz,
  911. sync_fn);
  912. }
  913. out_unlock:
  914. kbase_gpu_vm_unlock(kctx);
  915. kbase_os_mem_map_unlock(kctx);
  916. return err;
  917. }
  918. int kbase_sync_now(struct kbase_context *kctx, struct base_syncset *syncset)
  919. {
  920. int err = -EINVAL;
  921. struct basep_syncset *sset;
  922. KBASE_DEBUG_ASSERT(NULL != kctx);
  923. KBASE_DEBUG_ASSERT(NULL != syncset);
  924. sset = &syncset->basep_sset;
  925. switch (sset->type) {
  926. case BASE_SYNCSET_OP_MSYNC:
  927. err = kbase_do_syncset(kctx, syncset, KBASE_SYNC_TO_DEVICE);
  928. break;
  929. case BASE_SYNCSET_OP_CSYNC:
  930. err = kbase_do_syncset(kctx, syncset, KBASE_SYNC_TO_CPU);
  931. break;
  932. default:
  933. dev_warn(kctx->kbdev->dev, "Unknown msync op %d\n", sset->type);
  934. break;
  935. }
  936. return err;
  937. }
  938. KBASE_EXPORT_TEST_API(kbase_sync_now);
  939. /* vm lock must be held */
  940. int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *reg)
  941. {
  942. int err;
  943. KBASE_DEBUG_ASSERT(NULL != kctx);
  944. KBASE_DEBUG_ASSERT(NULL != reg);
  945. lockdep_assert_held(&kctx->reg_lock);
  946. /*
  947. * Unlink the physical allocation before unmaking it evictable so
  948. * that the allocation isn't grown back to its last backed size
  949. * as we're going to unmap it anyway.
  950. */
  951. reg->cpu_alloc->reg = NULL;
  952. if (reg->cpu_alloc != reg->gpu_alloc)
  953. reg->gpu_alloc->reg = NULL;
  954. /*
  955. * If a region has been made evictable then we must unmake it
  956. * before trying to free it.
  957. * If the memory hasn't been reclaimed it will be unmapped and freed
  958. * below, if it has been reclaimed then the operations below are no-ops.
  959. */
  960. if (reg->flags & KBASE_REG_DONT_NEED) {
  961. KBASE_DEBUG_ASSERT(reg->cpu_alloc->type ==
  962. KBASE_MEM_TYPE_NATIVE);
  963. kbase_mem_evictable_unmake(reg->gpu_alloc);
  964. }
  965. err = kbase_gpu_munmap(kctx, reg);
  966. if (err) {
  967. dev_warn(reg->kctx->kbdev->dev, "Could not unmap from the GPU...\n");
  968. goto out;
  969. }
  970. #ifndef CONFIG_MALI_NO_MALI
  971. if (kbase_hw_has_issue(kctx->kbdev, BASE_HW_ISSUE_6367)) {
  972. /* Wait for GPU to flush write buffer before freeing physical pages */
  973. kbase_wait_write_flush(kctx);
  974. }
  975. #endif
  976. /* This will also free the physical pages */
  977. kbase_free_alloced_region(reg);
  978. out:
  979. return err;
  980. }
  981. KBASE_EXPORT_TEST_API(kbase_mem_free_region);
  982. /**
  983. * @brief Free the region from the GPU and unregister it.
  984. *
  985. * This function implements the free operation on a memory segment.
  986. * It will loudly fail if called with outstanding mappings.
  987. */
  988. int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr)
  989. {
  990. int err = 0;
  991. struct kbase_va_region *reg;
  992. KBASE_DEBUG_ASSERT(kctx != NULL);
  993. if (0 == gpu_addr) {
  994. dev_warn(kctx->kbdev->dev, "gpu_addr 0 is reserved for the ringbuffer and it's an error to try to free it using kbase_mem_free\n");
  995. return -EINVAL;
  996. }
  997. kbase_gpu_vm_lock(kctx);
  998. if (gpu_addr >= BASE_MEM_COOKIE_BASE &&
  999. gpu_addr < BASE_MEM_FIRST_FREE_ADDRESS) {
  1000. int cookie = PFN_DOWN(gpu_addr - BASE_MEM_COOKIE_BASE);
  1001. reg = kctx->pending_regions[cookie];
  1002. if (!reg) {
  1003. err = -EINVAL;
  1004. goto out_unlock;
  1005. }
  1006. /* ask to unlink the cookie as we'll free it */
  1007. kctx->pending_regions[cookie] = NULL;
  1008. kctx->cookies |= (1UL << cookie);
  1009. kbase_free_alloced_region(reg);
  1010. } else {
  1011. /* A real GPU va */
  1012. /* Validate the region */
  1013. reg = kbase_region_tracker_find_region_base_address(kctx, gpu_addr);
  1014. if (!reg || (reg->flags & KBASE_REG_FREE)) {
  1015. dev_warn(kctx->kbdev->dev, "kbase_mem_free called with nonexistent gpu_addr 0x%llX",
  1016. gpu_addr);
  1017. err = -EINVAL;
  1018. goto out_unlock;
  1019. }
  1020. if ((reg->flags & KBASE_REG_ZONE_MASK) == KBASE_REG_ZONE_SAME_VA) {
  1021. /* SAME_VA must be freed through munmap */
  1022. dev_warn(kctx->kbdev->dev, "%s called on SAME_VA memory 0x%llX", __func__,
  1023. gpu_addr);
  1024. err = -EINVAL;
  1025. goto out_unlock;
  1026. }
  1027. err = kbase_mem_free_region(kctx, reg);
  1028. }
  1029. out_unlock:
  1030. kbase_gpu_vm_unlock(kctx);
  1031. return err;
  1032. }
  1033. KBASE_EXPORT_TEST_API(kbase_mem_free);
  1034. void kbase_update_region_flags(struct kbase_context *kctx,
  1035. struct kbase_va_region *reg, unsigned long flags)
  1036. {
  1037. KBASE_DEBUG_ASSERT(NULL != reg);
  1038. KBASE_DEBUG_ASSERT((flags & ~((1ul << BASE_MEM_FLAGS_NR_BITS) - 1)) == 0);
  1039. reg->flags |= kbase_cache_enabled(flags, reg->nr_pages);
  1040. /* all memory is now growable */
  1041. reg->flags |= KBASE_REG_GROWABLE;
  1042. if (flags & BASE_MEM_GROW_ON_GPF)
  1043. reg->flags |= KBASE_REG_PF_GROW;
  1044. if (flags & BASE_MEM_PROT_CPU_WR)
  1045. reg->flags |= KBASE_REG_CPU_WR;
  1046. if (flags & BASE_MEM_PROT_CPU_RD)
  1047. reg->flags |= KBASE_REG_CPU_RD;
  1048. if (flags & BASE_MEM_PROT_GPU_WR)
  1049. reg->flags |= KBASE_REG_GPU_WR;
  1050. if (flags & BASE_MEM_PROT_GPU_RD)
  1051. reg->flags |= KBASE_REG_GPU_RD;
  1052. if (0 == (flags & BASE_MEM_PROT_GPU_EX))
  1053. reg->flags |= KBASE_REG_GPU_NX;
  1054. if (flags & BASE_MEM_COHERENT_SYSTEM ||
  1055. flags & BASE_MEM_COHERENT_SYSTEM_REQUIRED)
  1056. reg->flags |= KBASE_REG_SHARE_BOTH;
  1057. else if (flags & BASE_MEM_COHERENT_LOCAL)
  1058. reg->flags |= KBASE_REG_SHARE_IN;
  1059. /* Set up default MEMATTR usage */
  1060. if (kctx->kbdev->system_coherency == COHERENCY_ACE &&
  1061. (reg->flags & KBASE_REG_SHARE_BOTH)) {
  1062. reg->flags |=
  1063. KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_DEFAULT_ACE);
  1064. } else {
  1065. reg->flags |=
  1066. KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_DEFAULT);
  1067. }
  1068. }
  1069. KBASE_EXPORT_TEST_API(kbase_update_region_flags);
  1070. int kbase_alloc_phy_pages_helper(
  1071. struct kbase_mem_phy_alloc *alloc,
  1072. size_t nr_pages_requested)
  1073. {
  1074. int new_page_count __maybe_unused;
  1075. size_t old_page_count = alloc->nents;
  1076. KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
  1077. KBASE_DEBUG_ASSERT(alloc->imported.kctx);
  1078. if (nr_pages_requested == 0)
  1079. goto done; /*nothing to do*/
  1080. new_page_count = kbase_atomic_add_pages(
  1081. nr_pages_requested, &alloc->imported.kctx->used_pages);
  1082. kbase_atomic_add_pages(nr_pages_requested, &alloc->imported.kctx->kbdev->memdev.used_pages);
  1083. /* Increase mm counters before we allocate pages so that this
  1084. * allocation is visible to the OOM killer */
  1085. kbase_process_page_usage_inc(alloc->imported.kctx, nr_pages_requested);
  1086. if (kbase_mem_pool_alloc_pages(&alloc->imported.kctx->mem_pool,
  1087. nr_pages_requested, alloc->pages + old_page_count) != 0)
  1088. goto no_alloc;
  1089. /*
  1090. * Request a zone cache update, this scans only the new pages an
  1091. * appends their information to the zone cache. if the update
  1092. * fails then clear the cache so we fall-back to doing things
  1093. * page by page.
  1094. */
  1095. if (kbase_zone_cache_update(alloc, old_page_count) != 0)
  1096. kbase_zone_cache_clear(alloc);
  1097. kbase_tlstream_aux_pagesalloc(
  1098. (u32)alloc->imported.kctx->id,
  1099. (u64)new_page_count);
  1100. alloc->nents += nr_pages_requested;
  1101. done:
  1102. return 0;
  1103. no_alloc:
  1104. kbase_process_page_usage_dec(alloc->imported.kctx, nr_pages_requested);
  1105. kbase_atomic_sub_pages(nr_pages_requested, &alloc->imported.kctx->used_pages);
  1106. kbase_atomic_sub_pages(nr_pages_requested, &alloc->imported.kctx->kbdev->memdev.used_pages);
  1107. return -ENOMEM;
  1108. }
  1109. int kbase_free_phy_pages_helper(
  1110. struct kbase_mem_phy_alloc *alloc,
  1111. size_t nr_pages_to_free)
  1112. {
  1113. struct kbase_context *kctx = alloc->imported.kctx;
  1114. bool syncback;
  1115. bool reclaimed = (alloc->evicted != 0);
  1116. phys_addr_t *start_free;
  1117. int new_page_count __maybe_unused;
  1118. KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
  1119. KBASE_DEBUG_ASSERT(alloc->imported.kctx);
  1120. KBASE_DEBUG_ASSERT(alloc->nents >= nr_pages_to_free);
  1121. /* early out if nothing to do */
  1122. if (0 == nr_pages_to_free)
  1123. return 0;
  1124. start_free = alloc->pages + alloc->nents - nr_pages_to_free;
  1125. syncback = alloc->properties & KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED;
  1126. /*
  1127. * Clear the zone cache, we don't expect JIT allocations to be
  1128. * shrunk in parts so there is no point trying to optimize for that
  1129. * by scanning for the changes caused by freeing this memory and
  1130. * updating the existing cache entries.
  1131. */
  1132. kbase_zone_cache_clear(alloc);
  1133. kbase_mem_pool_free_pages(&kctx->mem_pool,
  1134. nr_pages_to_free,
  1135. start_free,
  1136. syncback,
  1137. reclaimed);
  1138. alloc->nents -= nr_pages_to_free;
  1139. /*
  1140. * If the allocation was not evicted (i.e. evicted == 0) then
  1141. * the page accounting needs to be done.
  1142. */
  1143. if (!reclaimed) {
  1144. kbase_process_page_usage_dec(kctx, nr_pages_to_free);
  1145. new_page_count = kbase_atomic_sub_pages(nr_pages_to_free,
  1146. &kctx->used_pages);
  1147. kbase_atomic_sub_pages(nr_pages_to_free,
  1148. &kctx->kbdev->memdev.used_pages);
  1149. kbase_tlstream_aux_pagesalloc(
  1150. (u32)kctx->id,
  1151. (u64)new_page_count);
  1152. }
  1153. return 0;
  1154. }
  1155. void kbase_mem_kref_free(struct kref *kref)
  1156. {
  1157. struct kbase_mem_phy_alloc *alloc;
  1158. alloc = container_of(kref, struct kbase_mem_phy_alloc, kref);
  1159. switch (alloc->type) {
  1160. case KBASE_MEM_TYPE_NATIVE: {
  1161. WARN_ON(!alloc->imported.kctx);
  1162. /*
  1163. * The physical allocation must have been removed from the
  1164. * eviction list before trying to free it.
  1165. */
  1166. WARN_ON(!list_empty(&alloc->evict_node));
  1167. kbase_free_phy_pages_helper(alloc, alloc->nents);
  1168. break;
  1169. }
  1170. case KBASE_MEM_TYPE_ALIAS: {
  1171. /* just call put on the underlying phy allocs */
  1172. size_t i;
  1173. struct kbase_aliased *aliased;
  1174. aliased = alloc->imported.alias.aliased;
  1175. if (aliased) {
  1176. for (i = 0; i < alloc->imported.alias.nents; i++)
  1177. if (aliased[i].alloc)
  1178. kbase_mem_phy_alloc_put(aliased[i].alloc);
  1179. vfree(aliased);
  1180. }
  1181. break;
  1182. }
  1183. case KBASE_MEM_TYPE_RAW:
  1184. /* raw pages, external cleanup */
  1185. break;
  1186. #ifdef CONFIG_UMP
  1187. case KBASE_MEM_TYPE_IMPORTED_UMP:
  1188. ump_dd_release(alloc->imported.ump_handle);
  1189. break;
  1190. #endif
  1191. #ifdef CONFIG_DMA_SHARED_BUFFER
  1192. case KBASE_MEM_TYPE_IMPORTED_UMM:
  1193. dma_buf_detach(alloc->imported.umm.dma_buf,
  1194. alloc->imported.umm.dma_attachment);
  1195. dma_buf_put(alloc->imported.umm.dma_buf);
  1196. break;
  1197. #endif
  1198. case KBASE_MEM_TYPE_IMPORTED_USER_BUF:
  1199. if (alloc->imported.user_buf.mm)
  1200. mmdrop(alloc->imported.user_buf.mm);
  1201. kfree(alloc->imported.user_buf.pages);
  1202. break;
  1203. case KBASE_MEM_TYPE_TB:{
  1204. void *tb;
  1205. tb = alloc->imported.kctx->jctx.tb;
  1206. kbase_device_trace_buffer_uninstall(alloc->imported.kctx);
  1207. vfree(tb);
  1208. break;
  1209. }
  1210. default:
  1211. WARN(1, "Unexecpted free of type %d\n", alloc->type);
  1212. break;
  1213. }
  1214. /* Free based on allocation type */
  1215. if (alloc->properties & KBASE_MEM_PHY_ALLOC_LARGE)
  1216. vfree(alloc);
  1217. else
  1218. kfree(alloc);
  1219. }
  1220. KBASE_EXPORT_TEST_API(kbase_mem_kref_free);
  1221. int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size)
  1222. {
  1223. KBASE_DEBUG_ASSERT(NULL != reg);
  1224. KBASE_DEBUG_ASSERT(vsize > 0);
  1225. /* validate user provided arguments */
  1226. if (size > vsize || vsize > reg->nr_pages)
  1227. goto out_term;
  1228. /* Prevent vsize*sizeof from wrapping around.
  1229. * For instance, if vsize is 2**29+1, we'll allocate 1 byte and the alloc won't fail.
  1230. */
  1231. if ((size_t) vsize > ((size_t) -1 / sizeof(*reg->cpu_alloc->pages)))
  1232. goto out_term;
  1233. KBASE_DEBUG_ASSERT(0 != vsize);
  1234. if (kbase_alloc_phy_pages_helper(reg->cpu_alloc, size) != 0)
  1235. goto out_term;
  1236. reg->cpu_alloc->reg = reg;
  1237. if (reg->cpu_alloc != reg->gpu_alloc) {
  1238. if (kbase_alloc_phy_pages_helper(reg->gpu_alloc, size) != 0)
  1239. goto out_rollback;
  1240. reg->gpu_alloc->reg = reg;
  1241. }
  1242. return 0;
  1243. out_rollback:
  1244. kbase_free_phy_pages_helper(reg->cpu_alloc, size);
  1245. out_term:
  1246. return -1;
  1247. }
  1248. KBASE_EXPORT_TEST_API(kbase_alloc_phy_pages);
  1249. bool kbase_check_alloc_flags(unsigned long flags)
  1250. {
  1251. /* Only known input flags should be set. */
  1252. if (flags & ~BASE_MEM_FLAGS_INPUT_MASK)
  1253. return false;
  1254. /* At least one flag should be set */
  1255. if (flags == 0)
  1256. return false;
  1257. /* Either the GPU or CPU must be reading from the allocated memory */
  1258. if ((flags & (BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD)) == 0)
  1259. return false;
  1260. /* Either the GPU or CPU must be writing to the allocated memory */
  1261. if ((flags & (BASE_MEM_PROT_CPU_WR | BASE_MEM_PROT_GPU_WR)) == 0)
  1262. return false;
  1263. /* GPU cannot be writing to GPU executable memory and cannot grow the memory on page fault. */
  1264. if ((flags & BASE_MEM_PROT_GPU_EX) && (flags & (BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF)))
  1265. return false;
  1266. /* GPU should have at least read or write access otherwise there is no
  1267. reason for allocating. */
  1268. if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
  1269. return false;
  1270. /* BASE_MEM_IMPORT_SHARED is only valid for imported memory */
  1271. if ((flags & BASE_MEM_IMPORT_SHARED) == BASE_MEM_IMPORT_SHARED)
  1272. return false;
  1273. return true;
  1274. }
  1275. bool kbase_check_import_flags(unsigned long flags)
  1276. {
  1277. /* Only known input flags should be set. */
  1278. if (flags & ~BASE_MEM_FLAGS_INPUT_MASK)
  1279. return false;
  1280. /* At least one flag should be set */
  1281. if (flags == 0)
  1282. return false;
  1283. /* Imported memory cannot be GPU executable */
  1284. if (flags & BASE_MEM_PROT_GPU_EX)
  1285. return false;
  1286. /* Imported memory cannot grow on page fault */
  1287. if (flags & BASE_MEM_GROW_ON_GPF)
  1288. return false;
  1289. /* GPU should have at least read or write access otherwise there is no
  1290. reason for importing. */
  1291. if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
  1292. return false;
  1293. /* Secure memory cannot be read by the CPU */
  1294. if ((flags & BASE_MEM_SECURE) && (flags & BASE_MEM_PROT_CPU_RD))
  1295. return false;
  1296. return true;
  1297. }
  1298. /**
  1299. * @brief Acquire the per-context region list lock
  1300. */
  1301. void kbase_gpu_vm_lock(struct kbase_context *kctx)
  1302. {
  1303. KBASE_DEBUG_ASSERT(kctx != NULL);
  1304. mutex_lock(&kctx->reg_lock);
  1305. }
  1306. KBASE_EXPORT_TEST_API(kbase_gpu_vm_lock);
  1307. /**
  1308. * @brief Release the per-context region list lock
  1309. */
  1310. void kbase_gpu_vm_unlock(struct kbase_context *kctx)
  1311. {
  1312. KBASE_DEBUG_ASSERT(kctx != NULL);
  1313. mutex_unlock(&kctx->reg_lock);
  1314. }
  1315. KBASE_EXPORT_TEST_API(kbase_gpu_vm_unlock);
  1316. struct kbase_jit_debugfs_data {
  1317. int (*func)(struct kbase_jit_debugfs_data *);
  1318. struct mutex lock;
  1319. struct kbase_context *kctx;
  1320. u64 active_value;
  1321. u64 pool_value;
  1322. u64 destroy_value;
  1323. char buffer[50];
  1324. };
  1325. static int kbase_jit_debugfs_common_open(struct inode *inode,
  1326. struct file *file, int (*func)(struct kbase_jit_debugfs_data *))
  1327. {
  1328. struct kbase_jit_debugfs_data *data;
  1329. data = kzalloc(sizeof(*data), GFP_KERNEL);
  1330. if (!data)
  1331. return -ENOMEM;
  1332. data->func = func;
  1333. mutex_init(&data->lock);
  1334. data->kctx = (struct kbase_context *) inode->i_private;
  1335. file->private_data = data;
  1336. return nonseekable_open(inode, file);
  1337. }
  1338. static ssize_t kbase_jit_debugfs_common_read(struct file *file,
  1339. char __user *buf, size_t len, loff_t *ppos)
  1340. {
  1341. struct kbase_jit_debugfs_data *data;
  1342. size_t size;
  1343. int ret;
  1344. data = (struct kbase_jit_debugfs_data *) file->private_data;
  1345. mutex_lock(&data->lock);
  1346. if (*ppos) {
  1347. size = strnlen(data->buffer, sizeof(data->buffer));
  1348. } else {
  1349. if (!data->func) {
  1350. ret = -EACCES;
  1351. goto out_unlock;
  1352. }
  1353. if (data->func(data)) {
  1354. ret = -EACCES;
  1355. goto out_unlock;
  1356. }
  1357. size = scnprintf(data->buffer, sizeof(data->buffer),
  1358. "%llu,%llu,%llu", data->active_value,
  1359. data->pool_value, data->destroy_value);
  1360. }
  1361. ret = simple_read_from_buffer(buf, len, ppos, data->buffer, size);
  1362. out_unlock:
  1363. mutex_unlock(&data->lock);
  1364. return ret;
  1365. }
  1366. static int kbase_jit_debugfs_common_release(struct inode *inode,
  1367. struct file *file)
  1368. {
  1369. kfree(file->private_data);
  1370. return 0;
  1371. }
  1372. #define KBASE_JIT_DEBUGFS_DECLARE(__fops, __func) \
  1373. static int __fops ## _open(struct inode *inode, struct file *file) \
  1374. { \
  1375. return kbase_jit_debugfs_common_open(inode, file, __func); \
  1376. } \
  1377. static const struct file_operations __fops = { \
  1378. .owner = THIS_MODULE, \
  1379. .open = __fops ## _open, \
  1380. .release = kbase_jit_debugfs_common_release, \
  1381. .read = kbase_jit_debugfs_common_read, \
  1382. .write = NULL, \
  1383. .llseek = generic_file_llseek, \
  1384. }
  1385. static int kbase_jit_debugfs_count_get(struct kbase_jit_debugfs_data *data)
  1386. {
  1387. struct kbase_context *kctx = data->kctx;
  1388. struct list_head *tmp;
  1389. mutex_lock(&kctx->jit_lock);
  1390. list_for_each(tmp, &kctx->jit_active_head) {
  1391. data->active_value++;
  1392. }
  1393. list_for_each(tmp, &kctx->jit_pool_head) {
  1394. data->pool_value++;
  1395. }
  1396. list_for_each(tmp, &kctx->jit_destroy_head) {
  1397. data->destroy_value++;
  1398. }
  1399. mutex_unlock(&kctx->jit_lock);
  1400. return 0;
  1401. }
  1402. KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_count_fops,
  1403. kbase_jit_debugfs_count_get);
  1404. static int kbase_jit_debugfs_vm_get(struct kbase_jit_debugfs_data *data)
  1405. {
  1406. struct kbase_context *kctx = data->kctx;
  1407. struct kbase_va_region *reg;
  1408. mutex_lock(&kctx->jit_lock);
  1409. list_for_each_entry(reg, &kctx->jit_active_head, jit_node) {
  1410. data->active_value += reg->nr_pages;
  1411. }
  1412. list_for_each_entry(reg, &kctx->jit_pool_head, jit_node) {
  1413. data->pool_value += reg->nr_pages;
  1414. }
  1415. list_for_each_entry(reg, &kctx->jit_destroy_head, jit_node) {
  1416. data->destroy_value += reg->nr_pages;
  1417. }
  1418. mutex_unlock(&kctx->jit_lock);
  1419. return 0;
  1420. }
  1421. KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_vm_fops,
  1422. kbase_jit_debugfs_vm_get);
  1423. static int kbase_jit_debugfs_phys_get(struct kbase_jit_debugfs_data *data)
  1424. {
  1425. struct kbase_context *kctx = data->kctx;
  1426. struct kbase_va_region *reg;
  1427. mutex_lock(&kctx->jit_lock);
  1428. list_for_each_entry(reg, &kctx->jit_active_head, jit_node) {
  1429. data->active_value += reg->gpu_alloc->nents;
  1430. }
  1431. list_for_each_entry(reg, &kctx->jit_pool_head, jit_node) {
  1432. data->pool_value += reg->gpu_alloc->nents;
  1433. }
  1434. list_for_each_entry(reg, &kctx->jit_destroy_head, jit_node) {
  1435. data->destroy_value += reg->gpu_alloc->nents;
  1436. }
  1437. mutex_unlock(&kctx->jit_lock);
  1438. return 0;
  1439. }
  1440. KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_phys_fops,
  1441. kbase_jit_debugfs_phys_get);
  1442. void kbase_jit_debugfs_add(struct kbase_context *kctx)
  1443. {
  1444. /* Debugfs entry for getting the number of JIT allocations. */
  1445. debugfs_create_file("mem_jit_count", S_IRUGO, kctx->kctx_dentry,
  1446. kctx, &kbase_jit_debugfs_count_fops);
  1447. /*
  1448. * Debugfs entry for getting the total number of virtual pages
  1449. * used by JIT allocations.
  1450. */
  1451. debugfs_create_file("mem_jit_vm", S_IRUGO, kctx->kctx_dentry,
  1452. kctx, &kbase_jit_debugfs_vm_fops);
  1453. /*
  1454. * Debugfs entry for getting the number of physical pages used
  1455. * by JIT allocations.
  1456. */
  1457. debugfs_create_file("mem_jit_phys", S_IRUGO, kctx->kctx_dentry,
  1458. kctx, &kbase_jit_debugfs_phys_fops);
  1459. }
  1460. /**
  1461. * kbase_jit_destroy_worker - Deferred worker which frees JIT allocations
  1462. * @work: Work item
  1463. *
  1464. * This function does the work of freeing JIT allocations whose physical
  1465. * backing has been released.
  1466. */
  1467. static void kbase_jit_destroy_worker(struct work_struct *work)
  1468. {
  1469. struct kbase_context *kctx;
  1470. struct kbase_va_region *reg;
  1471. kctx = container_of(work, struct kbase_context, jit_work);
  1472. do {
  1473. mutex_lock(&kctx->jit_lock);
  1474. if (list_empty(&kctx->jit_destroy_head))
  1475. reg = NULL;
  1476. else
  1477. reg = list_first_entry(&kctx->jit_destroy_head,
  1478. struct kbase_va_region, jit_node);
  1479. if (reg) {
  1480. list_del(&reg->jit_node);
  1481. mutex_unlock(&kctx->jit_lock);
  1482. kbase_gpu_vm_lock(kctx);
  1483. kbase_mem_free_region(kctx, reg);
  1484. kbase_gpu_vm_unlock(kctx);
  1485. } else
  1486. mutex_unlock(&kctx->jit_lock);
  1487. } while (reg);
  1488. }
  1489. int kbase_jit_init(struct kbase_context *kctx)
  1490. {
  1491. INIT_LIST_HEAD(&kctx->jit_active_head);
  1492. INIT_LIST_HEAD(&kctx->jit_pool_head);
  1493. INIT_LIST_HEAD(&kctx->jit_destroy_head);
  1494. mutex_init(&kctx->jit_lock);
  1495. INIT_WORK(&kctx->jit_work, kbase_jit_destroy_worker);
  1496. return 0;
  1497. }
  1498. struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx,
  1499. struct base_jit_alloc_info *info)
  1500. {
  1501. struct kbase_va_region *reg = NULL;
  1502. struct kbase_va_region *walker;
  1503. struct kbase_va_region *temp;
  1504. size_t current_diff = SIZE_MAX;
  1505. int ret;
  1506. mutex_lock(&kctx->jit_lock);
  1507. /*
  1508. * Scan the pool for an existing allocation which meets our
  1509. * requirements and remove it.
  1510. */
  1511. list_for_each_entry_safe(walker, temp, &kctx->jit_pool_head, jit_node) {
  1512. if (walker->nr_pages >= info->va_pages) {
  1513. size_t min_size, max_size, diff;
  1514. /*
  1515. * The JIT allocations VA requirements have been
  1516. * meet, it's suitable but other allocations
  1517. * might be a better fit.
  1518. */
  1519. min_size = min_t(size_t, walker->gpu_alloc->nents,
  1520. info->commit_pages);
  1521. max_size = max_t(size_t, walker->gpu_alloc->nents,
  1522. info->commit_pages);
  1523. diff = max_size - min_size;
  1524. if (current_diff > diff) {
  1525. current_diff = diff;
  1526. reg = walker;
  1527. }
  1528. /* The allocation is an exact match, stop looking */
  1529. if (current_diff == 0)
  1530. break;
  1531. }
  1532. }
  1533. if (reg) {
  1534. /*
  1535. * Remove the found region from the pool and add it to the
  1536. * active list.
  1537. */
  1538. list_del_init(&reg->jit_node);
  1539. list_add(&reg->jit_node, &kctx->jit_active_head);
  1540. /* Release the jit lock before modifying the allocation */
  1541. mutex_unlock(&kctx->jit_lock);
  1542. kbase_gpu_vm_lock(kctx);
  1543. /* Make the physical backing no longer reclaimable */
  1544. if (!kbase_mem_evictable_unmake(reg->gpu_alloc))
  1545. goto update_failed;
  1546. /* Grow the backing if required */
  1547. if (reg->gpu_alloc->nents < info->commit_pages) {
  1548. size_t delta;
  1549. size_t old_size = reg->gpu_alloc->nents;
  1550. /* Allocate some more pages */
  1551. delta = info->commit_pages - reg->gpu_alloc->nents;
  1552. if (kbase_alloc_phy_pages_helper(reg->gpu_alloc, delta)
  1553. != 0)
  1554. goto update_failed;
  1555. if (reg->cpu_alloc != reg->gpu_alloc) {
  1556. if (kbase_alloc_phy_pages_helper(
  1557. reg->cpu_alloc, delta) != 0) {
  1558. kbase_free_phy_pages_helper(
  1559. reg->gpu_alloc, delta);
  1560. goto update_failed;
  1561. }
  1562. }
  1563. ret = kbase_mem_grow_gpu_mapping(kctx, reg,
  1564. info->commit_pages, old_size);
  1565. /*
  1566. * The grow failed so put the allocation back in the
  1567. * pool and return failure.
  1568. */
  1569. if (ret)
  1570. goto update_failed;
  1571. }
  1572. kbase_gpu_vm_unlock(kctx);
  1573. } else {
  1574. /* No suitable JIT allocation was found so create a new one */
  1575. u64 flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD |
  1576. BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF |
  1577. BASE_MEM_COHERENT_LOCAL;
  1578. u64 gpu_addr;
  1579. u16 alignment;
  1580. mutex_unlock(&kctx->jit_lock);
  1581. reg = kbase_mem_alloc(kctx, info->va_pages, info->commit_pages,
  1582. info->extent, &flags, &gpu_addr, &alignment);
  1583. if (!reg)
  1584. goto out_unlocked;
  1585. mutex_lock(&kctx->jit_lock);
  1586. list_add(&reg->jit_node, &kctx->jit_active_head);
  1587. mutex_unlock(&kctx->jit_lock);
  1588. }
  1589. return reg;
  1590. update_failed:
  1591. /*
  1592. * An update to an allocation from the pool failed, chances
  1593. * are slim a new allocation would fair any better so return
  1594. * the allocation to the pool and return the function with failure.
  1595. */
  1596. kbase_gpu_vm_unlock(kctx);
  1597. mutex_lock(&kctx->jit_lock);
  1598. list_del_init(&reg->jit_node);
  1599. list_add(&reg->jit_node, &kctx->jit_pool_head);
  1600. mutex_unlock(&kctx->jit_lock);
  1601. out_unlocked:
  1602. return NULL;
  1603. }
  1604. void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg)
  1605. {
  1606. /* The physical backing of memory in the pool is always reclaimable */
  1607. down_read(&kctx->process_mm->mmap_sem);
  1608. kbase_gpu_vm_lock(kctx);
  1609. kbase_mem_evictable_make(reg->gpu_alloc);
  1610. kbase_gpu_vm_unlock(kctx);
  1611. up_read(&kctx->process_mm->mmap_sem);
  1612. mutex_lock(&kctx->jit_lock);
  1613. list_del_init(&reg->jit_node);
  1614. list_add(&reg->jit_node, &kctx->jit_pool_head);
  1615. mutex_unlock(&kctx->jit_lock);
  1616. }
  1617. void kbase_jit_backing_lost(struct kbase_va_region *reg)
  1618. {
  1619. struct kbase_context *kctx = reg->kctx;
  1620. /*
  1621. * JIT allocations will always be on a list, if the region
  1622. * is not on a list then it's not a JIT allocation.
  1623. */
  1624. if (list_empty(&reg->jit_node))
  1625. return;
  1626. /*
  1627. * Freeing the allocation requires locks we might not be able
  1628. * to take now, so move the allocation to the free list and kick
  1629. * the worker which will do the freeing.
  1630. */
  1631. mutex_lock(&kctx->jit_lock);
  1632. list_del_init(&reg->jit_node);
  1633. list_add(&reg->jit_node, &kctx->jit_destroy_head);
  1634. mutex_unlock(&kctx->jit_lock);
  1635. schedule_work(&kctx->jit_work);
  1636. }
  1637. bool kbase_jit_evict(struct kbase_context *kctx)
  1638. {
  1639. struct kbase_va_region *reg = NULL;
  1640. lockdep_assert_held(&kctx->reg_lock);
  1641. /* Free the oldest allocation from the pool */
  1642. mutex_lock(&kctx->jit_lock);
  1643. if (!list_empty(&kctx->jit_pool_head)) {
  1644. reg = list_entry(kctx->jit_pool_head.prev,
  1645. struct kbase_va_region, jit_node);
  1646. list_del(&reg->jit_node);
  1647. }
  1648. mutex_unlock(&kctx->jit_lock);
  1649. if (reg)
  1650. kbase_mem_free_region(kctx, reg);
  1651. return (reg != NULL);
  1652. }
  1653. void kbase_jit_term(struct kbase_context *kctx)
  1654. {
  1655. struct kbase_va_region *walker;
  1656. /* Free all allocations for this context */
  1657. /*
  1658. * Flush the freeing of allocations whose backing has been freed
  1659. * (i.e. everything in jit_destroy_head).
  1660. */
  1661. cancel_work_sync(&kctx->jit_work);
  1662. kbase_gpu_vm_lock(kctx);
  1663. /* Free all allocations from the pool */
  1664. while (!list_empty(&kctx->jit_pool_head)) {
  1665. walker = list_first_entry(&kctx->jit_pool_head,
  1666. struct kbase_va_region, jit_node);
  1667. list_del(&walker->jit_node);
  1668. kbase_mem_free_region(kctx, walker);
  1669. }
  1670. /* Free all allocations from active list */
  1671. while (!list_empty(&kctx->jit_active_head)) {
  1672. walker = list_first_entry(&kctx->jit_active_head,
  1673. struct kbase_va_region, jit_node);
  1674. list_del(&walker->jit_node);
  1675. kbase_mem_free_region(kctx, walker);
  1676. }
  1677. kbase_gpu_vm_unlock(kctx);
  1678. }
  1679. static int kbase_jd_user_buf_map(struct kbase_context *kctx,
  1680. struct kbase_va_region *reg)
  1681. {
  1682. long pinned_pages;
  1683. struct kbase_mem_phy_alloc *alloc;
  1684. struct page **pages;
  1685. phys_addr_t *pa;
  1686. long i;
  1687. int err = -ENOMEM;
  1688. unsigned long address;
  1689. struct mm_struct *mm;
  1690. struct device *dev;
  1691. unsigned long offset;
  1692. unsigned long local_size;
  1693. alloc = reg->gpu_alloc;
  1694. pa = kbase_get_gpu_phy_pages(reg);
  1695. address = alloc->imported.user_buf.address;
  1696. mm = alloc->imported.user_buf.mm;
  1697. KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_USER_BUF);
  1698. pages = alloc->imported.user_buf.pages;
  1699. pinned_pages = get_user_pages(
  1700. address,
  1701. alloc->imported.user_buf.nr_pages,
  1702. (reg->flags & KBASE_REG_GPU_WR) ? FOLL_WRITE : 0,
  1703. pages, NULL);
  1704. if (pinned_pages <= 0)
  1705. return pinned_pages;
  1706. if (pinned_pages != alloc->imported.user_buf.nr_pages) {
  1707. for (i = 0; i < pinned_pages; i++)
  1708. put_page(pages[i]);
  1709. return -ENOMEM;
  1710. }
  1711. dev = kctx->kbdev->dev;
  1712. offset = address & ~PAGE_MASK;
  1713. local_size = alloc->imported.user_buf.size;
  1714. for (i = 0; i < pinned_pages; i++) {
  1715. dma_addr_t dma_addr;
  1716. unsigned long min;
  1717. min = MIN(PAGE_SIZE - offset, local_size);
  1718. dma_addr = dma_map_page(dev, pages[i],
  1719. offset, min,
  1720. DMA_BIDIRECTIONAL);
  1721. if (dma_mapping_error(dev, dma_addr))
  1722. goto unwind;
  1723. alloc->imported.user_buf.dma_addrs[i] = dma_addr;
  1724. pa[i] = page_to_phys(pages[i]);
  1725. local_size -= min;
  1726. offset = 0;
  1727. }
  1728. alloc->nents = pinned_pages;
  1729. err = kbase_mmu_insert_pages(kctx, reg->start_pfn, pa,
  1730. kbase_reg_current_backed_size(reg),
  1731. reg->flags);
  1732. if (err == 0)
  1733. return 0;
  1734. alloc->nents = 0;
  1735. /* fall down */
  1736. unwind:
  1737. while (i--) {
  1738. dma_unmap_page(kctx->kbdev->dev,
  1739. alloc->imported.user_buf.dma_addrs[i],
  1740. PAGE_SIZE, DMA_BIDIRECTIONAL);
  1741. put_page(pages[i]);
  1742. pages[i] = NULL;
  1743. }
  1744. return err;
  1745. }
  1746. static void kbase_jd_user_buf_unmap(struct kbase_context *kctx,
  1747. struct kbase_mem_phy_alloc *alloc, bool writeable)
  1748. {
  1749. long i;
  1750. struct page **pages;
  1751. unsigned long size = alloc->imported.user_buf.size;
  1752. KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_USER_BUF);
  1753. pages = alloc->imported.user_buf.pages;
  1754. for (i = 0; i < alloc->imported.user_buf.nr_pages; i++) {
  1755. unsigned long local_size;
  1756. dma_addr_t dma_addr = alloc->imported.user_buf.dma_addrs[i];
  1757. local_size = MIN(size, PAGE_SIZE - (dma_addr & ~PAGE_MASK));
  1758. dma_unmap_page(kctx->kbdev->dev, dma_addr, local_size,
  1759. DMA_BIDIRECTIONAL);
  1760. if (writeable)
  1761. set_page_dirty_lock(pages[i]);
  1762. put_page(pages[i]);
  1763. pages[i] = NULL;
  1764. size -= local_size;
  1765. }
  1766. alloc->nents = 0;
  1767. }
  1768. #ifdef CONFIG_DMA_SHARED_BUFFER
  1769. static int kbase_jd_umm_map(struct kbase_context *kctx,
  1770. struct kbase_va_region *reg)
  1771. {
  1772. struct sg_table *sgt;
  1773. struct scatterlist *s;
  1774. int i;
  1775. phys_addr_t *pa;
  1776. int err;
  1777. size_t count = 0;
  1778. struct kbase_mem_phy_alloc *alloc;
  1779. alloc = reg->gpu_alloc;
  1780. KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_UMM);
  1781. KBASE_DEBUG_ASSERT(NULL == alloc->imported.umm.sgt);
  1782. sgt = dma_buf_map_attachment(alloc->imported.umm.dma_attachment,
  1783. DMA_BIDIRECTIONAL);
  1784. if (IS_ERR_OR_NULL(sgt))
  1785. return -EINVAL;
  1786. /* save for later */
  1787. alloc->imported.umm.sgt = sgt;
  1788. pa = kbase_get_gpu_phy_pages(reg);
  1789. KBASE_DEBUG_ASSERT(pa);
  1790. for_each_sg(sgt->sgl, s, sgt->nents, i) {
  1791. int j;
  1792. size_t pages = PFN_UP(sg_dma_len(s));
  1793. WARN_ONCE(sg_dma_len(s) & (PAGE_SIZE-1),
  1794. "sg_dma_len(s)=%u is not a multiple of PAGE_SIZE\n",
  1795. sg_dma_len(s));
  1796. WARN_ONCE(sg_dma_address(s) & (PAGE_SIZE-1),
  1797. "sg_dma_address(s)=%llx is not aligned to PAGE_SIZE\n",
  1798. (unsigned long long) sg_dma_address(s));
  1799. for (j = 0; (j < pages) && (count < reg->nr_pages); j++,
  1800. count++)
  1801. *pa++ = sg_dma_address(s) + (j << PAGE_SHIFT);
  1802. WARN_ONCE(j < pages,
  1803. "sg list from dma_buf_map_attachment > dma_buf->size=%zu\n",
  1804. alloc->imported.umm.dma_buf->size);
  1805. }
  1806. if (WARN_ONCE(count < reg->nr_pages,
  1807. "sg list from dma_buf_map_attachment < dma_buf->size=%zu\n",
  1808. alloc->imported.umm.dma_buf->size)) {
  1809. err = -EINVAL;
  1810. goto out;
  1811. }
  1812. /* Update nents as we now have pages to map */
  1813. alloc->nents = count;
  1814. err = kbase_mmu_insert_pages(kctx, reg->start_pfn,
  1815. kbase_get_gpu_phy_pages(reg),
  1816. kbase_reg_current_backed_size(reg),
  1817. reg->flags | KBASE_REG_GPU_WR | KBASE_REG_GPU_RD);
  1818. out:
  1819. if (err) {
  1820. dma_buf_unmap_attachment(alloc->imported.umm.dma_attachment,
  1821. alloc->imported.umm.sgt, DMA_BIDIRECTIONAL);
  1822. alloc->imported.umm.sgt = NULL;
  1823. }
  1824. return err;
  1825. }
  1826. static void kbase_jd_umm_unmap(struct kbase_context *kctx,
  1827. struct kbase_mem_phy_alloc *alloc)
  1828. {
  1829. KBASE_DEBUG_ASSERT(kctx);
  1830. KBASE_DEBUG_ASSERT(alloc);
  1831. KBASE_DEBUG_ASSERT(alloc->imported.umm.dma_attachment);
  1832. KBASE_DEBUG_ASSERT(alloc->imported.umm.sgt);
  1833. dma_buf_unmap_attachment(alloc->imported.umm.dma_attachment,
  1834. alloc->imported.umm.sgt, DMA_BIDIRECTIONAL);
  1835. alloc->imported.umm.sgt = NULL;
  1836. alloc->nents = 0;
  1837. }
  1838. #endif /* CONFIG_DMA_SHARED_BUFFER */
  1839. #if (defined(CONFIG_KDS) && defined(CONFIG_UMP)) \
  1840. || defined(CONFIG_DMA_SHARED_BUFFER_USES_KDS)
  1841. static void add_kds_resource(struct kds_resource *kds_res,
  1842. struct kds_resource **kds_resources, u32 *kds_res_count,
  1843. unsigned long *kds_access_bitmap, bool exclusive)
  1844. {
  1845. u32 i;
  1846. for (i = 0; i < *kds_res_count; i++) {
  1847. /* Duplicate resource, ignore */
  1848. if (kds_resources[i] == kds_res)
  1849. return;
  1850. }
  1851. kds_resources[*kds_res_count] = kds_res;
  1852. if (exclusive)
  1853. set_bit(*kds_res_count, kds_access_bitmap);
  1854. (*kds_res_count)++;
  1855. }
  1856. #endif
  1857. struct kbase_mem_phy_alloc *kbase_map_external_resource(
  1858. struct kbase_context *kctx, struct kbase_va_region *reg,
  1859. struct mm_struct *locked_mm
  1860. #ifdef CONFIG_KDS
  1861. , u32 *kds_res_count, struct kds_resource **kds_resources,
  1862. unsigned long *kds_access_bitmap, bool exclusive
  1863. #endif
  1864. )
  1865. {
  1866. int err;
  1867. /* decide what needs to happen for this resource */
  1868. switch (reg->gpu_alloc->type) {
  1869. case BASE_MEM_IMPORT_TYPE_USER_BUFFER: {
  1870. if (reg->gpu_alloc->imported.user_buf.mm != locked_mm)
  1871. goto exit;
  1872. reg->gpu_alloc->imported.user_buf.current_mapping_usage_count++;
  1873. if (1 == reg->gpu_alloc->imported.user_buf.current_mapping_usage_count) {
  1874. err = kbase_jd_user_buf_map(kctx, reg);
  1875. if (err) {
  1876. reg->gpu_alloc->imported.user_buf.current_mapping_usage_count--;
  1877. goto exit;
  1878. }
  1879. }
  1880. }
  1881. break;
  1882. case BASE_MEM_IMPORT_TYPE_UMP: {
  1883. #if defined(CONFIG_KDS) && defined(CONFIG_UMP)
  1884. if (kds_res_count) {
  1885. struct kds_resource *kds_res;
  1886. kds_res = ump_dd_kds_resource_get(
  1887. reg->gpu_alloc->imported.ump_handle);
  1888. if (kds_res)
  1889. add_kds_resource(kds_res, kds_resources,
  1890. kds_res_count,
  1891. kds_access_bitmap, exclusive);
  1892. }
  1893. #endif /*defined(CONFIG_KDS) && defined(CONFIG_UMP) */
  1894. break;
  1895. }
  1896. #ifdef CONFIG_DMA_SHARED_BUFFER
  1897. case BASE_MEM_IMPORT_TYPE_UMM: {
  1898. #ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
  1899. if (kds_res_count) {
  1900. struct kds_resource *kds_res;
  1901. kds_res = get_dma_buf_kds_resource(
  1902. reg->gpu_alloc->imported.umm.dma_buf);
  1903. if (kds_res)
  1904. add_kds_resource(kds_res, kds_resources,
  1905. kds_res_count,
  1906. kds_access_bitmap, exclusive);
  1907. }
  1908. #endif
  1909. reg->gpu_alloc->imported.umm.current_mapping_usage_count++;
  1910. if (1 == reg->gpu_alloc->imported.umm.current_mapping_usage_count) {
  1911. err = kbase_jd_umm_map(kctx, reg);
  1912. if (err) {
  1913. reg->gpu_alloc->imported.umm.current_mapping_usage_count--;
  1914. goto exit;
  1915. }
  1916. }
  1917. break;
  1918. }
  1919. #endif
  1920. default:
  1921. goto exit;
  1922. }
  1923. return kbase_mem_phy_alloc_get(reg->gpu_alloc);
  1924. exit:
  1925. return NULL;
  1926. }
  1927. void kbase_unmap_external_resource(struct kbase_context *kctx,
  1928. struct kbase_va_region *reg, struct kbase_mem_phy_alloc *alloc)
  1929. {
  1930. switch (alloc->type) {
  1931. #ifdef CONFIG_DMA_SHARED_BUFFER
  1932. case KBASE_MEM_TYPE_IMPORTED_UMM: {
  1933. alloc->imported.umm.current_mapping_usage_count--;
  1934. if (0 == alloc->imported.umm.current_mapping_usage_count) {
  1935. if (reg && reg->gpu_alloc == alloc)
  1936. kbase_mmu_teardown_pages(
  1937. kctx,
  1938. reg->start_pfn,
  1939. kbase_reg_current_backed_size(reg));
  1940. kbase_jd_umm_unmap(kctx, alloc);
  1941. }
  1942. }
  1943. break;
  1944. #endif /* CONFIG_DMA_SHARED_BUFFER */
  1945. case KBASE_MEM_TYPE_IMPORTED_USER_BUF: {
  1946. alloc->imported.user_buf.current_mapping_usage_count--;
  1947. if (0 == alloc->imported.user_buf.current_mapping_usage_count) {
  1948. bool writeable = true;
  1949. if (reg && reg->gpu_alloc == alloc)
  1950. kbase_mmu_teardown_pages(
  1951. kctx,
  1952. reg->start_pfn,
  1953. kbase_reg_current_backed_size(reg));
  1954. if (reg && ((reg->flags & KBASE_REG_GPU_WR) == 0))
  1955. writeable = false;
  1956. kbase_jd_user_buf_unmap(kctx, alloc, writeable);
  1957. }
  1958. }
  1959. break;
  1960. default:
  1961. break;
  1962. }
  1963. kbase_mem_phy_alloc_put(alloc);
  1964. }
  1965. struct kbase_ctx_ext_res_meta *kbase_sticky_resource_acquire(
  1966. struct kbase_context *kctx, u64 gpu_addr)
  1967. {
  1968. struct kbase_ctx_ext_res_meta *meta = NULL;
  1969. struct kbase_ctx_ext_res_meta *walker;
  1970. lockdep_assert_held(&kctx->reg_lock);
  1971. /*
  1972. * Walk the per context external resource metadata list for the
  1973. * metadata which matches the region which is being acquired.
  1974. */
  1975. list_for_each_entry(walker, &kctx->ext_res_meta_head, ext_res_node) {
  1976. if (walker->gpu_addr == gpu_addr) {
  1977. meta = walker;
  1978. break;
  1979. }
  1980. }
  1981. /* No metadata exists so create one. */
  1982. if (!meta) {
  1983. struct kbase_va_region *reg;
  1984. /* Find the region */
  1985. reg = kbase_region_tracker_find_region_enclosing_address(
  1986. kctx, gpu_addr);
  1987. if (NULL == reg || (reg->flags & KBASE_REG_FREE))
  1988. goto failed;
  1989. /* Allocate the metadata object */
  1990. meta = kzalloc(sizeof(*meta), GFP_KERNEL);
  1991. if (!meta)
  1992. goto failed;
  1993. /*
  1994. * Fill in the metadata object and acquire a reference
  1995. * for the physical resource.
  1996. */
  1997. meta->alloc = kbase_map_external_resource(kctx, reg, NULL
  1998. #ifdef CONFIG_KDS
  1999. , NULL, NULL,
  2000. NULL, false
  2001. #endif
  2002. );
  2003. if (!meta->alloc)
  2004. goto fail_map;
  2005. meta->gpu_addr = reg->start_pfn << PAGE_SHIFT;
  2006. list_add(&meta->ext_res_node, &kctx->ext_res_meta_head);
  2007. }
  2008. return meta;
  2009. fail_map:
  2010. kfree(meta);
  2011. failed:
  2012. return NULL;
  2013. }
  2014. bool kbase_sticky_resource_release(struct kbase_context *kctx,
  2015. struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr)
  2016. {
  2017. struct kbase_ctx_ext_res_meta *walker;
  2018. struct kbase_va_region *reg;
  2019. lockdep_assert_held(&kctx->reg_lock);
  2020. /* Search of the metadata if one isn't provided. */
  2021. if (!meta) {
  2022. /*
  2023. * Walk the per context external resource metadata list for the
  2024. * metadata which matches the region which is being released.
  2025. */
  2026. list_for_each_entry(walker, &kctx->ext_res_meta_head,
  2027. ext_res_node) {
  2028. if (walker->gpu_addr == gpu_addr) {
  2029. meta = walker;
  2030. break;
  2031. }
  2032. }
  2033. }
  2034. /* No metadata so just return. */
  2035. if (!meta)
  2036. return false;
  2037. /* Drop the physical memory reference and free the metadata. */
  2038. reg = kbase_region_tracker_find_region_enclosing_address(
  2039. kctx,
  2040. meta->gpu_addr);
  2041. kbase_unmap_external_resource(kctx, reg, meta->alloc);
  2042. list_del(&meta->ext_res_node);
  2043. kfree(meta);
  2044. return true;
  2045. }
  2046. int kbase_sticky_resource_init(struct kbase_context *kctx)
  2047. {
  2048. INIT_LIST_HEAD(&kctx->ext_res_meta_head);
  2049. return 0;
  2050. }
  2051. void kbase_sticky_resource_term(struct kbase_context *kctx)
  2052. {
  2053. struct kbase_ctx_ext_res_meta *walker;
  2054. lockdep_assert_held(&kctx->reg_lock);
  2055. /*
  2056. * Free any sticky resources which haven't been unmapped.
  2057. *
  2058. * Note:
  2059. * We don't care about refcounts at this point as no future
  2060. * references to the meta data will be made.
  2061. * Region termination would find these if we didn't free them
  2062. * here, but it's more efficient if we do the clean up here.
  2063. */
  2064. while (!list_empty(&kctx->ext_res_meta_head)) {
  2065. walker = list_first_entry(&kctx->ext_res_meta_head,
  2066. struct kbase_ctx_ext_res_meta, ext_res_node);
  2067. kbase_sticky_resource_release(kctx, walker, 0);
  2068. }
  2069. }