From d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 02:45:28 +0000
Subject: [PATCH] add boot partition size
---
kernel/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c | 168 ++++++++++++++++++++++++++++++++------------------------
1 files changed, 96 insertions(+), 72 deletions(-)
diff --git a/kernel/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c b/kernel/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
index dfafbcc..9ed5963 100644
--- a/kernel/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
+++ b/kernel/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
/*
*
- * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2023 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
@@ -24,9 +24,6 @@
#include "mali_kbase_tracepoints.h"
#include <mali_kbase.h>
-#include <mali_kbase_jm.h>
-
-#include <linux/anon_inodes.h>
#include <linux/atomic.h>
#include <linux/file.h>
#include <linux/mutex.h>
@@ -35,7 +32,7 @@
#include <linux/stringify.h>
#include <linux/timer.h>
#include <linux/wait.h>
-
+#include <linux/delay.h>
/* The period of autoflush checker execution in milliseconds. */
#define AUTOFLUSH_INTERVAL 1000 /* ms */
@@ -184,88 +181,109 @@
}
#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-int kbase_timeline_io_acquire(struct kbase_device *kbdev, u32 flags)
+int kbase_timeline_acquire(struct kbase_device *kbdev, u32 flags)
{
- int ret = 0;
+ int err = 0;
u32 timeline_flags = TLSTREAM_ENABLED | flags;
- struct kbase_timeline *timeline = kbdev->timeline;
+ struct kbase_timeline *timeline;
+ int rcode;
- if (!atomic_cmpxchg(timeline->timeline_flags, 0, timeline_flags)) {
- int rcode;
+ if (WARN_ON(!kbdev) || WARN_ON(flags & ~BASE_TLSTREAM_FLAGS_MASK))
+ return -EINVAL;
+
+ timeline = kbdev->timeline;
+ if (WARN_ON(!timeline))
+ return -EFAULT;
+
+ if (atomic_cmpxchg(timeline->timeline_flags, 0, timeline_flags))
+ return -EBUSY;
#if MALI_USE_CSF
- if (flags & BASE_TLSTREAM_ENABLE_CSFFW_TRACEPOINTS) {
- ret = kbase_csf_tl_reader_start(
- &timeline->csf_tl_reader, kbdev);
- if (ret)
- {
- atomic_set(timeline->timeline_flags, 0);
- return ret;
- }
- }
-#endif
- ret = anon_inode_getfd(
- "[mali_tlstream]",
- &kbasep_tlstream_fops,
- timeline,
- O_RDONLY | O_CLOEXEC);
- if (ret < 0) {
+ if (flags & BASE_TLSTREAM_ENABLE_CSFFW_TRACEPOINTS) {
+ err = kbase_csf_tl_reader_start(&timeline->csf_tl_reader, kbdev);
+ if (err) {
atomic_set(timeline->timeline_flags, 0);
-#if MALI_USE_CSF
- kbase_csf_tl_reader_stop(&timeline->csf_tl_reader);
-#endif
- return ret;
+ return err;
}
+ }
+#endif
- /* Reset and initialize header streams. */
- kbase_tlstream_reset(
- &timeline->streams[TL_STREAM_TYPE_OBJ_SUMMARY]);
+ /* Reset and initialize header streams. */
+ kbase_tlstream_reset(&timeline->streams[TL_STREAM_TYPE_OBJ_SUMMARY]);
- timeline->obj_header_btc = obj_desc_header_size;
- timeline->aux_header_btc = aux_desc_header_size;
-
- /* Start autoflush timer. */
- atomic_set(&timeline->autoflush_timer_active, 1);
- rcode = mod_timer(
- &timeline->autoflush_timer,
- jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
- CSTD_UNUSED(rcode);
+ timeline->obj_header_btc = obj_desc_header_size;
+ timeline->aux_header_btc = aux_desc_header_size;
#if !MALI_USE_CSF
- /* If job dumping is enabled, readjust the software event's
- * timeout as the default value of 3 seconds is often
- * insufficient.
- */
- if (flags & BASE_TLSTREAM_JOB_DUMPING_ENABLED) {
- dev_info(kbdev->dev,
- "Job dumping is enabled, readjusting the software event's timeout\n");
- atomic_set(&kbdev->js_data.soft_job_timeout_ms,
- 1800000);
- }
+ /* If job dumping is enabled, readjust the software event's
+ * timeout as the default value of 3 seconds is often
+ * insufficient.
+ */
+ if (flags & BASE_TLSTREAM_JOB_DUMPING_ENABLED) {
+ dev_info(kbdev->dev,
+ "Job dumping is enabled, readjusting the software event's timeout\n");
+ atomic_set(&kbdev->js_data.soft_job_timeout_ms, 1800000);
+ }
#endif /* !MALI_USE_CSF */
- /* Summary stream was cleared during acquire.
- * Create static timeline objects that will be
- * read by client.
- */
- kbase_create_timeline_objects(kbdev);
+ /* Summary stream was cleared during acquire.
+ * Create static timeline objects that will be
+ * read by client.
+ */
+ kbase_create_timeline_objects(kbdev);
#ifdef CONFIG_MALI_BIFROST_DEVFREQ
- /* Devfreq target tracepoints are only fired when the target
- * changes, so we won't know the current target unless we
- * send it now.
- */
- kbase_tlstream_current_devfreq_target(kbdev);
+ /* Devfreq target tracepoints are only fired when the target
+ * changes, so we won't know the current target unless we
+ * send it now.
+ */
+ kbase_tlstream_current_devfreq_target(kbdev);
#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
- } else {
- ret = -EBUSY;
- }
+ /* Start the autoflush timer.
+ * We must do this after creating timeline objects to ensure we
+ * don't auto-flush the streams which will be reset during the
+ * summarization process.
+ */
+ atomic_set(&timeline->autoflush_timer_active, 1);
+ rcode = mod_timer(&timeline->autoflush_timer,
+ jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
+ CSTD_UNUSED(rcode);
- if (ret >= 0)
- timeline->last_acquire_time = ktime_get();
+ timeline->last_acquire_time = ktime_get_raw();
- return ret;
+ return err;
+}
+
+void kbase_timeline_release(struct kbase_timeline *timeline)
+{
+ ktime_t elapsed_time;
+ s64 elapsed_time_ms, time_to_sleep;
+
+ if (WARN_ON(!timeline) || WARN_ON(!atomic_read(timeline->timeline_flags)))
+ return;
+
+ /* Get the amount of time passed since the timeline was acquired and ensure
+ * we sleep for long enough such that it has been at least
+ * TIMELINE_HYSTERESIS_TIMEOUT_MS amount of time between acquire and release.
+ * This prevents userspace from spamming acquire and release too quickly.
+ */
+ elapsed_time = ktime_sub(ktime_get_raw(), timeline->last_acquire_time);
+ elapsed_time_ms = ktime_to_ms(elapsed_time);
+ time_to_sleep = (elapsed_time_ms < 0 ? TIMELINE_HYSTERESIS_TIMEOUT_MS :
+ TIMELINE_HYSTERESIS_TIMEOUT_MS - elapsed_time_ms);
+ if (time_to_sleep > 0)
+ msleep_interruptible(time_to_sleep);
+
+#if MALI_USE_CSF
+ kbase_csf_tl_reader_stop(&timeline->csf_tl_reader);
+#endif
+
+ /* Stop autoflush timer before releasing access to streams. */
+ atomic_set(&timeline->autoflush_timer_active, 0);
+ del_timer_sync(&timeline->autoflush_timer);
+
+ atomic_set(timeline->timeline_flags, 0);
}
int kbase_timeline_streams_flush(struct kbase_timeline *timeline)
@@ -273,11 +291,17 @@
enum tl_stream_type stype;
bool has_bytes = false;
size_t nbytes = 0;
-#if MALI_USE_CSF
- int ret = kbase_csf_tl_reader_flush_buffer(&timeline->csf_tl_reader);
- if (ret > 0)
- has_bytes = true;
+ if (WARN_ON(!timeline))
+ return -EINVAL;
+
+#if MALI_USE_CSF
+ {
+ int ret = kbase_csf_tl_reader_flush_buffer(&timeline->csf_tl_reader);
+
+ if (ret > 0)
+ has_bytes = true;
+ }
#endif
for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++) {
--
Gitblit v1.6.2