pvr_fw.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502
  1. // SPDX-License-Identifier: GPL-2.0-only OR MIT
  2. /* Copyright (c) 2023 Imagination Technologies Ltd. */
  3. #include "pvr_ccb.h"
  4. #include "pvr_device.h"
  5. #include "pvr_device_info.h"
  6. #include "pvr_fw.h"
  7. #include "pvr_fw_info.h"
  8. #include "pvr_fw_startstop.h"
  9. #include "pvr_fw_trace.h"
  10. #include "pvr_gem.h"
  11. #include "pvr_power.h"
  12. #include "pvr_rogue_fwif_dev_info.h"
  13. #include "pvr_rogue_heap_config.h"
  14. #include "pvr_vm.h"
  15. #include <drm/drm_drv.h>
  16. #include <drm/drm_managed.h>
  17. #include <drm/drm_mm.h>
  18. #include <linux/clk.h>
  19. #include <linux/firmware.h>
  20. #include <linux/math.h>
  21. #include <linux/minmax.h>
  22. #include <linux/sizes.h>
  23. #define FW_MAX_SUPPORTED_MAJOR_VERSION 1
  24. #define FW_BOOT_TIMEOUT_USEC 5000000
  25. /* Config heap occupies top 192k of the firmware heap. */
  26. #define PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY SZ_64K
  27. #define PVR_ROGUE_FW_CONFIG_HEAP_SIZE (3 * PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY)
  28. /* Main firmware allocations should come from the remainder of the heap. */
  29. #define PVR_ROGUE_FW_MAIN_HEAP_BASE ROGUE_FW_HEAP_BASE
  30. /* Offsets from start of configuration area of FW heap. */
  31. #define PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET 0
  32. #define PVR_ROGUE_FWIF_OSINIT_OFFSET \
  33. (PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET + PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY)
  34. #define PVR_ROGUE_FWIF_SYSINIT_OFFSET \
  35. (PVR_ROGUE_FWIF_OSINIT_OFFSET + PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY)
  36. #define PVR_ROGUE_FAULT_PAGE_SIZE SZ_4K
  37. #define PVR_SYNC_OBJ_SIZE sizeof(u32)
  38. const struct pvr_fw_layout_entry *
  39. pvr_fw_find_layout_entry(struct pvr_device *pvr_dev, enum pvr_fw_section_id id)
  40. {
  41. const struct pvr_fw_layout_entry *layout_entries = pvr_dev->fw_dev.layout_entries;
  42. u32 num_layout_entries = pvr_dev->fw_dev.header->layout_entry_num;
  43. u32 entry;
  44. for (entry = 0; entry < num_layout_entries; entry++) {
  45. if (layout_entries[entry].id == id)
  46. return &layout_entries[entry];
  47. }
  48. return NULL;
  49. }
  50. static const struct pvr_fw_layout_entry *
  51. pvr_fw_find_private_data(struct pvr_device *pvr_dev)
  52. {
  53. const struct pvr_fw_layout_entry *layout_entries = pvr_dev->fw_dev.layout_entries;
  54. u32 num_layout_entries = pvr_dev->fw_dev.header->layout_entry_num;
  55. u32 entry;
  56. for (entry = 0; entry < num_layout_entries; entry++) {
  57. if (layout_entries[entry].id == META_PRIVATE_DATA ||
  58. layout_entries[entry].id == MIPS_PRIVATE_DATA ||
  59. layout_entries[entry].id == RISCV_PRIVATE_DATA)
  60. return &layout_entries[entry];
  61. }
  62. return NULL;
  63. }
  64. #define DEV_INFO_MASK_SIZE(x) DIV_ROUND_UP(x, 64)
  65. /**
  66. * pvr_fw_validate() - Parse firmware header and check compatibility
  67. * @pvr_dev: Device pointer.
  68. *
  69. * Returns:
  70. * * 0 on success, or
  71. * * -EINVAL if firmware is incompatible.
  72. */
  73. static int
  74. pvr_fw_validate(struct pvr_device *pvr_dev)
  75. {
  76. struct drm_device *drm_dev = from_pvr_device(pvr_dev);
  77. const struct firmware *firmware = pvr_dev->fw_dev.firmware;
  78. const struct pvr_fw_layout_entry *layout_entries;
  79. const struct pvr_fw_info_header *header;
  80. const u8 *fw = firmware->data;
  81. u32 fw_offset = firmware->size - SZ_4K;
  82. u32 layout_table_size;
  83. u32 entry;
  84. if (firmware->size < SZ_4K || (firmware->size % FW_BLOCK_SIZE))
  85. return -EINVAL;
  86. header = (const struct pvr_fw_info_header *)&fw[fw_offset];
  87. if (header->info_version != PVR_FW_INFO_VERSION) {
  88. drm_err(drm_dev, "Unsupported fw info version %u\n",
  89. header->info_version);
  90. return -EINVAL;
  91. }
  92. if (header->header_len != sizeof(struct pvr_fw_info_header) ||
  93. header->layout_entry_size != sizeof(struct pvr_fw_layout_entry) ||
  94. header->layout_entry_num > PVR_FW_INFO_MAX_NUM_ENTRIES) {
  95. drm_err(drm_dev, "FW info format mismatch\n");
  96. return -EINVAL;
  97. }
  98. if (!(header->flags & PVR_FW_FLAGS_OPEN_SOURCE) ||
  99. header->fw_version_major > FW_MAX_SUPPORTED_MAJOR_VERSION ||
  100. header->fw_version_major == 0) {
  101. drm_err(drm_dev, "Unsupported FW version %u.%u (build: %u%s)\n",
  102. header->fw_version_major, header->fw_version_minor,
  103. header->fw_version_build,
  104. (header->flags & PVR_FW_FLAGS_OPEN_SOURCE) ? " OS" : "");
  105. return -EINVAL;
  106. }
  107. if (pvr_gpu_id_to_packed_bvnc(&pvr_dev->gpu_id) != header->bvnc) {
  108. struct pvr_gpu_id fw_gpu_id;
  109. packed_bvnc_to_pvr_gpu_id(header->bvnc, &fw_gpu_id);
  110. drm_err(drm_dev, "FW built for incorrect GPU ID %i.%i.%i.%i (expected %i.%i.%i.%i)\n",
  111. fw_gpu_id.b, fw_gpu_id.v, fw_gpu_id.n, fw_gpu_id.c,
  112. pvr_dev->gpu_id.b, pvr_dev->gpu_id.v, pvr_dev->gpu_id.n, pvr_dev->gpu_id.c);
  113. return -EINVAL;
  114. }
  115. fw_offset += header->header_len;
  116. layout_table_size =
  117. header->layout_entry_size * header->layout_entry_num;
  118. if ((fw_offset + layout_table_size) > firmware->size)
  119. return -EINVAL;
  120. layout_entries = (const struct pvr_fw_layout_entry *)&fw[fw_offset];
  121. for (entry = 0; entry < header->layout_entry_num; entry++) {
  122. u32 start_addr = layout_entries[entry].base_addr;
  123. u32 end_addr = start_addr + layout_entries[entry].alloc_size;
  124. if (start_addr >= end_addr)
  125. return -EINVAL;
  126. }
  127. fw_offset = (firmware->size - SZ_4K) - header->device_info_size;
  128. drm_info(drm_dev, "FW version v%u.%u (build %u OS)\n", header->fw_version_major,
  129. header->fw_version_minor, header->fw_version_build);
  130. pvr_dev->fw_version.major = header->fw_version_major;
  131. pvr_dev->fw_version.minor = header->fw_version_minor;
  132. pvr_dev->fw_dev.header = header;
  133. pvr_dev->fw_dev.layout_entries = layout_entries;
  134. return 0;
  135. }
  136. static int
  137. pvr_fw_get_device_info(struct pvr_device *pvr_dev)
  138. {
  139. const struct firmware *firmware = pvr_dev->fw_dev.firmware;
  140. struct pvr_fw_device_info_header *header;
  141. const u8 *fw = firmware->data;
  142. const u64 *dev_info;
  143. u32 fw_offset;
  144. fw_offset = (firmware->size - SZ_4K) - pvr_dev->fw_dev.header->device_info_size;
  145. header = (struct pvr_fw_device_info_header *)&fw[fw_offset];
  146. dev_info = (u64 *)(header + 1);
  147. pvr_device_info_set_quirks(pvr_dev, dev_info, header->brn_mask_size);
  148. dev_info += header->brn_mask_size;
  149. pvr_device_info_set_enhancements(pvr_dev, dev_info, header->ern_mask_size);
  150. dev_info += header->ern_mask_size;
  151. return pvr_device_info_set_features(pvr_dev, dev_info, header->feature_mask_size,
  152. header->feature_param_size);
  153. }
  154. static void
  155. layout_get_sizes(struct pvr_device *pvr_dev)
  156. {
  157. const struct pvr_fw_layout_entry *layout_entries = pvr_dev->fw_dev.layout_entries;
  158. u32 num_layout_entries = pvr_dev->fw_dev.header->layout_entry_num;
  159. struct pvr_fw_mem *fw_mem = &pvr_dev->fw_dev.mem;
  160. fw_mem->code_alloc_size = 0;
  161. fw_mem->data_alloc_size = 0;
  162. fw_mem->core_code_alloc_size = 0;
  163. fw_mem->core_data_alloc_size = 0;
  164. /* Extract section sizes from FW layout table. */
  165. for (u32 entry = 0; entry < num_layout_entries; entry++) {
  166. switch (layout_entries[entry].type) {
  167. case FW_CODE:
  168. fw_mem->code_alloc_size += layout_entries[entry].alloc_size;
  169. break;
  170. case FW_DATA:
  171. fw_mem->data_alloc_size += layout_entries[entry].alloc_size;
  172. break;
  173. case FW_COREMEM_CODE:
  174. fw_mem->core_code_alloc_size +=
  175. layout_entries[entry].alloc_size;
  176. break;
  177. case FW_COREMEM_DATA:
  178. fw_mem->core_data_alloc_size +=
  179. layout_entries[entry].alloc_size;
  180. break;
  181. case NONE:
  182. break;
  183. }
  184. }
  185. }
  186. int
  187. pvr_fw_find_mmu_segment(struct pvr_device *pvr_dev, u32 addr, u32 size, void *fw_code_ptr,
  188. void *fw_data_ptr, void *fw_core_code_ptr, void *fw_core_data_ptr,
  189. void **host_addr_out)
  190. {
  191. const struct pvr_fw_layout_entry *layout_entries = pvr_dev->fw_dev.layout_entries;
  192. u32 num_layout_entries = pvr_dev->fw_dev.header->layout_entry_num;
  193. u32 end_addr = addr + size;
  194. int entry = 0;
  195. /* Ensure requested range is not zero, and size is not causing addr to overflow. */
  196. if (end_addr <= addr)
  197. return -EINVAL;
  198. for (entry = 0; entry < num_layout_entries; entry++) {
  199. u32 entry_start_addr = layout_entries[entry].base_addr;
  200. u32 entry_end_addr = entry_start_addr + layout_entries[entry].alloc_size;
  201. if (addr >= entry_start_addr && addr < entry_end_addr &&
  202. end_addr > entry_start_addr && end_addr <= entry_end_addr) {
  203. switch (layout_entries[entry].type) {
  204. case FW_CODE:
  205. *host_addr_out = fw_code_ptr;
  206. break;
  207. case FW_DATA:
  208. *host_addr_out = fw_data_ptr;
  209. break;
  210. case FW_COREMEM_CODE:
  211. *host_addr_out = fw_core_code_ptr;
  212. break;
  213. case FW_COREMEM_DATA:
  214. *host_addr_out = fw_core_data_ptr;
  215. break;
  216. default:
  217. return -EINVAL;
  218. }
  219. /* Direct Mem write to mapped memory */
  220. addr -= layout_entries[entry].base_addr;
  221. addr += layout_entries[entry].alloc_offset;
  222. /*
  223. * Add offset to pointer to FW allocation only if that
  224. * allocation is available
  225. */
  226. *(u8 **)host_addr_out += addr;
  227. return 0;
  228. }
  229. }
  230. return -EINVAL;
  231. }
  232. static int
  233. pvr_fw_create_fwif_connection_ctl(struct pvr_device *pvr_dev)
  234. {
  235. struct drm_device *drm_dev = from_pvr_device(pvr_dev);
  236. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  237. fw_dev->fwif_connection_ctl =
  238. pvr_fw_object_create_and_map_offset(pvr_dev,
  239. fw_dev->fw_heap_info.config_offset +
  240. PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET,
  241. sizeof(*fw_dev->fwif_connection_ctl),
  242. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  243. NULL, NULL,
  244. &fw_dev->mem.fwif_connection_ctl_obj);
  245. if (IS_ERR(fw_dev->fwif_connection_ctl)) {
  246. drm_err(drm_dev,
  247. "Unable to allocate FWIF connection control memory\n");
  248. return PTR_ERR(fw_dev->fwif_connection_ctl);
  249. }
  250. return 0;
  251. }
  252. static void
  253. pvr_fw_fini_fwif_connection_ctl(struct pvr_device *pvr_dev)
  254. {
  255. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  256. pvr_fw_object_unmap_and_destroy(fw_dev->mem.fwif_connection_ctl_obj);
  257. }
  258. static void
  259. fw_osinit_init(void *cpu_ptr, void *priv)
  260. {
  261. struct rogue_fwif_osinit *fwif_osinit = cpu_ptr;
  262. struct pvr_device *pvr_dev = priv;
  263. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  264. struct pvr_fw_mem *fw_mem = &fw_dev->mem;
  265. fwif_osinit->kernel_ccbctl_fw_addr = pvr_dev->kccb.ccb.ctrl_fw_addr;
  266. fwif_osinit->kernel_ccb_fw_addr = pvr_dev->kccb.ccb.ccb_fw_addr;
  267. pvr_fw_object_get_fw_addr(pvr_dev->kccb.rtn_obj,
  268. &fwif_osinit->kernel_ccb_rtn_slots_fw_addr);
  269. fwif_osinit->firmware_ccbctl_fw_addr = pvr_dev->fwccb.ctrl_fw_addr;
  270. fwif_osinit->firmware_ccb_fw_addr = pvr_dev->fwccb.ccb_fw_addr;
  271. fwif_osinit->work_est_firmware_ccbctl_fw_addr = 0;
  272. fwif_osinit->work_est_firmware_ccb_fw_addr = 0;
  273. pvr_fw_object_get_fw_addr(fw_mem->hwrinfobuf_obj,
  274. &fwif_osinit->rogue_fwif_hwr_info_buf_ctl_fw_addr);
  275. pvr_fw_object_get_fw_addr(fw_mem->osdata_obj, &fwif_osinit->fw_os_data_fw_addr);
  276. fwif_osinit->hwr_debug_dump_limit = 0;
  277. rogue_fwif_compchecks_bvnc_init(&fwif_osinit->rogue_comp_checks.hw_bvnc);
  278. rogue_fwif_compchecks_bvnc_init(&fwif_osinit->rogue_comp_checks.fw_bvnc);
  279. }
  280. static void
  281. fw_osdata_init(void *cpu_ptr, void *priv)
  282. {
  283. struct rogue_fwif_osdata *fwif_osdata = cpu_ptr;
  284. struct pvr_device *pvr_dev = priv;
  285. struct pvr_fw_mem *fw_mem = &pvr_dev->fw_dev.mem;
  286. pvr_fw_object_get_fw_addr(fw_mem->power_sync_obj, &fwif_osdata->power_sync_fw_addr);
  287. }
  288. static void
  289. fw_fault_page_init(void *cpu_ptr, void *priv)
  290. {
  291. u32 *fault_page = cpu_ptr;
  292. for (int i = 0; i < PVR_ROGUE_FAULT_PAGE_SIZE / sizeof(*fault_page); i++)
  293. fault_page[i] = 0xdeadbee0;
  294. }
  295. static void
  296. fw_sysinit_init(void *cpu_ptr, void *priv)
  297. {
  298. struct rogue_fwif_sysinit *fwif_sysinit = cpu_ptr;
  299. struct pvr_device *pvr_dev = priv;
  300. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  301. struct pvr_fw_mem *fw_mem = &fw_dev->mem;
  302. dma_addr_t fault_dma_addr = 0;
  303. u32 clock_speed_hz = clk_get_rate(pvr_dev->core_clk);
  304. WARN_ON(!clock_speed_hz);
  305. WARN_ON(pvr_fw_object_get_dma_addr(fw_mem->fault_page_obj, 0, &fault_dma_addr));
  306. fwif_sysinit->fault_phys_addr = (u64)fault_dma_addr;
  307. fwif_sysinit->pds_exec_base = ROGUE_PDSCODEDATA_HEAP_BASE;
  308. fwif_sysinit->usc_exec_base = ROGUE_USCCODE_HEAP_BASE;
  309. pvr_fw_object_get_fw_addr(fw_mem->runtime_cfg_obj, &fwif_sysinit->runtime_cfg_fw_addr);
  310. pvr_fw_object_get_fw_addr(fw_dev->fw_trace.tracebuf_ctrl_obj,
  311. &fwif_sysinit->trace_buf_ctl_fw_addr);
  312. pvr_fw_object_get_fw_addr(fw_mem->sysdata_obj, &fwif_sysinit->fw_sys_data_fw_addr);
  313. pvr_fw_object_get_fw_addr(fw_mem->gpu_util_fwcb_obj,
  314. &fwif_sysinit->gpu_util_fw_cb_ctl_fw_addr);
  315. if (fw_mem->core_data_obj) {
  316. pvr_fw_object_get_fw_addr(fw_mem->core_data_obj,
  317. &fwif_sysinit->coremem_data_store.fw_addr);
  318. }
  319. /* Currently unsupported. */
  320. fwif_sysinit->counter_dump_ctl.buffer_fw_addr = 0;
  321. fwif_sysinit->counter_dump_ctl.size_in_dwords = 0;
  322. /* Skip alignment checks. */
  323. fwif_sysinit->align_checks = 0;
  324. fwif_sysinit->filter_flags = 0;
  325. fwif_sysinit->hw_perf_filter = 0;
  326. fwif_sysinit->firmware_perf = FW_PERF_CONF_NONE;
  327. fwif_sysinit->initial_core_clock_speed = clock_speed_hz;
  328. fwif_sysinit->active_pm_latency_ms = 0;
  329. fwif_sysinit->gpio_validation_mode = ROGUE_FWIF_GPIO_VAL_OFF;
  330. fwif_sysinit->firmware_started = false;
  331. fwif_sysinit->marker_val = 1;
  332. memset(&fwif_sysinit->bvnc_km_feature_flags, 0,
  333. sizeof(fwif_sysinit->bvnc_km_feature_flags));
  334. }
  335. #define ROGUE_FWIF_SLC_MIN_SIZE_FOR_DM_OVERLAP_KB 4
  336. static void
  337. fw_sysdata_init(void *cpu_ptr, void *priv)
  338. {
  339. struct rogue_fwif_sysdata *fwif_sysdata = cpu_ptr;
  340. struct pvr_device *pvr_dev = priv;
  341. u32 slc_size_in_kilobytes = 0;
  342. u32 config_flags = 0;
  343. WARN_ON(PVR_FEATURE_VALUE(pvr_dev, slc_size_in_kilobytes, &slc_size_in_kilobytes));
  344. if (slc_size_in_kilobytes < ROGUE_FWIF_SLC_MIN_SIZE_FOR_DM_OVERLAP_KB)
  345. config_flags |= ROGUE_FWIF_INICFG_DISABLE_DM_OVERLAP;
  346. fwif_sysdata->config_flags = config_flags;
  347. }
  348. static void
  349. fw_runtime_cfg_init(void *cpu_ptr, void *priv)
  350. {
  351. struct rogue_fwif_runtime_cfg *runtime_cfg = cpu_ptr;
  352. struct pvr_device *pvr_dev = priv;
  353. u32 clock_speed_hz = clk_get_rate(pvr_dev->core_clk);
  354. WARN_ON(!clock_speed_hz);
  355. runtime_cfg->core_clock_speed = clock_speed_hz;
  356. runtime_cfg->active_pm_latency_ms = 0;
  357. runtime_cfg->active_pm_latency_persistant = true;
  358. WARN_ON(PVR_FEATURE_VALUE(pvr_dev, num_clusters,
  359. &runtime_cfg->default_dusts_num_init) != 0);
  360. }
  361. static void
  362. fw_gpu_util_fwcb_init(void *cpu_ptr, void *priv)
  363. {
  364. struct rogue_fwif_gpu_util_fwcb *gpu_util_fwcb = cpu_ptr;
  365. gpu_util_fwcb->last_word = PVR_FWIF_GPU_UTIL_STATE_IDLE;
  366. }
  367. static int
  368. pvr_fw_create_structures(struct pvr_device *pvr_dev)
  369. {
  370. struct drm_device *drm_dev = from_pvr_device(pvr_dev);
  371. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  372. struct pvr_fw_mem *fw_mem = &fw_dev->mem;
  373. int err;
  374. fw_dev->power_sync = pvr_fw_object_create_and_map(pvr_dev, sizeof(*fw_dev->power_sync),
  375. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  376. NULL, NULL, &fw_mem->power_sync_obj);
  377. if (IS_ERR(fw_dev->power_sync)) {
  378. drm_err(drm_dev, "Unable to allocate FW power_sync structure\n");
  379. return PTR_ERR(fw_dev->power_sync);
  380. }
  381. fw_dev->hwrinfobuf = pvr_fw_object_create_and_map(pvr_dev, sizeof(*fw_dev->hwrinfobuf),
  382. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  383. NULL, NULL, &fw_mem->hwrinfobuf_obj);
  384. if (IS_ERR(fw_dev->hwrinfobuf)) {
  385. drm_err(drm_dev,
  386. "Unable to allocate FW hwrinfobuf structure\n");
  387. err = PTR_ERR(fw_dev->hwrinfobuf);
  388. goto err_release_power_sync;
  389. }
  390. err = pvr_fw_object_create(pvr_dev, PVR_SYNC_OBJ_SIZE,
  391. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  392. NULL, NULL, &fw_mem->mmucache_sync_obj);
  393. if (err) {
  394. drm_err(drm_dev,
  395. "Unable to allocate MMU cache sync object\n");
  396. goto err_release_hwrinfobuf;
  397. }
  398. fw_dev->fwif_sysdata = pvr_fw_object_create_and_map(pvr_dev,
  399. sizeof(*fw_dev->fwif_sysdata),
  400. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  401. fw_sysdata_init, pvr_dev,
  402. &fw_mem->sysdata_obj);
  403. if (IS_ERR(fw_dev->fwif_sysdata)) {
  404. drm_err(drm_dev, "Unable to allocate FW SYSDATA structure\n");
  405. err = PTR_ERR(fw_dev->fwif_sysdata);
  406. goto err_release_mmucache_sync_obj;
  407. }
  408. err = pvr_fw_object_create(pvr_dev, PVR_ROGUE_FAULT_PAGE_SIZE,
  409. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  410. fw_fault_page_init, NULL, &fw_mem->fault_page_obj);
  411. if (err) {
  412. drm_err(drm_dev, "Unable to allocate FW fault page\n");
  413. goto err_release_sysdata;
  414. }
  415. err = pvr_fw_object_create(pvr_dev, sizeof(struct rogue_fwif_gpu_util_fwcb),
  416. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  417. fw_gpu_util_fwcb_init, pvr_dev, &fw_mem->gpu_util_fwcb_obj);
  418. if (err) {
  419. drm_err(drm_dev, "Unable to allocate GPU util FWCB\n");
  420. goto err_release_fault_page;
  421. }
  422. err = pvr_fw_object_create(pvr_dev, sizeof(struct rogue_fwif_runtime_cfg),
  423. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  424. fw_runtime_cfg_init, pvr_dev, &fw_mem->runtime_cfg_obj);
  425. if (err) {
  426. drm_err(drm_dev, "Unable to allocate FW runtime config\n");
  427. goto err_release_gpu_util_fwcb;
  428. }
  429. err = pvr_fw_trace_init(pvr_dev);
  430. if (err)
  431. goto err_release_runtime_cfg;
  432. fw_dev->fwif_osdata = pvr_fw_object_create_and_map(pvr_dev,
  433. sizeof(*fw_dev->fwif_osdata),
  434. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  435. fw_osdata_init, pvr_dev,
  436. &fw_mem->osdata_obj);
  437. if (IS_ERR(fw_dev->fwif_osdata)) {
  438. drm_err(drm_dev, "Unable to allocate FW OSDATA structure\n");
  439. err = PTR_ERR(fw_dev->fwif_osdata);
  440. goto err_fw_trace_fini;
  441. }
  442. fw_dev->fwif_osinit =
  443. pvr_fw_object_create_and_map_offset(pvr_dev,
  444. fw_dev->fw_heap_info.config_offset +
  445. PVR_ROGUE_FWIF_OSINIT_OFFSET,
  446. sizeof(*fw_dev->fwif_osinit),
  447. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  448. fw_osinit_init, pvr_dev, &fw_mem->osinit_obj);
  449. if (IS_ERR(fw_dev->fwif_osinit)) {
  450. drm_err(drm_dev, "Unable to allocate FW OSINIT structure\n");
  451. err = PTR_ERR(fw_dev->fwif_osinit);
  452. goto err_release_osdata;
  453. }
  454. fw_dev->fwif_sysinit =
  455. pvr_fw_object_create_and_map_offset(pvr_dev,
  456. fw_dev->fw_heap_info.config_offset +
  457. PVR_ROGUE_FWIF_SYSINIT_OFFSET,
  458. sizeof(*fw_dev->fwif_sysinit),
  459. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  460. fw_sysinit_init, pvr_dev, &fw_mem->sysinit_obj);
  461. if (IS_ERR(fw_dev->fwif_sysinit)) {
  462. drm_err(drm_dev, "Unable to allocate FW SYSINIT structure\n");
  463. err = PTR_ERR(fw_dev->fwif_sysinit);
  464. goto err_release_osinit;
  465. }
  466. return 0;
  467. err_release_osinit:
  468. pvr_fw_object_unmap_and_destroy(fw_mem->osinit_obj);
  469. err_release_osdata:
  470. pvr_fw_object_unmap_and_destroy(fw_mem->osdata_obj);
  471. err_fw_trace_fini:
  472. pvr_fw_trace_fini(pvr_dev);
  473. err_release_runtime_cfg:
  474. pvr_fw_object_destroy(fw_mem->runtime_cfg_obj);
  475. err_release_gpu_util_fwcb:
  476. pvr_fw_object_destroy(fw_mem->gpu_util_fwcb_obj);
  477. err_release_fault_page:
  478. pvr_fw_object_destroy(fw_mem->fault_page_obj);
  479. err_release_sysdata:
  480. pvr_fw_object_unmap_and_destroy(fw_mem->sysdata_obj);
  481. err_release_mmucache_sync_obj:
  482. pvr_fw_object_destroy(fw_mem->mmucache_sync_obj);
  483. err_release_hwrinfobuf:
  484. pvr_fw_object_unmap_and_destroy(fw_mem->hwrinfobuf_obj);
  485. err_release_power_sync:
  486. pvr_fw_object_unmap_and_destroy(fw_mem->power_sync_obj);
  487. return err;
  488. }
  489. static void
  490. pvr_fw_destroy_structures(struct pvr_device *pvr_dev)
  491. {
  492. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  493. struct pvr_fw_mem *fw_mem = &fw_dev->mem;
  494. pvr_fw_trace_fini(pvr_dev);
  495. pvr_fw_object_destroy(fw_mem->runtime_cfg_obj);
  496. pvr_fw_object_destroy(fw_mem->gpu_util_fwcb_obj);
  497. pvr_fw_object_destroy(fw_mem->fault_page_obj);
  498. pvr_fw_object_unmap_and_destroy(fw_mem->sysdata_obj);
  499. pvr_fw_object_unmap_and_destroy(fw_mem->sysinit_obj);
  500. pvr_fw_object_destroy(fw_mem->mmucache_sync_obj);
  501. pvr_fw_object_unmap_and_destroy(fw_mem->hwrinfobuf_obj);
  502. pvr_fw_object_unmap_and_destroy(fw_mem->power_sync_obj);
  503. pvr_fw_object_unmap_and_destroy(fw_mem->osdata_obj);
  504. pvr_fw_object_unmap_and_destroy(fw_mem->osinit_obj);
  505. }
  506. /**
  507. * pvr_fw_process() - Process firmware image, allocate FW memory and create boot
  508. * arguments
  509. * @pvr_dev: Device pointer.
  510. *
  511. * Returns:
  512. * * 0 on success, or
  513. * * Any error returned by pvr_fw_object_create_and_map_offset(), or
  514. * * Any error returned by pvr_fw_object_create_and_map().
  515. */
  516. static int
  517. pvr_fw_process(struct pvr_device *pvr_dev)
  518. {
  519. struct drm_device *drm_dev = from_pvr_device(pvr_dev);
  520. struct pvr_fw_mem *fw_mem = &pvr_dev->fw_dev.mem;
  521. const u8 *fw = pvr_dev->fw_dev.firmware->data;
  522. const struct pvr_fw_layout_entry *private_data;
  523. u8 *fw_code_ptr;
  524. u8 *fw_data_ptr;
  525. u8 *fw_core_code_ptr;
  526. u8 *fw_core_data_ptr;
  527. int err;
  528. layout_get_sizes(pvr_dev);
  529. private_data = pvr_fw_find_private_data(pvr_dev);
  530. if (!private_data)
  531. return -EINVAL;
  532. /* Allocate and map memory for firmware sections. */
  533. /*
  534. * Code allocation must be at the start of the firmware heap, otherwise
  535. * firmware processor will be unable to boot.
  536. *
  537. * This has the useful side-effect that for every other object in the
  538. * driver, a firmware address of 0 is invalid.
  539. */
  540. fw_code_ptr = pvr_fw_object_create_and_map_offset(pvr_dev, 0, fw_mem->code_alloc_size,
  541. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  542. NULL, NULL, &fw_mem->code_obj);
  543. if (IS_ERR(fw_code_ptr)) {
  544. drm_err(drm_dev, "Unable to allocate FW code memory\n");
  545. return PTR_ERR(fw_code_ptr);
  546. }
  547. if (pvr_dev->fw_dev.defs->has_fixed_data_addr()) {
  548. u32 base_addr = private_data->base_addr & pvr_dev->fw_dev.fw_heap_info.offset_mask;
  549. fw_data_ptr =
  550. pvr_fw_object_create_and_map_offset(pvr_dev, base_addr,
  551. fw_mem->data_alloc_size,
  552. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  553. NULL, NULL, &fw_mem->data_obj);
  554. } else {
  555. fw_data_ptr = pvr_fw_object_create_and_map(pvr_dev, fw_mem->data_alloc_size,
  556. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  557. NULL, NULL, &fw_mem->data_obj);
  558. }
  559. if (IS_ERR(fw_data_ptr)) {
  560. drm_err(drm_dev, "Unable to allocate FW data memory\n");
  561. err = PTR_ERR(fw_data_ptr);
  562. goto err_free_fw_code_obj;
  563. }
  564. /* Core code and data sections are optional. */
  565. if (fw_mem->core_code_alloc_size) {
  566. fw_core_code_ptr =
  567. pvr_fw_object_create_and_map(pvr_dev, fw_mem->core_code_alloc_size,
  568. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  569. NULL, NULL, &fw_mem->core_code_obj);
  570. if (IS_ERR(fw_core_code_ptr)) {
  571. drm_err(drm_dev,
  572. "Unable to allocate FW core code memory\n");
  573. err = PTR_ERR(fw_core_code_ptr);
  574. goto err_free_fw_data_obj;
  575. }
  576. } else {
  577. fw_core_code_ptr = NULL;
  578. }
  579. if (fw_mem->core_data_alloc_size) {
  580. fw_core_data_ptr =
  581. pvr_fw_object_create_and_map(pvr_dev, fw_mem->core_data_alloc_size,
  582. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  583. NULL, NULL, &fw_mem->core_data_obj);
  584. if (IS_ERR(fw_core_data_ptr)) {
  585. drm_err(drm_dev,
  586. "Unable to allocate FW core data memory\n");
  587. err = PTR_ERR(fw_core_data_ptr);
  588. goto err_free_fw_core_code_obj;
  589. }
  590. } else {
  591. fw_core_data_ptr = NULL;
  592. }
  593. fw_mem->code = kzalloc(fw_mem->code_alloc_size, GFP_KERNEL);
  594. fw_mem->data = kzalloc(fw_mem->data_alloc_size, GFP_KERNEL);
  595. if (fw_mem->core_code_alloc_size)
  596. fw_mem->core_code = kzalloc(fw_mem->core_code_alloc_size, GFP_KERNEL);
  597. if (fw_mem->core_data_alloc_size)
  598. fw_mem->core_data = kzalloc(fw_mem->core_data_alloc_size, GFP_KERNEL);
  599. if (!fw_mem->code || !fw_mem->data ||
  600. (!fw_mem->core_code && fw_mem->core_code_alloc_size) ||
  601. (!fw_mem->core_data && fw_mem->core_data_alloc_size)) {
  602. err = -ENOMEM;
  603. goto err_free_kdata;
  604. }
  605. err = pvr_dev->fw_dev.defs->fw_process(pvr_dev, fw,
  606. fw_mem->code, fw_mem->data, fw_mem->core_code,
  607. fw_mem->core_data, fw_mem->core_code_alloc_size);
  608. if (err)
  609. goto err_free_kdata;
  610. memcpy(fw_code_ptr, fw_mem->code, fw_mem->code_alloc_size);
  611. memcpy(fw_data_ptr, fw_mem->data, fw_mem->data_alloc_size);
  612. if (fw_mem->core_code)
  613. memcpy(fw_core_code_ptr, fw_mem->core_code, fw_mem->core_code_alloc_size);
  614. if (fw_mem->core_data)
  615. memcpy(fw_core_data_ptr, fw_mem->core_data, fw_mem->core_data_alloc_size);
  616. /* We're finished with the firmware section memory on the CPU, unmap. */
  617. if (fw_core_data_ptr) {
  618. pvr_fw_object_vunmap(fw_mem->core_data_obj);
  619. fw_core_data_ptr = NULL;
  620. }
  621. if (fw_core_code_ptr) {
  622. pvr_fw_object_vunmap(fw_mem->core_code_obj);
  623. fw_core_code_ptr = NULL;
  624. }
  625. pvr_fw_object_vunmap(fw_mem->data_obj);
  626. fw_data_ptr = NULL;
  627. pvr_fw_object_vunmap(fw_mem->code_obj);
  628. fw_code_ptr = NULL;
  629. err = pvr_fw_create_fwif_connection_ctl(pvr_dev);
  630. if (err)
  631. goto err_free_kdata;
  632. return 0;
  633. err_free_kdata:
  634. kfree(fw_mem->core_data);
  635. kfree(fw_mem->core_code);
  636. kfree(fw_mem->data);
  637. kfree(fw_mem->code);
  638. if (fw_core_data_ptr)
  639. pvr_fw_object_vunmap(fw_mem->core_data_obj);
  640. if (fw_mem->core_data_obj)
  641. pvr_fw_object_destroy(fw_mem->core_data_obj);
  642. err_free_fw_core_code_obj:
  643. if (fw_core_code_ptr)
  644. pvr_fw_object_vunmap(fw_mem->core_code_obj);
  645. if (fw_mem->core_code_obj)
  646. pvr_fw_object_destroy(fw_mem->core_code_obj);
  647. err_free_fw_data_obj:
  648. if (fw_data_ptr)
  649. pvr_fw_object_vunmap(fw_mem->data_obj);
  650. pvr_fw_object_destroy(fw_mem->data_obj);
  651. err_free_fw_code_obj:
  652. if (fw_code_ptr)
  653. pvr_fw_object_vunmap(fw_mem->code_obj);
  654. pvr_fw_object_destroy(fw_mem->code_obj);
  655. return err;
  656. }
  657. static int
  658. pvr_copy_to_fw(struct pvr_fw_object *dest_obj, u8 *src_ptr, u32 size)
  659. {
  660. u8 *dest_ptr = pvr_fw_object_vmap(dest_obj);
  661. if (IS_ERR(dest_ptr))
  662. return PTR_ERR(dest_ptr);
  663. memcpy(dest_ptr, src_ptr, size);
  664. pvr_fw_object_vunmap(dest_obj);
  665. return 0;
  666. }
  667. static int
  668. pvr_fw_reinit_code_data(struct pvr_device *pvr_dev)
  669. {
  670. struct pvr_fw_mem *fw_mem = &pvr_dev->fw_dev.mem;
  671. int err;
  672. err = pvr_copy_to_fw(fw_mem->code_obj, fw_mem->code, fw_mem->code_alloc_size);
  673. if (err)
  674. return err;
  675. err = pvr_copy_to_fw(fw_mem->data_obj, fw_mem->data, fw_mem->data_alloc_size);
  676. if (err)
  677. return err;
  678. if (fw_mem->core_code) {
  679. err = pvr_copy_to_fw(fw_mem->core_code_obj, fw_mem->core_code,
  680. fw_mem->core_code_alloc_size);
  681. if (err)
  682. return err;
  683. }
  684. if (fw_mem->core_data) {
  685. err = pvr_copy_to_fw(fw_mem->core_data_obj, fw_mem->core_data,
  686. fw_mem->core_data_alloc_size);
  687. if (err)
  688. return err;
  689. }
  690. return 0;
  691. }
  692. static void
  693. pvr_fw_cleanup(struct pvr_device *pvr_dev)
  694. {
  695. struct pvr_fw_mem *fw_mem = &pvr_dev->fw_dev.mem;
  696. pvr_fw_fini_fwif_connection_ctl(pvr_dev);
  697. kfree(fw_mem->core_data);
  698. kfree(fw_mem->core_code);
  699. kfree(fw_mem->data);
  700. kfree(fw_mem->code);
  701. if (fw_mem->core_code_obj)
  702. pvr_fw_object_destroy(fw_mem->core_code_obj);
  703. if (fw_mem->core_data_obj)
  704. pvr_fw_object_destroy(fw_mem->core_data_obj);
  705. pvr_fw_object_destroy(fw_mem->code_obj);
  706. pvr_fw_object_destroy(fw_mem->data_obj);
  707. }
  708. /**
  709. * pvr_wait_for_fw_boot() - Wait for firmware to finish booting
  710. * @pvr_dev: Target PowerVR device.
  711. *
  712. * Returns:
  713. * * 0 on success, or
  714. * * -%ETIMEDOUT if firmware fails to boot within timeout.
  715. */
  716. int
  717. pvr_wait_for_fw_boot(struct pvr_device *pvr_dev)
  718. {
  719. ktime_t deadline = ktime_add_us(ktime_get(), FW_BOOT_TIMEOUT_USEC);
  720. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  721. while (ktime_to_ns(ktime_sub(deadline, ktime_get())) > 0) {
  722. if (READ_ONCE(fw_dev->fwif_sysinit->firmware_started))
  723. return 0;
  724. }
  725. return -ETIMEDOUT;
  726. }
  727. /*
  728. * pvr_fw_heap_info_init() - Calculate size and masks for FW heap
  729. * @pvr_dev: Target PowerVR device.
  730. * @log2_size: Log2 of raw heap size.
  731. * @reserved_size: Size of reserved area of heap, in bytes. May be zero.
  732. */
  733. void
  734. pvr_fw_heap_info_init(struct pvr_device *pvr_dev, u32 log2_size, u32 reserved_size)
  735. {
  736. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  737. fw_dev->fw_heap_info.gpu_addr = PVR_ROGUE_FW_MAIN_HEAP_BASE;
  738. fw_dev->fw_heap_info.log2_size = log2_size;
  739. fw_dev->fw_heap_info.reserved_size = reserved_size;
  740. fw_dev->fw_heap_info.raw_size = 1 << fw_dev->fw_heap_info.log2_size;
  741. fw_dev->fw_heap_info.offset_mask = fw_dev->fw_heap_info.raw_size - 1;
  742. fw_dev->fw_heap_info.config_offset = fw_dev->fw_heap_info.raw_size -
  743. PVR_ROGUE_FW_CONFIG_HEAP_SIZE;
  744. fw_dev->fw_heap_info.size = fw_dev->fw_heap_info.raw_size -
  745. (PVR_ROGUE_FW_CONFIG_HEAP_SIZE + reserved_size);
  746. }
  747. /**
  748. * pvr_fw_validate_init_device_info() - Validate firmware and initialise device information
  749. * @pvr_dev: Target PowerVR device.
  750. *
  751. * This function must be called before querying device information.
  752. *
  753. * Returns:
  754. * * 0 on success, or
  755. * * -%EINVAL if firmware validation fails.
  756. */
  757. int
  758. pvr_fw_validate_init_device_info(struct pvr_device *pvr_dev)
  759. {
  760. int err;
  761. err = pvr_fw_validate(pvr_dev);
  762. if (err)
  763. return err;
  764. return pvr_fw_get_device_info(pvr_dev);
  765. }
  766. /**
  767. * pvr_fw_init() - Initialise and boot firmware
  768. * @pvr_dev: Target PowerVR device
  769. *
  770. * On successful completion of the function the PowerVR device will be
  771. * initialised and ready to use.
  772. *
  773. * Returns:
  774. * * 0 on success,
  775. * * -%EINVAL on invalid firmware image,
  776. * * -%ENOMEM on out of memory, or
  777. * * -%ETIMEDOUT if firmware processor fails to boot or on register poll timeout.
  778. */
  779. int
  780. pvr_fw_init(struct pvr_device *pvr_dev)
  781. {
  782. u32 kccb_size_log2 = ROGUE_FWIF_KCCB_NUMCMDS_LOG2_DEFAULT;
  783. u32 kccb_rtn_size = (1 << kccb_size_log2) * sizeof(*pvr_dev->kccb.rtn);
  784. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  785. int err;
  786. if (fw_dev->processor_type == PVR_FW_PROCESSOR_TYPE_META)
  787. fw_dev->defs = &pvr_fw_defs_meta;
  788. else if (fw_dev->processor_type == PVR_FW_PROCESSOR_TYPE_MIPS)
  789. fw_dev->defs = &pvr_fw_defs_mips;
  790. else
  791. return -EINVAL;
  792. err = fw_dev->defs->init(pvr_dev);
  793. if (err)
  794. return err;
  795. drm_mm_init(&fw_dev->fw_mm, ROGUE_FW_HEAP_BASE, fw_dev->fw_heap_info.raw_size);
  796. fw_dev->fw_mm_base = ROGUE_FW_HEAP_BASE;
  797. spin_lock_init(&fw_dev->fw_mm_lock);
  798. INIT_LIST_HEAD(&fw_dev->fw_objs.list);
  799. err = drmm_mutex_init(from_pvr_device(pvr_dev), &fw_dev->fw_objs.lock);
  800. if (err)
  801. goto err_mm_takedown;
  802. err = pvr_fw_process(pvr_dev);
  803. if (err)
  804. goto err_mm_takedown;
  805. /* Initialise KCCB and FWCCB. */
  806. err = pvr_kccb_init(pvr_dev);
  807. if (err)
  808. goto err_fw_cleanup;
  809. err = pvr_fwccb_init(pvr_dev);
  810. if (err)
  811. goto err_kccb_fini;
  812. /* Allocate memory for KCCB return slots. */
  813. pvr_dev->kccb.rtn = pvr_fw_object_create_and_map(pvr_dev, kccb_rtn_size,
  814. PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
  815. NULL, NULL, &pvr_dev->kccb.rtn_obj);
  816. if (IS_ERR(pvr_dev->kccb.rtn)) {
  817. err = PTR_ERR(pvr_dev->kccb.rtn);
  818. goto err_fwccb_fini;
  819. }
  820. err = pvr_fw_create_structures(pvr_dev);
  821. if (err)
  822. goto err_kccb_rtn_release;
  823. err = pvr_fw_start(pvr_dev);
  824. if (err)
  825. goto err_destroy_structures;
  826. err = pvr_wait_for_fw_boot(pvr_dev);
  827. if (err) {
  828. drm_err(from_pvr_device(pvr_dev), "Firmware failed to boot\n");
  829. goto err_fw_stop;
  830. }
  831. fw_dev->booted = true;
  832. return 0;
  833. err_fw_stop:
  834. pvr_fw_stop(pvr_dev);
  835. err_destroy_structures:
  836. pvr_fw_destroy_structures(pvr_dev);
  837. err_kccb_rtn_release:
  838. pvr_fw_object_unmap_and_destroy(pvr_dev->kccb.rtn_obj);
  839. err_fwccb_fini:
  840. pvr_ccb_fini(&pvr_dev->fwccb);
  841. err_kccb_fini:
  842. pvr_kccb_fini(pvr_dev);
  843. err_fw_cleanup:
  844. pvr_fw_cleanup(pvr_dev);
  845. err_mm_takedown:
  846. drm_mm_takedown(&fw_dev->fw_mm);
  847. if (fw_dev->defs->fini)
  848. fw_dev->defs->fini(pvr_dev);
  849. return err;
  850. }
  851. /**
  852. * pvr_fw_fini() - Shutdown firmware processor and free associated memory
  853. * @pvr_dev: Target PowerVR device
  854. */
  855. void
  856. pvr_fw_fini(struct pvr_device *pvr_dev)
  857. {
  858. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  859. fw_dev->booted = false;
  860. pvr_fw_destroy_structures(pvr_dev);
  861. pvr_fw_object_unmap_and_destroy(pvr_dev->kccb.rtn_obj);
  862. /*
  863. * Ensure FWCCB worker has finished executing before destroying FWCCB. The IRQ handler has
  864. * been unregistered at this point so no new work should be being submitted.
  865. */
  866. pvr_ccb_fini(&pvr_dev->fwccb);
  867. pvr_kccb_fini(pvr_dev);
  868. pvr_fw_cleanup(pvr_dev);
  869. mutex_lock(&pvr_dev->fw_dev.fw_objs.lock);
  870. WARN_ON(!list_empty(&pvr_dev->fw_dev.fw_objs.list));
  871. mutex_unlock(&pvr_dev->fw_dev.fw_objs.lock);
  872. drm_mm_takedown(&fw_dev->fw_mm);
  873. if (fw_dev->defs->fini)
  874. fw_dev->defs->fini(pvr_dev);
  875. }
  876. /**
  877. * pvr_fw_mts_schedule() - Schedule work via an MTS kick
  878. * @pvr_dev: Target PowerVR device
  879. * @val: Kick mask. Should be a combination of %ROGUE_CR_MTS_SCHEDULE_*
  880. */
  881. void
  882. pvr_fw_mts_schedule(struct pvr_device *pvr_dev, u32 val)
  883. {
  884. /* Ensure memory is flushed before kicking MTS. */
  885. wmb();
  886. pvr_cr_write32(pvr_dev, ROGUE_CR_MTS_SCHEDULE, val);
  887. /* Ensure the MTS kick goes through before continuing. */
  888. mb();
  889. }
  890. /**
  891. * pvr_fw_structure_cleanup() - Send FW cleanup request for an object
  892. * @pvr_dev: Target PowerVR device.
  893. * @type: Type of object to cleanup. Must be one of &enum rogue_fwif_cleanup_type.
  894. * @fw_obj: Pointer to FW object containing object to cleanup.
  895. * @offset: Offset within FW object of object to cleanup.
  896. *
  897. * Returns:
  898. * * 0 on success,
  899. * * -EBUSY if object is busy,
  900. * * -ETIMEDOUT on timeout, or
  901. * * -EIO if device is lost.
  902. */
  903. int
  904. pvr_fw_structure_cleanup(struct pvr_device *pvr_dev, u32 type, struct pvr_fw_object *fw_obj,
  905. u32 offset)
  906. {
  907. struct rogue_fwif_kccb_cmd cmd;
  908. int slot_nr;
  909. int idx;
  910. int err;
  911. u32 rtn;
  912. struct rogue_fwif_cleanup_request *cleanup_req = &cmd.cmd_data.cleanup_data;
  913. down_read(&pvr_dev->reset_sem);
  914. if (!drm_dev_enter(from_pvr_device(pvr_dev), &idx)) {
  915. err = -EIO;
  916. goto err_up_read;
  917. }
  918. cmd.cmd_type = ROGUE_FWIF_KCCB_CMD_CLEANUP;
  919. cmd.kccb_flags = 0;
  920. cleanup_req->cleanup_type = type;
  921. switch (type) {
  922. case ROGUE_FWIF_CLEANUP_FWCOMMONCONTEXT:
  923. pvr_fw_object_get_fw_addr_offset(fw_obj, offset,
  924. &cleanup_req->cleanup_data.context_fw_addr);
  925. break;
  926. case ROGUE_FWIF_CLEANUP_HWRTDATA:
  927. pvr_fw_object_get_fw_addr_offset(fw_obj, offset,
  928. &cleanup_req->cleanup_data.hwrt_data_fw_addr);
  929. break;
  930. case ROGUE_FWIF_CLEANUP_FREELIST:
  931. pvr_fw_object_get_fw_addr_offset(fw_obj, offset,
  932. &cleanup_req->cleanup_data.freelist_fw_addr);
  933. break;
  934. default:
  935. err = -EINVAL;
  936. goto err_drm_dev_exit;
  937. }
  938. err = pvr_kccb_send_cmd(pvr_dev, &cmd, &slot_nr);
  939. if (err)
  940. goto err_drm_dev_exit;
  941. err = pvr_kccb_wait_for_completion(pvr_dev, slot_nr, HZ, &rtn);
  942. if (err)
  943. goto err_drm_dev_exit;
  944. if (rtn & ROGUE_FWIF_KCCB_RTN_SLOT_CLEANUP_BUSY)
  945. err = -EBUSY;
  946. err_drm_dev_exit:
  947. drm_dev_exit(idx);
  948. err_up_read:
  949. up_read(&pvr_dev->reset_sem);
  950. return err;
  951. }
  952. /**
  953. * pvr_fw_object_fw_map() - Map a FW object in firmware address space
  954. * @pvr_dev: Device pointer.
  955. * @fw_obj: FW object to map.
  956. * @dev_addr: Desired address in device space, if a specific address is
  957. * required. 0 otherwise.
  958. *
  959. * Returns:
  960. * * 0 on success, or
  961. * * -%EINVAL if @fw_obj is already mapped but has no references, or
  962. * * Any error returned by DRM.
  963. */
  964. static int
  965. pvr_fw_object_fw_map(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj, u64 dev_addr)
  966. {
  967. struct pvr_gem_object *pvr_obj = fw_obj->gem;
  968. struct drm_gem_object *gem_obj = gem_from_pvr_gem(pvr_obj);
  969. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  970. int err;
  971. spin_lock(&fw_dev->fw_mm_lock);
  972. if (drm_mm_node_allocated(&fw_obj->fw_mm_node)) {
  973. err = -EINVAL;
  974. goto err_unlock;
  975. }
  976. if (!dev_addr) {
  977. /*
  978. * Allocate from the main heap only (firmware heap minus
  979. * config space).
  980. */
  981. err = drm_mm_insert_node_in_range(&fw_dev->fw_mm, &fw_obj->fw_mm_node,
  982. gem_obj->size, 0, 0,
  983. fw_dev->fw_heap_info.gpu_addr,
  984. fw_dev->fw_heap_info.gpu_addr +
  985. fw_dev->fw_heap_info.size, 0);
  986. if (err)
  987. goto err_unlock;
  988. } else {
  989. fw_obj->fw_mm_node.start = dev_addr;
  990. fw_obj->fw_mm_node.size = gem_obj->size;
  991. err = drm_mm_reserve_node(&fw_dev->fw_mm, &fw_obj->fw_mm_node);
  992. if (err)
  993. goto err_unlock;
  994. }
  995. spin_unlock(&fw_dev->fw_mm_lock);
  996. /* Map object on GPU. */
  997. err = fw_dev->defs->vm_map(pvr_dev, fw_obj);
  998. if (err)
  999. goto err_remove_node;
  1000. fw_obj->fw_addr_offset = (u32)(fw_obj->fw_mm_node.start - fw_dev->fw_mm_base);
  1001. return 0;
  1002. err_remove_node:
  1003. spin_lock(&fw_dev->fw_mm_lock);
  1004. drm_mm_remove_node(&fw_obj->fw_mm_node);
  1005. err_unlock:
  1006. spin_unlock(&fw_dev->fw_mm_lock);
  1007. return err;
  1008. }
  1009. /**
  1010. * pvr_fw_object_fw_unmap() - Unmap a previously mapped FW object
  1011. * @fw_obj: FW object to unmap.
  1012. *
  1013. * Returns:
  1014. * * 0 on success, or
  1015. * * -%EINVAL if object is not currently mapped.
  1016. */
  1017. static int
  1018. pvr_fw_object_fw_unmap(struct pvr_fw_object *fw_obj)
  1019. {
  1020. struct pvr_gem_object *pvr_obj = fw_obj->gem;
  1021. struct drm_gem_object *gem_obj = gem_from_pvr_gem(pvr_obj);
  1022. struct pvr_device *pvr_dev = to_pvr_device(gem_obj->dev);
  1023. struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
  1024. fw_dev->defs->vm_unmap(pvr_dev, fw_obj);
  1025. spin_lock(&fw_dev->fw_mm_lock);
  1026. if (!drm_mm_node_allocated(&fw_obj->fw_mm_node)) {
  1027. spin_unlock(&fw_dev->fw_mm_lock);
  1028. return -EINVAL;
  1029. }
  1030. drm_mm_remove_node(&fw_obj->fw_mm_node);
  1031. spin_unlock(&fw_dev->fw_mm_lock);
  1032. return 0;
  1033. }
  1034. static void *
  1035. pvr_fw_object_create_and_map_common(struct pvr_device *pvr_dev, size_t size,
  1036. u64 flags, u64 dev_addr,
  1037. void (*init)(void *cpu_ptr, void *priv),
  1038. void *init_priv, struct pvr_fw_object **fw_obj_out)
  1039. {
  1040. struct pvr_fw_object *fw_obj;
  1041. void *cpu_ptr;
  1042. int err;
  1043. /* %DRM_PVR_BO_PM_FW_PROTECT is implicit for FW objects. */
  1044. flags |= DRM_PVR_BO_PM_FW_PROTECT;
  1045. fw_obj = kzalloc(sizeof(*fw_obj), GFP_KERNEL);
  1046. if (!fw_obj)
  1047. return ERR_PTR(-ENOMEM);
  1048. INIT_LIST_HEAD(&fw_obj->node);
  1049. fw_obj->init = init;
  1050. fw_obj->init_priv = init_priv;
  1051. fw_obj->gem = pvr_gem_object_create(pvr_dev, size, flags);
  1052. if (IS_ERR(fw_obj->gem)) {
  1053. err = PTR_ERR(fw_obj->gem);
  1054. fw_obj->gem = NULL;
  1055. goto err_put_object;
  1056. }
  1057. err = pvr_fw_object_fw_map(pvr_dev, fw_obj, dev_addr);
  1058. if (err)
  1059. goto err_put_object;
  1060. cpu_ptr = pvr_fw_object_vmap(fw_obj);
  1061. if (IS_ERR(cpu_ptr)) {
  1062. err = PTR_ERR(cpu_ptr);
  1063. goto err_put_object;
  1064. }
  1065. *fw_obj_out = fw_obj;
  1066. if (fw_obj->init)
  1067. fw_obj->init(cpu_ptr, fw_obj->init_priv);
  1068. mutex_lock(&pvr_dev->fw_dev.fw_objs.lock);
  1069. list_add_tail(&fw_obj->node, &pvr_dev->fw_dev.fw_objs.list);
  1070. mutex_unlock(&pvr_dev->fw_dev.fw_objs.lock);
  1071. return cpu_ptr;
  1072. err_put_object:
  1073. pvr_fw_object_destroy(fw_obj);
  1074. return ERR_PTR(err);
  1075. }
  1076. /**
  1077. * pvr_fw_object_create() - Create a FW object and map to firmware
  1078. * @pvr_dev: PowerVR device pointer.
  1079. * @size: Size of object, in bytes.
  1080. * @flags: Options which affect both this operation and future mapping
  1081. * operations performed on the returned object. Must be a combination of
  1082. * DRM_PVR_BO_* and/or PVR_BO_* flags.
  1083. * @init: Initialisation callback.
  1084. * @init_priv: Private pointer to pass to initialisation callback.
  1085. * @fw_obj_out: Pointer to location to store created object pointer.
  1086. *
  1087. * %DRM_PVR_BO_DEVICE_PM_FW_PROTECT is implied for all FW objects. Consequently,
  1088. * this function will fail if @flags has %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS
  1089. * set.
  1090. *
  1091. * Returns:
  1092. * * 0 on success, or
  1093. * * Any error returned by pvr_fw_object_create_common().
  1094. */
  1095. int
  1096. pvr_fw_object_create(struct pvr_device *pvr_dev, size_t size, u64 flags,
  1097. void (*init)(void *cpu_ptr, void *priv), void *init_priv,
  1098. struct pvr_fw_object **fw_obj_out)
  1099. {
  1100. void *cpu_ptr;
  1101. cpu_ptr = pvr_fw_object_create_and_map_common(pvr_dev, size, flags, 0, init, init_priv,
  1102. fw_obj_out);
  1103. if (IS_ERR(cpu_ptr))
  1104. return PTR_ERR(cpu_ptr);
  1105. pvr_fw_object_vunmap(*fw_obj_out);
  1106. return 0;
  1107. }
  1108. /**
  1109. * pvr_fw_object_create_and_map() - Create a FW object and map to firmware and CPU
  1110. * @pvr_dev: PowerVR device pointer.
  1111. * @size: Size of object, in bytes.
  1112. * @flags: Options which affect both this operation and future mapping
  1113. * operations performed on the returned object. Must be a combination of
  1114. * DRM_PVR_BO_* and/or PVR_BO_* flags.
  1115. * @init: Initialisation callback.
  1116. * @init_priv: Private pointer to pass to initialisation callback.
  1117. * @fw_obj_out: Pointer to location to store created object pointer.
  1118. *
  1119. * %DRM_PVR_BO_DEVICE_PM_FW_PROTECT is implied for all FW objects. Consequently,
  1120. * this function will fail if @flags has %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS
  1121. * set.
  1122. *
  1123. * Caller is responsible for calling pvr_fw_object_vunmap() to release the CPU
  1124. * mapping.
  1125. *
  1126. * Returns:
  1127. * * Pointer to CPU mapping of newly created object, or
  1128. * * Any error returned by pvr_fw_object_create(), or
  1129. * * Any error returned by pvr_fw_object_vmap().
  1130. */
  1131. void *
  1132. pvr_fw_object_create_and_map(struct pvr_device *pvr_dev, size_t size, u64 flags,
  1133. void (*init)(void *cpu_ptr, void *priv),
  1134. void *init_priv, struct pvr_fw_object **fw_obj_out)
  1135. {
  1136. return pvr_fw_object_create_and_map_common(pvr_dev, size, flags, 0, init, init_priv,
  1137. fw_obj_out);
  1138. }
  1139. /**
  1140. * pvr_fw_object_create_and_map_offset() - Create a FW object and map to
  1141. * firmware at the provided offset and to the CPU.
  1142. * @pvr_dev: PowerVR device pointer.
  1143. * @dev_offset: Base address of desired FW mapping, offset from start of FW heap.
  1144. * @size: Size of object, in bytes.
  1145. * @flags: Options which affect both this operation and future mapping
  1146. * operations performed on the returned object. Must be a combination of
  1147. * DRM_PVR_BO_* and/or PVR_BO_* flags.
  1148. * @init: Initialisation callback.
  1149. * @init_priv: Private pointer to pass to initialisation callback.
  1150. * @fw_obj_out: Pointer to location to store created object pointer.
  1151. *
  1152. * %DRM_PVR_BO_DEVICE_PM_FW_PROTECT is implied for all FW objects. Consequently,
  1153. * this function will fail if @flags has %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS
  1154. * set.
  1155. *
  1156. * Caller is responsible for calling pvr_fw_object_vunmap() to release the CPU
  1157. * mapping.
  1158. *
  1159. * Returns:
  1160. * * Pointer to CPU mapping of newly created object, or
  1161. * * Any error returned by pvr_fw_object_create(), or
  1162. * * Any error returned by pvr_fw_object_vmap().
  1163. */
  1164. void *
  1165. pvr_fw_object_create_and_map_offset(struct pvr_device *pvr_dev,
  1166. u32 dev_offset, size_t size, u64 flags,
  1167. void (*init)(void *cpu_ptr, void *priv),
  1168. void *init_priv, struct pvr_fw_object **fw_obj_out)
  1169. {
  1170. u64 dev_addr = pvr_dev->fw_dev.fw_mm_base + dev_offset;
  1171. return pvr_fw_object_create_and_map_common(pvr_dev, size, flags, dev_addr, init, init_priv,
  1172. fw_obj_out);
  1173. }
  1174. /**
  1175. * pvr_fw_object_destroy() - Destroy a pvr_fw_object
  1176. * @fw_obj: Pointer to object to destroy.
  1177. */
  1178. void pvr_fw_object_destroy(struct pvr_fw_object *fw_obj)
  1179. {
  1180. struct pvr_gem_object *pvr_obj = fw_obj->gem;
  1181. struct drm_gem_object *gem_obj = gem_from_pvr_gem(pvr_obj);
  1182. struct pvr_device *pvr_dev = to_pvr_device(gem_obj->dev);
  1183. mutex_lock(&pvr_dev->fw_dev.fw_objs.lock);
  1184. list_del(&fw_obj->node);
  1185. mutex_unlock(&pvr_dev->fw_dev.fw_objs.lock);
  1186. if (drm_mm_node_allocated(&fw_obj->fw_mm_node)) {
  1187. /* If we can't unmap, leak the memory. */
  1188. if (WARN_ON(pvr_fw_object_fw_unmap(fw_obj)))
  1189. return;
  1190. }
  1191. if (fw_obj->gem)
  1192. pvr_gem_object_put(fw_obj->gem);
  1193. kfree(fw_obj);
  1194. }
  1195. /**
  1196. * pvr_fw_object_get_fw_addr_offset() - Return address of object in firmware address space, with
  1197. * given offset.
  1198. * @fw_obj: Pointer to object.
  1199. * @offset: Desired offset from start of object.
  1200. * @fw_addr_out: Location to store address to.
  1201. */
  1202. void pvr_fw_object_get_fw_addr_offset(struct pvr_fw_object *fw_obj, u32 offset, u32 *fw_addr_out)
  1203. {
  1204. struct pvr_gem_object *pvr_obj = fw_obj->gem;
  1205. struct pvr_device *pvr_dev = to_pvr_device(gem_from_pvr_gem(pvr_obj)->dev);
  1206. *fw_addr_out = pvr_dev->fw_dev.defs->get_fw_addr_with_offset(fw_obj, offset);
  1207. }
  1208. /*
  1209. * pvr_fw_hard_reset() - Re-initialise the FW code and data segments, and reset all global FW
  1210. * structures
  1211. * @pvr_dev: Device pointer
  1212. *
  1213. * If this function returns an error then the caller must regard the device as lost.
  1214. *
  1215. * Returns:
  1216. * * 0 on success, or
  1217. * * Any error returned by pvr_fw_init_dev_structures() or pvr_fw_reset_all().
  1218. */
  1219. int
  1220. pvr_fw_hard_reset(struct pvr_device *pvr_dev)
  1221. {
  1222. struct list_head *pos;
  1223. int err;
  1224. /* Reset all FW objects */
  1225. mutex_lock(&pvr_dev->fw_dev.fw_objs.lock);
  1226. list_for_each(pos, &pvr_dev->fw_dev.fw_objs.list) {
  1227. struct pvr_fw_object *fw_obj = container_of(pos, struct pvr_fw_object, node);
  1228. void *cpu_ptr = pvr_fw_object_vmap(fw_obj);
  1229. WARN_ON(IS_ERR(cpu_ptr));
  1230. if (!(fw_obj->gem->flags & PVR_BO_FW_NO_CLEAR_ON_RESET)) {
  1231. memset(cpu_ptr, 0, pvr_gem_object_size(fw_obj->gem));
  1232. if (fw_obj->init)
  1233. fw_obj->init(cpu_ptr, fw_obj->init_priv);
  1234. }
  1235. pvr_fw_object_vunmap(fw_obj);
  1236. }
  1237. mutex_unlock(&pvr_dev->fw_dev.fw_objs.lock);
  1238. err = pvr_fw_reinit_code_data(pvr_dev);
  1239. if (err)
  1240. return err;
  1241. return 0;
  1242. }