Commit 0385e521 authored by Jesse Barnes's avatar Jesse Barnes Committed by Matthew Garrett

IPS driver: add GPU busy and turbo checking

Be sure to enable GPU turbo by default at load time and check GPU busy
and MCP exceeded status correctly.  Also fix up CPU power comparison and
work around buggy MCH temp reporting.
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent aa7ffc01
...@@ -515,7 +515,10 @@ static void ips_disable_cpu_turbo(struct ips_driver *ips) ...@@ -515,7 +515,10 @@ static void ips_disable_cpu_turbo(struct ips_driver *ips)
*/ */
static bool ips_gpu_busy(struct ips_driver *ips) static bool ips_gpu_busy(struct ips_driver *ips)
{ {
return false; if (!ips->gpu_turbo_enabled)
return false;
return ips->gpu_busy();
} }
/** /**
...@@ -627,7 +630,7 @@ static bool cpu_exceeded(struct ips_driver *ips, int cpu) ...@@ -627,7 +630,7 @@ static bool cpu_exceeded(struct ips_driver *ips, int cpu)
avg = cpu ? ips->ctv2_avg_temp : ips->ctv1_avg_temp; avg = cpu ? ips->ctv2_avg_temp : ips->ctv1_avg_temp;
if (avg > (ips->limits->core_temp_limit * 100)) if (avg > (ips->limits->core_temp_limit * 100))
ret = true; ret = true;
if (ips->cpu_avg_power > ips->core_power_limit) if (ips->cpu_avg_power > ips->core_power_limit * 100)
ret = true; ret = true;
spin_unlock_irqrestore(&ips->turbo_status_lock, flags); spin_unlock_irqrestore(&ips->turbo_status_lock, flags);
...@@ -652,6 +655,8 @@ static bool mch_exceeded(struct ips_driver *ips) ...@@ -652,6 +655,8 @@ static bool mch_exceeded(struct ips_driver *ips)
spin_lock_irqsave(&ips->turbo_status_lock, flags); spin_lock_irqsave(&ips->turbo_status_lock, flags);
if (ips->mch_avg_temp > (ips->limits->mch_temp_limit * 100)) if (ips->mch_avg_temp > (ips->limits->mch_temp_limit * 100))
ret = true; ret = true;
if (ips->mch_avg_power > ips->mch_power_limit)
ret = true;
spin_unlock_irqrestore(&ips->turbo_status_lock, flags); spin_unlock_irqrestore(&ips->turbo_status_lock, flags);
return ret; return ret;
...@@ -747,7 +752,7 @@ static int ips_adjust(void *data) ...@@ -747,7 +752,7 @@ static int ips_adjust(void *data)
ips_disable_gpu_turbo(ips); ips_disable_gpu_turbo(ips);
/* We're outside our comfort zone, crank them down */ /* We're outside our comfort zone, crank them down */
if (!mcp_exceeded(ips)) { if (mcp_exceeded(ips)) {
ips_cpu_lower(ips); ips_cpu_lower(ips);
ips_gpu_lower(ips); ips_gpu_lower(ips);
goto sleep; goto sleep;
...@@ -808,8 +813,7 @@ static u16 read_mgtv(struct ips_driver *ips) ...@@ -808,8 +813,7 @@ static u16 read_mgtv(struct ips_driver *ips)
ret = ((val * slope + 0x40) >> 7) + offset; ret = ((val * slope + 0x40) >> 7) + offset;
return 0; /* MCH temp reporting buggy */
return ret;
} }
static u16 read_ptv(struct ips_driver *ips) static u16 read_ptv(struct ips_driver *ips)
...@@ -1471,14 +1475,6 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -1471,14 +1475,6 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (trc & TRC_CORE2_EN) if (trc & TRC_CORE2_EN)
ips->second_cpu = true; ips->second_cpu = true;
if (!ips_get_i915_syms(ips)) {
dev_err(&dev->dev, "failed to get i915 symbols, graphics turbo disabled\n");
ips->gpu_turbo_enabled = false;
} else {
dev_dbg(&dev->dev, "graphics turbo enabled\n");
ips->gpu_turbo_enabled = true;
}
update_turbo_limits(ips); update_turbo_limits(ips);
dev_dbg(&dev->dev, "max cpu power clamp: %dW\n", dev_dbg(&dev->dev, "max cpu power clamp: %dW\n",
ips->mcp_power_limit / 10); ips->mcp_power_limit / 10);
...@@ -1488,6 +1484,14 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -1488,6 +1484,14 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (thm_readl(THM_PSC) & PSP_PBRT) if (thm_readl(THM_PSC) & PSP_PBRT)
ips->poll_turbo_status = true; ips->poll_turbo_status = true;
if (!ips_get_i915_syms(ips)) {
dev_err(&dev->dev, "failed to get i915 symbols, graphics turbo disabled\n");
ips->gpu_turbo_enabled = false;
} else {
dev_dbg(&dev->dev, "graphics turbo enabled\n");
ips->gpu_turbo_enabled = true;
}
/* /*
* Check PLATFORM_INFO MSR to make sure this chip is * Check PLATFORM_INFO MSR to make sure this chip is
* turbo capable. * turbo capable.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment