summaryrefslogtreecommitdiff
path: root/mali_kbase/platform/pixel/pixel_gpu_slc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mali_kbase/platform/pixel/pixel_gpu_slc.c')
-rw-r--r--mali_kbase/platform/pixel/pixel_gpu_slc.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/mali_kbase/platform/pixel/pixel_gpu_slc.c b/mali_kbase/platform/pixel/pixel_gpu_slc.c
index 8e46be1..e8aae75 100644
--- a/mali_kbase/platform/pixel/pixel_gpu_slc.c
+++ b/mali_kbase/platform/pixel/pixel_gpu_slc.c
@@ -17,6 +17,37 @@
#include "mali_kbase_config_platform.h"
#include "pixel_gpu_slc.h"
+#include <uapi/gpu/arm/midgard/platform/pixel/pixel_memory_group_manager.h>
+
+/**
+ * enum slc_vote_state - Whether a context is voting for SLC
+ */
+enum slc_vote_state {
+ /** @IDLE: Idle, not voting for SLC */
+ IDLE = 0,
+ /** @VOTING: Active, voting for SLC */
+ VOTING = 1,
+};
+
+/**
+ * transition() - Try to transition from one value to another
+ *
+ * @v: Value to transition
+ * @old: Starting state to transition from
+ * @new: Destination state to transition to
+ *
+ * Return: Whether the transition was successful
+ */
+static bool transition(int *v, int old, int new)
+{
+ bool const cond = *v == old;
+
+ if (cond)
+ *v = new;
+
+ return cond;
+}
+
/**
* gpu_pixel_handle_buffer_liveness_update_ioctl() - See gpu_slc_liveness_update
*
@@ -57,7 +88,11 @@ int gpu_slc_kctx_init(struct kbase_context *kctx)
*/
void gpu_slc_kctx_term(struct kbase_context *kctx)
{
- (void)kctx;
+ struct pixel_platform_data *pd = kctx->platform_data;
+
+ /* Contexts can be terminated without being idled first */
+ if (transition(&pd->slc_vote, VOTING, IDLE))
+ pixel_mgm_slc_dec_refcount(kctx->kbdev->mgm_dev);
}
/**
@@ -67,7 +102,12 @@ void gpu_slc_kctx_term(struct kbase_context *kctx)
*/
void gpu_slc_kctx_active(struct kbase_context *kctx)
{
- (void)kctx;
+ struct pixel_platform_data *pd = kctx->platform_data;
+
+ lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
+
+ if (transition(&pd->slc_vote, IDLE, VOTING))
+ pixel_mgm_slc_inc_refcount(kctx->kbdev->mgm_dev);
}
/**
@@ -77,7 +117,12 @@ void gpu_slc_kctx_active(struct kbase_context *kctx)
*/
void gpu_slc_kctx_idle(struct kbase_context *kctx)
{
- (void)kctx;
+ struct pixel_platform_data *pd = kctx->platform_data;
+
+ lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
+
+ if (transition(&pd->slc_vote, VOTING, IDLE))
+ pixel_mgm_slc_dec_refcount(kctx->kbdev->mgm_dev);
}
/**