Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e1be2792 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Allow concurrent requests for oob_perfcntr"

parents 8579e19a da19547c
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -734,6 +734,9 @@ int a6xx_gmu_oob_set(struct kgsl_device *device,
	int ret = 0;
	int set, check;

	if (req == oob_perfcntr && gmu->num_oob_perfcntr++)
		return 0;

	if (adreno_is_a630(adreno_dev) || adreno_is_a615_family(adreno_dev)) {
		set = BIT(req + 16);
		check = BIT(req + 24);
@@ -757,6 +760,8 @@ int a6xx_gmu_oob_set(struct kgsl_device *device,

	if (timed_poll_check(device, A6XX_GMU_GMU2HOST_INTR_INFO, check,
		GPU_START_TIMEOUT, check)) {
		if (req == oob_perfcntr)
			gmu->num_oob_perfcntr--;
		gmu_fault_snapshot(device);
		ret = -ETIMEDOUT;
		WARN(1, "OOB request %s timed out\n", oob_to_str(req));
@@ -776,6 +781,9 @@ void a6xx_gmu_oob_clear(struct kgsl_device *device,
	struct a6xx_gmu_device *gmu = to_a6xx_gmu(adreno_dev);
	int clear;

	if (req == oob_perfcntr && --gmu->num_oob_perfcntr)
		return;

	if (adreno_is_a630(adreno_dev) || adreno_is_a615_family(adreno_dev)) {
		clear = BIT(req + 24);
	} else {
+3 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
 */
#ifndef __ADRENO_A6XX_GMU_H
#define __ADRENO_A6XX_GMU_H
@@ -207,6 +207,8 @@ struct a6xx_gmu_device {
	void __iomem *rdpm_mx_virt;
	/** @log_stream_enable: GMU log streaming enable */
	bool log_stream_enable;
	/** @num_oob_perfcntr: Number of active oob_perfcntr requests */
	u32 num_oob_perfcntr;
};

/* Helper function to get to a6xx gmu device from adreno device */
+10 −0
Original line number Diff line number Diff line
@@ -146,6 +146,9 @@ static int a6xx_rgmu_oob_set(struct kgsl_device *device,
	struct a6xx_rgmu_device *rgmu = to_a6xx_rgmu(ADRENO_DEVICE(device));
	int ret, set, check;

	if (req == oob_perfcntr && rgmu->num_oob_perfcntr++)
		return 0;

	set = BIT(req + 16);
	check = BIT(req + 16);

@@ -160,6 +163,8 @@ static int a6xx_rgmu_oob_set(struct kgsl_device *device,
	if (ret) {
		unsigned int status;

		if (req == oob_perfcntr)
			rgmu->num_oob_perfcntr--;
		gmu_core_regread(device, A6XX_RGMU_CX_PCC_DEBUG, &status);
		dev_err(&rgmu->pdev->dev,
				"Timed out while setting OOB req:%s status:0x%x\n",
@@ -181,6 +186,11 @@ static int a6xx_rgmu_oob_set(struct kgsl_device *device,
static void a6xx_rgmu_oob_clear(struct kgsl_device *device,
		enum oob_request req)
{
	struct a6xx_rgmu_device *rgmu = to_a6xx_rgmu(ADRENO_DEVICE(device));

	if (req == oob_perfcntr && --rgmu->num_oob_perfcntr)
		return;

	gmu_core_regwrite(device, A6XX_GMU_HOST2GMU_INTR_SET, BIT(req + 24));
	trace_kgsl_gmu_oob_clear(BIT(req + 24));
}
+3 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
 */
#ifndef __ADRENO_A6XX_RGMU_H
#define __ADRENO_A6XX_RGMU_H
@@ -58,6 +58,8 @@ struct a6xx_rgmu_device {
	unsigned int fault_count;
	/** @flags: rgmu internal flags */
	unsigned long flags;
	/** @num_oob_perfcntr: Number of active oob_perfcntr requests */
	u32 num_oob_perfcntr;
};

/**