Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: ACPI, i915: build fix (v2) acpi-cpufreq: fix printk typo and indentation ACPI processor: remove spurious newline from warning message drm/i915: acpi/video.c fix section mismatch warning ACPI: video: DMI workaround broken Acer 5315 BIOS enabling display brightness ACPI: video: DMI workaround broken eMachines E510 BIOS enabling display brightness ACPI: sanity check _PSS frequency to prevent cpufreq crash i7300_idle: allow testing on i5000-series hardware w/o re-compile PCI/ACPI: fix wrong ref count handling in acpi_pci_bind() cpuidle: fix AMD C1E suspend hang cpuidle: makes AMD C1E work in acpi_idle
This commit is contained in:
Коммит
3b798a5231
|
@ -693,8 +693,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
|||
if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&
|
||||
policy->cpuinfo.transition_latency > 20 * 1000) {
|
||||
policy->cpuinfo.transition_latency = 20 * 1000;
|
||||
printk_once(KERN_INFO "Capping off P-state tranision"
|
||||
" latency at 20 uS\n");
|
||||
printk_once(KERN_INFO
|
||||
"P-state transition latency capped at 20 uS\n");
|
||||
}
|
||||
|
||||
/* table init */
|
||||
|
|
|
@ -116,9 +116,6 @@ int acpi_pci_bind(struct acpi_device *device)
|
|||
struct acpi_pci_data *pdata;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
acpi_handle handle;
|
||||
struct pci_dev *dev;
|
||||
struct pci_bus *bus;
|
||||
|
||||
|
||||
if (!device || !device->parent)
|
||||
return -EINVAL;
|
||||
|
@ -176,20 +173,9 @@ int acpi_pci_bind(struct acpi_device *device)
|
|||
* Locate matching device in PCI namespace. If it doesn't exist
|
||||
* this typically means that the device isn't currently inserted
|
||||
* (e.g. docking station, port replicator, etc.).
|
||||
* We cannot simply search the global pci device list, since
|
||||
* PCI devices are added to the global pci list when the root
|
||||
* bridge start ops are run, which may not have happened yet.
|
||||
*/
|
||||
bus = pci_find_bus(data->id.segment, data->id.bus);
|
||||
if (bus) {
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
if (dev->devfn == PCI_DEVFN(data->id.device,
|
||||
data->id.function)) {
|
||||
data->dev = dev;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
data->dev = pci_get_slot(pdata->bus,
|
||||
PCI_DEVFN(data->id.device, data->id.function));
|
||||
if (!data->dev) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Device %04x:%02x:%02x.%d not present in PCI namespace\n",
|
||||
|
@ -259,9 +245,10 @@ int acpi_pci_bind(struct acpi_device *device)
|
|||
|
||||
end:
|
||||
kfree(buffer.pointer);
|
||||
if (result)
|
||||
if (result) {
|
||||
pci_dev_put(data->dev);
|
||||
kfree(data);
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -303,6 +290,7 @@ static int acpi_pci_unbind(struct acpi_device *device)
|
|||
if (data->dev->subordinate) {
|
||||
acpi_pci_irq_del_prt(data->id.segment, data->bus->number);
|
||||
}
|
||||
pci_dev_put(data->dev);
|
||||
kfree(data);
|
||||
|
||||
end:
|
||||
|
|
|
@ -148,6 +148,9 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
|
|||
if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT))
|
||||
return;
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_AMDC1E))
|
||||
type = ACPI_STATE_C1;
|
||||
|
||||
/*
|
||||
* Check, if one of the previous states already marked the lapic
|
||||
* unstable
|
||||
|
@ -611,6 +614,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|||
switch (cx->type) {
|
||||
case ACPI_STATE_C1:
|
||||
cx->valid = 1;
|
||||
acpi_timer_check_state(i, pr, cx);
|
||||
break;
|
||||
|
||||
case ACPI_STATE_C2:
|
||||
|
@ -830,11 +834,12 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
|
|||
|
||||
/* Do not access any ACPI IO ports in suspend path */
|
||||
if (acpi_idle_suspend) {
|
||||
acpi_safe_halt();
|
||||
local_irq_enable();
|
||||
cpu_relax();
|
||||
return 0;
|
||||
}
|
||||
|
||||
acpi_state_timer_broadcast(pr, cx, 1);
|
||||
kt1 = ktime_get_real();
|
||||
acpi_idle_do_entry(cx);
|
||||
kt2 = ktime_get_real();
|
||||
|
@ -842,6 +847,7 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
|
|||
|
||||
local_irq_enable();
|
||||
cx->usage++;
|
||||
acpi_state_timer_broadcast(pr, cx, 0);
|
||||
|
||||
return idle_time;
|
||||
}
|
||||
|
|
|
@ -309,9 +309,15 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)
|
|||
(u32) px->bus_master_latency,
|
||||
(u32) px->control, (u32) px->status));
|
||||
|
||||
if (!px->core_frequency) {
|
||||
printk(KERN_ERR PREFIX
|
||||
"Invalid _PSS data: freq is zero\n");
|
||||
/*
|
||||
* Check that ACPI's u64 MHz will be valid as u32 KHz in cpufreq
|
||||
*/
|
||||
if (!px->core_frequency ||
|
||||
((u32)(px->core_frequency * 1000) !=
|
||||
(px->core_frequency * 1000))) {
|
||||
printk(KERN_ERR FW_BUG PREFIX
|
||||
"Invalid BIOS _PSS frequency: 0x%llx MHz\n",
|
||||
px->core_frequency);
|
||||
result = -EFAULT;
|
||||
kfree(pr->performance->states);
|
||||
goto end;
|
||||
|
|
|
@ -840,7 +840,7 @@ static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr)
|
|||
state = acpi_get_throttling_state(pr, value);
|
||||
if (state == -1) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Invalid throttling state, reset\n"));
|
||||
"Invalid throttling state, reset"));
|
||||
state = 0;
|
||||
ret = acpi_processor_set_throttling(pr, state);
|
||||
if (ret)
|
||||
|
|
|
@ -570,6 +570,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710Z"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_bqc_offset,
|
||||
.ident = "eMachines E510",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "EMACHINES"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "eMachines E510"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_bqc_offset,
|
||||
.ident = "Acer Aspire 5315",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -2334,7 +2350,7 @@ static int __init acpi_video_init(void)
|
|||
return acpi_video_register();
|
||||
}
|
||||
|
||||
void __exit acpi_video_exit(void)
|
||||
void acpi_video_exit(void)
|
||||
{
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_video_bus);
|
||||
|
|
|
@ -173,7 +173,7 @@ static int ioat_dma_enumerate_channels(struct ioatdma_device *device)
|
|||
xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale));
|
||||
|
||||
#ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL
|
||||
if (i7300_idle_platform_probe(NULL, NULL) == 0) {
|
||||
if (i7300_idle_platform_probe(NULL, NULL, 1) == 0) {
|
||||
device->common.chancnt--;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -67,12 +67,18 @@ config DRM_I830
|
|||
will load the correct one.
|
||||
|
||||
config DRM_I915
|
||||
tristate "i915 driver"
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
select FB
|
||||
select FRAMEBUFFER_CONSOLE if !EMBEDDED
|
||||
tristate "i915 driver"
|
||||
# i915 depends on ACPI_VIDEO when ACPI is enabled
|
||||
# but for select to work, need to select ACPI_VIDEO's dependencies, ick
|
||||
select VIDEO_OUTPUT_CONTROL if ACPI
|
||||
select BACKLIGHT_CLASS_DEVICE if ACPI
|
||||
select INPUT if ACPI
|
||||
select ACPI_VIDEO if ACPI
|
||||
help
|
||||
Choose this option if you have a system that has Intel 830M, 845G,
|
||||
852GM, 855GM 865G or 915G integrated graphics. If M is selected, the
|
||||
|
@ -84,12 +90,6 @@ config DRM_I915
|
|||
config DRM_I915_KMS
|
||||
bool "Enable modesetting on intel by default"
|
||||
depends on DRM_I915
|
||||
# i915 KMS depends on ACPI_VIDEO when ACPI is enabled
|
||||
# but for select to work, need to select ACPI_VIDEO's dependencies, ick
|
||||
select VIDEO_OUTPUT_CONTROL if ACPI
|
||||
select BACKLIGHT_CLASS_DEVICE if ACPI
|
||||
select INPUT if ACPI
|
||||
select ACPI_VIDEO if ACPI
|
||||
help
|
||||
Choose this option if you want kernel modesetting enabled by default,
|
||||
and you have a new enough userspace to support this. Running old
|
||||
|
|
|
@ -41,6 +41,10 @@ static int debug;
|
|||
module_param_named(debug, debug, uint, 0644);
|
||||
MODULE_PARM_DESC(debug, "Enable debug printks in this driver");
|
||||
|
||||
static int forceload;
|
||||
module_param_named(forceload, forceload, uint, 0644);
|
||||
MODULE_PARM_DESC(debug, "Enable driver testing on unvalidated i5000");
|
||||
|
||||
#define dprintk(fmt, arg...) \
|
||||
do { if (debug) printk(KERN_INFO I7300_PRINT fmt, ##arg); } while (0)
|
||||
|
||||
|
@ -552,7 +556,7 @@ static int __init i7300_idle_init(void)
|
|||
cpus_clear(idle_cpumask);
|
||||
total_us = 0;
|
||||
|
||||
if (i7300_idle_platform_probe(&fbd_dev, &ioat_dev))
|
||||
if (i7300_idle_platform_probe(&fbd_dev, &ioat_dev, forceload))
|
||||
return -ENODEV;
|
||||
|
||||
if (i7300_idle_thrt_save())
|
||||
|
|
|
@ -16,35 +16,33 @@
|
|||
struct fbd_ioat {
|
||||
unsigned int vendor;
|
||||
unsigned int ioat_dev;
|
||||
unsigned int enabled;
|
||||
};
|
||||
|
||||
/*
|
||||
* The i5000 chip-set has the same hooks as the i7300
|
||||
* but support is disabled by default because this driver
|
||||
* has not been validated on that platform.
|
||||
* but it is not enabled by default and must be manually
|
||||
* manually enabled with "forceload=1" because it is
|
||||
* only lightly validated.
|
||||
*/
|
||||
#define SUPPORT_I5000 0
|
||||
|
||||
static const struct fbd_ioat fbd_ioat_list[] = {
|
||||
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB},
|
||||
#if SUPPORT_I5000
|
||||
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT},
|
||||
#endif
|
||||
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB, 1},
|
||||
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT, 0},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
/* table of devices that work with this driver */
|
||||
static const struct pci_device_id pci_tbl[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_FBD_CNB) },
|
||||
#if SUPPORT_I5000
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5000_ERR) },
|
||||
#endif
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
/* Check for known platforms with I/O-AT */
|
||||
static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev,
|
||||
struct pci_dev **ioat_dev)
|
||||
struct pci_dev **ioat_dev,
|
||||
int enable_all)
|
||||
{
|
||||
int i;
|
||||
struct pci_dev *memdev, *dmadev;
|
||||
|
@ -69,6 +67,8 @@ static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev,
|
|||
for (i = 0; fbd_ioat_list[i].vendor != 0; i++) {
|
||||
if (dmadev->vendor == fbd_ioat_list[i].vendor &&
|
||||
dmadev->device == fbd_ioat_list[i].ioat_dev) {
|
||||
if (!(fbd_ioat_list[i].enabled || enable_all))
|
||||
continue;
|
||||
if (fbd_dev)
|
||||
*fbd_dev = memdev;
|
||||
if (ioat_dev)
|
||||
|
|
Загрузка…
Ссылка в новой задаче