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