xref: /OK3568_Linux_fs/kernel/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
2 /*
3  *
4  * (C) COPYRIGHT 2018-2023 ARM Limited. All rights reserved.
5  *
6  * This program is free software and is provided to you under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation, and any use by you of this program is subject to the terms
9  * of such GNU license.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you can access it online at
18  * http://www.gnu.org/licenses/gpl-2.0.html.
19  *
20  */
21 
22 #include "mali_kbase.h"
23 #include "mali_kbase_csf_firmware_cfg.h"
24 #include "mali_kbase_csf_firmware_log.h"
25 #include "mali_kbase_csf_firmware_core_dump.h"
26 #include "mali_kbase_csf_trace_buffer.h"
27 #include "mali_kbase_csf_timeout.h"
28 #include "mali_kbase_mem.h"
29 #include "mali_kbase_mem_pool_group.h"
30 #include "mali_kbase_reset_gpu.h"
31 #include "mali_kbase_ctx_sched.h"
32 #include "mali_kbase_csf_scheduler.h"
33 #include <mali_kbase_hwaccess_time.h>
34 #include "device/mali_kbase_device.h"
35 #include "backend/gpu/mali_kbase_pm_internal.h"
36 #include "tl/mali_kbase_timeline_priv.h"
37 #include "tl/mali_kbase_tracepoints.h"
38 #include "mali_kbase_csf_tl_reader.h"
39 #include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
40 #include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
41 #include <csf/mali_kbase_csf_registers.h>
42 #include <linux/list.h>
43 #include <linux/slab.h>
44 #include <linux/firmware.h>
45 #include <linux/mman.h>
46 #include <linux/string.h>
47 #include <linux/mutex.h>
48 #include <linux/ctype.h>
49 #if (KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE)
50 #include <linux/set_memory.h>
51 #endif
52 #include <mmu/mali_kbase_mmu.h>
53 #include <asm/arch_timer.h>
54 #include <linux/delay.h>
55 
56 #define MALI_MAX_FIRMWARE_NAME_LEN ((size_t)20)
57 
58 static char fw_name[MALI_MAX_FIRMWARE_NAME_LEN] = "mali_csffw.bin";
59 module_param_string(fw_name, fw_name, sizeof(fw_name), 0644);
60 MODULE_PARM_DESC(fw_name, "firmware image");
61 
62 /* The waiting time for firmware to boot */
63 static unsigned int csf_firmware_boot_timeout_ms;
64 module_param(csf_firmware_boot_timeout_ms, uint, 0444);
65 MODULE_PARM_DESC(csf_firmware_boot_timeout_ms,
66 		 "Maximum time to wait for firmware to boot.");
67 
68 #ifdef CONFIG_MALI_BIFROST_DEBUG
69 /* Makes Driver wait indefinitely for an acknowledgment for the different
70  * requests it sends to firmware. Otherwise the timeouts interfere with the
71  * use of debugger for source-level debugging of firmware as Driver initiates
72  * a GPU reset when a request times out, which always happen when a debugger
73  * is connected.
74  */
75 bool fw_debug; /* Default value of 0/false */
76 module_param(fw_debug, bool, 0444);
77 MODULE_PARM_DESC(fw_debug,
78 	"Enables effective use of a debugger for debugging firmware code.");
79 #endif
80 
81 
82 #define FIRMWARE_HEADER_MAGIC		(0xC3F13A6Eul)
83 #define FIRMWARE_HEADER_VERSION_MAJOR	(0ul)
84 #define FIRMWARE_HEADER_VERSION_MINOR	(3ul)
85 #define FIRMWARE_HEADER_LENGTH		(0x14ul)
86 
87 #define CSF_FIRMWARE_ENTRY_SUPPORTED_FLAGS \
88 	(CSF_FIRMWARE_ENTRY_READ | \
89 	 CSF_FIRMWARE_ENTRY_WRITE | \
90 	 CSF_FIRMWARE_ENTRY_EXECUTE | \
91 	 CSF_FIRMWARE_ENTRY_PROTECTED | \
92 	 CSF_FIRMWARE_ENTRY_SHARED | \
93 	 CSF_FIRMWARE_ENTRY_ZERO | \
94 	 CSF_FIRMWARE_ENTRY_CACHE_MODE)
95 
96 #define CSF_FIRMWARE_ENTRY_TYPE_INTERFACE           (0)
97 #define CSF_FIRMWARE_ENTRY_TYPE_CONFIGURATION       (1)
98 #define CSF_FIRMWARE_ENTRY_TYPE_TRACE_BUFFER        (3)
99 #define CSF_FIRMWARE_ENTRY_TYPE_TIMELINE_METADATA   (4)
100 #define CSF_FIRMWARE_ENTRY_TYPE_BUILD_INFO_METADATA (6)
101 #define CSF_FIRMWARE_ENTRY_TYPE_FUNC_CALL_LIST      (7)
102 #define CSF_FIRMWARE_ENTRY_TYPE_CORE_DUMP           (9)
103 
104 #define CSF_FIRMWARE_CACHE_MODE_NONE              (0ul << 3)
105 #define CSF_FIRMWARE_CACHE_MODE_CACHED            (1ul << 3)
106 #define CSF_FIRMWARE_CACHE_MODE_UNCACHED_COHERENT (2ul << 3)
107 #define CSF_FIRMWARE_CACHE_MODE_CACHED_COHERENT   (3ul << 3)
108 
109 #define INTERFACE_ENTRY_NAME_OFFSET (0x14)
110 
111 #define TL_METADATA_ENTRY_NAME_OFFSET (0x8)
112 
113 #define BUILD_INFO_METADATA_SIZE_OFFSET (0x4)
114 #define BUILD_INFO_GIT_SHA_LEN (40U)
115 #define BUILD_INFO_GIT_DIRTY_LEN (1U)
116 #define BUILD_INFO_GIT_SHA_PATTERN "git_sha: "
117 
118 #define CSF_MAX_FW_STOP_LOOPS            (100000)
119 
120 #define CSF_GLB_REQ_CFG_MASK                                                                       \
121 	(GLB_REQ_CFG_ALLOC_EN_MASK | GLB_REQ_CFG_PROGRESS_TIMER_MASK |                             \
122 	 GLB_REQ_CFG_PWROFF_TIMER_MASK | GLB_REQ_IDLE_ENABLE_MASK)
123 
input_page_read(const u32 * const input,const u32 offset)124 static inline u32 input_page_read(const u32 *const input, const u32 offset)
125 {
126 	WARN_ON(offset % sizeof(u32));
127 
128 	return input[offset / sizeof(u32)];
129 }
130 
input_page_write(u32 * const input,const u32 offset,const u32 value)131 static inline void input_page_write(u32 *const input, const u32 offset,
132 			const u32 value)
133 {
134 	WARN_ON(offset % sizeof(u32));
135 
136 	input[offset / sizeof(u32)] = value;
137 }
138 
input_page_partial_write(u32 * const input,const u32 offset,u32 value,u32 mask)139 static inline void input_page_partial_write(u32 *const input, const u32 offset,
140 			u32 value, u32 mask)
141 {
142 	WARN_ON(offset % sizeof(u32));
143 
144 	input[offset / sizeof(u32)] =
145 		(input_page_read(input, offset) & ~mask) | (value & mask);
146 }
147 
output_page_read(const u32 * const output,const u32 offset)148 static inline u32 output_page_read(const u32 *const output, const u32 offset)
149 {
150 	WARN_ON(offset % sizeof(u32));
151 
152 	return output[offset / sizeof(u32)];
153 }
154 
entry_type(u32 header)155 static unsigned int entry_type(u32 header)
156 {
157 	return header & 0xFF;
158 }
entry_size(u32 header)159 static unsigned int entry_size(u32 header)
160 {
161 	return (header >> 8) & 0xFF;
162 }
entry_update(u32 header)163 static bool entry_update(u32 header)
164 {
165 	return (header >> 30) & 0x1;
166 }
entry_optional(u32 header)167 static bool entry_optional(u32 header)
168 {
169 	return (header >> 31) & 0x1;
170 }
171 
172 /**
173  * struct firmware_timeline_metadata - Timeline metadata item within the MCU firmware
174  *
175  * @node: List head linking all timeline metadata to
176  *        kbase_device:csf.firmware_timeline_metadata.
177  * @name: NUL-terminated string naming the metadata.
178  * @data: Metadata content.
179  * @size: Metadata size.
180  */
181 struct firmware_timeline_metadata {
182 	struct list_head node;
183 	char *name;
184 	char *data;
185 	size_t size;
186 };
187 
188 /* The shared interface area, used for communicating with firmware, is managed
189  * like a virtual memory zone. Reserve the virtual space from that zone
190  * corresponding to shared interface entry parsed from the firmware image.
191  * The shared_reg_rbtree should have been initialized before calling this
192  * function.
193  */
setup_shared_iface_static_region(struct kbase_device * kbdev)194 static int setup_shared_iface_static_region(struct kbase_device *kbdev)
195 {
196 	struct kbase_csf_firmware_interface *interface =
197 		kbdev->csf.shared_interface;
198 	struct kbase_va_region *reg;
199 	int ret = -ENOMEM;
200 
201 	if (!interface)
202 		return -EINVAL;
203 
204 	reg = kbase_alloc_free_region(kbdev, &kbdev->csf.shared_reg_rbtree, 0,
205 				      interface->num_pages_aligned, KBASE_REG_ZONE_MCU_SHARED);
206 	if (reg) {
207 		mutex_lock(&kbdev->csf.reg_lock);
208 		ret = kbase_add_va_region_rbtree(kbdev, reg,
209 				interface->virtual, interface->num_pages_aligned, 1);
210 		mutex_unlock(&kbdev->csf.reg_lock);
211 		if (ret)
212 			kfree(reg);
213 		else
214 			reg->flags &= ~KBASE_REG_FREE;
215 	}
216 
217 	return ret;
218 }
219 
wait_mcu_status_value(struct kbase_device * kbdev,u32 val)220 static int wait_mcu_status_value(struct kbase_device *kbdev, u32 val)
221 {
222 	u32 max_loops = CSF_MAX_FW_STOP_LOOPS;
223 
224 	/* wait for the MCU_STATUS register to reach the given status value */
225 	while (--max_loops &&
226 	       (kbase_reg_read(kbdev, GPU_CONTROL_REG(MCU_STATUS)) != val)) {
227 	}
228 
229 	return (max_loops == 0) ? -1 : 0;
230 }
231 
kbase_csf_firmware_disable_mcu(struct kbase_device * kbdev)232 void kbase_csf_firmware_disable_mcu(struct kbase_device *kbdev)
233 {
234 	KBASE_TLSTREAM_TL_KBASE_CSFFW_FW_DISABLING(kbdev, kbase_backend_get_cycle_cnt(kbdev));
235 
236 	kbase_reg_write(kbdev, GPU_CONTROL_REG(MCU_CONTROL), MCU_CNTRL_DISABLE);
237 }
238 
wait_for_firmware_stop(struct kbase_device * kbdev)239 static void wait_for_firmware_stop(struct kbase_device *kbdev)
240 {
241 	if (wait_mcu_status_value(kbdev, MCU_CNTRL_DISABLE) < 0) {
242 		/* This error shall go away once MIDJM-2371 is closed */
243 		dev_err(kbdev->dev, "Firmware failed to stop");
244 	}
245 
246 	KBASE_TLSTREAM_TL_KBASE_CSFFW_FW_OFF(kbdev, kbase_backend_get_cycle_cnt(kbdev));
247 }
248 
kbase_csf_firmware_disable_mcu_wait(struct kbase_device * kbdev)249 void kbase_csf_firmware_disable_mcu_wait(struct kbase_device *kbdev)
250 {
251 	wait_for_firmware_stop(kbdev);
252 }
253 
stop_csf_firmware(struct kbase_device * kbdev)254 static void stop_csf_firmware(struct kbase_device *kbdev)
255 {
256 	/* Stop the MCU firmware */
257 	kbase_csf_firmware_disable_mcu(kbdev);
258 
259 	wait_for_firmware_stop(kbdev);
260 }
261 
wait_for_firmware_boot(struct kbase_device * kbdev)262 static void wait_for_firmware_boot(struct kbase_device *kbdev)
263 {
264 	long wait_timeout;
265 	long remaining;
266 
267 	if (!csf_firmware_boot_timeout_ms)
268 		csf_firmware_boot_timeout_ms =
269 			kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_BOOT_TIMEOUT);
270 
271 	wait_timeout = kbase_csf_timeout_in_jiffies(csf_firmware_boot_timeout_ms);
272 
273 	/* Firmware will generate a global interface interrupt once booting
274 	 * is complete
275 	 */
276 	remaining = wait_event_timeout(kbdev->csf.event_wait,
277 			kbdev->csf.interrupt_received == true, wait_timeout);
278 
279 	if (!remaining)
280 		dev_err(kbdev->dev, "Timed out waiting for fw boot completion");
281 
282 	kbdev->csf.interrupt_received = false;
283 }
284 
boot_csf_firmware(struct kbase_device * kbdev)285 static void boot_csf_firmware(struct kbase_device *kbdev)
286 {
287 	kbase_csf_firmware_enable_mcu(kbdev);
288 
289 #if IS_ENABLED(CONFIG_MALI_CORESIGHT)
290 	kbase_debug_coresight_csf_state_request(kbdev, KBASE_DEBUG_CORESIGHT_CSF_ENABLED);
291 
292 	if (!kbase_debug_coresight_csf_state_wait(kbdev, KBASE_DEBUG_CORESIGHT_CSF_ENABLED))
293 		dev_err(kbdev->dev, "Timeout waiting for CoreSight to be enabled");
294 #endif /* IS_ENABLED(CONFIG_MALI_CORESIGHT) */
295 
296 	wait_for_firmware_boot(kbdev);
297 }
298 
299 /**
300  * wait_ready() - Wait for previously issued MMU command to complete.
301  *
302  * @kbdev:        Kbase device to wait for a MMU command to complete.
303  *
304  * Reset GPU if the wait for previously issued command times out.
305  *
306  * Return:  0 on success, error code otherwise.
307  */
wait_ready(struct kbase_device * kbdev)308 static int wait_ready(struct kbase_device *kbdev)
309 {
310 	const ktime_t wait_loop_start = ktime_get_raw();
311 	const u32 mmu_as_inactive_wait_time_ms = kbdev->mmu_as_inactive_wait_time_ms;
312 	s64 diff;
313 
314 	do {
315 		unsigned int i;
316 
317 		for (i = 0; i < 1000; i++) {
318 			/* Wait for the MMU status to indicate there is no active command */
319 			if (!(kbase_reg_read(kbdev, MMU_AS_REG(MCU_AS_NR, AS_STATUS)) &
320 			      AS_STATUS_AS_ACTIVE))
321 				return 0;
322 		}
323 
324 		diff = ktime_to_ms(ktime_sub(ktime_get_raw(), wait_loop_start));
325 	} while (diff < mmu_as_inactive_wait_time_ms);
326 
327 	dev_err(kbdev->dev,
328 		"AS_ACTIVE bit stuck for MCU AS. Might be caused by unstable GPU clk/pwr or faulty system");
329 
330 	if (kbase_prepare_to_reset_gpu_locked(kbdev, RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
331 		kbase_reset_gpu_locked(kbdev);
332 
333 	return -ETIMEDOUT;
334 }
335 
unload_mmu_tables(struct kbase_device * kbdev)336 static void unload_mmu_tables(struct kbase_device *kbdev)
337 {
338 	unsigned long irq_flags;
339 
340 	mutex_lock(&kbdev->mmu_hw_mutex);
341 	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
342 	if (kbdev->pm.backend.gpu_powered)
343 		kbase_mmu_disable_as(kbdev, MCU_AS_NR);
344 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
345 	mutex_unlock(&kbdev->mmu_hw_mutex);
346 }
347 
load_mmu_tables(struct kbase_device * kbdev)348 static int load_mmu_tables(struct kbase_device *kbdev)
349 {
350 	unsigned long irq_flags;
351 
352 	mutex_lock(&kbdev->mmu_hw_mutex);
353 	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
354 	kbase_mmu_update(kbdev, &kbdev->csf.mcu_mmu, MCU_AS_NR);
355 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
356 	mutex_unlock(&kbdev->mmu_hw_mutex);
357 
358 	/* Wait for a while for the update command to take effect */
359 	return wait_ready(kbdev);
360 }
361 
362 /**
363  * convert_mem_flags() - Convert firmware memory flags to GPU region flags
364  *
365  * Return: GPU memory region flags
366  *
367  * @kbdev: Instance of GPU platform device (used to determine system coherency)
368  * @flags: Flags of an "interface memory setup" section in a firmware image
369  * @cm:    appropriate cache mode chosen for the "interface memory setup"
370  *         section, which could be different from the cache mode requested by
371  *         firmware.
372  */
convert_mem_flags(const struct kbase_device * const kbdev,const u32 flags,u32 * cm)373 static unsigned long convert_mem_flags(const struct kbase_device * const kbdev,
374 	const u32 flags, u32 *cm)
375 {
376 	unsigned long mem_flags = 0;
377 	u32 cache_mode = flags & CSF_FIRMWARE_ENTRY_CACHE_MODE;
378 	bool is_shared = (flags & CSF_FIRMWARE_ENTRY_SHARED) ? true : false;
379 
380 	/* The memory flags control the access permissions for the MCU, the
381 	 * shader cores/tiler are not expected to access this memory
382 	 */
383 	if (flags & CSF_FIRMWARE_ENTRY_READ)
384 		mem_flags |= KBASE_REG_GPU_RD;
385 
386 	if (flags & CSF_FIRMWARE_ENTRY_WRITE)
387 		mem_flags |= KBASE_REG_GPU_WR;
388 
389 	if ((flags & CSF_FIRMWARE_ENTRY_EXECUTE) == 0)
390 		mem_flags |= KBASE_REG_GPU_NX;
391 
392 	if (flags & CSF_FIRMWARE_ENTRY_PROTECTED)
393 		mem_flags |= KBASE_REG_PROTECTED;
394 
395 	/* Substitute uncached coherent memory for cached coherent memory if
396 	 * the system does not support ACE coherency.
397 	 */
398 	if ((cache_mode == CSF_FIRMWARE_CACHE_MODE_CACHED_COHERENT) &&
399 		(kbdev->system_coherency != COHERENCY_ACE))
400 		cache_mode = CSF_FIRMWARE_CACHE_MODE_UNCACHED_COHERENT;
401 
402 	/* Substitute uncached incoherent memory for uncached coherent memory
403 	 * if the system does not support ACE-Lite coherency.
404 	 */
405 	if ((cache_mode == CSF_FIRMWARE_CACHE_MODE_UNCACHED_COHERENT) &&
406 		(kbdev->system_coherency == COHERENCY_NONE))
407 		cache_mode = CSF_FIRMWARE_CACHE_MODE_NONE;
408 
409 	*cm = cache_mode;
410 
411 	switch (cache_mode) {
412 	case CSF_FIRMWARE_CACHE_MODE_NONE:
413 		mem_flags |=
414 			KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_NON_CACHEABLE);
415 		break;
416 	case CSF_FIRMWARE_CACHE_MODE_CACHED:
417 		mem_flags |=
418 			KBASE_REG_MEMATTR_INDEX(
419 			AS_MEMATTR_INDEX_IMPL_DEF_CACHE_POLICY);
420 		break;
421 	case CSF_FIRMWARE_CACHE_MODE_UNCACHED_COHERENT:
422 	case CSF_FIRMWARE_CACHE_MODE_CACHED_COHERENT:
423 		WARN_ON(!is_shared);
424 		mem_flags |= KBASE_REG_SHARE_BOTH |
425 			KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_SHARED);
426 		break;
427 	default:
428 		dev_err(kbdev->dev,
429 			"Firmware contains interface with unsupported cache mode\n");
430 		break;
431 	}
432 	return mem_flags;
433 }
434 
load_fw_image_section(struct kbase_device * kbdev,const u8 * data,struct tagged_addr * phys,u32 num_pages,u32 flags,u32 data_start,u32 data_end)435 static void load_fw_image_section(struct kbase_device *kbdev, const u8 *data,
436 		struct tagged_addr *phys, u32 num_pages, u32 flags,
437 		u32 data_start, u32 data_end)
438 {
439 	u32 data_pos = data_start;
440 	u32 data_len = data_end - data_start;
441 	u32 page_num;
442 	u32 page_limit;
443 
444 	if (flags & CSF_FIRMWARE_ENTRY_ZERO)
445 		page_limit = num_pages;
446 	else
447 		page_limit = (data_len + PAGE_SIZE - 1) / PAGE_SIZE;
448 
449 	for (page_num = 0; page_num < page_limit; ++page_num) {
450 		struct page *const page = as_page(phys[page_num]);
451 		char *const p = kmap_atomic(page);
452 		u32 const copy_len = min_t(u32, PAGE_SIZE, data_len);
453 
454 		if (copy_len > 0) {
455 			memcpy(p, data + data_pos, copy_len);
456 			data_pos += copy_len;
457 			data_len -= copy_len;
458 		}
459 
460 		if (flags & CSF_FIRMWARE_ENTRY_ZERO) {
461 			u32 const zi_len = PAGE_SIZE - copy_len;
462 
463 			memset(p + copy_len, 0, zi_len);
464 		}
465 
466 		kbase_sync_single_for_device(kbdev, kbase_dma_addr_from_tagged(phys[page_num]),
467 					     PAGE_SIZE, DMA_TO_DEVICE);
468 		kunmap_atomic(p);
469 	}
470 }
471 
reload_fw_image(struct kbase_device * kbdev)472 static int reload_fw_image(struct kbase_device *kbdev)
473 {
474 	const u32 magic = FIRMWARE_HEADER_MAGIC;
475 	struct kbase_csf_firmware_interface *interface;
476 	struct kbase_csf_mcu_fw *const mcu_fw = &kbdev->csf.fw;
477 	int ret = 0;
478 
479 	if (WARN_ON(mcu_fw->data == NULL)) {
480 		dev_err(kbdev->dev, "Firmware image copy not loaded\n");
481 		ret = -EINVAL;
482 		goto out;
483 	}
484 
485 	/* Do a basic sanity check on MAGIC signature */
486 	if (memcmp(mcu_fw->data, &magic, sizeof(magic)) != 0) {
487 		dev_err(kbdev->dev, "Incorrect magic value, firmware image could have been corrupted\n");
488 		ret = -EINVAL;
489 		goto out;
490 	}
491 
492 	list_for_each_entry(interface, &kbdev->csf.firmware_interfaces, node) {
493 		/* Dont skip re-loading any section if full reload was requested */
494 		if (!kbdev->csf.firmware_full_reload_needed) {
495 			/* Skip reload of text & read only data sections */
496 			if ((interface->flags & CSF_FIRMWARE_ENTRY_EXECUTE) ||
497 			    !(interface->flags & CSF_FIRMWARE_ENTRY_WRITE))
498 				continue;
499 		}
500 
501 		load_fw_image_section(kbdev, mcu_fw->data, interface->phys, interface->num_pages,
502 				      interface->flags, interface->data_start, interface->data_end);
503 	}
504 
505 	kbdev->csf.firmware_full_reload_needed = false;
506 
507 	kbase_csf_firmware_reload_trace_buffers_data(kbdev);
508 out:
509 	return ret;
510 }
511 
512 /**
513  * entry_find_large_page_to_reuse() - Find if the large page of previously parsed
514  *                                    FW interface entry can be reused to store
515  *                                    the contents of new FW interface entry.
516  *
517  * @kbdev: Kbase device structure
518  * @virtual_start: Start of the virtual address range required for an entry allocation
519  * @virtual_end: End of the virtual address range required for an entry allocation
520  * @flags: Firmware entry flags for comparison with the reusable pages found
521  * @phys: Pointer to the array of physical (tagged) addresses making up the new
522  *        FW interface entry. It is an output parameter which would be made to
523  *        point to an already existing array allocated for the previously parsed
524  *        FW interface entry using large page(s). If no appropriate entry is
525  *        found it is set to NULL.
526  * @pma:  Pointer to a protected memory allocation. It is an output parameter
527  *        which would be made to the protected memory allocation of a previously
528  *        parsed FW interface entry using large page(s) from protected memory.
529  *        If no appropriate entry is found it is set to NULL.
530  * @num_pages: Number of pages requested.
531  * @num_pages_aligned: This is an output parameter used to carry the number of 4KB pages
532  *                     within the 2MB pages aligned allocation.
533  * @is_small_page: This is an output flag used to select between the small and large page
534  *                 to be used for the FW entry allocation.
535  *
536  * Go through all the already initialized interfaces and find if a previously
537  * allocated large page can be used to store contents of new FW interface entry.
538  *
539  * Return: true if a large page can be reused, false otherwise.
540  */
entry_find_large_page_to_reuse(struct kbase_device * kbdev,const u32 virtual_start,const u32 virtual_end,const u32 flags,struct tagged_addr ** phys,struct protected_memory_allocation *** pma,u32 num_pages,u32 * num_pages_aligned,bool * is_small_page)541 static inline bool entry_find_large_page_to_reuse(struct kbase_device *kbdev,
542 						  const u32 virtual_start, const u32 virtual_end,
543 						  const u32 flags, struct tagged_addr **phys,
544 						  struct protected_memory_allocation ***pma,
545 						  u32 num_pages, u32 *num_pages_aligned,
546 						  bool *is_small_page)
547 {
548 	struct kbase_csf_firmware_interface *interface = NULL;
549 	struct kbase_csf_firmware_interface *target_interface = NULL;
550 	u32 virtual_diff_min = U32_MAX;
551 	bool reuse_large_page = false;
552 
553 	CSTD_UNUSED(interface);
554 	CSTD_UNUSED(target_interface);
555 	CSTD_UNUSED(virtual_diff_min);
556 
557 	*num_pages_aligned = num_pages;
558 	*is_small_page = true;
559 	*phys = NULL;
560 	*pma = NULL;
561 
562 
563 	/* If the section starts at 2MB aligned boundary,
564 	 * then use 2MB page(s) for it.
565 	 */
566 	if (!(virtual_start & (SZ_2M - 1))) {
567 		*num_pages_aligned =
568 			round_up(*num_pages_aligned, NUM_4K_PAGES_IN_2MB_PAGE);
569 		*is_small_page = false;
570 		goto out;
571 	}
572 
573 	/* If the section doesn't lie within the same 2MB aligned boundary,
574 	 * then use 4KB pages as it would be complicated to use a 2MB page
575 	 * for such section.
576 	 */
577 	if ((virtual_start & ~(SZ_2M - 1)) != (virtual_end & ~(SZ_2M - 1)))
578 		goto out;
579 
580 	/* Find the nearest 2MB aligned section which comes before the current
581 	 * section.
582 	 */
583 	list_for_each_entry(interface, &kbdev->csf.firmware_interfaces, node) {
584 		const u32 virtual_diff = virtual_start - interface->virtual;
585 
586 		if (interface->virtual > virtual_end)
587 			continue;
588 
589 		if (interface->virtual & (SZ_2M - 1))
590 			continue;
591 
592 		if ((virtual_diff < virtual_diff_min) && (interface->flags == flags)) {
593 			target_interface = interface;
594 			virtual_diff_min = virtual_diff;
595 		}
596 	}
597 
598 	if (target_interface) {
599 		const u32 page_index = virtual_diff_min >> PAGE_SHIFT;
600 
601 		if (page_index >= target_interface->num_pages_aligned)
602 			goto out;
603 
604 		if (target_interface->phys)
605 			*phys = &target_interface->phys[page_index];
606 
607 		if (target_interface->pma)
608 			*pma = &target_interface->pma[page_index / NUM_4K_PAGES_IN_2MB_PAGE];
609 
610 		*is_small_page = false;
611 		reuse_large_page = true;
612 	}
613 
614 out:
615 	return reuse_large_page;
616 }
617 
618 /**
619  * parse_memory_setup_entry() - Process an "interface memory setup" section
620  *
621  * @kbdev: Kbase device structure
622  * @fw: The firmware image containing the section
623  * @entry: Pointer to the start of the section
624  * @size: Size (in bytes) of the section
625  *
626  * Read an "interface memory setup" section from the firmware image and create
627  * the necessary memory region including the MMU page tables. If successful
628  * the interface will be added to the kbase_device:csf.firmware_interfaces list.
629  *
630  * Return: 0 if successful, negative error code on failure
631  */
parse_memory_setup_entry(struct kbase_device * kbdev,const struct kbase_csf_mcu_fw * const fw,const u32 * entry,unsigned int size)632 static int parse_memory_setup_entry(struct kbase_device *kbdev,
633 				    const struct kbase_csf_mcu_fw *const fw, const u32 *entry,
634 				    unsigned int size)
635 {
636 	int ret = 0;
637 	const u32 flags = entry[0];
638 	const u32 virtual_start = entry[1];
639 	const u32 virtual_end = entry[2];
640 	const u32 data_start = entry[3];
641 	const u32 data_end = entry[4];
642 	u32 num_pages;
643 	u32 num_pages_aligned;
644 	char *name;
645 	void *name_entry;
646 	unsigned int name_len;
647 	struct tagged_addr *phys = NULL;
648 	struct kbase_csf_firmware_interface *interface = NULL;
649 	bool allocated_pages = false, protected_mode = false;
650 	unsigned long mem_flags = 0;
651 	u32 cache_mode = 0;
652 	struct protected_memory_allocation **pma = NULL;
653 	bool reuse_pages = false;
654 	bool is_small_page = true;
655 	bool ignore_page_migration = true;
656 
657 	if (data_end < data_start) {
658 		dev_err(kbdev->dev, "Firmware corrupt, data_end < data_start (0x%x<0x%x)\n",
659 				data_end, data_start);
660 		return -EINVAL;
661 	}
662 	if (virtual_end < virtual_start) {
663 		dev_err(kbdev->dev, "Firmware corrupt, virtual_end < virtual_start (0x%x<0x%x)\n",
664 				virtual_end, virtual_start);
665 		return -EINVAL;
666 	}
667 	if (data_end > fw->size) {
668 		dev_err(kbdev->dev, "Firmware corrupt, file truncated? data_end=0x%x > fw->size=0x%zx\n",
669 				data_end, fw->size);
670 		return -EINVAL;
671 	}
672 
673 	if ((virtual_start & ~PAGE_MASK) != 0 ||
674 			(virtual_end & ~PAGE_MASK) != 0) {
675 		dev_err(kbdev->dev, "Firmware corrupt: virtual addresses not page aligned: 0x%x-0x%x\n",
676 				virtual_start, virtual_end);
677 		return -EINVAL;
678 	}
679 
680 	if ((flags & CSF_FIRMWARE_ENTRY_SUPPORTED_FLAGS) != flags) {
681 		dev_err(kbdev->dev, "Firmware contains interface with unsupported flags (0x%x)\n",
682 				flags);
683 		return -EINVAL;
684 	}
685 
686 	if (flags & CSF_FIRMWARE_ENTRY_PROTECTED)
687 		protected_mode = true;
688 
689 	if (protected_mode && kbdev->csf.pma_dev == NULL) {
690 		dev_dbg(kbdev->dev,
691 			"Protected memory allocator not found, Firmware protected mode entry will not be supported");
692 		return 0;
693 	}
694 
695 	num_pages = (virtual_end - virtual_start)
696 		>> PAGE_SHIFT;
697 
698 	reuse_pages =
699 		entry_find_large_page_to_reuse(kbdev, virtual_start, virtual_end, flags, &phys,
700 					       &pma, num_pages, &num_pages_aligned, &is_small_page);
701 	if (!reuse_pages)
702 		phys = kmalloc_array(num_pages_aligned, sizeof(*phys), GFP_KERNEL);
703 
704 	if (!phys)
705 		return -ENOMEM;
706 
707 	if (protected_mode) {
708 		if (!reuse_pages) {
709 			pma = kbase_csf_protected_memory_alloc(
710 				kbdev, phys, num_pages_aligned, is_small_page);
711 		}
712 
713 		if (!pma)
714 			ret = -ENOMEM;
715 	} else {
716 		if (!reuse_pages) {
717 			ret = kbase_mem_pool_alloc_pages(
718 				kbase_mem_pool_group_select(kbdev, KBASE_MEM_GROUP_CSF_FW,
719 							    is_small_page),
720 				num_pages_aligned, phys, false, NULL);
721 			ignore_page_migration = false;
722 		}
723 	}
724 
725 	if (ret < 0) {
726 		dev_err(kbdev->dev,
727 			"Failed to allocate %u physical pages for the firmware interface entry at VA 0x%x\n",
728 			num_pages_aligned, virtual_start);
729 		goto out;
730 	}
731 
732 	allocated_pages = true;
733 	load_fw_image_section(kbdev, fw->data, phys, num_pages, flags,
734 			data_start, data_end);
735 
736 	/* Allocate enough memory for the struct kbase_csf_firmware_interface and
737 	 * the name of the interface.
738 	 */
739 	name_entry = (void *)entry + INTERFACE_ENTRY_NAME_OFFSET;
740 	name_len = strnlen(name_entry, size - INTERFACE_ENTRY_NAME_OFFSET);
741 	if (size < (INTERFACE_ENTRY_NAME_OFFSET + name_len + 1 + sizeof(u32))) {
742 		dev_err(kbdev->dev, "Memory setup entry too short to contain virtual_exe_start");
743 		ret = -EINVAL;
744 		goto out;
745 	}
746 
747 	interface = kmalloc(sizeof(*interface) + name_len + 1, GFP_KERNEL);
748 	if (!interface) {
749 		ret = -ENOMEM;
750 		goto out;
751 	}
752 	name = (void *)(interface + 1);
753 	memcpy(name, name_entry, name_len);
754 	name[name_len] = 0;
755 
756 	interface->name = name;
757 	interface->phys = phys;
758 	interface->reuse_pages = reuse_pages;
759 	interface->is_small_page = is_small_page;
760 	interface->num_pages = num_pages;
761 	interface->num_pages_aligned = num_pages_aligned;
762 	interface->virtual = virtual_start;
763 	interface->kernel_map = NULL;
764 	interface->flags = flags;
765 	interface->data_start = data_start;
766 	interface->data_end = data_end;
767 	interface->pma = pma;
768 
769 	/* Discover the virtual execution address field after the end of the name
770 	 * field taking into account the NULL-termination character.
771 	 */
772 	interface->virtual_exe_start = *((u32 *)(name_entry + name_len + 1));
773 
774 	mem_flags = convert_mem_flags(kbdev, flags, &cache_mode);
775 
776 	if (flags & CSF_FIRMWARE_ENTRY_SHARED) {
777 		struct page **page_list;
778 		u32 i;
779 		pgprot_t cpu_map_prot;
780 		u32 mem_attr_index = KBASE_REG_MEMATTR_VALUE(mem_flags);
781 
782 		/* Since SHARED memory type was used for mapping shared memory
783 		 * on GPU side, it can be mapped as cached on CPU side on both
784 		 * types of coherent platforms.
785 		 */
786 		if ((cache_mode == CSF_FIRMWARE_CACHE_MODE_CACHED_COHERENT) ||
787 		    (cache_mode == CSF_FIRMWARE_CACHE_MODE_UNCACHED_COHERENT)) {
788 			WARN_ON(mem_attr_index !=
789 					AS_MEMATTR_INDEX_SHARED);
790 			cpu_map_prot = PAGE_KERNEL;
791 		} else {
792 			WARN_ON(mem_attr_index !=
793 					AS_MEMATTR_INDEX_NON_CACHEABLE);
794 			cpu_map_prot = pgprot_writecombine(PAGE_KERNEL);
795 		}
796 
797 		page_list = kmalloc_array(num_pages, sizeof(*page_list),
798 				GFP_KERNEL);
799 		if (!page_list) {
800 			ret = -ENOMEM;
801 			goto out;
802 		}
803 
804 		for (i = 0; i < num_pages; i++)
805 			page_list[i] = as_page(phys[i]);
806 
807 		interface->kernel_map = vmap(page_list, num_pages, VM_MAP,
808 				cpu_map_prot);
809 
810 		kfree(page_list);
811 
812 		if (!interface->kernel_map) {
813 			ret = -ENOMEM;
814 			goto out;
815 		}
816 	}
817 
818 	/* Start location of the shared interface area is fixed and is
819 	 * specified in firmware spec, and so there shall only be a
820 	 * single entry with that start address.
821 	 */
822 	if (virtual_start == (KBASE_REG_ZONE_MCU_SHARED_BASE << PAGE_SHIFT))
823 		kbdev->csf.shared_interface = interface;
824 
825 	list_add(&interface->node, &kbdev->csf.firmware_interfaces);
826 
827 	if (!reuse_pages) {
828 		ret = kbase_mmu_insert_pages_no_flush(kbdev, &kbdev->csf.mcu_mmu,
829 						      virtual_start >> PAGE_SHIFT, phys,
830 						      num_pages_aligned, mem_flags,
831 						      KBASE_MEM_GROUP_CSF_FW, NULL, NULL,
832 						      ignore_page_migration);
833 
834 		if (ret != 0) {
835 			dev_err(kbdev->dev, "Failed to insert firmware pages\n");
836 			/* The interface has been added to the list, so cleanup will
837 			 * be handled by firmware unloading
838 			 */
839 		}
840 	}
841 
842 	dev_dbg(kbdev->dev, "Processed section '%s'", name);
843 
844 	return ret;
845 
846 out:
847 	if (allocated_pages) {
848 		if (!reuse_pages) {
849 			if (protected_mode) {
850 				kbase_csf_protected_memory_free(
851 					kbdev, pma, num_pages_aligned, is_small_page);
852 			} else {
853 				kbase_mem_pool_free_pages(
854 					kbase_mem_pool_group_select(
855 						kbdev, KBASE_MEM_GROUP_CSF_FW, is_small_page),
856 					num_pages_aligned, phys, false, false);
857 			}
858 		}
859 	}
860 
861 	if (!reuse_pages)
862 		kfree(phys);
863 
864 	kfree(interface);
865 	return ret;
866 }
867 
868 /**
869  * parse_timeline_metadata_entry() - Process a "timeline metadata" section
870  *
871  * Return: 0 if successful, negative error code on failure
872  *
873  * @kbdev: Kbase device structure
874  * @fw:    Firmware image containing the section
875  * @entry: Pointer to the section
876  * @size:  Size (in bytes) of the section
877  */
parse_timeline_metadata_entry(struct kbase_device * kbdev,const struct kbase_csf_mcu_fw * const fw,const u32 * entry,unsigned int size)878 static int parse_timeline_metadata_entry(struct kbase_device *kbdev,
879 					 const struct kbase_csf_mcu_fw *const fw, const u32 *entry,
880 					 unsigned int size)
881 {
882 	const u32 data_start = entry[0];
883 	const u32 data_size = entry[1];
884 	const u32 data_end = data_start + data_size;
885 	const char *name = (char *)&entry[2];
886 	struct firmware_timeline_metadata *metadata;
887 	const unsigned int name_len =
888 		size - TL_METADATA_ENTRY_NAME_OFFSET;
889 	size_t allocation_size = sizeof(*metadata) + name_len + 1 + data_size;
890 
891 	if (data_end > fw->size) {
892 		dev_err(kbdev->dev,
893 			"Firmware corrupt, file truncated? data_end=0x%x > fw->size=0x%zx",
894 			data_end, fw->size);
895 		return -EINVAL;
896 	}
897 
898 	/* Allocate enough space for firmware_timeline_metadata,
899 	 * its name and the content.
900 	 */
901 	metadata = kmalloc(allocation_size, GFP_KERNEL);
902 	if (!metadata)
903 		return -ENOMEM;
904 
905 	metadata->name = (char *)(metadata + 1);
906 	metadata->data = (char *)(metadata + 1) + name_len + 1;
907 	metadata->size = data_size;
908 
909 	memcpy(metadata->name, name, name_len);
910 	metadata->name[name_len] = 0;
911 
912 	/* Copy metadata's content. */
913 	memcpy(metadata->data, fw->data + data_start, data_size);
914 
915 	list_add(&metadata->node, &kbdev->csf.firmware_timeline_metadata);
916 
917 	dev_dbg(kbdev->dev, "Timeline metadata '%s'", metadata->name);
918 
919 	return 0;
920 }
921 
922 /**
923  * parse_build_info_metadata_entry() - Process a "build info metadata" section
924  * @kbdev: Kbase device structure
925  * @fw:    Firmware image containing the section
926  * @entry: Pointer to the section
927  * @size:  Size (in bytes) of the section
928  *
929  * This prints the git SHA of the firmware on frimware load.
930  *
931  * Return: 0 if successful, negative error code on failure
932  */
parse_build_info_metadata_entry(struct kbase_device * kbdev,const struct kbase_csf_mcu_fw * const fw,const u32 * entry,unsigned int size)933 static int parse_build_info_metadata_entry(struct kbase_device *kbdev,
934 					   const struct kbase_csf_mcu_fw *const fw,
935 					   const u32 *entry, unsigned int size)
936 {
937 	const u32 meta_start_addr = entry[0];
938 	char *ptr = NULL;
939 	size_t sha_pattern_len = strlen(BUILD_INFO_GIT_SHA_PATTERN);
940 
941 	/* Only print git SHA to avoid releasing sensitive information */
942 	ptr = strstr(fw->data + meta_start_addr, BUILD_INFO_GIT_SHA_PATTERN);
943 	/* Check that we won't overrun the found string  */
944 	if (ptr &&
945 	    strlen(ptr) >= BUILD_INFO_GIT_SHA_LEN + BUILD_INFO_GIT_DIRTY_LEN + sha_pattern_len) {
946 		char git_sha[BUILD_INFO_GIT_SHA_LEN + BUILD_INFO_GIT_DIRTY_LEN + 1];
947 		int i = 0;
948 
949 		/* Move ptr to start of SHA */
950 		ptr += sha_pattern_len;
951 		for (i = 0; i < BUILD_INFO_GIT_SHA_LEN; i++) {
952 			/* Ensure that the SHA is made up of hex digits */
953 			if (!isxdigit(ptr[i]))
954 				break;
955 
956 			git_sha[i] = ptr[i];
957 		}
958 
959 		/* Check if the next char indicates git SHA is dirty */
960 		if (ptr[i] == ' ' || ptr[i] == '+') {
961 			git_sha[i] = ptr[i];
962 			i++;
963 		}
964 		git_sha[i] = '\0';
965 
966 		dev_info(kbdev->dev, "Mali firmware git_sha: %s\n", git_sha);
967 	} else
968 		dev_info(kbdev->dev, "Mali firmware git_sha not found or invalid\n");
969 
970 	return 0;
971 }
972 
973 /**
974  * load_firmware_entry() - Process an entry from a firmware image
975  *
976  * @kbdev:  Kbase device
977  * @fw:     Firmware image containing the entry
978  * @offset: Byte offset within the image of the entry to load
979  * @header: Header word of the entry
980  *
981  * Read an entry from a firmware image and do any necessary work (e.g. loading
982  * the data into page accessible to the MCU).
983  *
984  * Unknown entries are ignored if the 'optional' flag is set within the entry,
985  * otherwise the function will fail with -EINVAL
986  *
987  * Return: 0 if successful, negative error code on failure
988  */
load_firmware_entry(struct kbase_device * kbdev,const struct kbase_csf_mcu_fw * const fw,u32 offset,u32 header)989 static int load_firmware_entry(struct kbase_device *kbdev, const struct kbase_csf_mcu_fw *const fw,
990 			       u32 offset, u32 header)
991 {
992 	const unsigned int type = entry_type(header);
993 	unsigned int size = entry_size(header);
994 	const bool optional = entry_optional(header);
995 	/* Update is used with configuration and tracebuffer entries to
996 	 * initiate a FIRMWARE_CONFIG_UPDATE, instead of triggering a
997 	 * silent reset.
998 	 */
999 	const bool updatable = entry_update(header);
1000 	const u32 *entry = (void *)(fw->data + offset);
1001 
1002 	if ((offset % sizeof(*entry)) || (size % sizeof(*entry))) {
1003 		dev_err(kbdev->dev, "Firmware entry isn't 32 bit aligned, offset=0x%x size=0x%x\n",
1004 				offset, size);
1005 		return -EINVAL;
1006 	}
1007 
1008 	if (size < sizeof(*entry)) {
1009 		dev_err(kbdev->dev, "Size field too small: %u\n", size);
1010 		return -EINVAL;
1011 	}
1012 
1013 	/* Remove the header */
1014 	entry++;
1015 	size -= sizeof(*entry);
1016 
1017 	switch (type) {
1018 	case CSF_FIRMWARE_ENTRY_TYPE_INTERFACE:
1019 		/* Interface memory setup */
1020 		if (size < INTERFACE_ENTRY_NAME_OFFSET + sizeof(*entry)) {
1021 			dev_err(kbdev->dev, "Interface memory setup entry too short (size=%u)\n",
1022 					size);
1023 			return -EINVAL;
1024 		}
1025 		return parse_memory_setup_entry(kbdev, fw, entry, size);
1026 	case CSF_FIRMWARE_ENTRY_TYPE_CONFIGURATION:
1027 		/* Configuration option */
1028 		if (size < CONFIGURATION_ENTRY_NAME_OFFSET + sizeof(*entry)) {
1029 			dev_err(kbdev->dev, "Configuration option entry too short (size=%u)\n",
1030 					size);
1031 			return -EINVAL;
1032 		}
1033 		return kbase_csf_firmware_cfg_option_entry_parse(
1034 			kbdev, fw, entry, size, updatable);
1035 	case CSF_FIRMWARE_ENTRY_TYPE_TRACE_BUFFER:
1036 		/* Trace buffer */
1037 		if (size < TRACE_BUFFER_ENTRY_NAME_OFFSET + sizeof(*entry)) {
1038 			dev_err(kbdev->dev, "Trace Buffer entry too short (size=%u)\n",
1039 				size);
1040 			return -EINVAL;
1041 		}
1042 		return kbase_csf_firmware_parse_trace_buffer_entry(
1043 			kbdev, entry, size, updatable);
1044 	case CSF_FIRMWARE_ENTRY_TYPE_TIMELINE_METADATA:
1045 		/* Meta data section */
1046 		if (size < TL_METADATA_ENTRY_NAME_OFFSET + sizeof(*entry)) {
1047 			dev_err(kbdev->dev, "Timeline metadata entry too short (size=%u)\n",
1048 				size);
1049 			return -EINVAL;
1050 		}
1051 		return parse_timeline_metadata_entry(kbdev, fw, entry, size);
1052 	case CSF_FIRMWARE_ENTRY_TYPE_BUILD_INFO_METADATA:
1053 		if (size < BUILD_INFO_METADATA_SIZE_OFFSET + sizeof(*entry)) {
1054 			dev_err(kbdev->dev, "Build info metadata entry too short (size=%u)\n",
1055 				size);
1056 			return -EINVAL;
1057 		}
1058 		return parse_build_info_metadata_entry(kbdev, fw, entry, size);
1059 	case CSF_FIRMWARE_ENTRY_TYPE_FUNC_CALL_LIST:
1060 		/* Function call list section */
1061 		if (size < FUNC_CALL_LIST_ENTRY_NAME_OFFSET + sizeof(*entry)) {
1062 			dev_err(kbdev->dev, "Function call list entry too short (size=%u)\n",
1063 				size);
1064 			return -EINVAL;
1065 		}
1066 		kbase_csf_firmware_log_parse_logging_call_list_entry(kbdev, entry);
1067 		return 0;
1068 	case CSF_FIRMWARE_ENTRY_TYPE_CORE_DUMP:
1069 		/* Core Dump section */
1070 		if (size < CORE_DUMP_ENTRY_START_ADDR_OFFSET + sizeof(*entry)) {
1071 			dev_err(kbdev->dev, "FW Core dump entry too short (size=%u)\n", size);
1072 			return -EINVAL;
1073 		}
1074 		return kbase_csf_firmware_core_dump_entry_parse(kbdev, entry);
1075 	default:
1076 		if (!optional) {
1077 			dev_err(kbdev->dev, "Unsupported non-optional entry type %u in firmware\n",
1078 				type);
1079 			return -EINVAL;
1080 		}
1081 	}
1082 
1083 	return 0;
1084 }
1085 
free_global_iface(struct kbase_device * kbdev)1086 static void free_global_iface(struct kbase_device *kbdev)
1087 {
1088 	struct kbase_csf_global_iface *iface = &kbdev->csf.global_iface;
1089 
1090 	if (iface->groups) {
1091 		unsigned int gid;
1092 
1093 		for (gid = 0; gid < iface->group_num; ++gid)
1094 			kfree(iface->groups[gid].streams);
1095 
1096 		kfree(iface->groups);
1097 		iface->groups = NULL;
1098 	}
1099 }
1100 
1101 /**
1102  * iface_gpu_va_to_cpu - Convert a GPU VA address within the shared interface
1103  *                       region to a CPU address, using the existing mapping.
1104  * @kbdev: Device pointer
1105  * @gpu_va: GPU VA to convert
1106  *
1107  * Return: A CPU pointer to the location within the shared interface region, or
1108  *         NULL on failure.
1109  */
iface_gpu_va_to_cpu(struct kbase_device * kbdev,u32 gpu_va)1110 static inline void *iface_gpu_va_to_cpu(struct kbase_device *kbdev, u32 gpu_va)
1111 {
1112 	struct kbase_csf_firmware_interface *interface =
1113 		kbdev->csf.shared_interface;
1114 	u8 *kernel_base = interface->kernel_map;
1115 
1116 	if (gpu_va < interface->virtual ||
1117 	    gpu_va >= interface->virtual + interface->num_pages * PAGE_SIZE) {
1118 		dev_err(kbdev->dev,
1119 				"Interface address 0x%x not within %u-page region at 0x%x",
1120 				gpu_va, interface->num_pages,
1121 				interface->virtual);
1122 		return NULL;
1123 	}
1124 
1125 	return (void *)(kernel_base + (gpu_va - interface->virtual));
1126 }
1127 
parse_cmd_stream_info(struct kbase_device * kbdev,struct kbase_csf_cmd_stream_info * sinfo,u32 * stream_base)1128 static int parse_cmd_stream_info(struct kbase_device *kbdev,
1129 		struct kbase_csf_cmd_stream_info *sinfo,
1130 		u32 *stream_base)
1131 {
1132 	sinfo->kbdev = kbdev;
1133 	sinfo->features = stream_base[STREAM_FEATURES/4];
1134 	sinfo->input = iface_gpu_va_to_cpu(kbdev,
1135 			stream_base[STREAM_INPUT_VA/4]);
1136 	sinfo->output = iface_gpu_va_to_cpu(kbdev,
1137 			stream_base[STREAM_OUTPUT_VA/4]);
1138 
1139 	if (sinfo->input == NULL || sinfo->output == NULL)
1140 		return -EINVAL;
1141 
1142 	return 0;
1143 }
1144 
parse_cmd_stream_group_info(struct kbase_device * kbdev,struct kbase_csf_cmd_stream_group_info * ginfo,u32 * group_base,u32 group_stride)1145 static int parse_cmd_stream_group_info(struct kbase_device *kbdev,
1146 		struct kbase_csf_cmd_stream_group_info *ginfo,
1147 		u32 *group_base, u32 group_stride)
1148 {
1149 	unsigned int sid;
1150 
1151 	ginfo->kbdev = kbdev;
1152 	ginfo->features = group_base[GROUP_FEATURES/4];
1153 	ginfo->input = iface_gpu_va_to_cpu(kbdev,
1154 			group_base[GROUP_INPUT_VA/4]);
1155 	ginfo->output = iface_gpu_va_to_cpu(kbdev,
1156 			group_base[GROUP_OUTPUT_VA/4]);
1157 
1158 	if (ginfo->input == NULL || ginfo->output == NULL)
1159 		return -ENOMEM;
1160 
1161 	ginfo->suspend_size = group_base[GROUP_SUSPEND_SIZE/4];
1162 	ginfo->protm_suspend_size = group_base[GROUP_PROTM_SUSPEND_SIZE/4];
1163 	ginfo->stream_num = group_base[GROUP_STREAM_NUM/4];
1164 
1165 	if (ginfo->stream_num < MIN_SUPPORTED_STREAMS_PER_GROUP ||
1166 			ginfo->stream_num > MAX_SUPPORTED_STREAMS_PER_GROUP) {
1167 		dev_err(kbdev->dev, "CSG with %u CSs out of range %u-%u",
1168 				ginfo->stream_num,
1169 				MIN_SUPPORTED_STREAMS_PER_GROUP,
1170 				MAX_SUPPORTED_STREAMS_PER_GROUP);
1171 		return -EINVAL;
1172 	}
1173 
1174 	ginfo->stream_stride = group_base[GROUP_STREAM_STRIDE/4];
1175 
1176 	if (ginfo->stream_num * ginfo->stream_stride > group_stride) {
1177 		dev_err(kbdev->dev,
1178 				"group stride of 0x%x exceeded by %u CSs with stride 0x%x",
1179 				group_stride, ginfo->stream_num,
1180 				ginfo->stream_stride);
1181 		return -EINVAL;
1182 	}
1183 
1184 	ginfo->streams = kmalloc_array(ginfo->stream_num,
1185 			sizeof(*ginfo->streams), GFP_KERNEL);
1186 
1187 	if (!ginfo->streams)
1188 		return -ENOMEM;
1189 
1190 	for (sid = 0; sid < ginfo->stream_num; sid++) {
1191 		int err;
1192 		u32 *stream_base = group_base + (STREAM_CONTROL_0 +
1193 				ginfo->stream_stride * sid) / 4;
1194 
1195 		err = parse_cmd_stream_info(kbdev, &ginfo->streams[sid],
1196 				stream_base);
1197 		if (err < 0) {
1198 			/* caller will free the memory for CSs array */
1199 			return err;
1200 		}
1201 	}
1202 
1203 	return 0;
1204 }
1205 
get_firmware_version(struct kbase_device * kbdev)1206 static u32 get_firmware_version(struct kbase_device *kbdev)
1207 {
1208 	struct kbase_csf_firmware_interface *interface =
1209 		kbdev->csf.shared_interface;
1210 	u32 *shared_info = interface->kernel_map;
1211 
1212 	return shared_info[GLB_VERSION/4];
1213 }
1214 
parse_capabilities(struct kbase_device * kbdev)1215 static int parse_capabilities(struct kbase_device *kbdev)
1216 {
1217 	struct kbase_csf_firmware_interface *interface =
1218 		kbdev->csf.shared_interface;
1219 	u32 *shared_info = interface->kernel_map;
1220 	struct kbase_csf_global_iface *iface = &kbdev->csf.global_iface;
1221 	unsigned int gid;
1222 
1223 	/* All offsets are in bytes, so divide by 4 for access via a u32 pointer
1224 	 */
1225 
1226 	/* The version number of the global interface is expected to be a
1227 	 * non-zero value. If it's not, the firmware may not have booted.
1228 	 */
1229 	iface->version = get_firmware_version(kbdev);
1230 	if (!iface->version) {
1231 		dev_err(kbdev->dev, "Version check failed. Firmware may have failed to boot.");
1232 		return -EINVAL;
1233 	}
1234 
1235 
1236 	iface->kbdev = kbdev;
1237 	iface->features = shared_info[GLB_FEATURES/4];
1238 	iface->input = iface_gpu_va_to_cpu(kbdev, shared_info[GLB_INPUT_VA/4]);
1239 	iface->output = iface_gpu_va_to_cpu(kbdev,
1240 			shared_info[GLB_OUTPUT_VA/4]);
1241 
1242 	if (iface->input == NULL || iface->output == NULL)
1243 		return -ENOMEM;
1244 
1245 	iface->group_num = shared_info[GLB_GROUP_NUM/4];
1246 
1247 	if (iface->group_num < MIN_SUPPORTED_CSGS ||
1248 			iface->group_num > MAX_SUPPORTED_CSGS) {
1249 		dev_err(kbdev->dev,
1250 				"Interface containing %u CSGs outside of range %u-%u",
1251 				iface->group_num, MIN_SUPPORTED_CSGS,
1252 				MAX_SUPPORTED_CSGS);
1253 		return -EINVAL;
1254 	}
1255 
1256 	iface->group_stride = shared_info[GLB_GROUP_STRIDE/4];
1257 	iface->prfcnt_size = shared_info[GLB_PRFCNT_SIZE/4];
1258 
1259 	if (iface->version >= kbase_csf_interface_version(1, 1, 0))
1260 		iface->instr_features = shared_info[GLB_INSTR_FEATURES / 4];
1261 	else
1262 		iface->instr_features = 0;
1263 
1264 	if ((GROUP_CONTROL_0 +
1265 		(unsigned long)iface->group_num * iface->group_stride) >
1266 			(interface->num_pages * PAGE_SIZE)) {
1267 		dev_err(kbdev->dev,
1268 				"interface size of %u pages exceeded by %u CSGs with stride 0x%x",
1269 				interface->num_pages, iface->group_num,
1270 				iface->group_stride);
1271 		return -EINVAL;
1272 	}
1273 
1274 	WARN_ON(iface->groups);
1275 
1276 	iface->groups = kcalloc(iface->group_num, sizeof(*iface->groups),
1277 				GFP_KERNEL);
1278 	if (!iface->groups)
1279 		return -ENOMEM;
1280 
1281 	for (gid = 0; gid < iface->group_num; gid++) {
1282 		int err;
1283 		u32 *group_base = shared_info + (GROUP_CONTROL_0 +
1284 				iface->group_stride * gid) / 4;
1285 
1286 		err = parse_cmd_stream_group_info(kbdev, &iface->groups[gid],
1287 				group_base, iface->group_stride);
1288 		if (err < 0) {
1289 			free_global_iface(kbdev);
1290 			return err;
1291 		}
1292 	}
1293 
1294 	return 0;
1295 }
1296 
access_firmware_memory_common(struct kbase_device * kbdev,struct kbase_csf_firmware_interface * interface,u32 offset_bytes,u32 * value,const bool read)1297 static inline void access_firmware_memory_common(struct kbase_device *kbdev,
1298 		struct kbase_csf_firmware_interface *interface, u32 offset_bytes,
1299 		u32 *value, const bool read)
1300 {
1301 	u32 page_num = offset_bytes >> PAGE_SHIFT;
1302 	u32 offset_in_page = offset_bytes & ~PAGE_MASK;
1303 	struct page *target_page = as_page(interface->phys[page_num]);
1304 	uintptr_t cpu_addr = (uintptr_t)kmap_atomic(target_page);
1305 	u32 *addr = (u32 *)(cpu_addr + offset_in_page);
1306 
1307 	if (read) {
1308 		kbase_sync_single_for_device(kbdev,
1309 			kbase_dma_addr_from_tagged(interface->phys[page_num]) + offset_in_page,
1310 			sizeof(u32), DMA_BIDIRECTIONAL);
1311 		*value = *addr;
1312 	} else {
1313 		*addr = *value;
1314 		kbase_sync_single_for_device(kbdev,
1315 			kbase_dma_addr_from_tagged(interface->phys[page_num]) + offset_in_page,
1316 			sizeof(u32), DMA_BIDIRECTIONAL);
1317 	}
1318 
1319 	kunmap_atomic((u32 *)cpu_addr);
1320 }
1321 
access_firmware_memory(struct kbase_device * kbdev,u32 gpu_addr,u32 * value,const bool read)1322 static inline void access_firmware_memory(struct kbase_device *kbdev,
1323 	u32 gpu_addr, u32 *value, const bool read)
1324 {
1325 	struct kbase_csf_firmware_interface *interface, *access_interface = NULL;
1326 	u32 offset_bytes = 0;
1327 
1328 	list_for_each_entry(interface, &kbdev->csf.firmware_interfaces, node) {
1329 		if ((gpu_addr >= interface->virtual) &&
1330 			(gpu_addr < interface->virtual + (interface->num_pages << PAGE_SHIFT))) {
1331 			offset_bytes = gpu_addr - interface->virtual;
1332 			access_interface = interface;
1333 			break;
1334 		}
1335 	}
1336 
1337 	if (access_interface)
1338 		access_firmware_memory_common(kbdev, access_interface, offset_bytes, value, read);
1339 	else
1340 		dev_warn(kbdev->dev, "Invalid GPU VA %x passed", gpu_addr);
1341 }
1342 
access_firmware_memory_exe(struct kbase_device * kbdev,u32 gpu_addr,u32 * value,const bool read)1343 static inline void access_firmware_memory_exe(struct kbase_device *kbdev,
1344 	u32 gpu_addr, u32 *value, const bool read)
1345 {
1346 	struct kbase_csf_firmware_interface *interface, *access_interface = NULL;
1347 	u32 offset_bytes = 0;
1348 
1349 	list_for_each_entry(interface, &kbdev->csf.firmware_interfaces, node) {
1350 		if ((gpu_addr >= interface->virtual_exe_start) &&
1351 			(gpu_addr < interface->virtual_exe_start +
1352 				(interface->num_pages << PAGE_SHIFT))) {
1353 			offset_bytes = gpu_addr - interface->virtual_exe_start;
1354 			access_interface = interface;
1355 
1356 			/* If there's an overlap in execution address range between a moved and a
1357 			 * non-moved areas, always prefer the moved one. The idea is that FW may
1358 			 * move sections around during init time, but after the layout is settled,
1359 			 * any moved sections are going to override non-moved areas at the same
1360 			 * location.
1361 			 */
1362 			if (interface->virtual_exe_start != interface->virtual)
1363 				break;
1364 		}
1365 	}
1366 
1367 	if (access_interface)
1368 		access_firmware_memory_common(kbdev, access_interface, offset_bytes, value, read);
1369 	else
1370 		dev_warn(kbdev->dev, "Invalid GPU VA %x passed", gpu_addr);
1371 }
1372 
kbase_csf_read_firmware_memory(struct kbase_device * kbdev,u32 gpu_addr,u32 * value)1373 void kbase_csf_read_firmware_memory(struct kbase_device *kbdev,
1374 	u32 gpu_addr, u32 *value)
1375 {
1376 	access_firmware_memory(kbdev, gpu_addr, value, true);
1377 }
1378 
kbase_csf_update_firmware_memory(struct kbase_device * kbdev,u32 gpu_addr,u32 value)1379 void kbase_csf_update_firmware_memory(struct kbase_device *kbdev,
1380 	u32 gpu_addr, u32 value)
1381 {
1382 	access_firmware_memory(kbdev, gpu_addr, &value, false);
1383 }
1384 
kbase_csf_read_firmware_memory_exe(struct kbase_device * kbdev,u32 gpu_addr,u32 * value)1385 void kbase_csf_read_firmware_memory_exe(struct kbase_device *kbdev,
1386 	u32 gpu_addr, u32 *value)
1387 {
1388 	access_firmware_memory_exe(kbdev, gpu_addr, value, true);
1389 }
1390 
kbase_csf_update_firmware_memory_exe(struct kbase_device * kbdev,u32 gpu_addr,u32 value)1391 void kbase_csf_update_firmware_memory_exe(struct kbase_device *kbdev,
1392 	u32 gpu_addr, u32 value)
1393 {
1394 	access_firmware_memory_exe(kbdev, gpu_addr, &value, false);
1395 }
1396 
kbase_csf_firmware_cs_input(const struct kbase_csf_cmd_stream_info * const info,const u32 offset,const u32 value)1397 void kbase_csf_firmware_cs_input(
1398 	const struct kbase_csf_cmd_stream_info *const info, const u32 offset,
1399 	const u32 value)
1400 {
1401 	const struct kbase_device * const kbdev = info->kbdev;
1402 
1403 	dev_dbg(kbdev->dev, "cs input w: reg %08x val %08x\n", offset, value);
1404 	input_page_write(info->input, offset, value);
1405 }
1406 
kbase_csf_firmware_cs_input_read(const struct kbase_csf_cmd_stream_info * const info,const u32 offset)1407 u32 kbase_csf_firmware_cs_input_read(
1408 	const struct kbase_csf_cmd_stream_info *const info,
1409 	const u32 offset)
1410 {
1411 	const struct kbase_device * const kbdev = info->kbdev;
1412 	u32 const val = input_page_read(info->input, offset);
1413 
1414 	dev_dbg(kbdev->dev, "cs input r: reg %08x val %08x\n", offset, val);
1415 	return val;
1416 }
1417 
kbase_csf_firmware_cs_input_mask(const struct kbase_csf_cmd_stream_info * const info,const u32 offset,const u32 value,const u32 mask)1418 void kbase_csf_firmware_cs_input_mask(
1419 	const struct kbase_csf_cmd_stream_info *const info, const u32 offset,
1420 	const u32 value, const u32 mask)
1421 {
1422 	const struct kbase_device * const kbdev = info->kbdev;
1423 
1424 	dev_dbg(kbdev->dev, "cs input w: reg %08x val %08x mask %08x\n",
1425 			offset, value, mask);
1426 	input_page_partial_write(info->input, offset, value, mask);
1427 }
1428 
kbase_csf_firmware_cs_output(const struct kbase_csf_cmd_stream_info * const info,const u32 offset)1429 u32 kbase_csf_firmware_cs_output(
1430 	const struct kbase_csf_cmd_stream_info *const info, const u32 offset)
1431 {
1432 	const struct kbase_device * const kbdev = info->kbdev;
1433 	u32 const val = output_page_read(info->output, offset);
1434 
1435 	dev_dbg(kbdev->dev, "cs output r: reg %08x val %08x\n", offset, val);
1436 	return val;
1437 }
1438 
kbase_csf_firmware_csg_input(const struct kbase_csf_cmd_stream_group_info * const info,const u32 offset,const u32 value)1439 void kbase_csf_firmware_csg_input(
1440 	const struct kbase_csf_cmd_stream_group_info *const info,
1441 	const u32 offset, const u32 value)
1442 {
1443 	const struct kbase_device * const kbdev = info->kbdev;
1444 
1445 	dev_dbg(kbdev->dev, "csg input w: reg %08x val %08x\n",
1446 			offset, value);
1447 	input_page_write(info->input, offset, value);
1448 }
1449 
kbase_csf_firmware_csg_input_read(const struct kbase_csf_cmd_stream_group_info * const info,const u32 offset)1450 u32 kbase_csf_firmware_csg_input_read(
1451 	const struct kbase_csf_cmd_stream_group_info *const info,
1452 	const u32 offset)
1453 {
1454 	const struct kbase_device * const kbdev = info->kbdev;
1455 	u32 const val = input_page_read(info->input, offset);
1456 
1457 	dev_dbg(kbdev->dev, "csg input r: reg %08x val %08x\n", offset, val);
1458 	return val;
1459 }
1460 
kbase_csf_firmware_csg_input_mask(const struct kbase_csf_cmd_stream_group_info * const info,const u32 offset,const u32 value,const u32 mask)1461 void kbase_csf_firmware_csg_input_mask(
1462 	const struct kbase_csf_cmd_stream_group_info *const info,
1463 	const u32 offset, const u32 value, const u32 mask)
1464 {
1465 	const struct kbase_device * const kbdev = info->kbdev;
1466 
1467 	dev_dbg(kbdev->dev, "csg input w: reg %08x val %08x mask %08x\n",
1468 			offset, value, mask);
1469 	input_page_partial_write(info->input, offset, value, mask);
1470 }
1471 
kbase_csf_firmware_csg_output(const struct kbase_csf_cmd_stream_group_info * const info,const u32 offset)1472 u32 kbase_csf_firmware_csg_output(
1473 	const struct kbase_csf_cmd_stream_group_info *const info,
1474 	const u32 offset)
1475 {
1476 	const struct kbase_device * const kbdev = info->kbdev;
1477 	u32 const val = output_page_read(info->output, offset);
1478 
1479 	dev_dbg(kbdev->dev, "csg output r: reg %08x val %08x\n", offset, val);
1480 	return val;
1481 }
1482 KBASE_EXPORT_TEST_API(kbase_csf_firmware_csg_output);
1483 
kbase_csf_firmware_global_input(const struct kbase_csf_global_iface * const iface,const u32 offset,const u32 value)1484 void kbase_csf_firmware_global_input(
1485 	const struct kbase_csf_global_iface *const iface, const u32 offset,
1486 	const u32 value)
1487 {
1488 	const struct kbase_device * const kbdev = iface->kbdev;
1489 
1490 	dev_dbg(kbdev->dev, "glob input w: reg %08x val %08x\n", offset, value);
1491 	input_page_write(iface->input, offset, value);
1492 }
1493 KBASE_EXPORT_TEST_API(kbase_csf_firmware_global_input);
1494 
kbase_csf_firmware_global_input_mask(const struct kbase_csf_global_iface * const iface,const u32 offset,const u32 value,const u32 mask)1495 void kbase_csf_firmware_global_input_mask(
1496 	const struct kbase_csf_global_iface *const iface, const u32 offset,
1497 	const u32 value, const u32 mask)
1498 {
1499 	const struct kbase_device * const kbdev = iface->kbdev;
1500 
1501 	dev_dbg(kbdev->dev, "glob input w: reg %08x val %08x mask %08x\n",
1502 			offset, value, mask);
1503 	input_page_partial_write(iface->input, offset, value, mask);
1504 }
1505 KBASE_EXPORT_TEST_API(kbase_csf_firmware_global_input_mask);
1506 
kbase_csf_firmware_global_input_read(const struct kbase_csf_global_iface * const iface,const u32 offset)1507 u32 kbase_csf_firmware_global_input_read(
1508 	const struct kbase_csf_global_iface *const iface, const u32 offset)
1509 {
1510 	const struct kbase_device * const kbdev = iface->kbdev;
1511 	u32 const val = input_page_read(iface->input, offset);
1512 
1513 	dev_dbg(kbdev->dev, "glob input r: reg %08x val %08x\n", offset, val);
1514 	return val;
1515 }
1516 
kbase_csf_firmware_global_output(const struct kbase_csf_global_iface * const iface,const u32 offset)1517 u32 kbase_csf_firmware_global_output(
1518 	const struct kbase_csf_global_iface *const iface, const u32 offset)
1519 {
1520 	const struct kbase_device * const kbdev = iface->kbdev;
1521 	u32 const val = output_page_read(iface->output, offset);
1522 
1523 	dev_dbg(kbdev->dev, "glob output r: reg %08x val %08x\n", offset, val);
1524 	return val;
1525 }
1526 KBASE_EXPORT_TEST_API(kbase_csf_firmware_global_output);
1527 
1528 /**
1529  * csf_doorbell_offset() - Calculate the offset to the CSF host doorbell
1530  * @doorbell_nr: Doorbell number
1531  *
1532  * Return: CSF host register offset for the specified doorbell number.
1533  */
csf_doorbell_offset(int doorbell_nr)1534 static u32 csf_doorbell_offset(int doorbell_nr)
1535 {
1536 	WARN_ON(doorbell_nr < 0);
1537 	WARN_ON(doorbell_nr >= CSF_NUM_DOORBELL);
1538 
1539 	return CSF_HW_DOORBELL_PAGE_OFFSET + (doorbell_nr * CSF_HW_DOORBELL_PAGE_SIZE);
1540 }
1541 
kbase_csf_ring_doorbell(struct kbase_device * kbdev,int doorbell_nr)1542 void kbase_csf_ring_doorbell(struct kbase_device *kbdev, int doorbell_nr)
1543 {
1544 	kbase_reg_write(kbdev, csf_doorbell_offset(doorbell_nr), (u32)1);
1545 }
1546 EXPORT_SYMBOL(kbase_csf_ring_doorbell);
1547 
1548 /**
1549  * handle_internal_firmware_fatal - Handler for CS internal firmware fault.
1550  *
1551  * @kbdev:  Pointer to kbase device
1552  *
1553  * Report group fatal error to user space for all GPU command queue groups
1554  * in the device, terminate them and reset GPU.
1555  */
handle_internal_firmware_fatal(struct kbase_device * const kbdev)1556 static void handle_internal_firmware_fatal(struct kbase_device *const kbdev)
1557 {
1558 	int as;
1559 
1560 	for (as = 0; as < kbdev->nr_hw_address_spaces; as++) {
1561 		unsigned long flags;
1562 		struct kbase_context *kctx;
1563 		struct kbase_fault fault;
1564 
1565 		if (as == MCU_AS_NR)
1566 			continue;
1567 
1568 		/* Only handle the fault for an active address space. Lock is
1569 		 * taken here to atomically get reference to context in an
1570 		 * active address space and retain its refcount.
1571 		 */
1572 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
1573 		kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as);
1574 
1575 		if (kctx) {
1576 			kbase_ctx_sched_retain_ctx_refcount(kctx);
1577 			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
1578 		} else {
1579 			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
1580 			continue;
1581 		}
1582 
1583 		fault = (struct kbase_fault) {
1584 			.status = GPU_EXCEPTION_TYPE_SW_FAULT_1,
1585 		};
1586 
1587 		kbase_csf_ctx_handle_fault(kctx, &fault);
1588 		kbase_ctx_sched_release_ctx_lock(kctx);
1589 	}
1590 
1591 	if (kbase_prepare_to_reset_gpu(kbdev,
1592 				       RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
1593 		kbase_reset_gpu(kbdev);
1594 }
1595 
1596 /**
1597  * firmware_error_worker - Worker function for handling firmware internal error
1598  *
1599  * @data: Pointer to a work_struct embedded in kbase device.
1600  *
1601  * Handle the CS internal firmware error
1602  */
firmware_error_worker(struct work_struct * const data)1603 static void firmware_error_worker(struct work_struct *const data)
1604 {
1605 	struct kbase_device *const kbdev =
1606 		container_of(data, struct kbase_device, csf.fw_error_work);
1607 
1608 	handle_internal_firmware_fatal(kbdev);
1609 }
1610 
global_request_complete(struct kbase_device * const kbdev,u32 const req_mask)1611 static bool global_request_complete(struct kbase_device *const kbdev,
1612 				    u32 const req_mask)
1613 {
1614 	struct kbase_csf_global_iface *global_iface =
1615 				&kbdev->csf.global_iface;
1616 	bool complete = false;
1617 	unsigned long flags;
1618 
1619 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
1620 
1621 	if ((kbase_csf_firmware_global_output(global_iface, GLB_ACK) &
1622 	     req_mask) ==
1623 	    (kbase_csf_firmware_global_input_read(global_iface, GLB_REQ) &
1624 	     req_mask))
1625 		complete = true;
1626 
1627 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
1628 
1629 	return complete;
1630 }
1631 
wait_for_global_request_with_timeout(struct kbase_device * const kbdev,u32 const req_mask,unsigned int timeout_ms)1632 static int wait_for_global_request_with_timeout(struct kbase_device *const kbdev,
1633 						u32 const req_mask, unsigned int timeout_ms)
1634 {
1635 	const long wait_timeout = kbase_csf_timeout_in_jiffies(timeout_ms);
1636 	long remaining;
1637 	int err = 0;
1638 
1639 	remaining = wait_event_timeout(kbdev->csf.event_wait,
1640 				       global_request_complete(kbdev, req_mask),
1641 				       wait_timeout);
1642 
1643 	if (!remaining) {
1644 		dev_warn(kbdev->dev,
1645 			 "[%llu] Timeout (%d ms) waiting for global request %x to complete",
1646 			 kbase_backend_get_cycle_cnt(kbdev), timeout_ms, req_mask);
1647 		err = -ETIMEDOUT;
1648 
1649 	}
1650 
1651 	return err;
1652 }
1653 
wait_for_global_request(struct kbase_device * const kbdev,u32 const req_mask)1654 static int wait_for_global_request(struct kbase_device *const kbdev, u32 const req_mask)
1655 {
1656 	return wait_for_global_request_with_timeout(kbdev, req_mask, kbdev->csf.fw_timeout_ms);
1657 }
1658 
set_global_request(const struct kbase_csf_global_iface * const global_iface,u32 const req_mask)1659 static void set_global_request(
1660 	const struct kbase_csf_global_iface *const global_iface,
1661 	u32 const req_mask)
1662 {
1663 	u32 glb_req;
1664 
1665 	kbase_csf_scheduler_spin_lock_assert_held(global_iface->kbdev);
1666 
1667 	glb_req = kbase_csf_firmware_global_output(global_iface, GLB_ACK);
1668 	glb_req ^= req_mask;
1669 	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, glb_req,
1670 					     req_mask);
1671 }
1672 
enable_endpoints_global(const struct kbase_csf_global_iface * const global_iface,u64 const shader_core_mask)1673 static void enable_endpoints_global(
1674 	const struct kbase_csf_global_iface *const global_iface,
1675 	u64 const shader_core_mask)
1676 {
1677 	kbase_csf_firmware_global_input(global_iface, GLB_ALLOC_EN_LO,
1678 		shader_core_mask & U32_MAX);
1679 	kbase_csf_firmware_global_input(global_iface, GLB_ALLOC_EN_HI,
1680 		shader_core_mask >> 32);
1681 
1682 	set_global_request(global_iface, GLB_REQ_CFG_ALLOC_EN_MASK);
1683 }
1684 
enable_shader_poweroff_timer(struct kbase_device * const kbdev,const struct kbase_csf_global_iface * const global_iface)1685 static void enable_shader_poweroff_timer(struct kbase_device *const kbdev,
1686 	const struct kbase_csf_global_iface *const global_iface)
1687 {
1688 	u32 pwroff_reg;
1689 
1690 	if (kbdev->csf.firmware_hctl_core_pwr)
1691 		pwroff_reg =
1692 		    GLB_PWROFF_TIMER_TIMER_SOURCE_SET(DISABLE_GLB_PWROFF_TIMER,
1693 			       GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
1694 	else
1695 		pwroff_reg = kbdev->csf.mcu_core_pwroff_dur_count;
1696 
1697 	kbase_csf_firmware_global_input(global_iface, GLB_PWROFF_TIMER,
1698 					pwroff_reg);
1699 	set_global_request(global_iface, GLB_REQ_CFG_PWROFF_TIMER_MASK);
1700 
1701 	/* Save the programed reg value in its shadow field */
1702 	kbdev->csf.mcu_core_pwroff_reg_shadow = pwroff_reg;
1703 
1704 	dev_dbg(kbdev->dev, "GLB_PWROFF_TIMER set to 0x%.8x\n", pwroff_reg);
1705 }
1706 
set_timeout_global(const struct kbase_csf_global_iface * const global_iface,u64 const timeout)1707 static void set_timeout_global(
1708 	const struct kbase_csf_global_iface *const global_iface,
1709 	u64 const timeout)
1710 {
1711 	kbase_csf_firmware_global_input(global_iface, GLB_PROGRESS_TIMER,
1712 		timeout / GLB_PROGRESS_TIMER_TIMEOUT_SCALE);
1713 
1714 	set_global_request(global_iface, GLB_REQ_CFG_PROGRESS_TIMER_MASK);
1715 }
1716 
enable_gpu_idle_timer(struct kbase_device * const kbdev)1717 static void enable_gpu_idle_timer(struct kbase_device *const kbdev)
1718 {
1719 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
1720 
1721 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
1722 
1723 	kbase_csf_firmware_global_input(global_iface, GLB_IDLE_TIMER,
1724 					kbdev->csf.gpu_idle_dur_count);
1725 	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, GLB_REQ_REQ_IDLE_ENABLE,
1726 					     GLB_REQ_IDLE_ENABLE_MASK);
1727 	dev_dbg(kbdev->dev, "Enabling GPU idle timer with count-value: 0x%.8x",
1728 		kbdev->csf.gpu_idle_dur_count);
1729 }
1730 
global_debug_request_complete(struct kbase_device * const kbdev,u32 const req_mask)1731 static bool global_debug_request_complete(struct kbase_device *const kbdev, u32 const req_mask)
1732 {
1733 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
1734 	bool complete = false;
1735 	unsigned long flags;
1736 
1737 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
1738 
1739 	if ((kbase_csf_firmware_global_output(global_iface, GLB_DEBUG_ACK) & req_mask) ==
1740 	    (kbase_csf_firmware_global_input_read(global_iface, GLB_DEBUG_REQ) & req_mask))
1741 		complete = true;
1742 
1743 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
1744 
1745 	return complete;
1746 }
1747 
set_global_debug_request(const struct kbase_csf_global_iface * const global_iface,u32 const req_mask)1748 static void set_global_debug_request(const struct kbase_csf_global_iface *const global_iface,
1749 				     u32 const req_mask)
1750 {
1751 	u32 glb_debug_req;
1752 
1753 	kbase_csf_scheduler_spin_lock_assert_held(global_iface->kbdev);
1754 
1755 	glb_debug_req = kbase_csf_firmware_global_output(global_iface, GLB_DEBUG_ACK);
1756 	glb_debug_req ^= req_mask;
1757 
1758 	kbase_csf_firmware_global_input_mask(global_iface, GLB_DEBUG_REQ, glb_debug_req, req_mask);
1759 }
1760 
request_fw_core_dump(const struct kbase_csf_global_iface * const global_iface)1761 static void request_fw_core_dump(
1762 	const struct kbase_csf_global_iface *const global_iface)
1763 {
1764 	uint32_t run_mode = GLB_DEBUG_REQ_RUN_MODE_SET(0, GLB_DEBUG_RUN_MODE_TYPE_CORE_DUMP);
1765 
1766 	set_global_debug_request(global_iface, GLB_DEBUG_REQ_DEBUG_RUN_MASK | run_mode);
1767 
1768 	set_global_request(global_iface, GLB_REQ_DEBUG_CSF_REQ_MASK);
1769 }
1770 
kbase_csf_firmware_req_core_dump(struct kbase_device * const kbdev)1771 int kbase_csf_firmware_req_core_dump(struct kbase_device *const kbdev)
1772 {
1773 	const struct kbase_csf_global_iface *const global_iface =
1774 		&kbdev->csf.global_iface;
1775 	unsigned long flags;
1776 	int ret;
1777 
1778 	/* Serialize CORE_DUMP requests. */
1779 	mutex_lock(&kbdev->csf.reg_lock);
1780 
1781 	/* Update GLB_REQ with CORE_DUMP request and make firmware act on it. */
1782 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
1783 	request_fw_core_dump(global_iface);
1784 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
1785 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
1786 
1787 	/* Wait for firmware to acknowledge completion of the CORE_DUMP request. */
1788 	ret = wait_for_global_request(kbdev, GLB_REQ_DEBUG_CSF_REQ_MASK);
1789 	if (!ret)
1790 		WARN_ON(!global_debug_request_complete(kbdev, GLB_DEBUG_REQ_DEBUG_RUN_MASK));
1791 
1792 	mutex_unlock(&kbdev->csf.reg_lock);
1793 
1794 	return ret;
1795 }
1796 
1797 /**
1798  * kbasep_enable_rtu - Enable Ray Tracing Unit on powering up shader core
1799  *
1800  * @kbdev:     The kbase device structure of the device
1801  *
1802  * This function needs to be called to enable the Ray Tracing Unit
1803  * by writing SHADER_PWRFEATURES only when host controls shader cores power.
1804  */
kbasep_enable_rtu(struct kbase_device * kbdev)1805 static void kbasep_enable_rtu(struct kbase_device *kbdev)
1806 {
1807 	const u32 gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
1808 
1809 	if (gpu_id < GPU_ID2_PRODUCT_MAKE(12, 8, 3, 0))
1810 		return;
1811 
1812 	if (kbdev->csf.firmware_hctl_core_pwr)
1813 		kbase_reg_write(kbdev, GPU_CONTROL_REG(SHADER_PWRFEATURES), 1);
1814 }
1815 
global_init(struct kbase_device * const kbdev,u64 core_mask)1816 static void global_init(struct kbase_device *const kbdev, u64 core_mask)
1817 {
1818 	u32 const ack_irq_mask =
1819 		GLB_ACK_IRQ_MASK_CFG_ALLOC_EN_MASK | GLB_ACK_IRQ_MASK_PING_MASK |
1820 		GLB_ACK_IRQ_MASK_CFG_PROGRESS_TIMER_MASK | GLB_ACK_IRQ_MASK_PROTM_ENTER_MASK |
1821 		GLB_ACK_IRQ_MASK_PROTM_EXIT_MASK | GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_MASK |
1822 		GLB_ACK_IRQ_MASK_CFG_PWROFF_TIMER_MASK | GLB_ACK_IRQ_MASK_IDLE_EVENT_MASK |
1823 		GLB_REQ_DEBUG_CSF_REQ_MASK | GLB_ACK_IRQ_MASK_IDLE_ENABLE_MASK;
1824 
1825 	const struct kbase_csf_global_iface *const global_iface =
1826 		&kbdev->csf.global_iface;
1827 	unsigned long flags;
1828 
1829 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
1830 
1831 	kbasep_enable_rtu(kbdev);
1832 
1833 	/* Update shader core allocation enable mask */
1834 	enable_endpoints_global(global_iface, core_mask);
1835 	enable_shader_poweroff_timer(kbdev, global_iface);
1836 
1837 	set_timeout_global(global_iface, kbase_csf_timeout_get(kbdev));
1838 
1839 	/* The GPU idle timer is always enabled for simplicity. Checks will be
1840 	 * done before scheduling the GPU idle worker to see if it is
1841 	 * appropriate for the current power policy.
1842 	 */
1843 	enable_gpu_idle_timer(kbdev);
1844 
1845 	/* Unmask the interrupts */
1846 	kbase_csf_firmware_global_input(global_iface,
1847 		GLB_ACK_IRQ_MASK, ack_irq_mask);
1848 
1849 #if IS_ENABLED(CONFIG_MALI_CORESIGHT)
1850 	/* Enable FW MCU read/write debug interfaces */
1851 	kbase_csf_firmware_global_input_mask(
1852 		global_iface, GLB_DEBUG_ACK_IRQ_MASK,
1853 		GLB_DEBUG_REQ_FW_AS_READ_MASK | GLB_DEBUG_REQ_FW_AS_WRITE_MASK,
1854 		GLB_DEBUG_REQ_FW_AS_READ_MASK | GLB_DEBUG_REQ_FW_AS_WRITE_MASK);
1855 #endif /* IS_ENABLED(CONFIG_MALI_CORESIGHT) */
1856 
1857 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
1858 
1859 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
1860 }
1861 
1862 /**
1863  * global_init_on_boot - Sends a global request to control various features.
1864  *
1865  * @kbdev: Instance of a GPU platform device that implements a CSF interface
1866  *
1867  * Currently only the request to enable endpoints and timeout for GPU progress
1868  * timer is sent.
1869  *
1870  * Return: 0 on success, or negative on failure.
1871  */
global_init_on_boot(struct kbase_device * const kbdev)1872 static int global_init_on_boot(struct kbase_device *const kbdev)
1873 {
1874 	unsigned long flags;
1875 	u64 core_mask;
1876 
1877 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
1878 	core_mask = kbase_pm_ca_get_core_mask(kbdev);
1879 	kbdev->csf.firmware_hctl_core_pwr =
1880 				kbase_pm_no_mcu_core_pwroff(kbdev);
1881 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
1882 
1883 	global_init(kbdev, core_mask);
1884 
1885 	return wait_for_global_request(kbdev, CSF_GLB_REQ_CFG_MASK);
1886 }
1887 
kbase_csf_firmware_global_reinit(struct kbase_device * kbdev,u64 core_mask)1888 void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev,
1889 				      u64 core_mask)
1890 {
1891 	lockdep_assert_held(&kbdev->hwaccess_lock);
1892 
1893 	kbdev->csf.glb_init_request_pending = true;
1894 	kbdev->csf.firmware_hctl_core_pwr =
1895 				kbase_pm_no_mcu_core_pwroff(kbdev);
1896 	global_init(kbdev, core_mask);
1897 }
1898 
kbase_csf_firmware_global_reinit_complete(struct kbase_device * kbdev)1899 bool kbase_csf_firmware_global_reinit_complete(struct kbase_device *kbdev)
1900 {
1901 	lockdep_assert_held(&kbdev->hwaccess_lock);
1902 	WARN_ON(!kbdev->csf.glb_init_request_pending);
1903 
1904 	if (global_request_complete(kbdev, CSF_GLB_REQ_CFG_MASK))
1905 		kbdev->csf.glb_init_request_pending = false;
1906 
1907 	return !kbdev->csf.glb_init_request_pending;
1908 }
1909 
kbase_csf_firmware_update_core_attr(struct kbase_device * kbdev,bool update_core_pwroff_timer,bool update_core_mask,u64 core_mask)1910 void kbase_csf_firmware_update_core_attr(struct kbase_device *kbdev,
1911 		bool update_core_pwroff_timer, bool update_core_mask, u64 core_mask)
1912 {
1913 	unsigned long flags;
1914 
1915 	lockdep_assert_held(&kbdev->hwaccess_lock);
1916 
1917 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
1918 	if (update_core_mask)
1919 		enable_endpoints_global(&kbdev->csf.global_iface, core_mask);
1920 	if (update_core_pwroff_timer)
1921 		enable_shader_poweroff_timer(kbdev, &kbdev->csf.global_iface);
1922 
1923 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
1924 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
1925 }
1926 
kbase_csf_firmware_core_attr_updated(struct kbase_device * kbdev)1927 bool kbase_csf_firmware_core_attr_updated(struct kbase_device *kbdev)
1928 {
1929 	lockdep_assert_held(&kbdev->hwaccess_lock);
1930 
1931 	return global_request_complete(kbdev, GLB_REQ_CFG_ALLOC_EN_MASK |
1932 					      GLB_REQ_CFG_PWROFF_TIMER_MASK);
1933 }
1934 
1935 /**
1936  * kbase_csf_firmware_reload_worker() - reload the fw image and re-enable the MCU
1937  * @work: CSF Work item for reloading the firmware.
1938  *
1939  * This helper function will reload the firmware image and re-enable the MCU.
1940  * It is supposed to be called after MCU(GPU) has been reset.
1941  * Unlike the initial boot the firmware binary image is not parsed completely.
1942  * Only the data sections, which were loaded in memory during the initial boot,
1943  * are re-initialized either by zeroing them or copying their data from the
1944  * firmware binary image. The memory allocation for the firmware pages and
1945  * MMU programming is not needed for the reboot, presuming the firmware binary
1946  * file on the filesystem would not change.
1947  */
kbase_csf_firmware_reload_worker(struct work_struct * work)1948 static void kbase_csf_firmware_reload_worker(struct work_struct *work)
1949 {
1950 	struct kbase_device *kbdev = container_of(work, struct kbase_device,
1951 						  csf.firmware_reload_work);
1952 	int err;
1953 
1954 	dev_info(kbdev->dev, "reloading firmware");
1955 
1956 	KBASE_TLSTREAM_TL_KBASE_CSFFW_FW_RELOADING(kbdev, kbase_backend_get_cycle_cnt(kbdev));
1957 
1958 	/* Reload just the data sections from firmware binary image */
1959 	err = reload_fw_image(kbdev);
1960 	if (err)
1961 		return;
1962 
1963 	kbase_csf_tl_reader_reset(&kbdev->timeline->csf_tl_reader);
1964 
1965 	/* Reboot the firmware */
1966 	kbase_csf_firmware_enable_mcu(kbdev);
1967 }
1968 
kbase_csf_firmware_trigger_reload(struct kbase_device * kbdev)1969 void kbase_csf_firmware_trigger_reload(struct kbase_device *kbdev)
1970 {
1971 	lockdep_assert_held(&kbdev->hwaccess_lock);
1972 
1973 	kbdev->csf.firmware_reloaded = false;
1974 
1975 	if (kbdev->csf.firmware_reload_needed) {
1976 		kbdev->csf.firmware_reload_needed = false;
1977 		queue_work(system_wq, &kbdev->csf.firmware_reload_work);
1978 	} else {
1979 		kbase_csf_firmware_enable_mcu(kbdev);
1980 	}
1981 }
1982 
kbase_csf_firmware_reload_completed(struct kbase_device * kbdev)1983 void kbase_csf_firmware_reload_completed(struct kbase_device *kbdev)
1984 {
1985 	u32 version;
1986 
1987 	lockdep_assert_held(&kbdev->hwaccess_lock);
1988 
1989 	if (unlikely(!kbdev->csf.firmware_inited))
1990 		return;
1991 
1992 	/* Check firmware rebooted properly: we do not expect
1993 	 * the version number to change with a running reboot.
1994 	 */
1995 	version = get_firmware_version(kbdev);
1996 
1997 	if (version != kbdev->csf.global_iface.version)
1998 		dev_err(kbdev->dev, "Version check failed in firmware reboot.");
1999 
2000 	KBASE_KTRACE_ADD(kbdev, CSF_FIRMWARE_REBOOT, NULL, 0u);
2001 
2002 	/* Tell MCU state machine to transit to next state */
2003 	kbdev->csf.firmware_reloaded = true;
2004 	kbase_pm_update_state(kbdev);
2005 }
2006 
convert_dur_to_idle_count(struct kbase_device * kbdev,const u32 dur_us)2007 static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_us)
2008 {
2009 #define HYSTERESIS_VAL_UNIT_SHIFT (10)
2010 	/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
2011 	u64 freq = arch_timer_get_cntfrq();
2012 	u64 dur_val = dur_us;
2013 	u32 cnt_val_u32, reg_val_u32;
2014 	bool src_system_timestamp = freq > 0;
2015 
2016 	if (!src_system_timestamp) {
2017 		/* Get the cycle_counter source alternative */
2018 		spin_lock(&kbdev->pm.clk_rtm.lock);
2019 		if (kbdev->pm.clk_rtm.clks[0])
2020 			freq = kbdev->pm.clk_rtm.clks[0]->clock_val;
2021 		else
2022 			dev_warn(kbdev->dev, "No GPU clock, unexpected intregration issue!");
2023 		spin_unlock(&kbdev->pm.clk_rtm.lock);
2024 
2025 		dev_info(
2026 			kbdev->dev,
2027 			"Can't get the timestamp frequency, use cycle counter format with firmware idle hysteresis!");
2028 	}
2029 
2030 	/* Formula for dur_val = ((dur_us/1000000) * freq_HZ) >> 10) */
2031 	dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
2032 	dur_val = div_u64(dur_val, 1000000);
2033 
2034 	/* Interface limits the value field to S32_MAX */
2035 	cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
2036 
2037 	reg_val_u32 = GLB_IDLE_TIMER_TIMEOUT_SET(0, cnt_val_u32);
2038 	/* add the source flag */
2039 	if (src_system_timestamp)
2040 		reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(reg_val_u32,
2041 				GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
2042 	else
2043 		reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(reg_val_u32,
2044 				GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER);
2045 
2046 	return reg_val_u32;
2047 }
2048 
kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device * kbdev)2049 u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev)
2050 {
2051 	unsigned long flags;
2052 	u32 dur;
2053 
2054 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2055 	dur = kbdev->csf.gpu_idle_hysteresis_us;
2056 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2057 
2058 	return dur;
2059 }
2060 
kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device * kbdev,u32 dur)2061 u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u32 dur)
2062 {
2063 	unsigned long flags;
2064 	const u32 hysteresis_val = convert_dur_to_idle_count(kbdev, dur);
2065 
2066 	/* The 'fw_load_lock' is taken to synchronize against the deferred
2067 	 * loading of FW, where the idle timer will be enabled.
2068 	 */
2069 	mutex_lock(&kbdev->fw_load_lock);
2070 	if (unlikely(!kbdev->csf.firmware_inited)) {
2071 		kbase_csf_scheduler_spin_lock(kbdev, &flags);
2072 		kbdev->csf.gpu_idle_hysteresis_us = dur;
2073 		kbdev->csf.gpu_idle_dur_count = hysteresis_val;
2074 		kbase_csf_scheduler_spin_unlock(kbdev, flags);
2075 		mutex_unlock(&kbdev->fw_load_lock);
2076 		goto end;
2077 	}
2078 	mutex_unlock(&kbdev->fw_load_lock);
2079 
2080 	kbase_csf_scheduler_pm_active(kbdev);
2081 	if (kbase_csf_scheduler_wait_mcu_active(kbdev)) {
2082 		dev_err(kbdev->dev,
2083 			"Unable to activate the MCU, the idle hysteresis value shall remain unchanged");
2084 		kbase_csf_scheduler_pm_idle(kbdev);
2085 		return kbdev->csf.gpu_idle_dur_count;
2086 	}
2087 
2088 	/* The 'reg_lock' is also taken and is held till the update is not
2089 	 * complete, to ensure the update of idle timer value by multiple Users
2090 	 * gets serialized.
2091 	 */
2092 	mutex_lock(&kbdev->csf.reg_lock);
2093 	/* The firmware only reads the new idle timer value when the timer is
2094 	 * disabled.
2095 	 */
2096 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2097 	kbase_csf_firmware_disable_gpu_idle_timer(kbdev);
2098 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2099 	/* Ensure that the request has taken effect */
2100 	wait_for_global_request(kbdev, GLB_REQ_IDLE_DISABLE_MASK);
2101 
2102 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2103 	kbdev->csf.gpu_idle_hysteresis_us = dur;
2104 	kbdev->csf.gpu_idle_dur_count = hysteresis_val;
2105 	kbase_csf_firmware_enable_gpu_idle_timer(kbdev);
2106 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2107 	wait_for_global_request(kbdev, GLB_REQ_IDLE_ENABLE_MASK);
2108 	mutex_unlock(&kbdev->csf.reg_lock);
2109 
2110 	kbase_csf_scheduler_pm_idle(kbdev);
2111 
2112 end:
2113 	dev_dbg(kbdev->dev, "CSF set firmware idle hysteresis count-value: 0x%.8x",
2114 		hysteresis_val);
2115 
2116 	return hysteresis_val;
2117 }
2118 
convert_dur_to_core_pwroff_count(struct kbase_device * kbdev,const u32 dur_us)2119 static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u32 dur_us)
2120 {
2121 	/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
2122 	u64 freq = arch_timer_get_cntfrq();
2123 	u64 dur_val = dur_us;
2124 	u32 cnt_val_u32, reg_val_u32;
2125 	bool src_system_timestamp = freq > 0;
2126 
2127 	if (!src_system_timestamp) {
2128 		/* Get the cycle_counter source alternative */
2129 		spin_lock(&kbdev->pm.clk_rtm.lock);
2130 		if (kbdev->pm.clk_rtm.clks[0])
2131 			freq = kbdev->pm.clk_rtm.clks[0]->clock_val;
2132 		else
2133 			dev_warn(kbdev->dev, "No GPU clock, unexpected integration issue!");
2134 		spin_unlock(&kbdev->pm.clk_rtm.lock);
2135 
2136 		dev_info(
2137 			kbdev->dev,
2138 			"Can't get the timestamp frequency, use cycle counter with MCU shader Core Poweroff timer!");
2139 	}
2140 
2141 	/* Formula for dur_val = ((dur_us/1e6) * freq_HZ) >> 10) */
2142 	dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
2143 	dur_val = div_u64(dur_val, 1000000);
2144 
2145 	/* Interface limits the value field to S32_MAX */
2146 	cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
2147 
2148 	reg_val_u32 = GLB_PWROFF_TIMER_TIMEOUT_SET(0, cnt_val_u32);
2149 	/* add the source flag */
2150 	if (src_system_timestamp)
2151 		reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(reg_val_u32,
2152 				GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
2153 	else
2154 		reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(reg_val_u32,
2155 				GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER);
2156 
2157 	return reg_val_u32;
2158 }
2159 
kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device * kbdev)2160 u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev)
2161 {
2162 	u32 pwroff;
2163 	unsigned long flags;
2164 
2165 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
2166 	pwroff = kbdev->csf.mcu_core_pwroff_dur_us;
2167 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
2168 
2169 	return pwroff;
2170 }
2171 
kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device * kbdev,u32 dur)2172 u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32 dur)
2173 {
2174 	unsigned long flags;
2175 	const u32 pwroff = convert_dur_to_core_pwroff_count(kbdev, dur);
2176 
2177 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
2178 	kbdev->csf.mcu_core_pwroff_dur_us = dur;
2179 	kbdev->csf.mcu_core_pwroff_dur_count = pwroff;
2180 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
2181 
2182 	dev_dbg(kbdev->dev, "MCU shader Core Poweroff input update: 0x%.8x", pwroff);
2183 
2184 	return pwroff;
2185 }
2186 
2187 /**
2188  * kbase_device_csf_iterator_trace_init - Send request to enable iterator
2189  *                                        trace port.
2190  * @kbdev: Kernel base device pointer
2191  *
2192  * Return: 0 on success (or if enable request is not sent), or error
2193  *         code -EINVAL on failure of GPU to acknowledge enable request.
2194  */
kbase_device_csf_iterator_trace_init(struct kbase_device * kbdev)2195 static int kbase_device_csf_iterator_trace_init(struct kbase_device *kbdev)
2196 {
2197 	/* Enable the iterator trace port if supported by the GPU.
2198 	 * It requires the GPU to have a nonzero "iter_trace_enable"
2199 	 * property in the device tree, and the FW must advertise
2200 	 * this feature in GLB_FEATURES.
2201 	 */
2202 	if (kbdev->pm.backend.gpu_powered) {
2203 		/* check device tree for iterator trace enable property */
2204 		const void *iter_trace_param = of_get_property(
2205 					       kbdev->dev->of_node,
2206 					       "iter_trace_enable", NULL);
2207 
2208 		const struct kbase_csf_global_iface *iface =
2209 						&kbdev->csf.global_iface;
2210 
2211 		if (iter_trace_param) {
2212 			u32 iter_trace_value = be32_to_cpup(iter_trace_param);
2213 
2214 			if ((iface->features &
2215 			     GLB_FEATURES_ITER_TRACE_SUPPORTED_MASK) &&
2216 			    iter_trace_value) {
2217 				long ack_timeout;
2218 
2219 				ack_timeout = kbase_csf_timeout_in_jiffies(
2220 					kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
2221 
2222 				/* write enable request to global input */
2223 				kbase_csf_firmware_global_input_mask(
2224 					iface, GLB_REQ,
2225 					GLB_REQ_ITER_TRACE_ENABLE_MASK,
2226 					GLB_REQ_ITER_TRACE_ENABLE_MASK);
2227 				/* Ring global doorbell */
2228 				kbase_csf_ring_doorbell(kbdev,
2229 						    CSF_KERNEL_DOORBELL_NR);
2230 
2231 				ack_timeout = wait_event_timeout(
2232 					kbdev->csf.event_wait,
2233 					!((kbase_csf_firmware_global_input_read(
2234 						   iface, GLB_REQ) ^
2235 					   kbase_csf_firmware_global_output(
2236 						   iface, GLB_ACK)) &
2237 					  GLB_REQ_ITER_TRACE_ENABLE_MASK),
2238 					ack_timeout);
2239 
2240 				return ack_timeout ? 0 : -EINVAL;
2241 
2242 			}
2243 		}
2244 
2245 	}
2246 	return 0;
2247 }
2248 
kbase_csf_firmware_early_init(struct kbase_device * kbdev)2249 int kbase_csf_firmware_early_init(struct kbase_device *kbdev)
2250 {
2251 	init_waitqueue_head(&kbdev->csf.event_wait);
2252 	kbdev->csf.interrupt_received = false;
2253 
2254 	kbdev->csf.fw_timeout_ms =
2255 		kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
2256 
2257 	kbdev->csf.mcu_core_pwroff_dur_us = DEFAULT_GLB_PWROFF_TIMEOUT_US;
2258 	kbdev->csf.mcu_core_pwroff_dur_count = convert_dur_to_core_pwroff_count(
2259 		kbdev, DEFAULT_GLB_PWROFF_TIMEOUT_US);
2260 
2261 	INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
2262 	INIT_LIST_HEAD(&kbdev->csf.firmware_config);
2263 	INIT_LIST_HEAD(&kbdev->csf.firmware_timeline_metadata);
2264 	INIT_LIST_HEAD(&kbdev->csf.firmware_trace_buffers.list);
2265 	INIT_LIST_HEAD(&kbdev->csf.user_reg.list);
2266 	INIT_WORK(&kbdev->csf.firmware_reload_work,
2267 		  kbase_csf_firmware_reload_worker);
2268 	INIT_WORK(&kbdev->csf.fw_error_work, firmware_error_worker);
2269 
2270 	mutex_init(&kbdev->csf.reg_lock);
2271 
2272 	kbdev->csf.fw = (struct kbase_csf_mcu_fw){ .data = NULL };
2273 
2274 	return 0;
2275 }
2276 
kbase_csf_firmware_early_term(struct kbase_device * kbdev)2277 void kbase_csf_firmware_early_term(struct kbase_device *kbdev)
2278 {
2279 	mutex_destroy(&kbdev->csf.reg_lock);
2280 }
2281 
kbase_csf_firmware_late_init(struct kbase_device * kbdev)2282 int kbase_csf_firmware_late_init(struct kbase_device *kbdev)
2283 {
2284 	kbdev->csf.gpu_idle_hysteresis_us = FIRMWARE_IDLE_HYSTERESIS_TIME_USEC;
2285 #ifdef KBASE_PM_RUNTIME
2286 	if (kbase_pm_gpu_sleep_allowed(kbdev))
2287 		kbdev->csf.gpu_idle_hysteresis_us /= FIRMWARE_IDLE_HYSTERESIS_GPU_SLEEP_SCALER;
2288 #endif
2289 	WARN_ON(!kbdev->csf.gpu_idle_hysteresis_us);
2290 	kbdev->csf.gpu_idle_dur_count =
2291 		convert_dur_to_idle_count(kbdev, kbdev->csf.gpu_idle_hysteresis_us);
2292 
2293 	return 0;
2294 }
2295 
kbase_csf_firmware_load_init(struct kbase_device * kbdev)2296 int kbase_csf_firmware_load_init(struct kbase_device *kbdev)
2297 {
2298 	const struct firmware *firmware = NULL;
2299 	struct kbase_csf_mcu_fw *const mcu_fw = &kbdev->csf.fw;
2300 	const u32 magic = FIRMWARE_HEADER_MAGIC;
2301 	u8 version_major, version_minor;
2302 	u32 version_hash;
2303 	u32 entry_end_offset;
2304 	u32 entry_offset;
2305 	int ret;
2306 
2307 	lockdep_assert_held(&kbdev->fw_load_lock);
2308 
2309 	if (WARN_ON((kbdev->as_free & MCU_AS_BITMASK) == 0))
2310 		return -EINVAL;
2311 	kbdev->as_free &= ~MCU_AS_BITMASK;
2312 
2313 	ret = kbase_mmu_init(kbdev, &kbdev->csf.mcu_mmu, NULL,
2314 		BASE_MEM_GROUP_DEFAULT);
2315 
2316 	if (ret != 0) {
2317 		/* Release the address space */
2318 		kbdev->as_free |= MCU_AS_BITMASK;
2319 		return ret;
2320 	}
2321 
2322 	ret = kbase_mcu_shared_interface_region_tracker_init(kbdev);
2323 	if (ret != 0) {
2324 		dev_err(kbdev->dev,
2325 			"Failed to setup the rb tree for managing shared interface segment\n");
2326 		goto err_out;
2327 	}
2328 
2329 	if (request_firmware(&firmware, fw_name, kbdev->dev) != 0) {
2330 		dev_err(kbdev->dev,
2331 				"Failed to load firmware image '%s'\n",
2332 				fw_name);
2333 		ret = -ENOENT;
2334 	} else {
2335 		/* Try to save a copy and then release the loaded firmware image */
2336 		mcu_fw->size = firmware->size;
2337 		mcu_fw->data = vmalloc((unsigned long)mcu_fw->size);
2338 
2339 		if (mcu_fw->data == NULL) {
2340 			ret = -ENOMEM;
2341 		} else {
2342 			memcpy(mcu_fw->data, firmware->data, mcu_fw->size);
2343 			dev_dbg(kbdev->dev, "Firmware image (%zu-bytes) retained in csf.fw\n",
2344 				mcu_fw->size);
2345 		}
2346 
2347 		release_firmware(firmware);
2348 	}
2349 
2350 	/* If error in loading or saving the image, branches to error out */
2351 	if (ret)
2352 		goto err_out;
2353 
2354 	if (mcu_fw->size < FIRMWARE_HEADER_LENGTH) {
2355 		dev_err(kbdev->dev, "Firmware too small\n");
2356 		ret = -EINVAL;
2357 		goto err_out;
2358 	}
2359 
2360 	if (memcmp(mcu_fw->data, &magic, sizeof(magic)) != 0) {
2361 		dev_err(kbdev->dev, "Incorrect firmware magic\n");
2362 		ret = -EINVAL;
2363 		goto err_out;
2364 	}
2365 
2366 	version_minor = mcu_fw->data[4];
2367 	version_major = mcu_fw->data[5];
2368 
2369 	if (version_major != FIRMWARE_HEADER_VERSION_MAJOR ||
2370 			version_minor != FIRMWARE_HEADER_VERSION_MINOR) {
2371 		dev_err(kbdev->dev,
2372 				"Firmware header version %d.%d not understood\n",
2373 				version_major, version_minor);
2374 		ret = -EINVAL;
2375 		goto err_out;
2376 	}
2377 
2378 	memcpy(&version_hash, &mcu_fw->data[8], sizeof(version_hash));
2379 
2380 	dev_notice(kbdev->dev, "Loading Mali firmware 0x%x", version_hash);
2381 
2382 	memcpy(&entry_end_offset, &mcu_fw->data[0x10], sizeof(entry_end_offset));
2383 
2384 	if (entry_end_offset > mcu_fw->size) {
2385 		dev_err(kbdev->dev, "Firmware image is truncated\n");
2386 		ret = -EINVAL;
2387 		goto err_out;
2388 	}
2389 
2390 	entry_offset = FIRMWARE_HEADER_LENGTH;
2391 	while (entry_offset < entry_end_offset) {
2392 		u32 header;
2393 		unsigned int size;
2394 
2395 		memcpy(&header, &mcu_fw->data[entry_offset], sizeof(header));
2396 
2397 		size = entry_size(header);
2398 
2399 		ret = load_firmware_entry(kbdev, mcu_fw, entry_offset, header);
2400 		if (ret != 0) {
2401 			dev_err(kbdev->dev, "Failed to load firmware image\n");
2402 			goto err_out;
2403 		}
2404 		entry_offset += size;
2405 	}
2406 
2407 	if (!kbdev->csf.shared_interface) {
2408 		dev_err(kbdev->dev, "Shared interface region not found\n");
2409 		ret = -EINVAL;
2410 		goto err_out;
2411 	} else {
2412 		ret = setup_shared_iface_static_region(kbdev);
2413 		if (ret != 0) {
2414 			dev_err(kbdev->dev, "Failed to insert a region for shared iface entry parsed from fw image\n");
2415 			goto err_out;
2416 		}
2417 	}
2418 
2419 	ret = kbase_csf_firmware_trace_buffers_init(kbdev);
2420 	if (ret != 0) {
2421 		dev_err(kbdev->dev, "Failed to initialize trace buffers\n");
2422 		goto err_out;
2423 	}
2424 
2425 	/* Make sure L2 cache is powered up */
2426 	kbase_pm_wait_for_l2_powered(kbdev);
2427 
2428 	/* Load the MMU tables into the selected address space */
2429 	ret = load_mmu_tables(kbdev);
2430 	if (ret != 0)
2431 		goto err_out;
2432 
2433 	boot_csf_firmware(kbdev);
2434 
2435 	ret = parse_capabilities(kbdev);
2436 	if (ret != 0)
2437 		goto err_out;
2438 
2439 	ret = kbase_csf_doorbell_mapping_init(kbdev);
2440 	if (ret != 0)
2441 		goto err_out;
2442 
2443 	ret = kbase_csf_scheduler_init(kbdev);
2444 	if (ret != 0)
2445 		goto err_out;
2446 
2447 	ret = kbase_csf_setup_dummy_user_reg_page(kbdev);
2448 	if (ret != 0)
2449 		goto err_out;
2450 
2451 	ret = kbase_csf_timeout_init(kbdev);
2452 	if (ret != 0)
2453 		goto err_out;
2454 
2455 	ret = global_init_on_boot(kbdev);
2456 	if (ret != 0)
2457 		goto err_out;
2458 
2459 	ret = kbase_csf_firmware_cfg_init(kbdev);
2460 	if (ret != 0)
2461 		goto err_out;
2462 
2463 	ret = kbase_device_csf_iterator_trace_init(kbdev);
2464 	if (ret != 0)
2465 		goto err_out;
2466 
2467 	ret = kbase_csf_firmware_log_init(kbdev);
2468 	if (ret != 0) {
2469 		dev_err(kbdev->dev, "Failed to initialize FW trace (err %d)", ret);
2470 		goto err_out;
2471 	}
2472 
2473 	if (kbdev->csf.fw_core_dump.available)
2474 		kbase_csf_firmware_core_dump_init(kbdev);
2475 
2476 	/* Firmware loaded successfully, ret = 0 */
2477 	KBASE_KTRACE_ADD(kbdev, CSF_FIRMWARE_BOOT, NULL,
2478 			(((u64)version_hash) << 32) |
2479 			(((u64)version_major) << 8) | version_minor);
2480 	return 0;
2481 
2482 err_out:
2483 	kbase_csf_firmware_unload_term(kbdev);
2484 	return ret;
2485 }
2486 
kbase_csf_firmware_unload_term(struct kbase_device * kbdev)2487 void kbase_csf_firmware_unload_term(struct kbase_device *kbdev)
2488 {
2489 	unsigned long flags;
2490 	int ret = 0;
2491 
2492 	cancel_work_sync(&kbdev->csf.fw_error_work);
2493 
2494 	ret = kbase_reset_gpu_wait(kbdev);
2495 
2496 	WARN(ret, "failed to wait for GPU reset");
2497 
2498 	kbase_csf_firmware_log_term(kbdev);
2499 
2500 	kbase_csf_firmware_cfg_term(kbdev);
2501 
2502 	kbase_csf_timeout_term(kbdev);
2503 
2504 	kbase_csf_free_dummy_user_reg_page(kbdev);
2505 
2506 	kbase_csf_scheduler_term(kbdev);
2507 
2508 	kbase_csf_doorbell_mapping_term(kbdev);
2509 
2510 	/* Explicitly trigger the disabling of MCU through the state machine and
2511 	 * wait for its completion. It may not have been disabled yet due to the
2512 	 * power policy.
2513 	 */
2514 	kbdev->pm.backend.mcu_desired = false;
2515 	kbase_pm_wait_for_desired_state(kbdev);
2516 
2517 	free_global_iface(kbdev);
2518 
2519 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
2520 	kbdev->csf.firmware_inited = false;
2521 	if (WARN_ON(kbdev->pm.backend.mcu_state != KBASE_MCU_OFF)) {
2522 		kbdev->pm.backend.mcu_state = KBASE_MCU_OFF;
2523 		stop_csf_firmware(kbdev);
2524 	}
2525 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
2526 
2527 	unload_mmu_tables(kbdev);
2528 
2529 	kbase_csf_firmware_trace_buffers_term(kbdev);
2530 
2531 	while (!list_empty(&kbdev->csf.firmware_interfaces)) {
2532 		struct kbase_csf_firmware_interface *interface;
2533 
2534 		interface =
2535 			list_first_entry(&kbdev->csf.firmware_interfaces,
2536 					 struct kbase_csf_firmware_interface,
2537 					 node);
2538 		list_del(&interface->node);
2539 
2540 		vunmap(interface->kernel_map);
2541 
2542 		if (!interface->reuse_pages) {
2543 			if (interface->flags & CSF_FIRMWARE_ENTRY_PROTECTED) {
2544 				kbase_csf_protected_memory_free(
2545 					kbdev, interface->pma, interface->num_pages_aligned,
2546 					interface->is_small_page);
2547 			} else {
2548 				kbase_mem_pool_free_pages(
2549 					kbase_mem_pool_group_select(
2550 						kbdev, KBASE_MEM_GROUP_CSF_FW,
2551 						interface->is_small_page),
2552 					interface->num_pages_aligned,
2553 					interface->phys,
2554 					true, false);
2555 			}
2556 
2557 			kfree(interface->phys);
2558 		}
2559 
2560 		kfree(interface);
2561 	}
2562 
2563 	while (!list_empty(&kbdev->csf.firmware_timeline_metadata)) {
2564 		struct firmware_timeline_metadata *metadata;
2565 
2566 		metadata = list_first_entry(
2567 			&kbdev->csf.firmware_timeline_metadata,
2568 			struct firmware_timeline_metadata,
2569 			node);
2570 		list_del(&metadata->node);
2571 
2572 		kfree(metadata);
2573 	}
2574 
2575 	if (kbdev->csf.fw.data) {
2576 		/* Free the copy of the firmware image */
2577 		vfree(kbdev->csf.fw.data);
2578 		kbdev->csf.fw.data = NULL;
2579 		dev_dbg(kbdev->dev, "Free retained image csf.fw (%zu-bytes)\n", kbdev->csf.fw.size);
2580 	}
2581 
2582 	/* This will also free up the region allocated for the shared interface
2583 	 * entry parsed from the firmware image.
2584 	 */
2585 	kbase_mcu_shared_interface_region_tracker_term(kbdev);
2586 
2587 	kbase_mmu_term(kbdev, &kbdev->csf.mcu_mmu);
2588 
2589 	/* Release the address space */
2590 	kbdev->as_free |= MCU_AS_BITMASK;
2591 }
2592 
2593 #if IS_ENABLED(CONFIG_MALI_CORESIGHT)
kbase_csf_firmware_mcu_register_write(struct kbase_device * const kbdev,u32 const reg_addr,u32 const reg_val)2594 int kbase_csf_firmware_mcu_register_write(struct kbase_device *const kbdev, u32 const reg_addr,
2595 					  u32 const reg_val)
2596 {
2597 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2598 	unsigned long flags;
2599 	int err;
2600 	u32 glb_req;
2601 
2602 	mutex_lock(&kbdev->csf.reg_lock);
2603 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2604 
2605 	/* Set the address and value to write */
2606 	kbase_csf_firmware_global_input(global_iface, GLB_DEBUG_ARG_IN0, reg_addr);
2607 	kbase_csf_firmware_global_input(global_iface, GLB_DEBUG_ARG_IN1, reg_val);
2608 
2609 	/* Set the Global Debug request for FW MCU write */
2610 	glb_req = kbase_csf_firmware_global_output(global_iface, GLB_DEBUG_ACK);
2611 	glb_req ^= GLB_DEBUG_REQ_FW_AS_WRITE_MASK;
2612 	kbase_csf_firmware_global_input_mask(global_iface, GLB_DEBUG_REQ, glb_req,
2613 					     GLB_DEBUG_REQ_FW_AS_WRITE_MASK);
2614 
2615 	set_global_request(global_iface, GLB_REQ_DEBUG_CSF_REQ_MASK);
2616 
2617 	/* Notify FW about the Global Debug request */
2618 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2619 
2620 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2621 
2622 	err = wait_for_global_request(kbdev, GLB_REQ_DEBUG_CSF_REQ_MASK);
2623 
2624 	mutex_unlock(&kbdev->csf.reg_lock);
2625 
2626 	dev_dbg(kbdev->dev, "w: reg %08x val %08x", reg_addr, reg_val);
2627 
2628 	return err;
2629 }
2630 
kbase_csf_firmware_mcu_register_read(struct kbase_device * const kbdev,u32 const reg_addr,u32 * reg_val)2631 int kbase_csf_firmware_mcu_register_read(struct kbase_device *const kbdev, u32 const reg_addr,
2632 					 u32 *reg_val)
2633 {
2634 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2635 	unsigned long flags;
2636 	int err;
2637 	u32 glb_req;
2638 
2639 	if (WARN_ON(reg_val == NULL))
2640 		return -EINVAL;
2641 
2642 	mutex_lock(&kbdev->csf.reg_lock);
2643 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2644 
2645 	/* Set the address to read */
2646 	kbase_csf_firmware_global_input(global_iface, GLB_DEBUG_ARG_IN0, reg_addr);
2647 
2648 	/* Set the Global Debug request for FW MCU read */
2649 	glb_req = kbase_csf_firmware_global_output(global_iface, GLB_DEBUG_ACK);
2650 	glb_req ^= GLB_DEBUG_REQ_FW_AS_READ_MASK;
2651 	kbase_csf_firmware_global_input_mask(global_iface, GLB_DEBUG_REQ, glb_req,
2652 					     GLB_DEBUG_REQ_FW_AS_READ_MASK);
2653 
2654 	set_global_request(global_iface, GLB_REQ_DEBUG_CSF_REQ_MASK);
2655 
2656 	/* Notify FW about the Global Debug request */
2657 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2658 
2659 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2660 
2661 	err = wait_for_global_request(kbdev, GLB_REQ_DEBUG_CSF_REQ_MASK);
2662 
2663 	if (!err) {
2664 		kbase_csf_scheduler_spin_lock(kbdev, &flags);
2665 		*reg_val = kbase_csf_firmware_global_output(global_iface, GLB_DEBUG_ARG_OUT0);
2666 		kbase_csf_scheduler_spin_unlock(kbdev, flags);
2667 	}
2668 
2669 	mutex_unlock(&kbdev->csf.reg_lock);
2670 
2671 	dev_dbg(kbdev->dev, "r: reg %08x val %08x", reg_addr, *reg_val);
2672 
2673 	return err;
2674 }
2675 
kbase_csf_firmware_mcu_register_poll(struct kbase_device * const kbdev,u32 const reg_addr,u32 const val_mask,u32 const reg_val)2676 int kbase_csf_firmware_mcu_register_poll(struct kbase_device *const kbdev, u32 const reg_addr,
2677 					 u32 const val_mask, u32 const reg_val)
2678 {
2679 	unsigned long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms) + jiffies;
2680 	u32 read_val;
2681 
2682 	dev_dbg(kbdev->dev, "p: reg %08x val %08x mask %08x", reg_addr, reg_val, val_mask);
2683 
2684 	while (time_before(jiffies, remaining)) {
2685 		int err = kbase_csf_firmware_mcu_register_read(kbdev, reg_addr, &read_val);
2686 
2687 		if (err) {
2688 			dev_err(kbdev->dev,
2689 				"Error reading MCU register value (read_val = %u, expect = %u)\n",
2690 				read_val, reg_val);
2691 			return err;
2692 		}
2693 
2694 		if ((read_val & val_mask) == reg_val)
2695 			return 0;
2696 	}
2697 
2698 	dev_err(kbdev->dev,
2699 		"Timeout waiting for MCU register value to be set (read_val = %u, expect = %u)\n",
2700 		read_val, reg_val);
2701 
2702 	return -ETIMEDOUT;
2703 }
2704 #endif /* IS_ENABLED(CONFIG_MALI_CORESIGHT) */
2705 
kbase_csf_firmware_enable_gpu_idle_timer(struct kbase_device * kbdev)2706 void kbase_csf_firmware_enable_gpu_idle_timer(struct kbase_device *kbdev)
2707 {
2708 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2709 	const u32 glb_req = kbase_csf_firmware_global_input_read(global_iface, GLB_REQ);
2710 
2711 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
2712 	/* The scheduler is assumed to only call the enable when its internal
2713 	 * state indicates that the idle timer has previously been disabled. So
2714 	 * on entry the expected field values are:
2715 	 *   1. GLOBAL_INPUT_BLOCK.GLB_REQ.IDLE_ENABLE: 0
2716 	 *   2. GLOBAL_OUTPUT_BLOCK.GLB_ACK.IDLE_ENABLE: 0, or, on 1 -> 0
2717 	 */
2718 	if (glb_req & GLB_REQ_IDLE_ENABLE_MASK)
2719 		dev_err(kbdev->dev, "Incoherent scheduler state on REQ_IDLE_ENABLE!");
2720 
2721 	enable_gpu_idle_timer(kbdev);
2722 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2723 }
2724 
kbase_csf_firmware_disable_gpu_idle_timer(struct kbase_device * kbdev)2725 void kbase_csf_firmware_disable_gpu_idle_timer(struct kbase_device *kbdev)
2726 {
2727 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2728 
2729 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
2730 
2731 	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ,
2732 					GLB_REQ_REQ_IDLE_DISABLE,
2733 					GLB_REQ_IDLE_DISABLE_MASK);
2734 	dev_dbg(kbdev->dev, "Sending request to disable gpu idle timer");
2735 
2736 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2737 }
2738 
kbase_csf_firmware_ping(struct kbase_device * const kbdev)2739 void kbase_csf_firmware_ping(struct kbase_device *const kbdev)
2740 {
2741 	const struct kbase_csf_global_iface *const global_iface =
2742 		&kbdev->csf.global_iface;
2743 	unsigned long flags;
2744 
2745 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2746 	set_global_request(global_iface, GLB_REQ_PING_MASK);
2747 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2748 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2749 }
2750 
kbase_csf_firmware_ping_wait(struct kbase_device * const kbdev,unsigned int wait_timeout_ms)2751 int kbase_csf_firmware_ping_wait(struct kbase_device *const kbdev, unsigned int wait_timeout_ms)
2752 {
2753 	kbase_csf_firmware_ping(kbdev);
2754 
2755 	return wait_for_global_request_with_timeout(kbdev, GLB_REQ_PING_MASK, wait_timeout_ms);
2756 }
2757 
kbase_csf_firmware_set_timeout(struct kbase_device * const kbdev,u64 const timeout)2758 int kbase_csf_firmware_set_timeout(struct kbase_device *const kbdev,
2759 	u64 const timeout)
2760 {
2761 	const struct kbase_csf_global_iface *const global_iface =
2762 		&kbdev->csf.global_iface;
2763 	unsigned long flags;
2764 	int err;
2765 
2766 	/* The 'reg_lock' is also taken and is held till the update is not
2767 	 * complete, to ensure the update of timeout value by multiple Users
2768 	 * gets serialized.
2769 	 */
2770 	mutex_lock(&kbdev->csf.reg_lock);
2771 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2772 	set_timeout_global(global_iface, timeout);
2773 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2774 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2775 
2776 	err = wait_for_global_request(kbdev, GLB_REQ_CFG_PROGRESS_TIMER_MASK);
2777 	mutex_unlock(&kbdev->csf.reg_lock);
2778 
2779 	return err;
2780 }
2781 
kbase_csf_enter_protected_mode(struct kbase_device * kbdev)2782 void kbase_csf_enter_protected_mode(struct kbase_device *kbdev)
2783 {
2784 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2785 
2786 	KBASE_TLSTREAM_AUX_PROTECTED_ENTER_START(kbdev, kbdev);
2787 
2788 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
2789 	set_global_request(global_iface, GLB_REQ_PROTM_ENTER_MASK);
2790 	dev_dbg(kbdev->dev, "Sending request to enter protected mode");
2791 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2792 }
2793 
kbase_csf_wait_protected_mode_enter(struct kbase_device * kbdev)2794 int kbase_csf_wait_protected_mode_enter(struct kbase_device *kbdev)
2795 {
2796 	int err;
2797 
2798 	lockdep_assert_held(&kbdev->mmu_hw_mutex);
2799 
2800 	err = wait_for_global_request(kbdev, GLB_REQ_PROTM_ENTER_MASK);
2801 
2802 	if (!err) {
2803 #define WAIT_TIMEOUT 5000 /* 50ms timeout */
2804 #define DELAY_TIME_IN_US 10
2805 		const int max_iterations = WAIT_TIMEOUT;
2806 		int loop;
2807 
2808 		/* Wait for the GPU to actually enter protected mode */
2809 		for (loop = 0; loop < max_iterations; loop++) {
2810 			unsigned long flags;
2811 			bool pmode_exited;
2812 
2813 			if (kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS)) &
2814 			    GPU_STATUS_PROTECTED_MODE_ACTIVE)
2815 				break;
2816 
2817 			/* Check if GPU already exited the protected mode */
2818 			kbase_csf_scheduler_spin_lock(kbdev, &flags);
2819 			pmode_exited =
2820 				!kbase_csf_scheduler_protected_mode_in_use(kbdev);
2821 			kbase_csf_scheduler_spin_unlock(kbdev, flags);
2822 			if (pmode_exited)
2823 				break;
2824 
2825 			udelay(DELAY_TIME_IN_US);
2826 		}
2827 
2828 		if (loop == max_iterations) {
2829 			dev_err(kbdev->dev, "Timeout for actual pmode entry after PROTM_ENTER ack");
2830 			err = -ETIMEDOUT;
2831 		}
2832 	}
2833 
2834 	if (unlikely(err)) {
2835 		if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
2836 			kbase_reset_gpu(kbdev);
2837 	}
2838 
2839 	KBASE_TLSTREAM_AUX_PROTECTED_ENTER_END(kbdev, kbdev);
2840 
2841 	return err;
2842 }
2843 
kbase_csf_firmware_trigger_mcu_halt(struct kbase_device * kbdev)2844 void kbase_csf_firmware_trigger_mcu_halt(struct kbase_device *kbdev)
2845 {
2846 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2847 	unsigned long flags;
2848 
2849 	KBASE_TLSTREAM_TL_KBASE_CSFFW_FW_REQUEST_HALT(kbdev, kbase_backend_get_cycle_cnt(kbdev));
2850 
2851 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2852 	/* Validate there are no on-slot groups when sending the
2853 	 * halt request to firmware.
2854 	 */
2855 	WARN_ON(kbase_csf_scheduler_get_nr_active_csgs_locked(kbdev));
2856 	set_global_request(global_iface, GLB_REQ_HALT_MASK);
2857 	dev_dbg(kbdev->dev, "Sending request to HALT MCU");
2858 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2859 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2860 }
2861 
kbase_csf_firmware_enable_mcu(struct kbase_device * kbdev)2862 void kbase_csf_firmware_enable_mcu(struct kbase_device *kbdev)
2863 {
2864 	KBASE_TLSTREAM_TL_KBASE_CSFFW_FW_ENABLING(kbdev, kbase_backend_get_cycle_cnt(kbdev));
2865 
2866 	/* Trigger the boot of MCU firmware, Use the AUTO mode as
2867 	 * otherwise on fast reset, to exit protected mode, MCU will
2868 	 * not reboot by itself to enter normal mode.
2869 	 */
2870 	kbase_reg_write(kbdev, GPU_CONTROL_REG(MCU_CONTROL), MCU_CNTRL_AUTO);
2871 }
2872 
2873 #ifdef KBASE_PM_RUNTIME
kbase_csf_firmware_trigger_mcu_sleep(struct kbase_device * kbdev)2874 void kbase_csf_firmware_trigger_mcu_sleep(struct kbase_device *kbdev)
2875 {
2876 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2877 	unsigned long flags;
2878 
2879 	KBASE_TLSTREAM_TL_KBASE_CSFFW_FW_REQUEST_SLEEP(kbdev, kbase_backend_get_cycle_cnt(kbdev));
2880 
2881 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2882 	set_global_request(global_iface, GLB_REQ_SLEEP_MASK);
2883 	dev_dbg(kbdev->dev, "Sending sleep request to MCU");
2884 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2885 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2886 }
2887 
kbase_csf_firmware_is_mcu_in_sleep(struct kbase_device * kbdev)2888 bool kbase_csf_firmware_is_mcu_in_sleep(struct kbase_device *kbdev)
2889 {
2890 	lockdep_assert_held(&kbdev->hwaccess_lock);
2891 
2892 	return (global_request_complete(kbdev, GLB_REQ_SLEEP_MASK) &&
2893 		kbase_csf_firmware_mcu_halted(kbdev));
2894 }
2895 #endif
2896 
kbase_csf_trigger_firmware_config_update(struct kbase_device * kbdev)2897 int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev)
2898 {
2899 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
2900 	unsigned long flags;
2901 	int err = 0;
2902 
2903 	/* Ensure GPU is powered-up until we complete config update.*/
2904 	kbase_csf_scheduler_pm_active(kbdev);
2905 	kbase_csf_scheduler_wait_mcu_active(kbdev);
2906 
2907 	/* The 'reg_lock' is also taken and is held till the update is
2908 	 * complete, to ensure the config update gets serialized.
2909 	 */
2910 	mutex_lock(&kbdev->csf.reg_lock);
2911 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
2912 
2913 	set_global_request(global_iface, GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK);
2914 	dev_dbg(kbdev->dev, "Sending request for FIRMWARE_CONFIG_UPDATE");
2915 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
2916 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
2917 
2918 	err = wait_for_global_request(kbdev,
2919 				      GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK);
2920 	mutex_unlock(&kbdev->csf.reg_lock);
2921 
2922 	kbase_csf_scheduler_pm_idle(kbdev);
2923 	return err;
2924 }
2925 
2926 /**
2927  * copy_grp_and_stm - Copy CS and/or group data
2928  *
2929  * @iface:                Global CSF interface provided by the firmware.
2930  * @group_data:           Pointer where to store all the group data
2931  *                        (sequentially).
2932  * @max_group_num:        The maximum number of groups to be read. Can be 0, in
2933  *                        which case group_data is unused.
2934  * @stream_data:          Pointer where to store all the CS data
2935  *                        (sequentially).
2936  * @max_total_stream_num: The maximum number of CSs to be read.
2937  *                        Can be 0, in which case stream_data is unused.
2938  *
2939  * Return: Total number of CSs, summed across all groups.
2940  */
copy_grp_and_stm(const struct kbase_csf_global_iface * const iface,struct basep_cs_group_control * const group_data,u32 max_group_num,struct basep_cs_stream_control * const stream_data,u32 max_total_stream_num)2941 static u32 copy_grp_and_stm(
2942 	const struct kbase_csf_global_iface * const iface,
2943 	struct basep_cs_group_control * const group_data,
2944 	u32 max_group_num,
2945 	struct basep_cs_stream_control * const stream_data,
2946 	u32 max_total_stream_num)
2947 {
2948 	u32 i, total_stream_num = 0;
2949 
2950 	if (WARN_ON((max_group_num > 0) && !group_data))
2951 		max_group_num = 0;
2952 
2953 	if (WARN_ON((max_total_stream_num > 0) && !stream_data))
2954 		max_total_stream_num = 0;
2955 
2956 	for (i = 0; i < iface->group_num; i++) {
2957 		u32 j;
2958 
2959 		if (i < max_group_num) {
2960 			group_data[i].features = iface->groups[i].features;
2961 			group_data[i].stream_num = iface->groups[i].stream_num;
2962 			group_data[i].suspend_size =
2963 				iface->groups[i].suspend_size;
2964 		}
2965 		for (j = 0; j < iface->groups[i].stream_num; j++) {
2966 			if (total_stream_num < max_total_stream_num)
2967 				stream_data[total_stream_num].features =
2968 					iface->groups[i].streams[j].features;
2969 			total_stream_num++;
2970 		}
2971 	}
2972 
2973 	return total_stream_num;
2974 }
2975 
kbase_csf_firmware_get_glb_iface(struct kbase_device * kbdev,struct basep_cs_group_control * const group_data,u32 const max_group_num,struct basep_cs_stream_control * const stream_data,u32 const max_total_stream_num,u32 * const glb_version,u32 * const features,u32 * const group_num,u32 * const prfcnt_size,u32 * instr_features)2976 u32 kbase_csf_firmware_get_glb_iface(
2977 	struct kbase_device *kbdev,
2978 	struct basep_cs_group_control *const group_data,
2979 	u32 const max_group_num,
2980 	struct basep_cs_stream_control *const stream_data,
2981 	u32 const max_total_stream_num, u32 *const glb_version,
2982 	u32 *const features, u32 *const group_num, u32 *const prfcnt_size,
2983 	u32 *instr_features)
2984 {
2985 	const struct kbase_csf_global_iface * const iface =
2986 		&kbdev->csf.global_iface;
2987 
2988 	if (WARN_ON(!glb_version) || WARN_ON(!features) ||
2989 	    WARN_ON(!group_num) || WARN_ON(!prfcnt_size) ||
2990 	    WARN_ON(!instr_features))
2991 		return 0;
2992 
2993 	*glb_version = iface->version;
2994 	*features = iface->features;
2995 	*group_num = iface->group_num;
2996 	*prfcnt_size = iface->prfcnt_size;
2997 	*instr_features = iface->instr_features;
2998 
2999 	return copy_grp_and_stm(iface, group_data, max_group_num,
3000 		stream_data, max_total_stream_num);
3001 }
3002 
kbase_csf_firmware_get_timeline_metadata(struct kbase_device * kbdev,const char * name,size_t * size)3003 const char *kbase_csf_firmware_get_timeline_metadata(
3004 	struct kbase_device *kbdev, const char *name, size_t *size)
3005 {
3006 	struct firmware_timeline_metadata *metadata;
3007 
3008 	list_for_each_entry(
3009 		metadata, &kbdev->csf.firmware_timeline_metadata, node) {
3010 		if (!strcmp(metadata->name, name)) {
3011 			*size = metadata->size;
3012 			return metadata->data;
3013 		}
3014 	}
3015 
3016 	*size = 0;
3017 	return NULL;
3018 }
3019 
kbase_csf_firmware_mcu_shared_mapping_init(struct kbase_device * kbdev,unsigned int num_pages,unsigned long cpu_map_properties,unsigned long gpu_map_properties,struct kbase_csf_mapping * csf_mapping)3020 int kbase_csf_firmware_mcu_shared_mapping_init(
3021 		struct kbase_device *kbdev,
3022 		unsigned int num_pages,
3023 		unsigned long cpu_map_properties,
3024 		unsigned long gpu_map_properties,
3025 		struct kbase_csf_mapping *csf_mapping)
3026 {
3027 	struct tagged_addr *phys;
3028 	struct kbase_va_region *va_reg;
3029 	struct page **page_list;
3030 	void *cpu_addr;
3031 	int i, ret = 0;
3032 	pgprot_t cpu_map_prot = PAGE_KERNEL;
3033 	unsigned long gpu_map_prot;
3034 
3035 	if (cpu_map_properties & PROT_READ)
3036 		cpu_map_prot = PAGE_KERNEL_RO;
3037 
3038 	if (kbdev->system_coherency == COHERENCY_ACE) {
3039 		gpu_map_prot =
3040 			KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_DEFAULT_ACE);
3041 	} else {
3042 		gpu_map_prot =
3043 			KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_NON_CACHEABLE);
3044 		cpu_map_prot = pgprot_writecombine(cpu_map_prot);
3045 	}
3046 
3047 	phys = kmalloc_array(num_pages, sizeof(*phys), GFP_KERNEL);
3048 	if (!phys)
3049 		goto out;
3050 
3051 	page_list = kmalloc_array(num_pages, sizeof(*page_list), GFP_KERNEL);
3052 	if (!page_list)
3053 		goto page_list_alloc_error;
3054 
3055 	ret = kbase_mem_pool_alloc_pages(&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW], num_pages,
3056 					 phys, false, NULL);
3057 	if (ret <= 0)
3058 		goto phys_mem_pool_alloc_error;
3059 
3060 	for (i = 0; i < num_pages; i++)
3061 		page_list[i] = as_page(phys[i]);
3062 
3063 	cpu_addr = vmap(page_list, num_pages, VM_MAP, cpu_map_prot);
3064 	if (!cpu_addr)
3065 		goto vmap_error;
3066 
3067 	va_reg = kbase_alloc_free_region(kbdev, &kbdev->csf.shared_reg_rbtree, 0, num_pages,
3068 					 KBASE_REG_ZONE_MCU_SHARED);
3069 	if (!va_reg)
3070 		goto va_region_alloc_error;
3071 
3072 	mutex_lock(&kbdev->csf.reg_lock);
3073 	ret = kbase_add_va_region_rbtree(kbdev, va_reg, 0, num_pages, 1);
3074 	va_reg->flags &= ~KBASE_REG_FREE;
3075 	if (ret)
3076 		goto va_region_add_error;
3077 	mutex_unlock(&kbdev->csf.reg_lock);
3078 
3079 	gpu_map_properties &= (KBASE_REG_GPU_RD | KBASE_REG_GPU_WR);
3080 	gpu_map_properties |= gpu_map_prot;
3081 
3082 	ret = kbase_mmu_insert_pages_no_flush(kbdev, &kbdev->csf.mcu_mmu, va_reg->start_pfn,
3083 					      &phys[0], num_pages, gpu_map_properties,
3084 					      KBASE_MEM_GROUP_CSF_FW, NULL, NULL, false);
3085 	if (ret)
3086 		goto mmu_insert_pages_error;
3087 
3088 	kfree(page_list);
3089 	csf_mapping->phys = phys;
3090 	csf_mapping->cpu_addr = cpu_addr;
3091 	csf_mapping->va_reg = va_reg;
3092 	csf_mapping->num_pages = num_pages;
3093 
3094 	return 0;
3095 
3096 mmu_insert_pages_error:
3097 	mutex_lock(&kbdev->csf.reg_lock);
3098 	kbase_remove_va_region(kbdev, va_reg);
3099 va_region_add_error:
3100 	kbase_free_alloced_region(va_reg);
3101 	mutex_unlock(&kbdev->csf.reg_lock);
3102 va_region_alloc_error:
3103 	vunmap(cpu_addr);
3104 vmap_error:
3105 	kbase_mem_pool_free_pages(
3106 		&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW],
3107 		num_pages, phys, false, false);
3108 
3109 phys_mem_pool_alloc_error:
3110 	kfree(page_list);
3111 page_list_alloc_error:
3112 	kfree(phys);
3113 out:
3114 	/* Zero-initialize the mapping to make sure that the termination
3115 	 * function doesn't try to unmap or free random addresses.
3116 	 */
3117 	csf_mapping->phys = NULL;
3118 	csf_mapping->cpu_addr = NULL;
3119 	csf_mapping->va_reg = NULL;
3120 	csf_mapping->num_pages = 0;
3121 
3122 	return -ENOMEM;
3123 }
3124 
kbase_csf_firmware_mcu_shared_mapping_term(struct kbase_device * kbdev,struct kbase_csf_mapping * csf_mapping)3125 void kbase_csf_firmware_mcu_shared_mapping_term(
3126 		struct kbase_device *kbdev, struct kbase_csf_mapping *csf_mapping)
3127 {
3128 	if (csf_mapping->va_reg) {
3129 		mutex_lock(&kbdev->csf.reg_lock);
3130 		kbase_remove_va_region(kbdev, csf_mapping->va_reg);
3131 		kbase_free_alloced_region(csf_mapping->va_reg);
3132 		mutex_unlock(&kbdev->csf.reg_lock);
3133 	}
3134 
3135 	if (csf_mapping->phys) {
3136 		kbase_mem_pool_free_pages(
3137 			&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW],
3138 			csf_mapping->num_pages, csf_mapping->phys, false,
3139 			false);
3140 	}
3141 
3142 	vunmap(csf_mapping->cpu_addr);
3143 	kfree(csf_mapping->phys);
3144 }
3145