adreno_gpu.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2013 Red Hat
  4. * Author: Rob Clark <robdclark@gmail.com>
  5. *
  6. * Copyright (c) 2014 The Linux Foundation. All rights reserved.
  7. */
  8. #include <linux/ascii85.h>
  9. #include <linux/interconnect.h>
  10. #include <linux/firmware/qcom/qcom_scm.h>
  11. #include <linux/kernel.h>
  12. #include <linux/of_reserved_mem.h>
  13. #include <linux/pm_opp.h>
  14. #include <linux/slab.h>
  15. #include <linux/soc/qcom/mdt_loader.h>
  16. #include <linux/nvmem-consumer.h>
  17. #include <soc/qcom/ocmem.h>
  18. #include "adreno_gpu.h"
  19. #include "a6xx_gpu.h"
  20. #include "msm_gem.h"
  21. #include "msm_mmu.h"
  22. static u64 address_space_size = 0;
  23. MODULE_PARM_DESC(address_space_size, "Override for size of processes private GPU address space");
  24. module_param(address_space_size, ullong, 0600);
  25. static bool zap_available = true;
  26. static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname,
  27. u32 pasid)
  28. {
  29. struct device *dev = &gpu->pdev->dev;
  30. const struct firmware *fw;
  31. const char *signed_fwname = NULL;
  32. struct device_node *np;
  33. struct resource r;
  34. phys_addr_t mem_phys;
  35. ssize_t mem_size;
  36. void *mem_region = NULL;
  37. int ret;
  38. if (!IS_ENABLED(CONFIG_ARCH_QCOM)) {
  39. zap_available = false;
  40. return -EINVAL;
  41. }
  42. np = of_get_child_by_name(dev->of_node, "zap-shader");
  43. if (!of_device_is_available(np)) {
  44. zap_available = false;
  45. return -ENODEV;
  46. }
  47. ret = of_reserved_mem_region_to_resource(np, 0, &r);
  48. if (ret) {
  49. zap_available = false;
  50. return ret;
  51. }
  52. mem_phys = r.start;
  53. /*
  54. * Check for a firmware-name property. This is the new scheme
  55. * to handle firmware that may be signed with device specific
  56. * keys, allowing us to have a different zap fw path for different
  57. * devices.
  58. *
  59. * If the firmware-name property is found, we bypass the
  60. * adreno_request_fw() mechanism, because we don't need to handle
  61. * the /lib/firmware/qcom/... vs /lib/firmware/... case.
  62. *
  63. * If the firmware-name property is not found, for backwards
  64. * compatibility we fall back to the fwname from the gpulist
  65. * table.
  66. */
  67. of_property_read_string_index(np, "firmware-name", 0, &signed_fwname);
  68. if (signed_fwname) {
  69. fwname = signed_fwname;
  70. ret = request_firmware_direct(&fw, fwname, gpu->dev->dev);
  71. if (ret)
  72. fw = ERR_PTR(ret);
  73. } else if (fwname) {
  74. /* Request the MDT file from the default location: */
  75. fw = adreno_request_fw(to_adreno_gpu(gpu), fwname);
  76. } else {
  77. /*
  78. * For new targets, we require the firmware-name property,
  79. * if a zap-shader is required, rather than falling back
  80. * to a firmware name specified in gpulist.
  81. *
  82. * Because the firmware is signed with a (potentially)
  83. * device specific key, having the name come from gpulist
  84. * was a bad idea, and is only provided for backwards
  85. * compatibility for older targets.
  86. */
  87. return -ENOENT;
  88. }
  89. if (IS_ERR(fw)) {
  90. DRM_DEV_ERROR(dev, "Unable to load %s\n", fwname);
  91. return PTR_ERR(fw);
  92. }
  93. /* Figure out how much memory we need */
  94. mem_size = qcom_mdt_get_size(fw);
  95. if (mem_size < 0) {
  96. ret = mem_size;
  97. goto out;
  98. }
  99. if (mem_size > resource_size(&r)) {
  100. DRM_DEV_ERROR(dev,
  101. "memory region is too small to load the MDT\n");
  102. ret = -E2BIG;
  103. goto out;
  104. }
  105. /* Allocate memory for the firmware image */
  106. mem_region = memremap(mem_phys, mem_size, MEMREMAP_WC);
  107. if (!mem_region) {
  108. ret = -ENOMEM;
  109. goto out;
  110. }
  111. /*
  112. * Load the rest of the MDT
  113. *
  114. * Note that we could be dealing with two different paths, since
  115. * with upstream linux-firmware it would be in a qcom/ subdir..
  116. * adreno_request_fw() handles this, but qcom_mdt_load() does
  117. * not. But since we've already gotten through adreno_request_fw()
  118. * we know which of the two cases it is:
  119. */
  120. if (signed_fwname || (to_adreno_gpu(gpu)->fwloc == FW_LOCATION_LEGACY)) {
  121. ret = qcom_mdt_load(dev, fw, fwname, pasid,
  122. mem_region, mem_phys, mem_size, NULL);
  123. } else {
  124. char *newname;
  125. newname = kasprintf(GFP_KERNEL, "qcom/%s", fwname);
  126. ret = qcom_mdt_load(dev, fw, newname, pasid,
  127. mem_region, mem_phys, mem_size, NULL);
  128. kfree(newname);
  129. }
  130. if (ret)
  131. goto out;
  132. /* Send the image to the secure world */
  133. ret = qcom_scm_pas_auth_and_reset(pasid);
  134. /*
  135. * If the scm call returns -EOPNOTSUPP we assume that this target
  136. * doesn't need/support the zap shader so quietly fail
  137. */
  138. if (ret == -EOPNOTSUPP)
  139. zap_available = false;
  140. else if (ret)
  141. DRM_DEV_ERROR(dev, "Unable to authorize the image\n");
  142. out:
  143. if (mem_region)
  144. memunmap(mem_region);
  145. release_firmware(fw);
  146. return ret;
  147. }
  148. int adreno_zap_shader_load(struct msm_gpu *gpu, u32 pasid)
  149. {
  150. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  151. struct platform_device *pdev = gpu->pdev;
  152. /* Short cut if we determine the zap shader isn't available/needed */
  153. if (!zap_available)
  154. return -ENODEV;
  155. /* We need SCM to be able to load the firmware */
  156. if (!qcom_scm_is_available()) {
  157. DRM_DEV_ERROR(&pdev->dev, "SCM is not available\n");
  158. return -EPROBE_DEFER;
  159. }
  160. return zap_shader_load_mdt(gpu, adreno_gpu->info->zapfw, pasid);
  161. }
  162. struct drm_gpuvm *
  163. adreno_create_vm(struct msm_gpu *gpu,
  164. struct platform_device *pdev)
  165. {
  166. return adreno_iommu_create_vm(gpu, pdev, 0);
  167. }
  168. struct drm_gpuvm *
  169. adreno_iommu_create_vm(struct msm_gpu *gpu,
  170. struct platform_device *pdev,
  171. unsigned long quirks)
  172. {
  173. struct iommu_domain_geometry *geometry;
  174. struct msm_mmu *mmu;
  175. struct drm_gpuvm *vm;
  176. u64 start, size;
  177. mmu = msm_iommu_gpu_new(&pdev->dev, gpu, quirks);
  178. if (IS_ERR(mmu))
  179. return ERR_CAST(mmu);
  180. geometry = msm_iommu_get_geometry(mmu);
  181. if (IS_ERR(geometry))
  182. return ERR_CAST(geometry);
  183. /*
  184. * Use the aperture start or SZ_16M, whichever is greater. This will
  185. * ensure that we align with the allocated pagetable range while still
  186. * allowing room in the lower 32 bits for GMEM and whatnot
  187. */
  188. start = max_t(u64, SZ_16M, geometry->aperture_start);
  189. size = geometry->aperture_end - start + 1;
  190. vm = msm_gem_vm_create(gpu->dev, mmu, "gpu", start & GENMASK_ULL(48, 0),
  191. size, true);
  192. if (IS_ERR(vm) && !IS_ERR(mmu))
  193. mmu->funcs->destroy(mmu);
  194. return vm;
  195. }
  196. u64 adreno_private_vm_size(struct msm_gpu *gpu)
  197. {
  198. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  199. struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(&gpu->pdev->dev);
  200. const struct io_pgtable_cfg *ttbr1_cfg;
  201. if (address_space_size)
  202. return address_space_size;
  203. if (adreno_gpu->info->quirks & ADRENO_QUIRK_4GB_VA)
  204. return SZ_4G;
  205. if (!adreno_smmu || !adreno_smmu->get_ttbr1_cfg)
  206. return SZ_4G;
  207. ttbr1_cfg = adreno_smmu->get_ttbr1_cfg(adreno_smmu->cookie);
  208. /*
  209. * Userspace VM is actually using TTBR0, but both are the same size,
  210. * with b48 (sign bit) selecting which TTBRn to use. So if IAS is
  211. * 48, the total (kernel+user) address space size is effectively
  212. * 49 bits. But what userspace is control of is the lower 48.
  213. */
  214. return BIT(ttbr1_cfg->ias) - ADRENO_VM_START;
  215. }
  216. void adreno_check_and_reenable_stall(struct adreno_gpu *adreno_gpu)
  217. {
  218. struct msm_gpu *gpu = &adreno_gpu->base;
  219. struct msm_drm_private *priv = gpu->dev->dev_private;
  220. unsigned long flags;
  221. /*
  222. * Wait until the cooldown period has passed and we would actually
  223. * collect a crashdump to re-enable stall-on-fault.
  224. */
  225. spin_lock_irqsave(&priv->fault_stall_lock, flags);
  226. if (!priv->stall_enabled &&
  227. ktime_after(ktime_get(), priv->stall_reenable_time) &&
  228. !READ_ONCE(gpu->crashstate)) {
  229. struct msm_mmu *mmu = to_msm_vm(gpu->vm)->mmu;
  230. priv->stall_enabled = true;
  231. mmu->funcs->set_stall(mmu, true);
  232. }
  233. spin_unlock_irqrestore(&priv->fault_stall_lock, flags);
  234. }
  235. #define ARM_SMMU_FSR_TF BIT(1)
  236. #define ARM_SMMU_FSR_PF BIT(3)
  237. #define ARM_SMMU_FSR_EF BIT(4)
  238. #define ARM_SMMU_FSR_SS BIT(30)
  239. int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags,
  240. struct adreno_smmu_fault_info *info, const char *block,
  241. u32 scratch[4])
  242. {
  243. struct adreno_gpu *adreno_gpu = container_of(gpu, struct adreno_gpu, base);
  244. struct msm_drm_private *priv = gpu->dev->dev_private;
  245. struct msm_mmu *mmu = to_msm_vm(gpu->vm)->mmu;
  246. const char *type = "UNKNOWN";
  247. bool do_devcoredump = info && (info->fsr & ARM_SMMU_FSR_SS) &&
  248. !READ_ONCE(gpu->crashstate);
  249. unsigned long irq_flags;
  250. /*
  251. * In case there is a subsequent storm of pagefaults, disable
  252. * stall-on-fault for at least half a second.
  253. */
  254. spin_lock_irqsave(&priv->fault_stall_lock, irq_flags);
  255. if (priv->stall_enabled) {
  256. priv->stall_enabled = false;
  257. mmu->funcs->set_stall(mmu, false);
  258. }
  259. priv->stall_reenable_time = ktime_add_ms(ktime_get(), 500);
  260. spin_unlock_irqrestore(&priv->fault_stall_lock, irq_flags);
  261. /*
  262. * Print a default message if we couldn't get the data from the
  263. * adreno-smmu-priv
  264. */
  265. if (!info) {
  266. pr_warn_ratelimited("*** gpu fault: iova=%.16lx flags=%d (%u,%u,%u,%u)\n",
  267. iova, flags,
  268. scratch[0], scratch[1], scratch[2], scratch[3]);
  269. return 0;
  270. }
  271. if (info->fsr & ARM_SMMU_FSR_TF)
  272. type = "TRANSLATION";
  273. else if (info->fsr & ARM_SMMU_FSR_PF)
  274. type = "PERMISSION";
  275. else if (info->fsr & ARM_SMMU_FSR_EF)
  276. type = "EXTERNAL";
  277. pr_warn_ratelimited("*** gpu fault: ttbr0=%.16llx iova=%.16lx dir=%s type=%s source=%s (%u,%u,%u,%u)\n",
  278. info->ttbr0, iova,
  279. flags & IOMMU_FAULT_WRITE ? "WRITE" : "READ",
  280. type, block,
  281. scratch[0], scratch[1], scratch[2], scratch[3]);
  282. if (do_devcoredump) {
  283. struct msm_gpu_fault_info fault_info = {};
  284. /* Turn off the hangcheck timer to keep it from bothering us */
  285. timer_delete(&gpu->hangcheck_timer);
  286. /* Let any concurrent GMU transactions know that the MMU may be
  287. * blocked for a while and they should wait on us.
  288. */
  289. reinit_completion(&adreno_gpu->fault_coredump_done);
  290. fault_info.ttbr0 = info->ttbr0;
  291. fault_info.iova = iova;
  292. fault_info.flags = flags;
  293. fault_info.type = type;
  294. fault_info.block = block;
  295. msm_gpu_fault_crashstate_capture(gpu, &fault_info);
  296. complete_all(&adreno_gpu->fault_coredump_done);
  297. }
  298. return 0;
  299. }
  300. int adreno_get_param(struct msm_gpu *gpu, struct msm_context *ctx,
  301. uint32_t param, uint64_t *value, uint32_t *len)
  302. {
  303. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  304. struct drm_device *drm = gpu->dev;
  305. /* Note ctx can be NULL when called from rd_open(): */
  306. struct drm_gpuvm *vm = ctx ? msm_context_vm(drm, ctx) : NULL;
  307. /* No pointer params yet */
  308. if (*len != 0)
  309. return UERR(EINVAL, drm, "invalid len");
  310. switch (param) {
  311. case MSM_PARAM_GPU_ID:
  312. *value = adreno_gpu->info->revn;
  313. return 0;
  314. case MSM_PARAM_GMEM_SIZE:
  315. *value = adreno_gpu->info->gmem;
  316. return 0;
  317. case MSM_PARAM_GMEM_BASE:
  318. if (adreno_gpu->info->family >= ADRENO_6XX_GEN4)
  319. *value = 0;
  320. else
  321. *value = 0x100000;
  322. return 0;
  323. case MSM_PARAM_CHIP_ID:
  324. *value = adreno_gpu->chip_id;
  325. if (!adreno_gpu->info->revn)
  326. *value |= ((uint64_t) adreno_gpu->speedbin) << 32;
  327. return 0;
  328. case MSM_PARAM_MAX_FREQ:
  329. *value = adreno_gpu->base.fast_rate;
  330. return 0;
  331. case MSM_PARAM_TIMESTAMP:
  332. if (adreno_gpu->funcs->get_timestamp) {
  333. int ret;
  334. pm_runtime_get_sync(&gpu->pdev->dev);
  335. ret = adreno_gpu->funcs->get_timestamp(gpu, value);
  336. pm_runtime_put_autosuspend(&gpu->pdev->dev);
  337. return ret;
  338. }
  339. return -EINVAL;
  340. case MSM_PARAM_PRIORITIES:
  341. *value = gpu->nr_rings * NR_SCHED_PRIORITIES;
  342. return 0;
  343. case MSM_PARAM_PP_PGTABLE:
  344. *value = 0;
  345. return 0;
  346. case MSM_PARAM_FAULTS:
  347. if (vm)
  348. *value = gpu->global_faults + to_msm_vm(vm)->faults;
  349. else
  350. *value = gpu->global_faults;
  351. return 0;
  352. case MSM_PARAM_SUSPENDS:
  353. *value = gpu->suspend_count;
  354. return 0;
  355. case MSM_PARAM_VA_START:
  356. if (vm == gpu->vm)
  357. return UERR(EINVAL, drm, "requires per-process pgtables");
  358. *value = vm->mm_start;
  359. return 0;
  360. case MSM_PARAM_VA_SIZE:
  361. if (vm == gpu->vm)
  362. return UERR(EINVAL, drm, "requires per-process pgtables");
  363. *value = vm->mm_range;
  364. return 0;
  365. case MSM_PARAM_HIGHEST_BANK_BIT:
  366. *value = adreno_gpu->ubwc_config->highest_bank_bit;
  367. return 0;
  368. case MSM_PARAM_RAYTRACING:
  369. *value = adreno_gpu->has_ray_tracing;
  370. return 0;
  371. case MSM_PARAM_UBWC_SWIZZLE:
  372. *value = adreno_gpu->ubwc_config->ubwc_swizzle;
  373. return 0;
  374. case MSM_PARAM_MACROTILE_MODE:
  375. *value = adreno_gpu->ubwc_config->macrotile_mode;
  376. return 0;
  377. case MSM_PARAM_UCHE_TRAP_BASE:
  378. *value = adreno_gpu->uche_trap_base;
  379. return 0;
  380. case MSM_PARAM_HAS_PRR:
  381. *value = adreno_smmu_has_prr(gpu);
  382. return 0;
  383. default:
  384. return UERR(EINVAL, drm, "%s: invalid param: %u", gpu->name, param);
  385. }
  386. }
  387. int adreno_set_param(struct msm_gpu *gpu, struct msm_context *ctx,
  388. uint32_t param, uint64_t value, uint32_t len)
  389. {
  390. struct drm_device *drm = gpu->dev;
  391. switch (param) {
  392. case MSM_PARAM_COMM:
  393. case MSM_PARAM_CMDLINE:
  394. /* kstrdup_quotable_cmdline() limits to PAGE_SIZE, so
  395. * that should be a reasonable upper bound
  396. */
  397. if (len > PAGE_SIZE)
  398. return UERR(EINVAL, drm, "invalid len");
  399. break;
  400. default:
  401. if (len != 0)
  402. return UERR(EINVAL, drm, "invalid len");
  403. }
  404. switch (param) {
  405. case MSM_PARAM_COMM:
  406. case MSM_PARAM_CMDLINE: {
  407. char *str, **paramp;
  408. str = memdup_user_nul(u64_to_user_ptr(value), len);
  409. if (IS_ERR(str))
  410. return PTR_ERR(str);
  411. mutex_lock(&gpu->lock);
  412. if (param == MSM_PARAM_COMM) {
  413. paramp = &ctx->comm;
  414. } else {
  415. paramp = &ctx->cmdline;
  416. }
  417. kfree(*paramp);
  418. *paramp = str;
  419. mutex_unlock(&gpu->lock);
  420. return 0;
  421. }
  422. case MSM_PARAM_SYSPROF:
  423. if (!capable(CAP_SYS_ADMIN))
  424. return UERR(EPERM, drm, "invalid permissions");
  425. return msm_context_set_sysprof(ctx, gpu, value);
  426. case MSM_PARAM_EN_VM_BIND:
  427. /* We can only support VM_BIND with per-process pgtables: */
  428. if (ctx->vm == gpu->vm)
  429. return UERR(EINVAL, drm, "requires per-process pgtables");
  430. /*
  431. * We can only swtich to VM_BIND mode if the VM has not yet
  432. * been created:
  433. */
  434. if (ctx->vm)
  435. return UERR(EBUSY, drm, "VM already created");
  436. ctx->userspace_managed_vm = value;
  437. return 0;
  438. default:
  439. return UERR(EINVAL, drm, "%s: invalid param: %u", gpu->name, param);
  440. }
  441. }
  442. const struct firmware *
  443. adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname)
  444. {
  445. struct drm_device *drm = adreno_gpu->base.dev;
  446. const struct firmware *fw = NULL;
  447. char *newname;
  448. int ret;
  449. newname = kasprintf(GFP_KERNEL, "qcom/%s", fwname);
  450. if (!newname)
  451. return ERR_PTR(-ENOMEM);
  452. /*
  453. * Try first to load from qcom/$fwfile using a direct load (to avoid
  454. * a potential timeout waiting for usermode helper)
  455. */
  456. if ((adreno_gpu->fwloc == FW_LOCATION_UNKNOWN) ||
  457. (adreno_gpu->fwloc == FW_LOCATION_NEW)) {
  458. ret = request_firmware_direct(&fw, newname, drm->dev);
  459. if (!ret) {
  460. DRM_DEV_INFO(drm->dev, "loaded %s from new location\n",
  461. newname);
  462. adreno_gpu->fwloc = FW_LOCATION_NEW;
  463. goto out;
  464. } else if (adreno_gpu->fwloc != FW_LOCATION_UNKNOWN) {
  465. DRM_DEV_ERROR(drm->dev, "failed to load %s: %d\n",
  466. newname, ret);
  467. fw = ERR_PTR(ret);
  468. goto out;
  469. }
  470. }
  471. /*
  472. * Then try the legacy location without qcom/ prefix
  473. */
  474. if ((adreno_gpu->fwloc == FW_LOCATION_UNKNOWN) ||
  475. (adreno_gpu->fwloc == FW_LOCATION_LEGACY)) {
  476. ret = request_firmware_direct(&fw, fwname, drm->dev);
  477. if (!ret) {
  478. DRM_DEV_INFO(drm->dev, "loaded %s from legacy location\n",
  479. fwname);
  480. adreno_gpu->fwloc = FW_LOCATION_LEGACY;
  481. goto out;
  482. } else if (adreno_gpu->fwloc != FW_LOCATION_UNKNOWN) {
  483. DRM_DEV_ERROR(drm->dev, "failed to load %s: %d\n",
  484. fwname, ret);
  485. fw = ERR_PTR(ret);
  486. goto out;
  487. }
  488. }
  489. /*
  490. * Finally fall back to request_firmware() for cases where the
  491. * usermode helper is needed (I think mainly android)
  492. */
  493. if ((adreno_gpu->fwloc == FW_LOCATION_UNKNOWN) ||
  494. (adreno_gpu->fwloc == FW_LOCATION_HELPER)) {
  495. ret = request_firmware(&fw, newname, drm->dev);
  496. if (!ret) {
  497. DRM_DEV_INFO(drm->dev, "loaded %s with helper\n",
  498. newname);
  499. adreno_gpu->fwloc = FW_LOCATION_HELPER;
  500. goto out;
  501. } else if (adreno_gpu->fwloc != FW_LOCATION_UNKNOWN) {
  502. DRM_DEV_ERROR(drm->dev, "failed to load %s: %d\n",
  503. newname, ret);
  504. fw = ERR_PTR(ret);
  505. goto out;
  506. }
  507. }
  508. DRM_DEV_ERROR(drm->dev, "failed to load %s\n", fwname);
  509. fw = ERR_PTR(-ENOENT);
  510. out:
  511. kfree(newname);
  512. return fw;
  513. }
  514. int adreno_load_fw(struct adreno_gpu *adreno_gpu)
  515. {
  516. int i;
  517. for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++) {
  518. const struct firmware *fw;
  519. if (!adreno_gpu->info->fw[i])
  520. continue;
  521. /* Skip loading GMU firmware with GMU Wrapper */
  522. if (adreno_has_gmu_wrapper(adreno_gpu) && i == ADRENO_FW_GMU)
  523. continue;
  524. /* Skip if the firmware has already been loaded */
  525. if (adreno_gpu->fw[i])
  526. continue;
  527. fw = adreno_request_fw(adreno_gpu, adreno_gpu->info->fw[i]);
  528. if (IS_ERR(fw))
  529. return PTR_ERR(fw);
  530. adreno_gpu->fw[i] = fw;
  531. }
  532. return 0;
  533. }
  534. struct drm_gem_object *adreno_fw_create_bo(struct msm_gpu *gpu,
  535. const struct firmware *fw, u64 *iova)
  536. {
  537. struct drm_gem_object *bo;
  538. void *ptr;
  539. ptr = msm_gem_kernel_new(gpu->dev, fw->size - 4,
  540. MSM_BO_WC | MSM_BO_GPU_READONLY, gpu->vm, &bo, iova);
  541. if (IS_ERR(ptr))
  542. return ERR_CAST(ptr);
  543. memcpy(ptr, &fw->data[4], fw->size - 4);
  544. msm_gem_put_vaddr(bo);
  545. return bo;
  546. }
  547. int adreno_hw_init(struct msm_gpu *gpu)
  548. {
  549. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  550. int ret;
  551. VERB("%s", gpu->name);
  552. if (adreno_gpu->info->family >= ADRENO_6XX_GEN1 &&
  553. qcom_scm_set_gpu_smmu_aperture_is_available()) {
  554. /* We currently always use context bank 0, so hard code this */
  555. ret = qcom_scm_set_gpu_smmu_aperture(0);
  556. if (ret)
  557. DRM_DEV_ERROR(gpu->dev->dev, "unable to set SMMU aperture: %d\n", ret);
  558. }
  559. for (int i = 0; i < gpu->nr_rings; i++) {
  560. struct msm_ringbuffer *ring = gpu->rb[i];
  561. if (!ring)
  562. continue;
  563. ring->cur = ring->start;
  564. ring->next = ring->start;
  565. ring->memptrs->rptr = 0;
  566. ring->memptrs->bv_fence = ring->fctx->completed_fence;
  567. /* Detect and clean up an impossible fence, ie. if GPU managed
  568. * to scribble something invalid, we don't want that to confuse
  569. * us into mistakingly believing that submits have completed.
  570. */
  571. if (fence_before(ring->fctx->last_fence, ring->memptrs->fence)) {
  572. ring->memptrs->fence = ring->fctx->last_fence;
  573. }
  574. }
  575. return 0;
  576. }
  577. /* Use this helper to read rptr, since a430 doesn't update rptr in memory */
  578. static uint32_t get_rptr(struct adreno_gpu *adreno_gpu,
  579. struct msm_ringbuffer *ring)
  580. {
  581. struct msm_gpu *gpu = &adreno_gpu->base;
  582. return gpu->funcs->get_rptr(gpu, ring);
  583. }
  584. struct msm_ringbuffer *adreno_active_ring(struct msm_gpu *gpu)
  585. {
  586. return gpu->rb[0];
  587. }
  588. void adreno_recover(struct msm_gpu *gpu)
  589. {
  590. struct drm_device *dev = gpu->dev;
  591. int ret;
  592. // XXX pm-runtime?? we *need* the device to be off after this
  593. // so maybe continuing to call ->pm_suspend/resume() is better?
  594. gpu->funcs->pm_suspend(gpu);
  595. gpu->funcs->pm_resume(gpu);
  596. ret = msm_gpu_hw_init(gpu);
  597. if (ret) {
  598. DRM_DEV_ERROR(dev->dev, "gpu hw init failed: %d\n", ret);
  599. /* hmm, oh well? */
  600. }
  601. }
  602. void adreno_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring, u32 reg)
  603. {
  604. uint32_t wptr;
  605. /* Copy the shadow to the actual register */
  606. ring->cur = ring->next;
  607. /*
  608. * Mask wptr value that we calculate to fit in the HW range. This is
  609. * to account for the possibility that the last command fit exactly into
  610. * the ringbuffer and rb->next hasn't wrapped to zero yet
  611. */
  612. wptr = get_wptr(ring);
  613. /* ensure writes to ringbuffer have hit system memory: */
  614. mb();
  615. gpu_write(gpu, reg, wptr);
  616. }
  617. bool adreno_idle(struct msm_gpu *gpu, struct msm_ringbuffer *ring)
  618. {
  619. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  620. uint32_t wptr = get_wptr(ring);
  621. /* wait for CP to drain ringbuffer: */
  622. if (!spin_until(get_rptr(adreno_gpu, ring) == wptr))
  623. return true;
  624. /* TODO maybe we need to reset GPU here to recover from hang? */
  625. DRM_ERROR("%s: timeout waiting to drain ringbuffer %d rptr/wptr = %X/%X\n",
  626. gpu->name, ring->id, get_rptr(adreno_gpu, ring), wptr);
  627. return false;
  628. }
  629. int adreno_gpu_state_get(struct msm_gpu *gpu, struct msm_gpu_state *state)
  630. {
  631. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  632. int i, count = 0;
  633. WARN_ON(!mutex_is_locked(&gpu->lock));
  634. kref_init(&state->ref);
  635. ktime_get_real_ts64(&state->time);
  636. for (i = 0; i < gpu->nr_rings; i++) {
  637. int size = 0, j;
  638. state->ring[i].fence = gpu->rb[i]->memptrs->fence;
  639. state->ring[i].iova = gpu->rb[i]->iova;
  640. state->ring[i].seqno = gpu->rb[i]->fctx->last_fence;
  641. state->ring[i].rptr = get_rptr(adreno_gpu, gpu->rb[i]);
  642. state->ring[i].wptr = get_wptr(gpu->rb[i]);
  643. /* Copy at least 'wptr' dwords of the data */
  644. size = state->ring[i].wptr;
  645. /* After wptr find the last non zero dword to save space */
  646. for (j = state->ring[i].wptr; j < MSM_GPU_RINGBUFFER_SZ >> 2; j++)
  647. if (gpu->rb[i]->start[j])
  648. size = j + 1;
  649. if (size) {
  650. state->ring[i].data = kvmemdup(gpu->rb[i]->start, size << 2, GFP_KERNEL);
  651. if (state->ring[i].data)
  652. state->ring[i].data_size = size << 2;
  653. }
  654. }
  655. /* Some targets prefer to collect their own registers */
  656. if (!adreno_gpu->registers)
  657. return 0;
  658. /* Count the number of registers */
  659. for (i = 0; adreno_gpu->registers[i] != ~0; i += 2)
  660. count += adreno_gpu->registers[i + 1] -
  661. adreno_gpu->registers[i] + 1;
  662. state->registers = kcalloc(count * 2, sizeof(u32), GFP_KERNEL);
  663. if (state->registers) {
  664. int pos = 0;
  665. for (i = 0; adreno_gpu->registers[i] != ~0; i += 2) {
  666. u32 start = adreno_gpu->registers[i];
  667. u32 end = adreno_gpu->registers[i + 1];
  668. u32 addr;
  669. for (addr = start; addr <= end; addr++) {
  670. state->registers[pos++] = addr;
  671. state->registers[pos++] = gpu_read(gpu, addr);
  672. }
  673. }
  674. state->nr_registers = count;
  675. }
  676. return 0;
  677. }
  678. void adreno_gpu_state_destroy(struct msm_gpu_state *state)
  679. {
  680. int i;
  681. for (i = 0; i < ARRAY_SIZE(state->ring); i++)
  682. kvfree(state->ring[i].data);
  683. for (i = 0; state->bos && i < state->nr_bos; i++)
  684. kvfree(state->bos[i].data);
  685. kfree(state->vm_logs);
  686. kfree(state->bos);
  687. kfree(state->comm);
  688. kfree(state->cmd);
  689. kfree(state->registers);
  690. }
  691. static void adreno_gpu_state_kref_destroy(struct kref *kref)
  692. {
  693. struct msm_gpu_state *state = container_of(kref,
  694. struct msm_gpu_state, ref);
  695. adreno_gpu_state_destroy(state);
  696. kfree(state);
  697. }
  698. int adreno_gpu_state_put(struct msm_gpu_state *state)
  699. {
  700. if (IS_ERR_OR_NULL(state))
  701. return 1;
  702. return kref_put(&state->ref, adreno_gpu_state_kref_destroy);
  703. }
  704. #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP)
  705. static char *adreno_gpu_ascii85_encode(u32 *src, size_t len)
  706. {
  707. void *buf;
  708. size_t buf_itr = 0, buffer_size;
  709. char out[ASCII85_BUFSZ];
  710. long l;
  711. int i;
  712. if (!src || !len)
  713. return NULL;
  714. l = ascii85_encode_len(len);
  715. /*
  716. * Ascii85 outputs either a 5 byte string or a 1 byte string. So we
  717. * account for the worst case of 5 bytes per dword plus the 1 for '\0'
  718. */
  719. buffer_size = (l * 5) + 1;
  720. buf = kvmalloc(buffer_size, GFP_KERNEL);
  721. if (!buf)
  722. return NULL;
  723. for (i = 0; i < l; i++)
  724. buf_itr += scnprintf(buf + buf_itr, buffer_size - buf_itr, "%s",
  725. ascii85_encode(src[i], out));
  726. return buf;
  727. }
  728. /* len is expected to be in bytes
  729. *
  730. * WARNING: *ptr should be allocated with kvmalloc or friends. It can be free'd
  731. * with kvfree() and replaced with a newly kvmalloc'd buffer on the first call
  732. * when the unencoded raw data is encoded
  733. */
  734. void adreno_show_object(struct drm_printer *p, void **ptr, int len,
  735. bool *encoded)
  736. {
  737. if (!*ptr || !len)
  738. return;
  739. if (!*encoded) {
  740. long datalen, i;
  741. u32 *buf = *ptr;
  742. /*
  743. * Only dump the non-zero part of the buffer - rarely will
  744. * any data completely fill the entire allocated size of
  745. * the buffer.
  746. */
  747. for (datalen = 0, i = 0; i < len >> 2; i++)
  748. if (buf[i])
  749. datalen = ((i + 1) << 2);
  750. /*
  751. * If we reach here, then the originally captured binary buffer
  752. * will be replaced with the ascii85 encoded string
  753. */
  754. *ptr = adreno_gpu_ascii85_encode(buf, datalen);
  755. kvfree(buf);
  756. *encoded = true;
  757. }
  758. if (!*ptr)
  759. return;
  760. drm_puts(p, " data: !!ascii85 |\n");
  761. drm_puts(p, " ");
  762. drm_puts(p, *ptr);
  763. drm_puts(p, "\n");
  764. }
  765. void adreno_show(struct msm_gpu *gpu, struct msm_gpu_state *state,
  766. struct drm_printer *p)
  767. {
  768. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  769. int i;
  770. if (IS_ERR_OR_NULL(state))
  771. return;
  772. drm_printf(p, "revision: %u (%"ADRENO_CHIPID_FMT")\n",
  773. adreno_gpu->info->revn,
  774. ADRENO_CHIPID_ARGS(adreno_gpu->chip_id));
  775. /*
  776. * If this is state collected due to iova fault, so fault related info
  777. *
  778. * TTBR0 would not be zero, so this is a good way to distinguish
  779. */
  780. if (state->fault_info.ttbr0) {
  781. const struct msm_gpu_fault_info *info = &state->fault_info;
  782. drm_puts(p, "fault-info:\n");
  783. drm_printf(p, " - ttbr0=%.16llx\n", info->ttbr0);
  784. drm_printf(p, " - iova=%.16lx\n", info->iova);
  785. drm_printf(p, " - dir=%s\n", info->flags & IOMMU_FAULT_WRITE ? "WRITE" : "READ");
  786. drm_printf(p, " - type=%s\n", info->type);
  787. drm_printf(p, " - source=%s\n", info->block);
  788. /* Information extracted from what we think are the current
  789. * pgtables. Hopefully the TTBR0 matches what we've extracted
  790. * from the SMMU registers in smmu_info!
  791. */
  792. drm_puts(p, "pgtable-fault-info:\n");
  793. drm_printf(p, " - ttbr0: %.16llx\n", (u64)info->pgtbl_ttbr0);
  794. drm_printf(p, " - asid: %d\n", info->asid);
  795. drm_printf(p, " - ptes: %.16llx %.16llx %.16llx %.16llx\n",
  796. info->ptes[0], info->ptes[1], info->ptes[2], info->ptes[3]);
  797. }
  798. if (state->vm_logs) {
  799. drm_puts(p, "vm-log:\n");
  800. for (i = 0; i < state->nr_vm_logs; i++) {
  801. struct msm_gem_vm_log_entry *e = &state->vm_logs[i];
  802. drm_printf(p, " - %s:%d: 0x%016llx-0x%016llx\n",
  803. e->op, e->queue_id, e->iova,
  804. e->iova + e->range);
  805. }
  806. }
  807. drm_printf(p, "rbbm-status: 0x%08x\n", state->rbbm_status);
  808. drm_puts(p, "ringbuffer:\n");
  809. for (i = 0; i < gpu->nr_rings; i++) {
  810. drm_printf(p, " - id: %d\n", i);
  811. drm_printf(p, " iova: 0x%016llx\n", state->ring[i].iova);
  812. drm_printf(p, " last-fence: %u\n", state->ring[i].seqno);
  813. drm_printf(p, " retired-fence: %u\n", state->ring[i].fence);
  814. drm_printf(p, " rptr: %u\n", state->ring[i].rptr);
  815. drm_printf(p, " wptr: %u\n", state->ring[i].wptr);
  816. drm_printf(p, " size: %u\n", MSM_GPU_RINGBUFFER_SZ);
  817. adreno_show_object(p, &state->ring[i].data,
  818. state->ring[i].data_size, &state->ring[i].encoded);
  819. }
  820. if (state->bos) {
  821. drm_puts(p, "bos:\n");
  822. for (i = 0; i < state->nr_bos; i++) {
  823. drm_printf(p, " - iova: 0x%016llx\n",
  824. state->bos[i].iova);
  825. drm_printf(p, " size: %zd\n", state->bos[i].size);
  826. drm_printf(p, " flags: 0x%x\n", state->bos[i].flags);
  827. drm_printf(p, " name: %-32s\n", state->bos[i].name);
  828. adreno_show_object(p, &state->bos[i].data,
  829. state->bos[i].size, &state->bos[i].encoded);
  830. }
  831. }
  832. if (state->nr_registers) {
  833. drm_puts(p, "registers:\n");
  834. for (i = 0; i < state->nr_registers; i++) {
  835. drm_printf(p, " - { offset: 0x%04x, value: 0x%08x }\n",
  836. state->registers[i * 2] << 2,
  837. state->registers[(i * 2) + 1]);
  838. }
  839. }
  840. }
  841. #endif
  842. /* Dump common gpu status and scratch registers on any hang, to make
  843. * the hangcheck logs more useful. The scratch registers seem always
  844. * safe to read when GPU has hung (unlike some other regs, depending
  845. * on how the GPU hung), and they are useful to match up to cmdstream
  846. * dumps when debugging hangs:
  847. */
  848. void adreno_dump_info(struct msm_gpu *gpu)
  849. {
  850. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  851. int i;
  852. printk("revision: %u (%"ADRENO_CHIPID_FMT")\n",
  853. adreno_gpu->info->revn,
  854. ADRENO_CHIPID_ARGS(adreno_gpu->chip_id));
  855. for (i = 0; i < gpu->nr_rings; i++) {
  856. struct msm_ringbuffer *ring = gpu->rb[i];
  857. printk("rb %d: fence: %d/%d\n", i,
  858. ring->memptrs->fence,
  859. ring->fctx->last_fence);
  860. printk("rptr: %d\n", get_rptr(adreno_gpu, ring));
  861. printk("rb wptr: %d\n", get_wptr(ring));
  862. }
  863. }
  864. /* would be nice to not have to duplicate the _show() stuff with printk(): */
  865. void adreno_dump(struct msm_gpu *gpu)
  866. {
  867. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  868. int i;
  869. if (!adreno_gpu->registers)
  870. return;
  871. /* dump these out in a form that can be parsed by demsm: */
  872. printk("IO:region %s 00000000 00020000\n", gpu->name);
  873. for (i = 0; adreno_gpu->registers[i] != ~0; i += 2) {
  874. uint32_t start = adreno_gpu->registers[i];
  875. uint32_t end = adreno_gpu->registers[i+1];
  876. uint32_t addr;
  877. for (addr = start; addr <= end; addr++) {
  878. uint32_t val = gpu_read(gpu, addr);
  879. printk("IO:R %08x %08x\n", addr<<2, val);
  880. }
  881. }
  882. }
  883. static uint32_t ring_freewords(struct msm_ringbuffer *ring)
  884. {
  885. struct adreno_gpu *adreno_gpu = to_adreno_gpu(ring->gpu);
  886. uint32_t size = MSM_GPU_RINGBUFFER_SZ >> 2;
  887. /* Use ring->next to calculate free size */
  888. uint32_t wptr = ring->next - ring->start;
  889. uint32_t rptr = get_rptr(adreno_gpu, ring);
  890. return (rptr + (size - 1) - wptr) % size;
  891. }
  892. void adreno_wait_ring(struct msm_ringbuffer *ring, uint32_t ndwords)
  893. {
  894. if (spin_until(ring_freewords(ring) >= ndwords))
  895. DRM_DEV_ERROR(ring->gpu->dev->dev,
  896. "timeout waiting for space in ringbuffer %d\n",
  897. ring->id);
  898. }
  899. static int adreno_get_pwrlevels(struct device *dev,
  900. struct msm_gpu *gpu)
  901. {
  902. struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
  903. unsigned long freq = ULONG_MAX;
  904. struct dev_pm_opp *opp;
  905. int ret;
  906. gpu->fast_rate = 0;
  907. /* devm_pm_opp_of_add_table may error out but will still create an OPP table */
  908. ret = devm_pm_opp_of_add_table(dev);
  909. if (ret == -ENODEV) {
  910. /* Special cases for ancient hw with ancient DT bindings */
  911. if (adreno_is_a2xx(adreno_gpu)) {
  912. dev_warn(dev, "Unable to find the OPP table. Falling back to 200 MHz.\n");
  913. dev_pm_opp_add(dev, 200000000, 0);
  914. } else if (adreno_is_a320(adreno_gpu)) {
  915. dev_warn(dev, "Unable to find the OPP table. Falling back to 450 MHz.\n");
  916. dev_pm_opp_add(dev, 450000000, 0);
  917. } else {
  918. DRM_DEV_ERROR(dev, "Unable to find the OPP table\n");
  919. return -ENODEV;
  920. }
  921. } else if (ret) {
  922. DRM_DEV_ERROR(dev, "Unable to set the OPP table\n");
  923. return ret;
  924. }
  925. /* Find the fastest defined rate */
  926. opp = dev_pm_opp_find_freq_floor(dev, &freq);
  927. if (IS_ERR(opp))
  928. return PTR_ERR(opp);
  929. gpu->fast_rate = freq;
  930. dev_pm_opp_put(opp);
  931. DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate);
  932. return 0;
  933. }
  934. int adreno_gpu_ocmem_init(struct device *dev, struct adreno_gpu *adreno_gpu,
  935. struct adreno_ocmem *adreno_ocmem)
  936. {
  937. struct ocmem_buf *ocmem_hdl;
  938. struct ocmem *ocmem;
  939. ocmem = of_get_ocmem(dev);
  940. if (IS_ERR(ocmem)) {
  941. if (PTR_ERR(ocmem) == -ENODEV) {
  942. /*
  943. * Return success since either the ocmem property was
  944. * not specified in device tree, or ocmem support is
  945. * not compiled into the kernel.
  946. */
  947. return 0;
  948. }
  949. return PTR_ERR(ocmem);
  950. }
  951. ocmem_hdl = ocmem_allocate(ocmem, OCMEM_GRAPHICS, adreno_gpu->info->gmem);
  952. if (IS_ERR(ocmem_hdl))
  953. return PTR_ERR(ocmem_hdl);
  954. adreno_ocmem->ocmem = ocmem;
  955. adreno_ocmem->base = ocmem_hdl->addr;
  956. adreno_ocmem->hdl = ocmem_hdl;
  957. if (WARN_ON(ocmem_hdl->len != adreno_gpu->info->gmem))
  958. return -ENOMEM;
  959. return 0;
  960. }
  961. void adreno_gpu_ocmem_cleanup(struct adreno_ocmem *adreno_ocmem)
  962. {
  963. if (adreno_ocmem && adreno_ocmem->base)
  964. ocmem_free(adreno_ocmem->ocmem, OCMEM_GRAPHICS,
  965. adreno_ocmem->hdl);
  966. }
  967. int adreno_read_speedbin(struct device *dev, u32 *speedbin)
  968. {
  969. return nvmem_cell_read_variable_le_u32(dev, "speed_bin", speedbin);
  970. }
  971. int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
  972. struct adreno_gpu *adreno_gpu,
  973. const struct adreno_gpu_funcs *funcs, int nr_rings)
  974. {
  975. struct device *dev = &pdev->dev;
  976. struct adreno_platform_config *config = dev->platform_data;
  977. struct msm_gpu_config adreno_gpu_config = { 0 };
  978. struct msm_gpu *gpu = &adreno_gpu->base;
  979. const char *gpu_name;
  980. u32 speedbin;
  981. int ret;
  982. adreno_gpu->funcs = funcs;
  983. adreno_gpu->info = config->info;
  984. adreno_gpu->chip_id = config->chip_id;
  985. gpu->allow_relocs = config->info->family < ADRENO_6XX_GEN1;
  986. gpu->pdev = pdev;
  987. /* Only handle the core clock when GMU is not in use (or is absent). */
  988. if (adreno_has_gmu_wrapper(adreno_gpu) ||
  989. adreno_has_rgmu(adreno_gpu) ||
  990. adreno_gpu->info->family < ADRENO_6XX_GEN1) {
  991. /*
  992. * This can only be done before devm_pm_opp_of_add_table(), or
  993. * dev_pm_opp_set_config() will WARN_ON()
  994. */
  995. if (IS_ERR(devm_clk_get(dev, "core"))) {
  996. /*
  997. * If "core" is absent, go for the legacy clock name.
  998. * If we got this far in probing, it's a given one of
  999. * them exists.
  1000. */
  1001. devm_pm_opp_set_clkname(dev, "core_clk");
  1002. } else
  1003. devm_pm_opp_set_clkname(dev, "core");
  1004. }
  1005. if (adreno_read_speedbin(dev, &speedbin) || !speedbin)
  1006. speedbin = 0xffff;
  1007. adreno_gpu->speedbin = (uint16_t) (0xffff & speedbin);
  1008. gpu_name = devm_kasprintf(dev, GFP_KERNEL, "%"ADRENO_CHIPID_FMT,
  1009. ADRENO_CHIPID_ARGS(config->chip_id));
  1010. if (!gpu_name)
  1011. return -ENOMEM;
  1012. adreno_gpu_config.ioname = "kgsl_3d0_reg_memory";
  1013. adreno_gpu_config.nr_rings = nr_rings;
  1014. ret = adreno_get_pwrlevels(dev, gpu);
  1015. if (ret)
  1016. return ret;
  1017. init_completion(&adreno_gpu->fault_coredump_done);
  1018. complete_all(&adreno_gpu->fault_coredump_done);
  1019. pm_runtime_set_autosuspend_delay(dev,
  1020. adreno_gpu->info->inactive_period);
  1021. pm_runtime_use_autosuspend(dev);
  1022. return msm_gpu_init(drm, pdev, &adreno_gpu->base, &funcs->base,
  1023. gpu_name, &adreno_gpu_config);
  1024. }
  1025. void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
  1026. {
  1027. struct msm_gpu *gpu = &adreno_gpu->base;
  1028. struct msm_drm_private *priv = gpu->dev ? gpu->dev->dev_private : NULL;
  1029. unsigned int i;
  1030. for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++)
  1031. release_firmware(adreno_gpu->fw[i]);
  1032. if (priv && pm_runtime_enabled(&priv->gpu_pdev->dev))
  1033. pm_runtime_disable(&priv->gpu_pdev->dev);
  1034. msm_gpu_cleanup(&adreno_gpu->base);
  1035. }