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

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

Merge "devfreq: Remove extra gpu bus ib vote"

parents 68133c40 34eb0582
Loading
Loading
Loading
Loading
+18 −13
Original line number Diff line number Diff line
@@ -5,9 +5,12 @@

#include <linux/devfreq.h>
#include <linux/module.h>
#include <linux/msm_adreno_devfreq.h>

#include "governor.h"

unsigned long (*extern_get_bw)(void) = NULL;
static getbw_func extern_get_bw;
static void *extern_get_bw_data;
unsigned long *dev_ab;
static unsigned long dev_ib;

@@ -22,12 +25,12 @@ static struct devfreq *df;
static int devfreq_vbif_get_freq(struct devfreq *df,
				unsigned long *freq)
{
	/* If the IB isn't set yet, check if it should be non-zero. */
	if (!dev_ib && extern_get_bw) {
		dev_ib = extern_get_bw();
		if (dev_ab)
			*dev_ab = dev_ib / 4;
	}
	unsigned long ab, ib;

	extern_get_bw(&ib, &ab, extern_get_bw_data);

	dev_ib = ib;
	*dev_ab = ab;

	*freq = dev_ib;
	return 0;
@@ -38,20 +41,19 @@ static int devfreq_vbif_get_freq(struct devfreq *df,
 * value from legacy vbif based bus bandwidth governor.
 * This function is called by KGSL driver.
 */
void devfreq_vbif_register_callback(void *p)
void devfreq_vbif_register_callback(getbw_func func, void *data)
{
	extern_get_bw = p;
	extern_get_bw = func;
	extern_get_bw_data = data;
}

int devfreq_vbif_update_bw(unsigned long ib, unsigned long ab)
int devfreq_vbif_update_bw(void)
{
	int ret = 0;

	mutex_lock(&df_lock);
	if (df) {
		mutex_lock(&df->lock);
		dev_ib = ib;
		*dev_ab = ab;
		ret = update_devfreq(df);
		mutex_unlock(&df->lock);
	}
@@ -78,7 +80,10 @@ static int devfreq_vbif_ev_handler(struct devfreq *devfreq,

		mutex_unlock(&df_lock);

		ret = devfreq_vbif_update_bw(0, 0);
		dev_ib = 0;
		*dev_ab = 0;

		ret = devfreq_vbif_update_bw();
		if (ret) {
			pr_err("Unable to update BW! Gov start failed!\n");
			return ret;
+20 −12
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ static const char * const clocks[] = {
static unsigned long ib_votes[KGSL_MAX_BUSLEVELS];
static int last_vote_buslevel;
static int max_vote_buslevel;
static unsigned long last_ab;

static void kgsl_pwrctrl_clk(struct kgsl_device *device, int state,
					int requested_state);
@@ -116,9 +117,16 @@ static void _record_pwrevent(struct kgsl_device *device,
/**
 * kgsl_get_bw() - Return latest msm bus IB vote
 */
static unsigned long kgsl_get_bw(void)
static void kgsl_get_bw(unsigned long *ib, unsigned long *ab, void *data)
{
	return ib_votes[last_vote_buslevel];
	struct kgsl_device *device = (struct kgsl_device *)data;

	if (gmu_core_scales_bandwidth(device))
		*ib = 0;
	else
		*ib = ib_votes[last_vote_buslevel];

	*ab = last_ab;
}
#endif

@@ -197,13 +205,13 @@ static unsigned int _adjust_pwrlevel(struct kgsl_pwrctrl *pwr, int level,
}

#ifdef CONFIG_DEVFREQ_GOV_QCOM_GPUBW_MON
static void kgsl_pwrctrl_vbif_update(unsigned long ab)
static void kgsl_pwrctrl_vbif_update(void)
{
	/* ask a governor to vote on behalf of us */
	devfreq_vbif_update_bw(ib_votes[last_vote_buslevel], ab);
	devfreq_vbif_update_bw();
}
#else
static void kgsl_pwrctrl_vbif_update(unsigned long ab)
static void kgsl_pwrctrl_vbif_update(void)
{
}
#endif
@@ -295,9 +303,11 @@ void kgsl_pwrctrl_buslevel_update(struct kgsl_device *device,
	/* buslevel is the IB vote, update the AB */
	_ab_buslevel_update(pwr, &ab);

	last_ab = ab;

	kgsl_bus_scale_request(device, buslevel);

	kgsl_pwrctrl_vbif_update(ab);
	kgsl_pwrctrl_vbif_update();
}
EXPORT_SYMBOL(kgsl_pwrctrl_buslevel_update);

@@ -1770,15 +1780,13 @@ static void kgsl_thermal_timer(struct timer_list *t)
}

#ifdef CONFIG_DEVFREQ_GOV_QCOM_GPUBW_MON
static int kgsl_pwrctrl_vbif_init(void)
static void kgsl_pwrctrl_vbif_init(struct kgsl_device *device)
{
	devfreq_vbif_register_callback(kgsl_get_bw);
	return 0;
	devfreq_vbif_register_callback(kgsl_get_bw, device);
}
#else
static int kgsl_pwrctrl_vbif_init(void)
static void kgsl_pwrctrl_vbif_init(struct kgsl_device *device)
{
	return 0;
}
#endif

@@ -2183,7 +2191,7 @@ int kgsl_pwrctrl_init(struct kgsl_device *device)
	spin_lock_init(&pwr->limits_lock);
	pwr->sysfs_pwr_limit = kgsl_pwr_limits_add(KGSL_DEVICE_3D0);

	kgsl_pwrctrl_vbif_init();
	kgsl_pwrctrl_vbif_init(device);

	/* temperature sensor name */
	of_property_read_string(pdev->dev.of_node, "qcom,tzone-name",
+5 −5
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 */

#ifndef MSM_ADRENO_DEVFREQ_H
@@ -82,9 +82,9 @@ struct msm_busmon_extended_profile {
	struct devfreq_dev_profile profile;
};

#ifdef CONFIG_DEVFREQ_GOV_QCOM_GPUBW_MON
int devfreq_vbif_update_bw(unsigned long ib, unsigned long ab);
int devfreq_vbif_register_callback(void *callback);
#endif
typedef void(*getbw_func)(unsigned long *, unsigned long *, void *);

int devfreq_vbif_update_bw(void);
void devfreq_vbif_register_callback(getbw_func func, void *data);

#endif