ACPI patch queue for 2.6.27
Subsystems (14)
Len Brown
reviewerHere is the current ACPI queue for 2.6.27
fujitsu-laptop and compal-laptop are new.
I'll be impressed (and delighted) if Bjorn's PNP-v3 series requires no modification before then.
We know it has a few checkpatch issues...
We cherry-picked the important patches out of the ACPICA series into 2.6.26 already, so what remains here is less exciting.
Per notes on the list, I expect some changes to the idle= param patches, but here is what we have now.
I'd also like to see Rui's enhancement to /sys/firmware/acpi/interrupts make 2.6.27 -- it is excluded here due to a conflict
with the ACPICA branch.
thanks,
-Len
Len Brown
reviewerPATCH 1/70 fix a deadlock issue when poking "eject" file
From: Zhang Rui <[email protected]>
"/sys/devices/LNXSYSTM:00/.../eject" is used to evaluate _EJx method and eject a device in user space.
But system hangs when poking the "eject" file because that the device hot-removal code invoke the driver .remove method which will try to remove the "eject" file as a result.
Queues the hot-removal function for deferred execution in this patch.
http://bugzilla.kernel.org/show_bug.cgi?id=9772
--- drivers/acpi/scan.c | 56 +++++++++++++++++++++++++++++--------------------- 1 files changed, 32 insertions(+), 24 deletions(-)
drivers/acpi/scan.c +32 -24
@@ -6,6 +6,7 @@#include <linux/init.h> #include <linux/kernel.h> #include <linux/acpi.h> +#include <asm/signal.h> #include <acpi/acpi_drivers.h> #include <acpi/acinterp.h> /* for acpi_ex_eisa_id_to_string() */
@@ -92,17 +93,37 @@ acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, cha } static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL); -static int acpi_eject_operation (acpi_handle handle,int lockable) +static int acpi_bus_hot_remove_device (void *context) { +struct acpi_device *device; +acpi_handle handle = context;struct acpi_object_list arg_list;union acpi_object arg;acpi_status status =AE_OK ; -/* -* TBD: evaluate _PS3? -*/ +if (acpi_bus_get_device (handle, &device)) +return 0 ; -if (lockable) { +if (!device) +return 0 ; + +ACPI_DEBUG_PRINT ((ACPI_DB_INFO , +"Hot-removing device %s...\n" , device->dev.bus_id)); + + +if (acpi_bus_trim (device,1 )) { +ACPI_DEBUG_PRINT ((ACPI_DB_ERROR , +"Removing device failed\n" )); +return -1 ; + } + +/* power off device */ + status =acpi_evaluate_object (handle,"_PS3" ,NULL ,NULL ); +if (ACPI_FAILURE (status) && status !=AE_NOT_FOUND ) +ACPI_DEBUG_PRINT ((ACPI_DB_WARN , +"Power-off device failed\n" )); + +if (device->flags.lockable) { arg_list.count =1 ; arg_list.pointer = &arg; arg.type =ACPI_TYPE_INTEGER ;
@@ -118,24 +139,19 @@ static int acpi_eject_operation(acpi_handle handle, int lockable)/* * TBD: _EJD support. */ - status =acpi_evaluate_object (handle,"_EJ0" , &arg_list,NULL ); -if (ACPI_FAILURE (status)) { -return (-ENODEV ); - } +if (ACPI_FAILURE (status)) +return -ENODEV ; -return (0 ); +return 0 ; }static ssize_t acpi_eject_store (struct device *d,struct device_attribute *attr,const char *buf,size_t count) { -int result;int ret = count; -int islockable;acpi_status status; -acpi_handle handle;acpi_object_type type =0 ;struct acpi_device *acpi_device =to_acpi_device (d);
@@ -154,17 +170,9 @@ acpi_eject_store(struct device *d, struct device_attribute *attr, goto err; } - islockable = acpi_device->flags.lockable; - handle = acpi_device->handle; - - result =acpi_bus_trim (acpi_device,1 ); - -if (!result) - result =acpi_eject_operation (handle, islockable); - -if (result) { - ret = -EBUSY ; - } +/* remove the device in another thread to fix the deadlock issue */ + ret =kernel_thread (acpi_bus_hot_remove_device, + acpi_device->handle,SIGCHLD ); err:return ret; }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 2/70 force offline the processor during hot-removal
In reply to Len BrownFrom: Zhang Rui <[email protected]>
The ACPI device node for the cpu has already been unregistered when acpi_processor_handle_eject is called.
Thus we should offline the cpu and continue, rather than a failure here.
http://bugzilla.kernel.org/show_bug.cgi?id=9772
--- drivers/acpi/processor_core.c | 6 +++--- kernel/cpu.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/acpi/processor_core.c +3 -3
@@ -1016,9 +1016,9 @@ static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu)static int acpi_processor_handle_eject (struct acpi_processor *pr) { -if (cpu_online (pr->id)) { -return (-EINVAL ); - } +if (cpu_online (pr->id)) +cpu_down (pr->id); +arch_unregister_cpu (pr->id);acpi_unmap_lsapic (pr->id);return (0 );
kernel/cpu.c +1 -0
@@ -287,6 +287,7 @@ int cpu_down(unsigned int cpu)cpu_maps_update_done (); return err; } +EXPORT_SYMBOL (cpu_down);#endif /*CONFIG_HOTPLUG_CPU*/ /* Requires cpu_add_remove_lock to be held */
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 3/70 create sysfs link from acpi device to sysdev for cpu
In reply to Len BrownFrom: Zhang Rui <[email protected]>
Sys I/F under acpi device node and sysdev device node are both needed for cpu hot-removal. User space need this link so that they know they are poking the sys I/F for the same cpu.
http://bugzilla.kernel.org/show_bug.cgi?id=9772
--- drivers/acpi/processor_core.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
drivers/acpi/processor_core.c +7 -1
@@ -622,7 +622,7 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)int result =0 ;acpi_status status =AE_OK ;struct acpi_processor *pr; - +struct sys_device *sysdev; pr =acpi_driver_data (device);
@@ -653,6 +653,10 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)if (result) goto end; + sysdev =get_cpu_sysdev (pr->id); +if (sysfs_create_link (&device->dev.kobj, &sysdev->kobj,"sysdev" )) +return -EFAULT ; + status =acpi_install_notify_handler (pr->handle,ACPI_DEVICE_NOTIFY , acpi_processor_notify, pr);
@@ -812,6 +816,8 @@ static int acpi_processor_remove(struct acpi_device *device, int type) status =acpi_remove_notify_handler (pr->handle,ACPI_DEVICE_NOTIFY , acpi_processor_notify); +sysfs_remove_link (&device->dev.kobj,"sysdev" ); +acpi_processor_remove_fs (device);if (pr->cdev) {
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 4/70 misc,acpi,backlight: compal Laptop Extras
In reply to Len BrownFrom: Cezary Jackiewicz <[email protected]>
This is driver for Compal Laptop: FL90/IFL90, based on MSI driver.
This driver exports a few files in /sys/devices/platform/compal-laptop/:
lcd_level - screen brightness: contains a single integer in the range 0..7 (rw) wlan - wlan subsystem state: contains 0 or 1 (rw)
bluetooth - bluetooth subsystem state: contains 0 or 1 (rw)
raw - raw value taken from embedded controller register (ro)
In addition to these platform device attributes the driver registers itself in the Linux backlight control subsystem and is available to userspace under /sys/class/backlight/compal-laptop/.
--- MAINTAINERS | 5 + drivers/misc/Kconfig | 17 ++ drivers/misc/Makefile | 5 +- drivers/misc/compal-laptop.c | 437 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 462 insertions(+), 2 deletions(-) create mode 100644 drivers/misc/compal-laptop.c
MAINTAINERS +5 -0
@@ -1151,6 +1151,11 @@ M: [email protected] L: [email protected] S: Supported +COMPAL LAPTOP SUPPORT +P: Cezary Jackiewicz +M: [email protected] +S: Maintained + COMPUTONE INTELLIPORT MULTIPORT CARD P: Michael H. Warfield M: [email protected]
drivers/misc/Kconfig +17 -0
@@ -219,6 +219,23 @@ config MSI_LAPTOP If you have an MSI S270 laptop, say Y or M here. +config COMPAL_LAPTOP + tristate "Compal Laptop Extras" + depends on X86 + depends on ACPI_EC + depends on BACKLIGHT_CLASS_DEVICE + ---help--- + This is a driver for laptops built by Compal: + + Compal FL90/IFL90 + Compal FL91/IFL91 + Compal FL92/JFL92 + Compal FT00/IFT00 + + It adds support for Bluetooth, WLAN and LCD brightness control. + + If you have an Compal FL9x/IFL9x/FT00 laptop, say Y or M here. + config SONY_LAPTOP tristate "Sony Laptop Extras" depends on X86 && ACPI
drivers/misc/Makefile +3 -2
@@ -5,10 +5,11 @@ obj- := misc.o # Dummy rule to force built-in.o to be made obj-$(CONFIG_IBM_ASM) += ibmasm/ obj-$(CONFIG_HDPU_FEATURES) += hdpuftrs/ -obj-$(CONFIG_MSI_LAPTOP) += msi-laptop.o -obj-$(CONFIG_ACER_WMI) += acer-wmi.o obj-$(CONFIG_ASUS_LAPTOP) += asus-laptop.o obj-$(CONFIG_EEEPC_LAPTOP) += eeepc-laptop.o +obj-$(CONFIG_MSI_LAPTOP) += msi-laptop.o +obj-$(CONFIG_COMPAL_LAPTOP) += compal-laptop.o +obj-$(CONFIG_ACER_WMI) += acer-wmi.o obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o
drivers/misc/compal-laptop.c new file +437 -0
437 lines not on this page · raw message
Signature · 1 line
1.5.6
Re: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
Quoted 14 lines · Len Brown
From: Cezary Jackiewicz <[email protected]>
This is driver for Compal Laptop: FL90/IFL90, based on MSI driver.
This driver exports a few files in
/sys/devices/platform/compal-laptop/:
lcd_level- screen brightness: contains a single integer in the range 0..7 (rw) wlan - wlan subsystem state: contains 0 or 1 (rw)
bluetooth - bluetooth subsystem state: contains 0 or 1 (rw)
raw - raw value taken from embedded controller register (ro)In addition to these platform device attributes the driver registers itself in the Linux backlight control subsystem and is available to userspace under
/sys/class/backlight/compal-laptop/.
Quoted 7 lines
Signed-off-by Cezary Jackiewicz <[email protected]>Cc Richard Purdie <[email protected]>Cc Henrique de Moraes Holschuh <[email protected]>Cc Len Brown <[email protected]>Cc Alexey Starikovskiy <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Len Brown <[email protected]>
There was an update to this patch which dropped the lcd_level attribute which might as well be applied before merging since the backlight class handles all of that and there is no point in duplicating it.
Cheers,
Richard
Len Brown
reviewerRe: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
Quoted 5 lines
There was an update to this patch which dropped the
lcd_levelattribute which might as well be applied before merging since the backlight class handles all of that and there is no point in duplicating it.
oh good, i had forgotton about that - i've got it now.
Subject: [PATCH -mm 1/1] misc,acpi,backlight: Compal Laptop Extras - remove unnecessary attribute
thanks,
-Len
Re: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
In reply to Len BrownQuoted 2 lines · Len Brown
wlan - wlan subsystem state: contains 0 or 1 (rw) bluetooth - bluetooth subsystem state: contains 0 or 1 (rw)
Could we please not add any more drivers with custom radio control options? rfkill is a pretty small amount of code.
Signature · 1 line
Matthew Garrett | [email protected]
Len Brown
reviewerRe: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
Quoted 7 lines
Quoted 4 lines
wlan - wlan subsystem state: contains 0 or 1 (rw) bluetooth - bluetooth subsystem state: contains 0 or 1 (rw)
Could we please not add any more drivers with custom radio control options? rfkill is a pretty small amount of code.
good catch Matthew,
I agree, we never want to add custom knobs to platform drivers when we've (finally) succeeded in adding a generic API.
What do you suggest for the best example of rfkill implementation that should be copied here?
Cezary,
I'm okay with just deleting these custom knobs to get this driver moving along, if the generic hooks are not ready before the merge window.
thanks,
-Len
Re: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
Quoted 2 lines · Len Brown
What do you suggest for the best example of rfkill implementation that should be copied here?
Either thinkpad-acpi or hp-wmi are pretty straightforward.
Signature · 1 line
Matthew Garrett | [email protected]
Re: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
Quoted 5 lines · Matthew Garrett
Quoted 2 lines · Len Brown
What do you suggest for the best example of rfkill implementation that should be copied here?
Either thinkpad-acpi or hp-wmi are pretty straightforward.
I haven't sent the thinkpad-acpi rfkill implementation yet. And I have not reviewed hp-wmi to check if it is correct. If it uses the input polldev, I can give you 100% assurance that it is broken.
You pretty much have to wait for my rfkill patches to get merged before you can do something right with rfkill and stuff like thinkpad-acpi that has read/write rfkill registers.
Anyway, if anyone wants to look at the rfkill patches and the thinkpad-acpi rfkill implementation, which *is* straightforward like Matthew said, please refer to the thinkpad-acpi git trees at:
git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
branches devel and rfkill.
Note that both branches are in risk of being rebased/rewound, as they are tips of stgit branches. Get whatever you need from them, but don't base anything on them without talking to me first. rfkill, in particular, will have to be rebased to the wireless-testing tree soon.
Also, if anyone wants/needs to be added to the cc list for the rfkill stuff I am trying to get merged (e.g. because you will also need it for your driver), drop me a note.
I am planning to submit the thinkpad-acpi rfkill conversion only after the rfkill stuff gets merged in -next or some other tree, but real life is getting in the way.
Signature · 4 lines
"One disk to rule them all, One disk to find them. One disk to bring them all and in the darkness grind them. In the Land of Redmond where the shadows lie." -- The Silicon Valley Tarot Henrique Holschuh
Re: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
Quoted 3 lines · Henrique de Moraes Holschuh
I haven't sent the thinkpad-acpi rfkill implementation yet. And I have not reviewed hp-wmi to check if it is correct. If it uses the input polldev, I can give you 100% assurance that it is broken.
It doesn't.
Quoted 3 lines
You pretty much have to wait for my rfkill patches to get merged before you can do something right with rfkill and stuff like thinkpad-acpi that has read/write rfkill registers.
Ah. I get an event whenever the state changes in hardware, which means I can update the rfkill state automatically (the event's purely internal, I never send it out to userspace)
Signature · 1 line
Matthew Garrett | [email protected]
Re: [PATCH 04/70] misc,acpi,backlight: compal Laptop Extras
In reply to Matthew GarrettHi Matthew!
Quoted 6 lines · Matthew Garrett
Quoted 2 lines · Len Brown
wlan - wlan subsystem state: contains 0 or 1 (rw) bluetooth - bluetooth subsystem state: contains 0 or 1 (rw)
Could we please not add any more drivers with custom radio control options? rfkill is a pretty small amount of code.
Agreed. Although it would help a great deal if the patches I sent to linux-wireless got applied. Otherwise you really can't use rfkill properly for platform drivers, as they almost always need read/write support, and currently rfkill lacks that.
I will see if I manage to resend the patch stack with one or two minor fixes, mostly people had a lot to talk about but none of it required any changes to the patches (just further patches that need not go in yet, if anything).
Signature · 4 lines
"One disk to rule them all, One disk to find them. One disk to bring them all and in the darkness grind them. In the Land of Redmond where the shadows lie." -- The Silicon Valley Tarot Henrique Holschuh
Len Brown
reviewerPATCH 5/70 ACPI: change processors from array to per_cpu variable
In reply to Len BrownFrom: Mike Travis <[email protected]>
Change processors from an array sized by NR_CPUS to a per_cpu variable.
--- drivers/acpi/processor_core.c | 20 +++++++++----------- drivers/acpi/processor_idle.c | 8 ++++---- drivers/acpi/processor_perflib.c | 18 +++++++++--------- drivers/acpi/processor_throttling.c | 14 +++++++------- include/acpi/processor.h | 2 +- 5 files changed, 30 insertions(+), 32 deletions(-)
drivers/acpi/processor_core.c +9 -11
@@ -119,7 +119,7 @@ static const struct file_operations acpi_processor_info_fops = { .release = single_release, }; -struct acpi_processor *processors[NR_CPUS ]; +DEFINE_PER_CPU(struct acpi_processor *, processors);struct acpi_processor_errata errata__read_mostly ;/* --------------------------------------------------------------------------
@@ -615,7 +615,7 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)return 0 ; } -static void *processor_device_array[NR_CPUS ]; +static DEFINE_PER_CPU(void *, processor_device_array);static int __cpuinit acpi_processor_start (struct acpi_device *device) {
@@ -639,15 +639,15 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)* ACPI id of processors can be reported wrongly by the BIOS. * Don't trust it blindly */ -if (processor_device_array[pr->id] !=NULL && - processor_device_array[pr->id] != device) { +if (per_cpu (processor_device_array, pr->id) !=NULL && +per_cpu (processor_device_array, pr->id) != device) {printk (KERN_WARNING "BIOS reported wrong ACPI id " "for the processor\n" );return -ENODEV ; } - processor_device_array[pr->id] = device; +per_cpu (processor_device_array, pr->id) = device; - processors[pr->id] = pr; +per_cpu (processors, pr->id) = pr; result =acpi_processor_add_fs (device);if (result)
@@ -750,7 +750,7 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb, unsigned long action, void *hcpu) {unsigned int cpu = (unsigned long )hcpu; -struct acpi_processor *pr = processors[cpu]; +struct acpi_processor *pr =per_cpu (processors, cpu);if (action ==CPU_ONLINE && pr) {acpi_processor_ppc_has_changed (pr);
@@ -820,8 +820,8 @@ static int acpi_processor_remove(struct acpi_device *device, int type) pr->cdev =NULL ; } - processors[pr->id] =NULL ; - processor_device_array[pr->id] =NULL ; +per_cpu (processors, pr->id) =NULL ; +per_cpu (processor_device_array, pr->id) =NULL ;kfree (pr);return 0 ;
@@ -1069,8 +1069,6 @@ static int __init acpi_processor_init(void) {int result =0 ; - -memset (&processors,0 ,sizeof (processors));memset (&errata,0 ,sizeof (errata));#ifdef CONFIG_SMP
drivers/acpi/processor_idle.c +4 -4
@@ -401,7 +401,7 @@ static void acpi_processor_idle(void)*/ local_irq_disable (); - pr = processors[smp_processor_id ()]; + pr =__get_cpu_var (processors);if (!pr) {local_irq_enable ();return ;
@@ -1431,7 +1431,7 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,struct acpi_processor *pr;struct acpi_processor_cx *cx =cpuidle_get_statedata (state); - pr = processors[smp_processor_id ()]; + pr =__get_cpu_var (processors);if (unlikely (!pr))return 0 ;
@@ -1471,7 +1471,7 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,u32 t1, t2;int sleep_ticks =0 ; - pr = processors[smp_processor_id ()]; + pr =__get_cpu_var (processors);if (unlikely (!pr))return 0 ;
@@ -1549,7 +1549,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,u32 t1, t2;int sleep_ticks =0 ; - pr = processors[smp_processor_id ()]; + pr =__get_cpu_var (processors);if (unlikely (!pr))return 0 ;
drivers/acpi/processor_perflib.c +9 -9
@@ -89,7 +89,7 @@ static int acpi_processor_ppc_notifier(struct notifier_block *nb,if (event !=CPUFREQ_INCOMPATIBLE ) goto out; - pr = processors[policy->cpu]; + pr =per_cpu (processors, policy->cpu);if (!pr || !pr->performance) goto out;
@@ -572,7 +572,7 @@ int acpi_processor_preregister_performance(/* Call _PSD for all CPUs */ for_each_possible_cpu (i) { - pr = processors[i]; + pr =per_cpu (processors, i);if (!pr) {/* Look only at processors in ACPI namespace */ continue ;
@@ -603,7 +603,7 @@ int acpi_processor_preregister_performance(* domain info. */ for_each_possible_cpu (i) { - pr = processors[i]; + pr =per_cpu (processors, i);if (!pr)continue ;
@@ -624,7 +624,7 @@ int acpi_processor_preregister_performance(cpus_clear (covered_cpus);for_each_possible_cpu (i) { - pr = processors[i]; + pr =per_cpu (processors, i);if (!pr)continue ;
@@ -651,7 +651,7 @@ int acpi_processor_preregister_performance(if (i == j)continue ; - match_pr = processors[j]; + match_pr =per_cpu (processors, j);if (!match_pr)continue ;
@@ -680,7 +680,7 @@ int acpi_processor_preregister_performance(if (i == j)continue ; - match_pr = processors[j]; + match_pr =per_cpu (processors, j);if (!match_pr)continue ;
@@ -697,7 +697,7 @@ int acpi_processor_preregister_performance( err_ret:for_each_possible_cpu (i) { - pr = processors[i]; + pr =per_cpu (processors, i);if (!pr || !pr->performance)continue ;
@@ -728,7 +728,7 @@ acpi_processor_register_performance(struct acpi_processor_performancemutex_lock (&performance_mutex); - pr = processors[cpu]; + pr =per_cpu (processors, cpu);if (!pr) {mutex_unlock (&performance_mutex);return -ENODEV ;
@@ -766,7 +766,7 @@ acpi_processor_unregister_performance(struct acpi_processor_performancemutex_lock (&performance_mutex); - pr = processors[cpu]; + pr =per_cpu (processors, cpu);if (!pr) {mutex_unlock (&performance_mutex);return ;
drivers/acpi/processor_throttling.c +7 -7
@@ -71,7 +71,7 @@ static int acpi_processor_update_tsd_coord(void)* coordination between all CPUs. */ for_each_possible_cpu (i) { - pr = processors[i]; + pr =per_cpu (processors, i);if (!pr)continue ;
@@ -93,7 +93,7 @@ static int acpi_processor_update_tsd_coord(void)cpus_clear (covered_cpus);for_each_possible_cpu (i) { - pr = processors[i]; + pr =per_cpu (processors, i);if (!pr)continue ;
@@ -119,7 +119,7 @@ static int acpi_processor_update_tsd_coord(void)if (i == j)continue ; - match_pr = processors[j]; + match_pr =per_cpu (processors, j);if (!match_pr)continue ;
@@ -152,7 +152,7 @@ static int acpi_processor_update_tsd_coord(void)if (i == j)continue ; - match_pr = processors[j]; + match_pr =per_cpu (processors, j);if (!match_pr)continue ;
@@ -172,7 +172,7 @@ static int acpi_processor_update_tsd_coord(void) err_ret:for_each_possible_cpu (i) { - pr = processors[i]; + pr =per_cpu (processors, i);if (!pr)continue ;
@@ -214,7 +214,7 @@ static int acpi_processor_throttling_notifier(unsigned long event, void *data)struct acpi_processor_throttling *p_throttling; cpu = p_tstate->cpu; - pr = processors[cpu]; + pr =per_cpu (processors, cpu);if (!pr) {ACPI_DEBUG_PRINT ((ACPI_DB_INFO ,"Invalid pr pointer\n" ));return 0 ;
@@ -1035,7 +1035,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)* cpus. */ for_each_cpu_mask (i, online_throttling_cpus) { - match_pr = processors[i]; + match_pr =per_cpu (processors, i);/* * If the pointer is invalid, we will report the * error message and continue.
include/acpi/processor.h +1 -1
@@ -255,7 +255,7 @@ extern void acpi_processor_unregister_performance(structint acpi_processor_notify_smm (struct module *calling_module);/* for communication between multiple parts of the processor kernel module */ -extern struct acpi_processor *processors[NR_CPUS ]; +DECLARE_PER_CPU(struct acpi_processor *, processors);extern struct acpi_processor_errata errata;void arch_acpi_processor_init_pdc (struct acpi_processor *pr);
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 6/70 Fujitsu-laptop update
In reply to Len BrownFrom: Jonathan Woithe <[email protected]>
Add additional capabilities to the Fujitsu-laptop driver.
* Brightness hotkey actions are sent to userspace. This can be disabled using a module parameter if it causes issues with models which handle these keys transparently in the BIOS.
* Actions of additional hotkeys found on some Fujitsu models (eg: the suspend key and the dedicated "power on passphrase" keys) are broadcast to userspace.
* An alternative brightness control method used by some Fujitsu models (for example, the S6410) is now supported, enabling software brightness controls on models using this method.
* DMI-based module aliases are configured for the S6410 and S7020.
* The current LCD brightness after booting should now be reflected in the standard backlight interface sysfs file (previously it was always set to 0). The platform brightness sysfs interface has always been fine.
Thanks go to Peter Gruber who provided a significant portion of this code and tested various iterations of the patch on his S6410.
--- MAINTAINERS | 6 + drivers/misc/Kconfig | 13 +- drivers/misc/fujitsu-laptop.c | 825 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 792 insertions(+), 52 deletions(-)
MAINTAINERS +6 -0
@@ -1757,6 +1757,12 @@ P: David Howells M: [email protected] S: Maintained +FUJITSU LAPTOP EXTRAS +P: Jonathan Woithe +M: [email protected] +L: [email protected] +S: Maintained + FUSE: FILESYSTEM IN USERSPACE P: Miklos Szeredi M: [email protected]
drivers/misc/Kconfig +12 -1
@@ -185,11 +185,22 @@ config FUJITSU_LAPTOP * P2xxx/P5xxx/S6xxx/S7xxx series Lifebooks * Possibly other Fujitsu laptop models + * Tested with S6410 and S7020 - It adds support for LCD brightness control. + It adds support for LCD brightness control and some hotkeys. If you have a Fujitsu laptop, say Y or M here. +config FUJITSU_LAPTOP_DEBUG + bool "Verbose debug mode for Fujitsu Laptop Extras" + depends on FUJITSU_LAPTOP + default n + ---help--- + Enables extra debug output from the fujitsu extras driver, at the + expense of a slight increase in driver size. + + If you are not sure, say N here. + config TC1100_WMI tristate "HP Compaq TC1100 Tablet WMI Extras (EXPERIMENTAL)" depends on X86 && !X86_64
drivers/misc/fujitsu-laptop.c +774 -51
1,019 lines not on this page · raw message
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 7/70 ACPI PM: acpi_pm_device_sleep_state() cleanup
In reply to Len BrownFrom: David Brownell <[email protected]>
Get rid of a superfluous acpi_pm_device_sleep_state() parameter. The only legitimate value of that parameter must be derived from the first parameter, which is what all the callers already do. (However, this does not address the fact that ACPI still doesn't set up those flags.)
--- drivers/acpi/sleep/main.c | 8 ++++---- drivers/pci/pci-acpi.c | 3 +-- drivers/pnp/pnpacpi/core.c | 4 +--- include/acpi/acpi_bus.h | 4 ++-- 4 files changed, 8 insertions(+), 11 deletions(-)
drivers/acpi/sleep/main.c +4 -4
@@ -369,8 +369,8 @@ int acpi_suspend(u32 acpi_state)/** * acpi_pm_device_sleep_state - return preferred power state of ACPI device * in the system sleep state given by %acpi_target_sleep_state -* @dev: device to examine -* @wake: if set, the device should be able to wake up the system +* @dev: device to examine; its driver model wakeup flags control +* whether it should be able to wake up the system * @d_min_p: used to store the upper limit of allowed states range * Return value: preferred power state of the device on success, -ENODEV on * failure (ie. if there's no 'struct acpi_device' for @dev)
@@ -388,7 +388,7 @@ int acpi_suspend(u32 acpi_state)* via @wake. */ -int acpi_pm_device_sleep_state (struct device *dev,int wake,int *d_min_p) +int acpi_pm_device_sleep_state (struct device *dev,int *d_min_p) {acpi_handle handle =DEVICE_ACPI_HANDLE (dev);struct acpi_device *adev;
@@ -427,7 +427,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int wake, int *d_min_p)* can wake the system. _S0W may be valid, too. */ if (acpi_target_sleep_state ==ACPI_STATE_S0 || - (wake && adev->wakeup.state.enabled && + (device_may_wakeup (dev) && adev->wakeup.state.enabled && adev->wakeup.sleep_state <= acpi_target_sleep_state)) {acpi_status status;
drivers/pci/pci-acpi.c +1 -2
@@ -298,8 +298,7 @@ static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev, {int acpi_state; - acpi_state =acpi_pm_device_sleep_state (&pdev->dev, -device_may_wakeup (&pdev->dev),NULL ); + acpi_state =acpi_pm_device_sleep_state (&pdev->dev,NULL );if (acpi_state <0 )return PCI_POWER_ERROR ;
drivers/pnp/pnpacpi/core.c +1 -3
@@ -117,9 +117,7 @@ static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state) {int power_state; - power_state =acpi_pm_device_sleep_state (&dev->dev, -device_may_wakeup (&dev->dev), -NULL ); + power_state =acpi_pm_device_sleep_state (&dev->dev,NULL );if (power_state <0 ) power_state = (state.event ==PM_EVENT_ON ) ?ACPI_STATE_D0 :ACPI_STATE_D3 ;
include/acpi/acpi_bus.h +2 -2
@@ -376,9 +376,9 @@ acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);#define DEVICE_ACPI_HANDLE (dev) ((acpi_handle)((dev)->archdata.acpi_handle))#ifdef CONFIG_PM_SLEEP -int acpi_pm_device_sleep_state (struct device *,int ,int *); +int acpi_pm_device_sleep_state (struct device *,int *);#else /* !CONFIG_PM_SLEEP */ -static inline int acpi_pm_device_sleep_state (struct device *d,int w,int *p) +static inline int acpi_pm_device_sleep_state (struct device *d,int *p) {if (p) *p =ACPI_STATE_D0 ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 8/70 PCI ACPI: Drop the second argument of platform_pci_choose_state
In reply to Len BrownFrom: Rafael J. Wysocki <[email protected]>
Since the second argument of acpi_pci_choose_state() and platform_pci_choose_state() is never used, remove it.
--- drivers/pci/pci-acpi.c | 3 +-- drivers/pci/pci.c | 4 ++-- drivers/pci/pci.h | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-)
drivers/pci/pci-acpi.c +1 -2
@@ -293,8 +293,7 @@ EXPORT_SYMBOL(pci_osc_control_set);* choose highest power _SxD or any lower power */ -static pci_power_t acpi_pci_choose_state (struct pci_dev *pdev, -pm_message_t state) +static pci_power_t acpi_pci_choose_state (struct pci_dev *pdev) {int acpi_state;
drivers/pci/pci.c +2 -2
@@ -508,7 +508,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)return 0 ; } -pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev,pm_message_t state); +pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev);/** * pci_choose_state - Choose the power state of a PCI device
@@ -528,7 +528,7 @@ pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state)return PCI_D0 ;if (platform_pci_choose_state) { - ret =platform_pci_choose_state (dev, state); + ret =platform_pci_choose_state (dev);if (ret !=PCI_POWER_ERROR )return ret; }
drivers/pci/pci.h +1 -2
@@ -6,8 +6,7 @@ extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev);extern void pci_cleanup_rom (struct pci_dev *dev);/* Firmware callbacks */ -extern pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev, -pm_message_t state); +extern pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev);extern int (*platform_pci_set_power_state)(struct pci_dev *dev,pci_power_t state);
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 9/70 ACPI PM: Remove obsolete Toshiba workaround
In reply to Len BrownFrom: Rafael J. Wysocki <[email protected]>
Remove the obsolete workaround for a Toshiba Satellite 4030cdt S1 problem from drivers/acpi/sleep/main.c .
--- drivers/acpi/sleep/main.c | 31 ------------------------------- 1 files changed, 0 insertions(+), 31 deletions(-)
drivers/acpi/sleep/main.c +0 -31
@@ -62,8 +62,6 @@ static u32 acpi_suspend_states[] = { [PM_SUSPEND_MAX] = ACPI_STATE_S5 }; -static int init_8259A_after_S1; -/** * acpi_suspend_begin - Set the target system sleep state to the state * associated with given @pm_state, if supported.
@@ -186,13 +184,6 @@ static void acpi_suspend_finish(void)acpi_set_firmware_waking_vector ((acpi_physical_address )0 ); acpi_target_sleep_state =ACPI_STATE_S0 ; - -#ifdef CONFIG_X86 -if (init_8259A_after_S1) { -printk ("Broken toshiba laptop -> kicking interrupts\n" ); -init_8259A (0 ); - } -#endif }/**
@@ -232,26 +223,6 @@ static struct platform_suspend_ops acpi_suspend_ops = { .finish = acpi_suspend_finish, .end = acpi_suspend_end, }; - -/* -* Toshiba fails to preserve interrupts over S1, reinitialization -* of 8259 is needed after S1 resume. -*/ -static int __init init_ints_after_s1 (const struct dmi_system_id *d) -{ -printk (KERN_WARNING "%s with broken S1 detected.\n" , d->ident); - init_8259A_after_S1 =1 ; -return 0 ; -} - -static struct dmi_system_id __initdata acpisleep_dmi_table[] = { - { - .callback = init_ints_after_s1, - .ident ="Toshiba Satellite 4030cdt" , - .matches = {DMI_MATCH (DMI_PRODUCT_NAME ,"S4030CDT/4.3" ),}, - }, - {}, -};#endif /* CONFIG_SUSPEND */ #ifdef CONFIG_HIBERNATION
@@ -473,8 +444,6 @@ int __init acpi_sleep_init(void)u8 type_a, type_b;#ifdef CONFIG_SUSPEND int i =0 ; - -dmi_check_system (acpisleep_dmi_table);#endif if (acpi_disabled)
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 10/70 APM emulation: Notify about all suspend events, not just APM invoked ones (v2)
In reply to Len BrownFrom: Johannes Berg <[email protected]>
This revamps the apm-emulation code to get suspend notifications regardless of what way pm_suspend() was invoked, whether via the apm ioctl or via /sys/power/state. Also do some code cleanup and add comments while at it.
--- drivers/char/apm-emulation.c | 346 +++++++++++++++++++++++++----------------- 1 files changed, 207 insertions(+), 139 deletions(-)
drivers/char/apm-emulation.c +207 -139
@@ -58,6 +58,55 @@ struct apm_queue { };/* +* thread states (for threads using a writable /dev/apm_bios fd): +* +* SUSPEND_NONE: nothing happening +* SUSPEND_PENDING: suspend event queued for thread and pending to be read +* SUSPEND_READ: suspend event read, pending acknowledgement +* SUSPEND_ACKED: acknowledgement received from thread (via ioctl), +* waiting for resume +* SUSPEND_ACKTO: acknowledgement timeout +* SUSPEND_DONE: thread had acked suspend and is now notified of +* resume +* +* SUSPEND_WAIT: this thread invoked suspend and is waiting for resume +* +* A thread migrates in one of three paths: +* NONE -1-> PENDING -2-> READ -3-> ACKED -4-> DONE -5-> NONE +* -6-> ACKTO -7-> NONE +* NONE -8-> WAIT -9-> NONE +* +* While in PENDING or READ, the thread is accounted for in the +* suspend_acks_pending counter. +* +* The transitions are invoked as follows: +* 1: suspend event is signalled from the core PM code +* 2: the suspend event is read from the fd by the userspace thread +* 3: userspace thread issues the APM_IOC_SUSPEND ioctl (as ack) +* 4: core PM code signals that we have resumed +* 5: APM_IOC_SUSPEND ioctl returns +* +* 6: the notifier invoked from the core PM code timed out waiting +* for all relevant threds to enter ACKED state and puts those +* that haven't into ACKTO +* 7: those threads issue APM_IOC_SUSPEND ioctl too late, +* get an error +* +* 8: userspace thread issues the APM_IOC_SUSPEND ioctl (to suspend), +* ioctl code invokes pm_suspend() +* 9: pm_suspend() returns indicating resume +*/ +enum apm_suspend_state { +SUSPEND_NONE , +SUSPEND_PENDING , +SUSPEND_READ , +SUSPEND_ACKED , +SUSPEND_ACKTO , +SUSPEND_WAIT , +SUSPEND_DONE , +}; + +/* * The per-file APM data */ struct apm_user {
@@ -68,13 +117,7 @@ struct apm_user { unsigned int reader: 1;int suspend_result; -unsigned int suspend_state; -#define SUSPEND_NONE 0/* no suspend pending */ -#define SUSPEND_PENDING 1/* suspend pending read */ -#define SUSPEND_READ 2/* suspend read, pending ack */ -#define SUSPEND_ACKED 3/* suspend acked */ -#define SUSPEND_WAIT 4/* waiting for suspend */ -#define SUSPEND_DONE 5/* suspend completed */ +enum apm_suspend_state suspend_state;struct apm_queue queue; };
@@ -82,7 +125,8 @@ struct apm_user {/* * Local variables */ -static int suspends_pending; +static atomic_t suspend_acks_pending =ATOMIC_INIT (0 ); +static atomic_t userspace_notification_inhibit =ATOMIC_INIT (0 );static int apm_disabled;static struct task_struct *kapmd_tsk;
@@ -165,78 +209,6 @@ static void queue_event(apm_event_t event)wake_up_interruptible (&apm_waitqueue); } -/* -* queue_suspend_event - queue an APM suspend event. -* -* Check that we're in a state where we can suspend. If not, -* return -EBUSY. Otherwise, queue an event to all "writer" -* users. If there are no "writer" users, return '1' to -* indicate that we can immediately suspend. -*/ -static int queue_suspend_event (apm_event_t event,struct apm_user *sender) -{ -struct apm_user *as; -int ret =1 ; - -mutex_lock (&state_lock); -down_read (&user_list_lock); - -/* -* If a thread is still processing, we can't suspend, so reject -* the request. -*/ -list_for_each_entry (as, &apm_user_list, list) { -if (as != sender && as->reader && as->writer && as->suser && - as->suspend_state !=SUSPEND_NONE ) { - ret = -EBUSY ; - goto out; - } - } - -list_for_each_entry (as, &apm_user_list, list) { -if (as != sender && as->reader && as->writer && as->suser) { - as->suspend_state =SUSPEND_PENDING ; - suspends_pending++; -queue_add_event (&as->queue, event); - ret =0 ; - } - } - out: -up_read (&user_list_lock); -mutex_unlock (&state_lock); -wake_up_interruptible (&apm_waitqueue); -return ret; -} - -static void apm_suspend (void ) -{ -struct apm_user *as; -int err =pm_suspend (PM_SUSPEND_MEM ); - -/* -* Anyone on the APM queues will think we're still suspended. -* Send a message so everyone knows we're now awake again. -*/ -queue_event (APM_NORMAL_RESUME ); - -/* -* Finally, wake up anyone who is sleeping on the suspend. -*/ -mutex_lock (&state_lock); -down_read (&user_list_lock); -list_for_each_entry (as, &apm_user_list, list) { -if (as->suspend_state ==SUSPEND_WAIT || - as->suspend_state ==SUSPEND_ACKED ) { - as->suspend_result = err; - as->suspend_state =SUSPEND_DONE ; - } - } -up_read (&user_list_lock); -mutex_unlock (&state_lock); - -wake_up (&apm_suspend_waitqueue); -} -static ssize_t apm_read (struct file *fp,char __user *buf,size_t count,loff_t *ppos) {struct apm_user *as = fp->private_data;
@@ -307,25 +279,22 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg) as->suspend_result = -EINTR ; -if (as->suspend_state ==SUSPEND_READ ) { -int pending; - +switch (as->suspend_state) { +case SUSPEND_READ :/* * If we read a suspend command from /dev/apm_bios, * then the corresponding APM_IOC_SUSPEND ioctl is * interpreted as an acknowledge. */ as->suspend_state =SUSPEND_ACKED ; - suspends_pending--; - pending = suspends_pending ==0 ; +atomic_dec (&suspend_acks_pending);mutex_unlock (&state_lock);/* -* If there are no further acknowledges required, -* suspend the system. +* suspend_acks_pending changed, the notifier needs to +* be woken up for this */ -if (pending) -apm_suspend (); +wake_up (&apm_suspend_waitqueue);/* * Wait for the suspend/resume to complete. If there
@@ -341,35 +310,21 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)* try_to_freeze() in freezer_count() will not trigger */ freezer_count (); - }else { +break ; +case SUSPEND_ACKTO : + as->suspend_result = -ETIMEDOUT ; +mutex_unlock (&state_lock); +break ; +default : as->suspend_state =SUSPEND_WAIT ;mutex_unlock (&state_lock);/* * Otherwise it is a request to suspend the system. -* Queue an event for all readers, and expect an -* acknowledge from all writers who haven't already -* acknowledged. -*/ - err =queue_suspend_event (APM_USER_SUSPEND , as); -if (err <0 ) { -/* -* Avoid taking the lock here - this -* should be fine. -*/ - as->suspend_state =SUSPEND_NONE ; -break ; - } - -if (err >0 ) -apm_suspend (); - -/* -* Wait for the suspend/resume to complete. If there -* are pending acknowledges, we wait here for them. +* Just invoke pm_suspend(), we'll handle it from +* there via the notifier. */ -wait_event_freezable (apm_suspend_waitqueue, - as->suspend_state ==SUSPEND_DONE ); + as->suspend_result =pm_suspend (PM_SUSPEND_MEM ); }mutex_lock (&state_lock);
@@ -385,7 +340,6 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)static int apm_release (struct inode * inode,struct file * filp) {struct apm_user *as = filp->private_data; -int pending =0 ; filp->private_data =NULL ;
@@ -395,18 +349,15 @@ static int apm_release(struct inode * inode, struct file * filp)/* * We are now unhooked from the chain. As far as new -* events are concerned, we no longer exist. However, we -* need to balance suspends_pending, which means the -* possibility of sleeping. +* events are concerned, we no longer exist. */ mutex_lock (&state_lock); -if (as->suspend_state !=SUSPEND_NONE ) { - suspends_pending -=1 ; - pending = suspends_pending ==0 ; - } +if (as->suspend_state ==SUSPEND_PENDING || + as->suspend_state ==SUSPEND_READ ) +atomic_dec (&suspend_acks_pending);mutex_unlock (&state_lock); -if (pending) -apm_suspend (); + +wake_up (&apm_suspend_waitqueue);kfree (as);return 0 ;
@@ -542,7 +493,6 @@ static int kapmd(void *arg) { do { apm_event_t event; - int ret; wait_event_interruptible(kapmd_wait, !queue_empty(&kapmd_queue) || kthread_should_stop());
@@ -567,20 +517,13 @@ static int kapmd(void *arg)case APM_USER_SUSPEND :case APM_SYS_SUSPEND : - ret =queue_suspend_event (event,NULL ); -if (ret <0 ) { -/* -* We were busy. Try again in 50ms. -*/ -queue_add_event (&kapmd_queue, event); -msleep (50 ); - } -if (ret >0 ) -apm_suspend (); +pm_suspend (PM_SUSPEND_MEM );break ;case APM_CRITICAL_SUSPEND : -apm_suspend (); +atomic_inc (&userspace_notification_inhibit); +pm_suspend (PM_SUSPEND_MEM ); +atomic_dec (&userspace_notification_inhibit);break ; } }while (1 );
@@ -588,6 +531,120 @@ static int kapmd(void *arg)return 0 ; } +static int apm_suspend_notifier (struct notifier_block *nb, +unsigned long event, +void *dummy) +{ +struct apm_user *as; +int err; + +/* short-cut emergency suspends */ +if (atomic_read (&userspace_notification_inhibit)) +return NOTIFY_DONE ; + +switch (event) { +case PM_SUSPEND_PREPARE : +/* +* Queue an event to all "writer" users that we want +* to suspend and need their ack. +*/ +mutex_lock (&state_lock); +down_read (&user_list_lock); + +list_for_each_entry (as, &apm_user_list, list) { +if (as->suspend_state !=SUSPEND_WAIT && as->reader && + as->writer && as->suser) { + as->suspend_state =SUSPEND_PENDING ; +atomic_inc (&suspend_acks_pending); +queue_add_event (&as->queue,APM_USER_SUSPEND ); + } + } + +up_read (&user_list_lock); +mutex_unlock (&state_lock); +wake_up_interruptible (&apm_waitqueue); + +/* +* Wait for the the suspend_acks_pending variable to drop to +* zero, meaning everybody acked the suspend event (or the +* process was killed.) +* +* If the app won't answer within a short while we assume it +* locked up and ignore it. +*/ + err =wait_event_interruptible_timeout ( + apm_suspend_waitqueue, +atomic_read (&suspend_acks_pending) ==0 , +5 *HZ ); + +/* timed out */ +if (err ==0 ) { +/* +* Move anybody who timed out to "ack timeout" state. +* +* We could time out and the userspace does the ACK +* right after we time out but before we enter the +* locked section here, but that's fine. +*/ +mutex_lock (&state_lock); +down_read (&user_list_lock); +list_for_each_entry (as, &apm_user_list, list) { +if (as->suspend_state ==SUSPEND_PENDING || + as->suspend_state ==SUSPEND_READ ) { + as->suspend_state =SUSPEND_ACKTO ; +atomic_dec (&suspend_acks_pending); + } + } +up_read (&user_list_lock); +mutex_unlock (&state_lock); + } + +/* let suspend proceed */ +if (err >=0 ) +return NOTIFY_OK ; + +/* interrupted by signal */ +return NOTIFY_BAD ; + +case PM_POST_SUSPEND : +/* +* Anyone on the APM queues will think we're still suspended. +* Send a message so everyone knows we're now awake again. +*/ +queue_event (APM_NORMAL_RESUME ); + +/* +* Finally, wake up anyone who is sleeping on the suspend. +*/ +mutex_lock (&state_lock); +down_read (&user_list_lock); +list_for_each_entry (as, &apm_user_list, list) { +if (as->suspend_state ==SUSPEND_ACKED ) { +/* +* TODO: maybe grab error code, needs core +* changes to push the error to the notifier +* chain (could use the second parameter if +* implemented) +*/ + as->suspend_result =0 ; + as->suspend_state =SUSPEND_DONE ; + } + } +up_read (&user_list_lock); +mutex_unlock (&state_lock); + +wake_up (&apm_suspend_waitqueue); +return NOTIFY_OK ; + +default : +return NOTIFY_DONE ; + } +} + +static struct notifier_block apm_notif_block = { + .notifier_call = apm_suspend_notifier, +}; +static int __init apm_init (void ) {int ret;
@@ -601,7 +658,7 @@ static int __init apm_init(void)if (IS_ERR (kapmd_tsk)) { ret =PTR_ERR (kapmd_tsk); kapmd_tsk =NULL ; -return ret; + goto out; }wake_up_process (kapmd_tsk);
@@ -610,16 +667,27 @@ static int __init apm_init(void)#endif ret =misc_register (&apm_device); -if (ret !=0 ) { -remove_proc_entry ("apm" ,NULL ); -kthread_stop (kapmd_tsk); - } +if (ret) + goto out_stop; + ret =register_pm_notifier (&apm_notif_block); +if (ret) + goto out_unregister; + +return 0 ; + + out_unregister: +misc_deregister (&apm_device); + out_stop: +remove_proc_entry ("apm" ,NULL ); +kthread_stop (kapmd_tsk); + out:return ret; } static void __exit apm_exit(void) { +unregister_pm_notifier (&apm_notif_block);misc_deregister (&apm_device);remove_proc_entry ("apm" ,NULL );
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 11/70 Freezer: Introduce PF_FREEZER_NOSIG
In reply to Len BrownFrom: Rafael J. Wysocki <[email protected]>
The freezer currently attempts to distinguish kernel threads from user space tasks by checking if their mm pointer is unset and it does not send fake signals to kernel threads. However, there are kernel threads, mostly related to networking, that behave like user space tasks and may want to be sent a fake signal to be frozen.
Introduce the new process flag PF_FREEZER_NOSIG that will be set by default for all kernel threads and make the freezer only send fake signals to the tasks having PF_FREEZER_NOSIG unset. Provide the set_freezable_with_signal() function to be called by the kernel threads that want to be sent a fake signal for freezing.
This patch should not change the freezer's observable behavior.
--- include/linux/freezer.h | 10 +++++ include/linux/sched.h | 1 + kernel/kthread.c | 2 +- kernel/power/process.c | 97 ++++++++++++++++++++-------------------------- 4 files changed, 54 insertions(+), 56 deletions(-)
include/linux/freezer.h +10 -0
@@ -128,6 +128,15 @@ static inline void set_freezable(void) }/* +* Tell the freezer that the current task should be frozen by it and that it +* should send a fake signal to the task to freeze it. +*/ +static inline void set_freezable_with_signal (void ) +{ + current->flags &= ~(PF_NOFREEZE |PF_FREEZER_NOSIG ); +} + +/* * Freezer-friendly wrappers around wait_event_interruptible() and * wait_event_interruptible_timeout(), originally defined in <linux/wait.h> */
@@ -174,6 +183,7 @@ static inline void freezer_do_not_count(void) {}static inline void freezer_count (void ) {}static inline int freezer_should_skip (struct task_struct *p) {return 0 ; }static inline void set_freezable (void ) {} +static inline void set_freezable_with_signal (void ) {}#define wait_event_freezable (wq, condition) \ wait_event_interruptible(wq, condition)
include/linux/sched.h +1 -0
@@ -1507,6 +1507,7 @@ static inline void put_task_struct(struct task_struct *t)#define PF_MEMPOLICY 0x10000000/* Non-default NUMA mempolicy */ #define PF_MUTEX_TESTER 0x20000000/* Thread belongs to the rt mutex tester */ #define PF_FREEZER_SKIP 0x40000000/* Freezer should not count it as freezeable */ +#define PF_FREEZER_NOSIG 0x80000000/* Freezer won't send signals to it */ /* * Only the _current_ task can read/write to tsk->flags, but other
kernel/kthread.c +1 -1
@@ -234,7 +234,7 @@ int kthreadd(void *unused)set_user_nice (tsk,KTHREAD_NICE_LEVEL );set_cpus_allowed (tsk,CPU_MASK_ALL ); - current->flags |=PF_NOFREEZE ; + current->flags |=PF_NOFREEZE |PF_FREEZER_NOSIG ;for (;;) {set_current_state (TASK_INTERRUPTIBLE );
kernel/power/process.c +42 -55
163 lines not on this page · raw message
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 12/70 snapshot: Push BKL down into ioctl handlers
In reply to Len BrownFrom: Alan Cox <[email protected]>
Push BKL down into ioctl handlers - snapshot device.
--- kernel/power/user.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-)
kernel/power/user.c +7 -4
@@ -23,6 +23,7 @@#include <linux/console.h> #include <linux/cpu.h> #include <linux/freezer.h> +#include <linux/smp_lock.h> #include <asm/uaccess.h>
@@ -164,8 +165,8 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,return res; } -static int snapshot_ioctl (struct inode *inode,struct file *filp, -unsigned int cmd,unsigned long arg) +static long snapshot_ioctl (struct file *filp,unsigned int cmd, +unsigned long arg) {int error =0 ;struct snapshot_data *data;
@@ -181,6 +182,8 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, data = filp->private_data; +lock_kernel (); +switch (cmd) {case SNAPSHOT_FREEZE :
@@ -389,7 +392,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, error = -ENOTTY ; } - +unlock_kernel ();return error; }
@@ -399,7 +402,7 @@ static const struct file_operations snapshot_fops = { .read = snapshot_read, .write = snapshot_write, .llseek = no_llseek, - .ioctl = snapshot_ioctl, + .unlocked_ioctl = snapshot_ioctl, };static struct miscdevice snapshot_device = {
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 13/70 snapshot: Use pm_mutex for mutual exclusion
In reply to Len BrownFrom: Rafael J. Wysocki <[email protected]>
We can avoid taking the BKL in snapshot_ioctl() if pm_mutex is used to prevent the ioctls from being executed concurrently.
In addition, although it is only possible to open /dev/snapshot once, the task which has done that may spawn a child that will inherit the open descriptor, so in theory they can call snapshot_write(), snapshot_read() and snapshot_release() concurrently. pm_mutex can also be used for mutual exclusion in such cases.
--- kernel/power/user.c | 68 +++++++++++++++++++++++++++++++------------------- 1 files changed, 42 insertions(+), 26 deletions(-)
kernel/power/user.c +42 -26
@@ -70,16 +70,22 @@ static int snapshot_open(struct inode *inode, struct file *filp)struct snapshot_data *data;int error; -if (!atomic_add_unless (&snapshot_device_available,-1 ,0 )) -return -EBUSY ; +mutex_lock (&pm_mutex); + +if (!atomic_add_unless (&snapshot_device_available,-1 ,0 )) { + error = -EBUSY ; + goto Unlock; + }if ((filp->f_flags &O_ACCMODE ) ==O_RDWR ) {atomic_inc (&snapshot_device_available); -return -ENOSYS ; + error = -ENOSYS ; + goto Unlock; }if (create_basic_memory_bitmaps ()) {atomic_inc (&snapshot_device_available); -return -ENOMEM ; + error = -ENOMEM ; + goto Unlock; }nonseekable_open (inode, filp); data = &snapshot_state;
@@ -99,33 +105,36 @@ static int snapshot_open(struct inode *inode, struct file *filp)if (error)pm_notifier_call_chain (PM_POST_HIBERNATION ); } -if (error) { +if (error)atomic_inc (&snapshot_device_available); -return error; - } data->frozen =0 ; data->ready =0 ; data->platform_support =0 ; -return 0 ; + Unlock: +mutex_unlock (&pm_mutex); + +return error; }static int snapshot_release (struct inode *inode,struct file *filp) {struct snapshot_data *data; +mutex_lock (&pm_mutex); +swsusp_free ();free_basic_memory_bitmaps (); data = filp->private_data;free_all_swap_pages (data->swap); -if (data->frozen) { -mutex_lock (&pm_mutex); +if (data->frozen)thaw_processes (); -mutex_unlock (&pm_mutex); - }pm_notifier_call_chain (data->mode ==O_WRONLY ?PM_POST_HIBERNATION :PM_POST_RESTORE );atomic_inc (&snapshot_device_available); + +mutex_unlock (&pm_mutex); +return 0 ; }
@@ -135,9 +144,13 @@ static ssize_t snapshot_read(struct file *filp, char __user *buf,struct snapshot_data *data;ssize_t res; +mutex_lock (&pm_mutex); + data = filp->private_data; -if (!data->ready) -return -ENODATA ; +if (!data->ready) { + res = -ENODATA ; + goto Unlock; + } res =snapshot_read_next (&data->handle, count);if (res >0 ) {if (copy_to_user (buf,data_of (data->handle), res))
@@ -145,6 +158,10 @@ static ssize_t snapshot_read(struct file *filp, char __user *buf,else *offp = data->handle.offset; } + + Unlock: +mutex_unlock (&pm_mutex); +return res; }
@@ -154,6 +171,8 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,struct snapshot_data *data;ssize_t res; +mutex_lock (&pm_mutex); + data = filp->private_data; res =snapshot_write_next (&data->handle, count);if (res >0 ) {
@@ -162,6 +181,9 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,else *offp = data->handle.offset; } + +mutex_unlock (&pm_mutex); +return res; }
@@ -180,16 +202,16 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,if (!capable (CAP_SYS_ADMIN ))return -EPERM ; - data = filp->private_data; +if (!mutex_trylock (&pm_mutex)) +return -EBUSY ; -lock_kernel (); + data = filp->private_data;switch (cmd) {case SNAPSHOT_FREEZE :if (data->frozen)break ; -mutex_lock (&pm_mutex);printk ("Syncing filesystems ... " );sys_sync ();printk ("done.\n" );
@@ -197,7 +219,6 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, error =freeze_processes ();if (error)thaw_processes (); -mutex_unlock (&pm_mutex);if (!error) data->frozen =1 ;break ;
@@ -205,9 +226,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,case SNAPSHOT_UNFREEZE :if (!data->frozen || data->ready)break ; -mutex_lock (&pm_mutex);thaw_processes (); -mutex_unlock (&pm_mutex); data->frozen =0 ;break ;
@@ -310,16 +329,11 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, error = -EPERM ;break ; } -if (!mutex_trylock (&pm_mutex)) { - error = -EBUSY ; -break ; - }/* * Tasks are frozen and the notifiers have been called with * PM_HIBERNATION_PREPARE */ error =suspend_devices_and_enter (PM_SUSPEND_MEM ); -mutex_unlock (&pm_mutex);break ;case SNAPSHOT_PLATFORM_SUPPORT :
@@ -392,7 +406,9 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, error = -ENOTTY ; } -unlock_kernel (); + +mutex_unlock (&pm_mutex); +return error; }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 14/70 ACPICA: Add argument count checking to control method invocation via acpi_evaluate_object
In reply to Len BrownFrom: Bob Moore <[email protected]>
Error if too few arguments, warning if too many. This applies only to external programmatic control method execution, not method-to-method calls within the AML.
--- drivers/acpi/namespace/nseval.c | 35 +++++++++++++++++++++++++++++++++++ include/acpi/acexcep.h | 6 ++++-- include/acpi/acstruct.h | 1 + 3 files changed, 40 insertions(+), 2 deletions(-)
drivers/acpi/namespace/nseval.c +35 -0
@@ -138,6 +138,41 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)return_ACPI_STATUS (AE_NULL_OBJECT ); } +/* +* Calculate the number of arguments being passed to the method +*/ + + info->param_count =0 ; +if (info->parameters) { +while (info->parameters[info->param_count]) + info->param_count++; + } + +/* Error if too few arguments were passed in */ + +if (info->param_count < info->obj_desc->method.param_count) { +ACPI_ERROR ((AE_INFO , +"Insufficient arguments - " +"method [%4.4s] needs %d, found %d" , +acpi_ut_get_node_name (info->resolved_node), + info->obj_desc->method.param_count, + info->param_count)); +return_ACPI_STATUS (AE_MISSING_ARGUMENTS ); + } + +/* Just a warning if too many arguments */ + +else if (info->param_count > + info->obj_desc->method.param_count) { +ACPI_WARNING ((AE_INFO , +"Excess arguments - " +"method [%4.4s] needs %d, found %d" , +acpi_ut_get_node_name (info-> + resolved_node), + info->obj_desc->method.param_count, + info->param_count)); + } +ACPI_DUMP_PATHNAME (info->resolved_node,"Execute Method:" ,ACPI_LV_INFO , _COMPONENT);
include/acpi/acexcep.h +4 -2
@@ -108,8 +108,9 @@#define AE_BAD_HEX_CONSTANT (acpi_status) (0x0007 | AE_CODE_PROGRAMMER)#define AE_BAD_OCTAL_CONSTANT (acpi_status) (0x0008 | AE_CODE_PROGRAMMER)#define AE_BAD_DECIMAL_CONSTANT (acpi_status) (0x0009 | AE_CODE_PROGRAMMER) +#define AE_MISSING_ARGUMENTS (acpi_status) (0x000A | AE_CODE_PROGRAMMER) -#define AE_CODE_PGM_MAX 0x0009 +#define AE_CODE_PGM_MAX 0x000A/* * Acpi table exceptions
@@ -233,7 +234,8 @@ char const *acpi_gbl_exception_names_pgm[] = {"AE_ALIGNMENT" ,"AE_BAD_HEX_CONSTANT" ,"AE_BAD_OCTAL_CONSTANT" , -"AE_BAD_DECIMAL_CONSTANT" +"AE_BAD_DECIMAL_CONSTANT" , +"AE_MISSING_ARGUMENTS" }; char const *acpi_gbl_exception_names_tbl[] = {
include/acpi/acstruct.h +1 -0
@@ -189,6 +189,7 @@ struct acpi_evaluate_info {union acpi_operand_object **parameters;struct acpi_namespace_node *resolved_node;union acpi_operand_object *return_object; +u8 param_count;u8 pass_number;u8 parameter_type;u8 return_object_type;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 15/70 ACPICA: Fix for hang on GPE method invocation
In reply to Len BrownFrom: Bob Moore <[email protected]>
Fixes problem where the new method argument count validation mechanism will enter an infinite loop when a GPE method is dispatched. Problem fixed be removing the obsolete code that passes GPE block information to the notify handler via the control method parameter pointer.
--- drivers/acpi/dispatcher/dsmethod.c | 1 - drivers/acpi/dispatcher/dswstate.c | 10 ++-------- drivers/acpi/events/evgpe.c | 4 ---- drivers/acpi/events/evregion.c | 1 - drivers/acpi/namespace/nsinit.c | 1 - drivers/acpi/namespace/nsxfeval.c | 1 - drivers/acpi/parser/psxface.c | 2 +- drivers/acpi/resources/rsutils.c | 1 - drivers/acpi/utilities/uteval.c | 1 - include/acpi/acstruct.h | 7 ------- 10 files changed, 3 insertions(+), 26 deletions(-)
drivers/acpi/dispatcher/dsmethod.c +0 -1
@@ -377,7 +377,6 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, } info->parameters = &this_walk_state->operands[0 ]; - info->parameter_type =ACPI_PARAM_ARGS ; status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node, obj_desc->method.aml_start,
drivers/acpi/dispatcher/dswstate.c +2 -8
@@ -615,14 +615,8 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, walk_state->pass_number = pass_number;if (info) { -if (info->parameter_type ==ACPI_PARAM_GPE ) { - walk_state->gpe_event_info = - ACPI_CAST_PTR(struct acpi_gpe_event_info, - info->parameters); - }else { - walk_state->params = info->parameters; - walk_state->caller_return_desc = &info->return_object; - } + walk_state->params = info->parameters; + walk_state->caller_return_desc = &info->return_object; } status =acpi_ps_init_scope (&walk_state->parser_state, op);
drivers/acpi/events/evgpe.c +0 -4
@@ -555,10 +555,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)*/ info->prefix_node = local_gpe_event_info.dispatch.method_node; - info->parameters = - ACPI_CAST_PTR(union acpi_operand_object *, - gpe_event_info); - info->parameter_type =ACPI_PARAM_GPE ; info->flags =ACPI_IGNORE_RETURN_VALUE ; status =acpi_ns_evaluate (info);
drivers/acpi/events/evregion.c +0 -1
@@ -219,7 +219,6 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) info->prefix_node = region_obj2->extra.method_REG; info->pathname =NULL ; info->parameters = args; - info->parameter_type =ACPI_PARAM_ARGS ; info->flags =ACPI_IGNORE_RETURN_VALUE ;/*
drivers/acpi/namespace/nsinit.c +0 -1
@@ -542,7 +542,6 @@ acpi_ns_init_one_device(acpi_handle obj_handle, info->prefix_node = device_node; info->pathname =METHOD_NAME__INI ; info->parameters =NULL ; - info->parameter_type =ACPI_PARAM_ARGS ; info->flags =ACPI_IGNORE_RETURN_VALUE ;/*
drivers/acpi/namespace/nsxfeval.c +0 -1
@@ -182,7 +182,6 @@ acpi_evaluate_object(acpi_handle handle, } info->pathname = pathname; - info->parameter_type =ACPI_PARAM_ARGS ;/* Convert and validate the device handle */
drivers/acpi/parser/psxface.c +1 -1
@@ -335,7 +335,7 @@ acpi_ps_update_parameter_list(struct acpi_evaluate_info *info, u16 action) {acpi_native_uint i; -if ((info->parameter_type ==ACPI_PARAM_ARGS ) && (info->parameters)) { +if (info->parameters) {/* Update reference count for each parameter */
drivers/acpi/resources/rsutils.c +0 -1
@@ -679,7 +679,6 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node, info->prefix_node = node; info->pathname =METHOD_NAME__SRS ; info->parameters = args; - info->parameter_type =ACPI_PARAM_ARGS ; info->flags =ACPI_IGNORE_RETURN_VALUE ;/*
drivers/acpi/utilities/uteval.c +0 -1
@@ -217,7 +217,6 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node, info->prefix_node = prefix_node; info->pathname = path; - info->parameter_type =ACPI_PARAM_ARGS ;/* Evaluate the object/method */
include/acpi/acstruct.h +0 -7
@@ -108,7 +108,6 @@ struct acpi_walk_state {union acpi_operand_object **caller_return_desc;union acpi_generic_state *control_state;/* List of control states (nested IFs) */ struct acpi_namespace_node *deferred_node;/* Used when executing deferred opcodes */ -struct acpi_gpe_event_info *gpe_event_info;/* Info for GPE (_Lxx/_Exx methods only */ union acpi_operand_object *implicit_return_obj;struct acpi_namespace_node *method_call_node;/* Called method Node */ union acpi_parse_object *method_call_op;/* method_call Op if running a method */
@@ -191,16 +190,10 @@ struct acpi_evaluate_info {union acpi_operand_object *return_object;u8 param_count;u8 pass_number; -u8 parameter_type;u8 return_object_type;u8 flags; }; -/* Types for parameter_type above */ - -#define ACPI_PARAM_ARGS 0 -#define ACPI_PARAM_GPE 1 -/* Values for Flags above */ #define ACPI_IGNORE_RETURN_VALUE 1
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 16/70 ACPICA: Update tracking macros to reduce code/data size
In reply to Len BrownFrom: Jan Beulich <[email protected]>
Changed ACPI_MODULE_NAME and ACPI_FUNCTION_NAME to use arrays of strings instead of pointers to static strings. Jan Beulich and Bob Moore.
--- include/acpi/acmacros.h | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-)
include/acpi/acmacros.h +4 -6
@@ -414,7 +414,7 @@ struct acpi_integer_overlay {* error messages. The __FILE__ macro is not very useful for this, because it * often includes the entire pathname to the module */ -#define ACPI_MODULE_NAME (name) static char ACPI_UNUSED_VAR *_acpi_module_name = name; +#define ACPI_MODULE_NAME (name) static char ACPI_UNUSED_VAR _acpi_module_name[] = name;#else #define ACPI_MODULE_NAME (name)#endif
@@ -467,19 +467,17 @@ struct acpi_integer_overlay {/* * If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header, * define it now. This is the case where there the compiler does not support -* a __FUNCTION__ macro or equivalent. We save the function name on the -* local stack. +* a __FUNCTION__ macro or equivalent. */ #ifndef ACPI_GET_FUNCTION_NAME #define ACPI_GET_FUNCTION_NAME _acpi_function_name/* * The Name parameter should be the procedure name as a quoted string. -* This is declared as a local string ("MyFunctionName") so that it can -* be also used by the function exit macros below. +* The function name is also used by the function exit macros below. * Note: (const char) is used to be compatible with the debug interfaces * and macros such as __FUNCTION__. */ -#define ACPI_FUNCTION_NAME (name) const char *_acpi_function_name = #name; +#define ACPI_FUNCTION_NAME (name) static const char _acpi_function_name[] = #name;#else /* Compiler supports __FUNCTION__ (or equivalent) -- Ignore this macro */
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 17/70 ACPICA: Fix possible negative array index in acpi_ut_validate_exception
In reply to Len BrownFrom: Bob Moore <[email protected]>
Added NULL fields to the exception string arrays to eliminate the -1 subtraction on the SubStatus field.
--- drivers/acpi/utilities/utmisc.c | 14 +++++--------- include/acpi/acexcep.h | 4 ++++ 2 files changed, 9 insertions(+), 9 deletions(-)
drivers/acpi/utilities/utmisc.c +5 -9
@@ -64,7 +64,7 @@ ACPI_MODULE_NAME("utmisc")******************************************************************************/ const char *acpi_ut_validate_exception (acpi_status status) { -acpi_status sub_status; +u32 sub_status;const char *exception =NULL ;ACPI_FUNCTION_ENTRY ();
@@ -85,32 +85,28 @@ const char *acpi_ut_validate_exception(acpi_status status)case AE_CODE_PROGRAMMER :if (sub_status <=AE_CODE_PGM_MAX ) { - exception = - acpi_gbl_exception_names_pgm[sub_status -1 ]; + exception = acpi_gbl_exception_names_pgm[sub_status]; }break ;case AE_CODE_ACPI_TABLES :if (sub_status <=AE_CODE_TBL_MAX ) { - exception = - acpi_gbl_exception_names_tbl[sub_status -1 ]; + exception = acpi_gbl_exception_names_tbl[sub_status]; }break ;case AE_CODE_AML :if (sub_status <=AE_CODE_AML_MAX ) { - exception = - acpi_gbl_exception_names_aml[sub_status -1 ]; + exception = acpi_gbl_exception_names_aml[sub_status]; }break ;case AE_CODE_CONTROL :if (sub_status <=AE_CODE_CTRL_MAX ) { - exception = - acpi_gbl_exception_names_ctrl[sub_status -1 ]; + exception = acpi_gbl_exception_names_ctrl[sub_status]; }break ;
include/acpi/acexcep.h +4 -0
@@ -226,6 +226,7 @@ char const *acpi_gbl_exception_names_env[] = { };char const *acpi_gbl_exception_names_pgm[] = { +NULL ,"AE_BAD_PARAMETER" ,"AE_BAD_CHARACTER" ,"AE_BAD_PATHNAME" ,
@@ -239,6 +240,7 @@ char const *acpi_gbl_exception_names_pgm[] = { };char const *acpi_gbl_exception_names_tbl[] = { +NULL ,"AE_BAD_SIGNATURE" ,"AE_BAD_HEADER" ,"AE_BAD_CHECKSUM" ,
@@ -248,6 +250,7 @@ char const *acpi_gbl_exception_names_tbl[] = { };char const *acpi_gbl_exception_names_aml[] = { +NULL ,"AE_AML_ERROR" ,"AE_AML_PARSE" ,"AE_AML_BAD_OPCODE" ,
@@ -285,6 +288,7 @@ char const *acpi_gbl_exception_names_aml[] = { };char const *acpi_gbl_exception_names_ctrl[] = { +NULL ,"AE_CTRL_RETURN_VALUE" ,"AE_CTRL_PENDING" ,"AE_CTRL_TERMINATE" ,
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 18/70 ACPICA: Eliminate acpi_native_uint type
In reply to Len BrownFrom: Bob Moore <[email protected]>
No longer needed; replaced mostly with u32, but also acpi_size where a type that changes 32/64 bit on 32/64-bit platforms is required.
--- arch/x86/kernel/srat_32.c | 2 +- drivers/acpi/bus.c | 2 +- drivers/acpi/dispatcher/dsinit.c | 2 +- drivers/acpi/dispatcher/dsopcode.c | 2 +- drivers/acpi/dispatcher/dswstate.c | 10 +++++----- drivers/acpi/events/evevent.c | 6 +++--- drivers/acpi/events/evgpe.c | 14 ++++---------- drivers/acpi/events/evgpeblk.c | 18 ++++++++++-------- drivers/acpi/events/evmisc.c | 4 ++-- drivers/acpi/events/evregion.c | 4 ++-- drivers/acpi/events/evrgnini.c | 2 +- drivers/acpi/executer/exconfig.c | 14 +++++++------- drivers/acpi/executer/exconvrt.c | 12 ++++++------ drivers/acpi/executer/exdump.c | 2 +- drivers/acpi/executer/exfldio.c | 9 +++++---- drivers/acpi/executer/exmisc.c | 8 ++++---- drivers/acpi/executer/exregion.c | 2 +- drivers/acpi/namespace/nsdump.c | 2 +- drivers/acpi/namespace/nsload.c | 3 +-- drivers/acpi/namespace/nsparse.c | 15 +++++++-------- drivers/acpi/namespace/nsutils.c | 26 ++++++++++++-------------- drivers/acpi/namespace/nsxfeval.c | 2 +- drivers/acpi/parser/psargs.c | 4 ++-- drivers/acpi/parser/psxface.c | 2 +- drivers/acpi/resources/rscalc.c | 4 ++-- drivers/acpi/resources/rsmisc.c | 2 +- drivers/acpi/resources/rsutils.c | 12 ++++++------ drivers/acpi/tables/tbfadt.c | 6 +++--- drivers/acpi/tables/tbfind.c | 5 ++--- drivers/acpi/tables/tbinstal.c | 30 ++++++++++++++---------------- drivers/acpi/tables/tbutils.c | 15 +++++++-------- drivers/acpi/tables/tbxface.c | 28 +++++++++++++--------------- drivers/acpi/tables/tbxfroot.c | 4 ++-- drivers/acpi/utilities/utcopy.c | 4 ++-- drivers/acpi/utilities/utdebug.c | 28 +++++++++++++++++----------- drivers/acpi/utilities/utdelete.c | 2 +- drivers/acpi/utilities/uteval.c | 4 ++-- drivers/acpi/utilities/utmisc.c | 14 +++++++------- drivers/acpi/utilities/utobject.c | 4 ++-- include/acpi/acdispat.h | 2 +- include/acpi/acglobal.h | 2 +- include/acpi/acmacros.h | 24 ++++++++++++------------ include/acpi/acnamesp.h | 10 ++++------ include/acpi/acpiosxf.h | 2 +- include/acpi/acpixf.h | 8 ++++---- include/acpi/acstruct.h | 2 +- include/acpi/actables.h | 27 ++++++++++++--------------- include/acpi/actypes.h | 16 ++++++---------- include/acpi/acutils.h | 4 ++-- 49 files changed, 205 insertions(+), 221 deletions(-)
arch/x86/kernel/srat_32.c +1 -1
@@ -269,7 +269,7 @@ int __init get_memcfg_from_srat(void)struct acpi_table_header *header =NULL ;struct acpi_table_rsdp *rsdp =NULL ;struct acpi_table_rsdt *rsdt =NULL ; -acpi_native_uint rsdp_address =0 ; +u32 rsdp_address =0 ;struct acpi_static_rsdt saved_rsdt;int tables =0 ;int i =0 ;
drivers/acpi/bus.c +1 -1
@@ -612,7 +612,7 @@ static int __init acpi_bus_init_irq(void)return 0 ; } -acpi_native_uint acpi_gbl_permanent_mmap; +u8 acpi_gbl_permanent_mmap;void __init acpi_early_init (void )
drivers/acpi/dispatcher/dsinit.c +1 -1
@@ -151,7 +151,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle,******************************************************************************/ acpi_status -acpi_ds_initialize_objects (acpi_native_uint table_index, +acpi_ds_initialize_objects (u32 table_index,struct acpi_namespace_node * start_node) {acpi_status status;
drivers/acpi/dispatcher/dsopcode.c +1 -1
@@ -848,7 +848,7 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,union acpi_operand_object **operand;struct acpi_namespace_node *node;union acpi_parse_object *next_op; -acpi_native_uint table_index; +u32 table_index;struct acpi_table_header *table;ACPI_FUNCTION_TRACE_PTR (ds_eval_table_region_operands, op);
drivers/acpi/dispatcher/dswstate.c +5 -5
@@ -70,7 +70,7 @@ acpi_status acpi_ds_result_pop(union acpi_operand_object **object, struct acpi_walk_state *walk_state) { - acpi_native_uint index; + u32 index;union acpi_generic_state *state;acpi_status status;
@@ -122,7 +122,7 @@ acpi_ds_result_pop(union acpi_operand_object **object,ACPI_DEBUG_PRINT ((ACPI_DB_EXEC ,"Obj=%p [%s] Index=%X State=%p Num=%X\n" , *object,acpi_ut_get_object_type_name (*object), - (u32 ) index, walk_state, walk_state->result_count)); + index, walk_state, walk_state->result_count));return (AE_OK ); }
@@ -146,7 +146,7 @@ acpi_ds_result_push(union acpi_operand_object * object, {union acpi_generic_state *state;acpi_status status; -acpi_native_uint index; +u32 index;ACPI_FUNCTION_NAME (ds_result_push);
@@ -400,7 +400,7 @@ void acpi_ds_obj_stack_pop_and_delete(u32 pop_count, struct acpi_walk_state *walk_state) { - acpi_native_int i; + s32 i;union acpi_operand_object *obj_desc;ACPI_FUNCTION_NAME (ds_obj_stack_pop_and_delete);
@@ -409,7 +409,7 @@ acpi_ds_obj_stack_pop_and_delete(u32 pop_count,return ; } -for (i = (acpi_native_int) (pop_count -1 ); i >=0 ; i--) { +for (i = (s32 ) pop_count -1 ; i >=0 ; i--) {if (walk_state->num_operands ==0 ) {return ; }
drivers/acpi/events/evevent.c +3 -3
@@ -188,7 +188,7 @@ acpi_status acpi_ev_install_xrupt_handlers(void)static acpi_status acpi_ev_fixed_event_initialize (void ) { -acpi_native_uint i; +u32 i;acpi_status status;/*
@@ -231,7 +231,7 @@ u32 acpi_ev_fixed_event_detect(void)u32 int_status =ACPI_INTERRUPT_NOT_HANDLED ;u32 fixed_status;u32 fixed_enable; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_NAME (ev_fixed_event_detect);
@@ -260,7 +260,7 @@ u32 acpi_ev_fixed_event_detect(void)/* Found an active (signalled) event */ acpi_os_fixed_event_count (i); - int_status |=acpi_ev_fixed_event_dispatch ((u32 ) i); + int_status |=acpi_ev_fixed_event_dispatch (i); } }
drivers/acpi/events/evgpe.c +4 -10
@@ -305,7 +305,7 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, {union acpi_operand_object *obj_desc;struct acpi_gpe_block_info *gpe_block; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_ENTRY ();
@@ -379,8 +379,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)u32 status_reg;u32 enable_reg;acpi_cpu_flags flags; -acpi_native_uint i; -acpi_native_uint j; +u32 i; +u32 j;ACPI_FUNCTION_NAME (ev_gpe_detect);
@@ -462,13 +462,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)*/ int_status |=acpi_ev_gpe_dispatch (&gpe_block-> - event_info[(i * -ACPI_GPE_REGISTER_WIDTH ) - + - j], - (u32 ) j + - gpe_register_info-> - base_gpe_number); + event_info[((acpi_size ) i *ACPI_GPE_REGISTER_WIDTH ) + j], j + gpe_register_info->base_gpe_number); } } }
drivers/acpi/events/evgpeblk.c +10 -8
@@ -189,8 +189,8 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, struct acpi_gpe_block_info *gpe_block) {struct acpi_gpe_event_info *gpe_event_info; -acpi_native_uint i; -acpi_native_uint j; +u32 i; +u32 j;ACPI_FUNCTION_TRACE (ev_delete_gpe_handlers);
@@ -203,7 +203,8 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,for (j =0 ; j <ACPI_GPE_REGISTER_WIDTH ; j++) { gpe_event_info = &gpe_block-> - event_info[(i *ACPI_GPE_REGISTER_WIDTH ) + j]; + event_info[((acpi_size ) i * +ACPI_GPE_REGISTER_WIDTH ) + j];if ((gpe_event_info->flags &ACPI_GPE_DISPATCH_MASK ) ==ACPI_GPE_DISPATCH_HANDLER ) {
@@ -744,8 +745,8 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)struct acpi_gpe_event_info *gpe_event_info =NULL ;struct acpi_gpe_event_info *this_event;struct acpi_gpe_register_info *this_register; -acpi_native_uint i; -acpi_native_uint j; +u32 i; +u32 j;acpi_status status;ACPI_FUNCTION_TRACE (ev_create_gpe_info_blocks);
@@ -983,8 +984,8 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,struct acpi_gpe_walk_info gpe_info;u32 wake_gpe_count;u32 gpe_enabled_count; -acpi_native_uint i; -acpi_native_uint j; +u32 i; +u32 j;ACPI_FUNCTION_TRACE (ev_initialize_gpe_block);
@@ -1033,7 +1034,8 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, gpe_event_info = &gpe_block-> - event_info[(i *ACPI_GPE_REGISTER_WIDTH ) + j]; + event_info[((acpi_size ) i * +ACPI_GPE_REGISTER_WIDTH ) + j];if (((gpe_event_info->flags &ACPI_GPE_DISPATCH_MASK ) == ACPI_GPE_DISPATCH_METHOD)
drivers/acpi/events/evmisc.c +2 -2
@@ -575,7 +575,7 @@ acpi_status acpi_ev_release_global_lock(void)void acpi_ev_terminate (void ) { -acpi_native_uint i; +u32 i;acpi_status status;ACPI_FUNCTION_TRACE (ev_terminate);
@@ -589,7 +589,7 @@ void acpi_ev_terminate(void)/* Disable all fixed events */ for (i =0 ; i <ACPI_NUM_FIXED_EVENTS ; i++) { - status =acpi_disable_event ((u32 ) i,0 ); + status =acpi_disable_event (i,0 );if (ACPI_FAILURE (status)) { ACPI_ERROR((AE_INFO, "Could not disable fixed event %d",
drivers/acpi/events/evregion.c +2 -2
@@ -81,7 +81,7 @@ acpi_ev_install_handler(acpi_handle obj_handle,acpi_status acpi_ev_install_region_handlers (void ) {acpi_status status; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (ev_install_region_handlers);
@@ -151,7 +151,7 @@ acpi_status acpi_ev_install_region_handlers(void)acpi_status acpi_ev_initialize_op_regions (void ) {acpi_status status; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (ev_initialize_op_regions);
drivers/acpi/events/evrgnini.c +1 -1
@@ -380,7 +380,7 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)acpi_status status;struct acpica_device_id hid;struct acpi_compatible_id_list *cid; -acpi_native_uint i; +u32 i;/* * Get the _HID and check for a PCI Root Bridge
drivers/acpi/executer/exconfig.c +7 -7
@@ -53,7 +53,7 @@ ACPI_MODULE_NAME("exconfig")/* Local prototypes */ static acpi_status -acpi_ex_add_table (acpi_native_uint table_index, +acpi_ex_add_table (u32 table_index,struct acpi_namespace_node *parent_node,union acpi_operand_object **ddb_handle);
@@ -73,7 +73,7 @@ acpi_ex_add_table(acpi_native_uint table_index,******************************************************************************/ static acpi_status -acpi_ex_add_table (acpi_native_uint table_index, +acpi_ex_add_table (u32 table_index,struct acpi_namespace_node *parent_node,union acpi_operand_object **ddb_handle) {
@@ -128,12 +128,12 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state, {acpi_status status;union acpi_operand_object **operand = &walk_state->operands[0 ]; -acpi_native_uint table_index;struct acpi_namespace_node *parent_node;struct acpi_namespace_node *start_node;struct acpi_namespace_node *parameter_node =NULL ;union acpi_operand_object *ddb_handle;struct acpi_table_header *table; +u32 table_index;ACPI_FUNCTION_TRACE (ex_load_table_op);
@@ -280,7 +280,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, {union acpi_operand_object *ddb_handle;struct acpi_table_desc table_desc; -acpi_native_uint table_index; +u32 table_index;acpi_status status;u32 length;
@@ -437,7 +437,7 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle) {acpi_status status =AE_OK ;union acpi_operand_object *table_desc = ddb_handle; -acpi_native_uint table_index; +u32 table_index;struct acpi_table_header *table;ACPI_FUNCTION_TRACE (ex_unload_table);
@@ -454,9 +454,9 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)return_ACPI_STATUS (AE_BAD_PARAMETER ); } -/* Get the table index from the ddb_handle */ +/* Get the table index from the ddb_handle (acpi_size for 64-bit case) */ - table_index = (acpi_native_uint ) table_desc->reference.object; + table_index = (u32 ) (acpi_size ) table_desc->reference.object;/* Invoke table handler if present */
drivers/acpi/executer/exconvrt.c +6 -6
@@ -288,11 +288,11 @@ acpi_ex_convert_to_ascii(acpi_integer integer, u16 base, u8 * string, u8 data_width) { acpi_integer digit; -acpi_native_uint i; -acpi_native_uint j; -acpi_native_uint k =0 ; -acpi_native_uint hex_length; -acpi_native_uint decimal_length; +u32 i; +u32 j; +u32 k =0 ; +u32 hex_length; +u32 decimal_length;u32 remainder;u8 supress_zeros;
@@ -348,7 +348,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer,/* hex_length: 2 ascii hex chars per data byte */ - hex_length = (acpi_native_uint )ACPI_MUL_2 (data_width); + hex_length =ACPI_MUL_2 (data_width);for (i =0 , j = (hex_length -1 ); i < hex_length; i++, j--) {/* Get one hex digit, most significant digits first */
drivers/acpi/executer/exdump.c +1 -1
@@ -775,7 +775,7 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,u32 num_levels, char *note, char *module_name, u32 line_number) { - acpi_native_uint i; + u32 i;ACPI_FUNCTION_NAME (ex_dump_operands);
drivers/acpi/executer/exfldio.c +5 -4
@@ -153,14 +153,15 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,/* * Slack mode only: We will go ahead and allow access to this * field if it is within the region length rounded up to the next -* access width boundary. +* access width boundary. acpi_size cast for 64-bit compile. */ if (ACPI_ROUND_UP (rgn_desc->region.length, obj_desc->common_field. access_byte_width) >= - (obj_desc->common_field.base_byte_offset + - (acpi_native_uint ) obj_desc->common_field. - access_byte_width + field_datum_byte_offset)) { + ((acpi_size ) obj_desc->common_field. + base_byte_offset + + obj_desc->common_field.access_byte_width + + field_datum_byte_offset)) {return_ACPI_STATUS (AE_OK ); } }
drivers/acpi/executer/exmisc.c +4 -4
@@ -329,8 +329,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,/* Result of two Strings is a String */ - return_desc =acpi_ut_create_string_object ((acpi_size) - (operand0->string. + return_desc =acpi_ut_create_string_object (((acpi_size ) + operand0->string. length + local_operand1-> string.length));
@@ -352,8 +352,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,/* Result of two Buffers is a Buffer */ - return_desc =acpi_ut_create_buffer_object ((acpi_size) - (operand0->buffer. + return_desc =acpi_ut_create_buffer_object (((acpi_size ) + operand0->buffer. length + local_operand1-> buffer.length));
drivers/acpi/executer/exregion.c +1 -1
@@ -156,7 +156,7 @@ acpi_ex_system_memory_space_handler(u32 function,/* Create a new mapping starting at the address given */ mem_info->mapped_logical_address = -acpi_os_map_memory ((acpi_native_uint ) address, window_size); +acpi_os_map_memory ((acpi_physical_address ) address, window_size);if (!mem_info->mapped_logical_address) { ACPI_ERROR((AE_INFO, "Could not map memory at %8.8X%8.8X, size %X",
drivers/acpi/namespace/nsdump.c +1 -1
@@ -73,7 +73,7 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,void acpi_ns_print_pathname (u32 num_segments,char *pathname) { -acpi_native_uint i; +u32 i;ACPI_FUNCTION_NAME (ns_print_pathname);
drivers/acpi/namespace/nsload.c +1 -2
@@ -71,8 +71,7 @@ static acpi_status acpi_ns_delete_subtree(acpi_handle start_handle);******************************************************************************/ acpi_status -acpi_ns_load_table (acpi_native_uint table_index, -struct acpi_namespace_node *node) +acpi_ns_load_table (u32 table_index,struct acpi_namespace_node *node) {acpi_status status;
drivers/acpi/namespace/nsparse.c +7 -8
@@ -63,13 +63,13 @@ ACPI_MODULE_NAME("nsparse")* ******************************************************************************/ acpi_status -acpi_ns_one_complete_parse (acpi_native_uint pass_number, -acpi_native_uint table_index, -struct acpi_namespace_node * start_node) +acpi_ns_one_complete_parse (u32 pass_number, +u32 table_index, +struct acpi_namespace_node *start_node) {union acpi_parse_object *parse_root;acpi_status status; -acpi_native_uint aml_length; +u32 aml_length;u8 *aml_start;struct acpi_walk_state *walk_state;struct acpi_table_header *table;
@@ -112,8 +112,8 @@ acpi_ns_one_complete_parse(acpi_native_uint pass_number, aml_start = (u8 *) table +sizeof (struct acpi_table_header ); aml_length = table->length -sizeof (struct acpi_table_header ); status =acpi_ds_init_aml_walk (walk_state, parse_root,NULL , - aml_start, (u32 ) aml_length, -NULL , (u8 ) pass_number); + aml_start, aml_length,NULL , + (u8 ) pass_number); }if (ACPI_FAILURE (status)) {
@@ -158,8 +158,7 @@ acpi_ns_one_complete_parse(acpi_native_uint pass_number,******************************************************************************/ acpi_status -acpi_ns_parse_table (acpi_native_uint table_index, -struct acpi_namespace_node *start_node) +acpi_ns_parse_table (u32 table_index,struct acpi_namespace_node *start_node) {acpi_status status;
drivers/acpi/namespace/nsutils.c +12 -14
@@ -365,7 +365,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)char *internal_name = info->internal_name;char *external_name = info->next_external_char;char *result =NULL ; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (ns_build_internal_name);
@@ -400,12 +400,11 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info) result = &internal_name[i]; }else if (num_segments ==2 ) { internal_name[i] =AML_DUAL_NAME_PREFIX ; - result = &internal_name[(acpi_native_uint) (i +1 )]; + result = &internal_name[(acpi_size ) i +1 ]; }else { internal_name[i] =AML_MULTI_NAME_PREFIX_OP ; - internal_name[(acpi_native_uint) (i +1 )] = - (char )num_segments; - result = &internal_name[(acpi_native_uint) (i +2 )]; + internal_name[(acpi_size ) i +1 ] = (char )num_segments; + result = &internal_name[(acpi_size ) i +2 ]; } }
@@ -531,12 +530,12 @@ acpi_ns_externalize_name(u32 internal_name_length,char *internal_name, u32 * converted_name_length, char **converted_name) { - acpi_native_uint names_index = 0; -acpi_native_uint num_segments =0 ; -acpi_native_uint required_length; -acpi_native_uint prefix_length =0 ; -acpi_native_uint i =0 ; -acpi_native_uint j =0 ; + u32 names_index = 0; +u32 num_segments =0 ; +u32 required_length; +u32 prefix_length =0 ; +u32 i =0 ; +u32 j =0 ;ACPI_FUNCTION_TRACE (ns_externalize_name);
@@ -582,9 +581,8 @@ acpi_ns_externalize_name(u32 internal_name_length,/* <count> 4-byte names */ names_index = prefix_length +2 ; - num_segments = (acpi_native_uint ) (u8 ) - internal_name[(acpi_native_uint) - (prefix_length +1 )]; + num_segments = (u8 ) + internal_name[(acpi_size ) prefix_length +1 ];break ;case AML_DUAL_NAME_PREFIX :
drivers/acpi/namespace/nsxfeval.c +1 -1
@@ -441,7 +441,7 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,u32 flags;struct acpica_device_id hid;struct acpi_compatible_id_list *cid; -acpi_native_uint i; +u32 i;int found; status =acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE );
drivers/acpi/parser/psargs.c +2 -2
@@ -76,7 +76,7 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state) {u8 *aml = parser_state->aml;u32 package_length =0 ; -acpi_native_uint byte_count; +u32 byte_count;u8 byte_zero_mask =0x3F ;/* Default [0:5] */ ACPI_FUNCTION_TRACE (ps_get_next_package_length);
@@ -86,7 +86,7 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)* used to encode the package length, either 0,1,2, or 3 */ byte_count = (aml[0 ] >>6 ); - parser_state->aml += (byte_count +1 ); + parser_state->aml += ((acpi_size ) byte_count +1 );/* Get bytes 3, 2, 1 as needed */
drivers/acpi/parser/psxface.c +1 -1
@@ -333,7 +333,7 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)static void acpi_ps_update_parameter_list (struct acpi_evaluate_info *info,u16 action) { -acpi_native_uint i; +u32 i;if (info->parameters) {
drivers/acpi/resources/rscalc.c +2 -2
@@ -73,7 +73,7 @@ acpi_rs_stream_option_length(u32 resource_length, u32 minimum_total_length);static u8 acpi_rs_count_set_bits (u16 bit_field) { -acpi_native_uint bits_set; +u8 bits_set;ACPI_FUNCTION_ENTRY ();
@@ -84,7 +84,7 @@ static u8 acpi_rs_count_set_bits(u16 bit_field) bit_field &= (u16) (bit_field -1 ); } -return ((u8 ) bits_set); +return bits_set; }/*******************************************************************************
drivers/acpi/resources/rsmisc.c +1 -1
@@ -82,7 +82,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,ACPI_FUNCTION_TRACE (rs_convert_aml_to_resource); -if (((acpi_native_uint ) resource) &0x3 ) { +if (((acpi_size ) resource) &0x3 ) {/* Each internal resource struct is expected to be 32-bit aligned */
drivers/acpi/resources/rsutils.c +6 -6
@@ -62,7 +62,7 @@ ACPI_MODULE_NAME("rsutils")******************************************************************************/ u8 acpi_rs_decode_bitmask (u16 mask,u8 * list) { -acpi_native_uint i; +u8 i;u8 bit_count;ACPI_FUNCTION_ENTRY ();
@@ -71,7 +71,7 @@ u8 acpi_rs_decode_bitmask(u16 mask, u8 * list)for (i =0 , bit_count =0 ; mask; i++) {if (mask &0x0001 ) { - list[bit_count] = (u8 ) i; + list[bit_count] = i; bit_count++; }
@@ -96,8 +96,8 @@ u8 acpi_rs_decode_bitmask(u16 mask, u8 * list)u16 acpi_rs_encode_bitmask (u8 * list,u8 count) { -acpi_native_uint i; -acpi_native_uint mask; +u32 i; +u16 mask;ACPI_FUNCTION_ENTRY ();
@@ -107,7 +107,7 @@ u16 acpi_rs_encode_bitmask(u8 * list, u8 count) mask |= (0x1 << list[i]); } -return ((u16 ) mask); +return mask; }/*******************************************************************************
@@ -130,7 +130,7 @@ u16 acpi_rs_encode_bitmask(u8 * list, u8 count)void acpi_rs_move_data (void *destination,void *source,u16 item_count,u8 move_type) { -acpi_native_uint i; +u32 i;ACPI_FUNCTION_ENTRY ();
drivers/acpi/tables/tbfadt.c +3 -3
@@ -155,7 +155,7 @@ acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,* ******************************************************************************/ -void acpi_tb_parse_fadt (acpi_native_uint table_index,u8 flags) +void acpi_tb_parse_fadt (u32 table_index,u8 flags) {u32 length;struct acpi_table_header *table;
@@ -280,7 +280,7 @@ static void acpi_tb_convert_fadt(void) {u8 pm1_register_length;struct acpi_generic_address *target; -acpi_native_uint i; +u32 i;/* Update the local FADT table header length */
@@ -396,7 +396,7 @@ static void acpi_tb_validate_fadt(void)u32 *address32;struct acpi_generic_address *address64;u8 length; -acpi_native_uint i; +u32 i;/* Examine all of the 64-bit extended address fields (X fields) */
drivers/acpi/tables/tbfind.c +2 -3
@@ -65,10 +65,9 @@ ACPI_MODULE_NAME("tbfind")******************************************************************************/ acpi_status acpi_tb_find_table (char *signature, -char *oem_id, -char *oem_table_id,acpi_native_uint * table_index) +char *oem_id,char *oem_table_id,u32 *table_index) { -acpi_native_uint i; +u32 i;acpi_status status;struct acpi_table_header header;
drivers/acpi/tables/tbinstal.c +14 -16
@@ -107,11 +107,10 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)******************************************************************************/ acpi_status -acpi_tb_add_table (struct acpi_table_desc *table_desc, -acpi_native_uint * table_index) +acpi_tb_add_table (struct acpi_table_desc *table_desc,u32 *table_index) { -acpi_native_uint i; -acpi_native_uint length; +u32 i; +u32 length;acpi_status status =AE_OK ;ACPI_FUNCTION_TRACE (tb_add_table);
@@ -207,8 +206,8 @@ acpi_status acpi_tb_resize_root_table_list(void)/* Increase the Table Array size */ - tables =ACPI_ALLOCATE_ZEROED ((acpi_gbl_root_table_list.size + -ACPI_ROOT_TABLE_SIZE_INCREMENT ) + tables =ACPI_ALLOCATE_ZEROED (((acpi_size ) acpi_gbl_root_table_list. + size +ACPI_ROOT_TABLE_SIZE_INCREMENT ) *sizeof (struct acpi_table_desc ));if (!tables) { ACPI_ERROR((AE_INFO,
@@ -220,7 +219,7 @@ acpi_status acpi_tb_resize_root_table_list(void)if (acpi_gbl_root_table_list.tables) {ACPI_MEMCPY (tables, acpi_gbl_root_table_list.tables, - acpi_gbl_root_table_list.size * + (acpi_size ) acpi_gbl_root_table_list.size *sizeof (struct acpi_table_desc ));if (acpi_gbl_root_table_list.flags &ACPI_ROOT_ORIGIN_ALLOCATED ) {
@@ -253,7 +252,7 @@ acpi_status acpi_tb_resize_root_table_list(void)acpi_status acpi_tb_store_table (acpi_physical_address address,struct acpi_table_header *table, -u32 length,u8 flags,acpi_native_uint * table_index) +u32 length,u8 flags,u32 *table_index) {acpi_status status =AE_OK ;
@@ -334,7 +333,7 @@ void acpi_tb_delete_table(struct acpi_table_desc *table_desc)void acpi_tb_terminate (void ) { -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (tb_terminate);
@@ -374,7 +373,7 @@ void acpi_tb_terminate(void)* ******************************************************************************/ -void acpi_tb_delete_namespace_by_owner (acpi_native_uint table_index) +void acpi_tb_delete_namespace_by_owner (u32 table_index) {acpi_owner_id owner_id;
@@ -403,7 +402,7 @@ void acpi_tb_delete_namespace_by_owner(acpi_native_uint table_index)* ******************************************************************************/ -acpi_status acpi_tb_allocate_owner_id (acpi_native_uint table_index) +acpi_status acpi_tb_allocate_owner_id (u32 table_index) {acpi_status status =AE_BAD_PARAMETER ;
@@ -431,7 +430,7 @@ acpi_status acpi_tb_allocate_owner_id(acpi_native_uint table_index)* ******************************************************************************/ -acpi_status acpi_tb_release_owner_id (acpi_native_uint table_index) +acpi_status acpi_tb_release_owner_id (u32 table_index) {acpi_status status =AE_BAD_PARAMETER ;
@@ -462,8 +461,7 @@ acpi_status acpi_tb_release_owner_id(acpi_native_uint table_index)* ******************************************************************************/ -acpi_status -acpi_tb_get_owner_id (acpi_native_uint table_index,acpi_owner_id * owner_id) +acpi_status acpi_tb_get_owner_id (u32 table_index,acpi_owner_id *owner_id) {acpi_status status =AE_BAD_PARAMETER ;
@@ -490,7 +488,7 @@ acpi_tb_get_owner_id(acpi_native_uint table_index, acpi_owner_id * owner_id)* ******************************************************************************/ -u8 acpi_tb_is_table_loaded (acpi_native_uint table_index) +u8 acpi_tb_is_table_loaded (u32 table_index) {u8 is_loaded = FALSE;
@@ -518,7 +516,7 @@ u8 acpi_tb_is_table_loaded(acpi_native_uint table_index)* ******************************************************************************/ -void acpi_tb_set_table_loaded_flag (acpi_native_uint table_index,u8 is_loaded) +void acpi_tb_set_table_loaded_flag (u32 table_index,u8 is_loaded) { (void )acpi_ut_acquire_mutex (ACPI_MTX_TABLES );
drivers/acpi/tables/tbutils.c +7 -8
@@ -49,8 +49,8 @@ ACPI_MODULE_NAME("tbutils")/* Local prototypes */ static acpi_physical_address -acpi_tb_get_root_table_entry (u8 * table_entry, -acpi_native_uint table_entry_size); +acpi_tb_get_root_table_entry (u8 *table_entry,u32 table_entry_size); +/******************************************************************************* * * FUNCTION: acpi_tb_check_xsdt
@@ -238,7 +238,7 @@ acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length)* ******************************************************************************/ -u8 acpi_tb_checksum (u8 * buffer,acpi_native_uint length) +u8 acpi_tb_checksum (u8 *buffer,u32 length) {u8 sum =0 ;u8 *end = buffer + length;
@@ -268,7 +268,7 @@ u8 acpi_tb_checksum(u8 * buffer, acpi_native_uint length)void acpi_tb_install_table (acpi_physical_address address, -u8 flags,char *signature,acpi_native_uint table_index) +u8 flags,char *signature,u32 table_index) {struct acpi_table_header *table;
@@ -336,8 +336,7 @@ acpi_tb_install_table(acpi_physical_address address,******************************************************************************/ static acpi_physical_address -acpi_tb_get_root_table_entry (u8 * table_entry, -acpi_native_uint table_entry_size) +acpi_tb_get_root_table_entry (u8 *table_entry,u32 table_entry_size) {u64 address64;
@@ -395,8 +394,8 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags) {struct acpi_table_rsdp *rsdp; -acpi_native_uint table_entry_size; -acpi_native_uint i; +u32 table_entry_size; +u32 i;u32 table_count;struct acpi_table_header *table;acpi_physical_address address;
drivers/acpi/tables/tbxface.c +13 -15
@@ -125,7 +125,7 @@ acpi_initialize_tables(struct acpi_table_desc * initial_table_array,/* Root Table Array has been statically allocated by the host */ ACPI_MEMSET (initial_table_array,0 , - initial_table_count * + (acpi_size ) initial_table_count *sizeof (struct acpi_table_desc )); acpi_gbl_root_table_list.tables = initial_table_array;
@@ -183,9 +183,9 @@ acpi_status acpi_reallocate_root_table(void)return_ACPI_STATUS (AE_SUPPORT ); } - new_size = - (acpi_gbl_root_table_list.count + -ACPI_ROOT_TABLE_SIZE_INCREMENT ) *sizeof (struct acpi_table_desc ); + new_size = ((acpi_size ) acpi_gbl_root_table_list.count + +ACPI_ROOT_TABLE_SIZE_INCREMENT ) * +sizeof (struct acpi_table_desc );/* Create new array and copy the old array */
@@ -222,7 +222,7 @@ acpi_status acpi_reallocate_root_table(void)acpi_status acpi_load_table (struct acpi_table_header *table_ptr) {acpi_status status; -acpi_native_uint table_index; +u32 table_index;struct acpi_table_desc table_desc;if (!table_ptr)
@@ -264,11 +264,10 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)*****************************************************************************/ acpi_status acpi_get_table_header (char *signature, -acpi_native_uint instance, -struct acpi_table_header * out_table_header) +u32 instance,struct acpi_table_header *out_table_header) { -acpi_native_uint i; -acpi_native_uint j; +u32 i; +u32 j;struct acpi_table_header *header;/* Parameter validation */
@@ -378,10 +377,10 @@ ACPI_EXPORT_SYMBOL(acpi_unload_table_id)*****************************************************************************/ acpi_status acpi_get_table (char *signature, -acpi_native_uint instance,struct acpi_table_header **out_table) +u32 instance,struct acpi_table_header **out_table) { -acpi_native_uint i; -acpi_native_uint j; +u32 i; +u32 j;acpi_status status;/* Parameter validation */
@@ -435,8 +434,7 @@ ACPI_EXPORT_SYMBOL(acpi_get_table)* ******************************************************************************/ acpi_status -acpi_get_table_by_index (acpi_native_uint table_index, -struct acpi_table_header ** table) +acpi_get_table_by_index (u32 table_index,struct acpi_table_header **table) {acpi_status status;
@@ -493,7 +491,7 @@ static acpi_status acpi_tb_load_namespace(void) {acpi_status status;struct acpi_table_header *table; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (tb_load_namespace);
drivers/acpi/tables/tbxfroot.c +2 -2
@@ -118,7 +118,7 @@ static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)* ******************************************************************************/ -acpi_status acpi_find_root_pointer (acpi_native_uint * table_address) +acpi_status acpi_find_root_pointer (acpi_size *table_address) {u8 *table_ptr;u8 *mem_rover;
@@ -153,7 +153,7 @@ acpi_status acpi_find_root_pointer(acpi_native_uint * table_address)* 1b) Search EBDA paragraphs (EBDA is required to be a * minimum of 1_k length) */ - table_ptr =acpi_os_map_memory ((acpi_native_uint ) + table_ptr =acpi_os_map_memory ((acpi_physical_address ) physical_address,ACPI_EBDA_WINDOW_SIZE );if (!table_ptr) {
drivers/acpi/utilities/utcopy.c +2 -2
@@ -572,7 +572,7 @@ acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object,acpi_status status =AE_OK ;union acpi_operand_object *package_object;union acpi_operand_object **package_elements; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (ut_copy_epackage_to_ipackage);
@@ -599,7 +599,7 @@ acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object,/* Truncate package and delete it */ - package_object->package.count = (u32 ) i; + package_object->package.count = i; package_elements[i] =NULL ;acpi_ut_remove_reference (package_object);return_ACPI_STATUS (status);
drivers/acpi/utilities/utdebug.c +17 -11
@@ -519,8 +519,8 @@ acpi_ut_ptr_exit(u32 line_number,void acpi_ut_dump_buffer2 (u8 * buffer,u32 count,u32 display) { -acpi_native_uint i =0 ; -acpi_native_uint j; +u32 i =0 ; +u32 j;u32 temp32;u8 buf_char;
@@ -539,7 +539,7 @@ void acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display)/* Print current offset */ -acpi_os_printf ("%6.4X: " , (u32 ) i); +acpi_os_printf ("%6.4X: " , i);/* Print 16 hex chars */
@@ -549,7 +549,7 @@ void acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display)/* Dump fill spaces */ acpi_os_printf ("%*s" , ((display *2 ) +1 )," " ); - j += (acpi_native_uint ) display; + j += display;continue ; }
@@ -557,32 +557,38 @@ void acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display)case DB_BYTE_DISPLAY :default :/* Default is BYTE display */ -acpi_os_printf ("%02X " , buffer[i + j]); +acpi_os_printf ("%02X " , + buffer[(acpi_size ) i + j]);break ;case DB_WORD_DISPLAY : -ACPI_MOVE_16_TO_32 (&temp32, &buffer[i + j]); +ACPI_MOVE_16_TO_32 (&temp32, + &buffer[(acpi_size ) i + j]);acpi_os_printf ("%04X " , temp32);break ;case DB_DWORD_DISPLAY : -ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j]); +ACPI_MOVE_32_TO_32 (&temp32, + &buffer[(acpi_size ) i + j]);acpi_os_printf ("%08X " , temp32);break ;case DB_QWORD_DISPLAY : -ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j]); +ACPI_MOVE_32_TO_32 (&temp32, + &buffer[(acpi_size ) i + j]);acpi_os_printf ("%08X" , temp32); -ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j +4 ]); +ACPI_MOVE_32_TO_32 (&temp32, + &buffer[(acpi_size ) i + j + +4 ]);acpi_os_printf ("%08X " , temp32);break ; } - j += (acpi_native_uint ) display; + j += display; }/*
@@ -596,7 +602,7 @@ void acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display)return ; } - buf_char = buffer[i + j]; + buf_char = buffer[(acpi_size ) i + j];if (ACPI_IS_PRINT (buf_char)) {acpi_os_printf ("%c" , buf_char); }else {
drivers/acpi/utilities/utdelete.c +1 -1
@@ -442,7 +442,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)union acpi_generic_state *state_list =NULL ;union acpi_operand_object *next_object =NULL ;union acpi_generic_state *state; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE_PTR (ut_update_object_reference, object);
drivers/acpi/utilities/uteval.c +2 -2
@@ -97,7 +97,7 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)acpi_status status;union acpi_operand_object *string_desc;union acpi_operand_object *return_desc; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (ut_osi_implementation);
@@ -513,7 +513,7 @@ acpi_ut_execute_CID(struct acpi_namespace_node * device_node,u32 count;u32 size;struct acpi_compatible_id_list *cid_list; -acpi_native_uint i; +u32 i;ACPI_FUNCTION_TRACE (ut_execute_CID);
drivers/acpi/utilities/utmisc.c +7 -7
@@ -161,9 +161,9 @@ u8 acpi_ut_is_aml_table(struct acpi_table_header *table)acpi_status acpi_ut_allocate_owner_id (acpi_owner_id * owner_id) { -acpi_native_uint i; -acpi_native_uint j; -acpi_native_uint k; +u32 i; +u32 j; +u32 k;acpi_status status;ACPI_FUNCTION_TRACE (ut_allocate_owner_id);
@@ -269,7 +269,7 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr) {acpi_owner_id owner_id = *owner_id_ptr;acpi_status status; -acpi_native_uint index; +u32 index;u32 bit;ACPI_FUNCTION_TRACE_U32 (ut_release_owner_id, owner_id);
@@ -589,7 +589,7 @@ acpi_ut_display_init_pathname(u8 type,* ******************************************************************************/ -u8 acpi_ut_valid_acpi_char (char character,acpi_native_uint position) +u8 acpi_ut_valid_acpi_char (char character,u32 position) { if (!((character >= 'A' && character <= 'Z') ||
@@ -624,7 +624,7 @@ u8 acpi_ut_valid_acpi_char(char character, acpi_native_uint position)u8 acpi_ut_valid_acpi_name (u32 name) { -acpi_native_uint i; +u32 i;ACPI_FUNCTION_ENTRY ();
@@ -653,7 +653,7 @@ u8 acpi_ut_valid_acpi_name(u32 name)acpi_name acpi_ut_repair_name (char *name) { -acpi_native_uint i; +u32 i;char new_name[ACPI_NAME_SIZE ];for (i =0 ; i <ACPI_NAME_SIZE ; i++) {
drivers/acpi/utilities/utobject.c +2 -2
@@ -175,8 +175,8 @@ union acpi_operand_object *acpi_ut_create_package_object(u32 count)* Create the element array. Count+1 allows the array to be null * terminated. */ - package_elements =ACPI_ALLOCATE_ZEROED ((acpi_size) - (count +1 ) *sizeof (void *)); + package_elements =ACPI_ALLOCATE_ZEROED (((acpi_size ) count + +1 ) *sizeof (void *));if (!package_elements) {acpi_ut_remove_reference (package_desc);return_PTR (NULL );
include/acpi/acdispat.h +1 -1
@@ -221,7 +221,7 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state);* dsinit */ acpi_status -acpi_ds_initialize_objects (acpi_native_uint table_index, +acpi_ds_initialize_objects (u32 table_index,struct acpi_namespace_node *start_node);/*
include/acpi/acglobal.h +1 -1
@@ -140,7 +140,7 @@ ACPI_EXTERN u32 acpi_gbl_trace_flags;*/ ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list; ACPI_EXTERN struct acpi_table_fadt acpi_gbl_FADT; -extern acpi_native_uint acpi_gbl_permanent_mmap; +extern u8 acpi_gbl_permanent_mmap;/* These addresses are calculated from FADT address values */
include/acpi/acmacros.h +12 -12
@@ -80,12 +80,12 @@*/ #define ACPI_CAST_PTR (t, p) ((t *) (acpi_uintptr_t) (p))#define ACPI_CAST_INDIRECT_PTR (t, p) ((t **) (acpi_uintptr_t) (p)) -#define ACPI_ADD_PTR (t,a,b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8,(a)) + (acpi_native_uint)(b))) -#define ACPI_PTR_DIFF (a,b) (acpi_native_uint) (ACPI_CAST_PTR (u8,(a)) - ACPI_CAST_PTR (u8,(b))) +#define ACPI_ADD_PTR (t, a, b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8,(a)) + (acpi_size)(b))) +#define ACPI_PTR_DIFF (a, b) (acpi_size) (ACPI_CAST_PTR (u8,(a)) - ACPI_CAST_PTR (u8,(b)))/* Pointer/Integer type conversions */ -#define ACPI_TO_POINTER (i) ACPI_ADD_PTR (void,(void *) NULL,(acpi_native_uint) i) +#define ACPI_TO_POINTER (i) ACPI_ADD_PTR (void, (void *) NULL, (acpi_size) i)#define ACPI_TO_INTEGER (p) ACPI_PTR_DIFF (p,(void *) NULL)#define ACPI_OFFSET (d,f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL)#define ACPI_PHYSADDR_TO_PTR (i) ACPI_TO_POINTER(i)
@@ -296,22 +296,22 @@ struct acpi_integer_overlay {/* * Rounding macros (Power of two boundaries only) */ -#define ACPI_ROUND_DOWN (value,boundary) (((acpi_native_uint)(value)) & \ - (~(((acpi_native_uint) boundary)-1))) +#define ACPI_ROUND_DOWN (value, boundary) (((acpi_size)(value)) & \ + (~(((acpi_size) boundary)-1))) -#define ACPI_ROUND_UP (value,boundary) ((((acpi_native_uint)(value)) + \ - (((acpi_native_uint) boundary)-1)) & \ - (~(((acpi_native_uint) boundary)-1))) +#define ACPI_ROUND_UP (value, boundary) ((((acpi_size)(value)) + \ + (((acpi_size) boundary)-1)) & \ + (~(((acpi_size) boundary)-1))) -/* Note: sizeof(acpi_native_uint) evaluates to either 2, 4, or 8 */ +/* Note: sizeof(acpi_size) evaluates to either 4 or 8 (32- vs 64-bit mode) */ #define ACPI_ROUND_DOWN_TO_32BIT (a) ACPI_ROUND_DOWN(a,4)#define ACPI_ROUND_DOWN_TO_64BIT (a) ACPI_ROUND_DOWN(a,8) -#define ACPI_ROUND_DOWN_TO_NATIVE_WORD (a) ACPI_ROUND_DOWN(a,sizeof(acpi_native_uint)) +#define ACPI_ROUND_DOWN_TO_NATIVE_WORD (a) ACPI_ROUND_DOWN(a,sizeof(acpi_size))#define ACPI_ROUND_UP_TO_32BIT (a) ACPI_ROUND_UP(a,4)#define ACPI_ROUND_UP_TO_64BIT (a) ACPI_ROUND_UP(a,8) -#define ACPI_ROUND_UP_TO_NATIVE_WORD (a) ACPI_ROUND_UP(a,sizeof(acpi_native_uint)) +#define ACPI_ROUND_UP_TO_NATIVE_WORD (a) ACPI_ROUND_UP(a,sizeof(acpi_size))#define ACPI_ROUND_BITS_UP_TO_BYTES (a) ACPI_DIV_8((a) + 7)#define ACPI_ROUND_BITS_DOWN_TO_BYTES (a) ACPI_DIV_8((a))
@@ -322,7 +322,7 @@ struct acpi_integer_overlay {#define ACPI_ROUND_UP_TO (value,boundary) (((value) + ((boundary)-1)) / (boundary)) -#define ACPI_IS_MISALIGNED (value) (((acpi_native_uint)value) & (sizeof(acpi_native_uint)-1)) +#define ACPI_IS_MISALIGNED (value) (((acpi_size)value) & (sizeof(acpi_size)-1))/* * Bitmask creation
include/acpi/acnamesp.h +4 -6
@@ -86,8 +86,7 @@ acpi_status acpi_ns_initialize_devices(void);acpi_status acpi_ns_load_namespace (void );acpi_status -acpi_ns_load_table (acpi_native_uint table_index, -struct acpi_namespace_node *node); +acpi_ns_load_table (u32 table_index,struct acpi_namespace_node *node);/* * nswalk - walk the namespace
@@ -108,12 +107,11 @@ struct acpi_namespace_node *acpi_ns_get_next_node(acpi_object_type type, struct* nsparse - table parsing */ acpi_status -acpi_ns_parse_table (acpi_native_uint table_index, -struct acpi_namespace_node *start_node); +acpi_ns_parse_table (u32 table_index,struct acpi_namespace_node *start_node);acpi_status -acpi_ns_one_complete_parse (acpi_native_uint pass_number, -acpi_native_uint table_index, +acpi_ns_one_complete_parse (u32 pass_number, +u32 table_index,struct acpi_namespace_node *start_node);/*
include/acpi/acpiosxf.h +1 -1
@@ -144,7 +144,7 @@ void acpi_os_release_mutex(acpi_mutex handle);void *acpi_os_allocate (acpi_size size);void __iomem *acpi_os_map_memory (acpi_physical_address where, -acpi_native_uint length); +acpi_size length);void acpi_os_unmap_memory (void __iomem * logical_address,acpi_size size);
include/acpi/acpixf.h +4 -4
@@ -98,7 +98,7 @@ void acpi_free(void *address);*/ acpi_status acpi_reallocate_root_table (void ); -acpi_status acpi_find_root_pointer (acpi_native_uint * rsdp_address); +acpi_status acpi_find_root_pointer (acpi_size *rsdp_address);acpi_status acpi_load_tables (void );
@@ -108,15 +108,15 @@ acpi_status acpi_unload_table_id(acpi_owner_id id);acpi_status acpi_get_table_header (acpi_string signature, -acpi_native_uint instance, +u32 instance,struct acpi_table_header *out_table_header);acpi_status acpi_get_table (acpi_string signature, -acpi_native_uint instance,struct acpi_table_header **out_table); +u32 instance,struct acpi_table_header **out_table);acpi_status -acpi_get_table_by_index (acpi_native_uint table_index, +acpi_get_table_by_index (u32 table_index,struct acpi_table_header **out_table); acpi_status
include/acpi/acstruct.h +1 -1
@@ -142,7 +142,7 @@ struct acpi_init_walk_info {u16 package_init;u16 object_count;acpi_owner_id owner_id; -acpi_native_uint table_index; +u32 table_index; };struct acpi_get_devices_info {
include/acpi/actables.h +12 -15
@@ -49,7 +49,7 @@ acpi_status acpi_allocate_root_table(u32 initial_table_count);/* * tbfadt - FADT parse/convert/validate */ -void acpi_tb_parse_fadt (acpi_native_uint table_index,u8 flags); +void acpi_tb_parse_fadt (u32 table_index,u8 flags);void acpi_tb_create_local_fadt (struct acpi_table_header *table,u32 length);
@@ -58,8 +58,7 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length);*/ acpi_status acpi_tb_find_table (char *signature, -char *oem_id, -char *oem_table_id,acpi_native_uint * table_index); +char *oem_id,char *oem_table_id,u32 *table_index);/* * tbinstal - Table removal and deletion
@@ -69,30 +68,28 @@ acpi_status acpi_tb_resize_root_table_list(void);acpi_status acpi_tb_verify_table (struct acpi_table_desc *table_desc);acpi_status -acpi_tb_add_table (struct acpi_table_desc *table_desc, -acpi_native_uint * table_index); +acpi_tb_add_table (struct acpi_table_desc *table_desc,u32 *table_index);acpi_status acpi_tb_store_table (acpi_physical_address address,struct acpi_table_header *table, -u32 length,u8 flags,acpi_native_uint * table_index); +u32 length,u8 flags,u32 *table_index);void acpi_tb_delete_table (struct acpi_table_desc *table_desc);void acpi_tb_terminate (void ); -void acpi_tb_delete_namespace_by_owner (acpi_native_uint table_index); +void acpi_tb_delete_namespace_by_owner (u32 table_index); -acpi_status acpi_tb_allocate_owner_id (acpi_native_uint table_index); +acpi_status acpi_tb_allocate_owner_id (u32 table_index); -acpi_status acpi_tb_release_owner_id (acpi_native_uint table_index); +acpi_status acpi_tb_release_owner_id (u32 table_index); -acpi_status -acpi_tb_get_owner_id (acpi_native_uint table_index,acpi_owner_id * owner_id); +acpi_status acpi_tb_get_owner_id (u32 table_index,acpi_owner_id *owner_id); -u8 acpi_tb_is_table_loaded (acpi_native_uint table_index); +u8 acpi_tb_is_table_loaded (u32 table_index); -void acpi_tb_set_table_loaded_flag (acpi_native_uint table_index,u8 is_loaded); +void acpi_tb_set_table_loaded_flag (u32 table_index,u8 is_loaded);/* * tbutils - table manager utilities
@@ -103,14 +100,14 @@ void acpi_tb_print_table_header(acpi_physical_address address, struct acpi_table_header *header); -u8 acpi_tb_checksum (u8 * buffer,acpi_native_uint length); +u8 acpi_tb_checksum (u8 *buffer,u32 length);acpi_status acpi_tb_verify_checksum (struct acpi_table_header *table,u32 length);void acpi_tb_install_table (acpi_physical_address address, -u8 flags,char *signature,acpi_native_uint table_index); +u8 flags,char *signature,u32 table_index);acpi_status acpi_tb_parse_root_table (acpi_physical_address rsdp_address,u8 flags);
include/acpi/actypes.h +6 -10
@@ -110,10 +110,10 @@* usually used for memory allocation, efficient loop counters, and array * indexes. The types are similar to the size_t type in the C library and are * required because there is no C type that consistently represents the native -* data width. +* data width. ACPI_SIZE is needed because there is no guarantee that a +* kernel-level C library is present. * * ACPI_SIZE 16/32/64-bit unsigned value -* ACPI_NATIVE_UINT 16/32/64-bit unsigned value * ACPI_NATIVE_INT 16/32/64-bit signed value * */
@@ -147,9 +147,9 @@ typedef int INT32;/*! [End] no source code translation !*/ -typedef u64 acpi_native_uint ;typedef s64 acpi_native_int ; +typedef u64 acpi_size ;typedef u64 acpi_io_address ;typedef u64 acpi_physical_address ;
@@ -186,9 +186,9 @@ typedef int INT32;/*! [End] no source code translation !*/ -typedef u32 acpi_native_uint ;typedef s32 acpi_native_int ; +typedef u32 acpi_size ;typedef u32 acpi_io_address ;typedef u32 acpi_physical_address ;
@@ -202,10 +202,6 @@ typedef u32 acpi_physical_address;#error unknown ACPI_MACHINE_WIDTH#endif -/* Variable-width type, used instead of clib size_t */ - -typedef acpi_native_uint acpi_size ; -/******************************************************************************* * * OS-dependent and compiler-dependent types
@@ -219,7 +215,7 @@ typedef acpi_native_uint acpi_size;/* Value returned by acpi_os_get_thread_id */ #ifndef acpi_thread_id -#define acpi_thread_id acpi_native_uint +#define acpi_thread_id acpi_size#endif /* Object returned from acpi_os_create_lock */
@@ -231,7 +227,7 @@ typedef acpi_native_uint acpi_size;/* Flags for acpi_os_acquire_lock/acpi_os_release_lock */ #ifndef acpi_cpu_flags -#define acpi_cpu_flags acpi_native_uint +#define acpi_cpu_flags acpi_size#endif /* Object returned from acpi_os_create_cache */
include/acpi/acutils.h +2 -2
@@ -172,7 +172,7 @@ char *acpi_ut_strstr(char *string1, char *string2);void *acpi_ut_memcpy (void *dest,const void *src,acpi_size count); -void *acpi_ut_memset (void *dest,acpi_native_uint value,acpi_size count); +void *acpi_ut_memset (void *dest,u8 value,acpi_size count);int acpi_ut_to_upper (int c);
@@ -476,7 +476,7 @@ u8 acpi_ut_valid_acpi_name(u32 name);acpi_name acpi_ut_repair_name (char *name); -u8 acpi_ut_valid_acpi_char (char character,acpi_native_uint position); +u8 acpi_ut_valid_acpi_char (char character,u32 position);acpi_status acpi_ut_strtoul64 (char *string,u32 base,acpi_integer * ret_integer);
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 19/70 ACPICA: Removed unused include files from source files
In reply to Len BrownFrom: Bob Moore <[email protected]>
Quoted 1 line
From lint.
--- drivers/acpi/executer/excreate.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-)
drivers/acpi/executer/excreate.c +0 -2
@@ -45,8 +45,6 @@#include <acpi/acinterp.h> #include <acpi/amlcode.h> #include <acpi/acnamesp.h> -#include <acpi/acevents.h> -#include <acpi/actables.h> #define _COMPONENT ACPI_EXECUTERACPI_MODULE_NAME ("excreate" )
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 20/70 ACPICA: Several lint changes, no functional changes
In reply to Len BrownFrom: Bob Moore <[email protected]>
Remove pointer cast warnings and fix for a debug printf.
--- drivers/acpi/executer/exprep.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
drivers/acpi/executer/exprep.c +4 -4
@@ -503,11 +503,11 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)*/ second_desc = obj_desc->common.next_object; second_desc->extra.aml_start = - ((union acpi_parse_object *)(info->data_register_node))-> - named.data; + ACPI_CAST_PTR(union acpi_parse_object, + info->data_register_node)->named.data; second_desc->extra.aml_length = - ((union acpi_parse_object *)(info->data_register_node))-> - named.length; + ACPI_CAST_PTR(union acpi_parse_object, + info->data_register_node)->named.length;break ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 21/70 ACPICA: Add const qualifier for appropriate string constants
In reply to Len BrownFrom: Bob Moore <[email protected]>
Mostly MODULE_NAME and printf format strings.
--- drivers/acpi/executer/exdump.c | 5 ++- drivers/acpi/namespace/nsutils.c | 24 +++++++------ drivers/acpi/utilities/utalloc.c | 5 ++- drivers/acpi/utilities/utdebug.c | 26 +++++++++----- drivers/acpi/utilities/utmisc.c | 11 +++--- drivers/acpi/utilities/utobject.c | 5 ++- include/acpi/acinterp.h | 5 ++- include/acpi/aclocal.h | 4 +- include/acpi/acmacros.h | 2 +- include/acpi/acnamesp.h | 20 ++++++----- include/acpi/acutils.h | 66 +++++++++++++++++++++--------------- 11 files changed, 99 insertions(+), 74 deletions(-)
drivers/acpi/executer/exdump.c +3 -2
@@ -771,9 +771,10 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)void acpi_ex_dump_operands (union acpi_operand_object **operands,acpi_interpreter_mode interpreter_mode, -char *ident, +const char *ident,u32 num_levels, -char *note,char *module_name,u32 line_number) +const char *note, +const char *module_name,u32 line_number) {u32 i;
drivers/acpi/namespace/nsutils.c +13 -11
@@ -73,9 +73,9 @@ acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node *node_to_search);******************************************************************************/ void -acpi_ns_report_error (char *module_name, +acpi_ns_report_error (const char *module_name,u32 line_number, -char *internal_name,acpi_status lookup_status) +const char *internal_name,acpi_status lookup_status) {acpi_status status;u32 bad_name;
@@ -130,11 +130,11 @@ acpi_ns_report_error(char *module_name,******************************************************************************/ void -acpi_ns_report_method_error (char *module_name, +acpi_ns_report_method_error (const char *module_name,u32 line_number, -char *message, +const char *message,struct acpi_namespace_node *prefix_node, -char *path,acpi_status method_status) +const char *path,acpi_status method_status) {acpi_status status;struct acpi_namespace_node *node = prefix_node;
@@ -167,7 +167,8 @@ acpi_ns_report_method_error(char *module_name,******************************************************************************/ void -acpi_ns_print_node_pathname (struct acpi_namespace_node *node,char *message) +acpi_ns_print_node_pathname (struct acpi_namespace_node *node, +const char *message) {struct acpi_buffer buffer;acpi_status status;
@@ -296,7 +297,7 @@ u32 acpi_ns_local(acpi_object_type type)void acpi_ns_get_internal_name_length (struct acpi_namestring_info *info) { -char *next_external_char; +const char *next_external_char;u32 i;ACPI_FUNCTION_ENTRY ();
@@ -363,7 +364,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info) {u32 num_segments = info->num_segments;char *internal_name = info->internal_name; -char *external_name = info->next_external_char; +const char *external_name = info->next_external_char;char *result =NULL ;u32 i;
@@ -471,7 +472,8 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)* *******************************************************************************/ -acpi_status acpi_ns_internalize_name (char *external_name,char **converted_name) +acpi_status +acpi_ns_internalize_name (const char *external_name,char **converted_name) {char *internal_name;struct acpi_namestring_info info;
@@ -527,7 +529,7 @@ acpi_status acpi_ns_internalize_name(char *external_name, char **converted_name)acpi_status acpi_ns_externalize_name (u32 internal_name_length, -char *internal_name, +const char *internal_name,u32 * converted_name_length,char **converted_name) {u32 names_index =0 ;
@@ -821,7 +823,7 @@ u32 acpi_ns_opens_scope(acpi_object_type type)acpi_status acpi_ns_get_node (struct acpi_namespace_node *prefix_node, -char *pathname, +const char *pathname,u32 flags,struct acpi_namespace_node **return_node) {union acpi_generic_state scope_info;
drivers/acpi/utilities/utalloc.c +3 -2
@@ -309,7 +309,8 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer,* ******************************************************************************/ -void *acpi_ut_allocate (acpi_size size,u32 component,char *module,u32 line) +void *acpi_ut_allocate (acpi_size size, +u32 component,const char *module,u32 line) {void *allocation;
@@ -353,7 +354,7 @@ void *acpi_ut_allocate(acpi_size size, u32 component, char *module, u32 line)******************************************************************************/ void *acpi_ut_allocate_zeroed (acpi_size size, -u32 component,char *module,u32 line) +u32 component,const char *module,u32 line) {void *allocation;
drivers/acpi/utilities/utdebug.c +16 -10
@@ -157,7 +157,8 @@ void ACPI_INTERNAL_VAR_XFACE acpi_ut_debug_print(u32 requested_debug_level, u32 line_number, const char *function_name, - char *module_name, u32 component_id, char *format, ...) + const char *module_name, + u32 component_id, const char *format, ...) { acpi_thread_id thread_id;va_list args;
@@ -228,7 +229,8 @@ void ACPI_INTERNAL_VAR_XFACE acpi_ut_debug_print_raw(u32 requested_debug_level, u32 line_number, const char *function_name, - char *module_name, u32 component_id, char *format, ...) + const char *module_name, + u32 component_id, const char *format, ...) { va_list args;
@@ -261,7 +263,8 @@ ACPI_EXPORT_SYMBOL(acpi_ut_debug_print_raw)******************************************************************************/ void acpi_ut_trace (u32 line_number, -const char *function_name,char *module_name,u32 component_id) +const char *function_name, +const char *module_name,u32 component_id) { acpi_gbl_nesting_level++;
@@ -293,7 +296,7 @@ ACPI_EXPORT_SYMBOL(acpi_ut_trace)void acpi_ut_trace_ptr (u32 line_number,const char *function_name, -char *module_name,u32 component_id,void *pointer) +const char *module_name,u32 component_id,void *pointer) { acpi_gbl_nesting_level++;acpi_ut_track_stack_ptr ();
@@ -324,7 +327,7 @@ acpi_ut_trace_ptr(u32 line_number,void acpi_ut_trace_str (u32 line_number,const char *function_name, -char *module_name,u32 component_id,char *string) +const char *module_name,u32 component_id,char *string) { acpi_gbl_nesting_level++;
@@ -356,7 +359,7 @@ acpi_ut_trace_str(u32 line_number,void acpi_ut_trace_u32 (u32 line_number,const char *function_name, -char *module_name,u32 component_id,u32 integer) +const char *module_name,u32 component_id,u32 integer) { acpi_gbl_nesting_level++;
@@ -386,7 +389,8 @@ acpi_ut_trace_u32(u32 line_number,void acpi_ut_exit (u32 line_number, -const char *function_name,char *module_name,u32 component_id) +const char *function_name, +const char *module_name,u32 component_id) { acpi_ut_debug_print(ACPI_LV_FUNCTIONS,
@@ -417,7 +421,8 @@ ACPI_EXPORT_SYMBOL(acpi_ut_exit)void acpi_ut_status_exit (u32 line_number,const char *function_name, -char *module_name,u32 component_id,acpi_status status) +const char *module_name, +u32 component_id,acpi_status status) {if (ACPI_SUCCESS (status)) {
@@ -458,7 +463,8 @@ ACPI_EXPORT_SYMBOL(acpi_ut_status_exit)void acpi_ut_value_exit (u32 line_number,const char *function_name, -char *module_name,u32 component_id,acpi_integer value) +const char *module_name, +u32 component_id,acpi_integer value) { acpi_ut_debug_print(ACPI_LV_FUNCTIONS,
@@ -490,7 +496,7 @@ ACPI_EXPORT_SYMBOL(acpi_ut_value_exit)void acpi_ut_ptr_exit (u32 line_number,const char *function_name, -char *module_name,u32 component_id,u8 * ptr) +const char *module_name,u32 component_id,u8 *ptr) { acpi_ut_debug_print(ACPI_LV_FUNCTIONS,
drivers/acpi/utilities/utmisc.c +6 -5
@@ -1020,7 +1020,7 @@ acpi_ut_walk_package_tree(union acpi_operand_object * source_object,******************************************************************************/ void ACPI_INTERNAL_VAR_XFACE -acpi_ut_error (char *module_name,u32 line_number,char *format, ...) +acpi_ut_error (const char *module_name,u32 line_number,const char *format, ...) {va_list args;
@@ -1033,8 +1033,8 @@ acpi_ut_error(char *module_name, u32 line_number, char *format, ...) } void ACPI_INTERNAL_VAR_XFACE -acpi_ut_exception (char *module_name, -u32 line_number,acpi_status status,char *format, ...) +acpi_ut_exception (const char *module_name, +u32 line_number,acpi_status status,const char *format, ...) {va_list args;
@@ -1050,7 +1050,8 @@ acpi_ut_exception(char *module_name,EXPORT_SYMBOL (acpi_ut_exception); void ACPI_INTERNAL_VAR_XFACE -acpi_ut_warning (char *module_name,u32 line_number,char *format, ...) +acpi_ut_warning (const char *module_name, +u32 line_number,const char *format, ...) {va_list args;
@@ -1063,7 +1064,7 @@ acpi_ut_warning(char *module_name, u32 line_number, char *format, ...) } void ACPI_INTERNAL_VAR_XFACE -acpi_ut_info (char *module_name,u32 line_number,char *format, ...) +acpi_ut_info (const char *module_name,u32 line_number,const char *format, ...) {va_list args;
drivers/acpi/utilities/utobject.c +3 -2
@@ -83,7 +83,8 @@ acpi_ut_get_element_length(u8 object_type,* ******************************************************************************/ -union acpi_operand_object *acpi_ut_create_internal_object_dbg (char *module_name, +union acpi_operand_object *acpi_ut_create_internal_object_dbg (const char + *module_name,u32 line_number,u32 component_id, acpi_object_type
@@ -347,7 +348,7 @@ u8 acpi_ut_valid_internal_object(void *object)* ******************************************************************************/ -void *acpi_ut_allocate_object_desc_dbg (char *module_name, +void *acpi_ut_allocate_object_desc_dbg (const char *module_name,u32 line_number,u32 component_id) {union acpi_operand_object *object;
include/acpi/acinterp.h +3 -2
@@ -367,9 +367,10 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth);void acpi_ex_dump_operands (union acpi_operand_object **operands,acpi_interpreter_mode interpreter_mode, -char *ident, +const char *ident,u32 num_levels, -char *note,char *module_name,u32 line_number); +const char *note, +const char *module_name,u32 line_number);#ifdef ACPI_FUTURE_USAGE void
include/acpi/aclocal.h +2 -2
@@ -282,8 +282,8 @@ struct acpi_predefined_names {/* Info structure used to convert external<->internal namestrings */ struct acpi_namestring_info { -char *external_name; -char *next_external_char; +const char *external_name; +const char *next_external_char;char *internal_name;u32 length;u32 num_segments;
include/acpi/acmacros.h +1 -1
@@ -414,7 +414,7 @@ struct acpi_integer_overlay {* error messages. The __FILE__ macro is not very useful for this, because it * often includes the entire pathname to the module */ -#define ACPI_MODULE_NAME (name) static char ACPI_UNUSED_VAR _acpi_module_name[] = name; +#define ACPI_MODULE_NAME (name) static const char ACPI_UNUSED_VAR _acpi_module_name[] = name;#else #define ACPI_MODULE_NAME (name)#endif
include/acpi/acnamesp.h +11 -9
@@ -199,7 +199,7 @@ acpi_ns_pattern_match(struct acpi_namespace_node *obj_node, char *search_for);acpi_status acpi_ns_get_node (struct acpi_namespace_node *prefix_node, -char *external_pathname, +const char *external_pathname,u32 flags,struct acpi_namespace_node **out_node);acpi_size acpi_ns_get_pathname_length (struct acpi_namespace_node *node);
@@ -263,28 +263,30 @@ acpi_object_type acpi_ns_get_type(struct acpi_namespace_node *node);u32 acpi_ns_local (acpi_object_type type);void -acpi_ns_report_error (char *module_name, +acpi_ns_report_error (const char *module_name,u32 line_number, -char *internal_name,acpi_status lookup_status); +const char *internal_name,acpi_status lookup_status);void -acpi_ns_report_method_error (char *module_name, +acpi_ns_report_method_error (const char *module_name,u32 line_number, -char *message, +const char *message,struct acpi_namespace_node *node, -char *path,acpi_status lookup_status); +const char *path,acpi_status lookup_status); -void acpi_ns_print_node_pathname (struct acpi_namespace_node *node,char *msg); +void +acpi_ns_print_node_pathname (struct acpi_namespace_node *node,const char *msg);acpi_status acpi_ns_build_internal_name (struct acpi_namestring_info *info);void acpi_ns_get_internal_name_length (struct acpi_namestring_info *info); -acpi_status acpi_ns_internalize_name (char *dotted_name,char **converted_name); +acpi_status +acpi_ns_internalize_name (const char *dotted_name,char **converted_name);acpi_status acpi_ns_externalize_name (u32 internal_name_length, -char *internal_name, +const char *internal_name,u32 * converted_name_length,char **converted_name);struct acpi_namespace_node *acpi_ns_map_handle_to_node (acpi_handle handle);
include/acpi/acutils.h +38 -28
151 lines not on this page · raw message
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 22/70 ACPICA: Update version to 20080514
In reply to Len BrownFrom: Bob Moore <[email protected]>
Update version to 20080514
--- include/acpi/acconfig.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/acpi/acconfig.h +1 -1
@@ -63,7 +63,7 @@/* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20080321 +#define ACPI_CA_VERSION 0x20080514/* * OS name, used for the _OS object. The _OS object is essentially obsolete,
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 23/70 ACPICA: Workaround for reversed _PRT entries from BIOS
In reply to Len BrownFrom: Bob Moore <[email protected]>
Some BIOSs erroneously reverse the _PRT SourceName and the SourceIndex. Detect and repair this problem. MS ACPI also allows and repairs this problem, thus ACPICA must also.
--- drivers/acpi/resources/rscreate.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-)
drivers/acpi/resources/rscreate.c +17 -0
@@ -285,6 +285,23 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, }/* +* If the BIOS has erroneously reversed the _PRT source_name (index 2) +* and the source_index (index 3), fix it. _PRT is important enough to +* workaround this BIOS error. This also provides compatibility with +* other ACPI implementations. +*/ + obj_desc = sub_object_list[3 ]; +if (!obj_desc + || (ACPI_GET_OBJECT_TYPE (obj_desc) !=ACPI_TYPE_INTEGER )) { + sub_object_list[3 ] = sub_object_list[2 ]; + sub_object_list[2 ] = obj_desc; + +ACPI_WARNING ((AE_INFO , +"(PRT[%X].Source) SourceName and SourceIndex are reversed, fixed" , + index)); + } + +/* * 3) Third subobject: Dereference the PRT.source_name * The name may be unresolved (slack mode), so allow a null object */
Signature · 1 line
1.5.6
Check for BIOS bugs - Original Subject: Re: [PATCH 23/70] ACPICA: Workaround for reversed _PRT entries from BIOS
Quoted 5 lines · On Friday 20 June 2008 09:43:25 Len Brown wrote:
From: Bob Moore <[email protected]>
Some BIOSs erroneously reverse the
_PRTSourceName and the SourceIndex. Detect and repair this problem. MS ACPI also allows and repairs this problem, thus ACPICA must also.
It would be great to have an interface to report this as a BIOS defect.
Something like:
FIRMWARE_BUG_ON(FIRM_WARN, "erroneously reversed the _PRT source_name", ACPI_ Bug);
FIRMWARE_BUG_ON(severity, description, component);
If say CONFIG_FIRMWARE_DEBUG is set this could send a netlink event to userspace and e.g. linuxfirmwarekit can grab it.
linuxfirmwarekit currently implements it's own scripts and even worse, parses dmesg to find BIOS bugs, which is not really maintenable.
IMO the kernel developers themselves need an interface where they can report bugs while seeing and fixing them.
Huang Cheng posted a nice patch on the linuxfirmwarekit list a while ago (unfortunately the patch was attached not inlined):
http://www.bughost.org/pipermail/firmwarekit-discuss/2008-March/000166.html
I mean it needs some cleanup (e.g. the file name was the bug number, there need to be a general interface created, e.g. as shown above, etc.). But this is IMO a good idea and might be worth adding to the kernel (when written :) ).
Comments?
Thomas
PS: I added Bjorn as in the PNP parts BIOSes are pretty much messed up. One reason is that AFAIK ACPI parts are glued together. Having dozens/hundreds of device declarations in a BIOS of which huge parts have not been written by yourself, it is very hard for vendors to check for correctness. While Bjorn and others are adding quirks and workarounds for specific devices, machines or general BIOS bugs it would be great to be able to point vendors to these bugs by a simple tool.
Quoted 35 lines
Signed-off-by Bob Moore <[email protected]>Signed-off-by Lin Ming <[email protected]>Signed-off-by Len Brown <[email protected]>--- drivers/acpi/resources/rscreate.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-)(quoted diff) +0
-0
b/drivers/acpi/resources/rscreate.cindex faddaee..70c84ec 100644drivers/acpi/resources/rscreate.c +16
-0@@ -285,6 +285,23 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, }/* +* If the BIOS has erroneously reversed the _PRT source_name (index 2) +* and the source_index (index 3), fix it. _PRT is important enough to +* workaround this BIOS error. This also provides compatibility with +* other ACPI implementations. +*/ + obj_desc = sub_object_list[3 ]; +if (!obj_desc + || (ACPI_GET_OBJECT_TYPE (obj_desc) !=ACPI_TYPE_INTEGER )) { + sub_object_list[3 ] = sub_object_list[2 ]; + sub_object_list[2 ] = obj_desc; + +ACPI_WARNING ((AE_INFO , +"(PRT[%X].Source) SourceName and SourceIndex are reversed, fixed", + index)); + } + +/* * 3) Third subobject: Dereference the PRT.source_name * The name may be unresolved (slack mode), so allow a null object */
Re: Check for BIOS bugs - Original Subject: Re: [PATCH 23/70] ACPICA: Workaround for reversed _PRT entries from BIOS
Hi!
Quoted 4 lines
Quoted 3 lines
Some BIOSs erroneously reverse the
_PRTSourceName and the SourceIndex. Detect and repair this problem. MS ACPI also allows and repairs this problem, thus ACPICA must also.
Quoted 8 lines
It would be great to have an interface to report this as a BIOS defect.
Something like:
FIRMWARE_BUG_ON(FIRM_WARN, "erroneously reversed the _PRT source_name", ACPI_ Bug);
FIRMWARE_BUG_ON(severity, description, component);
Yes, please.
I'd also like HARDWARE_BUG_ON(), with similar usage.
With all the preload-linux-on-foo project, we have some chance to make BIOS vendors fix their stuff if we can easily diagnose errors in there.
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: Check for BIOS bugs - Original Subject: Re: [PATCH 23/70] ACPICA: Workaround for reversed _PRT entries from BIOS
Quoted 13 lines · Pavel Machek
Hi!
Quoted 10 lines
Quoted 3 lines
Some BIOSs erroneously reverse the
_PRTSourceName and the SourceIndex. Detect and repair this problem. MS ACPI also allows and repairs this problem, thus ACPICA must also.It would be great to have an interface to report this as a BIOS defect.
Something like:
FIRMWARE_BUG_ON(FIRM_WARN, "erroneously reversed the _PRT source_name", ACPI_ Bug);
FIRMWARE_BUG_ON(severity, description, component);
Quoted 7 lines
Yes, please.
I'd also like
HARDWARE_BUG_ON(), with similar usage.With all the preload-linux-on-foo project, we have some chance to make BIOS vendors fix their stuff if we can easily diagnose errors in there.
also we can tie this to kerneloops.org to make a list of top known firmware/hardware bugs, seperate from the kernel code bugs
Quoted 1 line
RE: Check for BIOS bugs - Original Subject: Re: [PATCH 23/70] ACPICA: Workaround for reversed _PRT entries from BIOS
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Some BIOSs erroneously reverse the
_PRTSourceName and the SourceIndex. Detect and repair this problem. MS ACPI also allows and repairs this problem, thus ACPICA must also.
Quoted 12 lines
Quoted 1 line
Quoted 1 line
It would be great to have an interface to report this as a
BIOS defect.
Quoted 4 lines
Quoted 4 lines
Something like:
FIRMWARE_BUG_ON(FIRM_WARN, "erroneously reversed the
_PRT
source_name",ACPI_Quoted 5 lines
Quoted 3 lines
Bug);
FIRMWARE_BUG_ON(severity, description, component);Yes, please.
I'm not excited about maintaining
maintaining linux-as-a-firmware-diagnostic --
particularly when...
1. it clutters the code for normail machines
2. finding the bug is pointless, because even
if you fix one machine, you are guaranteed to not fix all machines and thus must maintain
the workaround anyway.
Quoted 6 lines
Quoted 6 lines
I'd also like
HARDWARE_BUG_ON(), with similar usage.With all the preload-linux-on-foo project, we have some chance to make
BIOS vendors fix their stuff if we can easily diagnose errors in there.
These customers should be running
http://linuxfirmwarekit.org/
We do maintain some degree of "high-road ACPI spec checking" with the "acpi=strict" boot option. If we do more of this, I think it should stay under that option.
thanks,
-Len
Re: Check for BIOS bugs - Original Subject: Re: [PATCH 23/70] ACPICA: Workaround for reversed _PRT entries from BIOS
Hi!
Quoted 8 lines
Quoted 3 lines
Quoted 3 lines
Quoted 1 line
FIRMWARE_BUG_ON(severity, description, component);Yes, please.
I'm not excited about maintaining
maintaining linux-as-a-firmware-diagnostic --
particularly when...
Quoted 5 lines
1. it clutters the code for normail machines
2. finding the bug is pointless, because even
if you fix one machine, you are guaranteed to not fix all machines and thus must maintain
the workaround anyway.
Well, at least we can make sure new machines are okay.
Plus, it is nice to know how common hw/BIOS problems are.
Quoted 7 lines
Quoted 6 lines
Quoted 6 lines
I'd also like
HARDWARE_BUG_ON(), with similar usage.With all the preload-linux-on-foo project, we have some chance to make
BIOS vendors fix their stuff if we can easily diagnose errors in there.
Quoted 6 lines
These customers should be running
http://linuxfirmwarekit.org/We do maintain some degree of "high-road ACPI spec checking" with the "acpi=strict" boot option. If we do more of this, I think it should stay under that option.
That's okay with me, but it would be nice to have printk() markup, so that we can tell BIOS/hw bugs from normal kernel messages.
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: Check for BIOS bugs - Original Subject: Re: [PATCH 23/70] ACPICA: Workaround for reversed _PRT entries from BIOS
In reply to Brown, LenQuoted 16 lines · Len
Quoted 16 lines
Quoted 5 lines
Quoted 5 lines
Quoted 3 lines
Some BIOSs erroneously reverse the
_PRTSourceName and the SourceIndex. Detect and repair this problem. MS ACPI also allows and repairs this problem, thus ACPICA must also.It would be great to have an interface to report this as a
BIOS defect.
Quoted 3 lines
Quoted 3 lines
Something like:
FIRMWARE_BUG_ON(FIRM_WARN, "erroneously reversed the
_PRT
source_name",ACPI_Quoted 2 lines
Quoted 2 lines
Bug);
Quoted 7 lines
Quoted 3 lines
Quoted 3 lines
Quoted 1 line
FIRMWARE_BUG_ON(severity, description, component);Yes, please.
I'm not excited about maintaining
maintaining linux-as-a-firmware-diagnostic --
particularly when...
Above is not for ACPI only. But ACPI is probably a candidate which should make use of it.
Quoted 2 lines
1. it clutters the code for normail machines
It is the only disadvantage, "cluttering" the code.
On the other hand, this is an advantage.
While comments like "/* this must not happen, out of spec, etc. */" should normally be added,
kernel developers tend to return -ENODEV and that's it.
A FIRMWARE_BUG("Description") would be compiled out on a production kernel, compiled in for a kernel on which linuxfirmwarekit boots or other debug kernels and would nicely document, not clutter the code.
Quoted 1 line
2. finding the bug is pointless,
No.
Quoted 4 lines
because even
if you fix one machine, you are guaranteed to
not fix all machines and thus must maintain
the workaround anyway.
I expect you want HP to fix their critical shut down temperature of 256 C? If we would have known this, we had made them fix this and a lot other things also.
This is one of dozens of examples...
Quoted 9 lines
Quoted 6 lines
Quoted 6 lines
I'd also like
HARDWARE_BUG_ON(), with similar usage.With all the preload-linux-on-foo project, we have some chance to make
BIOS vendors fix their stuff if we can easily diagnose errors in there.These customers should be running
http://linuxfirmwarekit.org/
It is not worth much.
At least currently and a firmware bug interface to the kernel is about to change this.
1) linuxfirmwarekit is parsing dmesg..., these messages are changing all the time in the kernel.
S390 AFAIK currently indexes all printks to avoid a simple space cleanup to mix up messges. It is not needed to go that far...
2) The rest is done through userspace plugins written in shell/perl or C. But most firmware bugs are absorbed by the kernel already. So there is nothing we could tell OEMs they should correct.
3) 2+3 is unmaintainable. There is enough work in the kernel, now we should write a linuxfirmwarekit plugin for every firmwarebug we find?!?
4) I tried to convince our kernel people to write linuxfirmwarekit plugins with exactly zero response. Hmm wrong, Frank wrote a thermal zone checker, some hundred lines of fragile shell code, it would have been less than ten lines in the kernel, just add some FIRMWARE_BUG(..) in the right if/else conditions. And it's not worth much anymore as soon as thermal_zone is moving to sysfs.
Quoted 3 lines
We do maintain some degree of "high-road ACPI spec checking" with the "acpi=strict" boot option. If we do more of this, I think it should stay under that option.
In the linuxfirmwarekit the ACPI tables are dumped, disassembled and recompiled. The errors and warnings are printed out as ACPI BIOS errors. This works out.
The iasl compiler still is a bit too noisy and cannot disassemble SSDTs correctly (maybe it got fixed, don't know), but this can work out.
The problem is that you only find syntactical bugs.
But there are *a lot* bugs like e.g. critical temperature of 256 C. Or If this object exists, that object must exist. Logic ACPI BIOS bugs can only be found in the kernel itself at runtime.
Ahh Bjorn is in CC..., Wrong opregion declarations and PNP resource declarations are rather common. I mean theoretically you can find this in userspace. Not with disassembling and recompiling but with interpreting the tables in userspace... Again unmaintainable and who should do the checking? The guy who writes the kernel code...
I really like the idea of the linuxfirmwarekit and tried to push it, but I do not see any future for it without kernel support.
Thomas
RE: Check for BIOS bugs - Original Subject: Re: [PATCH 23/70] ACPICA: Workaround for reversed _PRT entries from BIOS
Quoted 7 lines
Quoted 4 lines
I'm not excited about maintaining
maintaining linux-as-a-firmware-diagnostic --
particularly when...Above is not for ACPI only. But ACPI is probably a candidate which should make use of it.
Sure, there may be justification for doing something like this in the kernel, but the issue that started this thread isn't it.
The issue that started this thread can be diagnosed by user-space in linuxfirmwarekit. Multiple machines have this bug, which means that it is "common industry practice" and the kernel has to work around it (silently) if we like it or not.
ie. the issue, now that it is debugged and worked around, is effectly just firmware lint.
thanks,
-Len
Len Brown
reviewerPATCH 24/70 ACPICA: Update DMAR and SRAT table definitions
In reply to Len BrownFrom: Bob Moore <[email protected]>
Synchronized tables with current specifications.
--- arch/x86/kernel/srat_32.c | 3 +-- drivers/acpi/numa.c | 4 ++-- include/acpi/actbl1.h | 19 +++++++++++++++++-- 3 files changed, 20 insertions(+), 6 deletions(-)
arch/x86/kernel/srat_32.c +1 -2
@@ -126,9 +126,8 @@ static void __init parse_memory_affinity_structure (char *sratp) num_memory_chunks++; -printk ("Memory range 0x%lX to 0x%lX (type 0x%X) in proximity domain 0x%02X %s\n" , +printk ("Memory range 0x%lX to 0x%lX in proximity domain 0x%02X %s\n" , start_pfn, end_pfn, - memory_affinity->memory_type, pxm, ((memory_affinity->flags &ACPI_SRAT_MEM_HOT_PLUGGABLE ) ?"enabled and removable" :"enabled" ) );
drivers/acpi/numa.c +2 -2
@@ -120,10 +120,10 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header)struct acpi_srat_mem_affinity *p = (struct acpi_srat_mem_affinity *)header; ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "SRAT Memory (0x%lx length 0x%lx type 0x%x) in proximity domain %d %s%s\n", + "SRAT Memory (0x%lx length 0x%lx) in proximity domain %d %s%s\n", (unsigned long)p->base_address, (unsigned long)p->length, - p->memory_type, p->proximity_domain, + p->proximity_domain, (p->flags & ACPI_SRAT_MEM_ENABLED)? "enabled" : "disabled", (p->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)?
include/acpi/actbl1.h +17 -2
@@ -300,6 +300,7 @@ struct acpi_table_dbgp {/******************************************************************************* * * DMAR - DMA Remapping table +* From "Intel Virtualization Technology for Directed I/O", Sept. 2007 * ******************************************************************************/
@@ -382,6 +383,20 @@ struct acpi_dmar_reserved_memory {#define ACPI_DMAR_ALLOW_ALL (1) + +/* 2: Root Port ATS Capability Reporting Structure */ + +struct acpi_dmar_atsr { +struct acpi_dmar_header header; +u8 flags; +u8 reserved; +u16 segment; +}; + +/* Flags */ + +#define ACPI_DMAR_ALL_PORTS (1) +/******************************************************************************* * * ECDT - Embedded Controller Boot Resources Table
@@ -1156,9 +1171,9 @@ struct acpi_srat_mem_affinity {u16 reserved;/* Reserved, must be zero */ u64 base_address;u64 length; -u32 memory_type;/* See acpi_address_range_id */ +u32 reserved1;u32 flags; -u64 reserved1;/* Reserved, must be zero */ +u64 reserved2;/* Reserved, must be zero */ };/* Flags */
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 25/70 ACPICA: Update disassembler for DMAR table changes
In reply to Len BrownFrom: Bob Moore <[email protected]>
Now supports the 2007 intel Virtualization Technology for Directed I/O specification.
--- include/acpi/acdisasm.h | 1 + include/acpi/actbl1.h | 4 ++++ 2 files changed, 5 insertions(+), 0 deletions(-)
include/acpi/acdisasm.h +1 -0
@@ -162,6 +162,7 @@ extern struct acpi_dmtable_info acpi_dm_table_info_dmar_hdr[];extern struct acpi_dmtable_info acpi_dm_table_info_dmar_scope[];extern struct acpi_dmtable_info acpi_dm_table_info_dmar0[];extern struct acpi_dmtable_info acpi_dm_table_info_dmar1[]; +extern struct acpi_dmtable_info acpi_dm_table_info_dmar2[];extern struct acpi_dmtable_info acpi_dm_table_info_ecdt[];extern struct acpi_dmtable_info acpi_dm_table_info_einj[];extern struct acpi_dmtable_info acpi_dm_table_info_einj0[];
include/acpi/actbl1.h +4 -0
@@ -311,6 +311,10 @@ struct acpi_table_dmar {u8 reserved[10 ]; }; +/* Flags */ + +#define ACPI_DMAR_INTR_REMAP (1) +/* DMAR subtable header */ struct acpi_dmar_header {
Signature · 1 line
1.5.6
Re: [PATCH 25/70] ACPICA: Update disassembler for DMAR table changes
Quoted 3 lines · Len Brown
extern struct
acpi_dmtable_infoacpi_dm_table_info_dmar1[];
+extern structacpi_dmtable_infoacpi_dm_table_info_dmar2[];
extern structacpi_dmtable_infoacpi_dm_table_info_ecdt[];
Maybe I'm missing something here, but we don't actually seem to have the disassembler code in Linux? It would be nice if we did (as a debug option) - I'd love to be able to dump a disassembled version of what's actually getting executed in response to events.
Signature · 1 line
Matthew Garrett | [email protected]
Len Brown
reviewerRe: [PATCH 25/70] ACPICA: Update disassembler for DMAR table changes
Quoted 9 lines · Matthew Garrett
Quoted 3 lines · Len Brown
extern struct
acpi_dmtable_infoacpi_dm_table_info_dmar1[];
+extern structacpi_dmtable_infoacpi_dm_table_info_dmar2[];
extern structacpi_dmtable_infoacpi_dm_table_info_ecdt[];Maybe I'm missing something here, but we don't actually seem to have the disassembler code in Linux? It would be nice if we did (as a debug option) - I'd love to be able to dump a disassembled version of what's actually getting executed in response to events.
this patch and others like it are obviously just to keep Linux in sync with ACPICA to minimize the diff we must track.
But there is actually quite a bit in ACPICA that is not in Linux. The most useful, from a debugging point of view, might be the hooking the ACPICA debug code into the kernel debugger -- something that Luming did about 2 years ago. However, as the debugger was not part of the Linux kernel tree, the changes didn't really have a good path to a customer...
-Len
Re: [PATCH 25/70] ACPICA: Update disassembler for DMAR table changes
Quoted 7 lines · Len Brown
But there is actually quite a bit in ACPICA that is not in Linux. The most useful, from a debugging point of view, might be the hooking the ACPICA debug code into the kernel debugger -- something that Luming did about 2 years ago. However, as the debugger was not part of the Linux kernel tree, the changes didn't really have a good path to a customer...
kgdb supports remote function calls, so if you just make a callable interface and perhaps supply a standard macro file users could call it.
-Andi
Len Brown
reviewerRe: [PATCH 25/70] ACPICA: Update disassembler for DMAR table changes
Quoted 9 lines · Andi Kleen
Quoted 7 lines · Len Brown
But there is actually quite a bit in ACPICA that is not in Linux. The most useful, from a debugging point of view, might be the hooking the ACPICA debug code into the kernel debugger -- something that Luming did about 2 years ago. However, as the debugger was not part of the Linux kernel tree, the changes didn't really have a good path to a customer...
Quoted 3 lines
kgdb supports remote function calls, so if you just make a callable interface and perhaps supply a standard macro file users could call it.
at some point we need to seriously consider "productizing" the ACPICA hooks to kgdb. I guess this is one for the to-do list.
-len
Re: [PATCH 25/70] ACPICA: Update disassembler for DMAR table changes
In reply to Len BrownQuoted 4 lines · Len Brown
From: Bob Moore <[email protected]>
Now supports the 2007 intel Virtualization Technology for Directed I/O specification.
This patch does nothing? It just adds declarations and unused symbols
-Andi
Quoted 43 lines
Signed-off-by Bob Moore <[email protected]>Signed-off-by Lin Ming <[email protected]>Signed-off-by Len Brown <[email protected]>--- include/acpi/acdisasm.h | 1 + include/acpi/actbl1.h | 4 ++++ 2 files changed, 5 insertions(+), 0 deletions(-)include/acpi/acdisasm.h +1
-0@@ -162,6 +162,7 @@ extern struct acpi_dmtable_info acpi_dm_table_info_dmar_hdr[];extern struct acpi_dmtable_info acpi_dm_table_info_dmar_scope[];extern struct acpi_dmtable_info acpi_dm_table_info_dmar0[];extern struct acpi_dmtable_info acpi_dm_table_info_dmar1[]; +extern struct acpi_dmtable_info acpi_dm_table_info_dmar2[];extern struct acpi_dmtable_info acpi_dm_table_info_ecdt[];extern struct acpi_dmtable_info acpi_dm_table_info_einj[];extern struct acpi_dmtable_info acpi_dm_table_info_einj0[];include/acpi/actbl1.h +4
-0@@ -311,6 +311,10 @@ struct acpi_table_dmar {u8 reserved[10 ]; }; +/* Flags */ + +#define ACPI_DMAR_INTR_REMAP (1) +/* DMAR subtable header */ struct acpi_dmar_header {Signature · 6 lines
1.5.6 -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH 25/70] ACPICA: Update disassembler for DMAR table changes
Quoted 1 line
This patch does nothing? It just adds declarations and unused symbols
That's right.
this patch is from an upstream ACPICA patch -- but Linux doesn't use all of ACPICA's files.
The reason we apply these is to keep upstream ACPICA and downstream Linux shared files as close as possible because manging divergence is extremely labor intensive.
-Len
Len Brown
reviewerPATCH 26/70 ACPICA: Fix for invalid large array index on 64-bit systems
In reply to Len BrownFrom: Bob Moore <[email protected]>
This problem was introduced in 20080514 as a result of the elimination of the acpi_native_uint type. Code uses a negative array index, which should be eliminated.
--- drivers/acpi/executer/exdump.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/acpi/executer/exdump.c +1 -1
@@ -776,7 +776,7 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,const char *note, const char *module_name, u32 line_number) { - u32 i; + s32 i;ACPI_FUNCTION_NAME (ex_dump_operands);
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 27/70 ACPICA: Cleanup debug operand dump mechanism
In reply to Len BrownFrom: Bob Moore <[email protected]>
Eliminated unnecessary operands; eliminated use of negative index in loop. Operands now displayed in correct order, not backwards.
--- drivers/acpi/dispatcher/dsopcode.c | 20 +--------- drivers/acpi/dispatcher/dswexec.c | 8 ---- drivers/acpi/executer/exdump.c | 68 ++++++++++++++---------------------- drivers/acpi/executer/exresop.c | 4 ++ drivers/acpi/executer/exstore.c | 6 --- drivers/acpi/namespace/nsdump.c | 4 +- include/acpi/acinterp.h | 6 +--- include/acpi/acmacros.h | 4 +- 8 files changed, 37 insertions(+), 83 deletions(-)
drivers/acpi/dispatcher/dsopcode.c +2 -18
@@ -691,12 +691,6 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, status =acpi_ex_resolve_operands (op->common.aml_opcode,ACPI_WALK_OPERANDS , walk_state); - -ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS ,ACPI_IMODE_EXECUTE , -acpi_ps_get_opcode_name (op->common.aml_opcode), - walk_state->num_operands, -"after AcpiExResolveOperands" ); -if (ACPI_FAILURE (status)) { ACPI_ERROR((AE_INFO, "(%s) bad operand(s) (%X)", acpi_ps_get_opcode_name(op->common.aml_opcode),
@@ -785,10 +779,6 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,return_ACPI_STATUS (status); } -ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS ,ACPI_IMODE_EXECUTE , -acpi_ps_get_opcode_name (op->common.aml_opcode), -1 ,"after AcpiExResolveOperands" ); - obj_desc =acpi_ns_get_attached_object (node);if (!obj_desc) {return_ACPI_STATUS (AE_NOT_EXIST );
@@ -882,10 +872,6 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,return_ACPI_STATUS (status); } -ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS ,ACPI_IMODE_EXECUTE , -acpi_ps_get_opcode_name (op->common.aml_opcode), -1 ,"after AcpiExResolveOperands" ); - operand = &walk_state->operands[0 ];/* Find the ACPI table */
@@ -1091,10 +1077,8 @@ acpi_ds_eval_bank_field_operands(struct acpi_walk_state *walk_state,return_ACPI_STATUS (status); } -ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS ,ACPI_IMODE_EXECUTE , -acpi_ps_get_opcode_name (op->common.aml_opcode), -1 ,"after AcpiExResolveOperands" ); - +ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS , +acpi_ps_get_opcode_name (op->common.aml_opcode),1 );/* * Get the bank_value operand and save it * (at Top of stack)
drivers/acpi/dispatcher/dswexec.c +0 -8
@@ -408,14 +408,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) [walk_state-> num_operands - 1]), walk_state); -if (ACPI_SUCCESS (status)) { -ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS , -ACPI_IMODE_EXECUTE , -acpi_ps_get_opcode_name - (walk_state->opcode), - walk_state->num_operands, -"after ExResolveOperands" ); - } }if (ACPI_SUCCESS (status)) {
drivers/acpi/executer/exdump.c +26 -42
106 lines not on this page · raw message
drivers/acpi/executer/exresop.c +4 -0
@@ -698,5 +698,9 @@ acpi_ex_resolve_operands(u16 opcode, } } +ACPI_DUMP_OPERANDS (walk_state->operands, +acpi_ps_get_opcode_name (opcode), + walk_state->num_operands); +return_ACPI_STATUS (status); }
drivers/acpi/executer/exstore.c +0 -6
@@ -343,12 +343,6 @@ acpi_ex_store(union acpi_operand_object *source_desc,acpi_ut_get_object_type_name (dest_desc), dest_desc)); -ACPI_DUMP_STACK_ENTRY (source_desc); -ACPI_DUMP_STACK_ENTRY (dest_desc); -ACPI_DUMP_OPERANDS (&dest_desc,ACPI_IMODE_EXECUTE ,"ExStore" , -2 , -"Target is not a Reference or Constant object" ); -return_ACPI_STATUS (AE_AML_OPERAND_TYPE ); }
drivers/acpi/namespace/nsdump.c +2 -2
@@ -515,12 +515,12 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,if (obj_type >ACPI_TYPE_LOCAL_MAX ) {acpi_os_printf - ("(Ptr to ACPI Object type %X [UNKNOWN])\n" , + ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n" , obj_type); bytes_to_dump =32 ; }else {acpi_os_printf - ("(Ptr to ACPI Object type %X [%s])\n" , + ("(Pointer to ACPI Object type %.2X [%s])\n" , obj_type,acpi_ut_get_type_name (obj_type)); bytes_to_dump =sizeof (union acpi_operand_object );
include/acpi/acinterp.h +1 -5
@@ -366,11 +366,7 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth);void acpi_ex_dump_operands (union acpi_operand_object **operands, -acpi_interpreter_mode interpreter_mode, -const char *ident, -u32 num_levels, -const char *note, -const char *module_name,u32 line_number); +const char *opcode_name,u32 num_opcodes);#ifdef ACPI_FUTURE_USAGE void
include/acpi/acmacros.h +2 -2
@@ -597,7 +597,7 @@ struct acpi_integer_overlay {/* Stack and buffer dumping */ #define ACPI_DUMP_STACK_ENTRY (a) acpi_ex_dump_operand((a),0) -#define ACPI_DUMP_OPERANDS (a,b,c,d,e) acpi_ex_dump_operands(a,b,c,d,e,_acpi_module_name,__LINE__) +#define ACPI_DUMP_OPERANDS (a,b,c) acpi_ex_dump_operands(a,b,c)#define ACPI_DUMP_ENTRY (a,b) acpi_ns_dump_entry (a,b)#define ACPI_DUMP_PATHNAME (a,b,c,d) acpi_ns_dump_pathname(a,b,c,d)
@@ -633,7 +633,7 @@ struct acpi_integer_overlay {#define ACPI_FUNCTION_VALUE_EXIT (s) do { } while(0)#define ACPI_FUNCTION_ENTRY () do { } while(0)#define ACPI_DUMP_STACK_ENTRY (a) do { } while(0) -#define ACPI_DUMP_OPERANDS (a,b,c,d,e) do { } while(0) +#define ACPI_DUMP_OPERANDS (a,b,c) do { } while(0)#define ACPI_DUMP_ENTRY (a,b) do { } while(0)#define ACPI_DUMP_TABLES (a,b) do { } while(0)#define ACPI_DUMP_PATHNAME (a,b,c,d) do { } while(0)
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 28/70 ACPICA: Cleanup of _PRT parsing code
In reply to Len BrownFrom: Bob Moore <[email protected]>
Removed extraneous else clauses, other general cleanup.
--- drivers/acpi/resources/rscreate.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-)
drivers/acpi/resources/rscreate.c +12 -12
@@ -181,9 +181,9 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, }/* -* Loop through the ACPI_INTERNAL_OBJECTS - Each object -* should be a package that in turn contains an -* acpi_integer Address, a u8 Pin, a Name and a u8 source_index. +* Loop through the ACPI_INTERNAL_OBJECTS - Each object should be a +* package that in turn contains an acpi_integer Address, a u8 Pin, +* a Name, and a u8 source_index. */ top_object_list = package_object->package.elements; number_of_elements = package_object->package.count;
@@ -240,9 +240,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,/* 1) First subobject: Dereference the PRT.Address */ obj_desc = sub_object_list[0 ]; -if (ACPI_GET_OBJECT_TYPE (obj_desc) ==ACPI_TYPE_INTEGER ) { - user_prt->address = obj_desc->integer.value; - }else { +if (ACPI_GET_OBJECT_TYPE (obj_desc) !=ACPI_TYPE_INTEGER ) { ACPI_ERROR((AE_INFO, "(PRT[%X].Address) Need Integer, found %s", index,
@@ -250,12 +248,12 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,return_ACPI_STATUS (AE_BAD_DATA ); } + user_prt->address = obj_desc->integer.value; +/* 2) Second subobject: Dereference the PRT.Pin */ obj_desc = sub_object_list[1 ]; -if (ACPI_GET_OBJECT_TYPE (obj_desc) ==ACPI_TYPE_INTEGER ) { - user_prt->pin = (u32 ) obj_desc->integer.value; - }else { +if (ACPI_GET_OBJECT_TYPE (obj_desc) !=ACPI_TYPE_INTEGER ) { ACPI_ERROR((AE_INFO, "(PRT[%X].Pin) Need Integer, found %s", index,
@@ -284,6 +282,8 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, } } + user_prt->pin = (u32 ) obj_desc->integer.value; +/* * If the BIOS has erroneously reversed the _PRT source_name (index 2) * and the source_index (index 3), fix it. _PRT is important enough to
@@ -381,9 +381,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,/* 4) Fourth subobject: Dereference the PRT.source_index */ obj_desc = sub_object_list[source_index_index]; -if (ACPI_GET_OBJECT_TYPE (obj_desc) ==ACPI_TYPE_INTEGER ) { - user_prt->source_index = (u32 ) obj_desc->integer.value; - }else { +if (ACPI_GET_OBJECT_TYPE (obj_desc) !=ACPI_TYPE_INTEGER ) { ACPI_ERROR((AE_INFO, "(PRT[%X].SourceIndex) Need Integer, found %s", index,
@@ -391,6 +389,8 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,return_ACPI_STATUS (AE_BAD_DATA ); } + user_prt->source_index = (u32 ) obj_desc->integer.value; +/* Point to the next union acpi_operand_object in the top level package */ top_object_list++;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 29/70 ACPICA: Fix mutex debug code for wrong loop termination value
In reply to Len BrownFrom: Bob Moore <[email protected]>
Loop was terminating one iteration early, missing one of the debugger handshake mutexes. Linn Crosetto.
--- drivers/acpi/utilities/utmutex.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/acpi/utilities/utmutex.c +2 -2
@@ -218,7 +218,7 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)* the mutex ordering rule. This indicates a coding error somewhere in * the ACPI subsystem code. */ -for (i = mutex_id; i <ACPI_MAX_MUTEX ; i++) { +for (i = mutex_id; i <ACPI_NUM_MUTEX ; i++) {if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) {if (i == mutex_id) { ACPI_ERROR((AE_INFO,
@@ -315,7 +315,7 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)* ordering rule. This indicates a coding error somewhere in * the ACPI subsystem code. */ -for (i = mutex_id; i <ACPI_MAX_MUTEX ; i++) { +for (i = mutex_id; i <ACPI_NUM_MUTEX ; i++) {if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) {if (i == mutex_id) {continue ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 30/70 ACPICA: Update version to 20080609
In reply to Len BrownFrom: Bob Moore <[email protected]>
Update version to 20080609.
--- include/acpi/acconfig.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/acpi/acconfig.h +1 -1
@@ -63,7 +63,7 @@/* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20080514 +#define ACPI_CA_VERSION 0x20080609/* * OS name, used for the _OS object. The _OS object is essentially obsolete,
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 32/70 ACPI: fix checkpatch.pl complaints in scan.c
In reply to Len BrownFrom: Alok N Kataria <[email protected]>
http://bugzilla.kernel.org/show_bug.cgi?id=9772
--- drivers/acpi/scan.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-)
drivers/acpi/scan.c +8 -4
@@ -6,7 +6,8 @@#include <linux/init.h> #include <linux/kernel.h> #include <linux/acpi.h> -#include <asm/signal.h> +#include <linux/signal.h> +#include <linux/kthread.h> #include <acpi/acpi_drivers.h> #include <acpi/acinterp.h> /* for acpi_ex_eisa_id_to_string() */
@@ -154,6 +155,7 @@ acpi_eject_store(struct device *d, struct device_attribute *attr,acpi_status status;acpi_object_type type =0 ;struct acpi_device *acpi_device =to_acpi_device (d); +struct task_struct *task;if ((!count) || (buf[0 ] !='1' )) {return -EINVAL ;
@@ -171,9 +173,11 @@ acpi_eject_store(struct device *d, struct device_attribute *attr, }/* remove the device in another thread to fix the deadlock issue */ - ret =kernel_thread (acpi_bus_hot_remove_device, - acpi_device->handle,SIGCHLD ); - err: + task =kthread_run (acpi_bus_hot_remove_device, + acpi_device->handle,"acpi_hot_remove_device" ); +if (IS_ERR (task)) + ret =PTR_ERR (task); +err:return ret; }
Signature · 1 line
1.5.6
Re: [PATCH 32/70] ACPI: fix checkpatch.pl complaints in scan.c
Quoted 3 lines · Len Brown
From: Alok N Kataria <[email protected]>
This bug has nothing to do with the patch?
"This patch fixes the return value of acpi_eject_store()"
-Andi
Re: [PATCH 32/70] ACPI: fix checkpatch.pl complaints in scan.c
Quoted 10 lines · Andi Kleen
Quoted 3 lines · Len Brown
From: Alok N Kataria <[email protected]>
This bug has nothing to do with the patch?
"This patch fixes the return value of
acpi_eject_store()"
This patch fixes the checkpatch.pl complaints introduced by patch in comment 23 in that bug.
Please look here for the checkpatch.pl complaints..
http://bugzilla.kernel.org/show_bug.cgi?id=9772#c33
Thanks,
Alok
Quoted 1 line
-Andi
Re: [PATCH 32/70] ACPI: fix checkpatch.pl complaints in scan.c
Quoted 8 lines · Alok Kataria
Quoted 7 lines · Andi Kleen
Quoted 3 lines · Len Brown
From: Alok N Kataria <[email protected]>
This bug has nothing to do with the patch?
Quoted 7 lines
Quoted 2 lines
"This patch fixes the return value of
acpi_eject_store()"This patch fixes the checkpatch.pl complaints introduced by patch in comment 23 in that bug.
Please look here for the checkpatch.pl complaints..
http://bugzilla.kernel.org/show_bug.cgi?id=9772#c33
Well that's still not a very useful description, given that you fix a real bug here, not just the usual checkpatch whitspace nops.
Not sure why Len also didn't fast track it. It seems to me like something .26-worthy.
-Andi
Re: [PATCH 32/70] ACPI: fix checkpatch.pl complaints in scan.c
Quoted 12 lines · Andi Kleen
Quoted 11 lines · Alok Kataria
Quoted 9 lines · Andi Kleen
Quoted 3 lines · Len Brown
From: Alok N Kataria <[email protected]>
This bug has nothing to do with the patch?
"This patch fixes the return value of
acpi_eject_store()"
Quoted 8 lines
Quoted 4 lines
This patch fixes the checkpatch.pl complaints introduced by patch in comment 23 in that bug.
Please look here for the checkpatch.pl complaints..
http://bugzilla.kernel.org/show_bug.cgi?id=9772#c33Well that's still not a very useful description, given that you fix a real bug here, not just the usual checkpatch whitspace nops.
Maybe I am overlooking what you are trying to say over here. but, Which real bug ?
Quoted 3 lines
Not sure why Len also didn't fast track it. It seems to me like something .26-worthy.
This patch modifies the code to use kthread_run instead of kernel_thread. The kernel_thread call was introduced by an earlier patch from Zhang Rui which is in comment 23.
Since the patch from Zhang has not reached mainline yet, i fail to understand how can this patch be worthy of .26 ?
Thanks,
Alok
Quoted 3 lines
-Andi
Re: [PATCH 32/70] ACPI: fix checkpatch.pl complaints in scan.c
Alok Kataria <[email protected]> writes:
I misread the patch sorry. It looked like you added error checking, but I didn't notice that the function call had changed too.
Len was right of course.
-Andi
Len Brown
reviewerPATCH 33/70 ACPI: fix acpi fan state set error
In reply to Len BrownFrom: Yi Yang <[email protected]>
Under /proc/acpi, there is a fan control interface, a user can set 0 or 3 to /proc/acpi/fan/*/state, 0 denotes D0 state, 3 denotes D3 state, but in current implementation, a user can set a fan to D1 state by any char excluding '1', '2' and '3'.
For example:
[root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost acpi]# echo "" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: on
[root@localhost acpi]# echo "3" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost acpi]# echo "xxxxx" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: on
Obviously, such inputs as "" and "xxxxx" are invalid for fan state.
This patch fixes this issue, it strictly limits fan state only to accept 0, 1, 2 and 3, any other inputs are invalid.
Before applying this patch, the test result is:
[root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost acpi]# echo "" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: on
[root@localhost acpi]# echo "3" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost acpi]# echo "xxxxx" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: on
[root@localhost acpi]# echo "3" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost acpi]# echo "3x" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost acpi]# echo "-1x" > /proc/acpi/fan/C31B/state [root@localhost acpi]# cat /proc/acpi/fan/C31B/state
status: on
[root@localhost acpi]#
After applying this patch, the test result is:
[root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost ~]# echo "" > /proc/acpi/fan/C31B/state -bash: echo: write error: Invalid argument [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost ~]# echo "3" > /proc/acpi/fan/C31B/state [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost ~]# echo "xxxxx" > /proc/acpi/fan/C31B/state -bash: echo: write error: Invalid argument [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost ~]# echo "-1x" > /proc/acpi/fan/C31B/state -bash: echo: write error: Invalid argument [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost ~]# echo "0" > //proc/acpi/fan/C31B/state [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: on
[root@localhost ~]# echo "4" > //proc/acpi/fan/C31B/state -bash: echo: write error: Invalid argument [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: on
[root@localhost ~]# echo "3" > //proc/acpi/fan/C31B/state [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: off
[root@localhost ~]# echo "0" > //proc/acpi/fan/C31B/state [root@localhost ~]# cat /proc/acpi/fan/C31B/state
status: on
[root@localhost ~]# echo "3x" > //proc/acpi/fan/C31B/state -bash: echo: write error: Invalid argument [root@localhost ~]#
--- drivers/acpi/fan.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
drivers/acpi/fan.c +7 -1
@@ -148,7 +148,7 @@ acpi_fan_write_state(struct file *file, const char __user * buffer,int result =0 ;struct seq_file *m = file->private_data;struct acpi_device *device = m->private; -char state_string[12 ] = {'\0' }; +char state_string[3 ] = {'\0' };if (count >sizeof (state_string) -1 )return -EINVAL ;
@@ -157,6 +157,12 @@ acpi_fan_write_state(struct file *file, const char __user * buffer,return -EFAULT ; state_string[count] ='\0' ; +if ((state_string[0 ] <'0' ) || (state_string[0 ] >'3' )) +return -EINVAL ; +if (state_string[1 ] =='\n' ) + state_string[1 ] ='\0' ; +if (state_string[1 ] !='\0' ) +return -EINVAL ; result =acpi_bus_set_power (device->handle,simple_strtoul (state_string,NULL ,0 ));
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 34/70 ACPI Exception (video-1721): UNKNOWN_STATUS_CODE, Cant attach device
In reply to Len BrownFrom: Zhang Rui <[email protected]>
The child of a video bus device is not alway a video device. It should be a warn message rather than an exception here.
http://bugzilla.kernel.org/show_bug.cgi?id=9761
--- drivers/acpi/video.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/acpi/video.c +2 -1
@@ -1713,7 +1713,8 @@ acpi_video_bus_get_devices(struct acpi_video_bus *video, status =acpi_video_bus_get_one_device (dev, video);if (ACPI_FAILURE (status)) { -ACPI_EXCEPTION ((AE_INFO , status,"Cant attach device" )); +ACPI_DEBUG_PRINT ((ACPI_DB_WARN , +"Cant attach device" ));continue ; } }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 35/70 ACPI: no AC status notification
In reply to Len BrownFrom: Len Brown <[email protected]>
http://bugzilla.kernel.org/show_bug.cgi?id=10695
--- drivers/acpi/ac.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-)
drivers/acpi/ac.c +3 -5
@@ -233,6 +233,9 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data) device = ac->device;switch (event) { +default : +ACPI_DEBUG_PRINT ((ACPI_DB_INFO , +"Unsupported event [0x%x]\n" , event));case ACPI_AC_NOTIFY_STATUS :case ACPI_NOTIFY_BUS_CHECK :case ACPI_NOTIFY_DEVICE_CHECK :
@@ -244,11 +247,6 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)#ifdef CONFIG_ACPI_SYSFS_POWER kobject_uevent (&ac->charger.dev->kobj,KOBJ_CHANGE );#endif -break ; -default : -ACPI_DEBUG_PRINT ((ACPI_DB_INFO , -"Unsupported event [0x%x]\n" , event)); -break ; }return ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 36/70 ACPICA: Fixes warning from exconfig.c on 64-bit build.
In reply to Len BrownFrom: Bob Moore <[email protected]>
drivers/acpi/executer/exconfig.c:99: warning: cast to pointer from integer of different size
--- drivers/acpi/executer/exconfig.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/acpi/executer/exconfig.c +2 -1
@@ -96,7 +96,7 @@ acpi_ex_add_table(u32 table_index,/* Install the new table into the local data structures */ - obj_desc->reference.object =ACPI_CAST_PTR (void, table_index); + obj_desc->reference.object =ACPI_TO_POINTER (table_index);/* Add the table to the namespace */
@@ -359,6 +359,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,ACPI_MEMCPY (table_desc.pointer, obj_desc->buffer.pointer, length); + table_desc.address =ACPI_TO_INTEGER (table_desc.pointer); table_desc.length = length; table_desc.flags =ACPI_TABLE_ORIGIN_ALLOCATED ;break ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 37/70 ACPI: fix processor throttling set error
In reply to Len BrownFrom: Yi Yang <[email protected]>
http://bugzilla.kernel.org/show_bug.cgi?id=9704
When echo some invalid values to /proc/acpi/processor/*/throttling, there isn't any error info returned, on the contray, it sets throttling value to some T* successfully, obviously, this is incorrect, a correct way should be to let it fail and return error info.
This patch fixed the aforementioned issue, it also enables /proc/acpi/processor/*/throttling to accept such values as 't0' and 'T0', it also strictly limits /proc/acpi/processor/*/throttling only to accept
"*", "t*" and "T*", "*" is the throttling state value the processor can
support, current, it is 0 - 7.
Before applying this patch, the test result is below:
[root@localhost acpi]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T1
state available: T0 to T7
states:
T0: 100%
*T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost acpi]# echo "1xxxxxx" > /proc/acpi/processor/CPU0/throttling
[root@localhost acpi]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T1
state available: T0 to T7
states:
T0: 100%
*T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost acpi]# echo "0" > /proc/acpi/processor/CPU0/throttling
[root@localhost acpi]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost acpi]# cd /
[root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost /]# echo "T0" > /proc/acpi/processor/CPU0/throttling
[root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost /]# echo "T7" > /proc/acpi/processor/CPU0/throttling
[root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost /]# echo "T100" > /proc/acpi/processor/CPU0/throttling
[root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost /]# echo "xxx" > /proc/acpi/processor/CPU0/throttling
[root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost /]# echo "2xxxx" > /proc/acpi/processor/CPU0/throttling
[root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T2
state available: T0 to T7
states:
T0: 100%
T1: 87%
*T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost /]# echo "" > /proc/acpi/processor/CPU0/throttling
[root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%[root@localhost /]# echo "7777" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost /]# echo "7xxx" > /proc/acpi/processor/CPU0/throttling [root@localhost /]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T7
state available: T0 to T7
states:
T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
*T7: 12%[root@localhost /]#
After applying this patch, the test result is below:
[root@localhost linux-2.6.24-rc6]# echo > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo "" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo "0" > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# echo "t0" > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# echo "T0" > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%
[root@localhost linux-2.6.24-rc6]# echo "T7" > /proc/acpi/processor/CPU0/throttling
[root@localhost linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T7
state available: T0 to T7
states:
T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
*T7: 12%[root@localhost linux-2.6.24-rc6]# echo "T8" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# vi drivers/acpi/processor_throttling.c [root@localhost linux-2.6.24-rc6]# echo "T8" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo "t7" > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# echo "t70" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo "70" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo "7000" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo "70" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo "xxx" > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo -n > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# echo -n "" > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# echo $?
0
[root@localhost linux-2.6.24-rc6]# echo -n "" > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T7
state available: T0 to T7
states:
T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
*T7: 12%
[root@localhost linux-2.6.24-rc6]# echo -n "" > /proc/acpi/processor/CPU0/throttling
[root@localhost linux-2.6.24-rc6]# cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T7
state available: T0 to T7
states:
T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
*T7: 12%[root@localhost linux-2.6.24-rc6]# echo t0 > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# echo T0 > /proc/acpi/processor/CPU0/throttling [root@localhost linux-2.6.24-rc6]# echo Tt0 > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]# echo T > /proc/acpi/processor/CPU0/throttling -bash: echo: write error: Invalid argument
[root@localhost linux-2.6.24-rc6]#
--- drivers/acpi/processor_throttling.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-)
drivers/acpi/processor_throttling.c +20 -4
@@ -1232,7 +1232,10 @@ static ssize_t acpi_processor_write_throttling(struct file *file,int result =0 ;struct seq_file *m = file->private_data;struct acpi_processor *pr = m->private; -char state_string[12 ] = {'\0' }; +char state_string[5 ] ="" ; +char *charp =NULL ; +size_t state_val =0 ; +char tmpbuf[5 ] ="" ;if (!pr || (count >sizeof (state_string) -1 ))return -EINVAL ;
@@ -1241,10 +1244,23 @@ static ssize_t acpi_processor_write_throttling(struct file *file,return -EFAULT ; state_string[count] ='\0' ; +if ((count >0 ) && (state_string[count-1 ] =='\n' )) + state_string[count-1 ] ='\0' ; - result =acpi_processor_set_throttling (pr, -simple_strtoul (state_string, -NULL ,0 )); + charp = state_string; +if ((state_string[0 ] =='t' ) || (state_string[0 ] =='T' )) + charp++; + + state_val =simple_strtoul (charp,NULL ,0 ); +if (state_val >= pr->throttling.state_count) +return -EINVAL ; + +snprintf (tmpbuf,5 ,"%d" , state_val); + +if (strcmp (tmpbuf, charp) !=0 ) +return -EINVAL ; + + result =acpi_processor_set_throttling (pr, state_val);if (result)return result;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 38/70 acpi: fix printk format warning
In reply to Len BrownFrom: Randy Dunlap <[email protected]>
Fix printk format warning:
linux-next-20080617/drivers/acpi/processor_throttling.c:1258: warning: format '%d' expects type 'int', but argument 4 has type 'size_t'
--- drivers/acpi/processor_throttling.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/acpi/processor_throttling.c +1 -1
@@ -1255,7 +1255,7 @@ static ssize_t acpi_processor_write_throttling(struct file *file,if (state_val >= pr->throttling.state_count)return -EINVAL ; -snprintf (tmpbuf,5 ,"%d" , state_val); +snprintf (tmpbuf,5 ,"%zu" , state_val);if (strcmp (tmpbuf, charp) !=0 )return -EINVAL ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 39/70 PNP: add detail to debug resource dump
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
In the debug resource dump, decode the flags and indicate when a resource is disabled or has been automatically assigned.
--- drivers/pnp/support.c | 34 ++++++++++++++++++++++++++-------- 1 files changed, 26 insertions(+), 8 deletions(-)
drivers/pnp/support.c +26 -8
@@ -63,28 +63,46 @@ void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc)for (i =0 ; i <PNP_MAX_IRQ ; i++) { res =pnp_get_resource (dev,IORESOURCE_IRQ , i);if (res && !(res->flags &IORESOURCE_UNSET )) -dev_dbg (&dev->dev," irq %lld flags %#lx\n" , - (unsigned long long ) res->start, res->flags); +dev_dbg (&dev->dev," irq %lld flags %#lx%s%s\n" , + (unsigned long long ) res->start, res->flags, + res->flags &IORESOURCE_DISABLED ? +" DISABLED" :"" , + res->flags &IORESOURCE_AUTO ? +" AUTO" :"" ); }for (i =0 ; i <PNP_MAX_DMA ; i++) { res =pnp_get_resource (dev,IORESOURCE_DMA , i);if (res && !(res->flags &IORESOURCE_UNSET )) -dev_dbg (&dev->dev," dma %lld flags %#lx\n" , - (unsigned long long ) res->start, res->flags); +dev_dbg (&dev->dev," dma %lld flags %#lx%s%s\n" , + (unsigned long long ) res->start, res->flags, + res->flags &IORESOURCE_DISABLED ? +" DISABLED" :"" , + res->flags &IORESOURCE_AUTO ? +" AUTO" :"" ); }for (i =0 ; i <PNP_MAX_PORT ; i++) { res =pnp_get_resource (dev,IORESOURCE_IO , i);if (res && !(res->flags &IORESOURCE_UNSET )) -dev_dbg (&dev->dev," io %#llx-%#llx flags %#lx\n" , +dev_dbg (&dev->dev," io %#llx-%#llx flags %#lx" +"%s%s\n" , (unsigned long long ) res->start, - (unsigned long long ) res->end, res->flags); + (unsigned long long ) res->end, res->flags, + res->flags &IORESOURCE_DISABLED ? +" DISABLED" :"" , + res->flags &IORESOURCE_AUTO ? +" AUTO" :"" ); }for (i =0 ; i <PNP_MAX_MEM ; i++) { res =pnp_get_resource (dev,IORESOURCE_MEM , i);if (res && !(res->flags &IORESOURCE_UNSET )) -dev_dbg (&dev->dev," mem %#llx-%#llx flags %#lx\n" , +dev_dbg (&dev->dev," mem %#llx-%#llx flags %#lx" +"%s%s\n" , (unsigned long long ) res->start, - (unsigned long long ) res->end, res->flags); + (unsigned long long ) res->end, res->flags, + res->flags &IORESOURCE_DISABLED ? +" DISABLED" :"" , + res->flags &IORESOURCE_AUTO ? +" AUTO" :"" ); }#endif }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 40/70 PNP: remove pnp_resource.index
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
We used pnp_resource.index to keep track of which ISAPNP configuration register a resource should be written to. We needed this only to handle the case where a register is disabled but a subsequent register in the same set is enabled.
Rather than explicitly maintaining the pnp_resource.index, this patch adds a resource every time we read an ISAPNP configuration register and marks the resource as IORESOURCE_DISABLED when appropriate. This makes the position in the pnp_resource_table always correspond to the config register index.
--- drivers/pnp/base.h | 1 - drivers/pnp/interface.c | 20 ++-------- drivers/pnp/isapnp/core.c | 84 +++++++++++++++----------------------------- drivers/pnp/manager.c | 4 -- 4 files changed, 33 insertions(+), 76 deletions(-)
drivers/pnp/base.h +0 -1
@@ -57,7 +57,6 @@ struct pnp_resource *pnp_get_pnp_resource(struct pnp_dev *dev,struct pnp_resource {struct resource res; -unsigned int index;/* ISAPNP config register index */ };struct pnp_resource_table {
drivers/pnp/interface.c +4 -16
@@ -320,7 +320,6 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, const char *ubuf, size_t count) {struct pnp_dev *dev =to_pnp_dev (dmdev); -struct pnp_resource *pnp_res;char *buf = (void *)ubuf;int retval =0 ;resource_size_t start, end;
@@ -368,7 +367,6 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, goto done; }if (!strnicmp (buf,"set" ,3 )) { -int nport =0 , nmem =0 , nirq =0 , ndma =0 ;if (dev->active) goto done; buf +=3 ;
@@ -391,10 +389,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, end =simple_strtoul (buf, &buf,0 ); }else end = start; - pnp_res =pnp_add_io_resource (dev, start, end, -0 ); -if (pnp_res) - pnp_res->index = nport++; +pnp_add_io_resource (dev, start, end,0 );continue ; }if (!strnicmp (buf,"mem" ,3 )) {
@@ -411,10 +406,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, end =simple_strtoul (buf, &buf,0 ); }else end = start; - pnp_res =pnp_add_mem_resource (dev, start, end, -0 ); -if (pnp_res) - pnp_res->index = nmem++; +pnp_add_mem_resource (dev, start, end,0 );continue ; }if (!strnicmp (buf,"irq" ,3 )) {
@@ -422,9 +414,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,while (isspace (*buf)) ++buf; start =simple_strtoul (buf, &buf,0 ); - pnp_res =pnp_add_irq_resource (dev, start,0 ); -if (pnp_res) - pnp_res->index = nirq++; +pnp_add_irq_resource (dev, start,0 );continue ; }if (!strnicmp (buf,"dma" ,3 )) {
@@ -432,9 +422,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr,while (isspace (*buf)) ++buf; start =simple_strtoul (buf, &buf,0 ); - pnp_res =pnp_add_dma_resource (dev, start,0 ); -if (pnp_res) - pnp_res->index = ndma++; +pnp_add_dma_resource (dev, start,0 );continue ; }break ;
drivers/pnp/isapnp/core.c +29 -55
133 lines not on this page · raw message
drivers/pnp/manager.c +0 -4
@@ -40,7 +40,6 @@ static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) }/* set the initial values */ - pnp_res->index = idx; res->flags |= rule->flags |IORESOURCE_IO ; res->flags &= ~IORESOURCE_UNSET ;
@@ -90,7 +89,6 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) }/* set the initial values */ - pnp_res->index = idx; res->flags |= rule->flags |IORESOURCE_MEM ; res->flags &= ~IORESOURCE_UNSET ;
@@ -155,7 +153,6 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx) }/* set the initial values */ - pnp_res->index = idx; res->flags |= rule->flags |IORESOURCE_IRQ ; res->flags &= ~IORESOURCE_UNSET ;
@@ -214,7 +211,6 @@ static void pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx) }/* set the initial values */ - pnp_res->index = idx; res->flags |= rule->flags |IORESOURCE_DMA ; res->flags &= ~IORESOURCE_UNSET ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 41/70 PNP: add pnp_resource_type() internal interface
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
Given a struct resource, this returns the type (IO, MEM, IRQ, DMA).
--- drivers/pnp/base.h | 1 + drivers/pnp/resource.c | 6 ++++++ 2 files changed, 7 insertions(+), 0 deletions(-)
drivers/pnp/base.h +1 -0
@@ -46,6 +46,7 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res);void dbg_pnp_show_resources (struct pnp_dev *dev,char *desc);void pnp_init_resource (struct resource *res); +int pnp_resource_type (struct resource *res);struct pnp_resource *pnp_get_pnp_resource (struct pnp_dev *dev,unsigned int type,unsigned int num);
drivers/pnp/resource.c +6 -0
@@ -499,6 +499,12 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res)#endif } +int pnp_resource_type (struct resource *res) +{ +return res->flags & (IORESOURCE_IO |IORESOURCE_MEM | +IORESOURCE_IRQ |IORESOURCE_DMA ); +} +struct pnp_resource *pnp_get_pnp_resource (struct pnp_dev *dev,unsigned int type,unsigned int num) {
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 42/70 PNP: add pnp_resource_type_name() helper function
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
This patch adds a "pnp_resource_type_name(struct resource *)" that returns the string resource type. This will be used by the sysfs "show resources" function and the debug resource dump function.
--- drivers/pnp/base.h | 1 + drivers/pnp/support.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-)
drivers/pnp/base.h +1 -0
@@ -43,6 +43,7 @@ int pnp_check_mem(struct pnp_dev *dev, struct resource *res);int pnp_check_irq (struct pnp_dev *dev,struct resource *res);int pnp_check_dma (struct pnp_dev *dev,struct resource *res); +char *pnp_resource_type_name (struct resource *res);void dbg_pnp_show_resources (struct pnp_dev *dev,char *desc);void pnp_init_resource (struct resource *res);
drivers/pnp/support.c +15 -0
@@ -52,6 +52,21 @@ void pnp_eisa_id_to_string(u32 id, char *str) str[7 ] ='\0' ; } +char *pnp_resource_type_name (struct resource *res) +{ +switch (pnp_resource_type (res)) { +case IORESOURCE_IO : +return "io" ; +case IORESOURCE_MEM : +return "mem" ; +case IORESOURCE_IRQ : +return "irq" ; +case IORESOURCE_DMA : +return "dma" ; + } +return NULL ; +} +void dbg_pnp_show_resources (struct pnp_dev *dev,char *desc) {#ifdef DEBUG
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 43/70 PNP: make pnp_{port,mem,etc}_start(), et al work for invalid resources
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
Some callers use pnp_port_start() and similar functions without making sure the resource is valid. This patch makes us fall back to returning the initial values if the resource is not valid or not even present.
This mostly preserves the previous behavior, where we would just return the initial values set by pnp_init_resource_table(). The original 2.6.25 code didn't range-check the "bar", so it would return garbage if the bar exceeded the table size. This code returns sensible values instead.
--- include/linux/pnp.h | 72 ++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 60 insertions(+), 12 deletions(-)
include/linux/pnp.h +60 -12
@@ -40,19 +40,31 @@ static inline resource_size_t pnp_resource_len(struct resource *res)static inline resource_size_t pnp_port_start (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_IO , bar)->start; +struct resource *res =pnp_get_resource (dev,IORESOURCE_IO , bar); + +if (pnp_resource_valid (res)) +return res->start; +return 0 ; }static inline resource_size_t pnp_port_end (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_IO , bar)->end; +struct resource *res =pnp_get_resource (dev,IORESOURCE_IO , bar); + +if (pnp_resource_valid (res)) +return res->end; +return 0 ; }static inline unsigned long pnp_port_flags (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_IO , bar)->flags; +struct resource *res =pnp_get_resource (dev,IORESOURCE_IO , bar); + +if (pnp_resource_valid (res)) +return res->flags; +return IORESOURCE_IO |IORESOURCE_AUTO |IORESOURCE_UNSET ; }static inline int pnp_port_valid (struct pnp_dev *dev,unsigned int bar)
@@ -63,25 +75,41 @@ static inline int pnp_port_valid(struct pnp_dev *dev, unsigned int bar)static inline resource_size_t pnp_port_len (struct pnp_dev *dev,unsigned int bar) { -return pnp_resource_len (pnp_get_resource (dev,IORESOURCE_IO , bar)); +struct resource *res =pnp_get_resource (dev,IORESOURCE_IO , bar); + +if (pnp_resource_valid (res)) +return pnp_resource_len (res); +return 0 ; }static inline resource_size_t pnp_mem_start (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_MEM , bar)->start; +struct resource *res =pnp_get_resource (dev,IORESOURCE_MEM , bar); + +if (pnp_resource_valid (res)) +return res->start; +return 0 ; }static inline resource_size_t pnp_mem_end (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_MEM , bar)->end; +struct resource *res =pnp_get_resource (dev,IORESOURCE_MEM , bar); + +if (pnp_resource_valid (res)) +return res->end; +return 0 ; }static inline unsigned long pnp_mem_flags (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_MEM , bar)->flags; +struct resource *res =pnp_get_resource (dev,IORESOURCE_MEM , bar); + +if (pnp_resource_valid (res)) +return res->flags; +return IORESOURCE_MEM |IORESOURCE_AUTO |IORESOURCE_UNSET ; }static inline int pnp_mem_valid (struct pnp_dev *dev,unsigned int bar)
@@ -92,18 +120,30 @@ static inline int pnp_mem_valid(struct pnp_dev *dev, unsigned int bar)static inline resource_size_t pnp_mem_len (struct pnp_dev *dev,unsigned int bar) { -return pnp_resource_len (pnp_get_resource (dev,IORESOURCE_MEM , bar)); +struct resource *res =pnp_get_resource (dev,IORESOURCE_MEM , bar); + +if (pnp_resource_valid (res)) +return pnp_resource_len (res); +return 0 ; }static inline resource_size_t pnp_irq (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_IRQ , bar)->start; +struct resource *res =pnp_get_resource (dev,IORESOURCE_IRQ , bar); + +if (pnp_resource_valid (res)) +return res->start; +return -1 ; }static inline unsigned long pnp_irq_flags (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_IRQ , bar)->flags; +struct resource *res =pnp_get_resource (dev,IORESOURCE_IRQ , bar); + +if (pnp_resource_valid (res)) +return res->flags; +return IORESOURCE_IRQ |IORESOURCE_AUTO |IORESOURCE_UNSET ; }static inline int pnp_irq_valid (struct pnp_dev *dev,unsigned int bar)
@@ -114,12 +154,20 @@ static inline int pnp_irq_valid(struct pnp_dev *dev, unsigned int bar)static inline resource_size_t pnp_dma (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_DMA , bar)->start; +struct resource *res =pnp_get_resource (dev,IORESOURCE_DMA , bar); + +if (pnp_resource_valid (res)) +return res->start; +return -1 ; }static inline unsigned long pnp_dma_flags (struct pnp_dev *dev,unsigned int bar) { -return pnp_get_resource (dev,IORESOURCE_DMA , bar)->flags; +struct resource *res =pnp_get_resource (dev,IORESOURCE_DMA , bar); + +if (pnp_resource_valid (res)) +return res->flags; +return IORESOURCE_DMA |IORESOURCE_AUTO |IORESOURCE_UNSET ; }static inline int pnp_dma_valid (struct pnp_dev *dev,unsigned int bar)
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 44/70 PNP: replace pnp_resource_table with dynamically allocated resources
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
PNP used to have a fixed-size pnp_resource_table for tracking the resources used by a device. This table often overflowed, so we've had to increase the table size, which wastes memory because most devices have very few resources.
This patch replaces the table with a linked list of resources where the entries are allocated on demand.
This removes messages like these:
pnpacpi: exceeded the max number of IO resources 00:01: too many I/O port resources
References:
http://bugzilla.kernel.org/show_bug.cgi?id=9535 http://bugzilla.kernel.org/show_bug.cgi?id=9740 http://lkml.org/lkml/2007/11/30/110
This patch also changes the way PNP uses the IORESOURCE_UNSET, IORESOURCE_AUTO, and IORESOURCE_DISABLED flags.
Prior to this patch, the pnp_resource_table entries used the flags like this:
IORESOURCE_UNSET
This table entry is unused and available for use. When this flag is set, we shouldn't look at anything else in the resource structure. This flag is set when a resource table entry is initialized.
IORESOURCE_AUTO
This resource was assigned automatically by pnp_assign_{io,mem,etc}().
This flag is set when a resource table entry is initialized and cleared whenever we discover a resource setting by reading an ISAPNP config register, parsing a PNPBIOS resource data stream, parsing an ACPI _CRS list, or interpreting a sysfs "set" command.
Resources marked IORESOURCE_AUTO are reinitialized and marked as IORESOURCE_UNSET by pnp_clean_resource_table() in these cases:
- before we attempt to assign resources automatically,
- if we fail to assign resources automatically,
- after disabling a device
IORESOURCE_DISABLED
Set by pnp_assign_{io,mem,etc}() when automatic assignment fails. Also set by PNPBIOS and PNPACPI for:
- invalid IRQs or GSI registration failures
- invalid DMA channels
- I/O ports above 0x10000
- mem ranges with negative length
After this patch, there is no pnp_resource_table, and the resource list entries use the flags like this:
IORESOURCE_UNSET
This flag is no longer used in PNP. Instead of keeping IORESOURCE_UNSET entries in the resource list, we remove entries from the list and free them.
IORESOURCE_AUTO
No change in meaning: it still means the resource was assigned automatically by pnp_assign_{port,mem,etc}(), but these functions now set the bit explicitly.
We still "clean" a device's resource list in the same places, but rather than reinitializing IORESOURCE_AUTO entries, we just remove them from the list.
Note that IORESOURCE_AUTO entries are always at the end of the list, so removing them doesn't reorder other list entries. This is because non-IORESOURCE_AUTO entries are added by the ISAPNP, PNPBIOS, or PNPACPI "get resources" methods and by the sysfs "set" command. In each of these cases, we completely free the resource list first.
IORESOURCE_DISABLED
In addition to the cases where we used to set this flag, ISAPNP now adds an IORESOURCE_DISABLED resource when it reads a configuration register with a "disabled" value.
--- drivers/pnp/base.h | 18 +--- drivers/pnp/core.c | 25 +++-- drivers/pnp/interface.c | 60 +++++------ drivers/pnp/isapnp/core.c | 12 +-- drivers/pnp/manager.c | 220 ++++++++++------------------------------ drivers/pnp/pnpacpi/rsparser.c | 129 ++++++++++++++++-------- drivers/pnp/pnpbios/rsparser.c | 95 +++++++++++++----- drivers/pnp/quirks.c | 3 +- drivers/pnp/resource.c | 86 ++++------------ drivers/pnp/support.c | 72 +++++-------- drivers/pnp/system.c | 4 +- include/linux/pnp.h | 20 +++-- 12 files changed, 323 insertions(+), 421 deletions(-)
drivers/pnp/base.h +3 -15
@@ -46,27 +46,15 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res);char *pnp_resource_type_name (struct resource *res);void dbg_pnp_show_resources (struct pnp_dev *dev,char *desc); -void pnp_init_resource (struct resource *res); +void pnp_free_resources (struct pnp_dev *dev);int pnp_resource_type (struct resource *res); -struct pnp_resource *pnp_get_pnp_resource (struct pnp_dev *dev, -unsigned int type,unsigned int num); - -#define PNP_MAX_PORT 40 -#define PNP_MAX_MEM 24 -#define PNP_MAX_IRQ 2 -#define PNP_MAX_DMA 2 -struct pnp_resource { +struct list_head list;struct resource res; }; -struct pnp_resource_table { -struct pnp_resource port[PNP_MAX_PORT ]; -struct pnp_resource mem[PNP_MAX_MEM ]; -struct pnp_resource dma[PNP_MAX_DMA ]; -struct pnp_resource irq[PNP_MAX_IRQ ]; -}; +void pnp_free_resource (struct pnp_resource *pnp_res);struct pnp_resource *pnp_add_irq_resource (struct pnp_dev *dev,int irq,int flags);
drivers/pnp/core.c +17 -8
@@ -99,6 +99,21 @@ static void pnp_free_ids(struct pnp_dev *dev) } } +void pnp_free_resource (struct pnp_resource *pnp_res) +{ +list_del (&pnp_res->list); +kfree (pnp_res); +} + +void pnp_free_resources (struct pnp_dev *dev) +{ +struct pnp_resource *pnp_res, *tmp; + +list_for_each_entry_safe (pnp_res, tmp, &dev->resources, list) { +pnp_free_resource (pnp_res); + } +} +static void pnp_release_device (struct device *dmdev) {struct pnp_dev *dev =to_pnp_dev (dmdev);
@@ -106,7 +121,7 @@ static void pnp_release_device(struct device *dmdev)pnp_free_option (dev->independent);pnp_free_option (dev->dependent);pnp_free_ids (dev); -kfree (dev->res); +pnp_free_resources (dev);kfree (dev); }
@@ -119,12 +134,7 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpidif (!dev)return NULL ; - dev->res =kzalloc (sizeof (struct pnp_resource_table ),GFP_KERNEL ); -if (!dev->res) { -kfree (dev); -return NULL ; - } - +INIT_LIST_HEAD (&dev->resources); dev->protocol = protocol; dev->number = id; dev->dma_mask =DMA_24BIT_MASK ;
@@ -140,7 +150,6 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid dev_id =pnp_add_id (dev, pnpid);if (!dev_id) { -kfree (dev->res);kfree (dev);return NULL ; }
drivers/pnp/interface.c +26 -34
72 lines not on this page · raw message
drivers/pnp/isapnp/core.c +4 -8
@@ -973,8 +973,7 @@ static int isapnp_set_resources(struct pnp_dev *dev) dev->active =1 ;for (tmp =0 ; tmp <ISAPNP_MAX_PORT ; tmp++) { res =pnp_get_resource (dev,IORESOURCE_IO , tmp); -if (res &&pnp_resource_valid (res) && - !(res->flags &IORESOURCE_DISABLED )) { +if (pnp_resource_enabled (res)) {dev_dbg (&dev->dev," set io %d to %#llx\n" , tmp, (unsigned long long ) res->start); isapnp_write_word(ISAPNP_CFG_PORT + (tmp << 1),
@@ -983,8 +982,7 @@ static int isapnp_set_resources(struct pnp_dev *dev) }for (tmp =0 ; tmp <ISAPNP_MAX_IRQ ; tmp++) { res =pnp_get_resource (dev,IORESOURCE_IRQ , tmp); -if (res &&pnp_resource_valid (res) && - !(res->flags &IORESOURCE_DISABLED )) { +if (pnp_resource_enabled (res)) {int irq = res->start;if (irq ==2 ) irq =9 ;
@@ -994,8 +992,7 @@ static int isapnp_set_resources(struct pnp_dev *dev) }for (tmp =0 ; tmp <ISAPNP_MAX_DMA ; tmp++) { res =pnp_get_resource (dev,IORESOURCE_DMA , tmp); -if (res &&pnp_resource_valid (res) && - !(res->flags &IORESOURCE_DISABLED )) { +if (pnp_resource_enabled (res)) {dev_dbg (&dev->dev," set dma %d to %lld\n" , tmp, (unsigned long long ) res->start);isapnp_write_byte (ISAPNP_CFG_DMA + tmp, res->start);
@@ -1003,8 +1000,7 @@ static int isapnp_set_resources(struct pnp_dev *dev) }for (tmp =0 ; tmp <ISAPNP_MAX_MEM ; tmp++) { res =pnp_get_resource (dev,IORESOURCE_MEM , tmp); -if (res &&pnp_resource_valid (res) && - !(res->flags &IORESOURCE_DISABLED )) { +if (pnp_resource_enabled (res)) {dev_dbg (&dev->dev," set mem %d to %#llx\n" , tmp, (unsigned long long ) res->start); isapnp_write_word(ISAPNP_CFG_MEM + (tmp << 3),
drivers/pnp/manager.c +55 -165
346 lines not on this page · raw message
drivers/pnp/pnpacpi/rsparser.c +88 -43
182 lines not on this page · raw message
drivers/pnp/pnpbios/rsparser.c +69 -26
167 lines not on this page · raw message
drivers/pnp/quirks.c +1 -2
@@ -248,8 +248,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)for (j =0 ; (res =pnp_get_resource (dev,IORESOURCE_MEM , j)); j++) { -if (res->flags &IORESOURCE_UNSET || - (res->start ==0 && res->end ==0 )) +if (res->start ==0 && res->end ==0 )continue ; pnp_start = res->start;
drivers/pnp/resource.c +18 -68
134 lines not on this page · raw message
drivers/pnp/support.c +28 -44
88 lines not on this page · raw message
drivers/pnp/system.c +2 -2
@@ -60,7 +60,7 @@ static void reserve_resources_of_dev(struct pnp_dev *dev)int i;for (i =0 ; (res =pnp_get_resource (dev,IORESOURCE_IO , i)); i++) { -if (res->flags &IORESOURCE_UNSET ) +if (res->flags &IORESOURCE_DISABLED )continue ;if (res->start ==0 )continue ;/* disabled */
@@ -81,7 +81,7 @@ static void reserve_resources_of_dev(struct pnp_dev *dev) }for (i =0 ; (res =pnp_get_resource (dev,IORESOURCE_MEM , i)); i++) { -if (res->flags & (IORESOURCE_UNSET |IORESOURCE_DISABLED )) +if (res->flags &IORESOURCE_DISABLED )continue ;reserve_range (dev, res->start, res->end,0 );
include/linux/pnp.h +13 -7
@@ -15,7 +15,6 @@struct pnp_protocol ;struct pnp_dev ; -struct pnp_resource_table ;/* * Resource Management
@@ -24,7 +23,14 @@ struct resource *pnp_get_resource(struct pnp_dev *, unsigned int, unsigned int);static inline int pnp_resource_valid (struct resource *res) { -if (res && !(res->flags &IORESOURCE_UNSET )) +if (res) +return 1 ; +return 0 ; +} + +static inline int pnp_resource_enabled (struct resource *res) +{ +if (res && !(res->flags &IORESOURCE_DISABLED ))return 1 ;return 0 ; }
@@ -64,7 +70,7 @@ static inline unsigned long pnp_port_flags(struct pnp_dev *dev,if (pnp_resource_valid (res))return res->flags; -return IORESOURCE_IO |IORESOURCE_AUTO |IORESOURCE_UNSET ; +return IORESOURCE_IO |IORESOURCE_AUTO ; }static inline int pnp_port_valid (struct pnp_dev *dev,unsigned int bar)
@@ -109,7 +115,7 @@ static inline unsigned long pnp_mem_flags(struct pnp_dev *dev, unsigned int bar)if (pnp_resource_valid (res))return res->flags; -return IORESOURCE_MEM |IORESOURCE_AUTO |IORESOURCE_UNSET ; +return IORESOURCE_MEM |IORESOURCE_AUTO ; }static inline int pnp_mem_valid (struct pnp_dev *dev,unsigned int bar)
@@ -143,7 +149,7 @@ static inline unsigned long pnp_irq_flags(struct pnp_dev *dev, unsigned int bar)if (pnp_resource_valid (res))return res->flags; -return IORESOURCE_IRQ |IORESOURCE_AUTO |IORESOURCE_UNSET ; +return IORESOURCE_IRQ |IORESOURCE_AUTO ; }static inline int pnp_irq_valid (struct pnp_dev *dev,unsigned int bar)
@@ -167,7 +173,7 @@ static inline unsigned long pnp_dma_flags(struct pnp_dev *dev, unsigned int bar)if (pnp_resource_valid (res))return res->flags; -return IORESOURCE_DMA |IORESOURCE_AUTO |IORESOURCE_UNSET ; +return IORESOURCE_DMA |IORESOURCE_AUTO ; }static inline int pnp_dma_valid (struct pnp_dev *dev,unsigned int bar)
@@ -296,7 +302,7 @@ struct pnp_dev {int capabilities;struct pnp_option *independent;struct pnp_option *dependent; -struct pnp_resource_table *res; +struct list_head resources;char name[PNP_NAME_LEN ];/* contains a human-readable name */ int flags;/* used by protocols */
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 45/70 PNPACPI: keep disabled resources when parsing current config
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
When we parse a device's _CRS data (the current resource settings), we should keep track of everything we find, even if it's currently disabled or invalid.
This is what we already do for ISAPNP and PNPBIOS, and it helps keep things matched up when we subsequently re-encode resources. For example, consider a device with (mem, irq0, irq1, io), where irq0 is disabled. If we drop irq0 when parsing the _CRS, we will mistakenly put irq1 in the irq0 slot when we encode resources for an _SRS call.
--- drivers/pnp/pnpacpi/rsparser.c | 70 +++++++++++++++++++++++++++++---------- 1 files changed, 52 insertions(+), 18 deletions(-)
drivers/pnp/pnpacpi/rsparser.c +52 -18
@@ -98,8 +98,10 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev,int irq, flags;int p, t; -if (!valid_IRQ (gsi)) +if (!valid_IRQ (gsi)) { +pnp_add_irq_resource (dev, gsi,IORESOURCE_DISABLED );return ; + }/* * in IO-APIC mode, use overrided attribute. Two reasons:
@@ -248,24 +250,39 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,* _CRS, but some firmware violates this, so parse them all. */ irq = &res->data.irq; -for (i =0 ; i < irq->interrupt_count; i++) { -pnpacpi_parse_allocated_irqresource (dev, - irq->interrupts[i], - irq->triggering, - irq->polarity, - irq->sharable); +if (irq->interrupt_count ==0 ) +pnp_add_irq_resource (dev,0 ,IORESOURCE_DISABLED ); +else { +for (i =0 ; i < irq->interrupt_count; i++) { +pnpacpi_parse_allocated_irqresource (dev, + irq->interrupts[i], + irq->triggering, + irq->polarity, + irq->sharable); + } + +/* +* The IRQ encoder puts a single interrupt in each +* descriptor, so if a _CRS descriptor has more than +* one interrupt, we won't be able to re-encode it. +*/ +if (pnp_can_write (dev) && irq->interrupt_count >1 ) { +dev_warn (&dev->dev,"multiple interrupts in " +"_CRS descriptor; configuration can't " +"be changed\n" ); + dev->capabilities &= ~PNP_WRITE ; + } }break ;case ACPI_RESOURCE_TYPE_DMA : dma = &res->data.dma; -if (dma->channel_count >0 ) { +if (dma->channel_count >0 && dma->channels[0 ] != (u8) -1 ) flags =dma_flags (dma->type, dma->bus_master, dma->transfer); -if (dma->channels[0 ] == (u8) -1 ) - flags |=IORESOURCE_DISABLED ; -pnp_add_dma_resource (dev, dma->channels[0 ], flags); - } +else + flags =IORESOURCE_DISABLED ; +pnp_add_dma_resource (dev, dma->channels[0 ], flags);break ;case ACPI_RESOURCE_TYPE_IO :
@@ -331,12 +348,29 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,if (extended_irq->producer_consumer ==ACPI_PRODUCER )return AE_OK ; -for (i =0 ; i < extended_irq->interrupt_count; i++) { -pnpacpi_parse_allocated_irqresource (dev, - extended_irq->interrupts[i], - extended_irq->triggering, - extended_irq->polarity, - extended_irq->sharable); +if (extended_irq->interrupt_count ==0 ) +pnp_add_irq_resource (dev,0 ,IORESOURCE_DISABLED ); +else { +for (i =0 ; i < extended_irq->interrupt_count; i++) { +pnpacpi_parse_allocated_irqresource (dev, + extended_irq->interrupts[i], + extended_irq->triggering, + extended_irq->polarity, + extended_irq->sharable); + } + +/* +* The IRQ encoder puts a single interrupt in each +* descriptor, so if a _CRS descriptor has more than +* one interrupt, we won't be able to re-encode it. +*/ +if (pnp_can_write (dev) && + extended_irq->interrupt_count >1 ) { +dev_warn (&dev->dev,"multiple interrupts in " +"_CRS descriptor; configuration can't " +"be changed\n" ); + dev->capabilities &= ~PNP_WRITE ; + } }break ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 46/70 PNP: remove ratelimit on add resource failures
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
We used to have a fixed-size resource table. If a device had twenty resources when the table only had space for ten, we didn't need ten warnings, so we added the ratelimit.
Now that we can dynamically allocate new resources, we should only get failures if the allocation fails. That should be rare enough that we don't need to ratelimit the messages.
--- drivers/pnp/resource.c | 34 ++++++++-------------------------- 1 files changed, 8 insertions(+), 26 deletions(-)
drivers/pnp/resource.c +8 -26
@@ -537,15 +537,10 @@ struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq, {struct pnp_resource *pnp_res;struct resource *res; -static unsigned char warned; pnp_res =pnp_new_resource (dev);if (!pnp_res) { -if (!warned) { -dev_err (&dev->dev,"can't add resource for IRQ %d\n" , - irq); - warned =1 ; - } +dev_err (&dev->dev,"can't add resource for IRQ %d\n" , irq);return NULL ; }
@@ -563,15 +558,10 @@ struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma, {struct pnp_resource *pnp_res;struct resource *res; -static unsigned char warned; pnp_res =pnp_new_resource (dev);if (!pnp_res) { -if (!warned) { -dev_err (&dev->dev,"can't add resource for DMA %d\n" , - dma); - warned =1 ; - } +dev_err (&dev->dev,"can't add resource for DMA %d\n" , dma);return NULL ; }
@@ -590,16 +580,12 @@ struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev, {struct pnp_resource *pnp_res;struct resource *res; -static unsigned char warned; pnp_res =pnp_new_resource (dev);if (!pnp_res) { -if (!warned) { -dev_err (&dev->dev,"can't add resource for IO " -"%#llx-%#llx\n" ,(unsigned long long ) start, - (unsigned long long ) end); - warned =1 ; - } +dev_err (&dev->dev,"can't add resource for IO %#llx-%#llx\n" , + (unsigned long long ) start, + (unsigned long long ) end);return NULL ; }
@@ -619,16 +605,12 @@ struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev, {struct pnp_resource *pnp_res;struct resource *res; -static unsigned char warned; pnp_res =pnp_new_resource (dev);if (!pnp_res) { -if (!warned) { -dev_err (&dev->dev,"can't add resource for MEM " -"%#llx-%#llx\n" ,(unsigned long long ) start, - (unsigned long long ) end); - warned =1 ; - } +dev_err (&dev->dev,"can't add resource for MEM %#llx-%#llx\n" , + (unsigned long long ) start, + (unsigned long long ) end);return NULL ; }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 47/70 PNP: dont sort by type in /sys/.../resources
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
Rather than stepping through all IO resources, then stepping through all MMIO resources, etc., we can just iterate over the resource list once directly.
This can change the order in /sys, e.g.,
# cat /sys/devices/pnp0/00:07/resources # OLD
state = active
io 0x3f8-0x3ff
irq 4 # cat /sys/devices/pnp0/00:07/resources # NEW
state = active
irq 4
io 0x3f8-0x3ffThe old code artificially sorted resources by type; the new code just lists them in the order we read them from the ISAPNP hardware or the BIOS.
--- drivers/pnp/interface.c | 56 ++++++++++++++++++---------------------------- 1 files changed, 22 insertions(+), 34 deletions(-)
drivers/pnp/interface.c +22 -34
@@ -248,8 +248,9 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, char *buf) {struct pnp_dev *dev =to_pnp_dev (dmdev); +struct pnp_resource *pnp_res;struct resource *res; -int i, ret; +int ret;pnp_info_buffer_t *buffer;if (!dev)
@@ -262,46 +263,33 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, buffer->buffer = buf; buffer->curr = buffer->buffer; -pnp_printf (buffer,"state = " ); -if (dev->active) -pnp_printf (buffer,"active\n" ); -else -pnp_printf (buffer,"disabled\n" ); +pnp_printf (buffer,"state = %s\n" , dev->active ?"active" :"disabled" ); -for (i =0 ; (res =pnp_get_resource (dev,IORESOURCE_IO , i)); i++) { -pnp_printf (buffer,"io" ); -if (res->flags &IORESOURCE_DISABLED ) -pnp_printf (buffer," disabled\n" ); -else -pnp_printf (buffer," 0x%llx-0x%llx\n" , - (unsigned long long ) res->start, - (unsigned long long ) res->end); - } -for (i =0 ; (res =pnp_get_resource (dev,IORESOURCE_MEM , i)); i++) { -pnp_printf (buffer,"mem" ); -if (res->flags &IORESOURCE_DISABLED ) +list_for_each_entry (pnp_res, &dev->resources, list) { + res = &pnp_res->res; + +pnp_printf (buffer,pnp_resource_type_name (res)); + +if (res->flags &IORESOURCE_DISABLED ) {pnp_printf (buffer," disabled\n" ); -else -pnp_printf (buffer," 0x%llx-0x%llx\n" , +continue ; + } + +switch (pnp_resource_type (res)) { +case IORESOURCE_IO : +case IORESOURCE_MEM : +pnp_printf (buffer," %#llx-%#llx\n" , (unsigned long long ) res->start, (unsigned long long ) res->end); - } -for (i =0 ; (res =pnp_get_resource (dev,IORESOURCE_IRQ , i)); i++) { -pnp_printf (buffer,"irq" ); -if (res->flags &IORESOURCE_DISABLED ) -pnp_printf (buffer," disabled\n" ); -else -pnp_printf (buffer," %lld\n" , - (unsigned long long ) res->start); - } -for (i =0 ; (res =pnp_get_resource (dev,IORESOURCE_DMA , i)); i++) { -pnp_printf (buffer,"dma" ); -if (res->flags &IORESOURCE_DISABLED ) -pnp_printf (buffer," disabled\n" ); -else +break ; +case IORESOURCE_IRQ : +case IORESOURCE_DMA :pnp_printf (buffer," %lld\n" , (unsigned long long ) res->start); +break ; + } } + ret = (buffer->curr - buf);kfree (buffer);return ret;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 48/70 PNP: add pnp_possible_config() -- can a device could be configured this way?
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
As part of a heuristic to identify modem devices, 8250_pnp.c checks to see whether a device can be configured at any of the legacy COM port addresses.
This patch moves the code that traverses the PNP "possible resource options" from 8250_pnp.c to the PNP subsystem. This encapsulation is important because a future patch will change the implementation of those resource options.
--- drivers/pnp/resource.c | 62 +++++++++++++++++++++++++++++++++++++++++++++ drivers/serial/8250_pnp.c | 24 +++++------------ include/linux/pnp.h | 3 ++ 3 files changed, 72 insertions(+), 17 deletions(-)
drivers/pnp/resource.c +62 -0
@@ -624,6 +624,68 @@ struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,return pnp_res; } +static int pnp_possible_option (struct pnp_option *option,int type, +resource_size_t start,resource_size_t size) +{ +struct pnp_option *tmp; +struct pnp_port *port; +struct pnp_mem *mem; +struct pnp_irq *irq; +struct pnp_dma *dma; + +if (!option) +return 0 ; + +for (tmp = option; tmp; tmp = tmp->next) { +switch (type) { +case IORESOURCE_IO : +for (port = tmp->port; port; port = port->next) { +if (port->min == start && port->size == size) +return 1 ; + } +break ; +case IORESOURCE_MEM : +for (mem = tmp->mem; mem; mem = mem->next) { +if (mem->min == start && mem->size == size) +return 1 ; + } +break ; +case IORESOURCE_IRQ : +for (irq = tmp->irq; irq; irq = irq->next) { +if (start <PNP_IRQ_NR && +test_bit (start, irq->map)) +return 1 ; + } +break ; +case IORESOURCE_DMA : +for (dma = tmp->dma; dma; dma = dma->next) { +if (dma->map & (1 << start)) +return 1 ; + } +break ; + } + } + +return 0 ; +} + +/* +* Determine whether the specified resource is a possible configuration +* for this device. +*/ +int pnp_possible_config (struct pnp_dev *dev,int type,resource_size_t start, +resource_size_t size) +{ +if (pnp_possible_option (dev->independent, type, start, size)) +return 1 ; + +if (pnp_possible_option (dev->dependent, type, start, size)) +return 1 ; + +return 0 ; +} +EXPORT_SYMBOL (pnp_possible_config); +/* format is: pnp_reserve_irq=irq1[,irq2] .... */ static int __init pnp_setup_reserve_irq (char *str) {
drivers/serial/8250_pnp.c +7 -17
@@ -383,21 +383,14 @@ static int __devinit check_name(char *name)return 0 ; } -static int __devinit check_resources (struct pnp_option *option) +static int __devinit check_resources (struct pnp_dev *dev) { -struct pnp_option *tmp; -if (!option) -return 0 ; +resource_size_t base[] = {0x2f8 ,0x3f8 ,0x2e8 ,0x3e8 }; +int i; -for (tmp = option; tmp; tmp = tmp->next) { -struct pnp_port *port; -for (port = tmp->port; port; port = port->next) -if ((port->size ==8 ) && - ((port->min ==0x2f8 ) || - (port->min ==0x3f8 ) || - (port->min ==0x2e8 ) || - (port->min ==0x3e8 ))) -return 1 ; +for (i =0 ; i <ARRAY_SIZE (base); i++) { +if (pnp_possible_config (dev,IORESOURCE_IO , base[i],8 )) +return 1 ; }return 0 ;
@@ -420,10 +413,7 @@ static int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags) (dev->card && check_name(dev->card->name))))return -ENODEV ; -if (check_resources (dev->independent)) -return 0 ; - -if (check_resources (dev->dependent)) +if (check_resources (dev))return 0 ;return -ENODEV ;
include/linux/pnp.h +3 -0
@@ -479,6 +479,8 @@ void pnp_unregister_card_driver(struct pnp_card_driver *drv);extern struct list_head pnp_cards;/* resource management */ +int pnp_possible_config (struct pnp_dev *dev,int type,resource_size_t base, +resource_size_t size);int pnp_auto_config_dev (struct pnp_dev *dev);int pnp_start_dev (struct pnp_dev *dev);int pnp_stop_dev (struct pnp_dev *dev);
@@ -506,6 +508,7 @@ static inline int pnp_register_card_driver(struct pnp_card_driver *drv) { returnstatic inline void pnp_unregister_card_driver (struct pnp_card_driver *drv) { }/* resource management */ +static inline int pnp_possible_config (struct pnp_dev *dev,int type,resource_size_t base,resource_size_t size) {return 0 ; }static inline int pnp_auto_config_dev (struct pnp_dev *dev) {return -ENODEV ; }static inline int pnp_start_dev (struct pnp_dev *dev) {return -ENODEV ; }static inline int pnp_stop_dev (struct pnp_dev *dev) {return -ENODEV ; }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 49/70 PNP: whitespace/coding style fixes
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
No functional change; just make a couple declarations consistent with the rest of the file.
--- drivers/pnp/interface.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-)
drivers/pnp/interface.c +8 -7
@@ -216,12 +216,12 @@ static ssize_t pnp_show_options(struct device *dmdev, struct device_attribute *attr, char *buf) { struct pnp_dev *dev = to_pnp_dev(dmdev); +pnp_info_buffer_t *buffer;struct pnp_option *independent = dev->independent;struct pnp_option *dependent = dev->dependent;int ret, dep =1 ; -pnp_info_buffer_t *buffer = (pnp_info_buffer_t *) -pnp_alloc (sizeof (pnp_info_buffer_t)); + buffer =pnp_alloc (sizeof (pnp_info_buffer_t));if (!buffer)return -ENOMEM ;
@@ -248,17 +248,18 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, char *buf) {struct pnp_dev *dev =to_pnp_dev (dmdev); +pnp_info_buffer_t *buffer;struct pnp_resource *pnp_res;struct resource *res;int ret; -pnp_info_buffer_t *buffer;if (!dev)return -EINVAL ; - buffer = (pnp_info_buffer_t *)pnp_alloc (sizeof (pnp_info_buffer_t)); + buffer =pnp_alloc (sizeof (pnp_info_buffer_t));if (!buffer)return -ENOMEM ; + buffer->len =PAGE_SIZE ; buffer->buffer = buf; buffer->curr = buffer->buffer;
@@ -295,9 +296,9 @@ static ssize_t pnp_show_current_resources(struct device *dmdev,return ret; } -static ssize_t -pnp_set_current_resources (struct device *dmdev,struct device_attribute *attr, -const char *ubuf,size_t count) +static ssize_t pnp_set_current_resources (struct device *dmdev, +struct device_attribute *attr, +const char *ubuf,size_t count) {struct pnp_dev *dev =to_pnp_dev (dmdev);char *buf = (void *)ubuf;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 50/70 PNP: define PNP-specific IORESOURCE_IO_* flags alongside IRQ, DMA, MEM
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
PNP previously defined PNP_PORT_FLAG_16BITADDR and PNP_PORT_FLAG_FIXED in a private header file, but put those flags in struct resource.flags fields. Better to make them IORESOURCE_IO_* flags like the existing IRQ, DMA, and MEM flags.
--- drivers/pnp/interface.c | 2 +- drivers/pnp/isapnp/core.c | 4 ++-- drivers/pnp/pnpacpi/rsparser.c | 10 +++++----- drivers/pnp/pnpbios/rsparser.c | 4 ++-- include/linux/ioport.h | 4 ++++ include/linux/pnp.h | 3 --- 6 files changed, 14 insertions(+), 13 deletions(-)
drivers/pnp/interface.c +1 -1
@@ -57,7 +57,7 @@ static void pnp_print_port(pnp_info_buffer_t * buffer, char *space,"%sport 0x%x-0x%x, align 0x%x, size 0x%x, %i-bit address decoding\n" , space, port->min, port->max, port->align ? (port->align -1 ) :0 , port->size, - port->flags & PNP_PORT_FLAG_16BITADDR ? 16 : 10); + port->flags & IORESOURCE_IO_16BIT_ADDR ? 16 : 10); } static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,
drivers/pnp/isapnp/core.c +2 -2
@@ -486,7 +486,7 @@ static void __init isapnp_parse_port_resource(struct pnp_dev *dev, port->max = (tmp[4 ] <<8 ) | tmp[3 ]; port->align = tmp[5 ]; port->size = tmp[6 ]; - port->flags = tmp[0 ] ?PNP_PORT_FLAG_16BITADDR :0 ; + port->flags = tmp[0 ] ?IORESOURCE_IO_16BIT_ADDR :0 ;pnp_register_port_resource (dev, option, port); }
@@ -507,7 +507,7 @@ static void __init isapnp_parse_fixed_port_resource(struct pnp_dev *dev, port->min = port->max = (tmp[1 ] <<8 ) | tmp[0 ]; port->size = tmp[2 ]; port->align =0 ; - port->flags =PNP_PORT_FLAG_FIXED ; + port->flags =IORESOURCE_IO_FIXED ;pnp_register_port_resource (dev, option, port); }
drivers/pnp/pnpacpi/rsparser.c +5 -5
@@ -180,7 +180,7 @@ static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, u64 start,u64 end = start + len -1 ;if (io_decode ==ACPI_DECODE_16 ) - flags |=PNP_PORT_FLAG_16BITADDR ; + flags |=IORESOURCE_IO_16BIT_ADDR ;if (len ==0 || end >=0x10003 ) flags |=IORESOURCE_DISABLED ;
@@ -485,7 +485,7 @@ static __init void pnpacpi_parse_port_option(struct pnp_dev *dev, port->align = io->alignment; port->size = io->address_length; port->flags =ACPI_DECODE_16 == io->io_decode ? -PNP_PORT_FLAG_16BITADDR :0 ; +IORESOURCE_IO_16BIT_ADDR :0 ;pnp_register_port_resource (dev, option, port); }
@@ -503,7 +503,7 @@ static __init void pnpacpi_parse_fixed_port_option(struct pnp_dev *dev, port->min = port->max = io->address; port->size = io->address_length; port->align =0 ; - port->flags =PNP_PORT_FLAG_FIXED ; + port->flags =IORESOURCE_IO_FIXED ;pnp_register_port_resource (dev, option, port); }
@@ -609,7 +609,7 @@ static __init void pnpacpi_parse_address_option(struct pnp_dev *dev, port->min = port->max = p->minimum; port->size = p->address_length; port->align =0 ; - port->flags =PNP_PORT_FLAG_FIXED ; + port->flags =IORESOURCE_IO_FIXED ;pnp_register_port_resource (dev, option, port); } }
@@ -946,7 +946,7 @@ static void pnpacpi_encode_io(struct pnp_dev *dev,if (pnp_resource_enabled (p)) {/* Note: pnp_assign_port copies pnp_port->flags into p->flags */ - io->io_decode = (p->flags &PNP_PORT_FLAG_16BITADDR ) ? + io->io_decode = (p->flags &IORESOURCE_IO_16BIT_ADDR ) ?ACPI_DECODE_16 :ACPI_DECODE_10 ; io->minimum = p->start; io->maximum = p->end;
drivers/pnp/pnpbios/rsparser.c +2 -2
@@ -310,7 +310,7 @@ static __init void pnpbios_parse_port_option(struct pnp_dev *dev, port->max = (p[5 ] <<8 ) | p[4 ]; port->align = p[6 ]; port->size = p[7 ]; - port->flags = p[1 ] ?PNP_PORT_FLAG_16BITADDR :0 ; + port->flags = p[1 ] ?IORESOURCE_IO_16BIT_ADDR :0 ;pnp_register_port_resource (dev, option, port); }
@@ -326,7 +326,7 @@ static __init void pnpbios_parse_fixed_port_option(struct pnp_dev *dev, port->min = port->max = (p[2 ] <<8 ) | p[1 ]; port->size = p[3 ]; port->align =0 ; - port->flags =PNP_PORT_FLAG_FIXED ; + port->flags =IORESOURCE_IO_FIXED ;pnp_register_port_resource (dev, option, port); }
include/linux/ioport.h +4 -0
@@ -88,6 +88,10 @@ struct resource_list {#define IORESOURCE_MEM_SHADOWABLE (1<<5)/* dup: IORESOURCE_SHADOWABLE */ #define IORESOURCE_MEM_EXPANSIONROM (1<<6) +/* PnP I/O specific bits (IORESOURCE_BITS) */ +#define IORESOURCE_IO_16BIT_ADDR (1<<0) +#define IORESOURCE_IO_FIXED (1<<1) +/* PCI ROM control bits (IORESOURCE_BITS) */ #define IORESOURCE_ROM_ENABLE (1<<0)/* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */ #define IORESOURCE_ROM_SHADOW (1<<1)/* ROM is copy at C000:0 */
include/linux/pnp.h +0 -3
@@ -182,9 +182,6 @@ static inline int pnp_dma_valid(struct pnp_dev *dev, unsigned int bar) } -#define PNP_PORT_FLAG_16BITADDR (1<<0) -#define PNP_PORT_FLAG_FIXED (1<<1) -struct pnp_port {unsigned short min;/* min base number */ unsigned short max;/* max base number */
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 51/70 PNP: make resource option structures private to PNP subsystem
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
Nothing outside the PNP subsystem should need access to a device's resource options, so this patch moves the option structure declarations to a private header file.
--- drivers/pnp/base.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/pnp.h | 48 ------------------------------------------------ 2 files changed, 48 insertions(+), 48 deletions(-)
drivers/pnp/base.h +48 -0
@@ -19,6 +19,54 @@ void pnp_remove_card(struct pnp_card *card);int pnp_add_card_device (struct pnp_card *card,struct pnp_dev *dev);void pnp_remove_card_device (struct pnp_dev *dev); +struct pnp_port { +unsigned short min;/* min base number */ +unsigned short max;/* max base number */ +unsigned char align;/* align boundary */ +unsigned char size;/* size of range */ +unsigned char flags;/* port flags */ +unsigned char pad;/* pad */ +struct pnp_port *next;/* next port */ +}; + +#define PNP_IRQ_NR 256 +struct pnp_irq { + DECLARE_BITMAP(map, PNP_IRQ_NR); /* bitmask for IRQ lines */ +unsigned char flags;/* IRQ flags */ +unsigned char pad;/* pad */ +struct pnp_irq *next;/* next IRQ */ +}; + +struct pnp_dma { +unsigned char map;/* bitmask for DMA channels */ +unsigned char flags;/* DMA flags */ +struct pnp_dma *next;/* next port */ +}; + +struct pnp_mem { +unsigned int min;/* min base number */ +unsigned int max;/* max base number */ +unsigned int align;/* align boundary */ +unsigned int size;/* size of range */ +unsigned char flags;/* memory flags */ +unsigned char pad;/* pad */ +struct pnp_mem *next;/* next memory resource */ +}; + +#define PNP_RES_PRIORITY_PREFERRED 0 +#define PNP_RES_PRIORITY_ACCEPTABLE 1 +#define PNP_RES_PRIORITY_FUNCTIONAL 2 +#define PNP_RES_PRIORITY_INVALID 65535 + +struct pnp_option { +unsigned short priority;/* priority */ +struct pnp_port *port;/* first port */ +struct pnp_irq *irq;/* first IRQ */ +struct pnp_dma *dma;/* first DMA */ +struct pnp_mem *mem;/* first memory resource */ +struct pnp_option *next;/* used to chain dependent resources */ +}; +struct pnp_option *pnp_build_option (int priority);struct pnp_option *pnp_register_independent_option (struct pnp_dev *dev); struct pnp_option *pnp_register_dependent_option(struct pnp_dev *dev,
include/linux/pnp.h +0 -48
54 lines not on this page · raw message
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 52/70 PNP: introduce pnp_irq_mask_t typedef
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
This adds a typedef for the IRQ bitmap, which should cause no functional change, but will make it easier to pass a pointer to a bitmap to pnp_register_irq_resource().
--- drivers/pnp/base.h | 4 +++- drivers/pnp/interface.c | 4 ++-- drivers/pnp/isapnp/core.c | 2 +- drivers/pnp/manager.c | 6 +++--- drivers/pnp/pnpacpi/rsparser.c | 4 ++-- drivers/pnp/pnpbios/rsparser.c | 2 +- drivers/pnp/quirks.c | 4 ++-- drivers/pnp/resource.c | 6 +++--- 8 files changed, 17 insertions(+), 15 deletions(-)
drivers/pnp/base.h +3 -1
@@ -30,8 +30,10 @@ struct pnp_port { };#define PNP_IRQ_NR 256 +typedef struct { DECLARE_BITMAP(bits, PNP_IRQ_NR); } pnp_irq_mask_t; +struct pnp_irq { - DECLARE_BITMAP(map, PNP_IRQ_NR); /* bitmask for IRQ lines */ +pnp_irq_mask_t map;/* bitmap for IRQ lines */ unsigned char flags;/* IRQ flags */ unsigned char pad;/* pad */ struct pnp_irq *next;/* next IRQ */
drivers/pnp/interface.c +2 -2
@@ -67,7 +67,7 @@ static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,pnp_printf (buffer,"%sirq " , space);for (i =0 ; i <PNP_IRQ_NR ; i++) -if (test_bit (i, irq->map)) { +if (test_bit (i, irq->map.bits)) {if (!first) {pnp_printf (buffer,"," ); }else {
@@ -78,7 +78,7 @@ static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,else pnp_printf (buffer,"%i" , i); } -if (bitmap_empty (irq->map,PNP_IRQ_NR )) +if (bitmap_empty (irq->map.bits,PNP_IRQ_NR ))pnp_printf (buffer,"<none>" );if (irq->flags &IORESOURCE_IRQ_HIGHEDGE )pnp_printf (buffer," High-Edge" );
drivers/pnp/isapnp/core.c +1 -1
@@ -441,7 +441,7 @@ static void __init isapnp_parse_irq_resource(struct pnp_dev *dev,if (!irq)return ; bits = (tmp[1 ] <<8 ) | tmp[0 ]; -bitmap_copy (irq->map, &bits,16 ); +bitmap_copy (irq->map.bits, &bits,16 );if (size >2 ) irq->flags = tmp[2 ];else
drivers/pnp/manager.c +3 -3
@@ -128,20 +128,20 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx) res->start =-1 ; res->end =-1 ; -if (bitmap_empty (rule->map,PNP_IRQ_NR )) { +if (bitmap_empty (rule->map.bits,PNP_IRQ_NR )) { res->flags |=IORESOURCE_DISABLED ;dev_dbg (&dev->dev," irq %d disabled\n" , idx); goto __add; }/* TBD: need check for >16 IRQ */ - res->start =find_next_bit (rule->map,PNP_IRQ_NR ,16 ); + res->start =find_next_bit (rule->map.bits,PNP_IRQ_NR ,16 );if (res->start <PNP_IRQ_NR ) { res->end = res->start; goto __add; }for (i =0 ; i <16 ; i++) { -if (test_bit (xtab[i], rule->map)) { +if (test_bit (xtab[i], rule->map.bits)) { res->start = res->end = xtab[i];if (pnp_check_irq (dev, res)) goto __add;
drivers/pnp/pnpacpi/rsparser.c +2 -2
@@ -442,7 +442,7 @@ static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,for (i =0 ; i < p->interrupt_count; i++)if (p->interrupts[i]) -__set_bit (p->interrupts[i], irq->map); +__set_bit (p->interrupts[i], irq->map.bits); irq->flags =irq_flags (p->triggering, p->polarity, p->sharable);pnp_register_irq_resource (dev, option, irq);
@@ -463,7 +463,7 @@ static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,for (i =0 ; i < p->interrupt_count; i++)if (p->interrupts[i]) -__set_bit (p->interrupts[i], irq->map); +__set_bit (p->interrupts[i], irq->map.bits); irq->flags =irq_flags (p->triggering, p->polarity, p->sharable);pnp_register_irq_resource (dev, option, irq);
drivers/pnp/pnpbios/rsparser.c +1 -1
@@ -275,7 +275,7 @@ static __init void pnpbios_parse_irq_option(struct pnp_dev *dev,if (!irq)return ; bits = (p[2 ] <<8 ) | p[1 ]; -bitmap_copy (irq->map, &bits,16 ); +bitmap_copy (irq->map.bits, &bits,16 );if (size >2 ) irq->flags = p[3 ];else
drivers/pnp/quirks.c +2 -2
@@ -68,7 +68,7 @@ static void quirk_cmi8330_resources(struct pnp_dev *dev)for (irq = res->irq; irq; irq = irq->next) {// Valid irqs are 5, 7, 10 tmp =0x04A0 ; -bitmap_copy (irq->map, &tmp,16 );// 0000 0100 1010 0000 +bitmap_copy (irq->map.bits, &tmp,16 );// 0000 0100 1010 0000 }for (dma = res->dma; dma; dma = dma->next)// Valid 8bit dma channels are 1,3
@@ -187,7 +187,7 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev)if (!copy)break ; -memcpy (copy->map, irq->map,sizeof copy->map); +bitmap_copy (copy->map.bits, irq->map.bits,PNP_IRQ_NR ); copy->flags = irq->flags; copy->next = res->irq;/* Yes, this is NULL */
drivers/pnp/resource.c +3 -3
@@ -98,13 +98,13 @@ int pnp_register_irq_resource(struct pnp_dev *dev, struct pnp_option *option,int i;for (i =0 ; i <16 ; i++) -if (test_bit (i, data->map)) +if (test_bit (i, data->map.bits)) pcibios_penalize_isa_irq(i, 0); }#endif #ifdef DEBUG -bitmap_scnprintf (buf,sizeof (buf), data->map,PNP_IRQ_NR ); +bitmap_scnprintf (buf,sizeof (buf), data->map.bits,PNP_IRQ_NR );dev_dbg (&dev->dev," irq bitmask %s flags %#x\n" , buf, data->flags);#endif
@@ -653,7 +653,7 @@ static int pnp_possible_option(struct pnp_option *option, int type,case IORESOURCE_IRQ :for (irq = tmp->irq; irq; irq = irq->next) {if (start <PNP_IRQ_NR && -test_bit (start, irq->map)) +test_bit (start, irq->map.bits))return 1 ; }break ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 53/70 PNP: increase I/O port & memory option address sizes
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
ACPI Address Space Descriptors can be up to 64 bits wide. We should keep track of the whole thing when parsing resource options, so this patch changes PNP port and mem option fields from "unsigned short" and "unsigned int" to "resource_size_t".
--- drivers/pnp/base.h | 16 ++++++++-------- drivers/pnp/interface.c | 17 +++++++++++------ drivers/pnp/resource.c | 14 ++++++++++---- 3 files changed, 29 insertions(+), 18 deletions(-)
drivers/pnp/base.h +8 -8
@@ -20,10 +20,10 @@ int pnp_add_card_device(struct pnp_card *card, struct pnp_dev *dev);void pnp_remove_card_device (struct pnp_dev *dev);struct pnp_port { -unsigned short min;/* min base number */ -unsigned short max;/* max base number */ -unsigned char align;/* align boundary */ -unsigned char size;/* size of range */ +resource_size_t min;/* min base number */ +resource_size_t max;/* max base number */ +resource_size_t align;/* align boundary */ +resource_size_t size;/* size of range */ unsigned char flags;/* port flags */ unsigned char pad;/* pad */ struct pnp_port *next;/* next port */
@@ -46,10 +46,10 @@ struct pnp_dma { };struct pnp_mem { -unsigned int min;/* min base number */ -unsigned int max;/* max base number */ -unsigned int align;/* align boundary */ -unsigned int size;/* size of range */ +resource_size_t min;/* min base number */ +resource_size_t max;/* max base number */ +resource_size_t align;/* align boundary */ +resource_size_t size;/* size of range */ unsigned char flags;/* memory flags */ unsigned char pad;/* pad */ struct pnp_mem *next;/* next memory resource */
drivers/pnp/interface.c +11 -6
@@ -53,10 +53,12 @@ static int pnp_printf(pnp_info_buffer_t * buffer, char *fmt, ...)static void pnp_print_port (pnp_info_buffer_t * buffer,char *space,struct pnp_port *port) { -pnp_printf (buffer, -"%sport 0x%x-0x%x, align 0x%x, size 0x%x, %i-bit address decoding\n" , - space, port->min, port->max, - port->align ? (port->align -1 ) :0 , port->size, +pnp_printf (buffer,"%sport %#llx-%#llx, align %#llx, size %#llx, " +"%i-bit address decoding\n" , space, + (unsigned long long ) port->min, + (unsigned long long ) port->max, + port->align ? ((unsigned long long ) port->align -1 ) :0 , + (unsigned long long ) port->size, port->flags &IORESOURCE_IO_16BIT_ADDR ?16 :10 ); }
@@ -148,8 +150,11 @@ static void pnp_print_mem(pnp_info_buffer_t * buffer, char *space, {char *s; -pnp_printf (buffer,"%sMemory 0x%x-0x%x, align 0x%x, size 0x%x" , - space, mem->min, mem->max, mem->align, mem->size); +pnp_printf (buffer,"%sMemory %#llx-%#llx, align %#llx, size %#llx" , + space, (unsigned long long ) mem->min, + (unsigned long long ) mem->max, + (unsigned long long ) mem->align, + (unsigned long long ) mem->size);if (mem->flags &IORESOURCE_MEM_WRITEABLE )pnp_printf (buffer,", writeable" );if (mem->flags &IORESOURCE_MEM_CACHEABLE )
drivers/pnp/resource.c +10 -4
@@ -143,8 +143,11 @@ int pnp_register_port_resource(struct pnp_dev *dev, struct pnp_option *option, option->port = data;dev_dbg (&dev->dev," io " -"min %#x max %#x align %d size %d flags %#x\n" , - data->min, data->max, data->align, data->size, data->flags); +"min %#llx max %#llx align %lld size %lld flags %#x\n" , + (unsigned long long ) data->min, + (unsigned long long ) data->max, + (unsigned long long ) data->align, + (unsigned long long ) data->size, data->flags);return 0 ; }
@@ -162,8 +165,11 @@ int pnp_register_mem_resource(struct pnp_dev *dev, struct pnp_option *option, option->mem = data;dev_dbg (&dev->dev," mem " -"min %#x max %#x align %d size %d flags %#x\n" , - data->min, data->max, data->align, data->size, data->flags); +"min %#llx max %#llx align %lld size %lld flags %#x\n" , + (unsigned long long ) data->min, + (unsigned long long ) data->max, + (unsigned long long ) data->align, + (unsigned long long ) data->size, data->flags);return 0 ; }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 54/70 PNP: improve resource assignment debug
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
When we fail to assign an I/O or MEM resource, include the min/max in the debug output to help match it with the options.
--- drivers/pnp/manager.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)
drivers/pnp/manager.c +8 -2
@@ -47,7 +47,10 @@ static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) res->start += rule->align; res->end = res->start + rule->size -1 ;if (res->start > rule->max || !rule->align) { -dev_dbg (&dev->dev," couldn't assign io %d\n" , idx); +dev_dbg (&dev->dev," couldn't assign io %d " +"(min %#llx max %#llx)\n" , idx, + (unsigned long long ) rule->min, + (unsigned long long ) rule->max);return 0 ; } }
@@ -96,7 +99,10 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) res->start += rule->align; res->end = res->start + rule->size -1 ;if (res->start > rule->max || !rule->align) { -dev_dbg (&dev->dev," couldn't assign mem %d\n" , idx); +dev_dbg (&dev->dev," couldn't assign mem %d " +"(min %#llx max %#llx)\n" , idx, + (unsigned long long ) rule->min, + (unsigned long long ) rule->max);return 0 ; } }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 55/70 PNP: in debug resource dump, make empty list obvious
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
If the resource list is empty, say that explicitly. Previously, it was confusing because often the heading was followed by zero resource lines, then some "add resource" lines from auto-assignment, so the "add" lines looked like current resources.
--- drivers/pnp/support.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
drivers/pnp/support.c +6 -1
@@ -77,7 +77,12 @@ void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc)struct pnp_resource *pnp_res;struct resource *res; -dev_dbg (&dev->dev,"current resources: %s\n" , desc); +if (list_empty (&dev->resources)) { +dev_dbg (&dev->dev,"%s: no current resources\n" , desc); +return ; + } + +dev_dbg (&dev->dev,"%s: current resources:\n" , desc);list_for_each_entry (pnp_res, &dev->resources, list) { res = &pnp_res->res;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 56/70 PNP: make resource assignment functions return 0 (success) or -EBUSY (failure)
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
This patch doesn't change any behavior; it just makes the return values more conventional.
This changes pnp_assign_dma() from a void function to one that returns an int, just like the other assignment functions. For now, at least, pnp_assign_dma() always returns 0 (success), so it appears to never fail, just like before.
--- drivers/pnp/manager.c | 41 ++++++++++++++++++++++------------------- 1 files changed, 22 insertions(+), 19 deletions(-)
drivers/pnp/manager.c +22 -19
@@ -26,7 +26,7 @@ static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx)dev_dbg (&dev->dev," io %d already set to %#llx-%#llx " "flags %#lx\n" , idx, (unsigned long long ) res->start, (unsigned long long ) res->end, res->flags); -return 1 ; +return 0 ; } res = &local_res;
@@ -51,13 +51,13 @@ static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx)"(min %#llx max %#llx)\n" , idx, (unsigned long long ) rule->min, (unsigned long long) rule->max); -return 0 ; +return -EBUSY ; } } __add:pnp_add_io_resource (dev, res->start, res->end, res->flags); -return 1 ; +return 0 ; }static int pnp_assign_mem (struct pnp_dev *dev,struct pnp_mem *rule,int idx)
@@ -69,7 +69,7 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx)dev_dbg (&dev->dev," mem %d already set to %#llx-%#llx " "flags %#lx\n" , idx, (unsigned long long ) res->start, (unsigned long long ) res->end, res->flags); -return 1 ; +return 0 ; } res = &local_res;
@@ -103,13 +103,13 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx)"(min %#llx max %#llx)\n" , idx, (unsigned long long ) rule->min, (unsigned long long) rule->max); -return 0 ; +return -EBUSY ; } } __add:pnp_add_mem_resource (dev, res->start, res->end, res->flags); -return 1 ; +return 0 ; }static int pnp_assign_irq (struct pnp_dev *dev,struct pnp_irq *rule,int idx)
@@ -126,7 +126,7 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx)if (res) {dev_dbg (&dev->dev," irq %d already set to %d flags %#lx\n" , idx, (int ) res->start, res->flags); -return 1 ; +return 0 ; } res = &local_res;
@@ -154,14 +154,14 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx) } }dev_dbg (&dev->dev," couldn't assign irq %d\n" , idx); -return 0 ; +return -EBUSY ; __add:pnp_add_irq_resource (dev, res->start, res->flags); -return 1 ; +return 0 ; } -static void pnp_assign_dma (struct pnp_dev *dev,struct pnp_dma *rule,int idx) +static int pnp_assign_dma (struct pnp_dev *dev,struct pnp_dma *rule,int idx) {struct resource *res, local_res;int i;
@@ -175,7 +175,7 @@ static void pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx)if (res) {dev_dbg (&dev->dev," dma %d already set to %d flags %#lx\n" , idx, (int ) res->start, res->flags); -return ; +return 0 ; } res = &local_res;
@@ -198,6 +198,7 @@ static void pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx) __add:pnp_add_dma_resource (dev, res->start, res->flags); +return 0 ; }void pnp_init_resources (struct pnp_dev *dev)
@@ -243,25 +244,26 @@ static int pnp_assign_resources(struct pnp_dev *dev, int depnum) irq = dev->independent->irq; dma = dev->independent->dma;while (port) { -if (!pnp_assign_port (dev, port, nport)) +if (pnp_assign_port (dev, port, nport) <0 ) goto fail; nport++; port = port->next; }while (mem) { -if (!pnp_assign_mem (dev, mem, nmem)) +if (pnp_assign_mem (dev, mem, nmem) <0 ) goto fail; nmem++; mem = mem->next; }while (irq) { -if (!pnp_assign_irq (dev, irq, nirq)) +if (pnp_assign_irq (dev, irq, nirq) <0 ) goto fail; nirq++; irq = irq->next; }while (dma) { -pnp_assign_dma (dev, dma, ndma); +if (pnp_assign_dma (dev, dma, ndma) <0 ) + goto fail; ndma++; dma = dma->next; }
@@ -281,25 +283,26 @@ static int pnp_assign_resources(struct pnp_dev *dev, int depnum) irq = dep->irq; dma = dep->dma;while (port) { -if (!pnp_assign_port (dev, port, nport)) +if (pnp_assign_port (dev, port, nport) <0 ) goto fail; nport++; port = port->next; }while (mem) { -if (!pnp_assign_mem (dev, mem, nmem)) +if (pnp_assign_mem (dev, mem, nmem) <0 ) goto fail; nmem++; mem = mem->next; }while (irq) { -if (!pnp_assign_irq (dev, irq, nirq)) +if (pnp_assign_irq (dev, irq, nirq) <0 ) goto fail; nirq++; irq = irq->next; }while (dma) { -pnp_assign_dma (dev, dma, ndma); +if (pnp_assign_dma (dev, dma, ndma) <0 ) + goto fail; ndma++; dma = dma->next; }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 57/70 PNP: remove redundant pnp_can_configure() check
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
pnp_assign_resources() is static and the only caller checks pnp_can_configure() before calling it, so no need to do it again.
--- drivers/pnp/manager.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
drivers/pnp/manager.c +0 -3
@@ -231,9 +231,6 @@ static int pnp_assign_resources(struct pnp_dev *dev, int depnum)struct pnp_dma *dma;int nport =0 , nmem =0 , nirq =0 , ndma =0 ; -if (!pnp_can_configure (dev)) -return -ENODEV ; -dbg_pnp_show_resources (dev,"before pnp_assign_resources" );mutex_lock (&pnp_res_mutex);pnp_clean_resource_table (dev);
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 58/70 PNP: centralize resource option allocations
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
This patch moves all the option allocations (pnp_mem, pnp_port, etc) into the pnp_register_{mem,port,irq,dma}_resource() functions. This will make it easier to rework the option data structures.
The non-trivial part of this patch is the IRQ handling. The backends have to allocate a local pnp_irq_mask_t bitmap, populate it, and pass a pointer to pnp_register_irq_resource().
--- drivers/pnp/base.h | 12 ++- drivers/pnp/isapnp/core.c | 112 ++++++++++++------------------ drivers/pnp/pnpacpi/rsparser.c | 149 +++++++++++++--------------------------- drivers/pnp/pnpbios/rsparser.c | 120 +++++++++++++------------------- drivers/pnp/resource.c | 54 ++++++++++++-- 5 files changed, 198 insertions(+), 249 deletions(-)
drivers/pnp/base.h +8 -4
@@ -74,13 +74,17 @@ struct pnp_option *pnp_register_independent_option(struct pnp_dev *dev);struct pnp_option *pnp_register_dependent_option (struct pnp_dev *dev,int priority);int pnp_register_irq_resource (struct pnp_dev *dev,struct pnp_option *option, -struct pnp_irq *data); +pnp_irq_mask_t *map,unsigned char flags);int pnp_register_dma_resource (struct pnp_dev *dev,struct pnp_option *option, -struct pnp_dma *data); +unsigned char map,unsigned char flags);int pnp_register_port_resource (struct pnp_dev *dev,struct pnp_option *option, -struct pnp_port *data); +resource_size_t min,resource_size_t max, +resource_size_t align,resource_size_t size, +unsigned char flags);int pnp_register_mem_resource (struct pnp_dev *dev,struct pnp_option *option, -struct pnp_mem *data); +resource_size_t min,resource_size_t max, +resource_size_t align,resource_size_t size, +unsigned char flags);void pnp_init_resources (struct pnp_dev *dev);void pnp_fixup_device (struct pnp_dev *dev);
drivers/pnp/isapnp/core.c +45 -67
171 lines not on this page · raw message
drivers/pnp/pnpacpi/rsparser.c +49 -100
246 lines not on this page · raw message
drivers/pnp/pnpbios/rsparser.c +50 -70
166 lines not on this page · raw message
drivers/pnp/resource.c +46 -8
86 lines not on this page · raw message
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 59/70 PNPACPI: ignore _PRS interrupt numbers larger than PNP_IRQ_NR
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
ACPI Extended Interrupt Descriptors can encode 32-bit interrupt numbers, so an interrupt number may exceed the size of the bitmap we use to track possible IRQ settings.
To avoid corrupting memory, complain and ignore too-large interrupt numbers.
There's similar code in pnpacpi_parse_irq_option(), but I didn't change that because the small IRQ descriptor can only encode IRQs 0-15, which do not exceed bitmap size.
In the future, we could handle IRQ numbers greater than PNP_IRQ_NR by replacing the bitmap with a table or list.
--- drivers/pnp/pnpacpi/rsparser.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-)
drivers/pnp/pnpacpi/rsparser.c +10 -3
@@ -435,9 +435,16 @@ static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,return ;bitmap_zero (map.bits,PNP_IRQ_NR ); -for (i =0 ; i < p->interrupt_count; i++) -if (p->interrupts[i]) -__set_bit (p->interrupts[i], map.bits); +for (i =0 ; i < p->interrupt_count; i++) { +if (p->interrupts[i]) { +if (p->interrupts[i] <PNP_IRQ_NR ) +__set_bit (p->interrupts[i], map.bits); +else +dev_err (&dev->dev,"ignoring IRQ %d option " +"(too large for %d entry bitmap)\n" , + p->interrupts[i],PNP_IRQ_NR ); + } + } flags =irq_flags (p->triggering, p->polarity, p->sharable);pnp_register_irq_resource (dev, option, &map, flags);
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 60/70 PNP: rename pnp_register_*_resource() local variables
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
No functional change; just rename "data" to something more descriptive.
--- drivers/pnp/resource.c | 94 ++++++++++++++++++++++++------------------------ 1 files changed, 47 insertions(+), 47 deletions(-)
drivers/pnp/resource.c +47 -47
@@ -80,40 +80,40 @@ struct pnp_option *pnp_register_dependent_option(struct pnp_dev *dev,int pnp_register_irq_resource (struct pnp_dev *dev,struct pnp_option *option,pnp_irq_mask_t *map,unsigned char flags) { -struct pnp_irq *data, *ptr; +struct pnp_irq *irq, *ptr;#ifdef DEBUG char buf[PNP_IRQ_NR ];/* hex-encoded, so this is overkill but safe */ #endif - data =kzalloc (sizeof (struct pnp_irq ),GFP_KERNEL ); -if (!data) + irq =kzalloc (sizeof (struct pnp_irq ),GFP_KERNEL ); +if (!irq)return -ENOMEM ; - data->map = *map; - data->flags = flags; + irq->map = *map; + irq->flags = flags; ptr = option->irq;while (ptr && ptr->next) ptr = ptr->next;if (ptr) - ptr->next = data; + ptr->next = irq;else - option->irq = data; + option->irq = irq;#ifdef CONFIG_PCI {int i;for (i =0 ; i <16 ; i++) -if (test_bit (i, data->map.bits)) +if (test_bit (i, irq->map.bits))pcibios_penalize_isa_irq (i,0 ); }#endif #ifdef DEBUG -bitmap_scnprintf (buf,sizeof (buf), data->map.bits,PNP_IRQ_NR ); +bitmap_scnprintf (buf,sizeof (buf), irq->map.bits,PNP_IRQ_NR );dev_dbg (&dev->dev," irq bitmask %s flags %#x\n" , buf, - data->flags); + irq->flags);#endif return 0 ; }
@@ -121,25 +121,25 @@ int pnp_register_irq_resource(struct pnp_dev *dev, struct pnp_option *option,int pnp_register_dma_resource (struct pnp_dev *dev,struct pnp_option *option,unsigned char map,unsigned char flags) { -struct pnp_dma *data, *ptr; +struct pnp_dma *dma, *ptr; - data =kzalloc (sizeof (struct pnp_dma ),GFP_KERNEL ); -if (!data) + dma =kzalloc (sizeof (struct pnp_dma ),GFP_KERNEL ); +if (!dma)return -ENOMEM ; - data->map = map; - data->flags = flags; + dma->map = map; + dma->flags = flags; ptr = option->dma;while (ptr && ptr->next) ptr = ptr->next;if (ptr) - ptr->next = data; + ptr->next = dma;else - option->dma = data; + option->dma = dma; -dev_dbg (&dev->dev," dma bitmask %#x flags %#x\n" , data->map, - data->flags); +dev_dbg (&dev->dev," dma bitmask %#x flags %#x\n" , dma->map, + dma->flags);return 0 ; }
@@ -148,32 +148,32 @@ int pnp_register_port_resource(struct pnp_dev *dev, struct pnp_option *option, resource_size_t align, resource_size_t size, unsigned char flags) { - struct pnp_port *data, *ptr; + struct pnp_port *port, *ptr; - data =kzalloc (sizeof (struct pnp_port ),GFP_KERNEL ); -if (!data) + port =kzalloc (sizeof (struct pnp_port ),GFP_KERNEL ); +if (!port)return -ENOMEM ; - data->min = min; - data->max = max; - data->align = align; - data->size = size; - data->flags = flags; + port->min = min; + port->max = max; + port->align = align; + port->size = size; + port->flags = flags; ptr = option->port;while (ptr && ptr->next) ptr = ptr->next;if (ptr) - ptr->next = data; + ptr->next = port;else - option->port = data; + option->port = port;dev_dbg (&dev->dev," io " "min %#llx max %#llx align %lld size %lld flags %#x\n" , - (unsigned long long ) data->min, - (unsigned long long ) data->max, - (unsigned long long ) data->align, - (unsigned long long ) data->size, data->flags); + (unsigned long long ) port->min, + (unsigned long long ) port->max, + (unsigned long long ) port->align, + (unsigned long long ) port->size, port->flags);return 0 ; }
@@ -182,32 +182,32 @@ int pnp_register_mem_resource(struct pnp_dev *dev, struct pnp_option *option, resource_size_t align, resource_size_t size, unsigned char flags) { - struct pnp_mem *data, *ptr; + struct pnp_mem *mem, *ptr; - data =kzalloc (sizeof (struct pnp_mem ),GFP_KERNEL ); -if (!data) + mem =kzalloc (sizeof (struct pnp_mem ),GFP_KERNEL ); +if (!mem)return -ENOMEM ; - data->min = min; - data->max = max; - data->align = align; - data->size = size; - data->flags = flags; + mem->min = min; + mem->max = max; + mem->align = align; + mem->size = size; + mem->flags = flags; ptr = option->mem;while (ptr && ptr->next) ptr = ptr->next;if (ptr) - ptr->next = data; + ptr->next = mem;else - option->mem = data; + option->mem = mem;dev_dbg (&dev->dev," mem " "min %#llx max %#llx align %lld size %lld flags %#x\n" , - (unsigned long long ) data->min, - (unsigned long long ) data->max, - (unsigned long long ) data->align, - (unsigned long long ) data->size, data->flags); + (unsigned long long ) mem->min, + (unsigned long long ) mem->max, + (unsigned long long ) mem->align, + (unsigned long long ) mem->size, mem->flags);return 0 ; }
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 61/70 PNP: support optional IRQ resources
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
This patch adds an IORESOURCE_IRQ_OPTIONAL flag for use when assigning resources to a device. If the flag is set and we are unable to assign an IRQ to the device, we can leave the IRQ disabled but allow the overall resource allocation to succeed.
Some devices request an IRQ, but can run without an IRQ (possibly with degraded performance). This flag lets us run the device without the IRQ instead of just leaving the device disabled.
This is a reimplementation of this previous change by Rene Herman <[email protected]>:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b73a223661ed137c5d3d2635f954382e94f5a43
I reimplemented this for two reasons:
- to prepare for converting all resource options into a single linked list, as opposed to the per-resource-type lists we have now, and
- to preserve the order and number of resource options.
In PNPBIOS and ACPI, we configure a device by giving firmware a list of resource assignments. It is important that this list has exactly the same number of resources, in the same order, as the "template" list we got from the firmware in the first place.
The problem of a sound card MPU401 being left disabled for want of an IRQ was reported by Uwe Bugla <[email protected]>.
--- drivers/pnp/interface.c | 2 + drivers/pnp/manager.c | 9 ++++++ drivers/pnp/quirks.c | 71 ++++++++++++++++++----------------------------- include/linux/ioport.h | 1 + 4 files changed, 39 insertions(+), 44 deletions(-)
drivers/pnp/interface.c +2 -0
@@ -90,6 +90,8 @@ static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,pnp_printf (buffer," High-Level" );if (irq->flags &IORESOURCE_IRQ_LOWLEVEL )pnp_printf (buffer," Low-Level" ); +if (irq->flags &IORESOURCE_IRQ_OPTIONAL ) +pnp_printf (buffer," (optional)" );pnp_printf (buffer,"\n" ); }
drivers/pnp/manager.c +9 -0
@@ -153,6 +153,15 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx) goto __add; } } + +if (rule->flags &IORESOURCE_IRQ_OPTIONAL ) { + res->start =-1 ; + res->end =-1 ; + res->flags |=IORESOURCE_DISABLED ; +dev_dbg (&dev->dev," irq %d disabled (optional)\n" , idx); + goto __add; + } +dev_dbg (&dev->dev," couldn't assign irq %d\n" , idx);return -EBUSY ;
drivers/pnp/quirks.c +27 -44
111 lines not on this page · raw message
include/linux/ioport.h +1 -0
@@ -59,6 +59,7 @@ struct resource_list {#define IORESOURCE_IRQ_HIGHLEVEL (1<<2)#define IORESOURCE_IRQ_LOWLEVEL (1<<3)#define IORESOURCE_IRQ_SHAREABLE (1<<4) +#define IORESOURCE_IRQ_OPTIONAL (1<<5)/* PnP DMA specific bits (IORESOURCE_BITS) */ #define IORESOURCE_DMA_TYPE_MASK (3<<0)
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 62/70 PNP: remove extra 0x100 bit from option priority
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
When building resource options, ISAPNP and PNPBIOS set the priority to something like "0x100 | PNP_RES_PRIORITY_ACCEPTABLE", but we immediately mask off the 0x100 again in pnp_build_option(), so that bit looks superfluous.
Thanks to Rene Herman <[email protected]> for pointing this out.
--- drivers/pnp/isapnp/core.c | 8 +++----- drivers/pnp/pnpacpi/rsparser.c | 2 +- drivers/pnp/pnpbios/rsparser.c | 6 +++--- 3 files changed, 7 insertions(+), 9 deletions(-)
drivers/pnp/isapnp/core.c +3 -5
@@ -582,7 +582,7 @@ isapnp_parse_name(char *name, unsigned int name_max, unsigned short *size)static int __init isapnp_create_device (struct pnp_card *card,unsigned short size) { -int number =0 , skip =0 , priority =0 , compat =0 ; +int number =0 , skip =0 , priority, compat =0 ;unsigned char type, tmp[17 ];struct pnp_option *option;struct pnp_dev *dev;
@@ -621,7 +621,6 @@ static int __init isapnp_create_device(struct pnp_card *card, }else { skip =1 ; } - priority =0 ; compat =0 ;break ;case _STAG_COMPATDEVID:
@@ -650,10 +649,10 @@ static int __init isapnp_create_device(struct pnp_card *card,case _STAG_STARTDEP:if (size >1 ) goto __skip; - priority =0x100 |PNP_RES_PRIORITY_ACCEPTABLE ; + priority =PNP_RES_PRIORITY_ACCEPTABLE ;if (size >0 ) {isapnp_peek (tmp, size); - priority =0x100 | tmp[0 ]; + priority = tmp[0 ]; size =0 ; } option =pnp_register_dependent_option (dev, priority);
@@ -663,7 +662,6 @@ static int __init isapnp_create_device(struct pnp_card *card,case _STAG_ENDDEP:if (size !=0 ) goto __skip; - priority =0 ;dev_dbg (&dev->dev,"end dependent options\n" );break ;case _STAG_IOPORT:
drivers/pnp/pnpacpi/rsparser.c +1 -1
@@ -579,7 +579,7 @@ struct acpipnp_parse_option_s {static __init acpi_status pnpacpi_option_resource (struct acpi_resource *res,void *data) { -int priority =0 ; +int priority;struct acpipnp_parse_option_s *parse_data = data;struct pnp_dev *dev = parse_data->dev;struct pnp_option *option = parse_data->option;
drivers/pnp/pnpbios/rsparser.c +3 -3
@@ -315,7 +315,7 @@ pnpbios_parse_resource_option_data(unsigned char *p, unsigned char *end, struct pnp_dev *dev) {unsigned int len, tag; -int priority =0 ; +int priority;struct pnp_option *option, *option_independent;if (!p)
@@ -389,9 +389,9 @@ pnpbios_parse_resource_option_data(unsigned char *p, unsigned char *end,case SMALL_TAG_STARTDEP :if (len >1 ) goto len_err; - priority =0x100 |PNP_RES_PRIORITY_ACCEPTABLE ; + priority =PNP_RES_PRIORITY_ACCEPTABLE ;if (len >0 ) - priority =0x100 | p[1 ]; + priority = p[1 ]; option =pnp_register_dependent_option (dev, priority);if (!option)return NULL ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 63/70 ISAPNP: handle independent options following dependent ones
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
The ISAPNP spec recommends that independent options precede dependent ones, but this is not actually required. The current ISAPNP code incorrectly puts such trailing independent options at the end of the last dependent option list.
This patch fixes that bug by resetting the current option list to the independent list when we see an "End Dependent Functions" tag. PNPBIOS and PNPACPI handle this the same way.
--- drivers/pnp/isapnp/core.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-)
drivers/pnp/isapnp/core.c +7 -2
@@ -584,14 +584,14 @@ static int __init isapnp_create_device(struct pnp_card *card, {int number =0 , skip =0 , priority, compat =0 ;unsigned char type, tmp[17 ]; -struct pnp_option *option; +struct pnp_option *option, *option_independent;struct pnp_dev *dev;u32 eisa_id;char id[8 ];if ((dev =isapnp_parse_device (card, size, number++)) ==NULL )return 1 ; - option =pnp_register_independent_option (dev); + option_independent = option =pnp_register_independent_option (dev);if (!option) {kfree (dev);return 1 ;
@@ -613,6 +613,7 @@ static int __init isapnp_create_device(struct pnp_card *card, size =0 ; skip =0 ; option =pnp_register_independent_option (dev); + option_independent = option;if (!option) {kfree (dev);return 1 ;
@@ -662,6 +663,10 @@ static int __init isapnp_create_device(struct pnp_card *card,case _STAG_ENDDEP:if (size !=0 ) goto __skip; +if (option_independent == option) +dev_warn (&dev->dev,"missing " +"_STAG_STARTDEP tag\n" ); + option = option_independent;dev_dbg (&dev->dev,"end dependent options\n" );break ;case _STAG_IOPORT:
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 64/70 PNP: convert resource options to single linked list
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
ISAPNP, PNPBIOS, and ACPI describe the "possible resource settings" of a device, i.e., the possibilities an OS bus driver has when it assigns I/O port, MMIO, and other resources to the device.
PNP used to maintain this "possible resource setting" information in one independent option structure and a list of dependent option structures for each device. Each of these option structures had lists of I/O, memory, IRQ, and DMA resources, for example:
dev
independent options
ind-io0 -> ind-io1 ...
ind-mem0 -> ind-mem1 ...
...
dependent option set 0
dep0-io0 -> dep0-io1 ...
dep0-mem0 -> dep0-mem1 ...
...
dependent option set 1
dep1-io0 -> dep1-io1 ...
dep1-mem0 -> dep1-mem1 ...
...
...This data structure was designed for ISAPNP, where the OS configures device resource settings by writing directly to configuration registers. The OS can write the registers in arbitrary order much like it writes PCI BARs.
However, for PNPBIOS and ACPI devices, the OS uses firmware interfaces that perform device configuration, and it is important to pass the desired settings to those interfaces in the correct order. The OS learns the correct order by using firmware interfaces that return the "current resource settings" and "possible resource settings," but the option structures above doesn't store the ordering information.
This patch replaces the independent and dependent lists with a single list of options. For example, a device might have possible resource settings like this:
dev
options
ind-io0 -> dep0-io0 -> dep1->io0 -> ind-io1 ...All the possible settings are in the same list, in the order they come from the firmware "possible resource settings" list. Each entry is tagged with an independent/dependent flag. Dependent entries also have a "set number" and an optional priority value. All dependent entries must be assigned from the same set. For example, the OS can use all the entries from dependent set 0, or all the entries from dependent set 1, but it cannot mix entries from set 0 with entries from set 1.
Prior to this patch PNP didn't keep track of the order of this list, and it assigned all independent options first, then all dependent ones. Using the example above, that resulted in a "desired configuration" list like this:
ind->io0 -> ind->io1 -> depN-io0 ...
instead of the list the firmware expects, which looks like this:
ind->io0 -> depN-io0 -> ind-io1 ...
--- drivers/pnp/base.h | 93 ++++++++++--- drivers/pnp/core.c | 4 +- drivers/pnp/interface.c | 75 +++++------ drivers/pnp/isapnp/core.c | 72 +++++------ drivers/pnp/manager.c | 145 +++++++-------------- drivers/pnp/pnpacpi/rsparser.c | 93 ++++++-------- drivers/pnp/pnpbios/rsparser.c | 67 +++++----- drivers/pnp/quirks.c | 289 +++++++++++++++++++++------------------ drivers/pnp/resource.c | 268 +++++++++---------------------------- drivers/pnp/support.c | 79 +++++++++++ include/linux/pnp.h | 6 +- 11 files changed, 559 insertions(+), 632 deletions(-)
drivers/pnp/base.h +70 -23
@@ -1,3 +1,8 @@ +/* +* Copyright (C) 2008 Hewlett-Packard Development Company, L.P. +* Bjorn Helgaas <[email protected]> +*/ +extern spinlock_t pnp_lock;void *pnp_alloc (long size);
@@ -25,8 +30,6 @@ struct pnp_port {resource_size_t align;/* align boundary */ resource_size_t size;/* size of range */ unsigned char flags;/* port flags */ -unsigned char pad;/* pad */ -struct pnp_port *next;/* next port */ };#define PNP_IRQ_NR 256
@@ -35,14 +38,11 @@ typedef struct { DECLARE_BITMAP(bits, PNP_IRQ_NR); } pnp_irq_mask_t;struct pnp_irq {pnp_irq_mask_t map;/* bitmap for IRQ lines */ unsigned char flags;/* IRQ flags */ -unsigned char pad;/* pad */ -struct pnp_irq *next;/* next IRQ */ };struct pnp_dma {unsigned char map;/* bitmask for DMA channels */ unsigned char flags;/* DMA flags */ -struct pnp_dma *next;/* next port */ };struct pnp_mem {
@@ -51,44 +51,91 @@ struct pnp_mem {resource_size_t align;/* align boundary */ resource_size_t size;/* size of range */ unsigned char flags;/* memory flags */ -unsigned char pad;/* pad */ -struct pnp_mem *next;/* next memory resource */ }; +#define PNP_OPTION_DEPENDENT 0x80000000 +#define PNP_OPTION_SET_MASK 0xffff +#define PNP_OPTION_SET_SHIFT 12 +#define PNP_OPTION_PRIORITY_MASK 0xfff +#define PNP_OPTION_PRIORITY_SHIFT 0 +#define PNP_RES_PRIORITY_PREFERRED 0#define PNP_RES_PRIORITY_ACCEPTABLE 1#define PNP_RES_PRIORITY_FUNCTIONAL 2 -#define PNP_RES_PRIORITY_INVALID 65535 +#define PNP_RES_PRIORITY_INVALID PNP_OPTION_PRIORITY_MASKstruct pnp_option { -unsigned short priority;/* priority */ -struct pnp_port *port;/* first port */ -struct pnp_irq *irq;/* first IRQ */ -struct pnp_dma *dma;/* first DMA */ -struct pnp_mem *mem;/* first memory resource */ -struct pnp_option *next;/* used to chain dependent resources */ +struct list_head list; +unsigned int flags;/* independent/dependent, set, priority */ + +unsigned long type;/* IORESOURCE_{IO,MEM,IRQ,DMA} */ +union { +struct pnp_port port; +struct pnp_irq irq; +struct pnp_dma dma; +struct pnp_mem mem; + } u; }; -struct pnp_option *pnp_build_option (int priority); -struct pnp_option *pnp_register_independent_option (struct pnp_dev *dev); -struct pnp_option *pnp_register_dependent_option (struct pnp_dev *dev, -int priority); -int pnp_register_irq_resource (struct pnp_dev *dev,struct pnp_option *option, +int pnp_register_irq_resource (struct pnp_dev *dev,unsigned int option_flags,pnp_irq_mask_t *map,unsigned char flags); -int pnp_register_dma_resource (struct pnp_dev *dev,struct pnp_option *option, +int pnp_register_dma_resource (struct pnp_dev *dev,unsigned int option_flags,unsigned char map,unsigned char flags); -int pnp_register_port_resource (struct pnp_dev *dev,struct pnp_option *option, +int pnp_register_port_resource (struct pnp_dev *dev,unsigned int option_flags,resource_size_t min,resource_size_t max,resource_size_t align,resource_size_t size,unsigned char flags); -int pnp_register_mem_resource (struct pnp_dev *dev,struct pnp_option *option, +int pnp_register_mem_resource (struct pnp_dev *dev,unsigned int option_flags,resource_size_t min,resource_size_t max,resource_size_t align,resource_size_t size,unsigned char flags); + +static inline int pnp_option_is_dependent (struct pnp_option *option) +{ +return option->flags &PNP_OPTION_DEPENDENT ?1 :0 ; +} + +static inline unsigned int pnp_option_set (struct pnp_option *option) +{ +return (option->flags >>PNP_OPTION_SET_SHIFT ) &PNP_OPTION_SET_MASK ; +} + +static inline unsigned int pnp_option_priority (struct pnp_option *option) +{ +return (option->flags >>PNP_OPTION_PRIORITY_SHIFT ) & +PNP_OPTION_PRIORITY_MASK ; +} + +static inline unsigned int pnp_new_dependent_set (struct pnp_dev *dev, +int priority) +{ +unsigned int flags; + +if (priority >PNP_RES_PRIORITY_FUNCTIONAL ) { +dev_warn (&dev->dev,"invalid dependent option priority %d " +"clipped to %d" , priority, +PNP_RES_PRIORITY_INVALID ); + priority =PNP_RES_PRIORITY_INVALID ; + } + + flags =PNP_OPTION_DEPENDENT | + ((dev->num_dependent_sets &PNP_OPTION_SET_MASK ) << +PNP_OPTION_SET_SHIFT ) | + ((priority &PNP_OPTION_PRIORITY_MASK ) << +PNP_OPTION_PRIORITY_SHIFT ); + + dev->num_dependent_sets++; + +return flags; +} + +char *pnp_option_priority_name (struct pnp_option *option); +void dbg_pnp_show_option (struct pnp_dev *dev,struct pnp_option *option); +void pnp_init_resources (struct pnp_dev *dev);void pnp_fixup_device (struct pnp_dev *dev); -void pnp_free_option (struct pnp_option *option); +void pnp_free_options (struct pnp_dev *dev);int __pnp_add_device (struct pnp_dev *dev);void __pnp_remove_device (struct pnp_dev *dev);
drivers/pnp/core.c +2 -2
@@ -118,10 +118,9 @@ static void pnp_release_device(struct device *dmdev) {struct pnp_dev *dev =to_pnp_dev (dmdev); -pnp_free_option (dev->independent); -pnp_free_option (dev->dependent);pnp_free_ids (dev);pnp_free_resources (dev); +pnp_free_options (dev);kfree (dev); }
@@ -135,6 +134,7 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpidreturn NULL ;INIT_LIST_HEAD (&dev->resources); +INIT_LIST_HEAD (&dev->options); dev->protocol = protocol; dev->number = id; dev->dma_mask =DMA_24BIT_MASK ;
drivers/pnp/interface.c +35 -40
103 lines not on this page · raw message
drivers/pnp/isapnp/core.c +31 -41
220 lines not on this page · raw message
drivers/pnp/manager.c +46 -99
183 lines not on this page · raw message
drivers/pnp/pnpacpi/rsparser.c +40 -53
244 lines not on this page · raw message
drivers/pnp/pnpbios/rsparser.c +31 -36
194 lines not on this page · raw message
drivers/pnp/quirks.c +156 -133
358 lines not on this page · raw message
drivers/pnp/resource.c +65 -203
378 lines not on this page · raw message
drivers/pnp/support.c +79 -0
88 lines not on this page · raw message
include/linux/pnp.h +4 -2
@@ -1,6 +1,8 @@/* * Linux Plug and Play Support * Copyright by Adam Belay <[email protected]> +* Copyright (C) 2008 Hewlett-Packard Development Company, L.P. +* Bjorn Helgaas <[email protected]> */ #ifndef _LINUX_PNP_H
@@ -249,9 +251,9 @@ struct pnp_dev {int active;int capabilities; -struct pnp_option *independent; -struct pnp_option *dependent; +unsigned int num_dependent_sets;struct list_head resources; +struct list_head options;char name[PNP_NAME_LEN ];/* contains a human-readable name */ int flags;/* used by protocols */
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 65/70 PNP: avoid legacy IDE IRQs
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
If an IDE controller is in compatibility mode, it expects to use IRQs 14 and 15, so PNP should avoid them.
This patch should resolve this problem report:
parallel driver grabs IRQ14 preventing legacy SFF ATA controller from working
https://bugzilla.novell.com/show_bug.cgi?id=375836
--- drivers/pnp/resource.c | 69 ++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 58 insertions(+), 11 deletions(-)
drivers/pnp/resource.c +58 -11
@@ -17,6 +17,7 @@#include <linux/pci.h> #include <linux/ioport.h> #include <linux/init.h> +#include <linux/libata.h> #include <linux/pnp.h> #include "base.h"
@@ -286,6 +287,61 @@ static irqreturn_t pnp_test_handler(int irq, void *dev_id)return IRQ_HANDLED ; } +#ifdef CONFIG_PCI +static int pci_dev_uses_irq (struct pnp_dev *pnp,struct pci_dev *pci, +unsigned int irq) +{ +u32 class; +u8 progif; + +if (pci->irq == irq) { +dev_dbg (&pnp->dev,"device %s using irq %d\n" , +pci_name (pci), irq); +return 1 ; + } + +/* +* See pci_setup_device() and ata_pci_sff_activate_host() for +* similar IDE legacy detection. +*/ +pci_read_config_dword (pci,PCI_CLASS_REVISION , &class); + class >>=8 ;/* discard revision ID */ + progif = class &0xff ; + class >>=8 ; + +if (class ==PCI_CLASS_STORAGE_IDE ) { +/* +* Unless both channels are native-PCI mode only, +* treat the compatibility IRQs as busy. +*/ +if ((progif &0x5 ) !=0x5 ) +if (ATA_PRIMARY_IRQ (pci) == irq || +ATA_SECONDARY_IRQ (pci) == irq) { +dev_dbg (&pnp->dev,"legacy IDE device %s " +"using irq %d\n" ,pci_name (pci), irq); +return 1 ; + } + } + +return 0 ; +} +#endif + +static int pci_uses_irq (struct pnp_dev *pnp,unsigned int irq) +{ +#ifdef CONFIG_PCI +struct pci_dev *pci =NULL ; + +for_each_pci_dev (pci) { +if (pci_dev_uses_irq (pnp, pci, irq)) { +pci_dev_put (pci); +return 1 ; + } + } +#endif +return 0 ; +} +int pnp_check_irq (struct pnp_dev *dev,struct resource *res) {int i;
@@ -317,18 +373,9 @@ int pnp_check_irq(struct pnp_dev *dev, struct resource *res) } } -#ifdef CONFIG_PCI /* check if the resource is being used by a pci device */ - { -struct pci_dev *pci =NULL ; -for_each_pci_dev (pci) { -if (pci->irq == *irq) { -pci_dev_put (pci); -return 0 ; - } - } - } -#endif +if (pci_uses_irq (dev, *irq)) +return 0 ;/* check if the resource is already in use, skip if the * device is active because it itself may be in use */
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 66/70 PNPACPI: add support for HP vendor-specific CCSR descriptors
In reply to Len BrownFrom: Bjorn Helgaas <[email protected]>
The HP CCSR descriptor describes MMIO address space that should appear as a MEM resource. This patch adds support for parsing these descriptors in the _CRS data.
The visible effect of this is that these MEM resources will appear in /sys/devices/pnp0/.../resources, which means that "lspnp -v" will report it, user applications can use this to locate device CSR space, and kernel drivers can use the normal PNP resource accessors to locate them.
--- drivers/pnp/pnpacpi/rsparser.c | 60 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-)
drivers/pnp/pnpacpi/rsparser.c +60 -0
@@ -3,6 +3,8 @@* * Copyright (c) 2004 Matthieu Castet <[email protected]> * Copyright (c) 2004 Li Shaohua <[email protected]> +* Copyright (C) 2008 Hewlett-Packard Development Company, L.P. +* Bjorn Helgaas <[email protected]> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -187,6 +189,61 @@ static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, u64 start,pnp_add_io_resource (dev, start, end, flags); } +/* +* Device CSRs that do not appear in PCI config space should be described +* via ACPI. This would normally be done with Address Space Descriptors +* marked as "consumer-only," but old versions of Windows and Linux ignore +* the producer/consumer flag, so HP invented a vendor-defined resource to +* describe the location and size of CSR space. +*/ +static struct acpi_vendor_uuid hp_ccsr_uuid = { + .subtype =2 , + .data = {0xf9 ,0xad ,0xe9 ,0x69 ,0x4f ,0x92 ,0x5f ,0xab ,0xf6 ,0x4a , +0x24 ,0xd2 ,0x01 ,0x37 ,0x0e ,0xad }, +}; + +static int vendor_resource_matches (struct pnp_dev *dev, +struct acpi_resource_vendor_typed *vendor, +struct acpi_vendor_uuid *match, +int expected_len) +{ +int uuid_len =sizeof (vendor->uuid); +u8 uuid_subtype = vendor->uuid_subtype; +u8 *uuid = vendor->uuid; +int actual_len; + +/* byte_length includes uuid_subtype and uuid */ + actual_len = vendor->byte_length - uuid_len -1 ; + +if (uuid_subtype == match->subtype && + uuid_len ==sizeof (match->data) && +memcmp (uuid, match->data, uuid_len) ==0 ) { +if (expected_len && expected_len != actual_len) { +dev_err (&dev->dev,"wrong vendor descriptor size; " +"expected %d, found %d bytes\n" , + expected_len, actual_len); +return 0 ; + } + +return 1 ; + } + +return 0 ; +} + +static void pnpacpi_parse_allocated_vendor (struct pnp_dev *dev, +struct acpi_resource_vendor_typed *vendor) +{ +if (vendor_resource_matches (dev, vendor, &hp_ccsr_uuid,16 )) { +u64 start, length; + +memcpy (&start, vendor->byte_data,sizeof (start)); +memcpy (&length, vendor->byte_data +8 ,sizeof (length)); + +pnp_add_mem_resource (dev, start, start + length -1 ,0 ); + } +} +static void pnpacpi_parse_allocated_memresource (struct pnp_dev *dev,u64 start,u64 len,int write_protect)
@@ -237,6 +294,7 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,struct acpi_resource_dma *dma;struct acpi_resource_io *io;struct acpi_resource_fixed_io *fixed_io; +struct acpi_resource_vendor_typed *vendor_typed;struct acpi_resource_memory24 *memory24;struct acpi_resource_memory32 *memory32;struct acpi_resource_fixed_memory32 *fixed_memory32;
@@ -306,6 +364,8 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,break ;case ACPI_RESOURCE_TYPE_VENDOR : + vendor_typed = &res->data.vendor_typed; +pnpacpi_parse_allocated_vendor (dev, vendor_typed);break ;case ACPI_RESOURCE_TYPE_END_TAG :
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 67/70 ACPI: Disable the C2C3_FFH access mode HW has no MWAIT support
In reply to Len BrownFrom: Zhao Yakui <[email protected]>
991528d7348667924176f3e29addea0675298944
(ACPI: Processor native C-states using MWAIT) started passing C2C3_FFH to _PDC to tell the BIOS that Linux supports MWAIT for deep C-states.
However, we should first double check with the hardware that it actually supports MWAIT before potentially exposing a BIOS bug of an MWAIT _CST on HW that doesn't support MWAIT.
--- arch/x86/kernel/acpi/processor.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
arch/x86/kernel/acpi/processor.c +6 -0
@@ -56,6 +56,12 @@ static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)if (cpu_has (c,X86_FEATURE_ACPI )) buf[2 ] |=ACPI_PDC_T_FFH ; +/* +* If mwait/monitor is unsupported, C2/C3_FFH will be disabled +*/ +if (!cpu_has (c,X86_FEATURE_MWAIT )) + buf[2 ] &= ~(ACPI_PDC_C_C2C3_FFH ); + obj->type =ACPI_TYPE_BUFFER ; obj->buffer.length =12 ; obj->buffer.pointer = (u8 *) buf;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 68/70 ACPI: Create "idle=halt" boot parameter
In reply to Len BrownFrom: Zhao Yakui <[email protected]>
"idle=halt" forces Linux to use only HLT for the idle loop. This disables all fancy idle features, such as MWAIT and C-states deeper than C1. However, it is not as extreme as "idle=poll", which disabled all idle power savings features.
While those fancy features save power, this option is useful when there are either platform or Linux bugs, or suspected latency issues related to those features.
--- Documentation/kernel-parameters.txt | 4 +++- arch/x86/kernel/process.c | 3 +++ 2 files changed, 6 insertions(+), 1 deletions(-)
Documentation/kernel-parameters.txt +3 -1
@@ -785,7 +785,7 @@ and is between 256 and 4096 characters. It is defined in the file See Documentation/ide/ide.txt. idle= [X86] - Format: idle=poll or idle=mwait + Format: idle=poll or idle=mwait, idle = halt Poll forces a polling idle loop that can slightly improves the performance of waking up a idle CPU, but will use a lot of power and make the system run hot. Not recommended.
@@ -793,6 +793,8 @@ and is between 256 and 4096 characters. It is defined in the file to not use it because it doesn't save as much power as a normal idle loop use the MONITOR/MWAIT idle loop anyways. Performance should be the same as idle=poll. + idle = halt . Halt is forced to be used for CPU idle. + In such case C2/C3 won't be used again. ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem Claim all unknown PCI IDE storage controllers.
arch/x86/kernel/process.c +3 -0
@@ -6,6 +6,7 @@#include <linux/sched.h> #include <linux/module.h> #include <linux/pm.h> +#include <asm/system.h> struct kmem_cache *task_xstate_cachep;
@@ -169,6 +170,8 @@ static int __init idle_setup(char *str) pm_idle = poll_idle; }else if (!strcmp (str,"mwait" )) force_mwait =1 ; +else if (!strcmp (str,"halt" )) + pm_idle = default_idle;else return -1 ;
Signature · 1 line
1.5.6
Len Brown
reviewerPATCH 69/70 ACPI : Create "idle=nomwait" bootparam
In reply to Len BrownFrom: Zhao Yakui <[email protected]>
Add the boot option of "idle=nomwait" to disable Mwait for CPU C-states. If the boot option of "idle=nomwait" is added , Linux should not use mwait for cpu idle even when the mwait is supported. In such case the C2C3_FFH access mode will be disabled.
http://bugzilla.kernel.org/show_bug.cgi?id=10807
--- Documentation/kernel-parameters.txt | 4 +++- arch/ia64/kernel/process.c | 2 ++ arch/x86/kernel/process.c | 14 ++++++++++++++ drivers/acpi/processor_core.c | 12 ++++++++++++ include/asm-ia64/processor.h | 1 + include/asm-x86/processor.h | 1 + 6 files changed, 33 insertions(+), 1 deletions(-)
Documentation/kernel-parameters.txt +3 -1
@@ -785,7 +785,7 @@ and is between 256 and 4096 characters. It is defined in the file See Documentation/ide/ide.txt. idle= [X86] - Format: idle=poll or idle=mwait, idle = halt + Format: idle=poll or idle=mwait, idle = halt, idle=nomwait Poll forces a polling idle loop that can slightly improves the performance of waking up a idle CPU, but will use a lot of power and make the system run hot. Not recommended.
@@ -795,6 +795,8 @@ and is between 256 and 4096 characters. It is defined in the file as idle=poll. idle = halt . Halt is forced to be used for CPU idle. In such case C2/C3 won't be used again. + idle = nomwait. disable Mwait for CPU C-state. + In such case C2C3_FFH access mode will be disabled. ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem Claim all unknown PCI IDE storage controllers.
arch/ia64/kernel/process.c +2 -0
@@ -55,6 +55,8 @@ void (*ia64_mark_idle)(int);unsigned long boot_option_idle_override =0 ;EXPORT_SYMBOL (boot_option_idle_override); +unsigned long idle_nomwait; +EXPORT_SYMBOL (idle_nomwait);void ia64_do_show_stack (struct unw_frame_info *info,void *arg)
arch/x86/kernel/process.c +14 -0
@@ -7,6 +7,10 @@#include <linux/module.h> #include <linux/pm.h> #include <asm/system.h> +#include <asm/processor.h> + +unsigned long idle_nomwait; +EXPORT_SYMBOL (idle_nomwait);struct kmem_cache *task_xstate_cachep;
@@ -172,6 +176,16 @@ static int __init idle_setup(char *str) force_mwait =1 ; else if (!strcmp(str, "halt")) pm_idle = default_idle; + else if (!strcmp(str, "nomwait")) { +/* +* If the boot option of "idle=nomwait" is added, +* it means that mwait will be disabled for CPU C2/C3 +* states. In such case it won't touch the variable +* of boot_option_idle_override. +*/ + idle_nomwait =1 ; +return 0 ; + } else return -1;
drivers/acpi/processor_core.c +12 -0
@@ -266,6 +266,18 @@ static int acpi_processor_set_pdc(struct acpi_processor *pr)if (!pdc_in)return status; +if (idle_nomwait) { +/* +* If mwait is disabled for CPU C-states, the C2C3_FFH access +* mode will be disabled in the parameter of _PDC object. +*/ +union acpi_object *obj; +u32 *buffer =NULL ; + + obj = pdc_in->pointer; + buffer = (u32 *)(obj->buffer.pointer); + buffer[2 ] &= ~(ACPI_PDC_C_C2C3_FFH ); + } status =acpi_evaluate_object (pr->handle,"_PDC" , pdc_in,NULL );if (ACPI_FAILURE (status))
include/asm-ia64/processor.h +1 -0
@@ -763,6 +763,7 @@ prefetchw (const void *x)#define spin_lock_prefetch (x) prefetchw(x)extern unsigned long boot_option_idle_override; +extern unsigned long idle_nomwait;#endif /* !__ASSEMBLY__ */
include/asm-x86/processor.h +1 -0
@@ -732,6 +732,7 @@ extern int force_mwait;extern void select_idle_routine (const struct cpuinfo_x86 *c);extern unsigned long boot_option_idle_override; +extern unsigned long idle_nomwait;extern void enable_sep_cpu (void );extern int sysenter_setup (void );
Signature · 1 line
1.5.6
Re: [PATCH 69/70] ACPI : Create "idle=nomwait" bootparam
Quoted 26 lines · On Fri, 20 Jun 2008 03:44:11 -0400 Len Brown wrote:
From: Zhao Yakui <[email protected]>
Add the boot option of "idle=nomwait" to disable Mwait for CPU C-states. If the boot option of "idle=nomwait" is added , Linux should not use mwait for cpu idle even when the mwait is supported. In such case the
C2C3_FFHaccess mode will be disabled.http://bugzilla.kernel.org/show_bug.cgi?id=10807
Signed-off-by Zhao Yakui <[email protected]>Signed-off-by Li Shaohua <[email protected]>Signed-off-by Len Brown <[email protected]>--- Documentation/kernel-parameters.txt | 4 +++- arch/ia64/kernel/process.c | 2 ++ arch/x86/kernel/process.c | 14 ++++++++++++++ drivers/acpi/processor_core.c | 12 ++++++++++++ include/asm-ia64/processor.h | 1 + include/asm-x86/processor.h | 1 + 6 files changed, 33 insertions(+), 1 deletions(-)Documentation/kernel-parameters.txt +0
-0
Documentation/kernel-parameters.txt and is between 256 and 4096 characters. It is defined in the file · line 788
Quoted 5 lines
Documentation/kernel-parameters.txt +1
-1@@ -785,7 +785,7 @@ and is between 256 and 4096 characters. It is defined in the file See Documentation/ide/ide.txt. idle= [X86] - Format: idle=poll or idle=mwait, idle = halt + Format: idle=poll or idle=mwait, idle = halt, idle=nomwait
idle=halt [no spaces]
Documentation/kernel-parameters.txt and is between 256 and 4096 characters. It is defined in the file · line 796
Quoted 6 lines
Documentation/kernel-parameters.txt +0
-0Poll forces a polling idle loop that can slightly improves the performance of waking up a idle CPU, but will use a lot of power and make the system run hot. Not recommended.@@ -795,6 +795,8 @@ and is between 256 and 4096 characters. It is defined in the file as idle=poll. idle = halt . Halt is forced to be used for CPU idle.
idle=halt .
(no spaces allowed in command line parsing AFAIK)
Documentation/kernel-parameters.txt and is between 256 and 4096 characters. It is defined in the file · line 802
Quoted 6 lines
Documentation/kernel-parameters.txt +2
-0In such case C2/C3 won't be used again. + idle = nomwait. disable Mwait for CPU C-state. + In such case C2C3_FFH access mode will be disabled. ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem Claim all unknown PCI IDE storage controllers.
---
~Randy
Linux Plumbers Conference, 17-19 September 2008, Portland, Oregon USA
http://linuxplumbersconf.org/
Len Brown
reviewerPATCH 70/70 ACPI : Add DMI check to disable mwait on broken Compal
In reply to Len BrownFrom: Zhao Yakui <[email protected]>
Add the DMI check to disable mwait for CPU C-states.
If the board is matched with DMI table, OSPM should not use mwait for CPU C-states even when mwait is supported. In such case the C2C3_FFH access mode will be disabled.
http://bugzilla.kernel.org/show_bug.cgi?id=10807
--- drivers/acpi/processor_core.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-)
drivers/acpi/processor_core.c +22 -0
@@ -120,6 +120,23 @@ static const struct file_operations acpi_processor_info_fops = {struct acpi_processor *processors[NR_CPUS ];struct acpi_processor_errata errata__read_mostly ; +static int set_no_mwait (const struct dmi_system_id *id) +{ + printk(KERN_NOTICE PREFIX "%s detected - " + "disable mwait for CPU C-stetes\n", id->ident); + idle_nomwait =1 ; +return 0 ; +} + +static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = { + { + set_no_mwait,"IFL91 board" , { +DMI_MATCH (DMI_BIOS_VENDOR ,"COMPAL" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ZEPTO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"3215W" ), +DMI_MATCH (DMI_BOARD_NAME ,"IFL91" ) },NULL }, + {}, +};/* -------------------------------------------------------------------------- Errata Handling
@@ -1095,6 +1112,11 @@ static int __init acpi_processor_init(void)return -ENOMEM ; acpi_processor_dir->owner =THIS_MODULE ; +/* +* Check whether the system is DMI table. If yes, OSPM +* should not use mwait for CPU-states. +*/ +dmi_check_system (processor_idle_dmi_table); result =cpuidle_register_driver (&acpi_idle_driver);if (result <0 ) goto out_proc;
Signature · 1 line
1.5.6
Hi Len
Quoted 2 lines
Here is the current ACPI queue for 2.6.27
fujitsu-laptop and compal-laptop are new.
A minor nitpick: fujitsu-laptop isn't new in 2.6.27 (it was new in 2.6.24 I think). It is just getting some major new features in 2.6.27. Maybe that's what you meant.
Regards
jonathan