From 08f87f769b595151be1afeff53e144f543faa614 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 06 Dec 2023 09:51:13 +0000
Subject: [PATCH] add dts config

---
 kernel/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c |  113 ++++++++++++++++++++++++--------------------------------
 1 files changed, 48 insertions(+), 65 deletions(-)

diff --git a/kernel/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c b/kernel/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
index 38de7f6..d770913 100644
--- a/kernel/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
+++ b/kernel/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2022 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -20,10 +20,11 @@
  */
 
 #include "mali_kbase_vinstr.h"
-#include "mali_kbase_hwcnt_virtualizer.h"
-#include "mali_kbase_hwcnt_types.h"
+#include "hwcnt/mali_kbase_hwcnt_virtualizer.h"
+#include "hwcnt/mali_kbase_hwcnt_types.h"
 #include <uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h>
-#include "mali_kbase_hwcnt_gpu.h"
+#include "hwcnt/mali_kbase_hwcnt_gpu.h"
+#include "hwcnt/mali_kbase_hwcnt_gpu_narrow.h"
 #include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 #include "mali_malisw.h"
 #include "mali_kbase_debug.h"
@@ -37,7 +38,13 @@
 #include <linux/mutex.h>
 #include <linux/poll.h>
 #include <linux/slab.h>
+#include <linux/version_compat_defs.h>
 #include <linux/workqueue.h>
+
+/* Explicitly include epoll header for old kernels. Not required from 4.16. */
+#if KERNEL_VERSION(4, 16, 0) > LINUX_VERSION_CODE
+#include <uapi/linux/eventpoll.h>
+#endif
 
 /* Hwcnt reader API version */
 #define HWCNT_READER_API 1
@@ -55,8 +62,8 @@
  * @metadata:      Hardware counter metadata provided by virtualizer.
  * @metadata_user: API compatible hardware counter metadata provided by vinstr.
  *                 For compatibility with the user driver interface, this
- *                 contains a "truncated" version of the HWCNT metadata limited
- *                 to 64 entries per block. NULL when not required.
+ *                 contains a narrowed version of the HWCNT metadata limited
+ *                 to 64 entries per block of 32 bits each.
  * @lock:          Lock protecting all vinstr state.
  * @suspend_count: Suspend reference count. If non-zero, timer and worker are
  *                 prevented from being re-scheduled.
@@ -68,7 +75,7 @@
 struct kbase_vinstr_context {
 	struct kbase_hwcnt_virtualizer *hvirt;
 	const struct kbase_hwcnt_metadata *metadata;
-	const struct kbase_hwcnt_metadata *metadata_user;
+	const struct kbase_hwcnt_metadata_narrow *metadata_user;
 	struct mutex lock;
 	size_t suspend_count;
 	size_t client_count;
@@ -89,8 +96,8 @@
  *                     occur. If 0, not a periodic client.
  * @enable_map:        Counters enable map.
  * @tmp_buf:           Temporary buffer to use before handing dump to client.
- * @dump_bufs:         Array of dump buffers allocated by this client.
- * @dump_bufs_meta:    Metadata of dump buffers.
+ * @dump_bufs:         Array of narrow dump buffers allocated by this client.
+ * @dump_bufs_meta:    Metadata of hwcnt reader client buffers.
  * @meta_idx:          Index of metadata being accessed by userspace.
  * @read_idx:          Index of buffer read by userspace.
  * @write_idx:         Index of buffer being written by dump worker.
@@ -104,7 +111,7 @@
 	u32 dump_interval_ns;
 	struct kbase_hwcnt_enable_map enable_map;
 	struct kbase_hwcnt_dump_buffer tmp_buf;
-	struct kbase_hwcnt_dump_buffer_array dump_bufs;
+	struct kbase_hwcnt_dump_buffer_narrow_array dump_bufs;
 	struct kbase_hwcnt_reader_metadata *dump_bufs_meta;
 	atomic_t meta_idx;
 	atomic_t read_idx;
@@ -112,9 +119,7 @@
 	wait_queue_head_t waitq;
 };
 
-static unsigned int kbasep_vinstr_hwcnt_reader_poll(
-	struct file *filp,
-	poll_table *wait);
+static __poll_t kbasep_vinstr_hwcnt_reader_poll(struct file *filp, poll_table *wait);
 
 static long kbasep_vinstr_hwcnt_reader_ioctl(
 	struct file *filp,
@@ -190,7 +195,7 @@
 	unsigned int write_idx;
 	unsigned int read_idx;
 	struct kbase_hwcnt_dump_buffer *tmp_buf;
-	struct kbase_hwcnt_dump_buffer *dump_buf;
+	struct kbase_hwcnt_dump_buffer_narrow *dump_buf;
 	struct kbase_hwcnt_reader_metadata *meta;
 	u8 clk_cnt;
 
@@ -223,17 +228,11 @@
 	 * variant will explicitly zero any non-enabled counters to ensure
 	 * nothing except exactly what the user asked for is made visible.
 	 *
-	 * If the metadata in vinstr (vctx->metadata_user) is not NULL, it means
-	 * vinstr has the truncated metadata, so do a narrow copy since
-	 * virtualizer has a bigger buffer but user only needs part of it.
-	 * otherwise we do a full copy.
+	 * A narrow copy is required since virtualizer has a bigger buffer
+	 * but user only needs part of it.
 	 */
-	if (vcli->vctx->metadata_user)
-		kbase_hwcnt_dump_buffer_copy_strict_narrow(dump_buf, tmp_buf,
-							   &vcli->enable_map);
-	else
-		kbase_hwcnt_dump_buffer_copy_strict(dump_buf, tmp_buf,
-						    &vcli->enable_map);
+	kbase_hwcnt_dump_buffer_copy_strict_narrow(dump_buf, tmp_buf,
+						   &vcli->enable_map);
 
 	clk_cnt = vcli->vctx->metadata->clk_cnt;
 
@@ -362,6 +361,8 @@
  * kbasep_vinstr_dump_timer() - Dump timer that schedules the dump worker for
  *                              execution as soon as possible.
  * @timer: Timer structure.
+ *
+ * Return: HRTIMER_NORESTART always.
  */
 static enum hrtimer_restart kbasep_vinstr_dump_timer(struct hrtimer *timer)
 {
@@ -388,7 +389,7 @@
 
 	kbase_hwcnt_virtualizer_client_destroy(vcli->hvcli);
 	kfree(vcli->dump_bufs_meta);
-	kbase_hwcnt_dump_buffer_array_free(&vcli->dump_bufs);
+	kbase_hwcnt_dump_buffer_narrow_array_free(&vcli->dump_bufs);
 	kbase_hwcnt_dump_buffer_free(&vcli->tmp_buf);
 	kbase_hwcnt_enable_map_free(&vcli->enable_map);
 	kfree(vcli);
@@ -446,20 +447,11 @@
 	/* Enable all the available clk_enable_map. */
 	vcli->enable_map.clk_enable_map = (1ull << vctx->metadata->clk_cnt) - 1;
 
-	if (vctx->metadata_user)
-		/* Use vinstr's truncated metadata to alloc dump buffers which
-		 * interact with clients.
-		 */
-		errcode =
-			kbase_hwcnt_dump_buffer_array_alloc(vctx->metadata_user,
-							    setup->buffer_count,
-							    &vcli->dump_bufs);
-	else
-		/* Use metadata from virtualizer to allocate dump buffers  if
-		 * vinstr doesn't have the truncated metadata.
-		 */
-		errcode = kbase_hwcnt_dump_buffer_array_alloc(
-			vctx->metadata, setup->buffer_count, &vcli->dump_bufs);
+	/* Use vinstr's narrowed metadata to alloc narrow dump buffers which
+	 * interact with clients.
+	 */
+	errcode = kbase_hwcnt_dump_buffer_narrow_array_alloc(
+		vctx->metadata_user, setup->buffer_count, &vcli->dump_bufs);
 	if (errcode)
 		goto error;
 
@@ -504,9 +496,8 @@
 
 	vctx->hvirt = hvirt;
 	vctx->metadata = metadata;
-	vctx->metadata_user = NULL;
-	errcode = kbase_hwcnt_gpu_metadata_create_truncate_64(
-		&vctx->metadata_user, metadata);
+	errcode = kbase_hwcnt_gpu_metadata_narrow_create(&vctx->metadata_user,
+							 metadata);
 	if (errcode)
 		goto err_metadata_create;
 
@@ -530,8 +521,6 @@
 	if (!vctx)
 		return;
 
-	cancel_work_sync(&vctx->dump_work);
-
 	/* Non-zero client count implies client leak */
 	if (WARN_ON(vctx->client_count != 0)) {
 		struct kbase_vinstr_client *pos, *n;
@@ -543,8 +532,8 @@
 		}
 	}
 
-	if (vctx->metadata_user)
-		kbase_hwcnt_metadata_destroy(vctx->metadata_user);
+	cancel_work_sync(&vctx->dump_work);
+	kbase_hwcnt_gpu_metadata_narrow_destroy(vctx->metadata_user);
 
 	WARN_ON(vctx->client_count != 0);
 	kfree(vctx);
@@ -930,12 +919,13 @@
 }
 
 /**
- * The hwcnt reader's ioctl command - get API version.
+ * kbasep_vinstr_hwcnt_reader_ioctl_get_api_version() - get API version ioctl
+ *                                                      command.
  * @cli:    The non-NULL pointer to the client
  * @arg:    Command's argument.
  * @size:   Size of arg.
  *
- * @return 0 on success, else error code.
+ * Return: 0 on success, else error code.
  */
 static long kbasep_vinstr_hwcnt_reader_ioctl_get_api_version(
 	struct kbase_vinstr_client *cli, unsigned long arg, size_t size)
@@ -1006,14 +996,8 @@
 			cli, (u32 __user *)arg);
 		break;
 	case _IOC_NR(KBASE_HWCNT_READER_GET_BUFFER_SIZE):
-		if (cli->vctx->metadata_user)
-			rcode = put_user(
-				(u32)cli->vctx->metadata_user->dump_buf_bytes,
-				(u32 __user *)arg);
-		else
-			rcode = put_user(
-				(u32)cli->vctx->metadata->dump_buf_bytes,
-				(u32 __user *)arg);
+		rcode = put_user((u32)cli->vctx->metadata_user->dump_buf_bytes,
+				 (u32 __user *)arg);
 		break;
 	case _IOC_NR(KBASE_HWCNT_READER_DUMP):
 		rcode = kbasep_vinstr_hwcnt_reader_ioctl_dump(cli);
@@ -1055,26 +1039,25 @@
  * @filp: Non-NULL pointer to file structure.
  * @wait: Non-NULL pointer to poll table.
  *
- * Return: POLLIN if data can be read without blocking, 0 if data can not be
- *         read without blocking, else error code.
+ * Return: EPOLLIN | EPOLLRDNORM if data can be read without blocking, 0 if
+ *         data can not be read without blocking, else EPOLLHUP | EPOLLERR.
  */
-static unsigned int kbasep_vinstr_hwcnt_reader_poll(
-	struct file *filp,
-	poll_table *wait)
+static __poll_t kbasep_vinstr_hwcnt_reader_poll(struct file *filp, poll_table *wait)
 {
 	struct kbase_vinstr_client *cli;
 
 	if (!filp || !wait)
-		return -EINVAL;
+		return EPOLLHUP | EPOLLERR;
 
 	cli = filp->private_data;
 	if (!cli)
-		return -EINVAL;
+		return EPOLLHUP | EPOLLERR;
 
 	poll_wait(filp, &cli->waitq, wait);
 	if (kbasep_vinstr_hwcnt_reader_buffer_ready(cli))
-		return POLLIN;
-	return 0;
+		return EPOLLIN | EPOLLRDNORM;
+
+	return (__poll_t)0;
 }
 
 /**

--
Gitblit v1.6.2