Skip to content
Snippets Groups Projects
Commit 38ef4656 authored by George Lee's avatar George Lee
Browse files

bcl: Make VDROOPX_HYS_FLT_EXPIRE_VALUE tunable


Extending hysteresis expire value for VDROOP per subsystems.

Bug: 195322083
Signed-off-by: default avatarGeorge Lee <geolee@google.com>
Change-Id: Ia411fecafb3fb89427bc0158f6d37354a2542bbc
parent c6652e1e
No related branches found
No related tags found
No related merge requests found
......@@ -46,6 +46,7 @@
#define SYSREG_CPUCL0_BASE (0x20c40000)
#define CLUSTER0_GENERAL_CTRL_64 (0x1404)
#define CLKDIVSTEP (0x830)
#define VDROOP_FLT (0x838)
#define CPUCL0_CLKDIVSTEP_STAT (0x83c)
#define CPUCL0_CLKDIVSTEP_CON (0x838)
#define CPUCL12_CLKDIVSTEP_STAT (0x848)
......@@ -1454,6 +1455,137 @@ static const struct attribute_group clock_div_group = {
.name = "clock_div",
};
static ssize_t vdroop_flt_show(struct bcl_device *bcl_dev, int idx, char *buf)
{
unsigned int reg;
void __iomem *addr;
if (idx == TPU)
return sysfs_emit(buf, "0x%x\n", bcl_dev->tpu_vdroop_flt);
else if (idx == GPU)
return sysfs_emit(buf, "0x%x\n", bcl_dev->gpu_vdroop_flt);
else if (idx >= CPU1 && idx <= CPU2)
addr = bcl_dev->base_mem[idx] + VDROOP_FLT;
else
return sysfs_emit(buf, "off\n");
reg = __raw_readl(addr);
return sysfs_emit(buf, "0x%x\n", reg);
}
static ssize_t vdroop_flt_store(struct bcl_device *bcl_dev, int idx,
const char *buf, size_t size)
{
void __iomem *addr;
unsigned int value;
if (sscanf(buf, "0x%x", &value) != 1)
return -EINVAL;
if (idx == TPU)
bcl_dev->tpu_vdroop_flt = value;
else if (idx == GPU)
bcl_dev->gpu_vdroop_flt = value;
else if (idx >= CPU1 && idx <= CPU2) {
addr = bcl_dev->base_mem[idx] + VDROOP_FLT;
mutex_lock(&bcl_dev->ratio_lock);
__raw_writel(value, addr);
mutex_unlock(&bcl_dev->ratio_lock);
} else
return -EINVAL;
return size;
}
static ssize_t cpu1_vdroop_flt_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_show(bcl_dev, CPU1, buf);
}
static ssize_t cpu1_vdroop_flt_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t size)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_store(bcl_dev, CPU1, buf, size);
}
static DEVICE_ATTR_RW(cpu1_vdroop_flt);
static ssize_t cpu2_vdroop_flt_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_show(bcl_dev, CPU2, buf);
}
static ssize_t cpu2_vdroop_flt_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t size)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_store(bcl_dev, CPU2, buf, size);
}
static DEVICE_ATTR_RW(cpu2_vdroop_flt);
static ssize_t tpu_vdroop_flt_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_show(bcl_dev, TPU, buf);
}
static ssize_t tpu_vdroop_flt_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t size)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_store(bcl_dev, TPU, buf, size);
}
static DEVICE_ATTR_RW(tpu_vdroop_flt);
static ssize_t gpu_vdroop_flt_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_show(bcl_dev, GPU, buf);
}
static ssize_t gpu_vdroop_flt_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t size)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
struct bcl_device *bcl_dev = platform_get_drvdata(pdev);
return vdroop_flt_store(bcl_dev, GPU, buf, size);
}
static DEVICE_ATTR_RW(gpu_vdroop_flt);
static struct attribute *vdroop_flt_attrs[] = {
&dev_attr_cpu1_vdroop_flt.attr,
&dev_attr_cpu2_vdroop_flt.attr,
&dev_attr_tpu_vdroop_flt.attr,
&dev_attr_gpu_vdroop_flt.attr,
NULL,
};
static const struct attribute_group vdroop_flt_group = {
.attrs = vdroop_flt_attrs,
.name = "vdroop_flt",
};
static ssize_t cpu0_clk_stats_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
......@@ -2336,6 +2468,8 @@ int google_init_tpu_ratio(struct bcl_device *data)
__raw_writel(data->tpu_con_light, addr);
addr = data->base_mem[TPU] + CLKDIVSTEP;
__raw_writel(data->tpu_clkdivstep, addr);
addr = data->base_mem[TPU] + VDROOP_FLT;
__raw_writel(data->tpu_vdroop_flt, addr);
data->tpu_clk_stats = __raw_readl(data->base_mem[TPU] + clk_stats_offset[TPU]);
mutex_unlock(&data->ratio_lock);
......@@ -2363,6 +2497,8 @@ int google_init_gpu_ratio(struct bcl_device *data)
__raw_writel(data->gpu_con_light, addr);
addr = data->base_mem[GPU] + CLKDIVSTEP;
__raw_writel(data->gpu_clkdivstep, addr);
addr = data->base_mem[GPU] + VDROOP_FLT;
__raw_writel(data->gpu_vdroop_flt, addr);
data->gpu_clk_stats = __raw_readl(data->base_mem[GPU] + clk_stats_offset[GPU]);
mutex_unlock(&data->ratio_lock);
......@@ -2874,6 +3010,7 @@ const struct attribute_group *mitigation_groups[] = {
&triggered_timestamp_group,
&triggered_capacity_group,
&triggered_voltage_group,
&vdroop_flt_group,
NULL,
};
......
......@@ -93,6 +93,8 @@ struct bcl_device {
unsigned int gpu_clkdivstep;
unsigned int gpu_clk_stats;
unsigned int tpu_clk_stats;
unsigned int tpu_vdroop_flt;
unsigned int gpu_vdroop_flt;
bool batt_psy_initialized;
bool enabled;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment