More ACPI and power management updates for 3.13-rc1
- ACPI-based device hotplug fixes for issues introduced recently and a fix for an older error code path bug in the ACPI PCI host bridge driver. - Fix for recently broken OMAP cpufreq build from Viresh Kumar. - Fix for a recent hibernation regression related to s2disk. - Fix for a locking-related regression in the ACPI EC driver from Puneet Kumar. - System suspend error code path fix related to runtime PM and runtime PM documentation update from Ulf Hansson. - cpufreq's conservative governor fix from Xiaoguang Chen. - New processor IDs for intel_idle and turbostat and removal of an obsolete Kconfig option from Len Brown. - New device IDs for the ACPI LPSS (Low-Power Subsystem) driver and ACPI-based PCI hotplug (ACPIPHP) cleanup from Mika Westerberg. - Removal of several ACPI video DMI blacklist entries that are not necessary any more from Aaron Lu. - Rework of the ACPI companion representation in struct device and code cleanup related to that change from Rafael J Wysocki, Lan Tianyu and Jarkko Nikula. - Fixes for assigning names to ACPI-enumerated I2C and SPI devices from Jarkko Nikula. / -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAABCAAGBQJSjLYNAAoJEILEb/54YlRxkEQP/1pmFWNwSsxLtTHd+PEs0Xbo QccqvjQrnw/c8GcmK4eZrz6/xyuepmmjy9kfRKj2ENZniy0NEsSFqkTdSO3vYlva 8HKWUj7MV3evhFERXAF6Tu0b4Enx4jOP7VMtmYxJo3qrSnKRUcUzc6DGv/ACsUT1 Nkj0Lhdsg053Z+YzIXrl50w0tCDEMhVmWlMHBtYgr+dMNVnkfPBGkqMblMkKCXT2 w/yHvauZlxQHtI+8bVqTuGgNN0CPzdlpFGiuUF+5mDf6dRX8zlSn56Ia+Wyw1k9X dQp4jYQOgPRo03rNKqQPDiPxUdc7T0RAHRvDB51Ncweuh5PfZGguQe71p6/LKY2W i6zblZ0f/vc13hTiMrP+qzKcwZvgPB5DH7SfnHr61JKV7GNFCdYAqoceS5hYMzR9 d2Fd+txgm763IHWewXfDS/G2cU492R5qr4jpmUIACBQKWDZcqmSRDwRj83t56Ltb jgFBMbg4vZxG7IARhind74xsALxdhsgmFjPmx+0qPWjYxcU8otQZpXbgGNI9iOuW pxIQv5WPQW0tTmwO4HSuVCOwDPLPz5R0jkev7SvSj3Ek3TeD7He4LmnK055CATiC puq+6dp1FISPOPJYk+0DI61qN/CB/qNwRp8LU3ctZwudPVhznIE9FFQ3iN1FdBg2 X8VDcT9t7VvVuxSBjgkj =QMp+ -----END PGP SIGNATURE----- Merge tag 'pm+acpi-2-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull more ACPI and power management updates from Rafael Wysocki: - ACPI-based device hotplug fixes for issues introduced recently and a fix for an older error code path bug in the ACPI PCI host bridge driver - Fix for recently broken OMAP cpufreq build from Viresh Kumar - Fix for a recent hibernation regression related to s2disk - Fix for a locking-related regression in the ACPI EC driver from Puneet Kumar - System suspend error code path fix related to runtime PM and runtime PM documentation update from Ulf Hansson - cpufreq's conservative governor fix from Xiaoguang Chen - New processor IDs for intel_idle and turbostat and removal of an obsolete Kconfig option from Len Brown - New device IDs for the ACPI LPSS (Low-Power Subsystem) driver and ACPI-based PCI hotplug (ACPIPHP) cleanup from Mika Westerberg - Removal of several ACPI video DMI blacklist entries that are not necessary any more from Aaron Lu - Rework of the ACPI companion representation in struct device and code cleanup related to that change from Rafael J Wysocki, Lan Tianyu and Jarkko Nikula - Fixes for assigning names to ACPI-enumerated I2C and SPI devices from Jarkko Nikula * tag 'pm+acpi-2-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (24 commits) PCI / hotplug / ACPI: Drop unused acpiphp_debug declaration ACPI / scan: Set flags.match_driver in acpi_bus_scan_fixed() ACPI / PCI root: Clear driver_data before failing enumeration ACPI / hotplug: Fix PCI host bridge hot removal ACPI / hotplug: Fix acpi_bus_get_device() return value check cpufreq: governor: Remove fossil comment in the cpufreq_governor_dbs() ACPI / video: clean up DMI table for initial black screen problem ACPI / EC: Ensure lock is acquired before accessing ec struct members PM / Hibernate: Do not crash kernel in free_basic_memory_bitmaps() ACPI / AC: Remove struct acpi_device pointer from struct acpi_ac spi: Use stable dev_name for ACPI enumerated SPI slaves i2c: Use stable dev_name for ACPI enumerated I2C slaves ACPI: Provide acpi_dev_name accessor for struct acpi_device device name ACPI / bind: Use (put|get)_device() on ACPI device objects too ACPI: Eliminate the DEVICE_ACPI_HANDLE() macro ACPI / driver core: Store an ACPI device pointer in struct acpi_dev_node cpufreq: OMAP: Fix compilation error 'r & ret undeclared' PM / Runtime: Fix error path for prepare PM / Runtime: Update documentation around probe|remove|suspend cpufreq: conservative: set requested_freq to policy max when it is over policy max ...
This commit is contained in:
commit
82023bb7f7
|
@ -547,13 +547,11 @@ helper functions described in Section 4. In that case, pm_runtime_resume()
|
|||
should be used. Of course, for this purpose the device's runtime PM has to be
|
||||
enabled earlier by calling pm_runtime_enable().
|
||||
|
||||
If the device bus type's or driver's ->probe() callback runs
|
||||
pm_runtime_suspend() or pm_runtime_idle() or their asynchronous counterparts,
|
||||
they will fail returning -EAGAIN, because the device's usage counter is
|
||||
incremented by the driver core before executing ->probe(). Still, it may be
|
||||
desirable to suspend the device as soon as ->probe() has finished, so the driver
|
||||
core uses pm_runtime_put_sync() to invoke the subsystem-level idle callback for
|
||||
the device at that time.
|
||||
It may be desirable to suspend the device once ->probe() has finished.
|
||||
Therefore the driver core uses the asyncronous pm_request_idle() to submit a
|
||||
request to execute the subsystem-level idle callback for the device at that
|
||||
time. A driver that makes use of the runtime autosuspend feature, may want to
|
||||
update the last busy mark before returning from ->probe().
|
||||
|
||||
Moreover, the driver core prevents runtime PM callbacks from racing with the bus
|
||||
notifier callback in __device_release_driver(), which is necessary, because the
|
||||
|
@ -656,7 +654,7 @@ out the following operations:
|
|||
__pm_runtime_disable() with 'false' as the second argument for every device
|
||||
right before executing the subsystem-level .suspend_late() callback for it.
|
||||
|
||||
* During system resume it calls pm_runtime_enable() and pm_runtime_put_sync()
|
||||
* During system resume it calls pm_runtime_enable() and pm_runtime_put()
|
||||
for every device right after executing the subsystem-level .resume_early()
|
||||
callback and right after executing the subsystem-level .resume() callback
|
||||
for it, respectively.
|
||||
|
|
|
@ -1992,7 +1992,7 @@ sba_connect_bus(struct pci_bus *bus)
|
|||
if (PCI_CONTROLLER(bus)->iommu)
|
||||
return;
|
||||
|
||||
handle = PCI_CONTROLLER(bus)->acpi_handle;
|
||||
handle = acpi_device_handle(PCI_CONTROLLER(bus)->companion);
|
||||
if (!handle)
|
||||
return;
|
||||
|
||||
|
|
|
@ -95,7 +95,7 @@ struct iospace_resource {
|
|||
};
|
||||
|
||||
struct pci_controller {
|
||||
void *acpi_handle;
|
||||
struct acpi_device *companion;
|
||||
void *iommu;
|
||||
int segment;
|
||||
int node; /* nearest node with memory or -1 for global allocation */
|
||||
|
|
|
@ -436,9 +436,9 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
|
|||
if (!controller)
|
||||
return NULL;
|
||||
|
||||
controller->acpi_handle = device->handle;
|
||||
controller->companion = device;
|
||||
|
||||
pxm = acpi_get_pxm(controller->acpi_handle);
|
||||
pxm = acpi_get_pxm(device->handle);
|
||||
#ifdef CONFIG_NUMA
|
||||
if (pxm >= 0)
|
||||
controller->node = pxm_to_node(pxm);
|
||||
|
@ -489,7 +489,7 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
|
|||
{
|
||||
struct pci_controller *controller = bridge->bus->sysdata;
|
||||
|
||||
ACPI_HANDLE_SET(&bridge->dev, controller->acpi_handle);
|
||||
ACPI_COMPANION_SET(&bridge->dev, controller->companion);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
|
|||
struct acpi_resource_vendor_typed *vendor;
|
||||
|
||||
|
||||
handle = PCI_CONTROLLER(bus)->acpi_handle;
|
||||
handle = acpi_device_handle(PCI_CONTROLLER(bus)->companion);
|
||||
status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS,
|
||||
&sn_uuid, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -360,7 +360,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
|
|||
acpi_status status;
|
||||
struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle;
|
||||
rootbus_handle = acpi_device_handle(PCI_CONTROLLER(dev)->companion);
|
||||
status = acpi_evaluate_integer(rootbus_handle, METHOD_NAME__SEG, NULL,
|
||||
&segment);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
|
|
|
@ -15,7 +15,7 @@ struct pci_sysdata {
|
|||
int domain; /* PCI domain */
|
||||
int node; /* NUMA node */
|
||||
#ifdef CONFIG_ACPI
|
||||
void *acpi; /* ACPI-specific data */
|
||||
struct acpi_device *companion; /* ACPI companion device */
|
||||
#endif
|
||||
#ifdef CONFIG_X86_64
|
||||
void *iommu; /* IOMMU private data */
|
||||
|
|
|
@ -147,6 +147,8 @@
|
|||
#define MSR_PP1_ENERGY_STATUS 0x00000641
|
||||
#define MSR_PP1_POLICY 0x00000642
|
||||
|
||||
#define MSR_CORE_C1_RES 0x00000660
|
||||
|
||||
#define MSR_AMD64_MC0_MASK 0xc0010044
|
||||
|
||||
#define MSR_IA32_MCx_CTL(x) (MSR_IA32_MC0_CTL + 4*(x))
|
||||
|
|
|
@ -518,7 +518,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
|
|||
sd = &info->sd;
|
||||
sd->domain = domain;
|
||||
sd->node = node;
|
||||
sd->acpi = device->handle;
|
||||
sd->companion = device;
|
||||
/*
|
||||
* Maybe the desired pci bus has been already scanned. In such case
|
||||
* it is unnecessary to scan the pci bus with the given domain,busnum.
|
||||
|
@ -589,7 +589,7 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
|
|||
{
|
||||
struct pci_sysdata *sd = bridge->bus->sysdata;
|
||||
|
||||
ACPI_HANDLE_SET(&bridge->dev, sd->acpi);
|
||||
ACPI_COMPANION_SET(&bridge->dev, sd->companion);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -235,17 +235,6 @@ config ACPI_INITRD_TABLE_OVERRIDE
|
|||
initrd, therefore it's safe to say Y.
|
||||
See Documentation/acpi/initrd_table_override.txt for details
|
||||
|
||||
config ACPI_BLACKLIST_YEAR
|
||||
int "Disable ACPI for systems before Jan 1st this year" if X86_32
|
||||
default 0
|
||||
help
|
||||
Enter a 4-digit year, e.g., 2001, to disable ACPI by default
|
||||
on platforms with DMI BIOS date before January 1st that year.
|
||||
"acpi=force" can be used to override this mechanism.
|
||||
|
||||
Enter 0 to disable this mechanism and allow ACPI to
|
||||
run by default no matter what the year. (default)
|
||||
|
||||
config ACPI_DEBUG
|
||||
bool "Debug Statements"
|
||||
default n
|
||||
|
|
|
@ -56,7 +56,6 @@ static int ac_sleep_before_get_state_ms;
|
|||
|
||||
struct acpi_ac {
|
||||
struct power_supply charger;
|
||||
struct acpi_device *adev;
|
||||
struct platform_device *pdev;
|
||||
unsigned long long state;
|
||||
};
|
||||
|
@ -70,8 +69,9 @@ struct acpi_ac {
|
|||
static int acpi_ac_get_state(struct acpi_ac *ac)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_handle handle = ACPI_HANDLE(&ac->pdev->dev);
|
||||
|
||||
status = acpi_evaluate_integer(ac->adev->handle, "_PSR", NULL,
|
||||
status = acpi_evaluate_integer(handle, "_PSR", NULL,
|
||||
&ac->state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
|
@ -119,6 +119,7 @@ static enum power_supply_property ac_props[] = {
|
|||
static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data)
|
||||
{
|
||||
struct acpi_ac *ac = data;
|
||||
struct acpi_device *adev;
|
||||
|
||||
if (!ac)
|
||||
return;
|
||||
|
@ -141,10 +142,11 @@ static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data)
|
|||
msleep(ac_sleep_before_get_state_ms);
|
||||
|
||||
acpi_ac_get_state(ac);
|
||||
acpi_bus_generate_netlink_event(ac->adev->pnp.device_class,
|
||||
adev = ACPI_COMPANION(&ac->pdev->dev);
|
||||
acpi_bus_generate_netlink_event(adev->pnp.device_class,
|
||||
dev_name(&ac->pdev->dev),
|
||||
event, (u32) ac->state);
|
||||
acpi_notifier_call_chain(ac->adev, event, (u32) ac->state);
|
||||
acpi_notifier_call_chain(adev, event, (u32) ac->state);
|
||||
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
||||
}
|
||||
|
||||
|
@ -178,8 +180,8 @@ static int acpi_ac_probe(struct platform_device *pdev)
|
|||
if (!pdev)
|
||||
return -EINVAL;
|
||||
|
||||
result = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev);
|
||||
if (result)
|
||||
adev = ACPI_COMPANION(&pdev->dev);
|
||||
if (!adev)
|
||||
return -ENODEV;
|
||||
|
||||
ac = kzalloc(sizeof(struct acpi_ac), GFP_KERNEL);
|
||||
|
@ -188,7 +190,6 @@ static int acpi_ac_probe(struct platform_device *pdev)
|
|||
|
||||
strcpy(acpi_device_name(adev), ACPI_AC_DEVICE_NAME);
|
||||
strcpy(acpi_device_class(adev), ACPI_AC_CLASS);
|
||||
ac->adev = adev;
|
||||
ac->pdev = pdev;
|
||||
platform_set_drvdata(pdev, ac);
|
||||
|
||||
|
|
|
@ -163,6 +163,15 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = {
|
|||
{ "80860F41", (unsigned long)&byt_i2c_dev_desc },
|
||||
{ "INT33B2", },
|
||||
|
||||
{ "INT3430", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3431", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3432", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3433", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3434", (unsigned long)&lpt_uart_dev_desc },
|
||||
{ "INT3435", (unsigned long)&lpt_uart_dev_desc },
|
||||
{ "INT3436", (unsigned long)&lpt_sdio_dev_desc },
|
||||
{ "INT3437", },
|
||||
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ int acpi_create_platform_device(struct acpi_device *adev,
|
|||
pdevinfo.id = -1;
|
||||
pdevinfo.res = resources;
|
||||
pdevinfo.num_res = count;
|
||||
pdevinfo.acpi_node.handle = adev->handle;
|
||||
pdevinfo.acpi_node.companion = adev;
|
||||
pdev = platform_device_register_full(&pdevinfo);
|
||||
if (IS_ERR(pdev)) {
|
||||
dev_err(&adev->dev, "platform device creation failed: %ld\n",
|
||||
|
|
|
@ -75,39 +75,6 @@ static struct acpi_blacklist_item acpi_blacklist[] __initdata = {
|
|||
{""}
|
||||
};
|
||||
|
||||
#if CONFIG_ACPI_BLACKLIST_YEAR
|
||||
|
||||
static int __init blacklist_by_year(void)
|
||||
{
|
||||
int year;
|
||||
|
||||
/* Doesn't exist? Likely an old system */
|
||||
if (!dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL)) {
|
||||
printk(KERN_ERR PREFIX "no DMI BIOS year, "
|
||||
"acpi=force is required to enable ACPI\n" );
|
||||
return 1;
|
||||
}
|
||||
/* 0? Likely a buggy new BIOS */
|
||||
if (year == 0) {
|
||||
printk(KERN_ERR PREFIX "DMI BIOS year==0, "
|
||||
"assuming ACPI-capable machine\n" );
|
||||
return 0;
|
||||
}
|
||||
if (year < CONFIG_ACPI_BLACKLIST_YEAR) {
|
||||
printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), "
|
||||
"acpi=force is required to enable ACPI\n",
|
||||
year, CONFIG_ACPI_BLACKLIST_YEAR);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int blacklist_by_year(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int __init acpi_blacklisted(void)
|
||||
{
|
||||
int i = 0;
|
||||
|
@ -166,8 +133,6 @@ int __init acpi_blacklisted(void)
|
|||
}
|
||||
}
|
||||
|
||||
blacklisted += blacklist_by_year();
|
||||
|
||||
dmi_check_system(acpi_osi_dmi_table);
|
||||
|
||||
return blacklisted;
|
||||
|
|
|
@ -22,16 +22,12 @@
|
|||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/pm_qos.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define _COMPONENT ACPI_POWER_COMPONENT
|
||||
|
@ -548,7 +544,7 @@ static int acpi_dev_pm_get_state(struct device *dev, struct acpi_device *adev,
|
|||
*/
|
||||
int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in)
|
||||
{
|
||||
acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
struct acpi_device *adev;
|
||||
int ret, d_min, d_max;
|
||||
|
||||
|
@ -656,7 +652,7 @@ int acpi_pm_device_run_wake(struct device *phys_dev, bool enable)
|
|||
if (!device_run_wake(phys_dev))
|
||||
return -EINVAL;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(phys_dev);
|
||||
handle = ACPI_HANDLE(phys_dev);
|
||||
if (!handle || acpi_bus_get_device(handle, &adev)) {
|
||||
dev_dbg(phys_dev, "ACPI handle without context in %s!\n",
|
||||
__func__);
|
||||
|
@ -700,7 +696,7 @@ int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
|
|||
if (!device_can_wakeup(dev))
|
||||
return -EINVAL;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(dev);
|
||||
handle = ACPI_HANDLE(dev);
|
||||
if (!handle || acpi_bus_get_device(handle, &adev)) {
|
||||
dev_dbg(dev, "ACPI handle without context in %s!\n", __func__);
|
||||
return -ENODEV;
|
||||
|
@ -722,7 +718,7 @@ int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
|
|||
*/
|
||||
struct acpi_device *acpi_dev_pm_get_node(struct device *dev)
|
||||
{
|
||||
acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
struct acpi_device *adev;
|
||||
|
||||
return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL;
|
||||
|
|
|
@ -173,9 +173,10 @@ static void start_transaction(struct acpi_ec *ec)
|
|||
static void advance_transaction(struct acpi_ec *ec, u8 status)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct transaction *t = ec->curr;
|
||||
struct transaction *t;
|
||||
|
||||
spin_lock_irqsave(&ec->lock, flags);
|
||||
t = ec->curr;
|
||||
if (!t)
|
||||
goto unlock;
|
||||
if (t->wlen > t->wi) {
|
||||
|
|
|
@ -197,30 +197,28 @@ static void acpi_physnode_link_name(char *buf, unsigned int node_id)
|
|||
|
||||
int acpi_bind_one(struct device *dev, acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *acpi_dev;
|
||||
acpi_status status;
|
||||
struct acpi_device *acpi_dev = NULL;
|
||||
struct acpi_device_physical_node *physical_node, *pn;
|
||||
char physical_node_name[PHYSICAL_NODE_NAME_SIZE];
|
||||
struct list_head *physnode_list;
|
||||
unsigned int node_id;
|
||||
int retval = -EINVAL;
|
||||
|
||||
if (ACPI_HANDLE(dev)) {
|
||||
if (ACPI_COMPANION(dev)) {
|
||||
if (handle) {
|
||||
dev_warn(dev, "ACPI handle is already set\n");
|
||||
dev_warn(dev, "ACPI companion already set\n");
|
||||
return -EINVAL;
|
||||
} else {
|
||||
handle = ACPI_HANDLE(dev);
|
||||
acpi_dev = ACPI_COMPANION(dev);
|
||||
}
|
||||
} else {
|
||||
acpi_bus_get_device(handle, &acpi_dev);
|
||||
}
|
||||
if (!handle)
|
||||
if (!acpi_dev)
|
||||
return -EINVAL;
|
||||
|
||||
get_device(&acpi_dev->dev);
|
||||
get_device(dev);
|
||||
status = acpi_bus_get_device(handle, &acpi_dev);
|
||||
if (ACPI_FAILURE(status))
|
||||
goto err;
|
||||
|
||||
physical_node = kzalloc(sizeof(*physical_node), GFP_KERNEL);
|
||||
if (!physical_node) {
|
||||
retval = -ENOMEM;
|
||||
|
@ -242,10 +240,11 @@ int acpi_bind_one(struct device *dev, acpi_handle handle)
|
|||
|
||||
dev_warn(dev, "Already associated with ACPI node\n");
|
||||
kfree(physical_node);
|
||||
if (ACPI_HANDLE(dev) != handle)
|
||||
if (ACPI_COMPANION(dev) != acpi_dev)
|
||||
goto err;
|
||||
|
||||
put_device(dev);
|
||||
put_device(&acpi_dev->dev);
|
||||
return 0;
|
||||
}
|
||||
if (pn->node_id == node_id) {
|
||||
|
@ -259,8 +258,8 @@ int acpi_bind_one(struct device *dev, acpi_handle handle)
|
|||
list_add(&physical_node->node, physnode_list);
|
||||
acpi_dev->physical_node_count++;
|
||||
|
||||
if (!ACPI_HANDLE(dev))
|
||||
ACPI_HANDLE_SET(dev, acpi_dev->handle);
|
||||
if (!ACPI_COMPANION(dev))
|
||||
ACPI_COMPANION_SET(dev, acpi_dev);
|
||||
|
||||
acpi_physnode_link_name(physical_node_name, node_id);
|
||||
retval = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj,
|
||||
|
@ -283,27 +282,21 @@ int acpi_bind_one(struct device *dev, acpi_handle handle)
|
|||
return 0;
|
||||
|
||||
err:
|
||||
ACPI_HANDLE_SET(dev, NULL);
|
||||
ACPI_COMPANION_SET(dev, NULL);
|
||||
put_device(dev);
|
||||
put_device(&acpi_dev->dev);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bind_one);
|
||||
|
||||
int acpi_unbind_one(struct device *dev)
|
||||
{
|
||||
struct acpi_device *acpi_dev = ACPI_COMPANION(dev);
|
||||
struct acpi_device_physical_node *entry;
|
||||
struct acpi_device *acpi_dev;
|
||||
acpi_status status;
|
||||
|
||||
if (!ACPI_HANDLE(dev))
|
||||
if (!acpi_dev)
|
||||
return 0;
|
||||
|
||||
status = acpi_bus_get_device(ACPI_HANDLE(dev), &acpi_dev);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dev_err(dev, "Oops, ACPI handle corrupt in %s()\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&acpi_dev->physical_node_lock);
|
||||
|
||||
list_for_each_entry(entry, &acpi_dev->physical_node_list, node)
|
||||
|
@ -316,9 +309,10 @@ int acpi_unbind_one(struct device *dev)
|
|||
acpi_physnode_link_name(physnode_name, entry->node_id);
|
||||
sysfs_remove_link(&acpi_dev->dev.kobj, physnode_name);
|
||||
sysfs_remove_link(&dev->kobj, "firmware_node");
|
||||
ACPI_HANDLE_SET(dev, NULL);
|
||||
/* acpi_bind_one() increase refcnt by one. */
|
||||
ACPI_COMPANION_SET(dev, NULL);
|
||||
/* Drop references taken by acpi_bind_one(). */
|
||||
put_device(dev);
|
||||
put_device(&acpi_dev->dev);
|
||||
kfree(entry);
|
||||
break;
|
||||
}
|
||||
|
@ -328,6 +322,15 @@ int acpi_unbind_one(struct device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_unbind_one);
|
||||
|
||||
void acpi_preset_companion(struct device *dev, acpi_handle parent, u64 addr)
|
||||
{
|
||||
struct acpi_device *adev;
|
||||
|
||||
if (!acpi_bus_get_device(acpi_get_child(parent, addr), &adev))
|
||||
ACPI_COMPANION_SET(dev, adev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_preset_companion);
|
||||
|
||||
static int acpi_platform_notify(struct device *dev)
|
||||
{
|
||||
struct acpi_bus_type *type = acpi_get_bus_type(dev);
|
||||
|
|
|
@ -575,6 +575,7 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|||
dev_err(&device->dev,
|
||||
"Bus %04x:%02x not present in PCI namespace\n",
|
||||
root->segment, (unsigned int)root->secondary.start);
|
||||
device->driver_data = NULL;
|
||||
result = -ENODEV;
|
||||
goto end;
|
||||
}
|
||||
|
|
|
@ -289,24 +289,17 @@ void acpi_bus_device_eject(void *data, u32 ost_src)
|
|||
{
|
||||
struct acpi_device *device = data;
|
||||
acpi_handle handle = device->handle;
|
||||
struct acpi_scan_handler *handler;
|
||||
u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
|
||||
int error;
|
||||
|
||||
lock_device_hotplug();
|
||||
mutex_lock(&acpi_scan_lock);
|
||||
|
||||
handler = device->handler;
|
||||
if (!handler || !handler->hotplug.enabled) {
|
||||
put_device(&device->dev);
|
||||
goto err_support;
|
||||
}
|
||||
|
||||
if (ost_src == ACPI_NOTIFY_EJECT_REQUEST)
|
||||
acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST,
|
||||
ACPI_OST_SC_EJECT_IN_PROGRESS, NULL);
|
||||
|
||||
if (handler->hotplug.mode == AHM_CONTAINER)
|
||||
if (device->handler && device->handler->hotplug.mode == AHM_CONTAINER)
|
||||
kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
|
||||
|
||||
error = acpi_scan_hot_remove(device);
|
||||
|
@ -411,8 +404,7 @@ static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data)
|
|||
break;
|
||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||
acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n");
|
||||
status = acpi_bus_get_device(handle, &adev);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (acpi_bus_get_device(handle, &adev))
|
||||
goto err_out;
|
||||
|
||||
get_device(&adev->dev);
|
||||
|
@ -1997,6 +1989,7 @@ static int acpi_bus_scan_fixed(void)
|
|||
if (result)
|
||||
return result;
|
||||
|
||||
device->flags.match_driver = true;
|
||||
result = device_attach(&device->dev);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
@ -2013,6 +2006,7 @@ static int acpi_bus_scan_fixed(void)
|
|||
if (result)
|
||||
return result;
|
||||
|
||||
device->flags.match_driver = true;
|
||||
result = device_attach(&device->dev);
|
||||
}
|
||||
|
||||
|
|
|
@ -81,13 +81,6 @@ module_param(brightness_switch_enabled, bool, 0644);
|
|||
static bool allow_duplicates;
|
||||
module_param(allow_duplicates, bool, 0644);
|
||||
|
||||
/*
|
||||
* Some BIOSes claim they use minimum backlight at boot,
|
||||
* and this may bring dimming screen after boot
|
||||
*/
|
||||
static bool use_bios_initial_backlight = 1;
|
||||
module_param(use_bios_initial_backlight, bool, 0644);
|
||||
|
||||
/*
|
||||
* For Windows 8 systems: if set ture and the GPU driver has
|
||||
* registered a backlight interface, skip registering ACPI video's.
|
||||
|
@ -406,12 +399,6 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int video_ignore_initial_backlight(const struct dmi_system_id *d)
|
||||
{
|
||||
use_bios_initial_backlight = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id video_dmi_table[] __initdata = {
|
||||
/*
|
||||
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
|
||||
|
@ -456,54 +443,6 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Folio 13-2000",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "Fujitsu E753",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "FUJITSU"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E753"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Pavilion dm4",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dm4 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Pavilion g6 Notebook PC",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP 1000 Notebook PC",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Pavilion m4",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -839,20 +778,18 @@ acpi_video_init_brightness(struct acpi_video_device *device)
|
|||
if (!device->cap._BQC)
|
||||
goto set_level;
|
||||
|
||||
if (use_bios_initial_backlight) {
|
||||
level = acpi_video_bqc_value_to_level(device, level_old);
|
||||
/*
|
||||
* On some buggy laptops, _BQC returns an uninitialized
|
||||
* value when invoked for the first time, i.e.
|
||||
* level_old is invalid (no matter whether it's a level
|
||||
* or an index). Set the backlight to max_level in this case.
|
||||
*/
|
||||
for (i = 2; i < br->count; i++)
|
||||
if (level == br->levels[i])
|
||||
break;
|
||||
if (i == br->count || !level)
|
||||
level = max_level;
|
||||
}
|
||||
level = acpi_video_bqc_value_to_level(device, level_old);
|
||||
/*
|
||||
* On some buggy laptops, _BQC returns an uninitialized
|
||||
* value when invoked for the first time, i.e.
|
||||
* level_old is invalid (no matter whether it's a level
|
||||
* or an index). Set the backlight to max_level in this case.
|
||||
*/
|
||||
for (i = 2; i < br->count; i++)
|
||||
if (level == br->levels[i])
|
||||
break;
|
||||
if (i == br->count || !level)
|
||||
level = max_level;
|
||||
|
||||
set_level:
|
||||
result = acpi_video_device_lcd_set_level(device, level);
|
||||
|
|
|
@ -185,7 +185,7 @@ void ata_acpi_bind_port(struct ata_port *ap)
|
|||
if (libata_noacpi || ap->flags & ATA_FLAG_ACPI_SATA || !host_handle)
|
||||
return;
|
||||
|
||||
ACPI_HANDLE_SET(&ap->tdev, acpi_get_child(host_handle, ap->port_no));
|
||||
acpi_preset_companion(&ap->tdev, host_handle, ap->port_no);
|
||||
|
||||
if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0)
|
||||
ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
|
||||
|
@ -222,7 +222,7 @@ void ata_acpi_bind_dev(struct ata_device *dev)
|
|||
parent_handle = port_handle;
|
||||
}
|
||||
|
||||
ACPI_HANDLE_SET(&dev->tdev, acpi_get_child(parent_handle, adr));
|
||||
acpi_preset_companion(&dev->tdev, parent_handle, adr);
|
||||
|
||||
register_hotplug_dock_device(ata_dev_acpi_handle(dev),
|
||||
&ata_acpi_dev_dock_ops, dev, NULL, NULL);
|
||||
|
|
|
@ -432,7 +432,7 @@ struct platform_device *platform_device_register_full(
|
|||
goto err_alloc;
|
||||
|
||||
pdev->dev.parent = pdevinfo->parent;
|
||||
ACPI_HANDLE_SET(&pdev->dev, pdevinfo->acpi_node.handle);
|
||||
ACPI_COMPANION_SET(&pdev->dev, pdevinfo->acpi_node.companion);
|
||||
|
||||
if (pdevinfo->dma_mask) {
|
||||
/*
|
||||
|
@ -463,7 +463,7 @@ struct platform_device *platform_device_register_full(
|
|||
ret = platform_device_add(pdev);
|
||||
if (ret) {
|
||||
err:
|
||||
ACPI_HANDLE_SET(&pdev->dev, NULL);
|
||||
ACPI_COMPANION_SET(&pdev->dev, NULL);
|
||||
kfree(pdev->dev.dma_mask);
|
||||
|
||||
err_alloc:
|
||||
|
|
|
@ -1350,6 +1350,9 @@ static int device_prepare(struct device *dev, pm_message_t state)
|
|||
|
||||
device_unlock(dev);
|
||||
|
||||
if (error)
|
||||
pm_runtime_put(dev);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
@ -68,6 +68,9 @@ static void cs_check_cpu(int cpu, unsigned int load)
|
|||
|
||||
dbs_info->requested_freq += get_freq_target(cs_tuners, policy);
|
||||
|
||||
if (dbs_info->requested_freq > policy->max)
|
||||
dbs_info->requested_freq = policy->max;
|
||||
|
||||
__cpufreq_driver_target(policy, dbs_info->requested_freq,
|
||||
CPUFREQ_RELATION_H);
|
||||
return;
|
||||
|
|
|
@ -328,10 +328,6 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||
dbs_data->cdata->gov_dbs_timer);
|
||||
}
|
||||
|
||||
/*
|
||||
* conservative does not implement micro like ondemand
|
||||
* governor, thus we are bound to jiffes/HZ
|
||||
*/
|
||||
if (dbs_data->cdata->governor == GOV_CONSERVATIVE) {
|
||||
cs_dbs_info->down_skip = 0;
|
||||
cs_dbs_info->enable = 1;
|
||||
|
|
|
@ -53,6 +53,7 @@ static unsigned int omap_getspeed(unsigned int cpu)
|
|||
|
||||
static int omap_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
int r, ret;
|
||||
struct dev_pm_opp *opp;
|
||||
unsigned long freq, volt = 0, volt_old = 0, tol = 0;
|
||||
unsigned int old_freq, new_freq;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/acpi_gpio.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/gpio.h>
|
||||
|
|
|
@ -196,7 +196,7 @@ static bool intel_dsm_pci_probe(struct pci_dev *pdev)
|
|||
acpi_handle dhandle;
|
||||
int ret;
|
||||
|
||||
dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!dhandle)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -638,7 +638,7 @@ static void intel_didl_outputs(struct drm_device *dev)
|
|||
u32 temp;
|
||||
int i = 0;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->pdev->dev);
|
||||
handle = ACPI_HANDLE(&dev->pdev->dev);
|
||||
if (!handle || acpi_bus_get_device(handle, &acpi_dev))
|
||||
return;
|
||||
|
||||
|
|
|
@ -116,7 +116,7 @@ mxm_shadow_dsm(struct nouveau_mxm *mxm, u8 version)
|
|||
acpi_handle handle;
|
||||
int ret;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&device->pdev->dev);
|
||||
handle = ACPI_HANDLE(&device->pdev->dev);
|
||||
if (!handle)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -256,7 +256,7 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
|
|||
acpi_handle dhandle;
|
||||
int retval = 0;
|
||||
|
||||
dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!dhandle)
|
||||
return false;
|
||||
|
||||
|
@ -414,7 +414,7 @@ bool nouveau_acpi_rom_supported(struct pci_dev *pdev)
|
|||
if (!nouveau_dsm_priv.dsm_detected && !nouveau_dsm_priv.optimus_detected)
|
||||
return false;
|
||||
|
||||
dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!dhandle)
|
||||
return false;
|
||||
|
||||
|
@ -448,7 +448,7 @@ nouveau_acpi_edid(struct drm_device *dev, struct drm_connector *connector)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->pdev->dev);
|
||||
handle = ACPI_HANDLE(&dev->pdev->dev);
|
||||
if (!handle)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -369,7 +369,7 @@ int radeon_atif_handler(struct radeon_device *rdev,
|
|||
return NOTIFY_DONE;
|
||||
|
||||
/* Check pending SBIOS requests */
|
||||
handle = DEVICE_ACPI_HANDLE(&rdev->pdev->dev);
|
||||
handle = ACPI_HANDLE(&rdev->pdev->dev);
|
||||
count = radeon_atif_get_sbios_requests(handle, &req);
|
||||
|
||||
if (count <= 0)
|
||||
|
@ -556,7 +556,7 @@ int radeon_acpi_pcie_notify_device_ready(struct radeon_device *rdev)
|
|||
struct radeon_atcs *atcs = &rdev->atcs;
|
||||
|
||||
/* Get the device handle */
|
||||
handle = DEVICE_ACPI_HANDLE(&rdev->pdev->dev);
|
||||
handle = ACPI_HANDLE(&rdev->pdev->dev);
|
||||
if (!handle)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -596,7 +596,7 @@ int radeon_acpi_pcie_performance_request(struct radeon_device *rdev,
|
|||
u32 retry = 3;
|
||||
|
||||
/* Get the device handle */
|
||||
handle = DEVICE_ACPI_HANDLE(&rdev->pdev->dev);
|
||||
handle = ACPI_HANDLE(&rdev->pdev->dev);
|
||||
if (!handle)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -699,7 +699,7 @@ int radeon_acpi_init(struct radeon_device *rdev)
|
|||
int ret;
|
||||
|
||||
/* Get the device handle */
|
||||
handle = DEVICE_ACPI_HANDLE(&rdev->pdev->dev);
|
||||
handle = ACPI_HANDLE(&rdev->pdev->dev);
|
||||
|
||||
/* No need to proceed if we're sure that ATIF is not supported */
|
||||
if (!ASIC_IS_AVIVO(rdev) || !rdev->bios || !handle)
|
||||
|
|
|
@ -8,8 +8,7 @@
|
|||
*/
|
||||
#include <linux/vga_switcheroo.h>
|
||||
#include <linux/slab.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "radeon_acpi.h"
|
||||
|
@ -447,7 +446,7 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
|
|||
acpi_handle dhandle, atpx_handle;
|
||||
acpi_status status;
|
||||
|
||||
dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!dhandle)
|
||||
return false;
|
||||
|
||||
|
@ -493,7 +492,7 @@ static int radeon_atpx_init(void)
|
|||
*/
|
||||
static int radeon_atpx_get_client_id(struct pci_dev *pdev)
|
||||
{
|
||||
if (radeon_atpx_priv.dhandle == DEVICE_ACPI_HANDLE(&pdev->dev))
|
||||
if (radeon_atpx_priv.dhandle == ACPI_HANDLE(&pdev->dev))
|
||||
return VGA_SWITCHEROO_IGD;
|
||||
else
|
||||
return VGA_SWITCHEROO_DIS;
|
||||
|
|
|
@ -185,7 +185,7 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
|
|||
return false;
|
||||
|
||||
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
|
||||
dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!dhandle)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -1008,7 +1008,7 @@ static int i2c_hid_probe(struct i2c_client *client,
|
|||
hid->hid_get_raw_report = i2c_hid_get_raw_report;
|
||||
hid->hid_output_raw_report = i2c_hid_output_raw_report;
|
||||
hid->dev.parent = &client->dev;
|
||||
ACPI_HANDLE_SET(&hid->dev, ACPI_HANDLE(&client->dev));
|
||||
ACPI_COMPANION_SET(&hid->dev, ACPI_COMPANION(&client->dev));
|
||||
hid->bus = BUS_I2C;
|
||||
hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
|
||||
hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
|
||||
|
|
|
@ -615,6 +615,22 @@ void i2c_unlock_adapter(struct i2c_adapter *adapter)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(i2c_unlock_adapter);
|
||||
|
||||
static void i2c_dev_set_name(struct i2c_adapter *adap,
|
||||
struct i2c_client *client)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(&client->dev);
|
||||
|
||||
if (adev) {
|
||||
dev_set_name(&client->dev, "i2c-%s", acpi_dev_name(adev));
|
||||
return;
|
||||
}
|
||||
|
||||
/* For 10-bit clients, add an arbitrary offset to avoid collisions */
|
||||
dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap),
|
||||
client->addr | ((client->flags & I2C_CLIENT_TEN)
|
||||
? 0xa000 : 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* i2c_new_device - instantiate an i2c device
|
||||
* @adap: the adapter managing the device
|
||||
|
@ -671,12 +687,9 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
|
|||
client->dev.bus = &i2c_bus_type;
|
||||
client->dev.type = &i2c_client_type;
|
||||
client->dev.of_node = info->of_node;
|
||||
ACPI_HANDLE_SET(&client->dev, info->acpi_node.handle);
|
||||
ACPI_COMPANION_SET(&client->dev, info->acpi_node.companion);
|
||||
|
||||
/* For 10-bit clients, add an arbitrary offset to avoid collisions */
|
||||
dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap),
|
||||
client->addr | ((client->flags & I2C_CLIENT_TEN)
|
||||
? 0xa000 : 0));
|
||||
i2c_dev_set_name(adap, client);
|
||||
status = device_register(&client->dev);
|
||||
if (status)
|
||||
goto out_err;
|
||||
|
@ -1100,7 +1113,7 @@ static acpi_status acpi_i2c_add_device(acpi_handle handle, u32 level,
|
|||
return AE_OK;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.acpi_node.handle = handle;
|
||||
info.acpi_node.companion = adev;
|
||||
info.irq = -1;
|
||||
|
||||
INIT_LIST_HEAD(&resource_list);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
* Copyright (C) 2006 Hannes Reinecke
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/ata.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -19,8 +20,6 @@
|
|||
#include <linux/dmi.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
|
||||
#define REGS_PER_GTF 7
|
||||
|
||||
struct GTM_buffer {
|
||||
|
@ -128,7 +127,7 @@ static int ide_get_dev_handle(struct device *dev, acpi_handle *handle,
|
|||
|
||||
DEBPRINT("ENTER: pci %02x:%02x.%01x\n", bus, devnum, func);
|
||||
|
||||
dev_handle = DEVICE_ACPI_HANDLE(dev);
|
||||
dev_handle = ACPI_HANDLE(dev);
|
||||
if (!dev_handle) {
|
||||
DEBPRINT("no acpi handle for device\n");
|
||||
goto err;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* intel_idle.c - native hardware idle loop for modern Intel processors
|
||||
*
|
||||
* Copyright (c) 2010, Intel Corporation.
|
||||
* Copyright (c) 2013, Intel Corporation.
|
||||
* Len Brown <len.brown@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
|
@ -329,6 +329,22 @@ static struct cpuidle_state atom_cstates[] __initdata = {
|
|||
{
|
||||
.enter = NULL }
|
||||
};
|
||||
static struct cpuidle_state avn_cstates[CPUIDLE_STATE_MAX] = {
|
||||
{
|
||||
.name = "C1-AVN",
|
||||
.desc = "MWAIT 0x00",
|
||||
.flags = MWAIT2flg(0x00) | CPUIDLE_FLAG_TIME_VALID,
|
||||
.exit_latency = 2,
|
||||
.target_residency = 2,
|
||||
.enter = &intel_idle },
|
||||
{
|
||||
.name = "C6-AVN",
|
||||
.desc = "MWAIT 0x51",
|
||||
.flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||
.exit_latency = 15,
|
||||
.target_residency = 45,
|
||||
.enter = &intel_idle },
|
||||
};
|
||||
|
||||
/**
|
||||
* intel_idle
|
||||
|
@ -462,6 +478,11 @@ static const struct idle_cpu idle_cpu_hsw = {
|
|||
.disable_promotion_to_c1e = true,
|
||||
};
|
||||
|
||||
static const struct idle_cpu idle_cpu_avn = {
|
||||
.state_table = avn_cstates,
|
||||
.disable_promotion_to_c1e = true,
|
||||
};
|
||||
|
||||
#define ICPU(model, cpu) \
|
||||
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_MWAIT, (unsigned long)&cpu }
|
||||
|
||||
|
@ -483,6 +504,7 @@ static const struct x86_cpu_id intel_idle_ids[] = {
|
|||
ICPU(0x3f, idle_cpu_hsw),
|
||||
ICPU(0x45, idle_cpu_hsw),
|
||||
ICPU(0x46, idle_cpu_hsw),
|
||||
ICPU(0x4D, idle_cpu_avn),
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(x86cpu, intel_idle_ids);
|
||||
|
|
|
@ -308,8 +308,7 @@ static void sdio_acpi_set_handle(struct sdio_func *func)
|
|||
struct mmc_host *host = func->card->host;
|
||||
u64 addr = (host->slotno << 16) | func->num;
|
||||
|
||||
ACPI_HANDLE_SET(&func->dev,
|
||||
acpi_get_child(ACPI_HANDLE(host->parent), addr));
|
||||
acpi_preset_companion(&func->dev, ACPI_HANDLE(host->parent), addr);
|
||||
}
|
||||
#else
|
||||
static inline void sdio_acpi_set_handle(struct sdio_func *func) {}
|
||||
|
|
|
@ -367,7 +367,7 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *pdev, u32 flags)
|
|||
string = (struct acpi_buffer){ ACPI_ALLOCATE_BUFFER, NULL };
|
||||
}
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
handle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!handle) {
|
||||
/*
|
||||
* This hotplug controller was not listed in the ACPI name
|
||||
|
|
|
@ -176,7 +176,6 @@ u8 acpiphp_get_latch_status(struct acpiphp_slot *slot);
|
|||
u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot);
|
||||
|
||||
/* variables */
|
||||
extern bool acpiphp_debug;
|
||||
extern bool acpiphp_disabled;
|
||||
|
||||
#endif /* _ACPIPHP_H */
|
||||
|
|
|
@ -54,7 +54,7 @@ int pciehp_acpi_slot_detection_check(struct pci_dev *dev)
|
|||
{
|
||||
if (slot_detection_mode != PCIEHP_DETECT_ACPI)
|
||||
return 0;
|
||||
if (acpi_pci_detect_ejectable(DEVICE_ACPI_HANDLE(&dev->dev)))
|
||||
if (acpi_pci_detect_ejectable(ACPI_HANDLE(&dev->dev)))
|
||||
return 0;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ static int __init dummy_probe(struct pcie_device *dev)
|
|||
dup_slot_id++;
|
||||
}
|
||||
list_add_tail(&slot->list, &dummy_slots);
|
||||
handle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
handle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!acpi_slot_detected && acpi_pci_detect_ejectable(handle))
|
||||
acpi_slot_detected = 1;
|
||||
return -ENODEV; /* dummy driver always returns error */
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
* Work to add BIOS PROM support was completed by Mike Habeck.
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -29,7 +30,6 @@
|
|||
#include <asm/sn/sn_feature_sets.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include <asm/sn/types.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <asm/sn/acpi.h>
|
||||
|
||||
#include "../pci.h"
|
||||
|
@ -414,7 +414,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
acpi_handle rethandle;
|
||||
acpi_status ret;
|
||||
|
||||
phandle = PCI_CONTROLLER(slot->pci_bus)->acpi_handle;
|
||||
phandle = acpi_device_handle(PCI_CONTROLLER(slot->pci_bus)->companion);
|
||||
|
||||
if (acpi_bus_get_device(phandle, &pdevice)) {
|
||||
dev_dbg(&slot->pci_bus->self->dev,
|
||||
|
@ -495,7 +495,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
|
||||
/* free the ACPI resources for the slot */
|
||||
if (SN_ACPI_BASE_SUPPORT() &&
|
||||
PCI_CONTROLLER(slot->pci_bus)->acpi_handle) {
|
||||
PCI_CONTROLLER(slot->pci_bus)->companion) {
|
||||
unsigned long long adr;
|
||||
struct acpi_device *device;
|
||||
acpi_handle phandle;
|
||||
|
@ -504,7 +504,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
acpi_status ret;
|
||||
|
||||
/* Get the rootbus node pointer */
|
||||
phandle = PCI_CONTROLLER(slot->pci_bus)->acpi_handle;
|
||||
phandle = acpi_device_handle(PCI_CONTROLLER(slot->pci_bus)->companion);
|
||||
|
||||
acpi_scan_lock_acquire();
|
||||
/*
|
||||
|
|
|
@ -37,7 +37,7 @@ static int ioapic_probe(struct pci_dev *dev, const struct pci_device_id *ent)
|
|||
char *type;
|
||||
struct resource *res;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
handle = ACPI_HANDLE(&dev->dev);
|
||||
if (!handle)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -173,14 +173,14 @@ static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev)
|
|||
|
||||
static bool acpi_pci_power_manageable(struct pci_dev *dev)
|
||||
{
|
||||
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
acpi_handle handle = ACPI_HANDLE(&dev->dev);
|
||||
|
||||
return handle ? acpi_bus_power_manageable(handle) : false;
|
||||
}
|
||||
|
||||
static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||
{
|
||||
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
acpi_handle handle = ACPI_HANDLE(&dev->dev);
|
||||
static const u8 state_conv[] = {
|
||||
[PCI_D0] = ACPI_STATE_D0,
|
||||
[PCI_D1] = ACPI_STATE_D1,
|
||||
|
@ -217,7 +217,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
|||
|
||||
static bool acpi_pci_can_wakeup(struct pci_dev *dev)
|
||||
{
|
||||
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
acpi_handle handle = ACPI_HANDLE(&dev->dev);
|
||||
|
||||
return handle ? acpi_bus_can_wakeup(handle) : false;
|
||||
}
|
||||
|
|
|
@ -263,7 +263,7 @@ device_has_dsm(struct device *dev)
|
|||
acpi_handle handle;
|
||||
struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(dev);
|
||||
handle = ACPI_HANDLE(dev);
|
||||
|
||||
if (!handle)
|
||||
return FALSE;
|
||||
|
@ -295,7 +295,7 @@ acpilabel_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|||
acpi_handle handle;
|
||||
int length;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(dev);
|
||||
handle = ACPI_HANDLE(dev);
|
||||
|
||||
if (!handle)
|
||||
return -1;
|
||||
|
@ -316,7 +316,7 @@ acpiindex_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|||
acpi_handle handle;
|
||||
int length;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(dev);
|
||||
handle = ACPI_HANDLE(dev);
|
||||
|
||||
if (!handle)
|
||||
return -1;
|
||||
|
|
|
@ -519,7 +519,7 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
|
|||
|
||||
gmux_data->power_state = VGA_SWITCHEROO_ON;
|
||||
|
||||
gmux_data->dhandle = DEVICE_ACPI_HANDLE(&pnp->dev);
|
||||
gmux_data->dhandle = ACPI_HANDLE(&pnp->dev);
|
||||
if (!gmux_data->dhandle) {
|
||||
pr_err("Cannot find acpi handle for pnp device %s\n",
|
||||
dev_name(&pnp->dev));
|
||||
|
|
|
@ -89,7 +89,7 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)
|
|||
|
||||
pnp_dbg(&dev->dev, "set resources\n");
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
handle = ACPI_HANDLE(&dev->dev);
|
||||
if (!handle || acpi_bus_get_device(handle, &acpi_dev)) {
|
||||
dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__);
|
||||
return -ENODEV;
|
||||
|
@ -122,7 +122,7 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev)
|
|||
|
||||
dev_dbg(&dev->dev, "disable resources\n");
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
handle = ACPI_HANDLE(&dev->dev);
|
||||
if (!handle || acpi_bus_get_device(handle, &acpi_dev)) {
|
||||
dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__);
|
||||
return 0;
|
||||
|
@ -144,7 +144,7 @@ static bool pnpacpi_can_wakeup(struct pnp_dev *dev)
|
|||
struct acpi_device *acpi_dev;
|
||||
acpi_handle handle;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
handle = ACPI_HANDLE(&dev->dev);
|
||||
if (!handle || acpi_bus_get_device(handle, &acpi_dev)) {
|
||||
dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__);
|
||||
return false;
|
||||
|
@ -159,7 +159,7 @@ static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state)
|
|||
acpi_handle handle;
|
||||
int error = 0;
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
handle = ACPI_HANDLE(&dev->dev);
|
||||
if (!handle || acpi_bus_get_device(handle, &acpi_dev)) {
|
||||
dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__);
|
||||
return 0;
|
||||
|
@ -194,7 +194,7 @@ static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state)
|
|||
static int pnpacpi_resume(struct pnp_dev *dev)
|
||||
{
|
||||
struct acpi_device *acpi_dev;
|
||||
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
acpi_handle handle = ACPI_HANDLE(&dev->dev);
|
||||
int error = 0;
|
||||
|
||||
if (!handle || acpi_bus_get_device(handle, &acpi_dev)) {
|
||||
|
|
|
@ -357,6 +357,19 @@ struct spi_device *spi_alloc_device(struct spi_master *master)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(spi_alloc_device);
|
||||
|
||||
static void spi_dev_set_name(struct spi_device *spi)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(&spi->dev);
|
||||
|
||||
if (adev) {
|
||||
dev_set_name(&spi->dev, "spi-%s", acpi_dev_name(adev));
|
||||
return;
|
||||
}
|
||||
|
||||
dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->master->dev),
|
||||
spi->chip_select);
|
||||
}
|
||||
|
||||
/**
|
||||
* spi_add_device - Add spi_device allocated with spi_alloc_device
|
||||
* @spi: spi_device to register
|
||||
|
@ -383,9 +396,7 @@ int spi_add_device(struct spi_device *spi)
|
|||
}
|
||||
|
||||
/* Set the bus ID string */
|
||||
dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->master->dev),
|
||||
spi->chip_select);
|
||||
|
||||
spi_dev_set_name(spi);
|
||||
|
||||
/* We need to make sure there's no other device with this
|
||||
* chipselect **BEFORE** we call setup(), else we'll trash
|
||||
|
@ -1144,7 +1155,7 @@ static acpi_status acpi_spi_add_device(acpi_handle handle, u32 level,
|
|||
return AE_NO_MEMORY;
|
||||
}
|
||||
|
||||
ACPI_HANDLE_SET(&spi->dev, handle);
|
||||
ACPI_COMPANION_SET(&spi->dev, adev);
|
||||
spi->irq = -1;
|
||||
|
||||
INIT_LIST_HEAD(&resource_list);
|
||||
|
|
|
@ -5501,6 +5501,6 @@ acpi_handle usb_get_hub_port_acpi_handle(struct usb_device *hdev,
|
|||
if (!hub)
|
||||
return NULL;
|
||||
|
||||
return DEVICE_ACPI_HANDLE(&hub->ports[port1 - 1]->dev);
|
||||
return ACPI_HANDLE(&hub->ports[port1 - 1]->dev);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -173,7 +173,7 @@ static int usb_acpi_find_device(struct device *dev, acpi_handle *handle)
|
|||
}
|
||||
|
||||
/* root hub's parent is the usb hcd. */
|
||||
parent_handle = DEVICE_ACPI_HANDLE(dev->parent);
|
||||
parent_handle = ACPI_HANDLE(dev->parent);
|
||||
*handle = acpi_get_child(parent_handle, udev->portnum);
|
||||
if (!*handle)
|
||||
return -ENODEV;
|
||||
|
@ -194,7 +194,7 @@ static int usb_acpi_find_device(struct device *dev, acpi_handle *handle)
|
|||
|
||||
raw_port_num = usb_hcd_find_raw_port_number(hcd,
|
||||
port_num);
|
||||
*handle = acpi_get_child(DEVICE_ACPI_HANDLE(&udev->dev),
|
||||
*handle = acpi_get_child(ACPI_HANDLE(&udev->dev),
|
||||
raw_port_num);
|
||||
if (!*handle)
|
||||
return -ENODEV;
|
||||
|
|
|
@ -59,12 +59,12 @@ static int xen_add_device(struct device *dev)
|
|||
add.flags = XEN_PCI_DEV_EXTFN;
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
handle = DEVICE_ACPI_HANDLE(&pci_dev->dev);
|
||||
handle = ACPI_HANDLE(&pci_dev->dev);
|
||||
if (!handle && pci_dev->bus->bridge)
|
||||
handle = DEVICE_ACPI_HANDLE(pci_dev->bus->bridge);
|
||||
handle = ACPI_HANDLE(pci_dev->bus->bridge);
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
if (!handle && pci_dev->is_virtfn)
|
||||
handle = DEVICE_ACPI_HANDLE(physfn->bus->bridge);
|
||||
handle = ACPI_HANDLE(physfn->bus->bridge);
|
||||
#endif
|
||||
if (handle) {
|
||||
acpi_status status;
|
||||
|
|
|
@ -431,9 +431,9 @@ static inline acpi_handle acpi_get_child(acpi_handle handle, u64 addr)
|
|||
{
|
||||
return acpi_find_child(handle, addr, false);
|
||||
}
|
||||
void acpi_preset_companion(struct device *dev, acpi_handle parent, u64 addr);
|
||||
int acpi_is_root_bridge(acpi_handle);
|
||||
struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
|
||||
#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)ACPI_HANDLE(dev))
|
||||
|
||||
int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state);
|
||||
int acpi_disable_wakeup_device_power(struct acpi_device *dev);
|
||||
|
|
|
@ -44,6 +44,20 @@
|
|||
#include <acpi/acpi_numa.h>
|
||||
#include <asm/acpi.h>
|
||||
|
||||
static inline acpi_handle acpi_device_handle(struct acpi_device *adev)
|
||||
{
|
||||
return adev ? adev->handle : NULL;
|
||||
}
|
||||
|
||||
#define ACPI_COMPANION(dev) ((dev)->acpi_node.companion)
|
||||
#define ACPI_COMPANION_SET(dev, adev) ACPI_COMPANION(dev) = (adev)
|
||||
#define ACPI_HANDLE(dev) acpi_device_handle(ACPI_COMPANION(dev))
|
||||
|
||||
static inline const char *acpi_dev_name(struct acpi_device *adev)
|
||||
{
|
||||
return dev_name(&adev->dev);
|
||||
}
|
||||
|
||||
enum acpi_irq_model_id {
|
||||
ACPI_IRQ_MODEL_PIC = 0,
|
||||
ACPI_IRQ_MODEL_IOAPIC,
|
||||
|
@ -401,6 +415,15 @@ static inline bool acpi_driver_match_device(struct device *dev,
|
|||
|
||||
#define acpi_disabled 1
|
||||
|
||||
#define ACPI_COMPANION(dev) (NULL)
|
||||
#define ACPI_COMPANION_SET(dev, adev) do { } while (0)
|
||||
#define ACPI_HANDLE(dev) (NULL)
|
||||
|
||||
static inline const char *acpi_dev_name(struct acpi_device *adev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void acpi_early_init(void) { }
|
||||
|
||||
static inline int early_acpi_boot_init(void)
|
||||
|
|
|
@ -644,9 +644,11 @@ struct device_dma_parameters {
|
|||
unsigned long segment_boundary_mask;
|
||||
};
|
||||
|
||||
struct acpi_device;
|
||||
|
||||
struct acpi_dev_node {
|
||||
#ifdef CONFIG_ACPI
|
||||
void *handle;
|
||||
struct acpi_device *companion;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -790,14 +792,6 @@ static inline struct device *kobj_to_dev(struct kobject *kobj)
|
|||
return container_of(kobj, struct device, kobj);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
#define ACPI_HANDLE(dev) ((dev)->acpi_node.handle)
|
||||
#define ACPI_HANDLE_SET(dev, _handle_) (dev)->acpi_node.handle = (_handle_)
|
||||
#else
|
||||
#define ACPI_HANDLE(dev) (NULL)
|
||||
#define ACPI_HANDLE_SET(dev, _handle_) do { } while (0)
|
||||
#endif
|
||||
|
||||
/* Get the wakeup routines, which depend on struct device */
|
||||
#include <linux/pm_wakeup.h>
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
|
|||
while (!pci_is_root_bus(pbus))
|
||||
pbus = pbus->parent;
|
||||
|
||||
return DEVICE_ACPI_HANDLE(pbus->bridge);
|
||||
return ACPI_HANDLE(pbus->bridge);
|
||||
}
|
||||
|
||||
static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)
|
||||
|
@ -39,7 +39,7 @@ static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)
|
|||
else
|
||||
dev = &pbus->self->dev;
|
||||
|
||||
return DEVICE_ACPI_HANDLE(dev);
|
||||
return ACPI_HANDLE(dev);
|
||||
}
|
||||
|
||||
void acpi_pci_add_bus(struct pci_bus *bus);
|
||||
|
|
|
@ -792,7 +792,8 @@ void free_basic_memory_bitmaps(void)
|
|||
{
|
||||
struct memory_bitmap *bm1, *bm2;
|
||||
|
||||
BUG_ON(!(forbidden_pages_map && free_pages_map));
|
||||
if (WARN_ON(!(forbidden_pages_map && free_pages_map)))
|
||||
return;
|
||||
|
||||
bm1 = forbidden_pages_map;
|
||||
bm2 = free_pages_map;
|
||||
|
|
|
@ -70,6 +70,7 @@ static int snapshot_open(struct inode *inode, struct file *filp)
|
|||
data->swap = swsusp_resume_device ?
|
||||
swap_type_of(swsusp_resume_device, 0, NULL) : -1;
|
||||
data->mode = O_RDONLY;
|
||||
data->free_bitmaps = false;
|
||||
error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
|
||||
if (error)
|
||||
pm_notifier_call_chain(PM_POST_HIBERNATION);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* turbostat -- show CPU frequency and C-state residency
|
||||
* on modern Intel turbo-capable processors.
|
||||
*
|
||||
* Copyright (c) 2012 Intel Corporation.
|
||||
* Copyright (c) 2013 Intel Corporation.
|
||||
* Len Brown <len.brown@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
|
@ -47,6 +47,8 @@ unsigned int skip_c1;
|
|||
unsigned int do_nhm_cstates;
|
||||
unsigned int do_snb_cstates;
|
||||
unsigned int do_c8_c9_c10;
|
||||
unsigned int do_slm_cstates;
|
||||
unsigned int use_c1_residency_msr;
|
||||
unsigned int has_aperf;
|
||||
unsigned int has_epb;
|
||||
unsigned int units = 1000000000; /* Ghz etc */
|
||||
|
@ -81,6 +83,8 @@ double rapl_joule_counter_range;
|
|||
#define RAPL_DRAM (1 << 3)
|
||||
#define RAPL_PKG_PERF_STATUS (1 << 4)
|
||||
#define RAPL_DRAM_PERF_STATUS (1 << 5)
|
||||
#define RAPL_PKG_POWER_INFO (1 << 6)
|
||||
#define RAPL_CORE_POLICY (1 << 7)
|
||||
#define TJMAX_DEFAULT 100
|
||||
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
|
@ -96,7 +100,7 @@ struct thread_data {
|
|||
unsigned long long tsc;
|
||||
unsigned long long aperf;
|
||||
unsigned long long mperf;
|
||||
unsigned long long c1; /* derived */
|
||||
unsigned long long c1;
|
||||
unsigned long long extra_msr64;
|
||||
unsigned long long extra_delta64;
|
||||
unsigned long long extra_msr32;
|
||||
|
@ -266,7 +270,7 @@ void print_header(void)
|
|||
outp += sprintf(outp, " MSR 0x%03X", extra_msr_offset64);
|
||||
if (do_nhm_cstates)
|
||||
outp += sprintf(outp, " %%c1");
|
||||
if (do_nhm_cstates)
|
||||
if (do_nhm_cstates && !do_slm_cstates)
|
||||
outp += sprintf(outp, " %%c3");
|
||||
if (do_nhm_cstates)
|
||||
outp += sprintf(outp, " %%c6");
|
||||
|
@ -280,9 +284,9 @@ void print_header(void)
|
|||
|
||||
if (do_snb_cstates)
|
||||
outp += sprintf(outp, " %%pc2");
|
||||
if (do_nhm_cstates)
|
||||
if (do_nhm_cstates && !do_slm_cstates)
|
||||
outp += sprintf(outp, " %%pc3");
|
||||
if (do_nhm_cstates)
|
||||
if (do_nhm_cstates && !do_slm_cstates)
|
||||
outp += sprintf(outp, " %%pc6");
|
||||
if (do_snb_cstates)
|
||||
outp += sprintf(outp, " %%pc7");
|
||||
|
@ -480,7 +484,7 @@ int format_counters(struct thread_data *t, struct core_data *c,
|
|||
if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE))
|
||||
goto done;
|
||||
|
||||
if (do_nhm_cstates)
|
||||
if (do_nhm_cstates && !do_slm_cstates)
|
||||
outp += sprintf(outp, " %6.2f", 100.0 * c->c3/t->tsc);
|
||||
if (do_nhm_cstates)
|
||||
outp += sprintf(outp, " %6.2f", 100.0 * c->c6/t->tsc);
|
||||
|
@ -499,9 +503,9 @@ int format_counters(struct thread_data *t, struct core_data *c,
|
|||
|
||||
if (do_snb_cstates)
|
||||
outp += sprintf(outp, " %6.2f", 100.0 * p->pc2/t->tsc);
|
||||
if (do_nhm_cstates)
|
||||
if (do_nhm_cstates && !do_slm_cstates)
|
||||
outp += sprintf(outp, " %6.2f", 100.0 * p->pc3/t->tsc);
|
||||
if (do_nhm_cstates)
|
||||
if (do_nhm_cstates && !do_slm_cstates)
|
||||
outp += sprintf(outp, " %6.2f", 100.0 * p->pc6/t->tsc);
|
||||
if (do_snb_cstates)
|
||||
outp += sprintf(outp, " %6.2f", 100.0 * p->pc7/t->tsc);
|
||||
|
@ -648,17 +652,24 @@ delta_thread(struct thread_data *new, struct thread_data *old,
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* As counter collection is not atomic,
|
||||
* it is possible for mperf's non-halted cycles + idle states
|
||||
* to exceed TSC's all cycles: show c1 = 0% in that case.
|
||||
*/
|
||||
if ((old->mperf + core_delta->c3 + core_delta->c6 + core_delta->c7) > old->tsc)
|
||||
old->c1 = 0;
|
||||
else {
|
||||
/* normal case, derive c1 */
|
||||
old->c1 = old->tsc - old->mperf - core_delta->c3
|
||||
if (use_c1_residency_msr) {
|
||||
/*
|
||||
* Some models have a dedicated C1 residency MSR,
|
||||
* which should be more accurate than the derivation below.
|
||||
*/
|
||||
} else {
|
||||
/*
|
||||
* As counter collection is not atomic,
|
||||
* it is possible for mperf's non-halted cycles + idle states
|
||||
* to exceed TSC's all cycles: show c1 = 0% in that case.
|
||||
*/
|
||||
if ((old->mperf + core_delta->c3 + core_delta->c6 + core_delta->c7) > old->tsc)
|
||||
old->c1 = 0;
|
||||
else {
|
||||
/* normal case, derive c1 */
|
||||
old->c1 = old->tsc - old->mperf - core_delta->c3
|
||||
- core_delta->c6 - core_delta->c7;
|
||||
}
|
||||
}
|
||||
|
||||
if (old->mperf == 0) {
|
||||
|
@ -872,13 +883,21 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|||
if (get_msr(cpu, extra_msr_offset64, &t->extra_msr64))
|
||||
return -5;
|
||||
|
||||
if (use_c1_residency_msr) {
|
||||
if (get_msr(cpu, MSR_CORE_C1_RES, &t->c1))
|
||||
return -6;
|
||||
}
|
||||
|
||||
/* collect core counters only for 1st thread in core */
|
||||
if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE))
|
||||
return 0;
|
||||
|
||||
if (do_nhm_cstates) {
|
||||
if (do_nhm_cstates && !do_slm_cstates) {
|
||||
if (get_msr(cpu, MSR_CORE_C3_RESIDENCY, &c->c3))
|
||||
return -6;
|
||||
}
|
||||
|
||||
if (do_nhm_cstates) {
|
||||
if (get_msr(cpu, MSR_CORE_C6_RESIDENCY, &c->c6))
|
||||
return -7;
|
||||
}
|
||||
|
@ -898,7 +917,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|||
if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE))
|
||||
return 0;
|
||||
|
||||
if (do_nhm_cstates) {
|
||||
if (do_nhm_cstates && !do_slm_cstates) {
|
||||
if (get_msr(cpu, MSR_PKG_C3_RESIDENCY, &p->pc3))
|
||||
return -9;
|
||||
if (get_msr(cpu, MSR_PKG_C6_RESIDENCY, &p->pc6))
|
||||
|
@ -977,7 +996,7 @@ void print_verbose_header(void)
|
|||
ratio, bclk, ratio * bclk);
|
||||
|
||||
get_msr(0, MSR_IA32_POWER_CTL, &msr);
|
||||
fprintf(stderr, "cpu0: MSR_IA32_POWER_CTL: 0x%08llx (C1E: %sabled)\n",
|
||||
fprintf(stderr, "cpu0: MSR_IA32_POWER_CTL: 0x%08llx (C1E auto-promotion: %sabled)\n",
|
||||
msr, msr & 0x2 ? "EN" : "DIS");
|
||||
|
||||
if (!do_ivt_turbo_ratio_limit)
|
||||
|
@ -1046,25 +1065,28 @@ print_nhm_turbo_ratio_limits:
|
|||
|
||||
switch(msr & 0x7) {
|
||||
case 0:
|
||||
fprintf(stderr, "pc0");
|
||||
fprintf(stderr, do_slm_cstates ? "no pkg states" : "pc0");
|
||||
break;
|
||||
case 1:
|
||||
fprintf(stderr, do_snb_cstates ? "pc2" : "pc0");
|
||||
fprintf(stderr, do_slm_cstates ? "no pkg states" : do_snb_cstates ? "pc2" : "pc0");
|
||||
break;
|
||||
case 2:
|
||||
fprintf(stderr, do_snb_cstates ? "pc6-noret" : "pc3");
|
||||
fprintf(stderr, do_slm_cstates ? "invalid" : do_snb_cstates ? "pc6-noret" : "pc3");
|
||||
break;
|
||||
case 3:
|
||||
fprintf(stderr, "pc6");
|
||||
fprintf(stderr, do_slm_cstates ? "invalid" : "pc6");
|
||||
break;
|
||||
case 4:
|
||||
fprintf(stderr, "pc7");
|
||||
fprintf(stderr, do_slm_cstates ? "pc4" : "pc7");
|
||||
break;
|
||||
case 5:
|
||||
fprintf(stderr, do_snb_cstates ? "pc7s" : "invalid");
|
||||
fprintf(stderr, do_slm_cstates ? "invalid" : do_snb_cstates ? "pc7s" : "invalid");
|
||||
break;
|
||||
case 6:
|
||||
fprintf(stderr, do_slm_cstates ? "pc6" : "invalid");
|
||||
break;
|
||||
case 7:
|
||||
fprintf(stderr, "unlimited");
|
||||
fprintf(stderr, do_slm_cstates ? "pc7" : "unlimited");
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "invalid");
|
||||
|
@ -1460,6 +1482,8 @@ int has_nehalem_turbo_ratio_limit(unsigned int family, unsigned int model)
|
|||
case 0x3F: /* HSW */
|
||||
case 0x45: /* HSW */
|
||||
case 0x46: /* HSW */
|
||||
case 0x37: /* BYT */
|
||||
case 0x4D: /* AVN */
|
||||
return 1;
|
||||
case 0x2E: /* Nehalem-EX Xeon - Beckton */
|
||||
case 0x2F: /* Westmere-EX Xeon - Eagleton */
|
||||
|
@ -1532,14 +1556,33 @@ int print_epb(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|||
#define RAPL_POWER_GRANULARITY 0x7FFF /* 15 bit power granularity */
|
||||
#define RAPL_TIME_GRANULARITY 0x3F /* 6 bit time granularity */
|
||||
|
||||
double get_tdp(model)
|
||||
{
|
||||
unsigned long long msr;
|
||||
|
||||
if (do_rapl & RAPL_PKG_POWER_INFO)
|
||||
if (!get_msr(0, MSR_PKG_POWER_INFO, &msr))
|
||||
return ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units;
|
||||
|
||||
switch (model) {
|
||||
case 0x37:
|
||||
case 0x4D:
|
||||
return 30.0;
|
||||
default:
|
||||
return 135.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* rapl_probe()
|
||||
*
|
||||
* sets do_rapl
|
||||
* sets do_rapl, rapl_power_units, rapl_energy_units, rapl_time_units
|
||||
*/
|
||||
void rapl_probe(unsigned int family, unsigned int model)
|
||||
{
|
||||
unsigned long long msr;
|
||||
unsigned int time_unit;
|
||||
double tdp;
|
||||
|
||||
if (!genuine_intel)
|
||||
|
@ -1555,11 +1598,15 @@ void rapl_probe(unsigned int family, unsigned int model)
|
|||
case 0x3F: /* HSW */
|
||||
case 0x45: /* HSW */
|
||||
case 0x46: /* HSW */
|
||||
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_GFX;
|
||||
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO;
|
||||
break;
|
||||
case 0x2D:
|
||||
case 0x3E:
|
||||
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_DRAM | RAPL_PKG_PERF_STATUS | RAPL_DRAM_PERF_STATUS;
|
||||
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_PKG_PERF_STATUS | RAPL_DRAM_PERF_STATUS | RAPL_PKG_POWER_INFO;
|
||||
break;
|
||||
case 0x37: /* BYT */
|
||||
case 0x4D: /* AVN */
|
||||
do_rapl = RAPL_PKG | RAPL_CORES ;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
|
@ -1570,19 +1617,22 @@ void rapl_probe(unsigned int family, unsigned int model)
|
|||
return;
|
||||
|
||||
rapl_power_units = 1.0 / (1 << (msr & 0xF));
|
||||
rapl_energy_units = 1.0 / (1 << (msr >> 8 & 0x1F));
|
||||
rapl_time_units = 1.0 / (1 << (msr >> 16 & 0xF));
|
||||
if (model == 0x37)
|
||||
rapl_energy_units = 1.0 * (1 << (msr >> 8 & 0x1F)) / 1000000;
|
||||
else
|
||||
rapl_energy_units = 1.0 / (1 << (msr >> 8 & 0x1F));
|
||||
|
||||
/* get TDP to determine energy counter range */
|
||||
if (get_msr(0, MSR_PKG_POWER_INFO, &msr))
|
||||
return;
|
||||
time_unit = msr >> 16 & 0xF;
|
||||
if (time_unit == 0)
|
||||
time_unit = 0xA;
|
||||
|
||||
tdp = ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units;
|
||||
rapl_time_units = 1.0 / (1 << (time_unit));
|
||||
|
||||
tdp = get_tdp(model);
|
||||
|
||||
rapl_joule_counter_range = 0xFFFFFFFF * rapl_energy_units / tdp;
|
||||
|
||||
if (verbose)
|
||||
fprintf(stderr, "RAPL: %.0f sec. Joule Counter Range\n", rapl_joule_counter_range);
|
||||
fprintf(stderr, "RAPL: %.0f sec. Joule Counter Range, at %.0f Watts\n", rapl_joule_counter_range, tdp);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -1668,7 +1718,6 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|||
{
|
||||
unsigned long long msr;
|
||||
int cpu;
|
||||
double local_rapl_power_units, local_rapl_energy_units, local_rapl_time_units;
|
||||
|
||||
if (!do_rapl)
|
||||
return 0;
|
||||
|
@ -1686,23 +1735,13 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|||
if (get_msr(cpu, MSR_RAPL_POWER_UNIT, &msr))
|
||||
return -1;
|
||||
|
||||
local_rapl_power_units = 1.0 / (1 << (msr & 0xF));
|
||||
local_rapl_energy_units = 1.0 / (1 << (msr >> 8 & 0x1F));
|
||||
local_rapl_time_units = 1.0 / (1 << (msr >> 16 & 0xF));
|
||||
|
||||
if (local_rapl_power_units != rapl_power_units)
|
||||
fprintf(stderr, "cpu%d, ERROR: Power units mis-match\n", cpu);
|
||||
if (local_rapl_energy_units != rapl_energy_units)
|
||||
fprintf(stderr, "cpu%d, ERROR: Energy units mis-match\n", cpu);
|
||||
if (local_rapl_time_units != rapl_time_units)
|
||||
fprintf(stderr, "cpu%d, ERROR: Time units mis-match\n", cpu);
|
||||
|
||||
if (verbose) {
|
||||
fprintf(stderr, "cpu%d: MSR_RAPL_POWER_UNIT: 0x%08llx "
|
||||
"(%f Watts, %f Joules, %f sec.)\n", cpu, msr,
|
||||
local_rapl_power_units, local_rapl_energy_units, local_rapl_time_units);
|
||||
rapl_power_units, rapl_energy_units, rapl_time_units);
|
||||
}
|
||||
if (do_rapl & RAPL_PKG) {
|
||||
if (do_rapl & RAPL_PKG_POWER_INFO) {
|
||||
|
||||
if (get_msr(cpu, MSR_PKG_POWER_INFO, &msr))
|
||||
return -5;
|
||||
|
||||
|
@ -1714,6 +1753,9 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|||
((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units,
|
||||
((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units);
|
||||
|
||||
}
|
||||
if (do_rapl & RAPL_PKG) {
|
||||
|
||||
if (get_msr(cpu, MSR_PKG_POWER_LIMIT, &msr))
|
||||
return -9;
|
||||
|
||||
|
@ -1749,12 +1791,16 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|||
|
||||
print_power_limit_msr(cpu, msr, "DRAM Limit");
|
||||
}
|
||||
if (do_rapl & RAPL_CORES) {
|
||||
if (do_rapl & RAPL_CORE_POLICY) {
|
||||
if (verbose) {
|
||||
if (get_msr(cpu, MSR_PP0_POLICY, &msr))
|
||||
return -7;
|
||||
|
||||
fprintf(stderr, "cpu%d: MSR_PP0_POLICY: %lld\n", cpu, msr & 0xF);
|
||||
}
|
||||
}
|
||||
if (do_rapl & RAPL_CORES) {
|
||||
if (verbose) {
|
||||
|
||||
if (get_msr(cpu, MSR_PP0_POWER_LIMIT, &msr))
|
||||
return -9;
|
||||
|
@ -1813,10 +1859,48 @@ int has_c8_c9_c10(unsigned int family, unsigned int model)
|
|||
}
|
||||
|
||||
|
||||
int is_slm(unsigned int family, unsigned int model)
|
||||
{
|
||||
if (!genuine_intel)
|
||||
return 0;
|
||||
switch (model) {
|
||||
case 0x37: /* BYT */
|
||||
case 0x4D: /* AVN */
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define SLM_BCLK_FREQS 5
|
||||
double slm_freq_table[SLM_BCLK_FREQS] = { 83.3, 100.0, 133.3, 116.7, 80.0};
|
||||
|
||||
double slm_bclk(void)
|
||||
{
|
||||
unsigned long long msr = 3;
|
||||
unsigned int i;
|
||||
double freq;
|
||||
|
||||
if (get_msr(0, MSR_FSB_FREQ, &msr))
|
||||
fprintf(stderr, "SLM BCLK: unknown\n");
|
||||
|
||||
i = msr & 0xf;
|
||||
if (i >= SLM_BCLK_FREQS) {
|
||||
fprintf(stderr, "SLM BCLK[%d] invalid\n", i);
|
||||
msr = 3;
|
||||
}
|
||||
freq = slm_freq_table[i];
|
||||
|
||||
fprintf(stderr, "SLM BCLK: %.1f Mhz\n", freq);
|
||||
|
||||
return freq;
|
||||
}
|
||||
|
||||
double discover_bclk(unsigned int family, unsigned int model)
|
||||
{
|
||||
if (is_snb(family, model))
|
||||
return 100.00;
|
||||
else if (is_slm(family, model))
|
||||
return slm_bclk();
|
||||
else
|
||||
return 133.33;
|
||||
}
|
||||
|
@ -1873,7 +1957,7 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk
|
|||
fprintf(stderr, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C)\n",
|
||||
cpu, msr, target_c_local);
|
||||
|
||||
if (target_c_local < 85 || target_c_local > 120)
|
||||
if (target_c_local < 85 || target_c_local > 127)
|
||||
goto guess;
|
||||
|
||||
tcc_activation_temp = target_c_local;
|
||||
|
@ -1970,6 +2054,7 @@ void check_cpuid()
|
|||
do_smi = do_nhm_cstates;
|
||||
do_snb_cstates = is_snb(family, model);
|
||||
do_c8_c9_c10 = has_c8_c9_c10(family, model);
|
||||
do_slm_cstates = is_slm(family, model);
|
||||
bclk = discover_bclk(family, model);
|
||||
|
||||
do_nehalem_turbo_ratio_limit = has_nehalem_turbo_ratio_limit(family, model);
|
||||
|
@ -2331,7 +2416,7 @@ int main(int argc, char **argv)
|
|||
cmdline(argc, argv);
|
||||
|
||||
if (verbose)
|
||||
fprintf(stderr, "turbostat v3.4 April 17, 2013"
|
||||
fprintf(stderr, "turbostat v3.5 April 26, 2013"
|
||||
" - Len Brown <lenb@kernel.org>\n");
|
||||
|
||||
turbostat_init();
|
||||
|
|
Loading…
Reference in New Issue