Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 223701
b: refs/heads/master
c: 63ee41d
h: refs/heads/master
i:
  223699: 3335c3b
v: v3
  • Loading branch information
Eric Anholt authored and Chris Wilson committed Dec 23, 2010
1 parent c375f8e commit 2e10261
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f797d22121404eac7b63f1291409f96bcab51c11
refs/heads/master: 63ee41d794d9c555f84205517a68509848988760
23 changes: 23 additions & 0 deletions trunk/drivers/gpu/drm/i915/i915_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "i915_drm.h"
#include "i915_drv.h"
#include "i915_trace.h"
#include "../../../platform/x86/intel_ips.h"
#include <linux/pci.h>
#include <linux/vgaarb.h>
#include <linux/acpi.h>
Expand Down Expand Up @@ -1870,6 +1871,26 @@ bool i915_gpu_turbo_disable(void)
}
EXPORT_SYMBOL_GPL(i915_gpu_turbo_disable);

/**
* Tells the intel_ips driver that the i915 driver is now loaded, if
* IPS got loaded first.
*
* This awkward dance is so that neither module has to depend on the
* other in order for IPS to do the appropriate communication of
* GPU turbo limits to i915.
*/
static void
ips_ping_for_i915_load(void)
{
void (*link)(void);

link = symbol_get(ips_link_to_i915_driver);
if (link) {
link();
symbol_put(ips_link_to_i915_driver);
}
}

/**
* i915_driver_load - setup chip and create an initial config
* @dev: DRM device
Expand Down Expand Up @@ -2075,6 +2096,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
dev_priv->mchdev_lock = &mchdev_lock;
spin_unlock(&mchdev_lock);

ips_ping_for_i915_load();

return 0;

out_workqueue_free:
Expand Down
36 changes: 33 additions & 3 deletions trunk/drivers/platform/x86/intel_ips.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
#include <drm/i915_drm.h>
#include <asm/msr.h>
#include <asm/processor.h>
#include "intel_ips.h"

#define PCI_DEVICE_ID_INTEL_THERMAL_SENSOR 0x3b32

Expand Down Expand Up @@ -245,6 +246,7 @@
#define thm_writel(off, val) writel((val), ips->regmap + (off))

static const int IPS_ADJUST_PERIOD = 5000; /* ms */
static bool late_i915_load = false;

/* For initial average collection */
static const int IPS_SAMPLE_PERIOD = 200; /* ms */
Expand Down Expand Up @@ -339,6 +341,9 @@ struct ips_driver {
u64 orig_turbo_ratios;
};

static bool
ips_gpu_turbo_enabled(struct ips_driver *ips);

/**
* ips_cpu_busy - is CPU busy?
* @ips: IPS driver struct
Expand Down Expand Up @@ -517,7 +522,7 @@ static void ips_disable_cpu_turbo(struct ips_driver *ips)
*/
static bool ips_gpu_busy(struct ips_driver *ips)
{
if (!ips->gpu_turbo_enabled)
if (!ips_gpu_turbo_enabled(ips))
return false;

return ips->gpu_busy();
Expand All @@ -532,7 +537,7 @@ static bool ips_gpu_busy(struct ips_driver *ips)
*/
static void ips_gpu_raise(struct ips_driver *ips)
{
if (!ips->gpu_turbo_enabled)
if (!ips_gpu_turbo_enabled(ips))
return;

if (!ips->gpu_raise())
Expand All @@ -549,7 +554,7 @@ static void ips_gpu_raise(struct ips_driver *ips)
*/
static void ips_gpu_lower(struct ips_driver *ips)
{
if (!ips->gpu_turbo_enabled)
if (!ips_gpu_turbo_enabled(ips))
return;

if (!ips->gpu_lower())
Expand Down Expand Up @@ -1454,6 +1459,31 @@ static bool ips_get_i915_syms(struct ips_driver *ips)
return false;
}

static bool
ips_gpu_turbo_enabled(struct ips_driver *ips)
{
if (!ips->gpu_busy && late_i915_load) {
if (ips_get_i915_syms(ips)) {
dev_info(&ips->dev->dev,
"i915 driver attached, reenabling gpu turbo\n");
ips->gpu_turbo_enabled = !(thm_readl(THM_HTS) & HTS_GTD_DIS);
}
}

return ips->gpu_turbo_enabled;
}

void
ips_link_to_i915_driver()
{
/* We can't cleanly get at the various ips_driver structs from
* this caller (the i915 driver), so just set a flag saying
* that it's time to try getting the symbols again.
*/
late_i915_load = true;
}
EXPORT_SYMBOL_GPL(ips_link_to_i915_driver);

static DEFINE_PCI_DEVICE_TABLE(ips_id_table) = {
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL,
PCI_DEVICE_ID_INTEL_THERMAL_SENSOR), },
Expand Down
21 changes: 21 additions & 0 deletions trunk/drivers/platform/x86/intel_ips.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Copyright (c) 2010 Intel Corporation
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* The full GNU General Public License is included in this distribution in
* the file called "COPYING".
*/

void ips_link_to_i915_driver(void);

0 comments on commit 2e10261

Please sign in to comment.