diff options
289 files changed, 4831 insertions, 3121 deletions
diff --git a/Documentation/ABI/testing/sysfs-devices-online b/Documentation/ABI/testing/sysfs-devices-online new file mode 100644 index 000000000000..f990026c0740 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-devices-online | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | What: /sys/devices/.../online | ||
| 2 | Date: April 2013 | ||
| 3 | Contact: Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||
| 4 | Description: | ||
| 5 | The /sys/devices/.../online attribute is only present for | ||
| 6 | devices whose bus types provide .online() and .offline() | ||
| 7 | callbacks. The number read from it (0 or 1) reflects the value | ||
| 8 | of the device's 'offline' field. If that number is 1 and '0' | ||
| 9 | (or 'n', or 'N') is written to this file, the device bus type's | ||
| 10 | .offline() callback is executed for the device and (if | ||
| 11 | successful) its 'offline' field is updated accordingly. In | ||
| 12 | turn, if that number is 0 and '1' (or 'y', or 'Y') is written to | ||
| 13 | this file, the device bus type's .online() callback is executed | ||
| 14 | for the device and (if successful) its 'offline' field is | ||
| 15 | updated as appropriate. | ||
| 16 | |||
| 17 | After a successful execution of the bus type's .offline() | ||
| 18 | callback the device cannot be used for any purpose until either | ||
| 19 | it is removed (i.e. device_del() is called for it), or its bus | ||
| 20 | type's .online() is exeucted successfully. | ||
diff --git a/Documentation/ABI/testing/sysfs-firmware-acpi b/Documentation/ABI/testing/sysfs-firmware-acpi index ce9bee98b43b..b4436cca97a8 100644 --- a/Documentation/ABI/testing/sysfs-firmware-acpi +++ b/Documentation/ABI/testing/sysfs-firmware-acpi | |||
| @@ -44,6 +44,16 @@ Description: | |||
| 44 | or 0 (unset). Attempts to write any other values to it will | 44 | or 0 (unset). Attempts to write any other values to it will |
| 45 | cause -EINVAL to be returned. | 45 | cause -EINVAL to be returned. |
| 46 | 46 | ||
| 47 | What: /sys/firmware/acpi/hotplug/force_remove | ||
| 48 | Date: May 2013 | ||
| 49 | Contact: Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||
| 50 | Description: | ||
| 51 | The number in this file (0 or 1) determines whether (1) or not | ||
| 52 | (0) the ACPI subsystem will allow devices to be hot-removed even | ||
| 53 | if they cannot be put offline gracefully (from the kernel's | ||
| 54 | viewpoint). That number can be changed by writing a boolean | ||
| 55 | value to this file. | ||
| 56 | |||
| 47 | What: /sys/firmware/acpi/interrupts/ | 57 | What: /sys/firmware/acpi/interrupts/ |
| 48 | Date: February 2008 | 58 | Date: February 2008 |
| 49 | Contact: Len Brown <lenb@kernel.org> | 59 | Contact: Len Brown <lenb@kernel.org> |
diff --git a/Documentation/DocBook/media/v4l/dev-codec.xml b/Documentation/DocBook/media/v4l/dev-codec.xml index dca0ecd54dc6..ff44c16fc080 100644 --- a/Documentation/DocBook/media/v4l/dev-codec.xml +++ b/Documentation/DocBook/media/v4l/dev-codec.xml | |||
| @@ -1,18 +1,27 @@ | |||
| 1 | <title>Codec Interface</title> | 1 | <title>Codec Interface</title> |
| 2 | 2 | ||
| 3 | <note> | 3 | <para>A V4L2 codec can compress, decompress, transform, or otherwise |
| 4 | <title>Suspended</title> | 4 | convert video data from one format into another format, in memory. Typically |
| 5 | such devices are memory-to-memory devices (i.e. devices with the | ||
| 6 | <constant>V4L2_CAP_VIDEO_M2M</constant> or <constant>V4L2_CAP_VIDEO_M2M_MPLANE</constant> | ||
| 7 | capability set). | ||
| 8 | </para> | ||
| 5 | 9 | ||
| 6 | <para>This interface has been be suspended from the V4L2 API | 10 | <para>A memory-to-memory video node acts just like a normal video node, but it |
| 7 | implemented in Linux 2.6 until we have more experience with codec | 11 | supports both output (sending frames from memory to the codec hardware) and |
| 8 | device interfaces.</para> | 12 | capture (receiving the processed frames from the codec hardware into memory) |
| 9 | </note> | 13 | stream I/O. An application will have to setup the stream |
| 14 | I/O for both sides and finally call &VIDIOC-STREAMON; for both capture and output | ||
| 15 | to start the codec.</para> | ||
| 10 | 16 | ||
| 11 | <para>A V4L2 codec can compress, decompress, transform, or otherwise | 17 | <para>Video compression codecs use the MPEG controls to setup their codec parameters |
| 12 | convert video data from one format into another format, in memory. | 18 | (note that the MPEG controls actually support many more codecs than just MPEG). |
| 13 | Applications send data to be converted to the driver through a | 19 | See <xref linkend="mpeg-controls"></xref>.</para> |
| 14 | &func-write; call, and receive the converted data through a | ||
| 15 | &func-read; call. For efficiency a driver may also support streaming | ||
| 16 | I/O.</para> | ||
| 17 | 20 | ||
| 18 | <para>[to do]</para> | 21 | <para>Memory-to-memory devices can often be used as a shared resource: you can |
| 22 | open the video node multiple times, each application setting up their own codec properties | ||
| 23 | that are local to the file handle, and each can use it independently from the others. | ||
| 24 | The driver will arbitrate access to the codec and reprogram it whenever another file | ||
| 25 | handler gets access. This is different from the usual video node behavior where the video properties | ||
| 26 | are global to the device (i.e. changing something through one file handle is visible | ||
| 27 | through another file handle).</para> | ||
diff --git a/Documentation/DocBook/media/v4l/v4l2.xml b/Documentation/DocBook/media/v4l/v4l2.xml index bfc93cdcf696..bfe823dd0f31 100644 --- a/Documentation/DocBook/media/v4l/v4l2.xml +++ b/Documentation/DocBook/media/v4l/v4l2.xml | |||
| @@ -493,7 +493,7 @@ and discussions on the V4L mailing list.</revremark> | |||
| 493 | </partinfo> | 493 | </partinfo> |
| 494 | 494 | ||
| 495 | <title>Video for Linux Two API Specification</title> | 495 | <title>Video for Linux Two API Specification</title> |
| 496 | <subtitle>Revision 3.9</subtitle> | 496 | <subtitle>Revision 3.10</subtitle> |
| 497 | 497 | ||
| 498 | <chapter id="common"> | 498 | <chapter id="common"> |
| 499 | &sub-common; | 499 | &sub-common; |
diff --git a/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt b/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt index 3f62adfb3e0b..de9f6b78ee51 100644 --- a/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt +++ b/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt | |||
| @@ -2,7 +2,7 @@ Exynos4x12/Exynos5 SoC series camera host interface (FIMC-LITE) | |||
| 2 | 2 | ||
| 3 | Required properties: | 3 | Required properties: |
| 4 | 4 | ||
| 5 | - compatible : should be "samsung,exynos4212-fimc" for Exynos4212 and | 5 | - compatible : should be "samsung,exynos4212-fimc-lite" for Exynos4212 and |
| 6 | Exynos4412 SoCs; | 6 | Exynos4412 SoCs; |
| 7 | - reg : physical base address and size of the device memory mapped | 7 | - reg : physical base address and size of the device memory mapped |
| 8 | registers; | 8 | registers; |
diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt index bb8b0dc532b8..77d68e23b247 100644 --- a/Documentation/sound/alsa/HD-Audio-Models.txt +++ b/Documentation/sound/alsa/HD-Audio-Models.txt | |||
| @@ -29,6 +29,8 @@ ALC269/270/275/276/280/282 | |||
| 29 | alc271-dmic Enable ALC271X digital mic workaround | 29 | alc271-dmic Enable ALC271X digital mic workaround |
| 30 | inv-dmic Inverted internal mic workaround | 30 | inv-dmic Inverted internal mic workaround |
| 31 | lenovo-dock Enables docking station I/O for some Lenovos | 31 | lenovo-dock Enables docking station I/O for some Lenovos |
| 32 | dell-headset-multi Headset jack, which can also be used as mic-in | ||
| 33 | dell-headset-dock Headset jack (without mic-in), and also dock I/O | ||
| 32 | 34 | ||
| 33 | ALC662/663/272 | 35 | ALC662/663/272 |
| 34 | ============== | 36 | ============== |
| @@ -42,6 +44,7 @@ ALC662/663/272 | |||
| 42 | asus-mode7 ASUS | 44 | asus-mode7 ASUS |
| 43 | asus-mode8 ASUS | 45 | asus-mode8 ASUS |
| 44 | inv-dmic Inverted internal mic workaround | 46 | inv-dmic Inverted internal mic workaround |
| 47 | dell-headset-multi Headset jack, which can also be used as mic-in | ||
| 45 | 48 | ||
| 46 | ALC680 | 49 | ALC680 |
| 47 | ====== | 50 | ====== |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 10 | 2 | PATCHLEVEL = 10 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc6 | 4 | EXTRAVERSION = -rc7 |
| 5 | NAME = Unicycling Gorilla | 5 | NAME = Unicycling Gorilla |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 49d993cee512..2651b1da1c56 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1189,6 +1189,16 @@ config PL310_ERRATA_588369 | |||
| 1189 | is not correctly implemented in PL310 as clean lines are not | 1189 | is not correctly implemented in PL310 as clean lines are not |
| 1190 | invalidated as a result of these operations. | 1190 | invalidated as a result of these operations. |
| 1191 | 1191 | ||
| 1192 | config ARM_ERRATA_643719 | ||
| 1193 | bool "ARM errata: LoUIS bit field in CLIDR register is incorrect" | ||
| 1194 | depends on CPU_V7 && SMP | ||
| 1195 | help | ||
| 1196 | This option enables the workaround for the 643719 Cortex-A9 (prior to | ||
| 1197 | r1p0) erratum. On affected cores the LoUIS bit field of the CLIDR | ||
| 1198 | register returns zero when it should return one. The workaround | ||
| 1199 | corrects this value, ensuring cache maintenance operations which use | ||
| 1200 | it behave as intended and avoiding data corruption. | ||
| 1201 | |||
| 1192 | config ARM_ERRATA_720789 | 1202 | config ARM_ERRATA_720789 |
| 1193 | bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID" | 1203 | bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID" |
| 1194 | depends on CPU_V7 | 1204 | depends on CPU_V7 |
| @@ -2006,7 +2016,7 @@ config XIP_PHYS_ADDR | |||
| 2006 | 2016 | ||
| 2007 | config KEXEC | 2017 | config KEXEC |
| 2008 | bool "Kexec system call (EXPERIMENTAL)" | 2018 | bool "Kexec system call (EXPERIMENTAL)" |
| 2009 | depends on (!SMP || HOTPLUG_CPU) | 2019 | depends on (!SMP || PM_SLEEP_SMP) |
| 2010 | help | 2020 | help |
| 2011 | kexec is a system call that implements the ability to shutdown your | 2021 | kexec is a system call that implements the ability to shutdown your |
| 2012 | current kernel, and to start another kernel. It is like a reboot | 2022 | current kernel, and to start another kernel. It is like a reboot |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 79e9bdbfc491..120b83bfde20 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile | |||
| @@ -116,7 +116,8 @@ targets := vmlinux vmlinux.lds \ | |||
| 116 | 116 | ||
| 117 | # Make sure files are removed during clean | 117 | # Make sure files are removed during clean |
| 118 | extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern \ | 118 | extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern \ |
| 119 | lib1funcs.S ashldi3.S $(libfdt) $(libfdt_hdrs) | 119 | lib1funcs.S ashldi3.S $(libfdt) $(libfdt_hdrs) \ |
| 120 | hyp-stub.S | ||
| 120 | 121 | ||
| 121 | ifeq ($(CONFIG_FUNCTION_TRACER),y) | 122 | ifeq ($(CONFIG_FUNCTION_TRACER),y) |
| 122 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 123 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
diff --git a/arch/arm/boot/dts/exynos5250-pinctrl.dtsi b/arch/arm/boot/dts/exynos5250-pinctrl.dtsi index d1650fb34c0a..ded558bb0f3b 100644 --- a/arch/arm/boot/dts/exynos5250-pinctrl.dtsi +++ b/arch/arm/boot/dts/exynos5250-pinctrl.dtsi | |||
| @@ -763,7 +763,7 @@ | |||
| 763 | }; | 763 | }; |
| 764 | }; | 764 | }; |
| 765 | 765 | ||
| 766 | pinctrl@03680000 { | 766 | pinctrl@03860000 { |
| 767 | gpz: gpz { | 767 | gpz: gpz { |
| 768 | gpio-controller; | 768 | gpio-controller; |
| 769 | #gpio-cells = <2>; | 769 | #gpio-cells = <2>; |
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 0673524238a6..fc9fb3d526e2 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
| @@ -161,9 +161,9 @@ | |||
| 161 | interrupts = <0 50 0>; | 161 | interrupts = <0 50 0>; |
| 162 | }; | 162 | }; |
| 163 | 163 | ||
| 164 | pinctrl_3: pinctrl@03680000 { | 164 | pinctrl_3: pinctrl@03860000 { |
| 165 | compatible = "samsung,exynos5250-pinctrl"; | 165 | compatible = "samsung,exynos5250-pinctrl"; |
| 166 | reg = <0x0368000 0x1000>; | 166 | reg = <0x03860000 0x1000>; |
| 167 | interrupts = <0 47 0>; | 167 | interrupts = <0 47 0>; |
| 168 | }; | 168 | }; |
| 169 | 169 | ||
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index bff71388e72a..17d0ae8672fa 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
| @@ -320,9 +320,7 @@ static inline void flush_anon_page(struct vm_area_struct *vma, | |||
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE | 322 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE |
| 323 | static inline void flush_kernel_dcache_page(struct page *page) | 323 | extern void flush_kernel_dcache_page(struct page *); |
| 324 | { | ||
| 325 | } | ||
| 326 | 324 | ||
| 327 | #define flush_dcache_mmap_lock(mapping) \ | 325 | #define flush_dcache_mmap_lock(mapping) \ |
| 328 | spin_lock_irq(&(mapping)->tree_lock) | 326 | spin_lock_irq(&(mapping)->tree_lock) |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index 8ef8c9337809..4fb074c446bf 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
| @@ -134,6 +134,10 @@ void machine_kexec(struct kimage *image) | |||
| 134 | unsigned long reboot_code_buffer_phys; | 134 | unsigned long reboot_code_buffer_phys; |
| 135 | void *reboot_code_buffer; | 135 | void *reboot_code_buffer; |
| 136 | 136 | ||
| 137 | if (num_online_cpus() > 1) { | ||
| 138 | pr_err("kexec: error: multiple CPUs still online\n"); | ||
| 139 | return; | ||
| 140 | } | ||
| 137 | 141 | ||
| 138 | page_list = image->head & PAGE_MASK; | 142 | page_list = image->head & PAGE_MASK; |
| 139 | 143 | ||
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 282de4826abb..6e8931ccf13e 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
| @@ -184,30 +184,61 @@ int __init reboot_setup(char *str) | |||
| 184 | 184 | ||
| 185 | __setup("reboot=", reboot_setup); | 185 | __setup("reboot=", reboot_setup); |
| 186 | 186 | ||
| 187 | /* | ||
| 188 | * Called by kexec, immediately prior to machine_kexec(). | ||
| 189 | * | ||
| 190 | * This must completely disable all secondary CPUs; simply causing those CPUs | ||
| 191 | * to execute e.g. a RAM-based pin loop is not sufficient. This allows the | ||
| 192 | * kexec'd kernel to use any and all RAM as it sees fit, without having to | ||
| 193 | * avoid any code or data used by any SW CPU pin loop. The CPU hotplug | ||
| 194 | * functionality embodied in disable_nonboot_cpus() to achieve this. | ||
| 195 | */ | ||
| 187 | void machine_shutdown(void) | 196 | void machine_shutdown(void) |
| 188 | { | 197 | { |
| 189 | #ifdef CONFIG_SMP | 198 | disable_nonboot_cpus(); |
| 190 | smp_send_stop(); | ||
| 191 | #endif | ||
| 192 | } | 199 | } |
| 193 | 200 | ||
| 201 | /* | ||
| 202 | * Halting simply requires that the secondary CPUs stop performing any | ||
| 203 | * activity (executing tasks, handling interrupts). smp_send_stop() | ||
| 204 | * achieves this. | ||
| 205 | */ | ||
| 194 | void machine_halt(void) | 206 | void machine_halt(void) |
| 195 | { | 207 | { |
| 196 | machine_shutdown(); | 208 | smp_send_stop(); |
| 209 | |||
| 197 | local_irq_disable(); | 210 | local_irq_disable(); |
| 198 | while (1); | 211 | while (1); |
| 199 | } | 212 | } |
| 200 | 213 | ||
| 214 | /* | ||
| 215 | * Power-off simply requires that the secondary CPUs stop performing any | ||
| 216 | * activity (executing tasks, handling interrupts). smp_send_stop() | ||
| 217 | * achieves this. When the system power is turned off, it will take all CPUs | ||
| 218 | * with it. | ||
| 219 | */ | ||
| 201 | void machine_power_off(void) | 220 | void machine_power_off(void) |
| 202 | { | 221 | { |
| 203 | machine_shutdown(); | 222 | smp_send_stop(); |
| 223 | |||
| 204 | if (pm_power_off) | 224 | if (pm_power_off) |
| 205 | pm_power_off(); | 225 | pm_power_off(); |
| 206 | } | 226 | } |
| 207 | 227 | ||
| 228 | /* | ||
| 229 | * Restart requires that the secondary CPUs stop performing any activity | ||
| 230 | * while the primary CPU resets the system. Systems with a single CPU can | ||
| 231 | * use soft_restart() as their machine descriptor's .restart hook, since that | ||
| 232 | * will cause the only available CPU to reset. Systems with multiple CPUs must | ||
| 233 | * provide a HW restart implementation, to ensure that all CPUs reset at once. | ||
| 234 | * This is required so that any code running after reset on the primary CPU | ||
| 235 | * doesn't have to co-ordinate with other CPUs to ensure they aren't still | ||
| 236 | * executing pre-reset code, and using RAM that the primary CPU's code wishes | ||
| 237 | * to use. Implementing such co-ordination would be essentially impossible. | ||
| 238 | */ | ||
| 208 | void machine_restart(char *cmd) | 239 | void machine_restart(char *cmd) |
| 209 | { | 240 | { |
| 210 | machine_shutdown(); | 241 | smp_send_stop(); |
| 211 | 242 | ||
| 212 | arm_pm_restart(reboot_mode, cmd); | 243 | arm_pm_restart(reboot_mode, cmd); |
| 213 | 244 | ||
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 550d63cef68e..5919eb451bb9 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
| @@ -651,17 +651,6 @@ void smp_send_reschedule(int cpu) | |||
| 651 | smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); | 651 | smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); |
| 652 | } | 652 | } |
| 653 | 653 | ||
| 654 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 655 | static void smp_kill_cpus(cpumask_t *mask) | ||
| 656 | { | ||
| 657 | unsigned int cpu; | ||
| 658 | for_each_cpu(cpu, mask) | ||
| 659 | platform_cpu_kill(cpu); | ||
| 660 | } | ||
| 661 | #else | ||
| 662 | static void smp_kill_cpus(cpumask_t *mask) { } | ||
| 663 | #endif | ||
| 664 | |||
| 665 | void smp_send_stop(void) | 654 | void smp_send_stop(void) |
| 666 | { | 655 | { |
| 667 | unsigned long timeout; | 656 | unsigned long timeout; |
| @@ -679,8 +668,6 @@ void smp_send_stop(void) | |||
| 679 | 668 | ||
| 680 | if (num_online_cpus() > 1) | 669 | if (num_online_cpus() > 1) |
| 681 | pr_warning("SMP: failed to stop secondary CPUs\n"); | 670 | pr_warning("SMP: failed to stop secondary CPUs\n"); |
| 682 | |||
| 683 | smp_kill_cpus(&mask); | ||
| 684 | } | 671 | } |
| 685 | 672 | ||
| 686 | /* | 673 | /* |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index 15451ee4acc8..515b00064da8 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
| @@ -92,6 +92,14 @@ ENTRY(v7_flush_dcache_louis) | |||
| 92 | mrc p15, 1, r0, c0, c0, 1 @ read clidr, r0 = clidr | 92 | mrc p15, 1, r0, c0, c0, 1 @ read clidr, r0 = clidr |
| 93 | ALT_SMP(ands r3, r0, #(7 << 21)) @ extract LoUIS from clidr | 93 | ALT_SMP(ands r3, r0, #(7 << 21)) @ extract LoUIS from clidr |
| 94 | ALT_UP(ands r3, r0, #(7 << 27)) @ extract LoUU from clidr | 94 | ALT_UP(ands r3, r0, #(7 << 27)) @ extract LoUU from clidr |
| 95 | #ifdef CONFIG_ARM_ERRATA_643719 | ||
| 96 | ALT_SMP(mrceq p15, 0, r2, c0, c0, 0) @ read main ID register | ||
| 97 | ALT_UP(moveq pc, lr) @ LoUU is zero, so nothing to do | ||
| 98 | ldreq r1, =0x410fc090 @ ID of ARM Cortex A9 r0p? | ||
| 99 | biceq r2, r2, #0x0000000f @ clear minor revision number | ||
| 100 | teqeq r2, r1 @ test for errata affected core and if so... | ||
| 101 | orreqs r3, #(1 << 21) @ fix LoUIS value (and set flags state to 'ne') | ||
| 102 | #endif | ||
| 95 | ALT_SMP(mov r3, r3, lsr #20) @ r3 = LoUIS * 2 | 103 | ALT_SMP(mov r3, r3, lsr #20) @ r3 = LoUIS * 2 |
| 96 | ALT_UP(mov r3, r3, lsr #26) @ r3 = LoUU * 2 | 104 | ALT_UP(mov r3, r3, lsr #26) @ r3 = LoUU * 2 |
| 97 | moveq pc, lr @ return if level == 0 | 105 | moveq pc, lr @ return if level == 0 |
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 0d473cce501c..32aa5861119f 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -301,6 +301,39 @@ void flush_dcache_page(struct page *page) | |||
| 301 | EXPORT_SYMBOL(flush_dcache_page); | 301 | EXPORT_SYMBOL(flush_dcache_page); |
| 302 | 302 | ||
| 303 | /* | 303 | /* |
| 304 | * Ensure cache coherency for the kernel mapping of this page. We can | ||
| 305 | * assume that the page is pinned via kmap. | ||
| 306 | * | ||
| 307 | * If the page only exists in the page cache and there are no user | ||
| 308 | * space mappings, this is a no-op since the page was already marked | ||
| 309 | * dirty at creation. Otherwise, we need to flush the dirty kernel | ||
| 310 | * cache lines directly. | ||
| 311 | */ | ||
| 312 | void flush_kernel_dcache_page(struct page *page) | ||
| 313 | { | ||
| 314 | if (cache_is_vivt() || cache_is_vipt_aliasing()) { | ||
| 315 | struct address_space *mapping; | ||
| 316 | |||
| 317 | mapping = page_mapping(page); | ||
| 318 | |||
| 319 | if (!mapping || mapping_mapped(mapping)) { | ||
| 320 | void *addr; | ||
| 321 | |||
| 322 | addr = page_address(page); | ||
| 323 | /* | ||
| 324 | * kmap_atomic() doesn't set the page virtual | ||
| 325 | * address for highmem pages, and | ||
| 326 | * kunmap_atomic() takes care of cache | ||
| 327 | * flushing already. | ||
| 328 | */ | ||
| 329 | if (!IS_ENABLED(CONFIG_HIGHMEM) || addr) | ||
| 330 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | ||
| 331 | } | ||
| 332 | } | ||
| 333 | } | ||
| 334 | EXPORT_SYMBOL(flush_kernel_dcache_page); | ||
| 335 | |||
| 336 | /* | ||
| 304 | * Flush an anonymous page so that users of get_user_pages() | 337 | * Flush an anonymous page so that users of get_user_pages() |
| 305 | * can safely access the data. The expected sequence is: | 338 | * can safely access the data. The expected sequence is: |
| 306 | * | 339 | * |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index e0d8565671a6..4d409e6a552d 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -616,10 +616,12 @@ static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, | |||
| 616 | } while (pte++, addr += PAGE_SIZE, addr != end); | 616 | } while (pte++, addr += PAGE_SIZE, addr != end); |
| 617 | } | 617 | } |
| 618 | 618 | ||
| 619 | static void __init map_init_section(pmd_t *pmd, unsigned long addr, | 619 | static void __init __map_init_section(pmd_t *pmd, unsigned long addr, |
| 620 | unsigned long end, phys_addr_t phys, | 620 | unsigned long end, phys_addr_t phys, |
| 621 | const struct mem_type *type) | 621 | const struct mem_type *type) |
| 622 | { | 622 | { |
| 623 | pmd_t *p = pmd; | ||
| 624 | |||
| 623 | #ifndef CONFIG_ARM_LPAE | 625 | #ifndef CONFIG_ARM_LPAE |
| 624 | /* | 626 | /* |
| 625 | * In classic MMU format, puds and pmds are folded in to | 627 | * In classic MMU format, puds and pmds are folded in to |
| @@ -638,7 +640,7 @@ static void __init map_init_section(pmd_t *pmd, unsigned long addr, | |||
| 638 | phys += SECTION_SIZE; | 640 | phys += SECTION_SIZE; |
| 639 | } while (pmd++, addr += SECTION_SIZE, addr != end); | 641 | } while (pmd++, addr += SECTION_SIZE, addr != end); |
| 640 | 642 | ||
| 641 | flush_pmd_entry(pmd); | 643 | flush_pmd_entry(p); |
| 642 | } | 644 | } |
| 643 | 645 | ||
| 644 | static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, | 646 | static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, |
| @@ -661,7 +663,7 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, | |||
| 661 | */ | 663 | */ |
| 662 | if (type->prot_sect && | 664 | if (type->prot_sect && |
| 663 | ((addr | next | phys) & ~SECTION_MASK) == 0) { | 665 | ((addr | next | phys) & ~SECTION_MASK) == 0) { |
| 664 | map_init_section(pmd, addr, next, phys, type); | 666 | __map_init_section(pmd, addr, next, phys, type); |
| 665 | } else { | 667 | } else { |
| 666 | alloc_init_pte(pmd, addr, next, | 668 | alloc_init_pte(pmd, addr, next, |
| 667 | __phys_to_pfn(phys), type); | 669 | __phys_to_pfn(phys), type); |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 2c73a7301ff7..4c8c9c10a388 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -409,8 +409,8 @@ __v7_ca9mp_proc_info: | |||
| 409 | */ | 409 | */ |
| 410 | .type __v7_pj4b_proc_info, #object | 410 | .type __v7_pj4b_proc_info, #object |
| 411 | __v7_pj4b_proc_info: | 411 | __v7_pj4b_proc_info: |
| 412 | .long 0x562f5840 | 412 | .long 0x560f5800 |
| 413 | .long 0xfffffff0 | 413 | .long 0xff0fff00 |
| 414 | __v7_proc __v7_pj4b_setup | 414 | __v7_proc __v7_pj4b_setup |
| 415 | .size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info | 415 | .size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info |
| 416 | 416 | ||
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 1e49e5eb81e9..9ba33c40cdf8 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c | |||
| @@ -1336,6 +1336,7 @@ void perf_callchain_user(struct perf_callchain_entry *entry, | |||
| 1336 | return; | 1336 | return; |
| 1337 | } | 1337 | } |
| 1338 | 1338 | ||
| 1339 | perf_callchain_store(entry, regs->pc); | ||
| 1339 | tail = (struct frame_tail __user *)regs->regs[29]; | 1340 | tail = (struct frame_tail __user *)regs->regs[29]; |
| 1340 | 1341 | ||
| 1341 | while (entry->nr < PERF_MAX_STACK_DEPTH && | 1342 | while (entry->nr < PERF_MAX_STACK_DEPTH && |
diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index bcda5b2d121a..d43daf192b21 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c | |||
| @@ -2042,7 +2042,8 @@ sba_map_ioc_to_node(struct ioc *ioc, acpi_handle handle) | |||
| 2042 | #endif | 2042 | #endif |
| 2043 | 2043 | ||
| 2044 | static int __init | 2044 | static int __init |
| 2045 | acpi_sba_ioc_add(struct acpi_device *device) | 2045 | acpi_sba_ioc_add(struct acpi_device *device, |
| 2046 | const struct acpi_device_id *not_used) | ||
| 2046 | { | 2047 | { |
| 2047 | struct ioc *ioc; | 2048 | struct ioc *ioc; |
| 2048 | acpi_status status; | 2049 | acpi_status status; |
| @@ -2090,14 +2091,18 @@ static const struct acpi_device_id hp_ioc_iommu_device_ids[] = { | |||
| 2090 | {"HWP0004", 0}, | 2091 | {"HWP0004", 0}, |
| 2091 | {"", 0}, | 2092 | {"", 0}, |
| 2092 | }; | 2093 | }; |
| 2093 | static struct acpi_driver acpi_sba_ioc_driver = { | 2094 | static struct acpi_scan_handler acpi_sba_ioc_handler = { |
| 2094 | .name = "IOC IOMMU Driver", | 2095 | .ids = hp_ioc_iommu_device_ids, |
| 2095 | .ids = hp_ioc_iommu_device_ids, | 2096 | .attach = acpi_sba_ioc_add, |
| 2096 | .ops = { | ||
| 2097 | .add = acpi_sba_ioc_add, | ||
| 2098 | }, | ||
| 2099 | }; | 2097 | }; |
| 2100 | 2098 | ||
| 2099 | static int __init acpi_sba_ioc_init_acpi(void) | ||
| 2100 | { | ||
| 2101 | return acpi_scan_add_handler(&acpi_sba_ioc_handler); | ||
| 2102 | } | ||
| 2103 | /* This has to run before acpi_scan_init(). */ | ||
| 2104 | arch_initcall(acpi_sba_ioc_init_acpi); | ||
| 2105 | |||
| 2101 | extern struct dma_map_ops swiotlb_dma_ops; | 2106 | extern struct dma_map_ops swiotlb_dma_ops; |
| 2102 | 2107 | ||
| 2103 | static int __init | 2108 | static int __init |
| @@ -2122,7 +2127,10 @@ sba_init(void) | |||
| 2122 | } | 2127 | } |
| 2123 | #endif | 2128 | #endif |
| 2124 | 2129 | ||
| 2125 | acpi_bus_register_driver(&acpi_sba_ioc_driver); | 2130 | /* |
| 2131 | * ioc_list should be populated by the acpi_sba_ioc_handler's .attach() | ||
| 2132 | * routine, but that only happens if acpi_scan_init() has already run. | ||
| 2133 | */ | ||
| 2126 | if (!ioc_list) { | 2134 | if (!ioc_list) { |
| 2127 | #ifdef CONFIG_IA64_GENERIC | 2135 | #ifdef CONFIG_IA64_GENERIC |
| 2128 | /* | 2136 | /* |
diff --git a/arch/ia64/include/asm/irqflags.h b/arch/ia64/include/asm/irqflags.h index 1bf2cf2f4ab4..cec6c06b52c0 100644 --- a/arch/ia64/include/asm/irqflags.h +++ b/arch/ia64/include/asm/irqflags.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #define _ASM_IA64_IRQFLAGS_H | 11 | #define _ASM_IA64_IRQFLAGS_H |
| 12 | 12 | ||
| 13 | #include <asm/pal.h> | 13 | #include <asm/pal.h> |
| 14 | #include <asm/kregs.h> | ||
| 14 | 15 | ||
| 15 | #ifdef CONFIG_IA64_DEBUG_IRQ | 16 | #ifdef CONFIG_IA64_DEBUG_IRQ |
| 16 | extern unsigned long last_cli_ip; | 17 | extern unsigned long last_cli_ip; |
diff --git a/arch/metag/include/asm/hugetlb.h b/arch/metag/include/asm/hugetlb.h index f545477e61f3..471f481e67f3 100644 --- a/arch/metag/include/asm/hugetlb.h +++ b/arch/metag/include/asm/hugetlb.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _ASM_METAG_HUGETLB_H | 2 | #define _ASM_METAG_HUGETLB_H |
| 3 | 3 | ||
| 4 | #include <asm/page.h> | 4 | #include <asm/page.h> |
| 5 | #include <asm-generic/hugetlb.h> | ||
| 5 | 6 | ||
| 6 | 7 | ||
| 7 | static inline int is_hugepage_only_range(struct mm_struct *mm, | 8 | static inline int is_hugepage_only_range(struct mm_struct *mm, |
diff --git a/arch/mn10300/include/asm/irqflags.h b/arch/mn10300/include/asm/irqflags.h index 678f68d5f37b..8730c0a3c37d 100644 --- a/arch/mn10300/include/asm/irqflags.h +++ b/arch/mn10300/include/asm/irqflags.h | |||
| @@ -13,9 +13,8 @@ | |||
| 13 | #define _ASM_IRQFLAGS_H | 13 | #define _ASM_IRQFLAGS_H |
| 14 | 14 | ||
| 15 | #include <asm/cpu-regs.h> | 15 | #include <asm/cpu-regs.h> |
| 16 | #ifndef __ASSEMBLY__ | 16 | /* linux/smp.h <- linux/irqflags.h needs asm/smp.h first */ |
| 17 | #include <linux/smp.h> | 17 | #include <asm/smp.h> |
| 18 | #endif | ||
| 19 | 18 | ||
| 20 | /* | 19 | /* |
| 21 | * interrupt control | 20 | * interrupt control |
diff --git a/arch/mn10300/include/asm/smp.h b/arch/mn10300/include/asm/smp.h index 6745dbe64944..56c42417d428 100644 --- a/arch/mn10300/include/asm/smp.h +++ b/arch/mn10300/include/asm/smp.h | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #ifndef __ASSEMBLY__ | 24 | #ifndef __ASSEMBLY__ |
| 25 | #include <linux/threads.h> | 25 | #include <linux/threads.h> |
| 26 | #include <linux/cpumask.h> | 26 | #include <linux/cpumask.h> |
| 27 | #include <linux/thread_info.h> | ||
| 27 | #endif | 28 | #endif |
| 28 | 29 | ||
| 29 | #ifdef CONFIG_SMP | 30 | #ifdef CONFIG_SMP |
| @@ -85,7 +86,7 @@ extern cpumask_t cpu_boot_map; | |||
| 85 | extern void smp_init_cpus(void); | 86 | extern void smp_init_cpus(void); |
| 86 | extern void smp_cache_interrupt(void); | 87 | extern void smp_cache_interrupt(void); |
| 87 | extern void send_IPI_allbutself(int irq); | 88 | extern void send_IPI_allbutself(int irq); |
| 88 | extern int smp_nmi_call_function(smp_call_func_t func, void *info, int wait); | 89 | extern int smp_nmi_call_function(void (*func)(void *), void *info, int wait); |
| 89 | 90 | ||
| 90 | extern void arch_send_call_function_single_ipi(int cpu); | 91 | extern void arch_send_call_function_single_ipi(int cpu); |
| 91 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); | 92 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); |
| @@ -100,6 +101,7 @@ extern void __cpu_die(unsigned int cpu); | |||
| 100 | #ifndef __ASSEMBLY__ | 101 | #ifndef __ASSEMBLY__ |
| 101 | 102 | ||
| 102 | static inline void smp_init_cpus(void) {} | 103 | static inline void smp_init_cpus(void) {} |
| 104 | #define raw_smp_processor_id() 0 | ||
| 103 | 105 | ||
| 104 | #endif /* __ASSEMBLY__ */ | 106 | #endif /* __ASSEMBLY__ */ |
| 105 | #endif /* CONFIG_SMP */ | 107 | #endif /* CONFIG_SMP */ |
diff --git a/arch/parisc/include/asm/mmzone.h b/arch/parisc/include/asm/mmzone.h index cc50d33b7b88..b6b34a0987e7 100644 --- a/arch/parisc/include/asm/mmzone.h +++ b/arch/parisc/include/asm/mmzone.h | |||
| @@ -27,7 +27,7 @@ extern struct node_map_data node_data[]; | |||
| 27 | 27 | ||
| 28 | #define PFNNID_SHIFT (30 - PAGE_SHIFT) | 28 | #define PFNNID_SHIFT (30 - PAGE_SHIFT) |
| 29 | #define PFNNID_MAP_MAX 512 /* support 512GB */ | 29 | #define PFNNID_MAP_MAX 512 /* support 512GB */ |
| 30 | extern unsigned char pfnnid_map[PFNNID_MAP_MAX]; | 30 | extern signed char pfnnid_map[PFNNID_MAP_MAX]; |
| 31 | 31 | ||
| 32 | #ifndef CONFIG_64BIT | 32 | #ifndef CONFIG_64BIT |
| 33 | #define pfn_is_io(pfn) ((pfn & (0xf0000000UL >> PAGE_SHIFT)) == (0xf0000000UL >> PAGE_SHIFT)) | 33 | #define pfn_is_io(pfn) ((pfn & (0xf0000000UL >> PAGE_SHIFT)) == (0xf0000000UL >> PAGE_SHIFT)) |
| @@ -46,7 +46,7 @@ static inline int pfn_to_nid(unsigned long pfn) | |||
| 46 | i = pfn >> PFNNID_SHIFT; | 46 | i = pfn >> PFNNID_SHIFT; |
| 47 | BUG_ON(i >= ARRAY_SIZE(pfnnid_map)); | 47 | BUG_ON(i >= ARRAY_SIZE(pfnnid_map)); |
| 48 | 48 | ||
| 49 | return (int)pfnnid_map[i]; | 49 | return pfnnid_map[i]; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | static inline int pfn_valid(int pfn) | 52 | static inline int pfn_valid(int pfn) |
diff --git a/arch/parisc/include/asm/pci.h b/arch/parisc/include/asm/pci.h index 3234f492d575..465154076d23 100644 --- a/arch/parisc/include/asm/pci.h +++ b/arch/parisc/include/asm/pci.h | |||
| @@ -225,4 +225,9 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | |||
| 225 | return channel ? 15 : 14; | 225 | return channel ? 15 : 14; |
| 226 | } | 226 | } |
| 227 | 227 | ||
| 228 | #define HAVE_PCI_MMAP | ||
| 229 | |||
| 230 | extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | ||
| 231 | enum pci_mmap_state mmap_state, int write_combine); | ||
| 232 | |||
| 228 | #endif /* __ASM_PARISC_PCI_H */ | 233 | #endif /* __ASM_PARISC_PCI_H */ |
diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c index 9e2d2e408529..872275659d98 100644 --- a/arch/parisc/kernel/hardware.c +++ b/arch/parisc/kernel/hardware.c | |||
| @@ -1205,6 +1205,7 @@ static struct hp_hardware hp_hardware_list[] = { | |||
| 1205 | {HPHW_FIO, 0x004, 0x00320, 0x0, "Metheus Frame Buffer"}, | 1205 | {HPHW_FIO, 0x004, 0x00320, 0x0, "Metheus Frame Buffer"}, |
| 1206 | {HPHW_FIO, 0x004, 0x00340, 0x0, "BARCO CX4500 VME Grphx Cnsl"}, | 1206 | {HPHW_FIO, 0x004, 0x00340, 0x0, "BARCO CX4500 VME Grphx Cnsl"}, |
| 1207 | {HPHW_FIO, 0x004, 0x00360, 0x0, "Hughes TOG VME FDDI"}, | 1207 | {HPHW_FIO, 0x004, 0x00360, 0x0, "Hughes TOG VME FDDI"}, |
| 1208 | {HPHW_FIO, 0x076, 0x000AD, 0x00, "Crestone Peak RS-232"}, | ||
| 1208 | {HPHW_IOA, 0x185, 0x0000B, 0x00, "Java BC Summit Port"}, | 1209 | {HPHW_IOA, 0x185, 0x0000B, 0x00, "Java BC Summit Port"}, |
| 1209 | {HPHW_IOA, 0x1FF, 0x0000B, 0x00, "Hitachi Ghostview Summit Port"}, | 1210 | {HPHW_IOA, 0x1FF, 0x0000B, 0x00, "Hitachi Ghostview Summit Port"}, |
| 1210 | {HPHW_IOA, 0x580, 0x0000B, 0x10, "U2-IOA BC Runway Port"}, | 1211 | {HPHW_IOA, 0x580, 0x0000B, 0x10, "U2-IOA BC Runway Port"}, |
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S index 36d7f402e48e..b743a80eaba0 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
| @@ -860,7 +860,7 @@ ENTRY(flush_dcache_page_asm) | |||
| 860 | #endif | 860 | #endif |
| 861 | 861 | ||
| 862 | ldil L%dcache_stride, %r1 | 862 | ldil L%dcache_stride, %r1 |
| 863 | ldw R%dcache_stride(%r1), %r1 | 863 | ldw R%dcache_stride(%r1), r31 |
| 864 | 864 | ||
| 865 | #ifdef CONFIG_64BIT | 865 | #ifdef CONFIG_64BIT |
| 866 | depdi,z 1, 63-PAGE_SHIFT,1, %r25 | 866 | depdi,z 1, 63-PAGE_SHIFT,1, %r25 |
| @@ -868,26 +868,26 @@ ENTRY(flush_dcache_page_asm) | |||
| 868 | depwi,z 1, 31-PAGE_SHIFT,1, %r25 | 868 | depwi,z 1, 31-PAGE_SHIFT,1, %r25 |
| 869 | #endif | 869 | #endif |
| 870 | add %r28, %r25, %r25 | 870 | add %r28, %r25, %r25 |
| 871 | sub %r25, %r1, %r25 | 871 | sub %r25, r31, %r25 |
| 872 | 872 | ||
| 873 | 873 | ||
| 874 | 1: fdc,m %r1(%r28) | 874 | 1: fdc,m r31(%r28) |
| 875 | fdc,m %r1(%r28) | 875 | fdc,m r31(%r28) |
| 876 | fdc,m %r1(%r28) | 876 | fdc,m r31(%r28) |
| 877 | fdc,m %r1(%r28) | 877 | fdc,m r31(%r28) |
| 878 | fdc,m %r1(%r28) | 878 | fdc,m r31(%r28) |
| 879 | fdc,m %r1(%r28) | 879 | fdc,m r31(%r28) |
| 880 | fdc,m %r1(%r28) | 880 | fdc,m r31(%r28) |
| 881 | fdc,m %r1(%r28) | 881 | fdc,m r31(%r28) |
| 882 | fdc,m %r1(%r28) | 882 | fdc,m r31(%r28) |
| 883 | fdc,m %r1(%r28) | 883 | fdc,m r31(%r28) |
| 884 | fdc,m %r1(%r28) | 884 | fdc,m r31(%r28) |
| 885 | fdc,m %r1(%r28) | 885 | fdc,m r31(%r28) |
| 886 | fdc,m %r1(%r28) | 886 | fdc,m r31(%r28) |
| 887 | fdc,m %r1(%r28) | 887 | fdc,m r31(%r28) |
| 888 | fdc,m %r1(%r28) | 888 | fdc,m r31(%r28) |
| 889 | cmpb,COND(<<) %r28, %r25,1b | 889 | cmpb,COND(<<) %r28, %r25,1b |
| 890 | fdc,m %r1(%r28) | 890 | fdc,m r31(%r28) |
| 891 | 891 | ||
| 892 | sync | 892 | sync |
| 893 | 893 | ||
| @@ -936,7 +936,7 @@ ENTRY(flush_icache_page_asm) | |||
| 936 | #endif | 936 | #endif |
| 937 | 937 | ||
| 938 | ldil L%icache_stride, %r1 | 938 | ldil L%icache_stride, %r1 |
| 939 | ldw R%icache_stride(%r1), %r1 | 939 | ldw R%icache_stride(%r1), %r31 |
| 940 | 940 | ||
| 941 | #ifdef CONFIG_64BIT | 941 | #ifdef CONFIG_64BIT |
| 942 | depdi,z 1, 63-PAGE_SHIFT,1, %r25 | 942 | depdi,z 1, 63-PAGE_SHIFT,1, %r25 |
| @@ -944,28 +944,28 @@ ENTRY(flush_icache_page_asm) | |||
| 944 | depwi,z 1, 31-PAGE_SHIFT,1, %r25 | 944 | depwi,z 1, 31-PAGE_SHIFT,1, %r25 |
| 945 | #endif | 945 | #endif |
| 946 | add %r28, %r25, %r25 | 946 | add %r28, %r25, %r25 |
| 947 | sub %r25, %r1, %r25 | 947 | sub %r25, %r31, %r25 |
| 948 | 948 | ||
| 949 | 949 | ||
| 950 | /* fic only has the type 26 form on PA1.1, requiring an | 950 | /* fic only has the type 26 form on PA1.1, requiring an |
| 951 | * explicit space specification, so use %sr4 */ | 951 | * explicit space specification, so use %sr4 */ |
| 952 | 1: fic,m %r1(%sr4,%r28) | 952 | 1: fic,m %r31(%sr4,%r28) |
| 953 | fic,m %r1(%sr4,%r28) | 953 | fic,m %r31(%sr4,%r28) |
| 954 | fic,m %r1(%sr4,%r28) | 954 | fic,m %r31(%sr4,%r28) |
| 955 | fic,m %r1(%sr4,%r28) | 955 | fic,m %r31(%sr4,%r28) |
| 956 | fic,m %r1(%sr4,%r28) | 956 | fic,m %r31(%sr4,%r28) |
| 957 | fic,m %r1(%sr4,%r28) | 957 | fic,m %r31(%sr4,%r28) |
| 958 | fic,m %r1(%sr4,%r28) | 958 | fic,m %r31(%sr4,%r28) |
| 959 | fic,m %r1(%sr4,%r28) | 959 | fic,m %r31(%sr4,%r28) |
| 960 | fic,m %r1(%sr4,%r28) | 960 | fic,m %r31(%sr4,%r28) |
| 961 | fic,m %r1(%sr4,%r28) | 961 | fic,m %r31(%sr4,%r28) |
| 962 | fic,m %r1(%sr4,%r28) | 962 | fic,m %r31(%sr4,%r28) |
| 963 | fic,m %r1(%sr4,%r28) | 963 | fic,m %r31(%sr4,%r28) |
| 964 | fic,m %r1(%sr4,%r28) | 964 | fic,m %r31(%sr4,%r28) |
| 965 | fic,m %r1(%sr4,%r28) | 965 | fic,m %r31(%sr4,%r28) |
| 966 | fic,m %r1(%sr4,%r28) | 966 | fic,m %r31(%sr4,%r28) |
| 967 | cmpb,COND(<<) %r28, %r25,1b | 967 | cmpb,COND(<<) %r28, %r25,1b |
| 968 | fic,m %r1(%sr4,%r28) | 968 | fic,m %r31(%sr4,%r28) |
| 969 | 969 | ||
| 970 | sync | 970 | sync |
| 971 | 971 | ||
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 60309051875e..64f2764a8cef 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
| @@ -220,6 +220,33 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res, | |||
| 220 | } | 220 | } |
| 221 | 221 | ||
| 222 | 222 | ||
| 223 | int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | ||
| 224 | enum pci_mmap_state mmap_state, int write_combine) | ||
| 225 | { | ||
| 226 | unsigned long prot; | ||
| 227 | |||
| 228 | /* | ||
| 229 | * I/O space can be accessed via normal processor loads and stores on | ||
| 230 | * this platform but for now we elect not to do this and portable | ||
| 231 | * drivers should not do this anyway. | ||
| 232 | */ | ||
| 233 | if (mmap_state == pci_mmap_io) | ||
| 234 | return -EINVAL; | ||
| 235 | |||
| 236 | if (write_combine) | ||
| 237 | return -EINVAL; | ||
| 238 | |||
| 239 | /* | ||
| 240 | * Ignore write-combine; for now only return uncached mappings. | ||
| 241 | */ | ||
| 242 | prot = pgprot_val(vma->vm_page_prot); | ||
| 243 | prot |= _PAGE_NO_CACHE; | ||
| 244 | vma->vm_page_prot = __pgprot(prot); | ||
| 245 | |||
| 246 | return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, | ||
| 247 | vma->vm_end - vma->vm_start, vma->vm_page_prot); | ||
| 248 | } | ||
| 249 | |||
| 223 | /* | 250 | /* |
| 224 | * A driver is enabling the device. We make sure that all the appropriate | 251 | * A driver is enabling the device. We make sure that all the appropriate |
| 225 | * bits are set to allow the device to operate as the driver is expecting. | 252 | * bits are set to allow the device to operate as the driver is expecting. |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index 1c965642068b..505b56c6b9b9 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
| @@ -47,7 +47,7 @@ pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((__section__ (".data..vm0.pt | |||
| 47 | 47 | ||
| 48 | #ifdef CONFIG_DISCONTIGMEM | 48 | #ifdef CONFIG_DISCONTIGMEM |
| 49 | struct node_map_data node_data[MAX_NUMNODES] __read_mostly; | 49 | struct node_map_data node_data[MAX_NUMNODES] __read_mostly; |
| 50 | unsigned char pfnnid_map[PFNNID_MAP_MAX] __read_mostly; | 50 | signed char pfnnid_map[PFNNID_MAP_MAX] __read_mostly; |
| 51 | #endif | 51 | #endif |
| 52 | 52 | ||
| 53 | static struct resource data_resource = { | 53 | static struct resource data_resource = { |
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 5cd7ad0c1176..1a1b51189773 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
| @@ -673,7 +673,6 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
| 673 | ret = s; | 673 | ret = s; |
| 674 | goto out; | 674 | goto out; |
| 675 | } | 675 | } |
| 676 | kvmppc_lazy_ee_enable(); | ||
| 677 | 676 | ||
| 678 | kvm_guest_enter(); | 677 | kvm_guest_enter(); |
| 679 | 678 | ||
| @@ -699,6 +698,8 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
| 699 | kvmppc_load_guest_fp(vcpu); | 698 | kvmppc_load_guest_fp(vcpu); |
| 700 | #endif | 699 | #endif |
| 701 | 700 | ||
| 701 | kvmppc_lazy_ee_enable(); | ||
| 702 | |||
| 702 | ret = __kvmppc_vcpu_run(kvm_run, vcpu); | 703 | ret = __kvmppc_vcpu_run(kvm_run, vcpu); |
| 703 | 704 | ||
| 704 | /* No need for kvm_guest_exit. It's done in handle_exit. | 705 | /* No need for kvm_guest_exit. It's done in handle_exit. |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index 237c8e5f2640..77fdd2cef33b 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
| @@ -592,8 +592,14 @@ static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud, | |||
| 592 | do { | 592 | do { |
| 593 | pmd = pmd_offset(pud, addr); | 593 | pmd = pmd_offset(pud, addr); |
| 594 | next = pmd_addr_end(addr, end); | 594 | next = pmd_addr_end(addr, end); |
| 595 | if (pmd_none_or_clear_bad(pmd)) | 595 | if (!is_hugepd(pmd)) { |
| 596 | /* | ||
| 597 | * if it is not hugepd pointer, we should already find | ||
| 598 | * it cleared. | ||
| 599 | */ | ||
| 600 | WARN_ON(!pmd_none_or_clear_bad(pmd)); | ||
| 596 | continue; | 601 | continue; |
| 602 | } | ||
| 597 | #ifdef CONFIG_PPC_FSL_BOOK3E | 603 | #ifdef CONFIG_PPC_FSL_BOOK3E |
| 598 | /* | 604 | /* |
| 599 | * Increment next by the size of the huge mapping since | 605 | * Increment next by the size of the huge mapping since |
diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild index ff18e3cfb6b1..7e4a97fbded4 100644 --- a/arch/sparc/include/asm/Kbuild +++ b/arch/sparc/include/asm/Kbuild | |||
| @@ -6,6 +6,7 @@ generic-y += cputime.h | |||
| 6 | generic-y += div64.h | 6 | generic-y += div64.h |
| 7 | generic-y += emergency-restart.h | 7 | generic-y += emergency-restart.h |
| 8 | generic-y += exec.h | 8 | generic-y += exec.h |
| 9 | generic-y += linkage.h | ||
| 9 | generic-y += local64.h | 10 | generic-y += local64.h |
| 10 | generic-y += mutex.h | 11 | generic-y += mutex.h |
| 11 | generic-y += irq_regs.h | 12 | generic-y += irq_regs.h |
diff --git a/arch/sparc/include/asm/leon.h b/arch/sparc/include/asm/leon.h index 15a716934e4d..b836e9297f2a 100644 --- a/arch/sparc/include/asm/leon.h +++ b/arch/sparc/include/asm/leon.h | |||
| @@ -135,7 +135,7 @@ static inline int sparc_leon3_cpuid(void) | |||
| 135 | 135 | ||
| 136 | #ifdef CONFIG_SMP | 136 | #ifdef CONFIG_SMP |
| 137 | # define LEON3_IRQ_IPI_DEFAULT 13 | 137 | # define LEON3_IRQ_IPI_DEFAULT 13 |
| 138 | # define LEON3_IRQ_TICKER (leon3_ticker_irq) | 138 | # define LEON3_IRQ_TICKER (leon3_gptimer_irq) |
| 139 | # define LEON3_IRQ_CROSS_CALL 15 | 139 | # define LEON3_IRQ_CROSS_CALL 15 |
| 140 | #endif | 140 | #endif |
| 141 | 141 | ||
diff --git a/arch/sparc/include/asm/leon_amba.h b/arch/sparc/include/asm/leon_amba.h index f3034eddf468..24ec48c3ff90 100644 --- a/arch/sparc/include/asm/leon_amba.h +++ b/arch/sparc/include/asm/leon_amba.h | |||
| @@ -47,6 +47,7 @@ struct amba_prom_registers { | |||
| 47 | #define LEON3_GPTIMER_LD 4 | 47 | #define LEON3_GPTIMER_LD 4 |
| 48 | #define LEON3_GPTIMER_IRQEN 8 | 48 | #define LEON3_GPTIMER_IRQEN 8 |
| 49 | #define LEON3_GPTIMER_SEPIRQ 8 | 49 | #define LEON3_GPTIMER_SEPIRQ 8 |
| 50 | #define LEON3_GPTIMER_TIMERS 0x7 | ||
| 50 | 51 | ||
| 51 | #define LEON23_REG_TIMER_CONTROL_EN 0x00000001 /* 1 = enable counting */ | 52 | #define LEON23_REG_TIMER_CONTROL_EN 0x00000001 /* 1 = enable counting */ |
| 52 | /* 0 = hold scalar and counter */ | 53 | /* 0 = hold scalar and counter */ |
diff --git a/arch/sparc/include/asm/linkage.h b/arch/sparc/include/asm/linkage.h deleted file mode 100644 index 291c2d01c44f..000000000000 --- a/arch/sparc/include/asm/linkage.h +++ /dev/null | |||
| @@ -1,6 +0,0 @@ | |||
| 1 | #ifndef __ASM_LINKAGE_H | ||
| 2 | #define __ASM_LINKAGE_H | ||
| 3 | |||
| 4 | /* Nothing to see here... */ | ||
| 5 | |||
| 6 | #endif | ||
diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index 75bb608c423e..5ef48dab5636 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c | |||
| @@ -843,7 +843,8 @@ void ldom_reboot(const char *boot_command) | |||
| 843 | unsigned long len; | 843 | unsigned long len; |
| 844 | 844 | ||
| 845 | strcpy(full_boot_str, "boot "); | 845 | strcpy(full_boot_str, "boot "); |
| 846 | strcpy(full_boot_str + strlen("boot "), boot_command); | 846 | strlcpy(full_boot_str + strlen("boot "), boot_command, |
| 847 | sizeof(full_boot_str + strlen("boot "))); | ||
| 847 | len = strlen(full_boot_str); | 848 | len = strlen(full_boot_str); |
| 848 | 849 | ||
| 849 | if (reboot_data_supported) { | 850 | if (reboot_data_supported) { |
diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index 7c0231dabe44..b7c68976cbc7 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c | |||
| @@ -38,7 +38,6 @@ static DEFINE_SPINLOCK(leon_irq_lock); | |||
| 38 | 38 | ||
| 39 | unsigned long leon3_gptimer_irq; /* interrupt controller irq number */ | 39 | unsigned long leon3_gptimer_irq; /* interrupt controller irq number */ |
| 40 | unsigned long leon3_gptimer_idx; /* Timer Index (0..6) within Timer Core */ | 40 | unsigned long leon3_gptimer_idx; /* Timer Index (0..6) within Timer Core */ |
| 41 | int leon3_ticker_irq; /* Timer ticker IRQ */ | ||
| 42 | unsigned int sparc_leon_eirq; | 41 | unsigned int sparc_leon_eirq; |
| 43 | #define LEON_IMASK(cpu) (&leon3_irqctrl_regs->mask[cpu]) | 42 | #define LEON_IMASK(cpu) (&leon3_irqctrl_regs->mask[cpu]) |
| 44 | #define LEON_IACK (&leon3_irqctrl_regs->iclear) | 43 | #define LEON_IACK (&leon3_irqctrl_regs->iclear) |
| @@ -278,6 +277,9 @@ irqreturn_t leon_percpu_timer_ce_interrupt(int irq, void *unused) | |||
| 278 | 277 | ||
| 279 | leon_clear_profile_irq(cpu); | 278 | leon_clear_profile_irq(cpu); |
| 280 | 279 | ||
| 280 | if (cpu == boot_cpu_id) | ||
| 281 | timer_interrupt(irq, NULL); | ||
| 282 | |||
| 281 | ce = &per_cpu(sparc32_clockevent, cpu); | 283 | ce = &per_cpu(sparc32_clockevent, cpu); |
| 282 | 284 | ||
| 283 | irq_enter(); | 285 | irq_enter(); |
| @@ -299,6 +301,7 @@ void __init leon_init_timers(void) | |||
| 299 | int icsel; | 301 | int icsel; |
| 300 | int ampopts; | 302 | int ampopts; |
| 301 | int err; | 303 | int err; |
| 304 | u32 config; | ||
| 302 | 305 | ||
| 303 | sparc_config.get_cycles_offset = leon_cycles_offset; | 306 | sparc_config.get_cycles_offset = leon_cycles_offset; |
| 304 | sparc_config.cs_period = 1000000 / HZ; | 307 | sparc_config.cs_period = 1000000 / HZ; |
| @@ -377,23 +380,6 @@ void __init leon_init_timers(void) | |||
| 377 | LEON3_BYPASS_STORE_PA( | 380 | LEON3_BYPASS_STORE_PA( |
| 378 | &leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, 0); | 381 | &leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, 0); |
| 379 | 382 | ||
| 380 | #ifdef CONFIG_SMP | ||
| 381 | leon3_ticker_irq = leon3_gptimer_irq + 1 + leon3_gptimer_idx; | ||
| 382 | |||
| 383 | if (!(LEON3_BYPASS_LOAD_PA(&leon3_gptimer_regs->config) & | ||
| 384 | (1<<LEON3_GPTIMER_SEPIRQ))) { | ||
| 385 | printk(KERN_ERR "timer not configured with separate irqs\n"); | ||
| 386 | BUG(); | ||
| 387 | } | ||
| 388 | |||
| 389 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx+1].val, | ||
| 390 | 0); | ||
| 391 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx+1].rld, | ||
| 392 | (((1000000/HZ) - 1))); | ||
| 393 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx+1].ctrl, | ||
| 394 | 0); | ||
| 395 | #endif | ||
| 396 | |||
| 397 | /* | 383 | /* |
| 398 | * The IRQ controller may (if implemented) consist of multiple | 384 | * The IRQ controller may (if implemented) consist of multiple |
| 399 | * IRQ controllers, each mapped on a 4Kb boundary. | 385 | * IRQ controllers, each mapped on a 4Kb boundary. |
| @@ -416,13 +402,6 @@ void __init leon_init_timers(void) | |||
| 416 | if (eirq != 0) | 402 | if (eirq != 0) |
| 417 | leon_eirq_setup(eirq); | 403 | leon_eirq_setup(eirq); |
| 418 | 404 | ||
| 419 | irq = _leon_build_device_irq(NULL, leon3_gptimer_irq+leon3_gptimer_idx); | ||
| 420 | err = request_irq(irq, timer_interrupt, IRQF_TIMER, "timer", NULL); | ||
| 421 | if (err) { | ||
| 422 | printk(KERN_ERR "unable to attach timer IRQ%d\n", irq); | ||
| 423 | prom_halt(); | ||
| 424 | } | ||
| 425 | |||
| 426 | #ifdef CONFIG_SMP | 405 | #ifdef CONFIG_SMP |
| 427 | { | 406 | { |
| 428 | unsigned long flags; | 407 | unsigned long flags; |
| @@ -439,30 +418,31 @@ void __init leon_init_timers(void) | |||
| 439 | } | 418 | } |
| 440 | #endif | 419 | #endif |
| 441 | 420 | ||
| 442 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, | 421 | config = LEON3_BYPASS_LOAD_PA(&leon3_gptimer_regs->config); |
| 443 | LEON3_GPTIMER_EN | | 422 | if (config & (1 << LEON3_GPTIMER_SEPIRQ)) |
| 444 | LEON3_GPTIMER_RL | | 423 | leon3_gptimer_irq += leon3_gptimer_idx; |
| 445 | LEON3_GPTIMER_LD | | 424 | else if ((config & LEON3_GPTIMER_TIMERS) > 1) |
| 446 | LEON3_GPTIMER_IRQEN); | 425 | pr_warn("GPTIMER uses shared irqs, using other timers of the same core will fail.\n"); |
| 447 | 426 | ||
| 448 | #ifdef CONFIG_SMP | 427 | #ifdef CONFIG_SMP |
| 449 | /* Install per-cpu IRQ handler for broadcasted ticker */ | 428 | /* Install per-cpu IRQ handler for broadcasted ticker */ |
| 450 | irq = leon_build_device_irq(leon3_ticker_irq, handle_percpu_irq, | 429 | irq = leon_build_device_irq(leon3_gptimer_irq, handle_percpu_irq, |
| 451 | "per-cpu", 0); | 430 | "per-cpu", 0); |
| 452 | err = request_irq(irq, leon_percpu_timer_ce_interrupt, | 431 | err = request_irq(irq, leon_percpu_timer_ce_interrupt, |
| 453 | IRQF_PERCPU | IRQF_TIMER, "ticker", | 432 | IRQF_PERCPU | IRQF_TIMER, "timer", NULL); |
| 454 | NULL); | 433 | #else |
| 434 | irq = _leon_build_device_irq(NULL, leon3_gptimer_irq); | ||
| 435 | err = request_irq(irq, timer_interrupt, IRQF_TIMER, "timer", NULL); | ||
| 436 | #endif | ||
| 455 | if (err) { | 437 | if (err) { |
| 456 | printk(KERN_ERR "unable to attach ticker IRQ%d\n", irq); | 438 | pr_err("Unable to attach timer IRQ%d\n", irq); |
| 457 | prom_halt(); | 439 | prom_halt(); |
| 458 | } | 440 | } |
| 459 | 441 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, | |
| 460 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx+1].ctrl, | ||
| 461 | LEON3_GPTIMER_EN | | 442 | LEON3_GPTIMER_EN | |
| 462 | LEON3_GPTIMER_RL | | 443 | LEON3_GPTIMER_RL | |
| 463 | LEON3_GPTIMER_LD | | 444 | LEON3_GPTIMER_LD | |
| 464 | LEON3_GPTIMER_IRQEN); | 445 | LEON3_GPTIMER_IRQEN); |
| 465 | #endif | ||
| 466 | return; | 446 | return; |
| 467 | bad: | 447 | bad: |
| 468 | printk(KERN_ERR "No Timer/irqctrl found\n"); | 448 | printk(KERN_ERR "No Timer/irqctrl found\n"); |
diff --git a/arch/sparc/kernel/leon_pci_grpci1.c b/arch/sparc/kernel/leon_pci_grpci1.c index 7739a54315e2..6df26e37f879 100644 --- a/arch/sparc/kernel/leon_pci_grpci1.c +++ b/arch/sparc/kernel/leon_pci_grpci1.c | |||
| @@ -536,11 +536,9 @@ static int grpci1_of_probe(struct platform_device *ofdev) | |||
| 536 | 536 | ||
| 537 | /* find device register base address */ | 537 | /* find device register base address */ |
| 538 | res = platform_get_resource(ofdev, IORESOURCE_MEM, 0); | 538 | res = platform_get_resource(ofdev, IORESOURCE_MEM, 0); |
| 539 | regs = devm_request_and_ioremap(&ofdev->dev, res); | 539 | regs = devm_ioremap_resource(&ofdev->dev, res); |
| 540 | if (!regs) { | 540 | if (IS_ERR(regs)) |
| 541 | dev_err(&ofdev->dev, "io-regs mapping failed\n"); | 541 | return PTR_ERR(regs); |
| 542 | return -EADDRNOTAVAIL; | ||
| 543 | } | ||
| 544 | 542 | ||
| 545 | /* | 543 | /* |
| 546 | * check that we're in Host Slot and that we can act as a Host Bridge | 544 | * check that we're in Host Slot and that we can act as a Host Bridge |
diff --git a/arch/sparc/kernel/leon_pmc.c b/arch/sparc/kernel/leon_pmc.c index bdf53d9a8d46..b0b3967a2dd2 100644 --- a/arch/sparc/kernel/leon_pmc.c +++ b/arch/sparc/kernel/leon_pmc.c | |||
| @@ -47,6 +47,10 @@ void pmc_leon_idle_fixup(void) | |||
| 47 | * MMU does not get a TLB miss here by using the MMU BYPASS ASI. | 47 | * MMU does not get a TLB miss here by using the MMU BYPASS ASI. |
| 48 | */ | 48 | */ |
| 49 | register unsigned int address = (unsigned int)leon3_irqctrl_regs; | 49 | register unsigned int address = (unsigned int)leon3_irqctrl_regs; |
| 50 | |||
| 51 | /* Interrupts need to be enabled to not hang the CPU */ | ||
| 52 | local_irq_enable(); | ||
| 53 | |||
| 50 | __asm__ __volatile__ ( | 54 | __asm__ __volatile__ ( |
| 51 | "wr %%g0, %%asr19\n" | 55 | "wr %%g0, %%asr19\n" |
| 52 | "lda [%0] %1, %%g0\n" | 56 | "lda [%0] %1, %%g0\n" |
| @@ -60,6 +64,9 @@ void pmc_leon_idle_fixup(void) | |||
| 60 | */ | 64 | */ |
| 61 | void pmc_leon_idle(void) | 65 | void pmc_leon_idle(void) |
| 62 | { | 66 | { |
| 67 | /* Interrupts need to be enabled to not hang the CPU */ | ||
| 68 | local_irq_enable(); | ||
| 69 | |||
| 63 | /* For systems without power-down, this will be no-op */ | 70 | /* For systems without power-down, this will be no-op */ |
| 64 | __asm__ __volatile__ ("wr %g0, %asr19\n\t"); | 71 | __asm__ __volatile__ ("wr %g0, %asr19\n\t"); |
| 65 | } | 72 | } |
diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c index 38bf80a22f02..1434526970a6 100644 --- a/arch/sparc/kernel/setup_32.c +++ b/arch/sparc/kernel/setup_32.c | |||
| @@ -304,7 +304,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 304 | 304 | ||
| 305 | /* Initialize PROM console and command line. */ | 305 | /* Initialize PROM console and command line. */ |
| 306 | *cmdline_p = prom_getbootargs(); | 306 | *cmdline_p = prom_getbootargs(); |
| 307 | strcpy(boot_command_line, *cmdline_p); | 307 | strlcpy(boot_command_line, *cmdline_p, COMMAND_LINE_SIZE); |
| 308 | parse_early_param(); | 308 | parse_early_param(); |
| 309 | 309 | ||
| 310 | boot_flags_init(*cmdline_p); | 310 | boot_flags_init(*cmdline_p); |
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 88a127b9c69e..13785547e435 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c | |||
| @@ -555,7 +555,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 555 | { | 555 | { |
| 556 | /* Initialize PROM console and command line. */ | 556 | /* Initialize PROM console and command line. */ |
| 557 | *cmdline_p = prom_getbootargs(); | 557 | *cmdline_p = prom_getbootargs(); |
| 558 | strcpy(boot_command_line, *cmdline_p); | 558 | strlcpy(boot_command_line, *cmdline_p, COMMAND_LINE_SIZE); |
| 559 | parse_early_param(); | 559 | parse_early_param(); |
| 560 | 560 | ||
| 561 | boot_flags_init(*cmdline_p); | 561 | boot_flags_init(*cmdline_p); |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index a7171997adfd..04fd55a6e461 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
| @@ -1098,7 +1098,14 @@ static int __init grab_mblocks(struct mdesc_handle *md) | |||
| 1098 | m->size = *val; | 1098 | m->size = *val; |
| 1099 | val = mdesc_get_property(md, node, | 1099 | val = mdesc_get_property(md, node, |
| 1100 | "address-congruence-offset", NULL); | 1100 | "address-congruence-offset", NULL); |
| 1101 | m->offset = *val; | 1101 | |
| 1102 | /* The address-congruence-offset property is optional. | ||
| 1103 | * Explicity zero it be identifty this. | ||
| 1104 | */ | ||
| 1105 | if (val) | ||
| 1106 | m->offset = *val; | ||
| 1107 | else | ||
| 1108 | m->offset = 0UL; | ||
| 1102 | 1109 | ||
| 1103 | numadbg("MBLOCK[%d]: base[%llx] size[%llx] offset[%llx]\n", | 1110 | numadbg("MBLOCK[%d]: base[%llx] size[%llx] offset[%llx]\n", |
| 1104 | count - 1, m->base, m->size, m->offset); | 1111 | count - 1, m->base, m->size, m->offset); |
diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c index 83d89bcb44af..37e7bc4c95b3 100644 --- a/arch/sparc/mm/tlb.c +++ b/arch/sparc/mm/tlb.c | |||
| @@ -85,8 +85,8 @@ static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr, | |||
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | if (!tb->active) { | 87 | if (!tb->active) { |
| 88 | global_flush_tlb_page(mm, vaddr); | ||
| 89 | flush_tsb_user_page(mm, vaddr); | 88 | flush_tsb_user_page(mm, vaddr); |
| 89 | global_flush_tlb_page(mm, vaddr); | ||
| 90 | goto out; | 90 | goto out; |
| 91 | } | 91 | } |
| 92 | 92 | ||
diff --git a/arch/sparc/prom/bootstr_32.c b/arch/sparc/prom/bootstr_32.c index f5ec32e0d419..d2b49d2365e7 100644 --- a/arch/sparc/prom/bootstr_32.c +++ b/arch/sparc/prom/bootstr_32.c | |||
| @@ -23,23 +23,25 @@ prom_getbootargs(void) | |||
| 23 | return barg_buf; | 23 | return barg_buf; |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | switch(prom_vers) { | 26 | switch (prom_vers) { |
| 27 | case PROM_V0: | 27 | case PROM_V0: |
| 28 | cp = barg_buf; | 28 | cp = barg_buf; |
| 29 | /* Start from 1 and go over fd(0,0,0)kernel */ | 29 | /* Start from 1 and go over fd(0,0,0)kernel */ |
| 30 | for(iter = 1; iter < 8; iter++) { | 30 | for (iter = 1; iter < 8; iter++) { |
| 31 | arg = (*(romvec->pv_v0bootargs))->argv[iter]; | 31 | arg = (*(romvec->pv_v0bootargs))->argv[iter]; |
| 32 | if (arg == NULL) | 32 | if (arg == NULL) |
| 33 | break; | 33 | break; |
| 34 | while(*arg != 0) { | 34 | while (*arg != 0) { |
| 35 | /* Leave place for space and null. */ | 35 | /* Leave place for space and null. */ |
| 36 | if(cp >= barg_buf + BARG_LEN-2){ | 36 | if (cp >= barg_buf + BARG_LEN - 2) |
| 37 | /* We might issue a warning here. */ | 37 | /* We might issue a warning here. */ |
| 38 | break; | 38 | break; |
| 39 | } | ||
| 40 | *cp++ = *arg++; | 39 | *cp++ = *arg++; |
| 41 | } | 40 | } |
| 42 | *cp++ = ' '; | 41 | *cp++ = ' '; |
| 42 | if (cp >= barg_buf + BARG_LEN - 1) | ||
| 43 | /* We might issue a warning here. */ | ||
| 44 | break; | ||
| 43 | } | 45 | } |
| 44 | *cp = 0; | 46 | *cp = 0; |
| 45 | break; | 47 | break; |
diff --git a/arch/sparc/prom/tree_64.c b/arch/sparc/prom/tree_64.c index 92204c3800b5..bd1b2a3ac34e 100644 --- a/arch/sparc/prom/tree_64.c +++ b/arch/sparc/prom/tree_64.c | |||
| @@ -39,7 +39,7 @@ inline phandle __prom_getchild(phandle node) | |||
| 39 | return prom_node_to_node("child", node); | 39 | return prom_node_to_node("child", node); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | inline phandle prom_getchild(phandle node) | 42 | phandle prom_getchild(phandle node) |
| 43 | { | 43 | { |
| 44 | phandle cnode; | 44 | phandle cnode; |
| 45 | 45 | ||
| @@ -72,7 +72,7 @@ inline phandle __prom_getsibling(phandle node) | |||
| 72 | return prom_node_to_node(prom_peer_name, node); | 72 | return prom_node_to_node(prom_peer_name, node); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | inline phandle prom_getsibling(phandle node) | 75 | phandle prom_getsibling(phandle node) |
| 76 | { | 76 | { |
| 77 | phandle sibnode; | 77 | phandle sibnode; |
| 78 | 78 | ||
| @@ -89,7 +89,7 @@ EXPORT_SYMBOL(prom_getsibling); | |||
| 89 | /* Return the length in bytes of property 'prop' at node 'node'. | 89 | /* Return the length in bytes of property 'prop' at node 'node'. |
| 90 | * Return -1 on error. | 90 | * Return -1 on error. |
| 91 | */ | 91 | */ |
| 92 | inline int prom_getproplen(phandle node, const char *prop) | 92 | int prom_getproplen(phandle node, const char *prop) |
| 93 | { | 93 | { |
| 94 | unsigned long args[6]; | 94 | unsigned long args[6]; |
| 95 | 95 | ||
| @@ -113,8 +113,8 @@ EXPORT_SYMBOL(prom_getproplen); | |||
| 113 | * 'buffer' which has a size of 'bufsize'. If the acquisition | 113 | * 'buffer' which has a size of 'bufsize'. If the acquisition |
| 114 | * was successful the length will be returned, else -1 is returned. | 114 | * was successful the length will be returned, else -1 is returned. |
| 115 | */ | 115 | */ |
| 116 | inline int prom_getproperty(phandle node, const char *prop, | 116 | int prom_getproperty(phandle node, const char *prop, |
| 117 | char *buffer, int bufsize) | 117 | char *buffer, int bufsize) |
| 118 | { | 118 | { |
| 119 | unsigned long args[8]; | 119 | unsigned long args[8]; |
| 120 | int plen; | 120 | int plen; |
| @@ -141,7 +141,7 @@ EXPORT_SYMBOL(prom_getproperty); | |||
| 141 | /* Acquire an integer property and return its value. Returns -1 | 141 | /* Acquire an integer property and return its value. Returns -1 |
| 142 | * on failure. | 142 | * on failure. |
| 143 | */ | 143 | */ |
| 144 | inline int prom_getint(phandle node, const char *prop) | 144 | int prom_getint(phandle node, const char *prop) |
| 145 | { | 145 | { |
| 146 | int intprop; | 146 | int intprop; |
| 147 | 147 | ||
| @@ -235,7 +235,7 @@ static const char *prom_nextprop_name = "nextprop"; | |||
| 235 | /* Return the first property type for node 'node'. | 235 | /* Return the first property type for node 'node'. |
| 236 | * buffer should be at least 32B in length | 236 | * buffer should be at least 32B in length |
| 237 | */ | 237 | */ |
| 238 | inline char *prom_firstprop(phandle node, char *buffer) | 238 | char *prom_firstprop(phandle node, char *buffer) |
| 239 | { | 239 | { |
| 240 | unsigned long args[7]; | 240 | unsigned long args[7]; |
| 241 | 241 | ||
| @@ -261,7 +261,7 @@ EXPORT_SYMBOL(prom_firstprop); | |||
| 261 | * at node 'node' . Returns NULL string if no more | 261 | * at node 'node' . Returns NULL string if no more |
| 262 | * property types for this node. | 262 | * property types for this node. |
| 263 | */ | 263 | */ |
| 264 | inline char *prom_nextprop(phandle node, const char *oprop, char *buffer) | 264 | char *prom_nextprop(phandle node, const char *oprop, char *buffer) |
| 265 | { | 265 | { |
| 266 | unsigned long args[7]; | 266 | unsigned long args[7]; |
| 267 | char buf[32]; | 267 | char buf[32]; |
diff --git a/arch/tile/lib/exports.c b/arch/tile/lib/exports.c index 4385cb6fa00a..a93b02a25222 100644 --- a/arch/tile/lib/exports.c +++ b/arch/tile/lib/exports.c | |||
| @@ -84,4 +84,6 @@ uint64_t __ashrdi3(uint64_t, unsigned int); | |||
| 84 | EXPORT_SYMBOL(__ashrdi3); | 84 | EXPORT_SYMBOL(__ashrdi3); |
| 85 | uint64_t __ashldi3(uint64_t, unsigned int); | 85 | uint64_t __ashldi3(uint64_t, unsigned int); |
| 86 | EXPORT_SYMBOL(__ashldi3); | 86 | EXPORT_SYMBOL(__ashldi3); |
| 87 | int __ffsdi2(uint64_t); | ||
| 88 | EXPORT_SYMBOL(__ffsdi2); | ||
| 87 | #endif | 89 | #endif |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index d7d21851e60c..3df3bd544492 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
| @@ -147,7 +147,7 @@ void mconsole_proc(struct mc_request *req) | |||
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | do { | 149 | do { |
| 150 | loff_t pos; | 150 | loff_t pos = file->f_pos; |
| 151 | mm_segment_t old_fs = get_fs(); | 151 | mm_segment_t old_fs = get_fs(); |
| 152 | set_fs(KERNEL_DS); | 152 | set_fs(KERNEL_DS); |
| 153 | len = vfs_read(file, buf, PAGE_SIZE - 1, &pos); | 153 | len = vfs_read(file, buf, PAGE_SIZE - 1, &pos); |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 685692c94f05..fe120da25625 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -2265,6 +2265,7 @@ source "fs/Kconfig.binfmt" | |||
| 2265 | config IA32_EMULATION | 2265 | config IA32_EMULATION |
| 2266 | bool "IA32 Emulation" | 2266 | bool "IA32 Emulation" |
| 2267 | depends on X86_64 | 2267 | depends on X86_64 |
| 2268 | select BINFMT_ELF | ||
| 2268 | select COMPAT_BINFMT_ELF | 2269 | select COMPAT_BINFMT_ELF |
| 2269 | select HAVE_UID16 | 2270 | select HAVE_UID16 |
| 2270 | ---help--- | 2271 | ---help--- |
diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S index 62fe22cd4cba..477e9d75149b 100644 --- a/arch/x86/crypto/aesni-intel_asm.S +++ b/arch/x86/crypto/aesni-intel_asm.S | |||
| @@ -2681,56 +2681,68 @@ ENTRY(aesni_xts_crypt8) | |||
| 2681 | addq %rcx, KEYP | 2681 | addq %rcx, KEYP |
| 2682 | 2682 | ||
| 2683 | movdqa IV, STATE1 | 2683 | movdqa IV, STATE1 |
| 2684 | pxor 0x00(INP), STATE1 | 2684 | movdqu 0x00(INP), INC |
| 2685 | pxor INC, STATE1 | ||
| 2685 | movdqu IV, 0x00(OUTP) | 2686 | movdqu IV, 0x00(OUTP) |
| 2686 | 2687 | ||
| 2687 | _aesni_gf128mul_x_ble() | 2688 | _aesni_gf128mul_x_ble() |
| 2688 | movdqa IV, STATE2 | 2689 | movdqa IV, STATE2 |
| 2689 | pxor 0x10(INP), STATE2 | 2690 | movdqu 0x10(INP), INC |
| 2691 | pxor INC, STATE2 | ||
| 2690 | movdqu IV, 0x10(OUTP) | 2692 | movdqu IV, 0x10(OUTP) |
| 2691 | 2693 | ||
| 2692 | _aesni_gf128mul_x_ble() | 2694 | _aesni_gf128mul_x_ble() |
| 2693 | movdqa IV, STATE3 | 2695 | movdqa IV, STATE3 |
| 2694 | pxor 0x20(INP), STATE3 | 2696 | movdqu 0x20(INP), INC |
| 2697 | pxor INC, STATE3 | ||
| 2695 | movdqu IV, 0x20(OUTP) | 2698 | movdqu IV, 0x20(OUTP) |
| 2696 | 2699 | ||
| 2697 | _aesni_gf128mul_x_ble() | 2700 | _aesni_gf128mul_x_ble() |
| 2698 | movdqa IV, STATE4 | 2701 | movdqa IV, STATE4 |
| 2699 | pxor 0x30(INP), STATE4 | 2702 | movdqu 0x30(INP), INC |
| 2703 | pxor INC, STATE4 | ||
| 2700 | movdqu IV, 0x30(OUTP) | 2704 | movdqu IV, 0x30(OUTP) |
| 2701 | 2705 | ||
| 2702 | call *%r11 | 2706 | call *%r11 |
| 2703 | 2707 | ||
| 2704 | pxor 0x00(OUTP), STATE1 | 2708 | movdqu 0x00(OUTP), INC |
| 2709 | pxor INC, STATE1 | ||
| 2705 | movdqu STATE1, 0x00(OUTP) | 2710 | movdqu STATE1, 0x00(OUTP) |
| 2706 | 2711 | ||
| 2707 | _aesni_gf128mul_x_ble() | 2712 | _aesni_gf128mul_x_ble() |
| 2708 | movdqa IV, STATE1 | 2713 | movdqa IV, STATE1 |
| 2709 | pxor 0x40(INP), STATE1 | 2714 | movdqu 0x40(INP), INC |
| 2715 | pxor INC, STATE1 | ||
| 2710 | movdqu IV, 0x40(OUTP) | 2716 | movdqu IV, 0x40(OUTP) |
| 2711 | 2717 | ||
| 2712 | pxor 0x10(OUTP), STATE2 | 2718 | movdqu 0x10(OUTP), INC |
| 2719 | pxor INC, STATE2 | ||
| 2713 | movdqu STATE2, 0x10(OUTP) | 2720 | movdqu STATE2, 0x10(OUTP) |
| 2714 | 2721 | ||
| 2715 | _aesni_gf128mul_x_ble() | 2722 | _aesni_gf128mul_x_ble() |
| 2716 | movdqa IV, STATE2 | 2723 | movdqa IV, STATE2 |
| 2717 | pxor 0x50(INP), STATE2 | 2724 | movdqu 0x50(INP), INC |
| 2725 | pxor INC, STATE2 | ||
| 2718 | movdqu IV, 0x50(OUTP) | 2726 | movdqu IV, 0x50(OUTP) |
| 2719 | 2727 | ||
| 2720 | pxor 0x20(OUTP), STATE3 | 2728 | movdqu 0x20(OUTP), INC |
| 2729 | pxor INC, STATE3 | ||
| 2721 | movdqu STATE3, 0x20(OUTP) | 2730 | movdqu STATE3, 0x20(OUTP) |
| 2722 | 2731 | ||
| 2723 | _aesni_gf128mul_x_ble() | 2732 | _aesni_gf128mul_x_ble() |
| 2724 | movdqa IV, STATE3 | 2733 | movdqa IV, STATE3 |
| 2725 | pxor 0x60(INP), STATE3 | 2734 | movdqu 0x60(INP), INC |
| 2735 | pxor INC, STATE3 | ||
| 2726 | movdqu IV, 0x60(OUTP) | 2736 | movdqu IV, 0x60(OUTP) |
| 2727 | 2737 | ||
| 2728 | pxor 0x30(OUTP), STATE4 | 2738 | movdqu 0x30(OUTP), INC |
| 2739 | pxor INC, STATE4 | ||
| 2729 | movdqu STATE4, 0x30(OUTP) | 2740 | movdqu STATE4, 0x30(OUTP) |
| 2730 | 2741 | ||
| 2731 | _aesni_gf128mul_x_ble() | 2742 | _aesni_gf128mul_x_ble() |
| 2732 | movdqa IV, STATE4 | 2743 | movdqa IV, STATE4 |
| 2733 | pxor 0x70(INP), STATE4 | 2744 | movdqu 0x70(INP), INC |
| 2745 | pxor INC, STATE4 | ||
| 2734 | movdqu IV, 0x70(OUTP) | 2746 | movdqu IV, 0x70(OUTP) |
| 2735 | 2747 | ||
| 2736 | _aesni_gf128mul_x_ble() | 2748 | _aesni_gf128mul_x_ble() |
| @@ -2738,16 +2750,20 @@ ENTRY(aesni_xts_crypt8) | |||
| 2738 | 2750 | ||
| 2739 | call *%r11 | 2751 | call *%r11 |
| 2740 | 2752 | ||
| 2741 | pxor 0x40(OUTP), STATE1 | 2753 | movdqu 0x40(OUTP), INC |
| 2754 | pxor INC, STATE1 | ||
| 2742 | movdqu STATE1, 0x40(OUTP) | 2755 | movdqu STATE1, 0x40(OUTP) |
| 2743 | 2756 | ||
| 2744 | pxor 0x50(OUTP), STATE2 | 2757 | movdqu 0x50(OUTP), INC |
| 2758 | pxor INC, STATE2 | ||
| 2745 | movdqu STATE2, 0x50(OUTP) | 2759 | movdqu STATE2, 0x50(OUTP) |
| 2746 | 2760 | ||
| 2747 | pxor 0x60(OUTP), STATE3 | 2761 | movdqu 0x60(OUTP), INC |
| 2762 | pxor INC, STATE3 | ||
| 2748 | movdqu STATE3, 0x60(OUTP) | 2763 | movdqu STATE3, 0x60(OUTP) |
| 2749 | 2764 | ||
| 2750 | pxor 0x70(OUTP), STATE4 | 2765 | movdqu 0x70(OUTP), INC |
| 2766 | pxor INC, STATE4 | ||
| 2751 | movdqu STATE4, 0x70(OUTP) | 2767 | movdqu STATE4, 0x70(OUTP) |
| 2752 | 2768 | ||
| 2753 | ret | 2769 | ret |
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index 805078e08013..52ff81cce008 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
| @@ -192,7 +192,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, | |||
| 192 | /* struct user */ | 192 | /* struct user */ |
| 193 | DUMP_WRITE(&dump, sizeof(dump)); | 193 | DUMP_WRITE(&dump, sizeof(dump)); |
| 194 | /* Now dump all of the user data. Include malloced stuff as well */ | 194 | /* Now dump all of the user data. Include malloced stuff as well */ |
| 195 | DUMP_SEEK(PAGE_SIZE); | 195 | DUMP_SEEK(PAGE_SIZE - sizeof(dump)); |
| 196 | /* now we start writing out the user space info */ | 196 | /* now we start writing out the user space info */ |
| 197 | set_fs(USER_DS); | 197 | set_fs(USER_DS); |
| 198 | /* Dump the data area */ | 198 | /* Dump the data area */ |
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index ba870bb6dd8e..57873beb3292 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h | |||
| @@ -41,4 +41,9 @@ extern int vector_used_by_percpu_irq(unsigned int vector); | |||
| 41 | 41 | ||
| 42 | extern void init_ISA_irqs(void); | 42 | extern void init_ISA_irqs(void); |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 45 | void arch_trigger_all_cpu_backtrace(void); | ||
| 46 | #define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace | ||
| 47 | #endif | ||
| 48 | |||
| 44 | #endif /* _ASM_X86_IRQ_H */ | 49 | #endif /* _ASM_X86_IRQ_H */ |
diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h index 6825e2efd1b4..6bc3985ee473 100644 --- a/arch/x86/include/asm/microcode.h +++ b/arch/x86/include/asm/microcode.h | |||
| @@ -60,11 +60,11 @@ static inline void __exit exit_amd_microcode(void) {} | |||
| 60 | #ifdef CONFIG_MICROCODE_EARLY | 60 | #ifdef CONFIG_MICROCODE_EARLY |
| 61 | #define MAX_UCODE_COUNT 128 | 61 | #define MAX_UCODE_COUNT 128 |
| 62 | extern void __init load_ucode_bsp(void); | 62 | extern void __init load_ucode_bsp(void); |
| 63 | extern __init void load_ucode_ap(void); | 63 | extern void __cpuinit load_ucode_ap(void); |
| 64 | extern int __init save_microcode_in_initrd(void); | 64 | extern int __init save_microcode_in_initrd(void); |
| 65 | #else | 65 | #else |
| 66 | static inline void __init load_ucode_bsp(void) {} | 66 | static inline void __init load_ucode_bsp(void) {} |
| 67 | static inline __init void load_ucode_ap(void) {} | 67 | static inline void __cpuinit load_ucode_ap(void) {} |
| 68 | static inline int __init save_microcode_in_initrd(void) | 68 | static inline int __init save_microcode_in_initrd(void) |
| 69 | { | 69 | { |
| 70 | return 0; | 70 | return 0; |
diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h index c0fa356e90de..86f9301903c8 100644 --- a/arch/x86/include/asm/nmi.h +++ b/arch/x86/include/asm/nmi.h | |||
| @@ -18,9 +18,7 @@ extern int proc_nmi_enabled(struct ctl_table *, int , | |||
| 18 | void __user *, size_t *, loff_t *); | 18 | void __user *, size_t *, loff_t *); |
| 19 | extern int unknown_nmi_panic; | 19 | extern int unknown_nmi_panic; |
| 20 | 20 | ||
| 21 | void arch_trigger_all_cpu_backtrace(void); | 21 | #endif /* CONFIG_X86_LOCAL_APIC */ |
| 22 | #define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace | ||
| 23 | #endif | ||
| 24 | 22 | ||
| 25 | #define NMI_FLAG_FIRST 1 | 23 | #define NMI_FLAG_FIRST 1 |
| 26 | 24 | ||
diff --git a/arch/x86/kernel/apic/hw_nmi.c b/arch/x86/kernel/apic/hw_nmi.c index 31cb9ae992b7..a698d7165c96 100644 --- a/arch/x86/kernel/apic/hw_nmi.c +++ b/arch/x86/kernel/apic/hw_nmi.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | #include <asm/apic.h> | 11 | #include <asm/apic.h> |
| 12 | #include <asm/nmi.h> | ||
| 12 | 13 | ||
| 13 | #include <linux/cpumask.h> | 14 | #include <linux/cpumask.h> |
| 14 | #include <linux/kdebug.h> | 15 | #include <linux/kdebug.h> |
diff --git a/arch/x86/kernel/cpu/mtrr/cleanup.c b/arch/x86/kernel/cpu/mtrr/cleanup.c index 35ffda5d0727..5f90b85ff22e 100644 --- a/arch/x86/kernel/cpu/mtrr/cleanup.c +++ b/arch/x86/kernel/cpu/mtrr/cleanup.c | |||
| @@ -714,15 +714,15 @@ int __init mtrr_cleanup(unsigned address_bits) | |||
| 714 | if (mtrr_tom2) | 714 | if (mtrr_tom2) |
| 715 | x_remove_size = (mtrr_tom2 >> PAGE_SHIFT) - x_remove_base; | 715 | x_remove_size = (mtrr_tom2 >> PAGE_SHIFT) - x_remove_base; |
| 716 | 716 | ||
| 717 | nr_range = x86_get_mtrr_mem_range(range, 0, x_remove_base, x_remove_size); | ||
| 718 | /* | 717 | /* |
| 719 | * [0, 1M) should always be covered by var mtrr with WB | 718 | * [0, 1M) should always be covered by var mtrr with WB |
| 720 | * and fixed mtrrs should take effect before var mtrr for it: | 719 | * and fixed mtrrs should take effect before var mtrr for it: |
| 721 | */ | 720 | */ |
| 722 | nr_range = add_range_with_merge(range, RANGE_NUM, nr_range, 0, | 721 | nr_range = add_range_with_merge(range, RANGE_NUM, 0, 0, |
| 723 | 1ULL<<(20 - PAGE_SHIFT)); | 722 | 1ULL<<(20 - PAGE_SHIFT)); |
| 724 | /* Sort the ranges: */ | 723 | /* add from var mtrr at last */ |
| 725 | sort_range(range, nr_range); | 724 | nr_range = x86_get_mtrr_mem_range(range, nr_range, |
| 725 | x_remove_base, x_remove_size); | ||
| 726 | 726 | ||
| 727 | range_sums = sum_ranges(range, nr_range); | 727 | range_sums = sum_ranges(range, nr_range); |
| 728 | printk(KERN_INFO "total RAM covered: %ldM\n", | 728 | printk(KERN_INFO "total RAM covered: %ldM\n", |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index f60d41ff9a97..a9e22073bd56 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -165,13 +165,13 @@ static struct extra_reg intel_snb_extra_regs[] __read_mostly = { | |||
| 165 | INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0), | 165 | INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0), |
| 166 | INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3f807f8fffull, RSP_1), | 166 | INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3f807f8fffull, RSP_1), |
| 167 | INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), | 167 | INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), |
| 168 | INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), | ||
| 169 | EVENT_EXTRA_END | 168 | EVENT_EXTRA_END |
| 170 | }; | 169 | }; |
| 171 | 170 | ||
| 172 | static struct extra_reg intel_snbep_extra_regs[] __read_mostly = { | 171 | static struct extra_reg intel_snbep_extra_regs[] __read_mostly = { |
| 173 | INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0), | 172 | INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0), |
| 174 | INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1), | 173 | INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1), |
| 174 | INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), | ||
| 175 | EVENT_EXTRA_END | 175 | EVENT_EXTRA_END |
| 176 | }; | 176 | }; |
| 177 | 177 | ||
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index d2c381280e3c..3dd37ebd591b 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
| @@ -242,6 +242,7 @@ void __init kvmclock_init(void) | |||
| 242 | if (!mem) | 242 | if (!mem) |
| 243 | return; | 243 | return; |
| 244 | hv_clock = __va(mem); | 244 | hv_clock = __va(mem); |
| 245 | memset(hv_clock, 0, size); | ||
| 245 | 246 | ||
| 246 | if (kvm_register_clock("boot clock")) { | 247 | if (kvm_register_clock("boot clock")) { |
| 247 | hv_clock = NULL; | 248 | hv_clock = NULL; |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 4e7a37ff03ab..81a5f5e8f142 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -277,18 +277,6 @@ void exit_idle(void) | |||
| 277 | } | 277 | } |
| 278 | #endif | 278 | #endif |
| 279 | 279 | ||
| 280 | void arch_cpu_idle_prepare(void) | ||
| 281 | { | ||
| 282 | /* | ||
| 283 | * If we're the non-boot CPU, nothing set the stack canary up | ||
| 284 | * for us. CPU0 already has it initialized but no harm in | ||
| 285 | * doing it again. This is a good place for updating it, as | ||
| 286 | * we wont ever return from this function (so the invalid | ||
| 287 | * canaries already on the stack wont ever trigger). | ||
| 288 | */ | ||
| 289 | boot_init_stack_canary(); | ||
| 290 | } | ||
| 291 | |||
| 292 | void arch_cpu_idle_enter(void) | 280 | void arch_cpu_idle_enter(void) |
| 293 | { | 281 | { |
| 294 | local_touch_nmi(); | 282 | local_touch_nmi(); |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 9c73b51817e4..bfd348e99369 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -372,15 +372,15 @@ static bool __cpuinit match_mc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) | |||
| 372 | 372 | ||
| 373 | void __cpuinit set_cpu_sibling_map(int cpu) | 373 | void __cpuinit set_cpu_sibling_map(int cpu) |
| 374 | { | 374 | { |
| 375 | bool has_mc = boot_cpu_data.x86_max_cores > 1; | ||
| 376 | bool has_smt = smp_num_siblings > 1; | 375 | bool has_smt = smp_num_siblings > 1; |
| 376 | bool has_mp = has_smt || boot_cpu_data.x86_max_cores > 1; | ||
| 377 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 377 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
| 378 | struct cpuinfo_x86 *o; | 378 | struct cpuinfo_x86 *o; |
| 379 | int i; | 379 | int i; |
| 380 | 380 | ||
| 381 | cpumask_set_cpu(cpu, cpu_sibling_setup_mask); | 381 | cpumask_set_cpu(cpu, cpu_sibling_setup_mask); |
| 382 | 382 | ||
| 383 | if (!has_smt && !has_mc) { | 383 | if (!has_mp) { |
| 384 | cpumask_set_cpu(cpu, cpu_sibling_mask(cpu)); | 384 | cpumask_set_cpu(cpu, cpu_sibling_mask(cpu)); |
| 385 | cpumask_set_cpu(cpu, cpu_llc_shared_mask(cpu)); | 385 | cpumask_set_cpu(cpu, cpu_llc_shared_mask(cpu)); |
| 386 | cpumask_set_cpu(cpu, cpu_core_mask(cpu)); | 386 | cpumask_set_cpu(cpu, cpu_core_mask(cpu)); |
| @@ -394,7 +394,7 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
| 394 | if ((i == cpu) || (has_smt && match_smt(c, o))) | 394 | if ((i == cpu) || (has_smt && match_smt(c, o))) |
| 395 | link_mask(sibling, cpu, i); | 395 | link_mask(sibling, cpu, i); |
| 396 | 396 | ||
| 397 | if ((i == cpu) || (has_mc && match_llc(c, o))) | 397 | if ((i == cpu) || (has_mp && match_llc(c, o))) |
| 398 | link_mask(llc_shared, cpu, i); | 398 | link_mask(llc_shared, cpu, i); |
| 399 | 399 | ||
| 400 | } | 400 | } |
| @@ -406,7 +406,7 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
| 406 | for_each_cpu(i, cpu_sibling_setup_mask) { | 406 | for_each_cpu(i, cpu_sibling_setup_mask) { |
| 407 | o = &cpu_data(i); | 407 | o = &cpu_data(i); |
| 408 | 408 | ||
| 409 | if ((i == cpu) || (has_mc && match_mc(c, o))) { | 409 | if ((i == cpu) || (has_mp && match_mc(c, o))) { |
| 410 | link_mask(core, cpu, i); | 410 | link_mask(core, cpu, i); |
| 411 | 411 | ||
| 412 | /* | 412 | /* |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 094b5d96ab14..e8ba99c34180 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -582,8 +582,6 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) | |||
| 582 | if (index != XCR_XFEATURE_ENABLED_MASK) | 582 | if (index != XCR_XFEATURE_ENABLED_MASK) |
| 583 | return 1; | 583 | return 1; |
| 584 | xcr0 = xcr; | 584 | xcr0 = xcr; |
| 585 | if (kvm_x86_ops->get_cpl(vcpu) != 0) | ||
| 586 | return 1; | ||
| 587 | if (!(xcr0 & XSTATE_FP)) | 585 | if (!(xcr0 & XSTATE_FP)) |
| 588 | return 1; | 586 | return 1; |
| 589 | if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE)) | 587 | if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE)) |
| @@ -597,7 +595,8 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) | |||
| 597 | 595 | ||
| 598 | int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) | 596 | int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) |
| 599 | { | 597 | { |
| 600 | if (__kvm_set_xcr(vcpu, index, xcr)) { | 598 | if (kvm_x86_ops->get_cpl(vcpu) != 0 || |
| 599 | __kvm_set_xcr(vcpu, index, xcr)) { | ||
| 601 | kvm_inject_gp(vcpu, 0); | 600 | kvm_inject_gp(vcpu, 0); |
| 602 | return 1; | 601 | return 1; |
| 603 | } | 602 | } |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 5ae2eb09419e..d2fbcedcf6ea 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -1069,7 +1069,10 @@ efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) | |||
| 1069 | * that by attempting to use more space than is available. | 1069 | * that by attempting to use more space than is available. |
| 1070 | */ | 1070 | */ |
| 1071 | unsigned long dummy_size = remaining_size + 1024; | 1071 | unsigned long dummy_size = remaining_size + 1024; |
| 1072 | void *dummy = kmalloc(dummy_size, GFP_ATOMIC); | 1072 | void *dummy = kzalloc(dummy_size, GFP_ATOMIC); |
| 1073 | |||
| 1074 | if (!dummy) | ||
| 1075 | return EFI_OUT_OF_RESOURCES; | ||
| 1073 | 1076 | ||
| 1074 | status = efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, | 1077 | status = efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, |
| 1075 | EFI_VARIABLE_NON_VOLATILE | | 1078 | EFI_VARIABLE_NON_VOLATILE | |
| @@ -1089,6 +1092,8 @@ efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) | |||
| 1089 | 0, dummy); | 1092 | 0, dummy); |
| 1090 | } | 1093 | } |
| 1091 | 1094 | ||
| 1095 | kfree(dummy); | ||
| 1096 | |||
| 1092 | /* | 1097 | /* |
| 1093 | * The runtime code may now have triggered a garbage collection | 1098 | * The runtime code may now have triggered a garbage collection |
| 1094 | * run, so check the variable info again | 1099 | * run, so check the variable info again |
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index 536562c626a2..d07771bc3d8c 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile | |||
| @@ -34,6 +34,7 @@ acpi-$(CONFIG_ACPI_SLEEP) += proc.o | |||
| 34 | acpi-y += bus.o glue.o | 34 | acpi-y += bus.o glue.o |
| 35 | acpi-y += scan.o | 35 | acpi-y += scan.o |
| 36 | acpi-y += resource.o | 36 | acpi-y += resource.o |
| 37 | acpi-y += acpi_processor.o | ||
| 37 | acpi-y += processor_core.o | 38 | acpi-y += processor_core.o |
| 38 | acpi-y += ec.o | 39 | acpi-y += ec.o |
| 39 | acpi-$(CONFIG_ACPI_DOCK) += dock.o | 40 | acpi-$(CONFIG_ACPI_DOCK) += dock.o |
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index 652fd5ce303c..cab13f2fc28e 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
| @@ -164,15 +164,24 @@ static int acpi_lpss_create_device(struct acpi_device *adev, | |||
| 164 | if (dev_desc->clk_required) { | 164 | if (dev_desc->clk_required) { |
| 165 | ret = register_device_clock(adev, pdata); | 165 | ret = register_device_clock(adev, pdata); |
| 166 | if (ret) { | 166 | if (ret) { |
| 167 | /* | 167 | /* Skip the device, but continue the namespace scan. */ |
| 168 | * Skip the device, but don't terminate the namespace | 168 | ret = 0; |
| 169 | * scan. | 169 | goto err_out; |
| 170 | */ | ||
| 171 | kfree(pdata); | ||
| 172 | return 0; | ||
| 173 | } | 170 | } |
| 174 | } | 171 | } |
| 175 | 172 | ||
| 173 | /* | ||
| 174 | * This works around a known issue in ACPI tables where LPSS devices | ||
| 175 | * have _PS0 and _PS3 without _PSC (and no power resources), so | ||
| 176 | * acpi_bus_init_power() will assume that the BIOS has put them into D0. | ||
| 177 | */ | ||
| 178 | ret = acpi_device_fix_up_power(adev); | ||
| 179 | if (ret) { | ||
| 180 | /* Skip the device, but continue the namespace scan. */ | ||
| 181 | ret = 0; | ||
| 182 | goto err_out; | ||
| 183 | } | ||
| 184 | |||
| 176 | adev->driver_data = pdata; | 185 | adev->driver_data = pdata; |
| 177 | ret = acpi_create_platform_device(adev, id); | 186 | ret = acpi_create_platform_device(adev, id); |
| 178 | if (ret > 0) | 187 | if (ret > 0) |
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c index 5e6301e94920..c711d1144044 100644 --- a/drivers/acpi/acpi_memhotplug.c +++ b/drivers/acpi/acpi_memhotplug.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | */ | 28 | */ |
| 29 | 29 | ||
| 30 | #include <linux/acpi.h> | 30 | #include <linux/acpi.h> |
| 31 | #include <linux/memory.h> | ||
| 31 | #include <linux/memory_hotplug.h> | 32 | #include <linux/memory_hotplug.h> |
| 32 | 33 | ||
| 33 | #include "internal.h" | 34 | #include "internal.h" |
| @@ -166,13 +167,50 @@ static int acpi_memory_check_device(struct acpi_memory_device *mem_device) | |||
| 166 | return 0; | 167 | return 0; |
| 167 | } | 168 | } |
| 168 | 169 | ||
| 170 | static unsigned long acpi_meminfo_start_pfn(struct acpi_memory_info *info) | ||
| 171 | { | ||
| 172 | return PFN_DOWN(info->start_addr); | ||
| 173 | } | ||
| 174 | |||
| 175 | static unsigned long acpi_meminfo_end_pfn(struct acpi_memory_info *info) | ||
| 176 | { | ||
| 177 | return PFN_UP(info->start_addr + info->length-1); | ||
| 178 | } | ||
| 179 | |||
| 180 | static int acpi_bind_memblk(struct memory_block *mem, void *arg) | ||
| 181 | { | ||
| 182 | return acpi_bind_one(&mem->dev, (acpi_handle)arg); | ||
| 183 | } | ||
| 184 | |||
| 185 | static int acpi_bind_memory_blocks(struct acpi_memory_info *info, | ||
| 186 | acpi_handle handle) | ||
| 187 | { | ||
| 188 | return walk_memory_range(acpi_meminfo_start_pfn(info), | ||
| 189 | acpi_meminfo_end_pfn(info), (void *)handle, | ||
| 190 | acpi_bind_memblk); | ||
| 191 | } | ||
| 192 | |||
| 193 | static int acpi_unbind_memblk(struct memory_block *mem, void *arg) | ||
| 194 | { | ||
| 195 | acpi_unbind_one(&mem->dev); | ||
| 196 | return 0; | ||
| 197 | } | ||
| 198 | |||
| 199 | static void acpi_unbind_memory_blocks(struct acpi_memory_info *info, | ||
| 200 | acpi_handle handle) | ||
| 201 | { | ||
| 202 | walk_memory_range(acpi_meminfo_start_pfn(info), | ||
| 203 | acpi_meminfo_end_pfn(info), NULL, acpi_unbind_memblk); | ||
| 204 | } | ||
| 205 | |||
| 169 | static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) | 206 | static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) |
| 170 | { | 207 | { |
| 208 | acpi_handle handle = mem_device->device->handle; | ||
| 171 | int result, num_enabled = 0; | 209 | int result, num_enabled = 0; |
| 172 | struct acpi_memory_info *info; | 210 | struct acpi_memory_info *info; |
| 173 | int node; | 211 | int node; |
| 174 | 212 | ||
| 175 | node = acpi_get_node(mem_device->device->handle); | 213 | node = acpi_get_node(handle); |
| 176 | /* | 214 | /* |
| 177 | * Tell the VM there is more memory here... | 215 | * Tell the VM there is more memory here... |
| 178 | * Note: Assume that this function returns zero on success | 216 | * Note: Assume that this function returns zero on success |
| @@ -203,6 +241,12 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) | |||
| 203 | if (result && result != -EEXIST) | 241 | if (result && result != -EEXIST) |
| 204 | continue; | 242 | continue; |
| 205 | 243 | ||
| 244 | result = acpi_bind_memory_blocks(info, handle); | ||
| 245 | if (result) { | ||
| 246 | acpi_unbind_memory_blocks(info, handle); | ||
| 247 | return -ENODEV; | ||
| 248 | } | ||
| 249 | |||
| 206 | info->enabled = 1; | 250 | info->enabled = 1; |
| 207 | 251 | ||
| 208 | /* | 252 | /* |
| @@ -227,12 +271,11 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) | |||
| 227 | return 0; | 271 | return 0; |
| 228 | } | 272 | } |
| 229 | 273 | ||
| 230 | static int acpi_memory_remove_memory(struct acpi_memory_device *mem_device) | 274 | static void acpi_memory_remove_memory(struct acpi_memory_device *mem_device) |
| 231 | { | 275 | { |
| 232 | int result = 0, nid; | 276 | acpi_handle handle = mem_device->device->handle; |
| 233 | struct acpi_memory_info *info, *n; | 277 | struct acpi_memory_info *info, *n; |
| 234 | 278 | int nid = acpi_get_node(handle); | |
| 235 | nid = acpi_get_node(mem_device->device->handle); | ||
| 236 | 279 | ||
| 237 | list_for_each_entry_safe(info, n, &mem_device->res_list, list) { | 280 | list_for_each_entry_safe(info, n, &mem_device->res_list, list) { |
| 238 | if (!info->enabled) | 281 | if (!info->enabled) |
| @@ -240,15 +283,12 @@ static int acpi_memory_remove_memory(struct acpi_memory_device *mem_device) | |||
| 240 | 283 | ||
| 241 | if (nid < 0) | 284 | if (nid < 0) |
| 242 | nid = memory_add_physaddr_to_nid(info->start_addr); | 285 | nid = memory_add_physaddr_to_nid(info->start_addr); |
| 243 | result = remove_memory(nid, info->start_addr, info->length); | ||
| 244 | if (result) | ||
| 245 | return result; | ||
| 246 | 286 | ||
| 287 | acpi_unbind_memory_blocks(info, handle); | ||
| 288 | remove_memory(nid, info->start_addr, info->length); | ||
| 247 | list_del(&info->list); | 289 | list_del(&info->list); |
| 248 | kfree(info); | 290 | kfree(info); |
| 249 | } | 291 | } |
| 250 | |||
| 251 | return result; | ||
| 252 | } | 292 | } |
| 253 | 293 | ||
| 254 | static void acpi_memory_device_free(struct acpi_memory_device *mem_device) | 294 | static void acpi_memory_device_free(struct acpi_memory_device *mem_device) |
| @@ -300,7 +340,7 @@ static int acpi_memory_device_add(struct acpi_device *device, | |||
| 300 | if (result) { | 340 | if (result) { |
| 301 | dev_err(&device->dev, "acpi_memory_enable_device() error\n"); | 341 | dev_err(&device->dev, "acpi_memory_enable_device() error\n"); |
| 302 | acpi_memory_device_free(mem_device); | 342 | acpi_memory_device_free(mem_device); |
| 303 | return -ENODEV; | 343 | return result; |
| 304 | } | 344 | } |
| 305 | 345 | ||
| 306 | dev_dbg(&device->dev, "Memory device configured by ACPI\n"); | 346 | dev_dbg(&device->dev, "Memory device configured by ACPI\n"); |
diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c new file mode 100644 index 000000000000..e9b01e35ac37 --- /dev/null +++ b/drivers/acpi/acpi_processor.c | |||
| @@ -0,0 +1,494 @@ | |||
| 1 | /* | ||
| 2 | * acpi_processor.c - ACPI processor enumeration support | ||
| 3 | * | ||
| 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> | ||
| 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | ||
| 6 | * Copyright (C) 2004 Dominik Brodowski <linux@brodo.de> | ||
| 7 | * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | ||
| 8 | * Copyright (C) 2013, Intel Corporation | ||
| 9 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify it | ||
| 12 | * under the terms of the GNU General Public License version 2 as published | ||
| 13 | * by the Free Software Foundation. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/acpi.h> | ||
| 17 | #include <linux/device.h> | ||
| 18 | #include <linux/kernel.h> | ||
| 19 | #include <linux/module.h> | ||
| 20 | #include <linux/pci.h> | ||
| 21 | |||
| 22 | #include <acpi/processor.h> | ||
| 23 | |||
| 24 | #include <asm/cpu.h> | ||
| 25 | |||
| 26 | #include "internal.h" | ||
| 27 | |||
| 28 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT | ||
| 29 | |||
| 30 | ACPI_MODULE_NAME("processor"); | ||
| 31 | |||
| 32 | DEFINE_PER_CPU(struct acpi_processor *, processors); | ||
| 33 | EXPORT_PER_CPU_SYMBOL(processors); | ||
| 34 | |||
| 35 | /* -------------------------------------------------------------------------- | ||
| 36 | Errata Handling | ||
| 37 | -------------------------------------------------------------------------- */ | ||
| 38 | |||
| 39 | struct acpi_processor_errata errata __read_mostly; | ||
| 40 | EXPORT_SYMBOL_GPL(errata); | ||
| 41 | |||
| 42 | static int acpi_processor_errata_piix4(struct pci_dev *dev) | ||
| 43 | { | ||
| 44 | u8 value1 = 0; | ||
| 45 | u8 value2 = 0; | ||
| 46 | |||
| 47 | |||
| 48 | if (!dev) | ||
| 49 | return -EINVAL; | ||
| 50 | |||
| 51 | /* | ||
| 52 | * Note that 'dev' references the PIIX4 ACPI Controller. | ||
| 53 | */ | ||
| 54 | |||
| 55 | switch (dev->revision) { | ||
| 56 | case 0: | ||
| 57 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n")); | ||
| 58 | break; | ||
| 59 | case 1: | ||
| 60 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n")); | ||
| 61 | break; | ||
| 62 | case 2: | ||
| 63 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n")); | ||
| 64 | break; | ||
| 65 | case 3: | ||
| 66 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n")); | ||
| 67 | break; | ||
| 68 | default: | ||
| 69 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n")); | ||
| 70 | break; | ||
| 71 | } | ||
| 72 | |||
| 73 | switch (dev->revision) { | ||
| 74 | |||
| 75 | case 0: /* PIIX4 A-step */ | ||
| 76 | case 1: /* PIIX4 B-step */ | ||
| 77 | /* | ||
| 78 | * See specification changes #13 ("Manual Throttle Duty Cycle") | ||
| 79 | * and #14 ("Enabling and Disabling Manual Throttle"), plus | ||
| 80 | * erratum #5 ("STPCLK# Deassertion Time") from the January | ||
| 81 | * 2002 PIIX4 specification update. Applies to only older | ||
| 82 | * PIIX4 models. | ||
| 83 | */ | ||
| 84 | errata.piix4.throttle = 1; | ||
| 85 | |||
| 86 | case 2: /* PIIX4E */ | ||
| 87 | case 3: /* PIIX4M */ | ||
| 88 | /* | ||
| 89 | * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA | ||
| 90 | * Livelock") from the January 2002 PIIX4 specification update. | ||
| 91 | * Applies to all PIIX4 models. | ||
| 92 | */ | ||
| 93 | |||
| 94 | /* | ||
| 95 | * BM-IDE | ||
| 96 | * ------ | ||
| 97 | * Find the PIIX4 IDE Controller and get the Bus Master IDE | ||
| 98 | * Status register address. We'll use this later to read | ||
| 99 | * each IDE controller's DMA status to make sure we catch all | ||
| 100 | * DMA activity. | ||
| 101 | */ | ||
| 102 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
| 103 | PCI_DEVICE_ID_INTEL_82371AB, | ||
| 104 | PCI_ANY_ID, PCI_ANY_ID, NULL); | ||
| 105 | if (dev) { | ||
| 106 | errata.piix4.bmisx = pci_resource_start(dev, 4); | ||
| 107 | pci_dev_put(dev); | ||
| 108 | } | ||
| 109 | |||
| 110 | /* | ||
| 111 | * Type-F DMA | ||
| 112 | * ---------- | ||
| 113 | * Find the PIIX4 ISA Controller and read the Motherboard | ||
| 114 | * DMA controller's status to see if Type-F (Fast) DMA mode | ||
| 115 | * is enabled (bit 7) on either channel. Note that we'll | ||
| 116 | * disable C3 support if this is enabled, as some legacy | ||
| 117 | * devices won't operate well if fast DMA is disabled. | ||
| 118 | */ | ||
| 119 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
| 120 | PCI_DEVICE_ID_INTEL_82371AB_0, | ||
| 121 | PCI_ANY_ID, PCI_ANY_ID, NULL); | ||
| 122 | if (dev) { | ||
| 123 | pci_read_config_byte(dev, 0x76, &value1); | ||
| 124 | pci_read_config_byte(dev, 0x77, &value2); | ||
| 125 | if ((value1 & 0x80) || (value2 & 0x80)) | ||
| 126 | errata.piix4.fdma = 1; | ||
| 127 | pci_dev_put(dev); | ||
| 128 | } | ||
| 129 | |||
| 130 | break; | ||
| 131 | } | ||
| 132 | |||
| 133 | if (errata.piix4.bmisx) | ||
| 134 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 135 | "Bus master activity detection (BM-IDE) erratum enabled\n")); | ||
| 136 | if (errata.piix4.fdma) | ||
| 137 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 138 | "Type-F DMA livelock erratum (C3 disabled)\n")); | ||
| 139 | |||
| 140 | return 0; | ||
| 141 | } | ||
| 142 | |||
| 143 | static int acpi_processor_errata(struct acpi_processor *pr) | ||
| 144 | { | ||
| 145 | int result = 0; | ||
| 146 | struct pci_dev *dev = NULL; | ||
| 147 | |||
| 148 | |||
| 149 | if (!pr) | ||
| 150 | return -EINVAL; | ||
| 151 | |||
| 152 | /* | ||
| 153 | * PIIX4 | ||
| 154 | */ | ||
| 155 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
| 156 | PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID, | ||
| 157 | PCI_ANY_ID, NULL); | ||
| 158 | if (dev) { | ||
| 159 | result = acpi_processor_errata_piix4(dev); | ||
| 160 | pci_dev_put(dev); | ||
| 161 | } | ||
| 162 | |||
| 163 | return result; | ||
| 164 | } | ||
| 165 | |||
| 166 | /* -------------------------------------------------------------------------- | ||
| 167 | Initialization | ||
| 168 | -------------------------------------------------------------------------- */ | ||
| 169 | |||
| 170 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
| 171 | static int acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
| 172 | { | ||
| 173 | unsigned long long sta; | ||
| 174 | acpi_status status; | ||
| 175 | int ret; | ||
| 176 | |||
| 177 | status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); | ||
| 178 | if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_PRESENT)) | ||
| 179 | return -ENODEV; | ||
| 180 | |||
| 181 | ret = acpi_map_lsapic(pr->handle, &pr->id); | ||
| 182 | if (ret) | ||
| 183 | return ret; | ||
| 184 | |||
| 185 | ret = arch_register_cpu(pr->id); | ||
| 186 | if (ret) { | ||
| 187 | acpi_unmap_lsapic(pr->id); | ||
| 188 | return ret; | ||
| 189 | } | ||
| 190 | |||
| 191 | /* | ||
| 192 | * CPU got hot-added, but cpu_data is not initialized yet. Set a flag | ||
| 193 | * to delay cpu_idle/throttling initialization and do it when the CPU | ||
| 194 | * gets online for the first time. | ||
| 195 | */ | ||
| 196 | pr_info("CPU%d has been hot-added\n", pr->id); | ||
| 197 | pr->flags.need_hotplug_init = 1; | ||
| 198 | return 0; | ||
| 199 | } | ||
| 200 | #else | ||
| 201 | static inline int acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
| 202 | { | ||
| 203 | return -ENODEV; | ||
| 204 | } | ||
| 205 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | ||
| 206 | |||
| 207 | static int acpi_processor_get_info(struct acpi_device *device) | ||
| 208 | { | ||
| 209 | union acpi_object object = { 0 }; | ||
| 210 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; | ||
| 211 | struct acpi_processor *pr = acpi_driver_data(device); | ||
| 212 | int cpu_index, device_declaration = 0; | ||
| 213 | acpi_status status = AE_OK; | ||
| 214 | static int cpu0_initialized; | ||
| 215 | |||
| 216 | if (num_online_cpus() > 1) | ||
| 217 | errata.smp = TRUE; | ||
| 218 | |||
| 219 | acpi_processor_errata(pr); | ||
| 220 | |||
| 221 | /* | ||
| 222 | * Check to see if we have bus mastering arbitration control. This | ||
| 223 | * is required for proper C3 usage (to maintain cache coherency). | ||
| 224 | */ | ||
| 225 | if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) { | ||
| 226 | pr->flags.bm_control = 1; | ||
| 227 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 228 | "Bus mastering arbitration control present\n")); | ||
| 229 | } else | ||
| 230 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 231 | "No bus mastering arbitration control\n")); | ||
| 232 | |||
| 233 | if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) { | ||
| 234 | /* Declared with "Processor" statement; match ProcessorID */ | ||
| 235 | status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); | ||
| 236 | if (ACPI_FAILURE(status)) { | ||
| 237 | dev_err(&device->dev, | ||
| 238 | "Failed to evaluate processor object (0x%x)\n", | ||
| 239 | status); | ||
| 240 | return -ENODEV; | ||
| 241 | } | ||
| 242 | |||
| 243 | /* | ||
| 244 | * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. | ||
| 245 | * >>> 'acpi_get_processor_id(acpi_id, &id)' in | ||
| 246 | * arch/xxx/acpi.c | ||
| 247 | */ | ||
| 248 | pr->acpi_id = object.processor.proc_id; | ||
| 249 | } else { | ||
| 250 | /* | ||
| 251 | * Declared with "Device" statement; match _UID. | ||
| 252 | * Note that we don't handle string _UIDs yet. | ||
| 253 | */ | ||
| 254 | unsigned long long value; | ||
| 255 | status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, | ||
| 256 | NULL, &value); | ||
| 257 | if (ACPI_FAILURE(status)) { | ||
| 258 | dev_err(&device->dev, | ||
| 259 | "Failed to evaluate processor _UID (0x%x)\n", | ||
| 260 | status); | ||
| 261 | return -ENODEV; | ||
| 262 | } | ||
| 263 | device_declaration = 1; | ||
| 264 | pr->acpi_id = value; | ||
| 265 | } | ||
| 266 | cpu_index = acpi_get_cpuid(pr->handle, device_declaration, pr->acpi_id); | ||
| 267 | |||
| 268 | /* Handle UP system running SMP kernel, with no LAPIC in MADT */ | ||
| 269 | if (!cpu0_initialized && (cpu_index == -1) && | ||
| 270 | (num_online_cpus() == 1)) { | ||
| 271 | cpu_index = 0; | ||
| 272 | } | ||
| 273 | |||
| 274 | cpu0_initialized = 1; | ||
| 275 | |||
| 276 | pr->id = cpu_index; | ||
| 277 | |||
| 278 | /* | ||
| 279 | * Extra Processor objects may be enumerated on MP systems with | ||
| 280 | * less than the max # of CPUs. They should be ignored _iff | ||
| 281 | * they are physically not present. | ||
| 282 | */ | ||
| 283 | if (pr->id == -1) { | ||
| 284 | int ret = acpi_processor_hotadd_init(pr); | ||
| 285 | if (ret) | ||
| 286 | return ret; | ||
| 287 | } | ||
| 288 | /* | ||
| 289 | * On some boxes several processors use the same processor bus id. | ||
| 290 | * But they are located in different scope. For example: | ||
| 291 | * \_SB.SCK0.CPU0 | ||
| 292 | * \_SB.SCK1.CPU0 | ||
| 293 | * Rename the processor device bus id. And the new bus id will be | ||
| 294 | * generated as the following format: | ||
| 295 | * CPU+CPU ID. | ||
| 296 | */ | ||
| 297 | sprintf(acpi_device_bid(device), "CPU%X", pr->id); | ||
| 298 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, | ||
| 299 | pr->acpi_id)); | ||
| 300 | |||
| 301 | if (!object.processor.pblk_address) | ||
| 302 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n")); | ||
| 303 | else if (object.processor.pblk_length != 6) | ||
| 304 | dev_err(&device->dev, "Invalid PBLK length [%d]\n", | ||
| 305 | object.processor.pblk_length); | ||
| 306 | else { | ||
| 307 | pr->throttling.address = object.processor.pblk_address; | ||
| 308 | pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; | ||
| 309 | pr->throttling.duty_width = acpi_gbl_FADT.duty_width; | ||
| 310 | |||
| 311 | pr->pblk = object.processor.pblk_address; | ||
| 312 | |||
| 313 | /* | ||
| 314 | * We don't care about error returns - we just try to mark | ||
| 315 | * these reserved so that nobody else is confused into thinking | ||
| 316 | * that this region might be unused.. | ||
| 317 | * | ||
| 318 | * (In particular, allocating the IO range for Cardbus) | ||
| 319 | */ | ||
| 320 | request_region(pr->throttling.address, 6, "ACPI CPU throttle"); | ||
| 321 | } | ||
| 322 | |||
| 323 | /* | ||
| 324 | * If ACPI describes a slot number for this CPU, we can use it to | ||
| 325 | * ensure we get the right value in the "physical id" field | ||
| 326 | * of /proc/cpuinfo | ||
| 327 | */ | ||
| 328 | status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer); | ||
| 329 | if (ACPI_SUCCESS(status)) | ||
| 330 | arch_fix_phys_package_id(pr->id, object.integer.value); | ||
| 331 | |||
| 332 | return 0; | ||
| 333 | } | ||
| 334 | |||
| 335 | /* | ||
| 336 | * Do not put anything in here which needs the core to be online. | ||
| 337 | * For example MSR access or setting up things which check for cpuinfo_x86 | ||
| 338 | * (cpu_data(cpu)) values, like CPU feature flags, family, model, etc. | ||
| 339 | * Such things have to be put in and set up by the processor driver's .probe(). | ||
| 340 | */ | ||
| 341 | static DEFINE_PER_CPU(void *, processor_device_array); | ||
| 342 | |||
| 343 | static int __cpuinit acpi_processor_add(struct acpi_device *device, | ||
| 344 | const struct acpi_device_id *id) | ||
| 345 | { | ||
| 346 | struct acpi_processor *pr; | ||
| 347 | struct device *dev; | ||
| 348 | int result = 0; | ||
| 349 | |||
| 350 | pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); | ||
| 351 | if (!pr) | ||
| 352 | return -ENOMEM; | ||
| 353 | |||
| 354 | if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { | ||
| 355 | result = -ENOMEM; | ||
| 356 | goto err_free_pr; | ||
| 357 | } | ||
| 358 | |||
| 359 | pr->handle = device->handle; | ||
| 360 | strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); | ||
| 361 | strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); | ||
| 362 | device->driver_data = pr; | ||
| 363 | |||
| 364 | result = acpi_processor_get_info(device); | ||
| 365 | if (result) /* Processor is not physically present or unavailable */ | ||
| 366 | return 0; | ||
| 367 | |||
| 368 | #ifdef CONFIG_SMP | ||
| 369 | if (pr->id >= setup_max_cpus && pr->id != 0) | ||
| 370 | return 0; | ||
| 371 | #endif | ||
| 372 | |||
| 373 | BUG_ON(pr->id >= nr_cpu_ids); | ||
| 374 | |||
| 375 | /* | ||
| 376 | * Buggy BIOS check. | ||
| 377 | * ACPI id of processors can be reported wrongly by the BIOS. | ||
| 378 | * Don't trust it blindly | ||
| 379 | */ | ||
| 380 | if (per_cpu(processor_device_array, pr->id) != NULL && | ||
| 381 | per_cpu(processor_device_array, pr->id) != device) { | ||
| 382 | dev_warn(&device->dev, | ||
| 383 | "BIOS reported wrong ACPI id %d for the processor\n", | ||
| 384 | pr->id); | ||
| 385 | /* Give up, but do not abort the namespace scan. */ | ||
| 386 | goto err; | ||
| 387 | } | ||
| 388 | /* | ||
| 389 | * processor_device_array is not cleared on errors to allow buggy BIOS | ||
| 390 | * checks. | ||
| 391 | */ | ||
| 392 | per_cpu(processor_device_array, pr->id) = device; | ||
| 393 | per_cpu(processors, pr->id) = pr; | ||
| 394 | |||
| 395 | dev = get_cpu_device(pr->id); | ||
| 396 | if (!dev) { | ||
| 397 | result = -ENODEV; | ||
| 398 | goto err; | ||
| 399 | } | ||
| 400 | |||
| 401 | result = acpi_bind_one(dev, pr->handle); | ||
| 402 | if (result) | ||
| 403 | goto err; | ||
| 404 | |||
| 405 | pr->dev = dev; | ||
| 406 | dev->offline = pr->flags.need_hotplug_init; | ||
| 407 | |||
| 408 | /* Trigger the processor driver's .probe() if present. */ | ||
| 409 | if (device_attach(dev) >= 0) | ||
| 410 | return 1; | ||
| 411 | |||
| 412 | dev_err(dev, "Processor driver could not be attached\n"); | ||
| 413 | acpi_unbind_one(dev); | ||
| 414 | |||
| 415 | err: | ||
| 416 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
| 417 | device->driver_data = NULL; | ||
| 418 | per_cpu(processors, pr->id) = NULL; | ||
| 419 | err_free_pr: | ||
| 420 | kfree(pr); | ||
| 421 | return result; | ||
| 422 | } | ||
| 423 | |||
| 424 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
| 425 | /* -------------------------------------------------------------------------- | ||
| 426 | Removal | ||
| 427 | -------------------------------------------------------------------------- */ | ||
| 428 | |||
| 429 | static void acpi_processor_remove(struct acpi_device *device) | ||
| 430 | { | ||
| 431 | struct acpi_processor *pr; | ||
| 432 | |||
| 433 | if (!device || !acpi_driver_data(device)) | ||
| 434 | return; | ||
| 435 | |||
| 436 | pr = acpi_driver_data(device); | ||
| 437 | if (pr->id >= nr_cpu_ids) | ||
| 438 | goto out; | ||
| 439 | |||
| 440 | /* | ||
| 441 | * The only reason why we ever get here is CPU hot-removal. The CPU is | ||
| 442 | * already offline and the ACPI device removal locking prevents it from | ||
| 443 | * being put back online at this point. | ||
| 444 | * | ||
| 445 | * Unbind the driver from the processor device and detach it from the | ||
| 446 | * ACPI companion object. | ||
| 447 | */ | ||
| 448 | device_release_driver(pr->dev); | ||
| 449 | acpi_unbind_one(pr->dev); | ||
| 450 | |||
| 451 | /* Clean up. */ | ||
| 452 | per_cpu(processor_device_array, pr->id) = NULL; | ||
| 453 | per_cpu(processors, pr->id) = NULL; | ||
| 454 | try_offline_node(cpu_to_node(pr->id)); | ||
| 455 | |||
| 456 | /* Remove the CPU. */ | ||
| 457 | get_online_cpus(); | ||
| 458 | arch_unregister_cpu(pr->id); | ||
| 459 | acpi_unmap_lsapic(pr->id); | ||
| 460 | put_online_cpus(); | ||
| 461 | |||
| 462 | out: | ||
| 463 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
| 464 | kfree(pr); | ||
| 465 | } | ||
| 466 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | ||
| 467 | |||
| 468 | /* | ||
| 469 | * The following ACPI IDs are known to be suitable for representing as | ||
| 470 | * processor devices. | ||
| 471 | */ | ||
| 472 | static const struct acpi_device_id processor_device_ids[] = { | ||
| 473 | |||
| 474 | { ACPI_PROCESSOR_OBJECT_HID, }, | ||
| 475 | { ACPI_PROCESSOR_DEVICE_HID, }, | ||
| 476 | |||
| 477 | { } | ||
| 478 | }; | ||
| 479 | |||
| 480 | static struct acpi_scan_handler __refdata processor_handler = { | ||
| 481 | .ids = processor_device_ids, | ||
| 482 | .attach = acpi_processor_add, | ||
| 483 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
| 484 | .detach = acpi_processor_remove, | ||
| 485 | #endif | ||
| 486 | .hotplug = { | ||
| 487 | .enabled = true, | ||
| 488 | }, | ||
| 489 | }; | ||
| 490 | |||
| 491 | void __init acpi_processor_init(void) | ||
| 492 | { | ||
| 493 | acpi_scan_add_handler_with_hotplug(&processor_handler, "processor"); | ||
| 494 | } | ||
diff --git a/drivers/acpi/acpica/Makefile b/drivers/acpi/acpica/Makefile index 7ddf29eca9f5..438304086ff1 100644 --- a/drivers/acpi/acpica/Makefile +++ b/drivers/acpi/acpica/Makefile | |||
| @@ -83,6 +83,7 @@ acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o | |||
| 83 | acpi-y += \ | 83 | acpi-y += \ |
| 84 | nsaccess.o \ | 84 | nsaccess.o \ |
| 85 | nsalloc.o \ | 85 | nsalloc.o \ |
| 86 | nsarguments.o \ | ||
| 86 | nsconvert.o \ | 87 | nsconvert.o \ |
| 87 | nsdump.o \ | 88 | nsdump.o \ |
| 88 | nseval.o \ | 89 | nseval.o \ |
| @@ -137,6 +138,7 @@ acpi-y += \ | |||
| 137 | tbfadt.o \ | 138 | tbfadt.o \ |
| 138 | tbfind.o \ | 139 | tbfind.o \ |
| 139 | tbinstal.o \ | 140 | tbinstal.o \ |
| 141 | tbprint.o \ | ||
| 140 | tbutils.o \ | 142 | tbutils.o \ |
| 141 | tbxface.o \ | 143 | tbxface.o \ |
| 142 | tbxfload.o \ | 144 | tbxfload.o \ |
| @@ -145,11 +147,13 @@ acpi-y += \ | |||
| 145 | acpi-y += \ | 147 | acpi-y += \ |
| 146 | utaddress.o \ | 148 | utaddress.o \ |
| 147 | utalloc.o \ | 149 | utalloc.o \ |
| 150 | utbuffer.o \ | ||
| 148 | utcopy.o \ | 151 | utcopy.o \ |
| 149 | utexcep.o \ | 152 | utexcep.o \ |
| 150 | utdebug.o \ | 153 | utdebug.o \ |
| 151 | utdecode.o \ | 154 | utdecode.o \ |
| 152 | utdelete.o \ | 155 | utdelete.o \ |
| 156 | uterror.o \ | ||
| 153 | uteval.o \ | 157 | uteval.o \ |
| 154 | utglobal.o \ | 158 | utglobal.o \ |
| 155 | utids.o \ | 159 | utids.o \ |
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index 07160928ca25..b8d38117a20c 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
| @@ -132,6 +132,12 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE); | |||
| 132 | */ | 132 | */ |
| 133 | u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_auto_repair, FALSE); | 133 | u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_auto_repair, FALSE); |
| 134 | 134 | ||
| 135 | /* | ||
| 136 | * Optionally do not load any SSDTs from the RSDT/XSDT during initialization. | ||
| 137 | * This can be useful for debugging ACPI problems on some machines. | ||
| 138 | */ | ||
| 139 | u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_ssdt_table_load, FALSE); | ||
| 140 | |||
| 135 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ | 141 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ |
| 136 | 142 | ||
| 137 | struct acpi_table_fadt acpi_gbl_FADT; | 143 | struct acpi_table_fadt acpi_gbl_FADT; |
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index d5bfbd331bfd..dfed26545ba2 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
| @@ -362,23 +362,6 @@ union acpi_predefined_info { | |||
| 362 | 362 | ||
| 363 | #pragma pack() | 363 | #pragma pack() |
| 364 | 364 | ||
| 365 | /* Data block used during object validation */ | ||
| 366 | |||
| 367 | struct acpi_predefined_data { | ||
| 368 | char *pathname; | ||
| 369 | const union acpi_predefined_info *predefined; | ||
| 370 | union acpi_operand_object *parent_package; | ||
| 371 | struct acpi_namespace_node *node; | ||
| 372 | u32 flags; | ||
| 373 | u32 return_btype; | ||
| 374 | u8 node_flags; | ||
| 375 | }; | ||
| 376 | |||
| 377 | /* Defines for Flags field above */ | ||
| 378 | |||
| 379 | #define ACPI_OBJECT_REPAIRED 1 | ||
| 380 | #define ACPI_OBJECT_WRAPPED 2 | ||
| 381 | |||
| 382 | /* Return object auto-repair info */ | 365 | /* Return object auto-repair info */ |
| 383 | 366 | ||
| 384 | typedef acpi_status(*acpi_object_converter) (union acpi_operand_object | 367 | typedef acpi_status(*acpi_object_converter) (union acpi_operand_object |
diff --git a/drivers/acpi/acpica/acmacros.h b/drivers/acpi/acpica/acmacros.h index 53666bd9193d..530a2f8c1252 100644 --- a/drivers/acpi/acpica/acmacros.h +++ b/drivers/acpi/acpica/acmacros.h | |||
| @@ -374,10 +374,11 @@ | |||
| 374 | * the plist contains a set of parens to allow variable-length lists. | 374 | * the plist contains a set of parens to allow variable-length lists. |
| 375 | * These macros are used for both the debug and non-debug versions of the code. | 375 | * These macros are used for both the debug and non-debug versions of the code. |
| 376 | */ | 376 | */ |
| 377 | #define ACPI_ERROR_NAMESPACE(s, e) acpi_ut_namespace_error (AE_INFO, s, e); | 377 | #define ACPI_ERROR_NAMESPACE(s, e) acpi_ut_namespace_error (AE_INFO, s, e); |
| 378 | #define ACPI_ERROR_METHOD(s, n, p, e) acpi_ut_method_error (AE_INFO, s, n, p, e); | 378 | #define ACPI_ERROR_METHOD(s, n, p, e) acpi_ut_method_error (AE_INFO, s, n, p, e); |
| 379 | #define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist | 379 | #define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist |
| 380 | #define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist | 380 | #define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist |
| 381 | #define ACPI_BIOS_ERROR_PREDEFINED(plist) acpi_ut_predefined_bios_error plist | ||
| 381 | 382 | ||
| 382 | #else | 383 | #else |
| 383 | 384 | ||
| @@ -387,6 +388,7 @@ | |||
| 387 | #define ACPI_ERROR_METHOD(s, n, p, e) | 388 | #define ACPI_ERROR_METHOD(s, n, p, e) |
| 388 | #define ACPI_WARN_PREDEFINED(plist) | 389 | #define ACPI_WARN_PREDEFINED(plist) |
| 389 | #define ACPI_INFO_PREDEFINED(plist) | 390 | #define ACPI_INFO_PREDEFINED(plist) |
| 391 | #define ACPI_BIOS_ERROR_PREDEFINED(plist) | ||
| 390 | 392 | ||
| 391 | #endif /* ACPI_NO_ERROR_MESSAGES */ | 393 | #endif /* ACPI_NO_ERROR_MESSAGES */ |
| 392 | 394 | ||
diff --git a/drivers/acpi/acpica/acnamesp.h b/drivers/acpi/acpica/acnamesp.h index d2e491876bc0..b83dc32a5ae0 100644 --- a/drivers/acpi/acpica/acnamesp.h +++ b/drivers/acpi/acpica/acnamesp.h | |||
| @@ -223,22 +223,33 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info); | |||
| 223 | void acpi_ns_exec_module_code_list(void); | 223 | void acpi_ns_exec_module_code_list(void); |
| 224 | 224 | ||
| 225 | /* | 225 | /* |
| 226 | * nspredef - Support for predefined/reserved names | 226 | * nsarguments - Argument count/type checking for predefined/reserved names |
| 227 | */ | 227 | */ |
| 228 | acpi_status | 228 | void |
| 229 | acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | 229 | acpi_ns_check_argument_count(char *pathname, |
| 230 | u32 user_param_count, | 230 | struct acpi_namespace_node *node, |
| 231 | acpi_status return_status, | 231 | u32 user_param_count, |
| 232 | union acpi_operand_object **return_object); | 232 | const union acpi_predefined_info *info); |
| 233 | 233 | ||
| 234 | void | 234 | void |
| 235 | acpi_ns_check_parameter_count(char *pathname, | 235 | acpi_ns_check_acpi_compliance(char *pathname, |
| 236 | struct acpi_namespace_node *node, | 236 | struct acpi_namespace_node *node, |
| 237 | u32 user_param_count, | 237 | const union acpi_predefined_info *predefined); |
| 238 | const union acpi_predefined_info *info); | 238 | |
| 239 | void acpi_ns_check_argument_types(struct acpi_evaluate_info *info); | ||
| 240 | |||
| 241 | /* | ||
| 242 | * nspredef - Return value checking for predefined/reserved names | ||
| 243 | */ | ||
| 244 | acpi_status | ||
| 245 | acpi_ns_check_return_value(struct acpi_namespace_node *node, | ||
| 246 | struct acpi_evaluate_info *info, | ||
| 247 | u32 user_param_count, | ||
| 248 | acpi_status return_status, | ||
| 249 | union acpi_operand_object **return_object); | ||
| 239 | 250 | ||
| 240 | acpi_status | 251 | acpi_status |
| 241 | acpi_ns_check_object_type(struct acpi_predefined_data *data, | 252 | acpi_ns_check_object_type(struct acpi_evaluate_info *info, |
| 242 | union acpi_operand_object **return_object_ptr, | 253 | union acpi_operand_object **return_object_ptr, |
| 243 | u32 expected_btypes, u32 package_index); | 254 | u32 expected_btypes, u32 package_index); |
| 244 | 255 | ||
| @@ -246,7 +257,7 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data, | |||
| 246 | * nsprepkg - Validation of predefined name packages | 257 | * nsprepkg - Validation of predefined name packages |
| 247 | */ | 258 | */ |
| 248 | acpi_status | 259 | acpi_status |
| 249 | acpi_ns_check_package(struct acpi_predefined_data *data, | 260 | acpi_ns_check_package(struct acpi_evaluate_info *info, |
| 250 | union acpi_operand_object **return_object_ptr); | 261 | union acpi_operand_object **return_object_ptr); |
| 251 | 262 | ||
| 252 | /* | 263 | /* |
| @@ -308,24 +319,24 @@ acpi_ns_get_attached_data(struct acpi_namespace_node *node, | |||
| 308 | * predefined methods/objects | 319 | * predefined methods/objects |
| 309 | */ | 320 | */ |
| 310 | acpi_status | 321 | acpi_status |
| 311 | acpi_ns_simple_repair(struct acpi_predefined_data *data, | 322 | acpi_ns_simple_repair(struct acpi_evaluate_info *info, |
| 312 | u32 expected_btypes, | 323 | u32 expected_btypes, |
| 313 | u32 package_index, | 324 | u32 package_index, |
| 314 | union acpi_operand_object **return_object_ptr); | 325 | union acpi_operand_object **return_object_ptr); |
| 315 | 326 | ||
| 316 | acpi_status | 327 | acpi_status |
| 317 | acpi_ns_wrap_with_package(struct acpi_predefined_data *data, | 328 | acpi_ns_wrap_with_package(struct acpi_evaluate_info *info, |
| 318 | union acpi_operand_object *original_object, | 329 | union acpi_operand_object *original_object, |
| 319 | union acpi_operand_object **obj_desc_ptr); | 330 | union acpi_operand_object **obj_desc_ptr); |
| 320 | 331 | ||
| 321 | acpi_status | 332 | acpi_status |
| 322 | acpi_ns_repair_null_element(struct acpi_predefined_data *data, | 333 | acpi_ns_repair_null_element(struct acpi_evaluate_info *info, |
| 323 | u32 expected_btypes, | 334 | u32 expected_btypes, |
| 324 | u32 package_index, | 335 | u32 package_index, |
| 325 | union acpi_operand_object **return_object_ptr); | 336 | union acpi_operand_object **return_object_ptr); |
| 326 | 337 | ||
| 327 | void | 338 | void |
| 328 | acpi_ns_remove_null_elements(struct acpi_predefined_data *data, | 339 | acpi_ns_remove_null_elements(struct acpi_evaluate_info *info, |
| 329 | u8 package_type, | 340 | u8 package_type, |
| 330 | union acpi_operand_object *obj_desc); | 341 | union acpi_operand_object *obj_desc); |
| 331 | 342 | ||
| @@ -334,7 +345,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data, | |||
| 334 | * predefined methods/objects | 345 | * predefined methods/objects |
| 335 | */ | 346 | */ |
| 336 | acpi_status | 347 | acpi_status |
| 337 | acpi_ns_complex_repairs(struct acpi_predefined_data *data, | 348 | acpi_ns_complex_repairs(struct acpi_evaluate_info *info, |
| 338 | struct acpi_namespace_node *node, | 349 | struct acpi_namespace_node *node, |
| 339 | acpi_status validate_status, | 350 | acpi_status validate_status, |
| 340 | union acpi_operand_object **return_object_ptr); | 351 | union acpi_operand_object **return_object_ptr); |
diff --git a/drivers/acpi/acpica/acpredef.h b/drivers/acpi/acpica/acpredef.h index b22b70944fd6..f600aded7261 100644 --- a/drivers/acpi/acpica/acpredef.h +++ b/drivers/acpi/acpica/acpredef.h | |||
| @@ -128,8 +128,8 @@ enum acpi_return_package_types { | |||
| 128 | #define ARG_COUNT_IS_MINIMUM 0x8000 | 128 | #define ARG_COUNT_IS_MINIMUM 0x8000 |
| 129 | #define METHOD_MAX_ARG_TYPE ACPI_TYPE_PACKAGE | 129 | #define METHOD_MAX_ARG_TYPE ACPI_TYPE_PACKAGE |
| 130 | 130 | ||
| 131 | #define METHOD_GET_COUNT(arg_list) (arg_list & METHOD_ARG_MASK) | 131 | #define METHOD_GET_ARG_COUNT(arg_list) ((arg_list) & METHOD_ARG_MASK) |
| 132 | #define METHOD_GET_NEXT_ARG(arg_list) (arg_list >> METHOD_ARG_BIT_WIDTH) | 132 | #define METHOD_GET_NEXT_TYPE(arg_list) (((arg_list) >>= METHOD_ARG_BIT_WIDTH) & METHOD_ARG_MASK) |
| 133 | 133 | ||
| 134 | /* Macros used to build the predefined info table */ | 134 | /* Macros used to build the predefined info table */ |
| 135 | 135 | ||
diff --git a/drivers/acpi/acpica/acstruct.h b/drivers/acpi/acpica/acstruct.h index 7896d85876ca..fc83c0a5ca70 100644 --- a/drivers/acpi/acpica/acstruct.h +++ b/drivers/acpi/acpica/acstruct.h | |||
| @@ -178,25 +178,41 @@ union acpi_aml_operands { | |||
| 178 | }; | 178 | }; |
| 179 | 179 | ||
| 180 | /* | 180 | /* |
| 181 | * Structure used to pass object evaluation parameters. | 181 | * Structure used to pass object evaluation information and parameters. |
| 182 | * Purpose is to reduce CPU stack use. | 182 | * Purpose is to reduce CPU stack use. |
| 183 | */ | 183 | */ |
| 184 | struct acpi_evaluate_info { | 184 | struct acpi_evaluate_info { |
| 185 | struct acpi_namespace_node *prefix_node; | 185 | /* The first 3 elements are passed by the caller to acpi_ns_evaluate */ |
| 186 | char *pathname; | 186 | |
| 187 | union acpi_operand_object *obj_desc; | 187 | struct acpi_namespace_node *prefix_node; /* Input: starting node */ |
| 188 | union acpi_operand_object **parameters; | 188 | char *relative_pathname; /* Input: path relative to prefix_node */ |
| 189 | struct acpi_namespace_node *resolved_node; | 189 | union acpi_operand_object **parameters; /* Input: argument list */ |
| 190 | union acpi_operand_object *return_object; | 190 | |
| 191 | u8 param_count; | 191 | struct acpi_namespace_node *node; /* Resolved node (prefix_node:relative_pathname) */ |
| 192 | u8 pass_number; | 192 | union acpi_operand_object *obj_desc; /* Object attached to the resolved node */ |
| 193 | u8 return_object_type; | 193 | char *full_pathname; /* Full pathname of the resolved node */ |
| 194 | u8 flags; | 194 | |
| 195 | const union acpi_predefined_info *predefined; /* Used if Node is a predefined name */ | ||
| 196 | union acpi_operand_object *return_object; /* Object returned from the evaluation */ | ||
| 197 | union acpi_operand_object *parent_package; /* Used if return object is a Package */ | ||
| 198 | |||
| 199 | u32 return_flags; /* Used for return value analysis */ | ||
| 200 | u32 return_btype; /* Bitmapped type of the returned object */ | ||
| 201 | u16 param_count; /* Count of the input argument list */ | ||
| 202 | u8 pass_number; /* Parser pass number */ | ||
| 203 | u8 return_object_type; /* Object type of the returned object */ | ||
| 204 | u8 node_flags; /* Same as Node->Flags */ | ||
| 205 | u8 flags; /* General flags */ | ||
| 195 | }; | 206 | }; |
| 196 | 207 | ||
| 197 | /* Values for Flags above */ | 208 | /* Values for Flags above */ |
| 198 | 209 | ||
| 199 | #define ACPI_IGNORE_RETURN_VALUE 1 | 210 | #define ACPI_IGNORE_RETURN_VALUE 1 |
| 211 | |||
| 212 | /* Defines for return_flags field above */ | ||
| 213 | |||
| 214 | #define ACPI_OBJECT_REPAIRED 1 | ||
| 215 | #define ACPI_OBJECT_WRAPPED 2 | ||
| 200 | 216 | ||
| 201 | /* Info used by acpi_ns_initialize_devices */ | 217 | /* Info used by acpi_ns_initialize_devices */ |
| 202 | 218 | ||
diff --git a/drivers/acpi/acpica/acutils.h b/drivers/acpi/acpica/acutils.h index 202f4f12d3e2..3c76edea6803 100644 --- a/drivers/acpi/acpica/acutils.h +++ b/drivers/acpi/acpica/acutils.h | |||
| @@ -87,6 +87,48 @@ extern const char *acpi_gbl_fc_decode[]; | |||
| 87 | extern const char *acpi_gbl_pt_decode[]; | 87 | extern const char *acpi_gbl_pt_decode[]; |
| 88 | #endif | 88 | #endif |
| 89 | 89 | ||
| 90 | /* | ||
| 91 | * For the iASL compiler case, the output is redirected to stderr so that | ||
| 92 | * any of the various ACPI errors and warnings do not appear in the output | ||
| 93 | * files, for either the compiler or disassembler portions of the tool. | ||
| 94 | */ | ||
| 95 | #ifdef ACPI_ASL_COMPILER | ||
| 96 | |||
| 97 | #include <stdio.h> | ||
| 98 | extern FILE *acpi_gbl_output_file; | ||
| 99 | |||
| 100 | #define ACPI_MSG_REDIRECT_BEGIN \ | ||
| 101 | FILE *output_file = acpi_gbl_output_file; \ | ||
| 102 | acpi_os_redirect_output (stderr); | ||
| 103 | |||
| 104 | #define ACPI_MSG_REDIRECT_END \ | ||
| 105 | acpi_os_redirect_output (output_file); | ||
| 106 | |||
| 107 | #else | ||
| 108 | /* | ||
| 109 | * non-iASL case - no redirection, nothing to do | ||
| 110 | */ | ||
| 111 | #define ACPI_MSG_REDIRECT_BEGIN | ||
| 112 | #define ACPI_MSG_REDIRECT_END | ||
| 113 | #endif | ||
| 114 | |||
| 115 | /* | ||
| 116 | * Common error message prefixes | ||
| 117 | */ | ||
| 118 | #define ACPI_MSG_ERROR "ACPI Error: " | ||
| 119 | #define ACPI_MSG_EXCEPTION "ACPI Exception: " | ||
| 120 | #define ACPI_MSG_WARNING "ACPI Warning: " | ||
| 121 | #define ACPI_MSG_INFO "ACPI: " | ||
| 122 | |||
| 123 | #define ACPI_MSG_BIOS_ERROR "ACPI BIOS Error (bug): " | ||
| 124 | #define ACPI_MSG_BIOS_WARNING "ACPI BIOS Warning (bug): " | ||
| 125 | |||
| 126 | /* | ||
| 127 | * Common message suffix | ||
| 128 | */ | ||
| 129 | #define ACPI_MSG_SUFFIX \ | ||
| 130 | acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number) | ||
| 131 | |||
| 90 | /* Types for Resource descriptor entries */ | 132 | /* Types for Resource descriptor entries */ |
| 91 | 133 | ||
| 92 | #define ACPI_INVALID_RESOURCE 0 | 134 | #define ACPI_INVALID_RESOURCE 0 |
| @@ -578,7 +620,7 @@ void acpi_ut_print_string(char *string, u8 max_length); | |||
| 578 | 620 | ||
| 579 | void ut_convert_backslashes(char *pathname); | 621 | void ut_convert_backslashes(char *pathname); |
| 580 | 622 | ||
| 581 | u8 acpi_ut_valid_acpi_name(u32 name); | 623 | u8 acpi_ut_valid_acpi_name(char *name); |
| 582 | 624 | ||
| 583 | u8 acpi_ut_valid_acpi_char(char character, u32 position); | 625 | u8 acpi_ut_valid_acpi_char(char character, u32 position); |
| 584 | 626 | ||
| @@ -670,6 +712,12 @@ acpi_ut_predefined_info(const char *module_name, | |||
| 670 | u32 line_number, | 712 | u32 line_number, |
| 671 | char *pathname, u8 node_flags, const char *format, ...); | 713 | char *pathname, u8 node_flags, const char *format, ...); |
| 672 | 714 | ||
| 715 | void ACPI_INTERNAL_VAR_XFACE | ||
| 716 | acpi_ut_predefined_bios_error(const char *module_name, | ||
| 717 | u32 line_number, | ||
| 718 | char *pathname, | ||
| 719 | u8 node_flags, const char *format, ...); | ||
| 720 | |||
| 673 | void | 721 | void |
| 674 | acpi_ut_namespace_error(const char *module_name, | 722 | acpi_ut_namespace_error(const char *module_name, |
| 675 | u32 line_number, | 723 | u32 line_number, |
diff --git a/drivers/acpi/acpica/dscontrol.c b/drivers/acpi/acpica/dscontrol.c index 7ea0f162f11c..eb56b66444b5 100644 --- a/drivers/acpi/acpica/dscontrol.c +++ b/drivers/acpi/acpica/dscontrol.c | |||
| @@ -78,7 +78,6 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, | |||
| 78 | 78 | ||
| 79 | switch (op->common.aml_opcode) { | 79 | switch (op->common.aml_opcode) { |
| 80 | case AML_WHILE_OP: | 80 | case AML_WHILE_OP: |
| 81 | |||
| 82 | /* | 81 | /* |
| 83 | * If this is an additional iteration of a while loop, continue. | 82 | * If this is an additional iteration of a while loop, continue. |
| 84 | * There is no need to allocate a new control state. | 83 | * There is no need to allocate a new control state. |
| @@ -99,7 +98,6 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, | |||
| 99 | /*lint -fallthrough */ | 98 | /*lint -fallthrough */ |
| 100 | 99 | ||
| 101 | case AML_IF_OP: | 100 | case AML_IF_OP: |
| 102 | |||
| 103 | /* | 101 | /* |
| 104 | * IF/WHILE: Create a new control state to manage these | 102 | * IF/WHILE: Create a new control state to manage these |
| 105 | * constructs. We need to manage these as a stack, in order | 103 | * constructs. We need to manage these as a stack, in order |
| @@ -142,6 +140,7 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, | |||
| 142 | break; | 140 | break; |
| 143 | 141 | ||
| 144 | default: | 142 | default: |
| 143 | |||
| 145 | break; | 144 | break; |
| 146 | } | 145 | } |
| 147 | 146 | ||
| @@ -344,6 +343,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, | |||
| 344 | case AML_NOOP_OP: | 343 | case AML_NOOP_OP: |
| 345 | 344 | ||
| 346 | /* Just do nothing! */ | 345 | /* Just do nothing! */ |
| 346 | |||
| 347 | break; | 347 | break; |
| 348 | 348 | ||
| 349 | case AML_BREAK_POINT_OP: | 349 | case AML_BREAK_POINT_OP: |
diff --git a/drivers/acpi/acpica/dsfield.c b/drivers/acpi/acpica/dsfield.c index feadeed1012d..d4bfe7b7f90a 100644 --- a/drivers/acpi/acpica/dsfield.c +++ b/drivers/acpi/acpica/dsfield.c | |||
| @@ -563,21 +563,25 @@ acpi_ds_init_field_objects(union acpi_parse_object *op, | |||
| 563 | */ | 563 | */ |
| 564 | switch (walk_state->opcode) { | 564 | switch (walk_state->opcode) { |
| 565 | case AML_FIELD_OP: | 565 | case AML_FIELD_OP: |
| 566 | |||
| 566 | arg = acpi_ps_get_arg(op, 2); | 567 | arg = acpi_ps_get_arg(op, 2); |
| 567 | type = ACPI_TYPE_LOCAL_REGION_FIELD; | 568 | type = ACPI_TYPE_LOCAL_REGION_FIELD; |
| 568 | break; | 569 | break; |
| 569 | 570 | ||
| 570 | case AML_BANK_FIELD_OP: | 571 | case AML_BANK_FIELD_OP: |
| 572 | |||
| 571 | arg = acpi_ps_get_arg(op, 4); | 573 | arg = acpi_ps_get_arg(op, 4); |
| 572 | type = ACPI_TYPE_LOCAL_BANK_FIELD; | 574 | type = ACPI_TYPE_LOCAL_BANK_FIELD; |
| 573 | break; | 575 | break; |
| 574 | 576 | ||
| 575 | case AML_INDEX_FIELD_OP: | 577 | case AML_INDEX_FIELD_OP: |
| 578 | |||
| 576 | arg = acpi_ps_get_arg(op, 3); | 579 | arg = acpi_ps_get_arg(op, 3); |
| 577 | type = ACPI_TYPE_LOCAL_INDEX_FIELD; | 580 | type = ACPI_TYPE_LOCAL_INDEX_FIELD; |
| 578 | break; | 581 | break; |
| 579 | 582 | ||
| 580 | default: | 583 | default: |
| 584 | |||
| 581 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 585 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 582 | } | 586 | } |
| 583 | 587 | ||
diff --git a/drivers/acpi/acpica/dsinit.c b/drivers/acpi/acpica/dsinit.c index bc8e63f7784b..14424200d246 100644 --- a/drivers/acpi/acpica/dsinit.c +++ b/drivers/acpi/acpica/dsinit.c | |||
| @@ -127,6 +127,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle, | |||
| 127 | break; | 127 | break; |
| 128 | 128 | ||
| 129 | default: | 129 | default: |
| 130 | |||
| 130 | break; | 131 | break; |
| 131 | } | 132 | } |
| 132 | 133 | ||
diff --git a/drivers/acpi/acpica/dsmthdat.c b/drivers/acpi/acpica/dsmthdat.c index 3da80460ce38..c4b0b3657237 100644 --- a/drivers/acpi/acpica/dsmthdat.c +++ b/drivers/acpi/acpica/dsmthdat.c | |||
| @@ -285,6 +285,7 @@ acpi_ds_method_data_get_node(u8 type, | |||
| 285 | break; | 285 | break; |
| 286 | 286 | ||
| 287 | default: | 287 | default: |
| 288 | |||
| 288 | ACPI_ERROR((AE_INFO, "Type %u is invalid", type)); | 289 | ACPI_ERROR((AE_INFO, "Type %u is invalid", type)); |
| 289 | return_ACPI_STATUS(AE_TYPE); | 290 | return_ACPI_STATUS(AE_TYPE); |
| 290 | } | 291 | } |
| @@ -428,7 +429,6 @@ acpi_ds_method_data_get_value(u8 type, | |||
| 428 | return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); | 429 | return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); |
| 429 | 430 | ||
| 430 | case ACPI_REFCLASS_LOCAL: | 431 | case ACPI_REFCLASS_LOCAL: |
| 431 | |||
| 432 | /* | 432 | /* |
| 433 | * No error message for this case, will be trapped again later to | 433 | * No error message for this case, will be trapped again later to |
| 434 | * detect and ignore cases of Store(local_x,local_x) | 434 | * detect and ignore cases of Store(local_x,local_x) |
diff --git a/drivers/acpi/acpica/dsobject.c b/drivers/acpi/acpica/dsobject.c index e20e9f84eee8..63f0d220ca3d 100644 --- a/drivers/acpi/acpica/dsobject.c +++ b/drivers/acpi/acpica/dsobject.c | |||
| @@ -648,7 +648,6 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
| 648 | 648 | ||
| 649 | switch (obj_desc->common.type) { | 649 | switch (obj_desc->common.type) { |
| 650 | case ACPI_TYPE_BUFFER: | 650 | case ACPI_TYPE_BUFFER: |
| 651 | |||
| 652 | /* | 651 | /* |
| 653 | * Defer evaluation of Buffer term_arg operand | 652 | * Defer evaluation of Buffer term_arg operand |
| 654 | */ | 653 | */ |
| @@ -660,7 +659,6 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
| 660 | break; | 659 | break; |
| 661 | 660 | ||
| 662 | case ACPI_TYPE_PACKAGE: | 661 | case ACPI_TYPE_PACKAGE: |
| 663 | |||
| 664 | /* | 662 | /* |
| 665 | * Defer evaluation of Package term_arg operand | 663 | * Defer evaluation of Package term_arg operand |
| 666 | */ | 664 | */ |
| @@ -741,6 +739,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
| 741 | break; | 739 | break; |
| 742 | 740 | ||
| 743 | default: | 741 | default: |
| 742 | |||
| 744 | ACPI_ERROR((AE_INFO, "Unknown Integer type 0x%X", | 743 | ACPI_ERROR((AE_INFO, "Unknown Integer type 0x%X", |
| 745 | op_info->type)); | 744 | op_info->type)); |
| 746 | status = AE_AML_OPERAND_TYPE; | 745 | status = AE_AML_OPERAND_TYPE; |
diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c index ee6367b8eaf7..1fc1ff114f26 100644 --- a/drivers/acpi/acpica/dsopcode.c +++ b/drivers/acpi/acpica/dsopcode.c | |||
| @@ -636,6 +636,7 @@ acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state, | |||
| 636 | break; | 636 | break; |
| 637 | 637 | ||
| 638 | default: | 638 | default: |
| 639 | |||
| 639 | return_ACPI_STATUS(AE_AML_BAD_OPCODE); | 640 | return_ACPI_STATUS(AE_AML_BAD_OPCODE); |
| 640 | } | 641 | } |
| 641 | 642 | ||
diff --git a/drivers/acpi/acpica/dsutils.c b/drivers/acpi/acpica/dsutils.c index 99778997c35a..c666fc014987 100644 --- a/drivers/acpi/acpica/dsutils.c +++ b/drivers/acpi/acpica/dsutils.c | |||
| @@ -240,7 +240,6 @@ acpi_ds_is_result_used(union acpi_parse_object * op, | |||
| 240 | 240 | ||
| 241 | case AML_IF_OP: | 241 | case AML_IF_OP: |
| 242 | case AML_WHILE_OP: | 242 | case AML_WHILE_OP: |
| 243 | |||
| 244 | /* | 243 | /* |
| 245 | * If we are executing the predicate AND this is the predicate op, | 244 | * If we are executing the predicate AND this is the predicate op, |
| 246 | * we will use the return value | 245 | * we will use the return value |
| @@ -254,7 +253,9 @@ acpi_ds_is_result_used(union acpi_parse_object * op, | |||
| 254 | break; | 253 | break; |
| 255 | 254 | ||
| 256 | default: | 255 | default: |
| 256 | |||
| 257 | /* Ignore other control opcodes */ | 257 | /* Ignore other control opcodes */ |
| 258 | |||
| 258 | break; | 259 | break; |
| 259 | } | 260 | } |
| 260 | 261 | ||
| @@ -263,7 +264,6 @@ acpi_ds_is_result_used(union acpi_parse_object * op, | |||
| 263 | goto result_not_used; | 264 | goto result_not_used; |
| 264 | 265 | ||
| 265 | case AML_CLASS_CREATE: | 266 | case AML_CLASS_CREATE: |
| 266 | |||
| 267 | /* | 267 | /* |
| 268 | * These opcodes allow term_arg(s) as operands and therefore | 268 | * These opcodes allow term_arg(s) as operands and therefore |
| 269 | * the operands can be method calls. The result is used. | 269 | * the operands can be method calls. The result is used. |
| @@ -292,7 +292,6 @@ acpi_ds_is_result_used(union acpi_parse_object * op, | |||
| 292 | goto result_not_used; | 292 | goto result_not_used; |
| 293 | 293 | ||
| 294 | default: | 294 | default: |
| 295 | |||
| 296 | /* | 295 | /* |
| 297 | * In all other cases. the parent will actually use the return | 296 | * In all other cases. the parent will actually use the return |
| 298 | * object, so keep it. | 297 | * object, so keep it. |
diff --git a/drivers/acpi/acpica/dswexec.c b/drivers/acpi/acpica/dswexec.c index e2199a947470..151d924817e1 100644 --- a/drivers/acpi/acpica/dswexec.c +++ b/drivers/acpi/acpica/dswexec.c | |||
| @@ -327,6 +327,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, | |||
| 327 | break; | 327 | break; |
| 328 | 328 | ||
| 329 | default: | 329 | default: |
| 330 | |||
| 330 | break; | 331 | break; |
| 331 | } | 332 | } |
| 332 | 333 | ||
| @@ -488,7 +489,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) | |||
| 488 | break; | 489 | break; |
| 489 | 490 | ||
| 490 | case AML_TYPE_METHOD_CALL: | 491 | case AML_TYPE_METHOD_CALL: |
| 491 | |||
| 492 | /* | 492 | /* |
| 493 | * If the method is referenced from within a package | 493 | * If the method is referenced from within a package |
| 494 | * declaration, it is not a invocation of the method, just | 494 | * declaration, it is not a invocation of the method, just |
| @@ -582,7 +582,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) | |||
| 582 | 582 | ||
| 583 | switch (op->common.parent->common.aml_opcode) { | 583 | switch (op->common.parent->common.aml_opcode) { |
| 584 | case AML_NAME_OP: | 584 | case AML_NAME_OP: |
| 585 | |||
| 586 | /* | 585 | /* |
| 587 | * Put the Node on the object stack (Contains the ACPI Name | 586 | * Put the Node on the object stack (Contains the ACPI Name |
| 588 | * of this object) | 587 | * of this object) |
diff --git a/drivers/acpi/acpica/dswload.c b/drivers/acpi/acpica/dswload.c index 6e17c0e24e63..95e681a36f9c 100644 --- a/drivers/acpi/acpica/dswload.c +++ b/drivers/acpi/acpica/dswload.c | |||
| @@ -74,6 +74,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number) | |||
| 74 | 74 | ||
| 75 | switch (pass_number) { | 75 | switch (pass_number) { |
| 76 | case 1: | 76 | case 1: |
| 77 | |||
| 77 | walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | | 78 | walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | |
| 78 | ACPI_PARSE_DELETE_TREE; | 79 | ACPI_PARSE_DELETE_TREE; |
| 79 | walk_state->descending_callback = acpi_ds_load1_begin_op; | 80 | walk_state->descending_callback = acpi_ds_load1_begin_op; |
| @@ -81,6 +82,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number) | |||
| 81 | break; | 82 | break; |
| 82 | 83 | ||
| 83 | case 2: | 84 | case 2: |
| 85 | |||
| 84 | walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | | 86 | walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | |
| 85 | ACPI_PARSE_DELETE_TREE; | 87 | ACPI_PARSE_DELETE_TREE; |
| 86 | walk_state->descending_callback = acpi_ds_load2_begin_op; | 88 | walk_state->descending_callback = acpi_ds_load2_begin_op; |
| @@ -88,6 +90,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number) | |||
| 88 | break; | 90 | break; |
| 89 | 91 | ||
| 90 | case 3: | 92 | case 3: |
| 93 | |||
| 91 | #ifndef ACPI_NO_METHOD_EXECUTION | 94 | #ifndef ACPI_NO_METHOD_EXECUTION |
| 92 | walk_state->parse_flags |= ACPI_PARSE_EXECUTE | | 95 | walk_state->parse_flags |= ACPI_PARSE_EXECUTE | |
| 93 | ACPI_PARSE_DELETE_TREE; | 96 | ACPI_PARSE_DELETE_TREE; |
| @@ -97,6 +100,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number) | |||
| 97 | break; | 100 | break; |
| 98 | 101 | ||
| 99 | default: | 102 | default: |
| 103 | |||
| 100 | return (AE_BAD_PARAMETER); | 104 | return (AE_BAD_PARAMETER); |
| 101 | } | 105 | } |
| 102 | 106 | ||
| @@ -161,7 +165,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, | |||
| 161 | 165 | ||
| 162 | switch (walk_state->opcode) { | 166 | switch (walk_state->opcode) { |
| 163 | case AML_SCOPE_OP: | 167 | case AML_SCOPE_OP: |
| 164 | |||
| 165 | /* | 168 | /* |
| 166 | * The target name of the Scope() operator must exist at this point so | 169 | * The target name of the Scope() operator must exist at this point so |
| 167 | * that we can actually open the scope to enter new names underneath it. | 170 | * that we can actually open the scope to enter new names underneath it. |
| @@ -210,7 +213,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, | |||
| 210 | case ACPI_TYPE_INTEGER: | 213 | case ACPI_TYPE_INTEGER: |
| 211 | case ACPI_TYPE_STRING: | 214 | case ACPI_TYPE_STRING: |
| 212 | case ACPI_TYPE_BUFFER: | 215 | case ACPI_TYPE_BUFFER: |
| 213 | |||
| 214 | /* | 216 | /* |
| 215 | * These types we will allow, but we will change the type. | 217 | * These types we will allow, but we will change the type. |
| 216 | * This enables some existing code of the form: | 218 | * This enables some existing code of the form: |
| @@ -232,7 +234,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, | |||
| 232 | break; | 234 | break; |
| 233 | 235 | ||
| 234 | case ACPI_TYPE_METHOD: | 236 | case ACPI_TYPE_METHOD: |
| 235 | |||
| 236 | /* | 237 | /* |
| 237 | * Allow scope change to root during execution of module-level | 238 | * Allow scope change to root during execution of module-level |
| 238 | * code. Root is typed METHOD during this time. | 239 | * code. Root is typed METHOD during this time. |
diff --git a/drivers/acpi/acpica/dswload2.c b/drivers/acpi/acpica/dswload2.c index 4407ff2377d5..b1f8f4725c23 100644 --- a/drivers/acpi/acpica/dswload2.c +++ b/drivers/acpi/acpica/dswload2.c | |||
| @@ -509,6 +509,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) | |||
| 509 | break; | 509 | break; |
| 510 | 510 | ||
| 511 | default: | 511 | default: |
| 512 | |||
| 512 | /* All NAMED_FIELD opcodes must be handled above */ | 513 | /* All NAMED_FIELD opcodes must be handled above */ |
| 513 | break; | 514 | break; |
| 514 | } | 515 | } |
| @@ -548,6 +549,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) | |||
| 548 | break; | 549 | break; |
| 549 | 550 | ||
| 550 | default: | 551 | default: |
| 552 | |||
| 551 | /* Unknown opcode */ | 553 | /* Unknown opcode */ |
| 552 | 554 | ||
| 553 | status = AE_OK; | 555 | status = AE_OK; |
| @@ -674,6 +676,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) | |||
| 674 | #endif /* ACPI_NO_METHOD_EXECUTION */ | 676 | #endif /* ACPI_NO_METHOD_EXECUTION */ |
| 675 | 677 | ||
| 676 | default: | 678 | default: |
| 679 | |||
| 677 | /* All NAMED_COMPLEX opcodes must be handled above */ | 680 | /* All NAMED_COMPLEX opcodes must be handled above */ |
| 678 | break; | 681 | break; |
| 679 | } | 682 | } |
| @@ -721,6 +724,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) | |||
| 721 | break; | 724 | break; |
| 722 | 725 | ||
| 723 | default: | 726 | default: |
| 727 | |||
| 724 | break; | 728 | break; |
| 725 | } | 729 | } |
| 726 | 730 | ||
diff --git a/drivers/acpi/acpica/evglock.c b/drivers/acpi/acpica/evglock.c index a621481c6cf2..fdb0a76e40a3 100644 --- a/drivers/acpi/acpica/evglock.c +++ b/drivers/acpi/acpica/evglock.c | |||
| @@ -128,6 +128,7 @@ acpi_status acpi_ev_remove_global_lock_handler(void) | |||
| 128 | status = acpi_remove_fixed_event_handler(ACPI_EVENT_GLOBAL, | 128 | status = acpi_remove_fixed_event_handler(ACPI_EVENT_GLOBAL, |
| 129 | acpi_ev_global_lock_handler); | 129 | acpi_ev_global_lock_handler); |
| 130 | 130 | ||
| 131 | acpi_os_delete_lock(acpi_gbl_global_lock_pending_lock); | ||
| 131 | return_ACPI_STATUS(status); | 132 | return_ACPI_STATUS(status); |
| 132 | } | 133 | } |
| 133 | 134 | ||
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index a493b528f8f9..c8a1f7d5931f 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
| @@ -529,7 +529,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
| 529 | 529 | ||
| 530 | switch (local_gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) { | 530 | switch (local_gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) { |
| 531 | case ACPI_GPE_DISPATCH_NOTIFY: | 531 | case ACPI_GPE_DISPATCH_NOTIFY: |
| 532 | |||
| 533 | /* | 532 | /* |
| 534 | * Implicit notify. | 533 | * Implicit notify. |
| 535 | * Dispatch a DEVICE_WAKE notify to the appropriate handler. | 534 | * Dispatch a DEVICE_WAKE notify to the appropriate handler. |
| @@ -579,11 +578,11 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
| 579 | (local_gpe_event_info->dispatch. | 578 | (local_gpe_event_info->dispatch. |
| 580 | method_node))); | 579 | method_node))); |
| 581 | } | 580 | } |
| 582 | |||
| 583 | break; | 581 | break; |
| 584 | 582 | ||
| 585 | default: | 583 | default: |
| 586 | return_VOID; /* Should never happen */ | 584 | |
| 585 | return_VOID; /* Should never happen */ | ||
| 587 | } | 586 | } |
| 588 | 587 | ||
| 589 | /* Defer enabling of GPE until all notify handlers are done */ | 588 | /* Defer enabling of GPE until all notify handlers are done */ |
| @@ -755,7 +754,6 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device, | |||
| 755 | 754 | ||
| 756 | case ACPI_GPE_DISPATCH_METHOD: | 755 | case ACPI_GPE_DISPATCH_METHOD: |
| 757 | case ACPI_GPE_DISPATCH_NOTIFY: | 756 | case ACPI_GPE_DISPATCH_NOTIFY: |
| 758 | |||
| 759 | /* | 757 | /* |
| 760 | * Execute the method associated with the GPE | 758 | * Execute the method associated with the GPE |
| 761 | * NOTE: Level-triggered GPEs are cleared after the method completes. | 759 | * NOTE: Level-triggered GPEs are cleared after the method completes. |
| @@ -771,7 +769,6 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device, | |||
| 771 | break; | 769 | break; |
| 772 | 770 | ||
| 773 | default: | 771 | default: |
| 774 | |||
| 775 | /* | 772 | /* |
| 776 | * No handler or method to run! | 773 | * No handler or method to run! |
| 777 | * 03/2010: This case should no longer be possible. We will not allow | 774 | * 03/2010: This case should no longer be possible. We will not allow |
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c index a2d688bbac02..c1aa1eda26c3 100644 --- a/drivers/acpi/acpica/evgpeblk.c +++ b/drivers/acpi/acpica/evgpeblk.c | |||
| @@ -382,6 +382,8 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, | |||
| 382 | 382 | ||
| 383 | status = acpi_ev_install_gpe_block(gpe_block, interrupt_number); | 383 | status = acpi_ev_install_gpe_block(gpe_block, interrupt_number); |
| 384 | if (ACPI_FAILURE(status)) { | 384 | if (ACPI_FAILURE(status)) { |
| 385 | ACPI_FREE(gpe_block->register_info); | ||
| 386 | ACPI_FREE(gpe_block->event_info); | ||
| 385 | ACPI_FREE(gpe_block); | 387 | ACPI_FREE(gpe_block); |
| 386 | return_ACPI_STATUS(status); | 388 | return_ACPI_STATUS(status); |
| 387 | } | 389 | } |
diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c index 72b8f6b3f4ca..9037f17c9608 100644 --- a/drivers/acpi/acpica/evgpeinit.c +++ b/drivers/acpi/acpica/evgpeinit.c | |||
| @@ -363,14 +363,17 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle, | |||
| 363 | */ | 363 | */ |
| 364 | switch (name[1]) { | 364 | switch (name[1]) { |
| 365 | case 'L': | 365 | case 'L': |
| 366 | |||
| 366 | type = ACPI_GPE_LEVEL_TRIGGERED; | 367 | type = ACPI_GPE_LEVEL_TRIGGERED; |
| 367 | break; | 368 | break; |
| 368 | 369 | ||
| 369 | case 'E': | 370 | case 'E': |
| 371 | |||
| 370 | type = ACPI_GPE_EDGE_TRIGGERED; | 372 | type = ACPI_GPE_EDGE_TRIGGERED; |
| 371 | break; | 373 | break; |
| 372 | 374 | ||
| 373 | default: | 375 | default: |
| 376 | |||
| 374 | /* Unknown method type, just ignore it */ | 377 | /* Unknown method type, just ignore it */ |
| 375 | 378 | ||
| 376 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, | 379 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, |
diff --git a/drivers/acpi/acpica/evhandler.c b/drivers/acpi/acpica/evhandler.c index d4f83112c2e2..068af96134b8 100644 --- a/drivers/acpi/acpica/evhandler.c +++ b/drivers/acpi/acpica/evhandler.c | |||
| @@ -354,36 +354,43 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node, | |||
| 354 | 354 | ||
| 355 | switch (space_id) { | 355 | switch (space_id) { |
| 356 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | 356 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: |
| 357 | |||
| 357 | handler = acpi_ex_system_memory_space_handler; | 358 | handler = acpi_ex_system_memory_space_handler; |
| 358 | setup = acpi_ev_system_memory_region_setup; | 359 | setup = acpi_ev_system_memory_region_setup; |
| 359 | break; | 360 | break; |
| 360 | 361 | ||
| 361 | case ACPI_ADR_SPACE_SYSTEM_IO: | 362 | case ACPI_ADR_SPACE_SYSTEM_IO: |
| 363 | |||
| 362 | handler = acpi_ex_system_io_space_handler; | 364 | handler = acpi_ex_system_io_space_handler; |
| 363 | setup = acpi_ev_io_space_region_setup; | 365 | setup = acpi_ev_io_space_region_setup; |
| 364 | break; | 366 | break; |
| 365 | 367 | ||
| 366 | case ACPI_ADR_SPACE_PCI_CONFIG: | 368 | case ACPI_ADR_SPACE_PCI_CONFIG: |
| 369 | |||
| 367 | handler = acpi_ex_pci_config_space_handler; | 370 | handler = acpi_ex_pci_config_space_handler; |
| 368 | setup = acpi_ev_pci_config_region_setup; | 371 | setup = acpi_ev_pci_config_region_setup; |
| 369 | break; | 372 | break; |
| 370 | 373 | ||
| 371 | case ACPI_ADR_SPACE_CMOS: | 374 | case ACPI_ADR_SPACE_CMOS: |
| 375 | |||
| 372 | handler = acpi_ex_cmos_space_handler; | 376 | handler = acpi_ex_cmos_space_handler; |
| 373 | setup = acpi_ev_cmos_region_setup; | 377 | setup = acpi_ev_cmos_region_setup; |
| 374 | break; | 378 | break; |
| 375 | 379 | ||
| 376 | case ACPI_ADR_SPACE_PCI_BAR_TARGET: | 380 | case ACPI_ADR_SPACE_PCI_BAR_TARGET: |
| 381 | |||
| 377 | handler = acpi_ex_pci_bar_space_handler; | 382 | handler = acpi_ex_pci_bar_space_handler; |
| 378 | setup = acpi_ev_pci_bar_region_setup; | 383 | setup = acpi_ev_pci_bar_region_setup; |
| 379 | break; | 384 | break; |
| 380 | 385 | ||
| 381 | case ACPI_ADR_SPACE_DATA_TABLE: | 386 | case ACPI_ADR_SPACE_DATA_TABLE: |
| 387 | |||
| 382 | handler = acpi_ex_data_table_space_handler; | 388 | handler = acpi_ex_data_table_space_handler; |
| 383 | setup = NULL; | 389 | setup = NULL; |
| 384 | break; | 390 | break; |
| 385 | 391 | ||
| 386 | default: | 392 | default: |
| 393 | |||
| 387 | status = AE_BAD_PARAMETER; | 394 | status = AE_BAD_PARAMETER; |
| 388 | goto unlock_and_exit; | 395 | goto unlock_and_exit; |
| 389 | } | 396 | } |
diff --git a/drivers/acpi/acpica/evmisc.c b/drivers/acpi/acpica/evmisc.c index c986b2336b81..1b111ef74903 100644 --- a/drivers/acpi/acpica/evmisc.c +++ b/drivers/acpi/acpica/evmisc.c | |||
| @@ -78,6 +78,7 @@ u8 acpi_ev_is_notify_object(struct acpi_namespace_node *node) | |||
| 78 | return (TRUE); | 78 | return (TRUE); |
| 79 | 79 | ||
| 80 | default: | 80 | default: |
| 81 | |||
| 81 | return (FALSE); | 82 | return (FALSE); |
| 82 | } | 83 | } |
| 83 | } | 84 | } |
| @@ -275,6 +276,8 @@ void acpi_ev_terminate(void) | |||
| 275 | ACPI_ERROR((AE_INFO, | 276 | ACPI_ERROR((AE_INFO, |
| 276 | "Could not remove Global Lock handler")); | 277 | "Could not remove Global Lock handler")); |
| 277 | } | 278 | } |
| 279 | |||
| 280 | acpi_gbl_events_initialized = FALSE; | ||
| 278 | } | 281 | } |
| 279 | 282 | ||
| 280 | /* Deallocate all handler objects installed within GPE info structs */ | 283 | /* Deallocate all handler objects installed within GPE info structs */ |
diff --git a/drivers/acpi/acpica/evregion.c b/drivers/acpi/acpica/evregion.c index 6555e350fc1f..cea14d6fc76c 100644 --- a/drivers/acpi/acpica/evregion.c +++ b/drivers/acpi/acpica/evregion.c | |||
| @@ -54,7 +54,8 @@ extern u8 acpi_gbl_default_address_spaces[]; | |||
| 54 | 54 | ||
| 55 | /* Local prototypes */ | 55 | /* Local prototypes */ |
| 56 | 56 | ||
| 57 | static void acpi_ev_orphan_ec_reg_method(void); | 57 | static void |
| 58 | acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node); | ||
| 58 | 59 | ||
| 59 | static acpi_status | 60 | static acpi_status |
| 60 | acpi_ev_reg_run(acpi_handle obj_handle, | 61 | acpi_ev_reg_run(acpi_handle obj_handle, |
| @@ -532,7 +533,7 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) | |||
| 532 | } | 533 | } |
| 533 | 534 | ||
| 534 | info->prefix_node = region_obj2->extra.method_REG; | 535 | info->prefix_node = region_obj2->extra.method_REG; |
| 535 | info->pathname = NULL; | 536 | info->relative_pathname = NULL; |
| 536 | info->parameters = args; | 537 | info->parameters = args; |
| 537 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 538 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
| 538 | 539 | ||
| @@ -612,7 +613,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, | |||
| 612 | /* Special case for EC: handle "orphan" _REG methods with no region */ | 613 | /* Special case for EC: handle "orphan" _REG methods with no region */ |
| 613 | 614 | ||
| 614 | if (space_id == ACPI_ADR_SPACE_EC) { | 615 | if (space_id == ACPI_ADR_SPACE_EC) { |
| 615 | acpi_ev_orphan_ec_reg_method(); | 616 | acpi_ev_orphan_ec_reg_method(node); |
| 616 | } | 617 | } |
| 617 | 618 | ||
| 618 | return_ACPI_STATUS(status); | 619 | return_ACPI_STATUS(status); |
| @@ -681,7 +682,7 @@ acpi_ev_reg_run(acpi_handle obj_handle, | |||
| 681 | * | 682 | * |
| 682 | * FUNCTION: acpi_ev_orphan_ec_reg_method | 683 | * FUNCTION: acpi_ev_orphan_ec_reg_method |
| 683 | * | 684 | * |
| 684 | * PARAMETERS: None | 685 | * PARAMETERS: ec_device_node - Namespace node for an EC device |
| 685 | * | 686 | * |
| 686 | * RETURN: None | 687 | * RETURN: None |
| 687 | * | 688 | * |
| @@ -693,37 +694,27 @@ acpi_ev_reg_run(acpi_handle obj_handle, | |||
| 693 | * detected by providing a _REG method object underneath the | 694 | * detected by providing a _REG method object underneath the |
| 694 | * Embedded Controller device." | 695 | * Embedded Controller device." |
| 695 | * | 696 | * |
| 696 | * To quickly access the EC device, we use the EC_ID that appears | 697 | * To quickly access the EC device, we use the ec_device_node used |
| 697 | * within the ECDT. Otherwise, we would need to perform a time- | 698 | * during EC handler installation. Otherwise, we would need to |
| 698 | * consuming namespace walk, executing _HID methods to find the | 699 | * perform a time consuming namespace walk, executing _HID |
| 699 | * EC device. | 700 | * methods to find the EC device. |
| 701 | * | ||
| 702 | * MUTEX: Assumes the namespace is locked | ||
| 700 | * | 703 | * |
| 701 | ******************************************************************************/ | 704 | ******************************************************************************/ |
| 702 | 705 | ||
| 703 | static void acpi_ev_orphan_ec_reg_method(void) | 706 | static void |
| 707 | acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node) | ||
| 704 | { | 708 | { |
| 705 | struct acpi_table_ecdt *table; | 709 | acpi_handle reg_method; |
| 710 | struct acpi_namespace_node *next_node; | ||
| 706 | acpi_status status; | 711 | acpi_status status; |
| 707 | struct acpi_object_list args; | 712 | struct acpi_object_list args; |
| 708 | union acpi_object objects[2]; | 713 | union acpi_object objects[2]; |
| 709 | struct acpi_namespace_node *ec_device_node; | ||
| 710 | struct acpi_namespace_node *reg_method; | ||
| 711 | struct acpi_namespace_node *next_node; | ||
| 712 | 714 | ||
| 713 | ACPI_FUNCTION_TRACE(ev_orphan_ec_reg_method); | 715 | ACPI_FUNCTION_TRACE(ev_orphan_ec_reg_method); |
| 714 | 716 | ||
| 715 | /* Get the ECDT (if present in system) */ | 717 | if (!ec_device_node) { |
| 716 | |||
| 717 | status = acpi_get_table(ACPI_SIG_ECDT, 0, | ||
| 718 | ACPI_CAST_INDIRECT_PTR(struct acpi_table_header, | ||
| 719 | &table)); | ||
| 720 | if (ACPI_FAILURE(status)) { | ||
| 721 | return_VOID; | ||
| 722 | } | ||
| 723 | |||
| 724 | /* We need a valid EC_ID string */ | ||
| 725 | |||
| 726 | if (!(*table->id)) { | ||
| 727 | return_VOID; | 718 | return_VOID; |
| 728 | } | 719 | } |
| 729 | 720 | ||
| @@ -731,22 +722,11 @@ static void acpi_ev_orphan_ec_reg_method(void) | |||
| 731 | 722 | ||
| 732 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | 723 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); |
| 733 | 724 | ||
| 734 | /* Get a handle to the EC device referenced in the ECDT */ | ||
| 735 | |||
| 736 | status = acpi_get_handle(NULL, | ||
| 737 | ACPI_CAST_PTR(char, table->id), | ||
| 738 | ACPI_CAST_PTR(acpi_handle, &ec_device_node)); | ||
| 739 | if (ACPI_FAILURE(status)) { | ||
| 740 | goto exit; | ||
| 741 | } | ||
| 742 | |||
| 743 | /* Get a handle to a _REG method immediately under the EC device */ | 725 | /* Get a handle to a _REG method immediately under the EC device */ |
| 744 | 726 | ||
| 745 | status = acpi_get_handle(ec_device_node, | 727 | status = acpi_get_handle(ec_device_node, METHOD_NAME__REG, ®_method); |
| 746 | METHOD_NAME__REG, ACPI_CAST_PTR(acpi_handle, | ||
| 747 | ®_method)); | ||
| 748 | if (ACPI_FAILURE(status)) { | 728 | if (ACPI_FAILURE(status)) { |
| 749 | goto exit; | 729 | goto exit; /* There is no _REG method present */ |
| 750 | } | 730 | } |
| 751 | 731 | ||
| 752 | /* | 732 | /* |
| @@ -754,19 +734,20 @@ static void acpi_ev_orphan_ec_reg_method(void) | |||
| 754 | * this scope with the Embedded Controller space ID. Otherwise, it | 734 | * this scope with the Embedded Controller space ID. Otherwise, it |
| 755 | * will already have been executed. Note, this allows for Regions | 735 | * will already have been executed. Note, this allows for Regions |
| 756 | * with other space IDs to be present; but the code below will then | 736 | * with other space IDs to be present; but the code below will then |
| 757 | * execute the _REG method with the EC space ID argument. | 737 | * execute the _REG method with the embedded_control space_ID argument. |
| 758 | */ | 738 | */ |
| 759 | next_node = acpi_ns_get_next_node(ec_device_node, NULL); | 739 | next_node = acpi_ns_get_next_node(ec_device_node, NULL); |
| 760 | while (next_node) { | 740 | while (next_node) { |
| 761 | if ((next_node->type == ACPI_TYPE_REGION) && | 741 | if ((next_node->type == ACPI_TYPE_REGION) && |
| 762 | (next_node->object) && | 742 | (next_node->object) && |
| 763 | (next_node->object->region.space_id == ACPI_ADR_SPACE_EC)) { | 743 | (next_node->object->region.space_id == ACPI_ADR_SPACE_EC)) { |
| 764 | goto exit; /* Do not execute _REG */ | 744 | goto exit; /* Do not execute the _REG */ |
| 765 | } | 745 | } |
| 746 | |||
| 766 | next_node = acpi_ns_get_next_node(ec_device_node, next_node); | 747 | next_node = acpi_ns_get_next_node(ec_device_node, next_node); |
| 767 | } | 748 | } |
| 768 | 749 | ||
| 769 | /* Evaluate the _REG(EC,Connect) method */ | 750 | /* Evaluate the _REG(embedded_control,Connect) method */ |
| 770 | 751 | ||
| 771 | args.count = 2; | 752 | args.count = 2; |
| 772 | args.pointer = objects; | 753 | args.pointer = objects; |
diff --git a/drivers/acpi/acpica/evrgnini.c b/drivers/acpi/acpica/evrgnini.c index 3bb616794b3b..8354c4f7f10c 100644 --- a/drivers/acpi/acpica/evrgnini.c +++ b/drivers/acpi/acpica/evrgnini.c | |||
| @@ -596,7 +596,9 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, | |||
| 596 | break; | 596 | break; |
| 597 | 597 | ||
| 598 | default: | 598 | default: |
| 599 | |||
| 599 | /* Ignore other objects */ | 600 | /* Ignore other objects */ |
| 601 | |||
| 600 | break; | 602 | break; |
| 601 | } | 603 | } |
| 602 | 604 | ||
diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c index aff4cc261211..7662f1a42ff6 100644 --- a/drivers/acpi/acpica/evxfgpe.c +++ b/drivers/acpi/acpica/evxfgpe.c | |||
| @@ -366,16 +366,19 @@ acpi_set_gpe_wake_mask(acpi_handle gpe_device, u32 gpe_number, u8 action) | |||
| 366 | 366 | ||
| 367 | switch (action) { | 367 | switch (action) { |
| 368 | case ACPI_GPE_ENABLE: | 368 | case ACPI_GPE_ENABLE: |
| 369 | |||
| 369 | ACPI_SET_BIT(gpe_register_info->enable_for_wake, | 370 | ACPI_SET_BIT(gpe_register_info->enable_for_wake, |
| 370 | (u8)register_bit); | 371 | (u8)register_bit); |
| 371 | break; | 372 | break; |
| 372 | 373 | ||
| 373 | case ACPI_GPE_DISABLE: | 374 | case ACPI_GPE_DISABLE: |
| 375 | |||
| 374 | ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake, | 376 | ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake, |
| 375 | (u8)register_bit); | 377 | (u8)register_bit); |
| 376 | break; | 378 | break; |
| 377 | 379 | ||
| 378 | default: | 380 | default: |
| 381 | |||
| 379 | ACPI_ERROR((AE_INFO, "%u, Invalid action", action)); | 382 | ACPI_ERROR((AE_INFO, "%u, Invalid action", action)); |
| 380 | status = AE_BAD_PARAMETER; | 383 | status = AE_BAD_PARAMETER; |
| 381 | break; | 384 | break; |
diff --git a/drivers/acpi/acpica/evxfregn.c b/drivers/acpi/acpica/evxfregn.c index 96c9e5f355ae..80cecf838591 100644 --- a/drivers/acpi/acpica/evxfregn.c +++ b/drivers/acpi/acpica/evxfregn.c | |||
| @@ -139,6 +139,7 @@ acpi_install_address_space_handler(acpi_handle device, | |||
| 139 | break; | 139 | break; |
| 140 | 140 | ||
| 141 | default: | 141 | default: |
| 142 | |||
| 142 | break; | 143 | break; |
| 143 | } | 144 | } |
| 144 | 145 | ||
diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c index d93b70be60ad..06d216c8d43a 100644 --- a/drivers/acpi/acpica/exconfig.c +++ b/drivers/acpi/acpica/exconfig.c | |||
| @@ -480,6 +480,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | |||
| 480 | break; | 480 | break; |
| 481 | 481 | ||
| 482 | default: | 482 | default: |
| 483 | |||
| 483 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 484 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
| 484 | } | 485 | } |
| 485 | 486 | ||
| @@ -588,7 +589,7 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle) | |||
| 588 | (ACPI_GET_DESCRIPTOR_TYPE(ddb_handle) != ACPI_DESC_TYPE_OPERAND) || | 589 | (ACPI_GET_DESCRIPTOR_TYPE(ddb_handle) != ACPI_DESC_TYPE_OPERAND) || |
| 589 | (ddb_handle->common.type != ACPI_TYPE_LOCAL_REFERENCE) || | 590 | (ddb_handle->common.type != ACPI_TYPE_LOCAL_REFERENCE) || |
| 590 | (!(ddb_handle->common.flags & AOPOBJ_DATA_VALID))) { | 591 | (!(ddb_handle->common.flags & AOPOBJ_DATA_VALID))) { |
| 591 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 592 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
| 592 | } | 593 | } |
| 593 | 594 | ||
| 594 | /* Get the table index from the ddb_handle */ | 595 | /* Get the table index from the ddb_handle */ |
diff --git a/drivers/acpi/acpica/exconvrt.c b/drivers/acpi/acpica/exconvrt.c index d2b9613bbf01..69e4a8cc9b71 100644 --- a/drivers/acpi/acpica/exconvrt.c +++ b/drivers/acpi/acpica/exconvrt.c | |||
| @@ -99,6 +99,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, | |||
| 99 | break; | 99 | break; |
| 100 | 100 | ||
| 101 | default: | 101 | default: |
| 102 | |||
| 102 | return_ACPI_STATUS(AE_TYPE); | 103 | return_ACPI_STATUS(AE_TYPE); |
| 103 | } | 104 | } |
| 104 | 105 | ||
| @@ -117,7 +118,6 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, | |||
| 117 | 118 | ||
| 118 | switch (obj_desc->common.type) { | 119 | switch (obj_desc->common.type) { |
| 119 | case ACPI_TYPE_STRING: | 120 | case ACPI_TYPE_STRING: |
| 120 | |||
| 121 | /* | 121 | /* |
| 122 | * Convert string to an integer - for most cases, the string must be | 122 | * Convert string to an integer - for most cases, the string must be |
| 123 | * hexadecimal as per the ACPI specification. The only exception (as | 123 | * hexadecimal as per the ACPI specification. The only exception (as |
| @@ -161,6 +161,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, | |||
| 161 | default: | 161 | default: |
| 162 | 162 | ||
| 163 | /* No other types can get here */ | 163 | /* No other types can get here */ |
| 164 | |||
| 164 | break; | 165 | break; |
| 165 | } | 166 | } |
| 166 | 167 | ||
| @@ -213,7 +214,6 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, | |||
| 213 | return_ACPI_STATUS(AE_OK); | 214 | return_ACPI_STATUS(AE_OK); |
| 214 | 215 | ||
| 215 | case ACPI_TYPE_INTEGER: | 216 | case ACPI_TYPE_INTEGER: |
| 216 | |||
| 217 | /* | 217 | /* |
| 218 | * Create a new Buffer object. | 218 | * Create a new Buffer object. |
| 219 | * Need enough space for one integer | 219 | * Need enough space for one integer |
| @@ -233,7 +233,6 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, | |||
| 233 | break; | 233 | break; |
| 234 | 234 | ||
| 235 | case ACPI_TYPE_STRING: | 235 | case ACPI_TYPE_STRING: |
| 236 | |||
| 237 | /* | 236 | /* |
| 238 | * Create a new Buffer object | 237 | * Create a new Buffer object |
| 239 | * Size will be the string length | 238 | * Size will be the string length |
| @@ -258,6 +257,7 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, | |||
| 258 | break; | 257 | break; |
| 259 | 258 | ||
| 260 | default: | 259 | default: |
| 260 | |||
| 261 | return_ACPI_STATUS(AE_TYPE); | 261 | return_ACPI_STATUS(AE_TYPE); |
| 262 | } | 262 | } |
| 263 | 263 | ||
| @@ -304,15 +304,18 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 data_width) | |||
| 304 | 304 | ||
| 305 | switch (data_width) { | 305 | switch (data_width) { |
| 306 | case 1: | 306 | case 1: |
| 307 | |||
| 307 | decimal_length = ACPI_MAX8_DECIMAL_DIGITS; | 308 | decimal_length = ACPI_MAX8_DECIMAL_DIGITS; |
| 308 | break; | 309 | break; |
| 309 | 310 | ||
| 310 | case 4: | 311 | case 4: |
| 312 | |||
| 311 | decimal_length = ACPI_MAX32_DECIMAL_DIGITS; | 313 | decimal_length = ACPI_MAX32_DECIMAL_DIGITS; |
| 312 | break; | 314 | break; |
| 313 | 315 | ||
| 314 | case 8: | 316 | case 8: |
| 315 | default: | 317 | default: |
| 318 | |||
| 316 | decimal_length = ACPI_MAX64_DECIMAL_DIGITS; | 319 | decimal_length = ACPI_MAX64_DECIMAL_DIGITS; |
| 317 | break; | 320 | break; |
| 318 | } | 321 | } |
| @@ -546,6 +549,7 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc, | |||
| 546 | break; | 549 | break; |
| 547 | 550 | ||
| 548 | default: | 551 | default: |
| 552 | |||
| 549 | return_ACPI_STATUS(AE_TYPE); | 553 | return_ACPI_STATUS(AE_TYPE); |
| 550 | } | 554 | } |
| 551 | 555 | ||
| @@ -599,6 +603,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, | |||
| 599 | break; | 603 | break; |
| 600 | 604 | ||
| 601 | default: | 605 | default: |
| 606 | |||
| 602 | /* No conversion allowed for these types */ | 607 | /* No conversion allowed for these types */ |
| 603 | 608 | ||
| 604 | if (destination_type != source_desc->common.type) { | 609 | if (destination_type != source_desc->common.type) { |
| @@ -649,6 +654,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, | |||
| 649 | break; | 654 | break; |
| 650 | 655 | ||
| 651 | default: | 656 | default: |
| 657 | |||
| 652 | ACPI_ERROR((AE_INFO, | 658 | ACPI_ERROR((AE_INFO, |
| 653 | "Bad destination type during conversion: 0x%X", | 659 | "Bad destination type during conversion: 0x%X", |
| 654 | destination_type)); | 660 | destination_type)); |
| @@ -664,6 +670,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, | |||
| 664 | break; | 670 | break; |
| 665 | 671 | ||
| 666 | default: | 672 | default: |
| 673 | |||
| 667 | ACPI_ERROR((AE_INFO, | 674 | ACPI_ERROR((AE_INFO, |
| 668 | "Unknown Target type ID 0x%X AmlOpcode 0x%X DestType %s", | 675 | "Unknown Target type ID 0x%X AmlOpcode 0x%X DestType %s", |
| 669 | GET_CURRENT_ARG_TYPE(walk_state->op_info-> | 676 | GET_CURRENT_ARG_TYPE(walk_state->op_info-> |
diff --git a/drivers/acpi/acpica/excreate.c b/drivers/acpi/acpica/excreate.c index 26a13f67977e..269e81d86ef4 100644 --- a/drivers/acpi/acpica/excreate.c +++ b/drivers/acpi/acpica/excreate.c | |||
| @@ -103,7 +103,6 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state) | |||
| 103 | case ACPI_TYPE_BUFFER: | 103 | case ACPI_TYPE_BUFFER: |
| 104 | case ACPI_TYPE_PACKAGE: | 104 | case ACPI_TYPE_PACKAGE: |
| 105 | case ACPI_TYPE_BUFFER_FIELD: | 105 | case ACPI_TYPE_BUFFER_FIELD: |
| 106 | |||
| 107 | /* | 106 | /* |
| 108 | * These types open a new scope, so we need the NS node in order to access | 107 | * These types open a new scope, so we need the NS node in order to access |
| 109 | * any children. | 108 | * any children. |
| @@ -113,7 +112,6 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state) | |||
| 113 | case ACPI_TYPE_PROCESSOR: | 112 | case ACPI_TYPE_PROCESSOR: |
| 114 | case ACPI_TYPE_THERMAL: | 113 | case ACPI_TYPE_THERMAL: |
| 115 | case ACPI_TYPE_LOCAL_SCOPE: | 114 | case ACPI_TYPE_LOCAL_SCOPE: |
| 116 | |||
| 117 | /* | 115 | /* |
| 118 | * The new alias has the type ALIAS and points to the original | 116 | * The new alias has the type ALIAS and points to the original |
| 119 | * NS node, not the object itself. | 117 | * NS node, not the object itself. |
| @@ -124,7 +122,6 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state) | |||
| 124 | break; | 122 | break; |
| 125 | 123 | ||
| 126 | case ACPI_TYPE_METHOD: | 124 | case ACPI_TYPE_METHOD: |
| 127 | |||
| 128 | /* | 125 | /* |
| 129 | * Control method aliases need to be differentiated | 126 | * Control method aliases need to be differentiated |
| 130 | */ | 127 | */ |
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c index 7eb853cd279f..81c72a4ecd82 100644 --- a/drivers/acpi/acpica/exdebug.c +++ b/drivers/acpi/acpica/exdebug.c | |||
| @@ -193,6 +193,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, | |||
| 193 | return_VOID; | 193 | return_VOID; |
| 194 | 194 | ||
| 195 | default: | 195 | default: |
| 196 | |||
| 196 | break; | 197 | break; |
| 197 | } | 198 | } |
| 198 | 199 | ||
| @@ -226,6 +227,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, | |||
| 226 | break; | 227 | break; |
| 227 | 228 | ||
| 228 | default: | 229 | default: |
| 230 | |||
| 229 | acpi_ex_do_debug_object((source_desc-> | 231 | acpi_ex_do_debug_object((source_desc-> |
| 230 | reference. | 232 | reference. |
| 231 | node)->object, | 233 | node)->object, |
diff --git a/drivers/acpi/acpica/exdump.c b/drivers/acpi/acpica/exdump.c index e5a3c249f7fa..c740f24e3101 100644 --- a/drivers/acpi/acpica/exdump.c +++ b/drivers/acpi/acpica/exdump.c | |||
| @@ -357,6 +357,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc, | |||
| 357 | 357 | ||
| 358 | switch (info->opcode) { | 358 | switch (info->opcode) { |
| 359 | case ACPI_EXD_INIT: | 359 | case ACPI_EXD_INIT: |
| 360 | |||
| 360 | break; | 361 | break; |
| 361 | 362 | ||
| 362 | case ACPI_EXD_TYPE: | 363 | case ACPI_EXD_TYPE: |
| @@ -718,6 +719,7 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth) | |||
| 718 | break; | 719 | break; |
| 719 | 720 | ||
| 720 | default: | 721 | default: |
| 722 | |||
| 721 | /* Unknown Type */ | 723 | /* Unknown Type */ |
| 722 | 724 | ||
| 723 | acpi_os_printf("Unknown Type %X\n", obj_desc->common.type); | 725 | acpi_os_printf("Unknown Type %X\n", obj_desc->common.type); |
diff --git a/drivers/acpi/acpica/exfield.c b/drivers/acpi/acpica/exfield.c index 7d4bae71e8c6..c2a65aaf29af 100644 --- a/drivers/acpi/acpica/exfield.c +++ b/drivers/acpi/acpica/exfield.c | |||
| @@ -331,21 +331,25 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, | |||
| 331 | 331 | ||
| 332 | switch (source_desc->common.type) { | 332 | switch (source_desc->common.type) { |
| 333 | case ACPI_TYPE_INTEGER: | 333 | case ACPI_TYPE_INTEGER: |
| 334 | |||
| 334 | buffer = &source_desc->integer.value; | 335 | buffer = &source_desc->integer.value; |
| 335 | length = sizeof(source_desc->integer.value); | 336 | length = sizeof(source_desc->integer.value); |
| 336 | break; | 337 | break; |
| 337 | 338 | ||
| 338 | case ACPI_TYPE_BUFFER: | 339 | case ACPI_TYPE_BUFFER: |
| 340 | |||
| 339 | buffer = source_desc->buffer.pointer; | 341 | buffer = source_desc->buffer.pointer; |
| 340 | length = source_desc->buffer.length; | 342 | length = source_desc->buffer.length; |
| 341 | break; | 343 | break; |
| 342 | 344 | ||
| 343 | case ACPI_TYPE_STRING: | 345 | case ACPI_TYPE_STRING: |
| 346 | |||
| 344 | buffer = source_desc->string.pointer; | 347 | buffer = source_desc->string.pointer; |
| 345 | length = source_desc->string.length; | 348 | length = source_desc->string.length; |
| 346 | break; | 349 | break; |
| 347 | 350 | ||
| 348 | default: | 351 | default: |
| 352 | |||
| 349 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 353 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
| 350 | } | 354 | } |
| 351 | 355 | ||
diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c index c84ee956fa4c..7e0afe72487e 100644 --- a/drivers/acpi/acpica/exfldio.c +++ b/drivers/acpi/acpica/exfldio.c | |||
| @@ -446,7 +446,6 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc, | |||
| 446 | break; | 446 | break; |
| 447 | 447 | ||
| 448 | case ACPI_TYPE_LOCAL_BANK_FIELD: | 448 | case ACPI_TYPE_LOCAL_BANK_FIELD: |
| 449 | |||
| 450 | /* | 449 | /* |
| 451 | * Ensure that the bank_value is not beyond the capacity of | 450 | * Ensure that the bank_value is not beyond the capacity of |
| 452 | * the register | 451 | * the register |
| @@ -488,7 +487,6 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc, | |||
| 488 | break; | 487 | break; |
| 489 | 488 | ||
| 490 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | 489 | case ACPI_TYPE_LOCAL_INDEX_FIELD: |
| 491 | |||
| 492 | /* | 490 | /* |
| 493 | * Ensure that the index_value is not beyond the capacity of | 491 | * Ensure that the index_value is not beyond the capacity of |
| 494 | * the register | 492 | * the register |
diff --git a/drivers/acpi/acpica/exmisc.c b/drivers/acpi/acpica/exmisc.c index 72a2a13b6d36..00bf29877574 100644 --- a/drivers/acpi/acpica/exmisc.c +++ b/drivers/acpi/acpica/exmisc.c | |||
| @@ -105,7 +105,6 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc, | |||
| 105 | break; | 105 | break; |
| 106 | 106 | ||
| 107 | case ACPI_DESC_TYPE_NAMED: | 107 | case ACPI_DESC_TYPE_NAMED: |
| 108 | |||
| 109 | /* | 108 | /* |
| 110 | * A named reference that has already been resolved to a Node | 109 | * A named reference that has already been resolved to a Node |
| 111 | */ | 110 | */ |
| @@ -261,20 +260,24 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0, | |||
| 261 | */ | 260 | */ |
| 262 | switch (operand0->common.type) { | 261 | switch (operand0->common.type) { |
| 263 | case ACPI_TYPE_INTEGER: | 262 | case ACPI_TYPE_INTEGER: |
| 263 | |||
| 264 | status = | 264 | status = |
| 265 | acpi_ex_convert_to_integer(operand1, &local_operand1, 16); | 265 | acpi_ex_convert_to_integer(operand1, &local_operand1, 16); |
| 266 | break; | 266 | break; |
| 267 | 267 | ||
| 268 | case ACPI_TYPE_STRING: | 268 | case ACPI_TYPE_STRING: |
| 269 | |||
| 269 | status = acpi_ex_convert_to_string(operand1, &local_operand1, | 270 | status = acpi_ex_convert_to_string(operand1, &local_operand1, |
| 270 | ACPI_IMPLICIT_CONVERT_HEX); | 271 | ACPI_IMPLICIT_CONVERT_HEX); |
| 271 | break; | 272 | break; |
| 272 | 273 | ||
| 273 | case ACPI_TYPE_BUFFER: | 274 | case ACPI_TYPE_BUFFER: |
| 275 | |||
| 274 | status = acpi_ex_convert_to_buffer(operand1, &local_operand1); | 276 | status = acpi_ex_convert_to_buffer(operand1, &local_operand1); |
| 275 | break; | 277 | break; |
| 276 | 278 | ||
| 277 | default: | 279 | default: |
| 280 | |||
| 278 | ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X", | 281 | ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X", |
| 279 | operand0->common.type)); | 282 | operand0->common.type)); |
| 280 | status = AE_AML_INTERNAL; | 283 | status = AE_AML_INTERNAL; |
| @@ -519,6 +522,7 @@ acpi_ex_do_logical_numeric_op(u16 opcode, | |||
| 519 | break; | 522 | break; |
| 520 | 523 | ||
| 521 | default: | 524 | default: |
| 525 | |||
| 522 | status = AE_AML_INTERNAL; | 526 | status = AE_AML_INTERNAL; |
| 523 | break; | 527 | break; |
| 524 | } | 528 | } |
| @@ -580,20 +584,24 @@ acpi_ex_do_logical_op(u16 opcode, | |||
| 580 | */ | 584 | */ |
| 581 | switch (operand0->common.type) { | 585 | switch (operand0->common.type) { |
| 582 | case ACPI_TYPE_INTEGER: | 586 | case ACPI_TYPE_INTEGER: |
| 587 | |||
| 583 | status = | 588 | status = |
| 584 | acpi_ex_convert_to_integer(operand1, &local_operand1, 16); | 589 | acpi_ex_convert_to_integer(operand1, &local_operand1, 16); |
| 585 | break; | 590 | break; |
| 586 | 591 | ||
| 587 | case ACPI_TYPE_STRING: | 592 | case ACPI_TYPE_STRING: |
| 593 | |||
| 588 | status = acpi_ex_convert_to_string(operand1, &local_operand1, | 594 | status = acpi_ex_convert_to_string(operand1, &local_operand1, |
| 589 | ACPI_IMPLICIT_CONVERT_HEX); | 595 | ACPI_IMPLICIT_CONVERT_HEX); |
| 590 | break; | 596 | break; |
| 591 | 597 | ||
| 592 | case ACPI_TYPE_BUFFER: | 598 | case ACPI_TYPE_BUFFER: |
| 599 | |||
| 593 | status = acpi_ex_convert_to_buffer(operand1, &local_operand1); | 600 | status = acpi_ex_convert_to_buffer(operand1, &local_operand1); |
| 594 | break; | 601 | break; |
| 595 | 602 | ||
| 596 | default: | 603 | default: |
| 604 | |||
| 597 | status = AE_AML_INTERNAL; | 605 | status = AE_AML_INTERNAL; |
| 598 | break; | 606 | break; |
| 599 | } | 607 | } |
| @@ -636,6 +644,7 @@ acpi_ex_do_logical_op(u16 opcode, | |||
| 636 | break; | 644 | break; |
| 637 | 645 | ||
| 638 | default: | 646 | default: |
| 647 | |||
| 639 | status = AE_AML_INTERNAL; | 648 | status = AE_AML_INTERNAL; |
| 640 | break; | 649 | break; |
| 641 | } | 650 | } |
| @@ -703,6 +712,7 @@ acpi_ex_do_logical_op(u16 opcode, | |||
| 703 | break; | 712 | break; |
| 704 | 713 | ||
| 705 | default: | 714 | default: |
| 715 | |||
| 706 | status = AE_AML_INTERNAL; | 716 | status = AE_AML_INTERNAL; |
| 707 | break; | 717 | break; |
| 708 | } | 718 | } |
diff --git a/drivers/acpi/acpica/exoparg1.c b/drivers/acpi/acpica/exoparg1.c index b60c877f5906..814b4a3d656a 100644 --- a/drivers/acpi/acpica/exoparg1.c +++ b/drivers/acpi/acpica/exoparg1.c | |||
| @@ -327,7 +327,6 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state) | |||
| 327 | break; | 327 | break; |
| 328 | 328 | ||
| 329 | case AML_FROM_BCD_OP: /* from_bcd (BCDValue, Result) */ | 329 | case AML_FROM_BCD_OP: /* from_bcd (BCDValue, Result) */ |
| 330 | |||
| 331 | /* | 330 | /* |
| 332 | * The 64-bit ACPI integer can hold 16 4-bit BCD characters | 331 | * The 64-bit ACPI integer can hold 16 4-bit BCD characters |
| 333 | * (if table is 32-bit, integer can hold 8 BCD characters) | 332 | * (if table is 32-bit, integer can hold 8 BCD characters) |
| @@ -407,7 +406,6 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state) | |||
| 407 | break; | 406 | break; |
| 408 | 407 | ||
| 409 | case AML_COND_REF_OF_OP: /* cond_ref_of (source_object, Result) */ | 408 | case AML_COND_REF_OF_OP: /* cond_ref_of (source_object, Result) */ |
| 410 | |||
| 411 | /* | 409 | /* |
| 412 | * This op is a little strange because the internal return value is | 410 | * This op is a little strange because the internal return value is |
| 413 | * different than the return value stored in the result descriptor | 411 | * different than the return value stored in the result descriptor |
| @@ -442,13 +440,14 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state) | |||
| 442 | goto cleanup; | 440 | goto cleanup; |
| 443 | 441 | ||
| 444 | default: | 442 | default: |
| 443 | |||
| 445 | /* No other opcodes get here */ | 444 | /* No other opcodes get here */ |
| 445 | |||
| 446 | break; | 446 | break; |
| 447 | } | 447 | } |
| 448 | break; | 448 | break; |
| 449 | 449 | ||
| 450 | case AML_STORE_OP: /* Store (Source, Target) */ | 450 | case AML_STORE_OP: /* Store (Source, Target) */ |
| 451 | |||
| 452 | /* | 451 | /* |
| 453 | * A store operand is typically a number, string, buffer or lvalue | 452 | * A store operand is typically a number, string, buffer or lvalue |
| 454 | * Be careful about deleting the source object, | 453 | * Be careful about deleting the source object, |
| @@ -615,7 +614,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 615 | 614 | ||
| 616 | case AML_DECREMENT_OP: /* Decrement (Operand) */ | 615 | case AML_DECREMENT_OP: /* Decrement (Operand) */ |
| 617 | case AML_INCREMENT_OP: /* Increment (Operand) */ | 616 | case AML_INCREMENT_OP: /* Increment (Operand) */ |
| 618 | |||
| 619 | /* | 617 | /* |
| 620 | * Create a new integer. Can't just get the base integer and | 618 | * Create a new integer. Can't just get the base integer and |
| 621 | * increment it because it may be an Arg or Field. | 619 | * increment it because it may be an Arg or Field. |
| @@ -682,7 +680,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 682 | break; | 680 | break; |
| 683 | 681 | ||
| 684 | case AML_TYPE_OP: /* object_type (source_object) */ | 682 | case AML_TYPE_OP: /* object_type (source_object) */ |
| 685 | |||
| 686 | /* | 683 | /* |
| 687 | * Note: The operand is not resolved at this point because we want to | 684 | * Note: The operand is not resolved at this point because we want to |
| 688 | * get the associated object, not its value. For example, we don't | 685 | * get the associated object, not its value. For example, we don't |
| @@ -709,7 +706,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 709 | break; | 706 | break; |
| 710 | 707 | ||
| 711 | case AML_SIZE_OF_OP: /* size_of (source_object) */ | 708 | case AML_SIZE_OF_OP: /* size_of (source_object) */ |
| 712 | |||
| 713 | /* | 709 | /* |
| 714 | * Note: The operand is not resolved at this point because we want to | 710 | * Note: The operand is not resolved at this point because we want to |
| 715 | * get the associated object, not its value. | 711 | * get the associated object, not its value. |
| @@ -735,10 +731,12 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 735 | */ | 731 | */ |
| 736 | switch (type) { | 732 | switch (type) { |
| 737 | case ACPI_TYPE_INTEGER: | 733 | case ACPI_TYPE_INTEGER: |
| 734 | |||
| 738 | value = acpi_gbl_integer_byte_width; | 735 | value = acpi_gbl_integer_byte_width; |
| 739 | break; | 736 | break; |
| 740 | 737 | ||
| 741 | case ACPI_TYPE_STRING: | 738 | case ACPI_TYPE_STRING: |
| 739 | |||
| 742 | value = temp_desc->string.length; | 740 | value = temp_desc->string.length; |
| 743 | break; | 741 | break; |
| 744 | 742 | ||
| @@ -759,6 +757,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 759 | break; | 757 | break; |
| 760 | 758 | ||
| 761 | default: | 759 | default: |
| 760 | |||
| 762 | ACPI_ERROR((AE_INFO, | 761 | ACPI_ERROR((AE_INFO, |
| 763 | "Operand must be Buffer/Integer/String/Package - found type %s", | 762 | "Operand must be Buffer/Integer/String/Package - found type %s", |
| 764 | acpi_ut_get_type_name(type))); | 763 | acpi_ut_get_type_name(type))); |
| @@ -860,9 +859,11 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 860 | break; | 859 | break; |
| 861 | 860 | ||
| 862 | case ACPI_TYPE_STRING: | 861 | case ACPI_TYPE_STRING: |
| 862 | |||
| 863 | break; | 863 | break; |
| 864 | 864 | ||
| 865 | default: | 865 | default: |
| 866 | |||
| 866 | status = AE_AML_OPERAND_TYPE; | 867 | status = AE_AML_OPERAND_TYPE; |
| 867 | goto cleanup; | 868 | goto cleanup; |
| 868 | } | 869 | } |
| @@ -923,7 +924,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 923 | */ | 924 | */ |
| 924 | switch (operand[0]->reference.class) { | 925 | switch (operand[0]->reference.class) { |
| 925 | case ACPI_REFCLASS_INDEX: | 926 | case ACPI_REFCLASS_INDEX: |
| 926 | |||
| 927 | /* | 927 | /* |
| 928 | * The target type for the Index operator must be | 928 | * The target type for the Index operator must be |
| 929 | * either a Buffer or a Package | 929 | * either a Buffer or a Package |
| @@ -956,7 +956,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 956 | break; | 956 | break; |
| 957 | 957 | ||
| 958 | case ACPI_TYPE_PACKAGE: | 958 | case ACPI_TYPE_PACKAGE: |
| 959 | |||
| 960 | /* | 959 | /* |
| 961 | * Return the referenced element of the package. We must | 960 | * Return the referenced element of the package. We must |
| 962 | * add another reference to the referenced object, however. | 961 | * add another reference to the referenced object, however. |
| @@ -999,6 +998,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
| 999 | break; | 998 | break; |
| 1000 | 999 | ||
| 1001 | default: | 1000 | default: |
| 1001 | |||
| 1002 | ACPI_ERROR((AE_INFO, | 1002 | ACPI_ERROR((AE_INFO, |
| 1003 | "Unknown class in reference(%p) - 0x%2.2X", | 1003 | "Unknown class in reference(%p) - 0x%2.2X", |
| 1004 | operand[0], | 1004 | operand[0], |
diff --git a/drivers/acpi/acpica/exoparg2.c b/drivers/acpi/acpica/exoparg2.c index b0838a4ea53e..d5088f7030c7 100644 --- a/drivers/acpi/acpica/exoparg2.c +++ b/drivers/acpi/acpica/exoparg2.c | |||
| @@ -304,7 +304,6 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state) | |||
| 304 | break; | 304 | break; |
| 305 | 305 | ||
| 306 | case AML_TO_STRING_OP: /* to_string (Buffer, Length, Result) (ACPI 2.0) */ | 306 | case AML_TO_STRING_OP: /* to_string (Buffer, Length, Result) (ACPI 2.0) */ |
| 307 | |||
| 308 | /* | 307 | /* |
| 309 | * Input object is guaranteed to be a buffer at this point (it may have | 308 | * Input object is guaranteed to be a buffer at this point (it may have |
| 310 | * been converted.) Copy the raw buffer data to a new object of | 309 | * been converted.) Copy the raw buffer data to a new object of |
diff --git a/drivers/acpi/acpica/exoparg3.c b/drivers/acpi/acpica/exoparg3.c index 2d7491f3126e..37656f12f204 100644 --- a/drivers/acpi/acpica/exoparg3.c +++ b/drivers/acpi/acpica/exoparg3.c | |||
| @@ -155,7 +155,6 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state) | |||
| 155 | 155 | ||
| 156 | switch (walk_state->opcode) { | 156 | switch (walk_state->opcode) { |
| 157 | case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */ | 157 | case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */ |
| 158 | |||
| 159 | /* | 158 | /* |
| 160 | * Create the return object. The Source operand is guaranteed to be | 159 | * Create the return object. The Source operand is guaranteed to be |
| 161 | * either a String or a Buffer, so just use its type. | 160 | * either a String or a Buffer, so just use its type. |
diff --git a/drivers/acpi/acpica/exoparg6.c b/drivers/acpi/acpica/exoparg6.c index b76b97002dff..879b6cd8319c 100644 --- a/drivers/acpi/acpica/exoparg6.c +++ b/drivers/acpi/acpica/exoparg6.c | |||
| @@ -119,7 +119,6 @@ acpi_ex_do_match(u32 match_op, | |||
| 119 | break; | 119 | break; |
| 120 | 120 | ||
| 121 | case MATCH_MEQ: | 121 | case MATCH_MEQ: |
| 122 | |||
| 123 | /* | 122 | /* |
| 124 | * True if equal: (P[i] == M) | 123 | * True if equal: (P[i] == M) |
| 125 | * Change to: (M == P[i]) | 124 | * Change to: (M == P[i]) |
| @@ -133,7 +132,6 @@ acpi_ex_do_match(u32 match_op, | |||
| 133 | break; | 132 | break; |
| 134 | 133 | ||
| 135 | case MATCH_MLE: | 134 | case MATCH_MLE: |
| 136 | |||
| 137 | /* | 135 | /* |
| 138 | * True if less than or equal: (P[i] <= M) (P[i] not_greater than M) | 136 | * True if less than or equal: (P[i] <= M) (P[i] not_greater than M) |
| 139 | * Change to: (M >= P[i]) (M not_less than P[i]) | 137 | * Change to: (M >= P[i]) (M not_less than P[i]) |
| @@ -148,7 +146,6 @@ acpi_ex_do_match(u32 match_op, | |||
| 148 | break; | 146 | break; |
| 149 | 147 | ||
| 150 | case MATCH_MLT: | 148 | case MATCH_MLT: |
| 151 | |||
| 152 | /* | 149 | /* |
| 153 | * True if less than: (P[i] < M) | 150 | * True if less than: (P[i] < M) |
| 154 | * Change to: (M > P[i]) | 151 | * Change to: (M > P[i]) |
| @@ -162,7 +159,6 @@ acpi_ex_do_match(u32 match_op, | |||
| 162 | break; | 159 | break; |
| 163 | 160 | ||
| 164 | case MATCH_MGE: | 161 | case MATCH_MGE: |
| 165 | |||
| 166 | /* | 162 | /* |
| 167 | * True if greater than or equal: (P[i] >= M) (P[i] not_less than M) | 163 | * True if greater than or equal: (P[i] >= M) (P[i] not_less than M) |
| 168 | * Change to: (M <= P[i]) (M not_greater than P[i]) | 164 | * Change to: (M <= P[i]) (M not_greater than P[i]) |
| @@ -177,7 +173,6 @@ acpi_ex_do_match(u32 match_op, | |||
| 177 | break; | 173 | break; |
| 178 | 174 | ||
| 179 | case MATCH_MGT: | 175 | case MATCH_MGT: |
| 180 | |||
| 181 | /* | 176 | /* |
| 182 | * True if greater than: (P[i] > M) | 177 | * True if greater than: (P[i] > M) |
| 183 | * Change to: (M < P[i]) | 178 | * Change to: (M < P[i]) |
diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c index 6b728aef2dca..5a588611ab48 100644 --- a/drivers/acpi/acpica/exprep.c +++ b/drivers/acpi/acpica/exprep.c | |||
| @@ -253,26 +253,31 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc, | |||
| 253 | 253 | ||
| 254 | case AML_FIELD_ACCESS_BYTE: | 254 | case AML_FIELD_ACCESS_BYTE: |
| 255 | case AML_FIELD_ACCESS_BUFFER: /* ACPI 2.0 (SMBus Buffer) */ | 255 | case AML_FIELD_ACCESS_BUFFER: /* ACPI 2.0 (SMBus Buffer) */ |
| 256 | |||
| 256 | byte_alignment = 1; | 257 | byte_alignment = 1; |
| 257 | bit_length = 8; | 258 | bit_length = 8; |
| 258 | break; | 259 | break; |
| 259 | 260 | ||
| 260 | case AML_FIELD_ACCESS_WORD: | 261 | case AML_FIELD_ACCESS_WORD: |
| 262 | |||
| 261 | byte_alignment = 2; | 263 | byte_alignment = 2; |
| 262 | bit_length = 16; | 264 | bit_length = 16; |
| 263 | break; | 265 | break; |
| 264 | 266 | ||
| 265 | case AML_FIELD_ACCESS_DWORD: | 267 | case AML_FIELD_ACCESS_DWORD: |
| 268 | |||
| 266 | byte_alignment = 4; | 269 | byte_alignment = 4; |
| 267 | bit_length = 32; | 270 | bit_length = 32; |
| 268 | break; | 271 | break; |
| 269 | 272 | ||
| 270 | case AML_FIELD_ACCESS_QWORD: /* ACPI 2.0 */ | 273 | case AML_FIELD_ACCESS_QWORD: /* ACPI 2.0 */ |
| 274 | |||
| 271 | byte_alignment = 8; | 275 | byte_alignment = 8; |
| 272 | bit_length = 64; | 276 | bit_length = 64; |
| 273 | break; | 277 | break; |
| 274 | 278 | ||
| 275 | default: | 279 | default: |
| 280 | |||
| 276 | /* Invalid field access type */ | 281 | /* Invalid field access type */ |
| 277 | 282 | ||
| 278 | ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access)); | 283 | ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access)); |
| @@ -598,7 +603,9 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) | |||
| 598 | break; | 603 | break; |
| 599 | 604 | ||
| 600 | default: | 605 | default: |
| 606 | |||
| 601 | /* No other types should get here */ | 607 | /* No other types should get here */ |
| 608 | |||
| 602 | break; | 609 | break; |
| 603 | } | 610 | } |
| 604 | 611 | ||
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c index 182abaf045e1..303429bb4d5d 100644 --- a/drivers/acpi/acpica/exregion.c +++ b/drivers/acpi/acpica/exregion.c | |||
| @@ -88,22 +88,27 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
| 88 | 88 | ||
| 89 | switch (bit_width) { | 89 | switch (bit_width) { |
| 90 | case 8: | 90 | case 8: |
| 91 | |||
| 91 | length = 1; | 92 | length = 1; |
| 92 | break; | 93 | break; |
| 93 | 94 | ||
| 94 | case 16: | 95 | case 16: |
| 96 | |||
| 95 | length = 2; | 97 | length = 2; |
| 96 | break; | 98 | break; |
| 97 | 99 | ||
| 98 | case 32: | 100 | case 32: |
| 101 | |||
| 99 | length = 4; | 102 | length = 4; |
| 100 | break; | 103 | break; |
| 101 | 104 | ||
| 102 | case 64: | 105 | case 64: |
| 106 | |||
| 103 | length = 8; | 107 | length = 8; |
| 104 | break; | 108 | break; |
| 105 | 109 | ||
| 106 | default: | 110 | default: |
| 111 | |||
| 107 | ACPI_ERROR((AE_INFO, "Invalid SystemMemory width %u", | 112 | ACPI_ERROR((AE_INFO, "Invalid SystemMemory width %u", |
| 108 | bit_width)); | 113 | bit_width)); |
| 109 | return_ACPI_STATUS(AE_AML_OPERAND_VALUE); | 114 | return_ACPI_STATUS(AE_AML_OPERAND_VALUE); |
| @@ -214,23 +219,29 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
| 214 | *value = 0; | 219 | *value = 0; |
| 215 | switch (bit_width) { | 220 | switch (bit_width) { |
| 216 | case 8: | 221 | case 8: |
| 217 | *value = (u64) ACPI_GET8(logical_addr_ptr); | 222 | |
| 223 | *value = (u64)ACPI_GET8(logical_addr_ptr); | ||
| 218 | break; | 224 | break; |
| 219 | 225 | ||
| 220 | case 16: | 226 | case 16: |
| 221 | *value = (u64) ACPI_GET16(logical_addr_ptr); | 227 | |
| 228 | *value = (u64)ACPI_GET16(logical_addr_ptr); | ||
| 222 | break; | 229 | break; |
| 223 | 230 | ||
| 224 | case 32: | 231 | case 32: |
| 225 | *value = (u64) ACPI_GET32(logical_addr_ptr); | 232 | |
| 233 | *value = (u64)ACPI_GET32(logical_addr_ptr); | ||
| 226 | break; | 234 | break; |
| 227 | 235 | ||
| 228 | case 64: | 236 | case 64: |
| 229 | *value = (u64) ACPI_GET64(logical_addr_ptr); | 237 | |
| 238 | *value = (u64)ACPI_GET64(logical_addr_ptr); | ||
| 230 | break; | 239 | break; |
| 231 | 240 | ||
| 232 | default: | 241 | default: |
| 242 | |||
| 233 | /* bit_width was already validated */ | 243 | /* bit_width was already validated */ |
| 244 | |||
| 234 | break; | 245 | break; |
| 235 | } | 246 | } |
| 236 | break; | 247 | break; |
| @@ -239,28 +250,35 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
| 239 | 250 | ||
| 240 | switch (bit_width) { | 251 | switch (bit_width) { |
| 241 | case 8: | 252 | case 8: |
| 253 | |||
| 242 | ACPI_SET8(logical_addr_ptr, *value); | 254 | ACPI_SET8(logical_addr_ptr, *value); |
| 243 | break; | 255 | break; |
| 244 | 256 | ||
| 245 | case 16: | 257 | case 16: |
| 258 | |||
| 246 | ACPI_SET16(logical_addr_ptr, *value); | 259 | ACPI_SET16(logical_addr_ptr, *value); |
| 247 | break; | 260 | break; |
| 248 | 261 | ||
| 249 | case 32: | 262 | case 32: |
| 263 | |||
| 250 | ACPI_SET32(logical_addr_ptr, *value); | 264 | ACPI_SET32(logical_addr_ptr, *value); |
| 251 | break; | 265 | break; |
| 252 | 266 | ||
| 253 | case 64: | 267 | case 64: |
| 268 | |||
| 254 | ACPI_SET64(logical_addr_ptr, *value); | 269 | ACPI_SET64(logical_addr_ptr, *value); |
| 255 | break; | 270 | break; |
| 256 | 271 | ||
| 257 | default: | 272 | default: |
| 273 | |||
| 258 | /* bit_width was already validated */ | 274 | /* bit_width was already validated */ |
| 275 | |||
| 259 | break; | 276 | break; |
| 260 | } | 277 | } |
| 261 | break; | 278 | break; |
| 262 | 279 | ||
| 263 | default: | 280 | default: |
| 281 | |||
| 264 | status = AE_BAD_PARAMETER; | 282 | status = AE_BAD_PARAMETER; |
| 265 | break; | 283 | break; |
| 266 | } | 284 | } |
| @@ -320,6 +338,7 @@ acpi_ex_system_io_space_handler(u32 function, | |||
| 320 | break; | 338 | break; |
| 321 | 339 | ||
| 322 | default: | 340 | default: |
| 341 | |||
| 323 | status = AE_BAD_PARAMETER; | 342 | status = AE_BAD_PARAMETER; |
| 324 | break; | 343 | break; |
| 325 | } | 344 | } |
diff --git a/drivers/acpi/acpica/exresnte.c b/drivers/acpi/acpica/exresnte.c index 8565b6bd12bb..acd34f599313 100644 --- a/drivers/acpi/acpica/exresnte.c +++ b/drivers/acpi/acpica/exresnte.c | |||
| @@ -248,6 +248,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr, | |||
| 248 | break; | 248 | break; |
| 249 | 249 | ||
| 250 | default: | 250 | default: |
| 251 | |||
| 251 | /* No named references are allowed here */ | 252 | /* No named references are allowed here */ |
| 252 | 253 | ||
| 253 | ACPI_ERROR((AE_INFO, | 254 | ACPI_ERROR((AE_INFO, |
diff --git a/drivers/acpi/acpica/exresolv.c b/drivers/acpi/acpica/exresolv.c index e4f9dfbb2a13..ac04278ad28f 100644 --- a/drivers/acpi/acpica/exresolv.c +++ b/drivers/acpi/acpica/exresolv.c | |||
| @@ -156,7 +156,6 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, | |||
| 156 | switch (ref_type) { | 156 | switch (ref_type) { |
| 157 | case ACPI_REFCLASS_LOCAL: | 157 | case ACPI_REFCLASS_LOCAL: |
| 158 | case ACPI_REFCLASS_ARG: | 158 | case ACPI_REFCLASS_ARG: |
| 159 | |||
| 160 | /* | 159 | /* |
| 161 | * Get the local from the method's state info | 160 | * Get the local from the method's state info |
| 162 | * Note: this increments the local's object reference count | 161 | * Note: this increments the local's object reference count |
| @@ -309,6 +308,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, | |||
| 309 | break; | 308 | break; |
| 310 | 309 | ||
| 311 | default: | 310 | default: |
| 311 | |||
| 312 | break; | 312 | break; |
| 313 | } | 313 | } |
| 314 | 314 | ||
| @@ -348,10 +348,12 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, | |||
| 348 | 348 | ||
| 349 | switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) { | 349 | switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) { |
| 350 | case ACPI_DESC_TYPE_OPERAND: | 350 | case ACPI_DESC_TYPE_OPERAND: |
| 351 | |||
| 351 | type = obj_desc->common.type; | 352 | type = obj_desc->common.type; |
| 352 | break; | 353 | break; |
| 353 | 354 | ||
| 354 | case ACPI_DESC_TYPE_NAMED: | 355 | case ACPI_DESC_TYPE_NAMED: |
| 356 | |||
| 355 | type = ((struct acpi_namespace_node *)obj_desc)->type; | 357 | type = ((struct acpi_namespace_node *)obj_desc)->type; |
| 356 | obj_desc = | 358 | obj_desc = |
| 357 | acpi_ns_get_attached_object((struct acpi_namespace_node *) | 359 | acpi_ns_get_attached_object((struct acpi_namespace_node *) |
| @@ -538,7 +540,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, | |||
| 538 | break; | 540 | break; |
| 539 | 541 | ||
| 540 | default: | 542 | default: |
| 543 | |||
| 541 | /* No change to Type required */ | 544 | /* No change to Type required */ |
| 545 | |||
| 542 | break; | 546 | break; |
| 543 | } | 547 | } |
| 544 | 548 | ||
diff --git a/drivers/acpi/acpica/exresop.c b/drivers/acpi/acpica/exresop.c index 9fb9f5e9a4da..00e5af7129c1 100644 --- a/drivers/acpi/acpica/exresop.c +++ b/drivers/acpi/acpica/exresop.c | |||
| @@ -307,7 +307,6 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 307 | case ARGI_TARGETREF: /* Allows implicit conversion rules before store */ | 307 | case ARGI_TARGETREF: /* Allows implicit conversion rules before store */ |
| 308 | case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */ | 308 | case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */ |
| 309 | case ARGI_SIMPLE_TARGET: /* Name, Local, or arg - no implicit conversion */ | 309 | case ARGI_SIMPLE_TARGET: /* Name, Local, or arg - no implicit conversion */ |
| 310 | |||
| 311 | /* | 310 | /* |
| 312 | * Need an operand of type ACPI_TYPE_LOCAL_REFERENCE | 311 | * Need an operand of type ACPI_TYPE_LOCAL_REFERENCE |
| 313 | * A Namespace Node is OK as-is | 312 | * A Namespace Node is OK as-is |
| @@ -326,7 +325,6 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 326 | goto next_operand; | 325 | goto next_operand; |
| 327 | 326 | ||
| 328 | case ARGI_DATAREFOBJ: /* Store operator only */ | 327 | case ARGI_DATAREFOBJ: /* Store operator only */ |
| 329 | |||
| 330 | /* | 328 | /* |
| 331 | * We don't want to resolve index_op reference objects during | 329 | * We don't want to resolve index_op reference objects during |
| 332 | * a store because this would be an implicit de_ref_of operation. | 330 | * a store because this would be an implicit de_ref_of operation. |
| @@ -343,7 +341,9 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 343 | break; | 341 | break; |
| 344 | 342 | ||
| 345 | default: | 343 | default: |
| 344 | |||
| 346 | /* All cases covered above */ | 345 | /* All cases covered above */ |
| 346 | |||
| 347 | break; | 347 | break; |
| 348 | } | 348 | } |
| 349 | 349 | ||
| @@ -433,7 +433,6 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 433 | goto next_operand; | 433 | goto next_operand; |
| 434 | 434 | ||
| 435 | case ARGI_BUFFER: | 435 | case ARGI_BUFFER: |
| 436 | |||
| 437 | /* | 436 | /* |
| 438 | * Need an operand of type ACPI_TYPE_BUFFER, | 437 | * Need an operand of type ACPI_TYPE_BUFFER, |
| 439 | * But we can implicitly convert from a STRING or INTEGER | 438 | * But we can implicitly convert from a STRING or INTEGER |
| @@ -459,7 +458,6 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 459 | goto next_operand; | 458 | goto next_operand; |
| 460 | 459 | ||
| 461 | case ARGI_STRING: | 460 | case ARGI_STRING: |
| 462 | |||
| 463 | /* | 461 | /* |
| 464 | * Need an operand of type ACPI_TYPE_STRING, | 462 | * Need an operand of type ACPI_TYPE_STRING, |
| 465 | * But we can implicitly convert from a BUFFER or INTEGER | 463 | * But we can implicitly convert from a BUFFER or INTEGER |
| @@ -562,6 +560,7 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 562 | break; | 560 | break; |
| 563 | 561 | ||
| 564 | default: | 562 | default: |
| 563 | |||
| 565 | ACPI_ERROR((AE_INFO, | 564 | ACPI_ERROR((AE_INFO, |
| 566 | "Needed [Buffer/String/Package/Reference], found [%s] %p", | 565 | "Needed [Buffer/String/Package/Reference], found [%s] %p", |
| 567 | acpi_ut_get_object_type_name | 566 | acpi_ut_get_object_type_name |
| @@ -584,6 +583,7 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 584 | break; | 583 | break; |
| 585 | 584 | ||
| 586 | default: | 585 | default: |
| 586 | |||
| 587 | ACPI_ERROR((AE_INFO, | 587 | ACPI_ERROR((AE_INFO, |
| 588 | "Needed [Buffer/String/Package], found [%s] %p", | 588 | "Needed [Buffer/String/Package], found [%s] %p", |
| 589 | acpi_ut_get_object_type_name | 589 | acpi_ut_get_object_type_name |
| @@ -605,6 +605,7 @@ acpi_ex_resolve_operands(u16 opcode, | |||
| 605 | break; | 605 | break; |
| 606 | 606 | ||
| 607 | default: | 607 | default: |
| 608 | |||
| 608 | ACPI_ERROR((AE_INFO, | 609 | ACPI_ERROR((AE_INFO, |
| 609 | "Needed [Region/Buffer], found [%s] %p", | 610 | "Needed [Region/Buffer], found [%s] %p", |
| 610 | acpi_ut_get_object_type_name | 611 | acpi_ut_get_object_type_name |
diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c index 93c6049c2d75..2bdba6f7d762 100644 --- a/drivers/acpi/acpica/exstore.c +++ b/drivers/acpi/acpica/exstore.c | |||
| @@ -114,6 +114,7 @@ acpi_ex_store(union acpi_operand_object *source_desc, | |||
| 114 | 114 | ||
| 115 | switch (dest_desc->common.type) { | 115 | switch (dest_desc->common.type) { |
| 116 | case ACPI_TYPE_LOCAL_REFERENCE: | 116 | case ACPI_TYPE_LOCAL_REFERENCE: |
| 117 | |||
| 117 | break; | 118 | break; |
| 118 | 119 | ||
| 119 | case ACPI_TYPE_INTEGER: | 120 | case ACPI_TYPE_INTEGER: |
| @@ -178,7 +179,6 @@ acpi_ex_store(union acpi_operand_object *source_desc, | |||
| 178 | break; | 179 | break; |
| 179 | 180 | ||
| 180 | case ACPI_REFCLASS_DEBUG: | 181 | case ACPI_REFCLASS_DEBUG: |
| 181 | |||
| 182 | /* | 182 | /* |
| 183 | * Storing to the Debug object causes the value stored to be | 183 | * Storing to the Debug object causes the value stored to be |
| 184 | * displayed and otherwise has no effect -- see ACPI Specification | 184 | * displayed and otherwise has no effect -- see ACPI Specification |
| @@ -291,7 +291,6 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, | |||
| 291 | break; | 291 | break; |
| 292 | 292 | ||
| 293 | case ACPI_TYPE_BUFFER_FIELD: | 293 | case ACPI_TYPE_BUFFER_FIELD: |
| 294 | |||
| 295 | /* | 294 | /* |
| 296 | * Store into a Buffer or String (not actually a real buffer_field) | 295 | * Store into a Buffer or String (not actually a real buffer_field) |
| 297 | * at a location defined by an Index. | 296 | * at a location defined by an Index. |
| @@ -447,7 +446,6 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | |||
| 447 | case ACPI_TYPE_INTEGER: | 446 | case ACPI_TYPE_INTEGER: |
| 448 | case ACPI_TYPE_STRING: | 447 | case ACPI_TYPE_STRING: |
| 449 | case ACPI_TYPE_BUFFER: | 448 | case ACPI_TYPE_BUFFER: |
| 450 | |||
| 451 | /* | 449 | /* |
| 452 | * These target types are all of type Integer/String/Buffer, and | 450 | * These target types are all of type Integer/String/Buffer, and |
| 453 | * therefore support implicit conversion before the store. | 451 | * therefore support implicit conversion before the store. |
diff --git a/drivers/acpi/acpica/exstoren.c b/drivers/acpi/acpica/exstoren.c index 1cefe777068e..20d809d90c5b 100644 --- a/drivers/acpi/acpica/exstoren.c +++ b/drivers/acpi/acpica/exstoren.c | |||
| @@ -85,11 +85,9 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr, | |||
| 85 | * These cases all require only Integers or values that | 85 | * These cases all require only Integers or values that |
| 86 | * can be converted to Integers (Strings or Buffers) | 86 | * can be converted to Integers (Strings or Buffers) |
| 87 | */ | 87 | */ |
| 88 | |||
| 89 | case ACPI_TYPE_INTEGER: | 88 | case ACPI_TYPE_INTEGER: |
| 90 | case ACPI_TYPE_STRING: | 89 | case ACPI_TYPE_STRING: |
| 91 | case ACPI_TYPE_BUFFER: | 90 | case ACPI_TYPE_BUFFER: |
| 92 | |||
| 93 | /* | 91 | /* |
| 94 | * Stores into a Field/Region or into a Integer/Buffer/String | 92 | * Stores into a Field/Region or into a Integer/Buffer/String |
| 95 | * are all essentially the same. This case handles the | 93 | * are all essentially the same. This case handles the |
| @@ -133,7 +131,6 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr, | |||
| 133 | 131 | ||
| 134 | case ACPI_TYPE_LOCAL_ALIAS: | 132 | case ACPI_TYPE_LOCAL_ALIAS: |
| 135 | case ACPI_TYPE_LOCAL_METHOD_ALIAS: | 133 | case ACPI_TYPE_LOCAL_METHOD_ALIAS: |
| 136 | |||
| 137 | /* | 134 | /* |
| 138 | * All aliases should have been resolved earlier, during the | 135 | * All aliases should have been resolved earlier, during the |
| 139 | * operand resolution phase. | 136 | * operand resolution phase. |
| @@ -144,7 +141,6 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr, | |||
| 144 | 141 | ||
| 145 | case ACPI_TYPE_PACKAGE: | 142 | case ACPI_TYPE_PACKAGE: |
| 146 | default: | 143 | default: |
| 147 | |||
| 148 | /* | 144 | /* |
| 149 | * All other types than Alias and the various Fields come here, | 145 | * All other types than Alias and the various Fields come here, |
| 150 | * including the untyped case - ACPI_TYPE_ANY. | 146 | * including the untyped case - ACPI_TYPE_ANY. |
diff --git a/drivers/acpi/acpica/hwacpi.c b/drivers/acpi/acpica/hwacpi.c index 579c3a53ac87..3d36df828f52 100644 --- a/drivers/acpi/acpica/hwacpi.c +++ b/drivers/acpi/acpica/hwacpi.c | |||
| @@ -108,7 +108,6 @@ acpi_status acpi_hw_set_mode(u32 mode) | |||
| 108 | break; | 108 | break; |
| 109 | 109 | ||
| 110 | case ACPI_SYS_MODE_LEGACY: | 110 | case ACPI_SYS_MODE_LEGACY: |
| 111 | |||
| 112 | /* | 111 | /* |
| 113 | * BIOS should clear all fixed status bits and restore fixed event | 112 | * BIOS should clear all fixed status bits and restore fixed event |
| 114 | * enable bits to default | 113 | * enable bits to default |
| @@ -120,6 +119,7 @@ acpi_status acpi_hw_set_mode(u32 mode) | |||
| 120 | break; | 119 | break; |
| 121 | 120 | ||
| 122 | default: | 121 | default: |
| 122 | |||
| 123 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 123 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 124 | } | 124 | } |
| 125 | 125 | ||
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c index 20d02e93c990..96540506058f 100644 --- a/drivers/acpi/acpica/hwgpe.c +++ b/drivers/acpi/acpica/hwgpe.c | |||
| @@ -127,14 +127,17 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) | |||
| 127 | /*lint -fallthrough */ | 127 | /*lint -fallthrough */ |
| 128 | 128 | ||
| 129 | case ACPI_GPE_ENABLE: | 129 | case ACPI_GPE_ENABLE: |
| 130 | |||
| 130 | ACPI_SET_BIT(enable_mask, register_bit); | 131 | ACPI_SET_BIT(enable_mask, register_bit); |
| 131 | break; | 132 | break; |
| 132 | 133 | ||
| 133 | case ACPI_GPE_DISABLE: | 134 | case ACPI_GPE_DISABLE: |
| 135 | |||
| 134 | ACPI_CLEAR_BIT(enable_mask, register_bit); | 136 | ACPI_CLEAR_BIT(enable_mask, register_bit); |
| 135 | break; | 137 | break; |
| 136 | 138 | ||
| 137 | default: | 139 | default: |
| 140 | |||
| 138 | ACPI_ERROR((AE_INFO, "Invalid GPE Action, %u", action)); | 141 | ACPI_ERROR((AE_INFO, "Invalid GPE Action, %u", action)); |
| 139 | return (AE_BAD_PARAMETER); | 142 | return (AE_BAD_PARAMETER); |
| 140 | } | 143 | } |
diff --git a/drivers/acpi/acpica/hwregs.c b/drivers/acpi/acpica/hwregs.c index 083d6551f0e2..8d2e866be15f 100644 --- a/drivers/acpi/acpica/hwregs.c +++ b/drivers/acpi/acpica/hwregs.c | |||
| @@ -419,6 +419,7 @@ acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value) | |||
| 419 | break; | 419 | break; |
| 420 | 420 | ||
| 421 | default: | 421 | default: |
| 422 | |||
| 422 | ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id)); | 423 | ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id)); |
| 423 | status = AE_BAD_PARAMETER; | 424 | status = AE_BAD_PARAMETER; |
| 424 | break; | 425 | break; |
| @@ -491,7 +492,6 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value) | |||
| 491 | break; | 492 | break; |
| 492 | 493 | ||
| 493 | case ACPI_REGISTER_PM1_CONTROL: /* PM1 A/B: 16-bit access each */ | 494 | case ACPI_REGISTER_PM1_CONTROL: /* PM1 A/B: 16-bit access each */ |
| 494 | |||
| 495 | /* | 495 | /* |
| 496 | * Perform a read first to preserve certain bits (per ACPI spec) | 496 | * Perform a read first to preserve certain bits (per ACPI spec) |
| 497 | * Note: This includes SCI_EN, we never want to change this bit | 497 | * Note: This includes SCI_EN, we never want to change this bit |
| @@ -520,7 +520,6 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value) | |||
| 520 | break; | 520 | break; |
| 521 | 521 | ||
| 522 | case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ | 522 | case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ |
| 523 | |||
| 524 | /* | 523 | /* |
| 525 | * For control registers, all reserved bits must be preserved, | 524 | * For control registers, all reserved bits must be preserved, |
| 526 | * as per the ACPI spec. | 525 | * as per the ACPI spec. |
| @@ -555,6 +554,7 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value) | |||
| 555 | break; | 554 | break; |
| 556 | 555 | ||
| 557 | default: | 556 | default: |
| 557 | |||
| 558 | ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id)); | 558 | ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id)); |
| 559 | status = AE_BAD_PARAMETER; | 559 | status = AE_BAD_PARAMETER; |
| 560 | break; | 560 | break; |
diff --git a/drivers/acpi/acpica/hwxface.c b/drivers/acpi/acpica/hwxface.c index 04c2e16f2c0a..5ee7a814cd92 100644 --- a/drivers/acpi/acpica/hwxface.c +++ b/drivers/acpi/acpica/hwxface.c | |||
| @@ -495,7 +495,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b) | |||
| 495 | * Evaluate the \_Sx namespace object containing the register values | 495 | * Evaluate the \_Sx namespace object containing the register values |
| 496 | * for this state | 496 | * for this state |
| 497 | */ | 497 | */ |
| 498 | info->pathname = | 498 | info->relative_pathname = |
| 499 | ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]); | 499 | ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]); |
| 500 | status = acpi_ns_evaluate(info); | 500 | status = acpi_ns_evaluate(info); |
| 501 | if (ACPI_FAILURE(status)) { | 501 | if (ACPI_FAILURE(status)) { |
| @@ -506,7 +506,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b) | |||
| 506 | 506 | ||
| 507 | if (!info->return_object) { | 507 | if (!info->return_object) { |
| 508 | ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]", | 508 | ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]", |
| 509 | info->pathname)); | 509 | info->relative_pathname)); |
| 510 | status = AE_AML_NO_RETURN_VALUE; | 510 | status = AE_AML_NO_RETURN_VALUE; |
| 511 | goto cleanup; | 511 | goto cleanup; |
| 512 | } | 512 | } |
| @@ -528,10 +528,12 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b) | |||
| 528 | elements = info->return_object->package.elements; | 528 | elements = info->return_object->package.elements; |
| 529 | switch (info->return_object->package.count) { | 529 | switch (info->return_object->package.count) { |
| 530 | case 0: | 530 | case 0: |
| 531 | |||
| 531 | status = AE_AML_PACKAGE_LIMIT; | 532 | status = AE_AML_PACKAGE_LIMIT; |
| 532 | break; | 533 | break; |
| 533 | 534 | ||
| 534 | case 1: | 535 | case 1: |
| 536 | |||
| 535 | if (elements[0]->common.type != ACPI_TYPE_INTEGER) { | 537 | if (elements[0]->common.type != ACPI_TYPE_INTEGER) { |
| 536 | status = AE_AML_OPERAND_TYPE; | 538 | status = AE_AML_OPERAND_TYPE; |
| 537 | break; | 539 | break; |
| @@ -545,6 +547,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b) | |||
| 545 | 547 | ||
| 546 | case 2: | 548 | case 2: |
| 547 | default: | 549 | default: |
| 550 | |||
| 548 | if ((elements[0]->common.type != ACPI_TYPE_INTEGER) || | 551 | if ((elements[0]->common.type != ACPI_TYPE_INTEGER) || |
| 549 | (elements[1]->common.type != ACPI_TYPE_INTEGER)) { | 552 | (elements[1]->common.type != ACPI_TYPE_INTEGER)) { |
| 550 | status = AE_AML_OPERAND_TYPE; | 553 | status = AE_AML_OPERAND_TYPE; |
| @@ -565,7 +568,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b) | |||
| 565 | if (ACPI_FAILURE(status)) { | 568 | if (ACPI_FAILURE(status)) { |
| 566 | ACPI_EXCEPTION((AE_INFO, status, | 569 | ACPI_EXCEPTION((AE_INFO, status, |
| 567 | "While evaluating Sleep State [%s]", | 570 | "While evaluating Sleep State [%s]", |
| 568 | info->pathname)); | 571 | info->relative_pathname)); |
| 569 | } | 572 | } |
| 570 | 573 | ||
| 571 | ACPI_FREE(info); | 574 | ACPI_FREE(info); |
diff --git a/drivers/acpi/acpica/hwxfsleep.c b/drivers/acpi/acpica/hwxfsleep.c index 35eebdac0f9d..f2e669db8b65 100644 --- a/drivers/acpi/acpica/hwxfsleep.c +++ b/drivers/acpi/acpica/hwxfsleep.c | |||
| @@ -240,12 +240,14 @@ static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id) | |||
| 240 | &acpi_sleep_dispatch[function_id]; | 240 | &acpi_sleep_dispatch[function_id]; |
| 241 | 241 | ||
| 242 | #if (!ACPI_REDUCED_HARDWARE) | 242 | #if (!ACPI_REDUCED_HARDWARE) |
| 243 | |||
| 244 | /* | 243 | /* |
| 245 | * If the Hardware Reduced flag is set (from the FADT), we must | 244 | * If the Hardware Reduced flag is set (from the FADT), we must |
| 246 | * use the extended sleep registers | 245 | * use the extended sleep registers (FADT). Note: As per the ACPI |
| 246 | * specification, these extended registers are to be used for HW-reduced | ||
| 247 | * platforms only. They are not general-purpose replacements for the | ||
| 248 | * legacy PM register sleep support. | ||
| 247 | */ | 249 | */ |
| 248 | if (acpi_gbl_reduced_hardware || acpi_gbl_FADT.sleep_control.address) { | 250 | if (acpi_gbl_reduced_hardware) { |
| 249 | status = sleep_functions->extended_function(sleep_state); | 251 | status = sleep_functions->extended_function(sleep_state); |
| 250 | } else { | 252 | } else { |
| 251 | /* Legacy sleep */ | 253 | /* Legacy sleep */ |
| @@ -314,20 +316,24 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state) | |||
| 314 | 316 | ||
| 315 | switch (sleep_state) { | 317 | switch (sleep_state) { |
| 316 | case ACPI_STATE_S0: | 318 | case ACPI_STATE_S0: |
| 319 | |||
| 317 | sst_value = ACPI_SST_WORKING; | 320 | sst_value = ACPI_SST_WORKING; |
| 318 | break; | 321 | break; |
| 319 | 322 | ||
| 320 | case ACPI_STATE_S1: | 323 | case ACPI_STATE_S1: |
| 321 | case ACPI_STATE_S2: | 324 | case ACPI_STATE_S2: |
| 322 | case ACPI_STATE_S3: | 325 | case ACPI_STATE_S3: |
| 326 | |||
| 323 | sst_value = ACPI_SST_SLEEPING; | 327 | sst_value = ACPI_SST_SLEEPING; |
| 324 | break; | 328 | break; |
| 325 | 329 | ||
| 326 | case ACPI_STATE_S4: | 330 | case ACPI_STATE_S4: |
| 331 | |||
| 327 | sst_value = ACPI_SST_SLEEP_CONTEXT; | 332 | sst_value = ACPI_SST_SLEEP_CONTEXT; |
| 328 | break; | 333 | break; |
| 329 | 334 | ||
| 330 | default: | 335 | default: |
| 336 | |||
| 331 | sst_value = ACPI_SST_INDICATOR_OFF; /* Default is off */ | 337 | sst_value = ACPI_SST_INDICATOR_OFF; /* Default is off */ |
| 332 | break; | 338 | break; |
| 333 | } | 339 | } |
diff --git a/drivers/acpi/acpica/nsaccess.c b/drivers/acpi/acpica/nsaccess.c index 8769cf83b044..c5316e5bd4ab 100644 --- a/drivers/acpi/acpica/nsaccess.c +++ b/drivers/acpi/acpica/nsaccess.c | |||
| @@ -151,6 +151,7 @@ acpi_status acpi_ns_root_initialize(void) | |||
| 151 | */ | 151 | */ |
| 152 | switch (init_val->type) { | 152 | switch (init_val->type) { |
| 153 | case ACPI_TYPE_METHOD: | 153 | case ACPI_TYPE_METHOD: |
| 154 | |||
| 154 | obj_desc->method.param_count = | 155 | obj_desc->method.param_count = |
| 155 | (u8) ACPI_TO_INTEGER(val); | 156 | (u8) ACPI_TO_INTEGER(val); |
| 156 | obj_desc->common.flags |= AOPOBJ_DATA_VALID; | 157 | obj_desc->common.flags |= AOPOBJ_DATA_VALID; |
diff --git a/drivers/acpi/acpica/nsarguments.c b/drivers/acpi/acpica/nsarguments.c new file mode 100644 index 000000000000..74b24c82707e --- /dev/null +++ b/drivers/acpi/acpica/nsarguments.c | |||
| @@ -0,0 +1,294 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * | ||
| 3 | * Module Name: nsarguments - Validation of args for ACPI predefined methods | ||
| 4 | * | ||
| 5 | *****************************************************************************/ | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Copyright (C) 2000 - 2013, Intel Corp. | ||
| 9 | * All rights reserved. | ||
| 10 | * | ||
| 11 | * Redistribution and use in source and binary forms, with or without | ||
| 12 | * modification, are permitted provided that the following conditions | ||
| 13 | * are met: | ||
| 14 | * 1. Redistributions of source code must retain the above copyright | ||
| 15 | * notice, this list of conditions, and the following disclaimer, | ||
| 16 | * without modification. | ||
| 17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
| 18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
| 19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
| 20 | * including a substantially similar Disclaimer requirement for further | ||
| 21 | * binary redistribution. | ||
| 22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
| 23 | * of any contributors may be used to endorse or promote products derived | ||
| 24 | * from this software without specific prior written permission. | ||
| 25 | * | ||
| 26 | * Alternatively, this software may be distributed under the terms of the | ||
| 27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
| 28 | * Software Foundation. | ||
| 29 | * | ||
| 30 | * NO WARRANTY | ||
| 31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
| 34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
| 40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 41 | * POSSIBILITY OF SUCH DAMAGES. | ||
| 42 | */ | ||
| 43 | |||
| 44 | #include <acpi/acpi.h> | ||
| 45 | #include "accommon.h" | ||
| 46 | #include "acnamesp.h" | ||
| 47 | #include "acpredef.h" | ||
| 48 | |||
| 49 | #define _COMPONENT ACPI_NAMESPACE | ||
| 50 | ACPI_MODULE_NAME("nsarguments") | ||
| 51 | |||
| 52 | /******************************************************************************* | ||
| 53 | * | ||
| 54 | * FUNCTION: acpi_ns_check_argument_types | ||
| 55 | * | ||
| 56 | * PARAMETERS: info - Method execution information block | ||
| 57 | * | ||
| 58 | * RETURN: None | ||
| 59 | * | ||
| 60 | * DESCRIPTION: Check the incoming argument count and all argument types | ||
| 61 | * against the argument type list for a predefined name. | ||
| 62 | * | ||
| 63 | ******************************************************************************/ | ||
| 64 | void acpi_ns_check_argument_types(struct acpi_evaluate_info *info) | ||
| 65 | { | ||
| 66 | u16 arg_type_list; | ||
| 67 | u8 arg_count; | ||
| 68 | u8 arg_type; | ||
| 69 | u8 user_arg_type; | ||
| 70 | u32 i; | ||
| 71 | |||
| 72 | /* If not a predefined name, cannot typecheck args */ | ||
| 73 | |||
| 74 | if (!info->predefined) { | ||
| 75 | return; | ||
| 76 | } | ||
| 77 | |||
| 78 | arg_type_list = info->predefined->info.argument_list; | ||
| 79 | arg_count = METHOD_GET_ARG_COUNT(arg_type_list); | ||
| 80 | |||
| 81 | /* Typecheck all arguments */ | ||
| 82 | |||
| 83 | for (i = 0; ((i < arg_count) && (i < info->param_count)); i++) { | ||
| 84 | arg_type = METHOD_GET_NEXT_TYPE(arg_type_list); | ||
| 85 | user_arg_type = info->parameters[i]->common.type; | ||
| 86 | |||
| 87 | if (user_arg_type != arg_type) { | ||
| 88 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, | ||
| 89 | ACPI_WARN_ALWAYS, | ||
| 90 | "Argument #%u type mismatch - " | ||
| 91 | "Found [%s], ACPI requires [%s]", | ||
| 92 | (i + 1), | ||
| 93 | acpi_ut_get_type_name | ||
| 94 | (user_arg_type), | ||
| 95 | acpi_ut_get_type_name(arg_type))); | ||
| 96 | } | ||
| 97 | } | ||
| 98 | } | ||
| 99 | |||
| 100 | /******************************************************************************* | ||
| 101 | * | ||
| 102 | * FUNCTION: acpi_ns_check_acpi_compliance | ||
| 103 | * | ||
| 104 | * PARAMETERS: pathname - Full pathname to the node (for error msgs) | ||
| 105 | * node - Namespace node for the method/object | ||
| 106 | * predefined - Pointer to entry in predefined name table | ||
| 107 | * | ||
| 108 | * RETURN: None | ||
| 109 | * | ||
| 110 | * DESCRIPTION: Check that the declared parameter count (in ASL/AML) for a | ||
| 111 | * predefined name is what is expected (matches what is defined in | ||
| 112 | * the ACPI specification for this predefined name.) | ||
| 113 | * | ||
| 114 | ******************************************************************************/ | ||
| 115 | |||
| 116 | void | ||
| 117 | acpi_ns_check_acpi_compliance(char *pathname, | ||
| 118 | struct acpi_namespace_node *node, | ||
| 119 | const union acpi_predefined_info *predefined) | ||
| 120 | { | ||
| 121 | u32 aml_param_count; | ||
| 122 | u32 required_param_count; | ||
| 123 | |||
| 124 | if (!predefined) { | ||
| 125 | return; | ||
| 126 | } | ||
| 127 | |||
| 128 | /* Get the ACPI-required arg count from the predefined info table */ | ||
| 129 | |||
| 130 | required_param_count = | ||
| 131 | METHOD_GET_ARG_COUNT(predefined->info.argument_list); | ||
| 132 | |||
| 133 | /* | ||
| 134 | * If this object is not a control method, we can check if the ACPI | ||
| 135 | * spec requires that it be a method. | ||
| 136 | */ | ||
| 137 | if (node->type != ACPI_TYPE_METHOD) { | ||
| 138 | if (required_param_count > 0) { | ||
| 139 | |||
| 140 | /* Object requires args, must be implemented as a method */ | ||
| 141 | |||
| 142 | ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname, | ||
| 143 | ACPI_WARN_ALWAYS, | ||
| 144 | "Object (%s) must be a control method with %u arguments", | ||
| 145 | acpi_ut_get_type_name(node-> | ||
| 146 | type), | ||
| 147 | required_param_count)); | ||
| 148 | } else if (!required_param_count | ||
| 149 | && !predefined->info.expected_btypes) { | ||
| 150 | |||
| 151 | /* Object requires no args and no return value, must be a method */ | ||
| 152 | |||
| 153 | ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname, | ||
| 154 | ACPI_WARN_ALWAYS, | ||
| 155 | "Object (%s) must be a control method " | ||
| 156 | "with no arguments and no return value", | ||
| 157 | acpi_ut_get_type_name(node-> | ||
| 158 | type))); | ||
| 159 | } | ||
| 160 | |||
| 161 | return; | ||
| 162 | } | ||
| 163 | |||
| 164 | /* | ||
| 165 | * This is a control method. | ||
| 166 | * Check that the ASL/AML-defined parameter count for this method | ||
| 167 | * matches the ACPI-required parameter count | ||
| 168 | * | ||
| 169 | * Some methods are allowed to have a "minimum" number of args (_SCP) | ||
| 170 | * because their definition in ACPI has changed over time. | ||
| 171 | * | ||
| 172 | * Note: These are BIOS errors in the declaration of the object | ||
| 173 | */ | ||
| 174 | aml_param_count = node->object->method.param_count; | ||
| 175 | |||
| 176 | if (aml_param_count < required_param_count) { | ||
| 177 | ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS, | ||
| 178 | "Insufficient arguments - " | ||
| 179 | "ASL declared %u, ACPI requires %u", | ||
| 180 | aml_param_count, | ||
| 181 | required_param_count)); | ||
| 182 | } else if ((aml_param_count > required_param_count) | ||
| 183 | && !(predefined->info. | ||
| 184 | argument_list & ARG_COUNT_IS_MINIMUM)) { | ||
| 185 | ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS, | ||
| 186 | "Excess arguments - " | ||
| 187 | "ASL declared %u, ACPI requires %u", | ||
| 188 | aml_param_count, | ||
| 189 | required_param_count)); | ||
| 190 | } | ||
| 191 | } | ||
| 192 | |||
| 193 | /******************************************************************************* | ||
| 194 | * | ||
| 195 | * FUNCTION: acpi_ns_check_argument_count | ||
| 196 | * | ||
| 197 | * PARAMETERS: pathname - Full pathname to the node (for error msgs) | ||
| 198 | * node - Namespace node for the method/object | ||
| 199 | * user_param_count - Number of args passed in by the caller | ||
| 200 | * predefined - Pointer to entry in predefined name table | ||
| 201 | * | ||
| 202 | * RETURN: None | ||
| 203 | * | ||
| 204 | * DESCRIPTION: Check that incoming argument count matches the declared | ||
| 205 | * parameter count (in the ASL/AML) for an object. | ||
| 206 | * | ||
| 207 | ******************************************************************************/ | ||
| 208 | |||
| 209 | void | ||
| 210 | acpi_ns_check_argument_count(char *pathname, | ||
| 211 | struct acpi_namespace_node *node, | ||
| 212 | u32 user_param_count, | ||
| 213 | const union acpi_predefined_info *predefined) | ||
| 214 | { | ||
| 215 | u32 aml_param_count; | ||
| 216 | u32 required_param_count; | ||
| 217 | |||
| 218 | if (!predefined) { | ||
| 219 | /* | ||
| 220 | * Not a predefined name. Check the incoming user argument count | ||
| 221 | * against the count that is specified in the method/object. | ||
| 222 | */ | ||
| 223 | if (node->type != ACPI_TYPE_METHOD) { | ||
| 224 | if (user_param_count) { | ||
| 225 | ACPI_INFO_PREDEFINED((AE_INFO, pathname, | ||
| 226 | ACPI_WARN_ALWAYS, | ||
| 227 | "%u arguments were passed to a non-method ACPI object (%s)", | ||
| 228 | user_param_count, | ||
| 229 | acpi_ut_get_type_name | ||
| 230 | (node->type))); | ||
| 231 | } | ||
| 232 | |||
| 233 | return; | ||
| 234 | } | ||
| 235 | |||
| 236 | /* | ||
| 237 | * This is a control method. Check the parameter count. | ||
| 238 | * We can only check the incoming argument count against the | ||
| 239 | * argument count declared for the method in the ASL/AML. | ||
| 240 | * | ||
| 241 | * Emit a message if too few or too many arguments have been passed | ||
| 242 | * by the caller. | ||
| 243 | * | ||
| 244 | * Note: Too many arguments will not cause the method to | ||
| 245 | * fail. However, the method will fail if there are too few | ||
| 246 | * arguments and the method attempts to use one of the missing ones. | ||
| 247 | */ | ||
| 248 | aml_param_count = node->object->method.param_count; | ||
| 249 | |||
| 250 | if (user_param_count < aml_param_count) { | ||
| 251 | ACPI_WARN_PREDEFINED((AE_INFO, pathname, | ||
| 252 | ACPI_WARN_ALWAYS, | ||
| 253 | "Insufficient arguments - " | ||
| 254 | "Caller passed %u, method requires %u", | ||
| 255 | user_param_count, | ||
| 256 | aml_param_count)); | ||
| 257 | } else if (user_param_count > aml_param_count) { | ||
| 258 | ACPI_INFO_PREDEFINED((AE_INFO, pathname, | ||
| 259 | ACPI_WARN_ALWAYS, | ||
| 260 | "Excess arguments - " | ||
| 261 | "Caller passed %u, method requires %u", | ||
| 262 | user_param_count, | ||
| 263 | aml_param_count)); | ||
| 264 | } | ||
| 265 | |||
| 266 | return; | ||
| 267 | } | ||
| 268 | |||
| 269 | /* | ||
| 270 | * This is a predefined name. Validate the user-supplied parameter | ||
| 271 | * count against the ACPI specification. We don't validate against | ||
| 272 | * the method itself because what is important here is that the | ||
| 273 | * caller is in conformance with the spec. (The arg count for the | ||
| 274 | * method was checked against the ACPI spec earlier.) | ||
| 275 | * | ||
| 276 | * Some methods are allowed to have a "minimum" number of args (_SCP) | ||
| 277 | * because their definition in ACPI has changed over time. | ||
| 278 | */ | ||
| 279 | required_param_count = | ||
| 280 | METHOD_GET_ARG_COUNT(predefined->info.argument_list); | ||
| 281 | |||
| 282 | if (user_param_count < required_param_count) { | ||
| 283 | ACPI_WARN_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS, | ||
| 284 | "Insufficient arguments - " | ||
| 285 | "Caller passed %u, ACPI requires %u", | ||
| 286 | user_param_count, required_param_count)); | ||
| 287 | } else if ((user_param_count > required_param_count) && | ||
| 288 | !(predefined->info.argument_list & ARG_COUNT_IS_MINIMUM)) { | ||
| 289 | ACPI_INFO_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS, | ||
| 290 | "Excess arguments - " | ||
| 291 | "Caller passed %u, ACPI requires %u", | ||
| 292 | user_param_count, required_param_count)); | ||
| 293 | } | ||
| 294 | } | ||
diff --git a/drivers/acpi/acpica/nsconvert.c b/drivers/acpi/acpica/nsconvert.c index 8f79a9d2d50e..acd2964c2690 100644 --- a/drivers/acpi/acpica/nsconvert.c +++ b/drivers/acpi/acpica/nsconvert.c | |||
| @@ -103,6 +103,7 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object, | |||
| 103 | break; | 103 | break; |
| 104 | 104 | ||
| 105 | default: | 105 | default: |
| 106 | |||
| 106 | return (AE_AML_OPERAND_TYPE); | 107 | return (AE_AML_OPERAND_TYPE); |
| 107 | } | 108 | } |
| 108 | 109 | ||
| @@ -191,6 +192,7 @@ acpi_ns_convert_to_string(union acpi_operand_object *original_object, | |||
| 191 | break; | 192 | break; |
| 192 | 193 | ||
| 193 | default: | 194 | default: |
| 195 | |||
| 194 | return (AE_AML_OPERAND_TYPE); | 196 | return (AE_AML_OPERAND_TYPE); |
| 195 | } | 197 | } |
| 196 | 198 | ||
| @@ -294,6 +296,7 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object, | |||
| 294 | break; | 296 | break; |
| 295 | 297 | ||
| 296 | default: | 298 | default: |
| 299 | |||
| 297 | return (AE_AML_OPERAND_TYPE); | 300 | return (AE_AML_OPERAND_TYPE); |
| 298 | } | 301 | } |
| 299 | 302 | ||
diff --git a/drivers/acpi/acpica/nsdump.c b/drivers/acpi/acpica/nsdump.c index ce6e97326205..7418c77fde8c 100644 --- a/drivers/acpi/acpica/nsdump.c +++ b/drivers/acpi/acpica/nsdump.c | |||
| @@ -244,10 +244,12 @@ acpi_ns_dump_one_object(acpi_handle obj_handle, | |||
| 244 | case ACPI_TYPE_BUFFER: | 244 | case ACPI_TYPE_BUFFER: |
| 245 | case ACPI_TYPE_STRING: | 245 | case ACPI_TYPE_STRING: |
| 246 | case ACPI_TYPE_METHOD: | 246 | case ACPI_TYPE_METHOD: |
| 247 | |||
| 247 | acpi_os_printf("<No attached object>"); | 248 | acpi_os_printf("<No attached object>"); |
| 248 | break; | 249 | break; |
| 249 | 250 | ||
| 250 | default: | 251 | default: |
| 252 | |||
| 251 | break; | 253 | break; |
| 252 | } | 254 | } |
| 253 | 255 | ||
| @@ -433,6 +435,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle, | |||
| 433 | break; | 435 | break; |
| 434 | 436 | ||
| 435 | default: | 437 | default: |
| 438 | |||
| 436 | break; | 439 | break; |
| 437 | } | 440 | } |
| 438 | break; | 441 | break; |
| @@ -567,32 +570,39 @@ acpi_ns_dump_one_object(acpi_handle obj_handle, | |||
| 567 | goto cleanup; | 570 | goto cleanup; |
| 568 | 571 | ||
| 569 | case ACPI_TYPE_BUFFER_FIELD: | 572 | case ACPI_TYPE_BUFFER_FIELD: |
| 573 | |||
| 570 | obj_desc = | 574 | obj_desc = |
| 571 | (union acpi_operand_object *)obj_desc->buffer_field. | 575 | (union acpi_operand_object *)obj_desc->buffer_field. |
| 572 | buffer_obj; | 576 | buffer_obj; |
| 573 | break; | 577 | break; |
| 574 | 578 | ||
| 575 | case ACPI_TYPE_PACKAGE: | 579 | case ACPI_TYPE_PACKAGE: |
| 580 | |||
| 576 | obj_desc = (void *)obj_desc->package.elements; | 581 | obj_desc = (void *)obj_desc->package.elements; |
| 577 | break; | 582 | break; |
| 578 | 583 | ||
| 579 | case ACPI_TYPE_METHOD: | 584 | case ACPI_TYPE_METHOD: |
| 585 | |||
| 580 | obj_desc = (void *)obj_desc->method.aml_start; | 586 | obj_desc = (void *)obj_desc->method.aml_start; |
| 581 | break; | 587 | break; |
| 582 | 588 | ||
| 583 | case ACPI_TYPE_LOCAL_REGION_FIELD: | 589 | case ACPI_TYPE_LOCAL_REGION_FIELD: |
| 590 | |||
| 584 | obj_desc = (void *)obj_desc->field.region_obj; | 591 | obj_desc = (void *)obj_desc->field.region_obj; |
| 585 | break; | 592 | break; |
| 586 | 593 | ||
| 587 | case ACPI_TYPE_LOCAL_BANK_FIELD: | 594 | case ACPI_TYPE_LOCAL_BANK_FIELD: |
| 595 | |||
| 588 | obj_desc = (void *)obj_desc->bank_field.region_obj; | 596 | obj_desc = (void *)obj_desc->bank_field.region_obj; |
| 589 | break; | 597 | break; |
| 590 | 598 | ||
| 591 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | 599 | case ACPI_TYPE_LOCAL_INDEX_FIELD: |
| 600 | |||
| 592 | obj_desc = (void *)obj_desc->index_field.index_obj; | 601 | obj_desc = (void *)obj_desc->index_field.index_obj; |
| 593 | break; | 602 | break; |
| 594 | 603 | ||
| 595 | default: | 604 | default: |
| 605 | |||
| 596 | goto cleanup; | 606 | goto cleanup; |
| 597 | } | 607 | } |
| 598 | 608 | ||
diff --git a/drivers/acpi/acpica/nseval.c b/drivers/acpi/acpica/nseval.c index b61db69d5675..18108bc2e51c 100644 --- a/drivers/acpi/acpica/nseval.c +++ b/drivers/acpi/acpica/nseval.c | |||
| @@ -61,7 +61,7 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj, | |||
| 61 | * | 61 | * |
| 62 | * PARAMETERS: info - Evaluation info block, contains: | 62 | * PARAMETERS: info - Evaluation info block, contains: |
| 63 | * prefix_node - Prefix or Method/Object Node to execute | 63 | * prefix_node - Prefix or Method/Object Node to execute |
| 64 | * pathname - Name of method to execute, If NULL, the | 64 | * relative_path - Name of method to execute, If NULL, the |
| 65 | * Node is the object to execute | 65 | * Node is the object to execute |
| 66 | * parameters - List of parameters to pass to the method, | 66 | * parameters - List of parameters to pass to the method, |
| 67 | * terminated by NULL. Params itself may be | 67 | * terminated by NULL. Params itself may be |
| @@ -82,10 +82,9 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj, | |||
| 82 | * | 82 | * |
| 83 | ******************************************************************************/ | 83 | ******************************************************************************/ |
| 84 | 84 | ||
| 85 | acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) | 85 | acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info) |
| 86 | { | 86 | { |
| 87 | acpi_status status; | 87 | acpi_status status; |
| 88 | struct acpi_namespace_node *node; | ||
| 89 | 88 | ||
| 90 | ACPI_FUNCTION_TRACE(ns_evaluate); | 89 | ACPI_FUNCTION_TRACE(ns_evaluate); |
| 91 | 90 | ||
| @@ -93,83 +92,138 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) | |||
| 93 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 92 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 94 | } | 93 | } |
| 95 | 94 | ||
| 96 | /* Initialize the return value to an invalid object */ | 95 | if (!info->node) { |
| 97 | |||
| 98 | info->return_object = NULL; | ||
| 99 | info->param_count = 0; | ||
| 100 | |||
| 101 | if (!info->resolved_node) { | ||
| 102 | /* | 96 | /* |
| 103 | * Get the actual namespace node for the target object if we need to. | 97 | * Get the actual namespace node for the target object if we |
| 104 | * Handles these cases: | 98 | * need to. Handles these cases: |
| 105 | * | 99 | * |
| 106 | * 1) Null node, Pathname (absolute path) | 100 | * 1) Null node, valid pathname from root (absolute path) |
| 107 | * 2) Node, Pathname (path relative to Node) | 101 | * 2) Node and valid pathname (path relative to Node) |
| 108 | * 3) Node, Null Pathname | 102 | * 3) Node, Null pathname |
| 109 | */ | 103 | */ |
| 110 | status = acpi_ns_get_node(info->prefix_node, info->pathname, | 104 | status = |
| 111 | ACPI_NS_NO_UPSEARCH, | 105 | acpi_ns_get_node(info->prefix_node, info->relative_pathname, |
| 112 | &info->resolved_node); | 106 | ACPI_NS_NO_UPSEARCH, &info->node); |
| 113 | if (ACPI_FAILURE(status)) { | 107 | if (ACPI_FAILURE(status)) { |
| 114 | return_ACPI_STATUS(status); | 108 | return_ACPI_STATUS(status); |
| 115 | } | 109 | } |
| 116 | } | 110 | } |
| 117 | 111 | ||
| 118 | /* | 112 | /* |
| 119 | * For a method alias, we must grab the actual method node so that proper | 113 | * For a method alias, we must grab the actual method node so that |
| 120 | * scoping context will be established before execution. | 114 | * proper scoping context will be established before execution. |
| 121 | */ | 115 | */ |
| 122 | if (acpi_ns_get_type(info->resolved_node) == | 116 | if (acpi_ns_get_type(info->node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) { |
| 123 | ACPI_TYPE_LOCAL_METHOD_ALIAS) { | 117 | info->node = |
| 124 | info->resolved_node = | ||
| 125 | ACPI_CAST_PTR(struct acpi_namespace_node, | 118 | ACPI_CAST_PTR(struct acpi_namespace_node, |
| 126 | info->resolved_node->object); | 119 | info->node->object); |
| 120 | } | ||
| 121 | |||
| 122 | /* Complete the info block initialization */ | ||
| 123 | |||
| 124 | info->return_object = NULL; | ||
| 125 | info->node_flags = info->node->flags; | ||
| 126 | info->obj_desc = acpi_ns_get_attached_object(info->node); | ||
| 127 | |||
| 128 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "%s [%p] Value %p\n", | ||
| 129 | info->relative_pathname, info->node, | ||
| 130 | acpi_ns_get_attached_object(info->node))); | ||
| 131 | |||
| 132 | /* Get info if we have a predefined name (_HID, etc.) */ | ||
| 133 | |||
| 134 | info->predefined = | ||
| 135 | acpi_ut_match_predefined_method(info->node->name.ascii); | ||
| 136 | |||
| 137 | /* Get the full pathname to the object, for use in warning messages */ | ||
| 138 | |||
| 139 | info->full_pathname = acpi_ns_get_external_pathname(info->node); | ||
| 140 | if (!info->full_pathname) { | ||
| 141 | return_ACPI_STATUS(AE_NO_MEMORY); | ||
| 127 | } | 142 | } |
| 128 | 143 | ||
| 129 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "%s [%p] Value %p\n", info->pathname, | 144 | /* Count the number of arguments being passed in */ |
| 130 | info->resolved_node, | 145 | |
| 131 | acpi_ns_get_attached_object(info->resolved_node))); | 146 | info->param_count = 0; |
| 147 | if (info->parameters) { | ||
| 148 | while (info->parameters[info->param_count]) { | ||
| 149 | info->param_count++; | ||
| 150 | } | ||
| 151 | |||
| 152 | /* Warn on impossible argument count */ | ||
| 153 | |||
| 154 | if (info->param_count > ACPI_METHOD_NUM_ARGS) { | ||
| 155 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, | ||
| 156 | ACPI_WARN_ALWAYS, | ||
| 157 | "Excess arguments (%u) - using only %u", | ||
| 158 | info->param_count, | ||
| 159 | ACPI_METHOD_NUM_ARGS)); | ||
| 160 | |||
| 161 | info->param_count = ACPI_METHOD_NUM_ARGS; | ||
| 162 | } | ||
| 163 | } | ||
| 164 | |||
| 165 | /* | ||
| 166 | * For predefined names: Check that the declared argument count | ||
| 167 | * matches the ACPI spec -- otherwise this is a BIOS error. | ||
| 168 | */ | ||
| 169 | acpi_ns_check_acpi_compliance(info->full_pathname, info->node, | ||
| 170 | info->predefined); | ||
| 171 | |||
| 172 | /* | ||
| 173 | * For all names: Check that the incoming argument count for | ||
| 174 | * this method/object matches the actual ASL/AML definition. | ||
| 175 | */ | ||
| 176 | acpi_ns_check_argument_count(info->full_pathname, info->node, | ||
| 177 | info->param_count, info->predefined); | ||
| 132 | 178 | ||
| 133 | node = info->resolved_node; | 179 | /* For predefined names: Typecheck all incoming arguments */ |
| 180 | |||
| 181 | acpi_ns_check_argument_types(info); | ||
| 134 | 182 | ||
| 135 | /* | 183 | /* |
| 136 | * Two major cases here: | 184 | * Three major evaluation cases: |
| 137 | * | 185 | * |
| 138 | * 1) The object is a control method -- execute it | 186 | * 1) Object types that cannot be evaluated by definition |
| 139 | * 2) The object is not a method -- just return it's current value | 187 | * 2) The object is a control method -- execute it |
| 188 | * 3) The object is not a method -- just return it's current value | ||
| 140 | */ | 189 | */ |
| 141 | if (acpi_ns_get_type(info->resolved_node) == ACPI_TYPE_METHOD) { | 190 | switch (acpi_ns_get_type(info->node)) { |
| 191 | case ACPI_TYPE_DEVICE: | ||
| 192 | case ACPI_TYPE_EVENT: | ||
| 193 | case ACPI_TYPE_MUTEX: | ||
| 194 | case ACPI_TYPE_REGION: | ||
| 195 | case ACPI_TYPE_THERMAL: | ||
| 196 | case ACPI_TYPE_LOCAL_SCOPE: | ||
| 197 | /* | ||
| 198 | * 1) Disallow evaluation of certain object types. For these, | ||
| 199 | * object evaluation is undefined and not supported. | ||
| 200 | */ | ||
| 201 | ACPI_ERROR((AE_INFO, | ||
| 202 | "%s: Evaluation of object type [%s] is not supported", | ||
| 203 | info->full_pathname, | ||
| 204 | acpi_ut_get_type_name(info->node->type))); | ||
| 205 | |||
| 206 | status = AE_TYPE; | ||
| 207 | goto cleanup; | ||
| 208 | |||
| 209 | case ACPI_TYPE_METHOD: | ||
| 142 | /* | 210 | /* |
| 143 | * 1) Object is a control method - execute it | 211 | * 2) Object is a control method - execute it |
| 144 | */ | 212 | */ |
| 145 | 213 | ||
| 146 | /* Verify that there is a method object associated with this node */ | 214 | /* Verify that there is a method object associated with this node */ |
| 147 | 215 | ||
| 148 | info->obj_desc = | ||
| 149 | acpi_ns_get_attached_object(info->resolved_node); | ||
| 150 | if (!info->obj_desc) { | 216 | if (!info->obj_desc) { |
| 151 | ACPI_ERROR((AE_INFO, | 217 | ACPI_ERROR((AE_INFO, |
| 152 | "Control method has no attached sub-object")); | 218 | "%s: Method has no attached sub-object", |
| 153 | return_ACPI_STATUS(AE_NULL_OBJECT); | 219 | info->full_pathname)); |
| 220 | status = AE_NULL_OBJECT; | ||
| 221 | goto cleanup; | ||
| 154 | } | 222 | } |
| 155 | 223 | ||
| 156 | /* Count the number of arguments being passed to the method */ | ||
| 157 | |||
| 158 | if (info->parameters) { | ||
| 159 | while (info->parameters[info->param_count]) { | ||
| 160 | if (info->param_count > ACPI_METHOD_MAX_ARG) { | ||
| 161 | return_ACPI_STATUS(AE_LIMIT); | ||
| 162 | } | ||
| 163 | info->param_count++; | ||
| 164 | } | ||
| 165 | } | ||
| 166 | |||
| 167 | |||
| 168 | ACPI_DUMP_PATHNAME(info->resolved_node, "ACPI: Execute Method", | ||
| 169 | ACPI_LV_INFO, _COMPONENT); | ||
| 170 | |||
| 171 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | 224 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
| 172 | "Method at AML address %p Length %X\n", | 225 | "**** Execute method [%s] at AML address %p length %X\n", |
| 226 | info->full_pathname, | ||
| 173 | info->obj_desc->method.aml_start + 1, | 227 | info->obj_desc->method.aml_start + 1, |
| 174 | info->obj_desc->method.aml_length - 1)); | 228 | info->obj_desc->method.aml_length - 1)); |
| 175 | 229 | ||
| @@ -184,81 +238,61 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) | |||
| 184 | acpi_ex_enter_interpreter(); | 238 | acpi_ex_enter_interpreter(); |
| 185 | status = acpi_ps_execute_method(info); | 239 | status = acpi_ps_execute_method(info); |
| 186 | acpi_ex_exit_interpreter(); | 240 | acpi_ex_exit_interpreter(); |
| 187 | } else { | 241 | break; |
| 242 | |||
| 243 | default: | ||
| 188 | /* | 244 | /* |
| 189 | * 2) Object is not a method, return its current value | 245 | * 3) All other non-method objects -- get the current object value |
| 190 | * | ||
| 191 | * Disallow certain object types. For these, "evaluation" is undefined. | ||
| 192 | */ | 246 | */ |
| 193 | switch (info->resolved_node->type) { | ||
| 194 | case ACPI_TYPE_DEVICE: | ||
| 195 | case ACPI_TYPE_EVENT: | ||
| 196 | case ACPI_TYPE_MUTEX: | ||
| 197 | case ACPI_TYPE_REGION: | ||
| 198 | case ACPI_TYPE_THERMAL: | ||
| 199 | case ACPI_TYPE_LOCAL_SCOPE: | ||
| 200 | |||
| 201 | ACPI_ERROR((AE_INFO, | ||
| 202 | "[%4.4s] Evaluation of object type [%s] is not supported", | ||
| 203 | info->resolved_node->name.ascii, | ||
| 204 | acpi_ut_get_type_name(info->resolved_node-> | ||
| 205 | type))); | ||
| 206 | |||
| 207 | return_ACPI_STATUS(AE_TYPE); | ||
| 208 | |||
| 209 | default: | ||
| 210 | break; | ||
| 211 | } | ||
| 212 | 247 | ||
| 213 | /* | 248 | /* |
| 214 | * Objects require additional resolution steps (e.g., the Node may be | 249 | * Some objects require additional resolution steps (e.g., the Node |
| 215 | * a field that must be read, etc.) -- we can't just grab the object | 250 | * may be a field that must be read, etc.) -- we can't just grab |
| 216 | * out of the node. | 251 | * the object out of the node. |
| 217 | * | 252 | * |
| 218 | * Use resolve_node_to_value() to get the associated value. | 253 | * Use resolve_node_to_value() to get the associated value. |
| 219 | * | 254 | * |
| 220 | * NOTE: we can get away with passing in NULL for a walk state because | 255 | * NOTE: we can get away with passing in NULL for a walk state because |
| 221 | * resolved_node is guaranteed to not be a reference to either a method | 256 | * the Node is guaranteed to not be a reference to either a method |
| 222 | * local or a method argument (because this interface is never called | 257 | * local or a method argument (because this interface is never called |
| 223 | * from a running method.) | 258 | * from a running method.) |
| 224 | * | 259 | * |
| 225 | * Even though we do not directly invoke the interpreter for object | 260 | * Even though we do not directly invoke the interpreter for object |
| 226 | * resolution, we must lock it because we could access an opregion. | 261 | * resolution, we must lock it because we could access an op_region. |
| 227 | * The opregion access code assumes that the interpreter is locked. | 262 | * The op_region access code assumes that the interpreter is locked. |
| 228 | */ | 263 | */ |
| 229 | acpi_ex_enter_interpreter(); | 264 | acpi_ex_enter_interpreter(); |
| 230 | 265 | ||
| 231 | /* Function has a strange interface */ | 266 | /* TBD: resolve_node_to_value has a strange interface, fix */ |
| 267 | |||
| 268 | info->return_object = | ||
| 269 | ACPI_CAST_PTR(union acpi_operand_object, info->node); | ||
| 232 | 270 | ||
| 233 | status = | 271 | status = |
| 234 | acpi_ex_resolve_node_to_value(&info->resolved_node, NULL); | 272 | acpi_ex_resolve_node_to_value(ACPI_CAST_INDIRECT_PTR |
| 273 | (struct acpi_namespace_node, | ||
| 274 | &info->return_object), NULL); | ||
| 235 | acpi_ex_exit_interpreter(); | 275 | acpi_ex_exit_interpreter(); |
| 236 | 276 | ||
| 237 | /* | 277 | if (ACPI_FAILURE(status)) { |
| 238 | * If acpi_ex_resolve_node_to_value() succeeded, the return value was placed | 278 | goto cleanup; |
| 239 | * in resolved_node. | ||
| 240 | */ | ||
| 241 | if (ACPI_SUCCESS(status)) { | ||
| 242 | status = AE_CTRL_RETURN_VALUE; | ||
| 243 | info->return_object = | ||
| 244 | ACPI_CAST_PTR(union acpi_operand_object, | ||
| 245 | info->resolved_node); | ||
| 246 | |||
| 247 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, | ||
| 248 | "Returning object %p [%s]\n", | ||
| 249 | info->return_object, | ||
| 250 | acpi_ut_get_object_type_name(info-> | ||
| 251 | return_object))); | ||
| 252 | } | 279 | } |
| 280 | |||
| 281 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "Returned object %p [%s]\n", | ||
| 282 | info->return_object, | ||
| 283 | acpi_ut_get_object_type_name(info-> | ||
| 284 | return_object))); | ||
| 285 | |||
| 286 | status = AE_CTRL_RETURN_VALUE; /* Always has a "return value" */ | ||
| 287 | break; | ||
| 253 | } | 288 | } |
| 254 | 289 | ||
| 255 | /* | 290 | /* |
| 256 | * Check input argument count against the ASL-defined count for a method. | 291 | * For predefined names, check the return value against the ACPI |
| 257 | * Also check predefined names: argument count and return value against | 292 | * specification. Some incorrect return value types are repaired. |
| 258 | * the ACPI specification. Some incorrect return value types are repaired. | ||
| 259 | */ | 293 | */ |
| 260 | (void)acpi_ns_check_predefined_names(node, info->param_count, | 294 | (void)acpi_ns_check_return_value(info->node, info, info->param_count, |
| 261 | status, &info->return_object); | 295 | status, &info->return_object); |
| 262 | 296 | ||
| 263 | /* Check if there is a return value that must be dealt with */ | 297 | /* Check if there is a return value that must be dealt with */ |
| 264 | 298 | ||
| @@ -278,12 +312,15 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) | |||
| 278 | 312 | ||
| 279 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, | 313 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
| 280 | "*** Completed evaluation of object %s ***\n", | 314 | "*** Completed evaluation of object %s ***\n", |
| 281 | info->pathname)); | 315 | info->relative_pathname)); |
| 282 | 316 | ||
| 317 | cleanup: | ||
| 283 | /* | 318 | /* |
| 284 | * Namespace was unlocked by the handling acpi_ns* function, so we | 319 | * Namespace was unlocked by the handling acpi_ns* function, so we |
| 285 | * just return | 320 | * just free the pathname and return |
| 286 | */ | 321 | */ |
| 322 | ACPI_FREE(info->full_pathname); | ||
| 323 | info->full_pathname = NULL; | ||
| 287 | return_ACPI_STATUS(status); | 324 | return_ACPI_STATUS(status); |
| 288 | } | 325 | } |
| 289 | 326 | ||
diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c index 46f0f83417a1..dd2ceae3f717 100644 --- a/drivers/acpi/acpica/nsinit.c +++ b/drivers/acpi/acpica/nsinit.c | |||
| @@ -176,7 +176,7 @@ acpi_status acpi_ns_initialize_devices(void) | |||
| 176 | * part of the ACPI specification. | 176 | * part of the ACPI specification. |
| 177 | */ | 177 | */ |
| 178 | info.evaluate_info->prefix_node = acpi_gbl_root_node; | 178 | info.evaluate_info->prefix_node = acpi_gbl_root_node; |
| 179 | info.evaluate_info->pathname = METHOD_NAME__INI; | 179 | info.evaluate_info->relative_pathname = METHOD_NAME__INI; |
| 180 | info.evaluate_info->parameters = NULL; | 180 | info.evaluate_info->parameters = NULL; |
| 181 | info.evaluate_info->flags = ACPI_IGNORE_RETURN_VALUE; | 181 | info.evaluate_info->flags = ACPI_IGNORE_RETURN_VALUE; |
| 182 | 182 | ||
| @@ -266,28 +266,34 @@ acpi_ns_init_one_object(acpi_handle obj_handle, | |||
| 266 | 266 | ||
| 267 | switch (type) { | 267 | switch (type) { |
| 268 | case ACPI_TYPE_REGION: | 268 | case ACPI_TYPE_REGION: |
| 269 | |||
| 269 | info->op_region_count++; | 270 | info->op_region_count++; |
| 270 | break; | 271 | break; |
| 271 | 272 | ||
| 272 | case ACPI_TYPE_BUFFER_FIELD: | 273 | case ACPI_TYPE_BUFFER_FIELD: |
| 274 | |||
| 273 | info->field_count++; | 275 | info->field_count++; |
| 274 | break; | 276 | break; |
| 275 | 277 | ||
| 276 | case ACPI_TYPE_LOCAL_BANK_FIELD: | 278 | case ACPI_TYPE_LOCAL_BANK_FIELD: |
| 279 | |||
| 277 | info->field_count++; | 280 | info->field_count++; |
| 278 | break; | 281 | break; |
| 279 | 282 | ||
| 280 | case ACPI_TYPE_BUFFER: | 283 | case ACPI_TYPE_BUFFER: |
| 284 | |||
| 281 | info->buffer_count++; | 285 | info->buffer_count++; |
| 282 | break; | 286 | break; |
| 283 | 287 | ||
| 284 | case ACPI_TYPE_PACKAGE: | 288 | case ACPI_TYPE_PACKAGE: |
| 289 | |||
| 285 | info->package_count++; | 290 | info->package_count++; |
| 286 | break; | 291 | break; |
| 287 | 292 | ||
| 288 | default: | 293 | default: |
| 289 | 294 | ||
| 290 | /* No init required, just exit now */ | 295 | /* No init required, just exit now */ |
| 296 | |||
| 291 | return (AE_OK); | 297 | return (AE_OK); |
| 292 | } | 298 | } |
| 293 | 299 | ||
| @@ -337,7 +343,9 @@ acpi_ns_init_one_object(acpi_handle obj_handle, | |||
| 337 | break; | 343 | break; |
| 338 | 344 | ||
| 339 | default: | 345 | default: |
| 346 | |||
| 340 | /* No other types can get here */ | 347 | /* No other types can get here */ |
| 348 | |||
| 341 | break; | 349 | break; |
| 342 | } | 350 | } |
| 343 | 351 | ||
| @@ -416,6 +424,7 @@ acpi_ns_find_ini_methods(acpi_handle obj_handle, | |||
| 416 | break; | 424 | break; |
| 417 | 425 | ||
| 418 | default: | 426 | default: |
| 427 | |||
| 419 | break; | 428 | break; |
| 420 | } | 429 | } |
| 421 | 430 | ||
| @@ -560,7 +569,7 @@ acpi_ns_init_one_device(acpi_handle obj_handle, | |||
| 560 | 569 | ||
| 561 | ACPI_MEMSET(info, 0, sizeof(struct acpi_evaluate_info)); | 570 | ACPI_MEMSET(info, 0, sizeof(struct acpi_evaluate_info)); |
| 562 | info->prefix_node = device_node; | 571 | info->prefix_node = device_node; |
| 563 | info->pathname = METHOD_NAME__INI; | 572 | info->relative_pathname = METHOD_NAME__INI; |
| 564 | info->parameters = NULL; | 573 | info->parameters = NULL; |
| 565 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 574 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
| 566 | 575 | ||
| @@ -574,8 +583,7 @@ acpi_ns_init_one_device(acpi_handle obj_handle, | |||
| 574 | 583 | ||
| 575 | /* Ignore error and move on to next device */ | 584 | /* Ignore error and move on to next device */ |
| 576 | 585 | ||
| 577 | char *scope_name = | 586 | char *scope_name = acpi_ns_get_external_pathname(info->node); |
| 578 | acpi_ns_get_external_pathname(info->resolved_node); | ||
| 579 | 587 | ||
| 580 | ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution", | 588 | ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution", |
| 581 | scope_name)); | 589 | scope_name)); |
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index 8a52916148cb..24b71a01bf93 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c | |||
| @@ -61,28 +61,29 @@ ACPI_MODULE_NAME("nspredef") | |||
| 61 | * There are several areas that are validated: | 61 | * There are several areas that are validated: |
| 62 | * | 62 | * |
| 63 | * 1) The number of input arguments as defined by the method/object in the | 63 | * 1) The number of input arguments as defined by the method/object in the |
| 64 | * ASL is validated against the ACPI specification. | 64 | * ASL is validated against the ACPI specification. |
| 65 | * 2) The type of the return object (if any) is validated against the ACPI | 65 | * 2) The type of the return object (if any) is validated against the ACPI |
| 66 | * specification. | 66 | * specification. |
| 67 | * 3) For returned package objects, the count of package elements is | 67 | * 3) For returned package objects, the count of package elements is |
| 68 | * validated, as well as the type of each package element. Nested | 68 | * validated, as well as the type of each package element. Nested |
| 69 | * packages are supported. | 69 | * packages are supported. |
| 70 | * | 70 | * |
| 71 | * For any problems found, a warning message is issued. | 71 | * For any problems found, a warning message is issued. |
| 72 | * | 72 | * |
| 73 | ******************************************************************************/ | 73 | ******************************************************************************/ |
| 74 | /* Local prototypes */ | 74 | /* Local prototypes */ |
| 75 | static acpi_status | 75 | static acpi_status |
| 76 | acpi_ns_check_reference(struct acpi_predefined_data *data, | 76 | acpi_ns_check_reference(struct acpi_evaluate_info *info, |
| 77 | union acpi_operand_object *return_object); | 77 | union acpi_operand_object *return_object); |
| 78 | 78 | ||
| 79 | static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object); | 79 | static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object); |
| 80 | 80 | ||
| 81 | /******************************************************************************* | 81 | /******************************************************************************* |
| 82 | * | 82 | * |
| 83 | * FUNCTION: acpi_ns_check_predefined_names | 83 | * FUNCTION: acpi_ns_check_return_value |
| 84 | * | 84 | * |
| 85 | * PARAMETERS: node - Namespace node for the method/object | 85 | * PARAMETERS: node - Namespace node for the method/object |
| 86 | * info - Method execution information block | ||
| 86 | * user_param_count - Number of parameters actually passed | 87 | * user_param_count - Number of parameters actually passed |
| 87 | * return_status - Status from the object evaluation | 88 | * return_status - Status from the object evaluation |
| 88 | * return_object_ptr - Pointer to the object returned from the | 89 | * return_object_ptr - Pointer to the object returned from the |
| @@ -90,44 +91,25 @@ static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object); | |||
| 90 | * | 91 | * |
| 91 | * RETURN: Status | 92 | * RETURN: Status |
| 92 | * | 93 | * |
| 93 | * DESCRIPTION: Check an ACPI name for a match in the predefined name list. | 94 | * DESCRIPTION: Check the value returned from a predefined name. |
| 94 | * | 95 | * |
| 95 | ******************************************************************************/ | 96 | ******************************************************************************/ |
| 96 | 97 | ||
| 97 | acpi_status | 98 | acpi_status |
| 98 | acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | 99 | acpi_ns_check_return_value(struct acpi_namespace_node *node, |
| 99 | u32 user_param_count, | 100 | struct acpi_evaluate_info *info, |
| 100 | acpi_status return_status, | 101 | u32 user_param_count, |
| 101 | union acpi_operand_object **return_object_ptr) | 102 | acpi_status return_status, |
| 103 | union acpi_operand_object **return_object_ptr) | ||
| 102 | { | 104 | { |
| 103 | acpi_status status = AE_OK; | 105 | acpi_status status; |
| 104 | const union acpi_predefined_info *predefined; | 106 | const union acpi_predefined_info *predefined; |
| 105 | char *pathname; | ||
| 106 | struct acpi_predefined_data *data; | ||
| 107 | |||
| 108 | /* Match the name for this method/object against the predefined list */ | ||
| 109 | |||
| 110 | predefined = acpi_ut_match_predefined_method(node->name.ascii); | ||
| 111 | |||
| 112 | /* Get the full pathname to the object, for use in warning messages */ | ||
| 113 | |||
| 114 | pathname = acpi_ns_get_external_pathname(node); | ||
| 115 | if (!pathname) { | ||
| 116 | return (AE_OK); /* Could not get pathname, ignore */ | ||
| 117 | } | ||
| 118 | |||
| 119 | /* | ||
| 120 | * Check that the parameter count for this method matches the ASL | ||
| 121 | * definition. For predefined names, ensure that both the caller and | ||
| 122 | * the method itself are in accordance with the ACPI specification. | ||
| 123 | */ | ||
| 124 | acpi_ns_check_parameter_count(pathname, node, user_param_count, | ||
| 125 | predefined); | ||
| 126 | 107 | ||
| 127 | /* If not a predefined name, we cannot validate the return object */ | 108 | /* If not a predefined name, we cannot validate the return object */ |
| 128 | 109 | ||
| 110 | predefined = info->predefined; | ||
| 129 | if (!predefined) { | 111 | if (!predefined) { |
| 130 | goto cleanup; | 112 | return (AE_OK); |
| 131 | } | 113 | } |
| 132 | 114 | ||
| 133 | /* | 115 | /* |
| @@ -135,7 +117,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
| 135 | * validate the return object | 117 | * validate the return object |
| 136 | */ | 118 | */ |
| 137 | if ((return_status != AE_OK) && (return_status != AE_CTRL_RETURN_VALUE)) { | 119 | if ((return_status != AE_OK) && (return_status != AE_CTRL_RETURN_VALUE)) { |
| 138 | goto cleanup; | 120 | return (AE_OK); |
| 139 | } | 121 | } |
| 140 | 122 | ||
| 141 | /* | 123 | /* |
| @@ -154,25 +136,14 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
| 154 | if (acpi_gbl_disable_auto_repair || | 136 | if (acpi_gbl_disable_auto_repair || |
| 155 | (!predefined->info.expected_btypes) || | 137 | (!predefined->info.expected_btypes) || |
| 156 | (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { | 138 | (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { |
| 157 | goto cleanup; | 139 | return (AE_OK); |
| 158 | } | ||
| 159 | |||
| 160 | /* Create the parameter data block for object validation */ | ||
| 161 | |||
| 162 | data = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_predefined_data)); | ||
| 163 | if (!data) { | ||
| 164 | goto cleanup; | ||
| 165 | } | 140 | } |
| 166 | data->predefined = predefined; | ||
| 167 | data->node = node; | ||
| 168 | data->node_flags = node->flags; | ||
| 169 | data->pathname = pathname; | ||
| 170 | 141 | ||
| 171 | /* | 142 | /* |
| 172 | * Check that the type of the main return object is what is expected | 143 | * Check that the type of the main return object is what is expected |
| 173 | * for this predefined name | 144 | * for this predefined name |
| 174 | */ | 145 | */ |
| 175 | status = acpi_ns_check_object_type(data, return_object_ptr, | 146 | status = acpi_ns_check_object_type(info, return_object_ptr, |
| 176 | predefined->info.expected_btypes, | 147 | predefined->info.expected_btypes, |
| 177 | ACPI_NOT_PACKAGE_ELEMENT); | 148 | ACPI_NOT_PACKAGE_ELEMENT); |
| 178 | if (ACPI_FAILURE(status)) { | 149 | if (ACPI_FAILURE(status)) { |
| @@ -184,10 +155,16 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
| 184 | * Note: Package may have been newly created by call above. | 155 | * Note: Package may have been newly created by call above. |
| 185 | */ | 156 | */ |
| 186 | if ((*return_object_ptr)->common.type == ACPI_TYPE_PACKAGE) { | 157 | if ((*return_object_ptr)->common.type == ACPI_TYPE_PACKAGE) { |
| 187 | data->parent_package = *return_object_ptr; | 158 | info->parent_package = *return_object_ptr; |
| 188 | status = acpi_ns_check_package(data, return_object_ptr); | 159 | status = acpi_ns_check_package(info, return_object_ptr); |
| 189 | if (ACPI_FAILURE(status)) { | 160 | if (ACPI_FAILURE(status)) { |
| 190 | goto exit; | 161 | |
| 162 | /* We might be able to fix some errors */ | ||
| 163 | |||
| 164 | if ((status != AE_AML_OPERAND_TYPE) && | ||
| 165 | (status != AE_AML_OPERAND_VALUE)) { | ||
| 166 | goto exit; | ||
| 167 | } | ||
| 191 | } | 168 | } |
| 192 | } | 169 | } |
| 193 | 170 | ||
| @@ -199,7 +176,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
| 199 | * performed on a per-name basis, i.e., the code is specific to | 176 | * performed on a per-name basis, i.e., the code is specific to |
| 200 | * particular predefined names. | 177 | * particular predefined names. |
| 201 | */ | 178 | */ |
| 202 | status = acpi_ns_complex_repairs(data, node, status, return_object_ptr); | 179 | status = acpi_ns_complex_repairs(info, node, status, return_object_ptr); |
| 203 | 180 | ||
| 204 | exit: | 181 | exit: |
| 205 | /* | 182 | /* |
| @@ -207,112 +184,18 @@ exit: | |||
| 207 | * or more objects, mark the parent node to suppress further warning | 184 | * or more objects, mark the parent node to suppress further warning |
| 208 | * messages during the next evaluation of the same method/object. | 185 | * messages during the next evaluation of the same method/object. |
| 209 | */ | 186 | */ |
| 210 | if (ACPI_FAILURE(status) || (data->flags & ACPI_OBJECT_REPAIRED)) { | 187 | if (ACPI_FAILURE(status) || (info->return_flags & ACPI_OBJECT_REPAIRED)) { |
| 211 | node->flags |= ANOBJ_EVALUATED; | 188 | node->flags |= ANOBJ_EVALUATED; |
| 212 | } | 189 | } |
| 213 | ACPI_FREE(data); | ||
| 214 | 190 | ||
| 215 | cleanup: | ||
| 216 | ACPI_FREE(pathname); | ||
| 217 | return (status); | 191 | return (status); |
| 218 | } | 192 | } |
| 219 | 193 | ||
| 220 | /******************************************************************************* | 194 | /******************************************************************************* |
| 221 | * | 195 | * |
| 222 | * FUNCTION: acpi_ns_check_parameter_count | ||
| 223 | * | ||
| 224 | * PARAMETERS: pathname - Full pathname to the node (for error msgs) | ||
| 225 | * node - Namespace node for the method/object | ||
| 226 | * user_param_count - Number of args passed in by the caller | ||
| 227 | * predefined - Pointer to entry in predefined name table | ||
| 228 | * | ||
| 229 | * RETURN: None | ||
| 230 | * | ||
| 231 | * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a | ||
| 232 | * predefined name is what is expected (i.e., what is defined in | ||
| 233 | * the ACPI specification for this predefined name.) | ||
| 234 | * | ||
| 235 | ******************************************************************************/ | ||
| 236 | |||
| 237 | void | ||
| 238 | acpi_ns_check_parameter_count(char *pathname, | ||
| 239 | struct acpi_namespace_node *node, | ||
| 240 | u32 user_param_count, | ||
| 241 | const union acpi_predefined_info *predefined) | ||
| 242 | { | ||
| 243 | u32 param_count; | ||
| 244 | u32 required_params_current; | ||
| 245 | u32 required_params_old; | ||
| 246 | |||
| 247 | /* Methods have 0-7 parameters. All other types have zero. */ | ||
| 248 | |||
| 249 | param_count = 0; | ||
| 250 | if (node->type == ACPI_TYPE_METHOD) { | ||
| 251 | param_count = node->object->method.param_count; | ||
| 252 | } | ||
| 253 | |||
| 254 | if (!predefined) { | ||
| 255 | /* | ||
| 256 | * Check the parameter count for non-predefined methods/objects. | ||
| 257 | * | ||
| 258 | * Warning if too few or too many arguments have been passed by the | ||
| 259 | * caller. An incorrect number of arguments may not cause the method | ||
| 260 | * to fail. However, the method will fail if there are too few | ||
| 261 | * arguments and the method attempts to use one of the missing ones. | ||
| 262 | */ | ||
| 263 | if (user_param_count < param_count) { | ||
| 264 | ACPI_WARN_PREDEFINED((AE_INFO, pathname, | ||
| 265 | ACPI_WARN_ALWAYS, | ||
| 266 | "Insufficient arguments - needs %u, found %u", | ||
| 267 | param_count, user_param_count)); | ||
| 268 | } else if (user_param_count > param_count) { | ||
| 269 | ACPI_WARN_PREDEFINED((AE_INFO, pathname, | ||
| 270 | ACPI_WARN_ALWAYS, | ||
| 271 | "Excess arguments - needs %u, found %u", | ||
| 272 | param_count, user_param_count)); | ||
| 273 | } | ||
| 274 | return; | ||
| 275 | } | ||
| 276 | |||
| 277 | /* | ||
| 278 | * Validate the user-supplied parameter count. | ||
| 279 | * Allow two different legal argument counts (_SCP, etc.) | ||
| 280 | */ | ||
| 281 | required_params_current = | ||
| 282 | predefined->info.argument_list & METHOD_ARG_MASK; | ||
| 283 | required_params_old = | ||
| 284 | predefined->info.argument_list >> METHOD_ARG_BIT_WIDTH; | ||
| 285 | |||
| 286 | if (user_param_count != ACPI_UINT32_MAX) { | ||
| 287 | if ((user_param_count != required_params_current) && | ||
| 288 | (user_param_count != required_params_old)) { | ||
| 289 | ACPI_WARN_PREDEFINED((AE_INFO, pathname, | ||
| 290 | ACPI_WARN_ALWAYS, | ||
| 291 | "Parameter count mismatch - " | ||
| 292 | "caller passed %u, ACPI requires %u", | ||
| 293 | user_param_count, | ||
| 294 | required_params_current)); | ||
| 295 | } | ||
| 296 | } | ||
| 297 | |||
| 298 | /* | ||
| 299 | * Check that the ASL-defined parameter count is what is expected for | ||
| 300 | * this predefined name (parameter count as defined by the ACPI | ||
| 301 | * specification) | ||
| 302 | */ | ||
| 303 | if ((param_count != required_params_current) && | ||
| 304 | (param_count != required_params_old)) { | ||
| 305 | ACPI_WARN_PREDEFINED((AE_INFO, pathname, node->flags, | ||
| 306 | "Parameter count mismatch - ASL declared %u, ACPI requires %u", | ||
| 307 | param_count, required_params_current)); | ||
| 308 | } | ||
| 309 | } | ||
| 310 | |||
| 311 | /******************************************************************************* | ||
| 312 | * | ||
| 313 | * FUNCTION: acpi_ns_check_object_type | 196 | * FUNCTION: acpi_ns_check_object_type |
| 314 | * | 197 | * |
| 315 | * PARAMETERS: data - Pointer to validation data structure | 198 | * PARAMETERS: info - Method execution information block |
| 316 | * return_object_ptr - Pointer to the object returned from the | 199 | * return_object_ptr - Pointer to the object returned from the |
| 317 | * evaluation of a method or object | 200 | * evaluation of a method or object |
| 318 | * expected_btypes - Bitmap of expected return type(s) | 201 | * expected_btypes - Bitmap of expected return type(s) |
| @@ -328,7 +211,7 @@ acpi_ns_check_parameter_count(char *pathname, | |||
| 328 | ******************************************************************************/ | 211 | ******************************************************************************/ |
| 329 | 212 | ||
| 330 | acpi_status | 213 | acpi_status |
| 331 | acpi_ns_check_object_type(struct acpi_predefined_data *data, | 214 | acpi_ns_check_object_type(struct acpi_evaluate_info *info, |
| 332 | union acpi_operand_object **return_object_ptr, | 215 | union acpi_operand_object **return_object_ptr, |
| 333 | u32 expected_btypes, u32 package_index) | 216 | u32 expected_btypes, u32 package_index) |
| 334 | { | 217 | { |
| @@ -340,7 +223,8 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data, | |||
| 340 | 223 | ||
| 341 | if (return_object && | 224 | if (return_object && |
| 342 | ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) { | 225 | ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) { |
| 343 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 226 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 227 | info->node_flags, | ||
| 344 | "Invalid return type - Found a Namespace node [%4.4s] type %s", | 228 | "Invalid return type - Found a Namespace node [%4.4s] type %s", |
| 345 | return_object->node.name.ascii, | 229 | return_object->node.name.ascii, |
| 346 | acpi_ut_get_type_name(return_object->node. | 230 | acpi_ut_get_type_name(return_object->node. |
| @@ -356,8 +240,8 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data, | |||
| 356 | * from all of the predefined names (including elements of returned | 240 | * from all of the predefined names (including elements of returned |
| 357 | * packages) | 241 | * packages) |
| 358 | */ | 242 | */ |
| 359 | data->return_btype = acpi_ns_get_bitmapped_type(return_object); | 243 | info->return_btype = acpi_ns_get_bitmapped_type(return_object); |
| 360 | if (data->return_btype == ACPI_RTYPE_ANY) { | 244 | if (info->return_btype == ACPI_RTYPE_ANY) { |
| 361 | 245 | ||
| 362 | /* Not one of the supported objects, must be incorrect */ | 246 | /* Not one of the supported objects, must be incorrect */ |
| 363 | goto type_error_exit; | 247 | goto type_error_exit; |
| @@ -365,16 +249,18 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data, | |||
| 365 | 249 | ||
| 366 | /* For reference objects, check that the reference type is correct */ | 250 | /* For reference objects, check that the reference type is correct */ |
| 367 | 251 | ||
| 368 | if ((data->return_btype & expected_btypes) == ACPI_RTYPE_REFERENCE) { | 252 | if ((info->return_btype & expected_btypes) == ACPI_RTYPE_REFERENCE) { |
| 369 | status = acpi_ns_check_reference(data, return_object); | 253 | status = acpi_ns_check_reference(info, return_object); |
| 370 | return (status); | 254 | return (status); |
| 371 | } | 255 | } |
| 372 | 256 | ||
| 373 | /* Attempt simple repair of the returned object if necessary */ | 257 | /* Attempt simple repair of the returned object if necessary */ |
| 374 | 258 | ||
| 375 | status = acpi_ns_simple_repair(data, expected_btypes, | 259 | status = acpi_ns_simple_repair(info, expected_btypes, |
| 376 | package_index, return_object_ptr); | 260 | package_index, return_object_ptr); |
| 377 | return (status); | 261 | if (ACPI_SUCCESS(status)) { |
| 262 | return (AE_OK); /* Successful repair */ | ||
| 263 | } | ||
| 378 | 264 | ||
| 379 | type_error_exit: | 265 | type_error_exit: |
| 380 | 266 | ||
| @@ -383,12 +269,14 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data, | |||
| 383 | acpi_ut_get_expected_return_types(type_buffer, expected_btypes); | 269 | acpi_ut_get_expected_return_types(type_buffer, expected_btypes); |
| 384 | 270 | ||
| 385 | if (package_index == ACPI_NOT_PACKAGE_ELEMENT) { | 271 | if (package_index == ACPI_NOT_PACKAGE_ELEMENT) { |
| 386 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 272 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 273 | info->node_flags, | ||
| 387 | "Return type mismatch - found %s, expected %s", | 274 | "Return type mismatch - found %s, expected %s", |
| 388 | acpi_ut_get_object_type_name | 275 | acpi_ut_get_object_type_name |
| 389 | (return_object), type_buffer)); | 276 | (return_object), type_buffer)); |
| 390 | } else { | 277 | } else { |
| 391 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 278 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 279 | info->node_flags, | ||
| 392 | "Return Package type mismatch at index %u - " | 280 | "Return Package type mismatch at index %u - " |
| 393 | "found %s, expected %s", package_index, | 281 | "found %s, expected %s", package_index, |
| 394 | acpi_ut_get_object_type_name | 282 | acpi_ut_get_object_type_name |
| @@ -402,7 +290,7 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data, | |||
| 402 | * | 290 | * |
| 403 | * FUNCTION: acpi_ns_check_reference | 291 | * FUNCTION: acpi_ns_check_reference |
| 404 | * | 292 | * |
| 405 | * PARAMETERS: data - Pointer to validation data structure | 293 | * PARAMETERS: info - Method execution information block |
| 406 | * return_object - Object returned from the evaluation of a | 294 | * return_object - Object returned from the evaluation of a |
| 407 | * method or object | 295 | * method or object |
| 408 | * | 296 | * |
| @@ -415,7 +303,7 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data, | |||
| 415 | ******************************************************************************/ | 303 | ******************************************************************************/ |
| 416 | 304 | ||
| 417 | static acpi_status | 305 | static acpi_status |
| 418 | acpi_ns_check_reference(struct acpi_predefined_data *data, | 306 | acpi_ns_check_reference(struct acpi_evaluate_info *info, |
| 419 | union acpi_operand_object *return_object) | 307 | union acpi_operand_object *return_object) |
| 420 | { | 308 | { |
| 421 | 309 | ||
| @@ -428,7 +316,7 @@ acpi_ns_check_reference(struct acpi_predefined_data *data, | |||
| 428 | return (AE_OK); | 316 | return (AE_OK); |
| 429 | } | 317 | } |
| 430 | 318 | ||
| 431 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 319 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, info->node_flags, |
| 432 | "Return type mismatch - unexpected reference object type [%s] %2.2X", | 320 | "Return type mismatch - unexpected reference object type [%s] %2.2X", |
| 433 | acpi_ut_get_reference_name(return_object), | 321 | acpi_ut_get_reference_name(return_object), |
| 434 | return_object->reference.class)); | 322 | return_object->reference.class)); |
| @@ -462,26 +350,32 @@ static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object) | |||
| 462 | 350 | ||
| 463 | switch (return_object->common.type) { | 351 | switch (return_object->common.type) { |
| 464 | case ACPI_TYPE_INTEGER: | 352 | case ACPI_TYPE_INTEGER: |
| 353 | |||
| 465 | return_btype = ACPI_RTYPE_INTEGER; | 354 | return_btype = ACPI_RTYPE_INTEGER; |
| 466 | break; | 355 | break; |
| 467 | 356 | ||
| 468 | case ACPI_TYPE_BUFFER: | 357 | case ACPI_TYPE_BUFFER: |
| 358 | |||
| 469 | return_btype = ACPI_RTYPE_BUFFER; | 359 | return_btype = ACPI_RTYPE_BUFFER; |
| 470 | break; | 360 | break; |
| 471 | 361 | ||
| 472 | case ACPI_TYPE_STRING: | 362 | case ACPI_TYPE_STRING: |
| 363 | |||
| 473 | return_btype = ACPI_RTYPE_STRING; | 364 | return_btype = ACPI_RTYPE_STRING; |
| 474 | break; | 365 | break; |
| 475 | 366 | ||
| 476 | case ACPI_TYPE_PACKAGE: | 367 | case ACPI_TYPE_PACKAGE: |
| 368 | |||
| 477 | return_btype = ACPI_RTYPE_PACKAGE; | 369 | return_btype = ACPI_RTYPE_PACKAGE; |
| 478 | break; | 370 | break; |
| 479 | 371 | ||
| 480 | case ACPI_TYPE_LOCAL_REFERENCE: | 372 | case ACPI_TYPE_LOCAL_REFERENCE: |
| 373 | |||
| 481 | return_btype = ACPI_RTYPE_REFERENCE; | 374 | return_btype = ACPI_RTYPE_REFERENCE; |
| 482 | break; | 375 | break; |
| 483 | 376 | ||
| 484 | default: | 377 | default: |
| 378 | |||
| 485 | /* Not one of the supported objects, must be incorrect */ | 379 | /* Not one of the supported objects, must be incorrect */ |
| 486 | 380 | ||
| 487 | return_btype = ACPI_RTYPE_ANY; | 381 | return_btype = ACPI_RTYPE_ANY; |
diff --git a/drivers/acpi/acpica/nsprepkg.c b/drivers/acpi/acpica/nsprepkg.c index 77cdd539de16..6d55cef7916c 100644 --- a/drivers/acpi/acpica/nsprepkg.c +++ b/drivers/acpi/acpica/nsprepkg.c | |||
| @@ -51,12 +51,12 @@ ACPI_MODULE_NAME("nsprepkg") | |||
| 51 | 51 | ||
| 52 | /* Local prototypes */ | 52 | /* Local prototypes */ |
| 53 | static acpi_status | 53 | static acpi_status |
| 54 | acpi_ns_check_package_list(struct acpi_predefined_data *data, | 54 | acpi_ns_check_package_list(struct acpi_evaluate_info *info, |
| 55 | const union acpi_predefined_info *package, | 55 | const union acpi_predefined_info *package, |
| 56 | union acpi_operand_object **elements, u32 count); | 56 | union acpi_operand_object **elements, u32 count); |
| 57 | 57 | ||
| 58 | static acpi_status | 58 | static acpi_status |
| 59 | acpi_ns_check_package_elements(struct acpi_predefined_data *data, | 59 | acpi_ns_check_package_elements(struct acpi_evaluate_info *info, |
| 60 | union acpi_operand_object **elements, | 60 | union acpi_operand_object **elements, |
| 61 | u8 type1, | 61 | u8 type1, |
| 62 | u32 count1, | 62 | u32 count1, |
| @@ -66,7 +66,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data, | |||
| 66 | * | 66 | * |
| 67 | * FUNCTION: acpi_ns_check_package | 67 | * FUNCTION: acpi_ns_check_package |
| 68 | * | 68 | * |
| 69 | * PARAMETERS: data - Pointer to validation data structure | 69 | * PARAMETERS: info - Method execution information block |
| 70 | * return_object_ptr - Pointer to the object returned from the | 70 | * return_object_ptr - Pointer to the object returned from the |
| 71 | * evaluation of a method or object | 71 | * evaluation of a method or object |
| 72 | * | 72 | * |
| @@ -78,7 +78,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data, | |||
| 78 | ******************************************************************************/ | 78 | ******************************************************************************/ |
| 79 | 79 | ||
| 80 | acpi_status | 80 | acpi_status |
| 81 | acpi_ns_check_package(struct acpi_predefined_data *data, | 81 | acpi_ns_check_package(struct acpi_evaluate_info *info, |
| 82 | union acpi_operand_object **return_object_ptr) | 82 | union acpi_operand_object **return_object_ptr) |
| 83 | { | 83 | { |
| 84 | union acpi_operand_object *return_object = *return_object_ptr; | 84 | union acpi_operand_object *return_object = *return_object_ptr; |
| @@ -93,18 +93,18 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 93 | 93 | ||
| 94 | /* The package info for this name is in the next table entry */ | 94 | /* The package info for this name is in the next table entry */ |
| 95 | 95 | ||
| 96 | package = data->predefined + 1; | 96 | package = info->predefined + 1; |
| 97 | 97 | ||
| 98 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, | 98 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
| 99 | "%s Validating return Package of Type %X, Count %X\n", | 99 | "%s Validating return Package of Type %X, Count %X\n", |
| 100 | data->pathname, package->ret_info.type, | 100 | info->full_pathname, package->ret_info.type, |
| 101 | return_object->package.count)); | 101 | return_object->package.count)); |
| 102 | 102 | ||
| 103 | /* | 103 | /* |
| 104 | * For variable-length Packages, we can safely remove all embedded | 104 | * For variable-length Packages, we can safely remove all embedded |
| 105 | * and trailing NULL package elements | 105 | * and trailing NULL package elements |
| 106 | */ | 106 | */ |
| 107 | acpi_ns_remove_null_elements(data, package->ret_info.type, | 107 | acpi_ns_remove_null_elements(info, package->ret_info.type, |
| 108 | return_object); | 108 | return_object); |
| 109 | 109 | ||
| 110 | /* Extract package count and elements array */ | 110 | /* Extract package count and elements array */ |
| @@ -121,7 +121,8 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 121 | return (AE_OK); | 121 | return (AE_OK); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 124 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 125 | info->node_flags, | ||
| 125 | "Return Package has no elements (empty)")); | 126 | "Return Package has no elements (empty)")); |
| 126 | 127 | ||
| 127 | return (AE_AML_OPERAND_VALUE); | 128 | return (AE_AML_OPERAND_VALUE); |
| @@ -135,7 +136,6 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 135 | */ | 136 | */ |
| 136 | switch (package->ret_info.type) { | 137 | switch (package->ret_info.type) { |
| 137 | case ACPI_PTYPE1_FIXED: | 138 | case ACPI_PTYPE1_FIXED: |
| 138 | |||
| 139 | /* | 139 | /* |
| 140 | * The package count is fixed and there are no sub-packages | 140 | * The package count is fixed and there are no sub-packages |
| 141 | * | 141 | * |
| @@ -150,13 +150,13 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 150 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 150 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 151 | "%s: Return Package is larger than needed - " | 151 | "%s: Return Package is larger than needed - " |
| 152 | "found %u, expected %u\n", | 152 | "found %u, expected %u\n", |
| 153 | data->pathname, count, | 153 | info->full_pathname, count, |
| 154 | expected_count)); | 154 | expected_count)); |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | /* Validate all elements of the returned package */ | 157 | /* Validate all elements of the returned package */ |
| 158 | 158 | ||
| 159 | status = acpi_ns_check_package_elements(data, elements, | 159 | status = acpi_ns_check_package_elements(info, elements, |
| 160 | package->ret_info. | 160 | package->ret_info. |
| 161 | object_type1, | 161 | object_type1, |
| 162 | package->ret_info. | 162 | package->ret_info. |
| @@ -168,13 +168,12 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 168 | break; | 168 | break; |
| 169 | 169 | ||
| 170 | case ACPI_PTYPE1_VAR: | 170 | case ACPI_PTYPE1_VAR: |
| 171 | |||
| 172 | /* | 171 | /* |
| 173 | * The package count is variable, there are no sub-packages, and all | 172 | * The package count is variable, there are no sub-packages, and all |
| 174 | * elements must be of the same type | 173 | * elements must be of the same type |
| 175 | */ | 174 | */ |
| 176 | for (i = 0; i < count; i++) { | 175 | for (i = 0; i < count; i++) { |
| 177 | status = acpi_ns_check_object_type(data, elements, | 176 | status = acpi_ns_check_object_type(info, elements, |
| 178 | package->ret_info. | 177 | package->ret_info. |
| 179 | object_type1, i); | 178 | object_type1, i); |
| 180 | if (ACPI_FAILURE(status)) { | 179 | if (ACPI_FAILURE(status)) { |
| @@ -185,7 +184,6 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 185 | break; | 184 | break; |
| 186 | 185 | ||
| 187 | case ACPI_PTYPE1_OPTION: | 186 | case ACPI_PTYPE1_OPTION: |
| 188 | |||
| 189 | /* | 187 | /* |
| 190 | * The package count is variable, there are no sub-packages. There are | 188 | * The package count is variable, there are no sub-packages. There are |
| 191 | * a fixed number of required elements, and a variable number of | 189 | * a fixed number of required elements, and a variable number of |
| @@ -206,7 +204,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 206 | /* These are the required package elements (0, 1, or 2) */ | 204 | /* These are the required package elements (0, 1, or 2) */ |
| 207 | 205 | ||
| 208 | status = | 206 | status = |
| 209 | acpi_ns_check_object_type(data, elements, | 207 | acpi_ns_check_object_type(info, elements, |
| 210 | package-> | 208 | package-> |
| 211 | ret_info3. | 209 | ret_info3. |
| 212 | object_type[i], | 210 | object_type[i], |
| @@ -218,7 +216,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 218 | /* These are the optional package elements */ | 216 | /* These are the optional package elements */ |
| 219 | 217 | ||
| 220 | status = | 218 | status = |
| 221 | acpi_ns_check_object_type(data, elements, | 219 | acpi_ns_check_object_type(info, elements, |
| 222 | package-> | 220 | package-> |
| 223 | ret_info3. | 221 | ret_info3. |
| 224 | tail_object_type, | 222 | tail_object_type, |
| @@ -235,7 +233,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 235 | 233 | ||
| 236 | /* First element is the (Integer) revision */ | 234 | /* First element is the (Integer) revision */ |
| 237 | 235 | ||
| 238 | status = acpi_ns_check_object_type(data, elements, | 236 | status = acpi_ns_check_object_type(info, elements, |
| 239 | ACPI_RTYPE_INTEGER, 0); | 237 | ACPI_RTYPE_INTEGER, 0); |
| 240 | if (ACPI_FAILURE(status)) { | 238 | if (ACPI_FAILURE(status)) { |
| 241 | return (status); | 239 | return (status); |
| @@ -247,14 +245,14 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 247 | /* Examine the sub-packages */ | 245 | /* Examine the sub-packages */ |
| 248 | 246 | ||
| 249 | status = | 247 | status = |
| 250 | acpi_ns_check_package_list(data, package, elements, count); | 248 | acpi_ns_check_package_list(info, package, elements, count); |
| 251 | break; | 249 | break; |
| 252 | 250 | ||
| 253 | case ACPI_PTYPE2_PKG_COUNT: | 251 | case ACPI_PTYPE2_PKG_COUNT: |
| 254 | 252 | ||
| 255 | /* First element is the (Integer) count of sub-packages to follow */ | 253 | /* First element is the (Integer) count of sub-packages to follow */ |
| 256 | 254 | ||
| 257 | status = acpi_ns_check_object_type(data, elements, | 255 | status = acpi_ns_check_object_type(info, elements, |
| 258 | ACPI_RTYPE_INTEGER, 0); | 256 | ACPI_RTYPE_INTEGER, 0); |
| 259 | if (ACPI_FAILURE(status)) { | 257 | if (ACPI_FAILURE(status)) { |
| 260 | return (status); | 258 | return (status); |
| @@ -275,7 +273,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 275 | /* Examine the sub-packages */ | 273 | /* Examine the sub-packages */ |
| 276 | 274 | ||
| 277 | status = | 275 | status = |
| 278 | acpi_ns_check_package_list(data, package, elements, count); | 276 | acpi_ns_check_package_list(info, package, elements, count); |
| 279 | break; | 277 | break; |
| 280 | 278 | ||
| 281 | case ACPI_PTYPE2: | 279 | case ACPI_PTYPE2: |
| @@ -283,7 +281,6 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 283 | case ACPI_PTYPE2_MIN: | 281 | case ACPI_PTYPE2_MIN: |
| 284 | case ACPI_PTYPE2_COUNT: | 282 | case ACPI_PTYPE2_COUNT: |
| 285 | case ACPI_PTYPE2_FIX_VAR: | 283 | case ACPI_PTYPE2_FIX_VAR: |
| 286 | |||
| 287 | /* | 284 | /* |
| 288 | * These types all return a single Package that consists of a | 285 | * These types all return a single Package that consists of a |
| 289 | * variable number of sub-Packages. | 286 | * variable number of sub-Packages. |
| @@ -300,7 +297,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 300 | /* Create the new outer package and populate it */ | 297 | /* Create the new outer package and populate it */ |
| 301 | 298 | ||
| 302 | status = | 299 | status = |
| 303 | acpi_ns_wrap_with_package(data, return_object, | 300 | acpi_ns_wrap_with_package(info, return_object, |
| 304 | return_object_ptr); | 301 | return_object_ptr); |
| 305 | if (ACPI_FAILURE(status)) { | 302 | if (ACPI_FAILURE(status)) { |
| 306 | return (status); | 303 | return (status); |
| @@ -316,14 +313,15 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 316 | /* Examine the sub-packages */ | 313 | /* Examine the sub-packages */ |
| 317 | 314 | ||
| 318 | status = | 315 | status = |
| 319 | acpi_ns_check_package_list(data, package, elements, count); | 316 | acpi_ns_check_package_list(info, package, elements, count); |
| 320 | break; | 317 | break; |
| 321 | 318 | ||
| 322 | default: | 319 | default: |
| 323 | 320 | ||
| 324 | /* Should not get here if predefined info table is correct */ | 321 | /* Should not get here if predefined info table is correct */ |
| 325 | 322 | ||
| 326 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 323 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 324 | info->node_flags, | ||
| 327 | "Invalid internal return type in table entry: %X", | 325 | "Invalid internal return type in table entry: %X", |
| 328 | package->ret_info.type)); | 326 | package->ret_info.type)); |
| 329 | 327 | ||
| @@ -336,7 +334,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 336 | 334 | ||
| 337 | /* Error exit for the case with an incorrect package count */ | 335 | /* Error exit for the case with an incorrect package count */ |
| 338 | 336 | ||
| 339 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 337 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, info->node_flags, |
| 340 | "Return Package is too small - found %u elements, expected %u", | 338 | "Return Package is too small - found %u elements, expected %u", |
| 341 | count, expected_count)); | 339 | count, expected_count)); |
| 342 | 340 | ||
| @@ -347,7 +345,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 347 | * | 345 | * |
| 348 | * FUNCTION: acpi_ns_check_package_list | 346 | * FUNCTION: acpi_ns_check_package_list |
| 349 | * | 347 | * |
| 350 | * PARAMETERS: data - Pointer to validation data structure | 348 | * PARAMETERS: info - Method execution information block |
| 351 | * package - Pointer to package-specific info for method | 349 | * package - Pointer to package-specific info for method |
| 352 | * elements - Element list of parent package. All elements | 350 | * elements - Element list of parent package. All elements |
| 353 | * of this list should be of type Package. | 351 | * of this list should be of type Package. |
| @@ -360,7 +358,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
| 360 | ******************************************************************************/ | 358 | ******************************************************************************/ |
| 361 | 359 | ||
| 362 | static acpi_status | 360 | static acpi_status |
| 363 | acpi_ns_check_package_list(struct acpi_predefined_data *data, | 361 | acpi_ns_check_package_list(struct acpi_evaluate_info *info, |
| 364 | const union acpi_predefined_info *package, | 362 | const union acpi_predefined_info *package, |
| 365 | union acpi_operand_object **elements, u32 count) | 363 | union acpi_operand_object **elements, u32 count) |
| 366 | { | 364 | { |
| @@ -381,11 +379,11 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 381 | for (i = 0; i < count; i++) { | 379 | for (i = 0; i < count; i++) { |
| 382 | sub_package = *elements; | 380 | sub_package = *elements; |
| 383 | sub_elements = sub_package->package.elements; | 381 | sub_elements = sub_package->package.elements; |
| 384 | data->parent_package = sub_package; | 382 | info->parent_package = sub_package; |
| 385 | 383 | ||
| 386 | /* Each sub-object must be of type Package */ | 384 | /* Each sub-object must be of type Package */ |
| 387 | 385 | ||
| 388 | status = acpi_ns_check_object_type(data, &sub_package, | 386 | status = acpi_ns_check_object_type(info, &sub_package, |
| 389 | ACPI_RTYPE_PACKAGE, i); | 387 | ACPI_RTYPE_PACKAGE, i); |
| 390 | if (ACPI_FAILURE(status)) { | 388 | if (ACPI_FAILURE(status)) { |
| 391 | return (status); | 389 | return (status); |
| @@ -393,7 +391,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 393 | 391 | ||
| 394 | /* Examine the different types of expected sub-packages */ | 392 | /* Examine the different types of expected sub-packages */ |
| 395 | 393 | ||
| 396 | data->parent_package = sub_package; | 394 | info->parent_package = sub_package; |
| 397 | switch (package->ret_info.type) { | 395 | switch (package->ret_info.type) { |
| 398 | case ACPI_PTYPE2: | 396 | case ACPI_PTYPE2: |
| 399 | case ACPI_PTYPE2_PKG_COUNT: | 397 | case ACPI_PTYPE2_PKG_COUNT: |
| @@ -408,7 +406,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 408 | } | 406 | } |
| 409 | 407 | ||
| 410 | status = | 408 | status = |
| 411 | acpi_ns_check_package_elements(data, sub_elements, | 409 | acpi_ns_check_package_elements(info, sub_elements, |
| 412 | package->ret_info. | 410 | package->ret_info. |
| 413 | object_type1, | 411 | object_type1, |
| 414 | package->ret_info. | 412 | package->ret_info. |
| @@ -434,7 +432,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 434 | } | 432 | } |
| 435 | 433 | ||
| 436 | status = | 434 | status = |
| 437 | acpi_ns_check_package_elements(data, sub_elements, | 435 | acpi_ns_check_package_elements(info, sub_elements, |
| 438 | package->ret_info. | 436 | package->ret_info. |
| 439 | object_type1, | 437 | object_type1, |
| 440 | package->ret_info. | 438 | package->ret_info. |
| @@ -463,7 +461,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 463 | 461 | ||
| 464 | for (j = 0; j < expected_count; j++) { | 462 | for (j = 0; j < expected_count; j++) { |
| 465 | status = | 463 | status = |
| 466 | acpi_ns_check_object_type(data, | 464 | acpi_ns_check_object_type(info, |
| 467 | &sub_elements[j], | 465 | &sub_elements[j], |
| 468 | package-> | 466 | package-> |
| 469 | ret_info2. | 467 | ret_info2. |
| @@ -487,7 +485,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 487 | /* Check the type of each sub-package element */ | 485 | /* Check the type of each sub-package element */ |
| 488 | 486 | ||
| 489 | status = | 487 | status = |
| 490 | acpi_ns_check_package_elements(data, sub_elements, | 488 | acpi_ns_check_package_elements(info, sub_elements, |
| 491 | package->ret_info. | 489 | package->ret_info. |
| 492 | object_type1, | 490 | object_type1, |
| 493 | sub_package->package. | 491 | sub_package->package. |
| @@ -498,12 +496,11 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 498 | break; | 496 | break; |
| 499 | 497 | ||
| 500 | case ACPI_PTYPE2_COUNT: | 498 | case ACPI_PTYPE2_COUNT: |
| 501 | |||
| 502 | /* | 499 | /* |
| 503 | * First element is the (Integer) count of elements, including | 500 | * First element is the (Integer) count of elements, including |
| 504 | * the count field (the ACPI name is num_elements) | 501 | * the count field (the ACPI name is num_elements) |
| 505 | */ | 502 | */ |
| 506 | status = acpi_ns_check_object_type(data, sub_elements, | 503 | status = acpi_ns_check_object_type(info, sub_elements, |
| 507 | ACPI_RTYPE_INTEGER, | 504 | ACPI_RTYPE_INTEGER, |
| 508 | 0); | 505 | 0); |
| 509 | if (ACPI_FAILURE(status)) { | 506 | if (ACPI_FAILURE(status)) { |
| @@ -537,7 +534,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 537 | /* Check the type of each sub-package element */ | 534 | /* Check the type of each sub-package element */ |
| 538 | 535 | ||
| 539 | status = | 536 | status = |
| 540 | acpi_ns_check_package_elements(data, | 537 | acpi_ns_check_package_elements(info, |
| 541 | (sub_elements + 1), | 538 | (sub_elements + 1), |
| 542 | package->ret_info. | 539 | package->ret_info. |
| 543 | object_type1, | 540 | object_type1, |
| @@ -562,7 +559,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 562 | 559 | ||
| 563 | /* The sub-package count was smaller than required */ | 560 | /* The sub-package count was smaller than required */ |
| 564 | 561 | ||
| 565 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 562 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, info->node_flags, |
| 566 | "Return Sub-Package[%u] is too small - found %u elements, expected %u", | 563 | "Return Sub-Package[%u] is too small - found %u elements, expected %u", |
| 567 | i, sub_package->package.count, expected_count)); | 564 | i, sub_package->package.count, expected_count)); |
| 568 | 565 | ||
| @@ -573,7 +570,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 573 | * | 570 | * |
| 574 | * FUNCTION: acpi_ns_check_package_elements | 571 | * FUNCTION: acpi_ns_check_package_elements |
| 575 | * | 572 | * |
| 576 | * PARAMETERS: data - Pointer to validation data structure | 573 | * PARAMETERS: info - Method execution information block |
| 577 | * elements - Pointer to the package elements array | 574 | * elements - Pointer to the package elements array |
| 578 | * type1 - Object type for first group | 575 | * type1 - Object type for first group |
| 579 | * count1 - Count for first group | 576 | * count1 - Count for first group |
| @@ -589,7 +586,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data, | |||
| 589 | ******************************************************************************/ | 586 | ******************************************************************************/ |
| 590 | 587 | ||
| 591 | static acpi_status | 588 | static acpi_status |
| 592 | acpi_ns_check_package_elements(struct acpi_predefined_data *data, | 589 | acpi_ns_check_package_elements(struct acpi_evaluate_info *info, |
| 593 | union acpi_operand_object **elements, | 590 | union acpi_operand_object **elements, |
| 594 | u8 type1, | 591 | u8 type1, |
| 595 | u32 count1, | 592 | u32 count1, |
| @@ -605,7 +602,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data, | |||
| 605 | * The second group can have a count of zero. | 602 | * The second group can have a count of zero. |
| 606 | */ | 603 | */ |
| 607 | for (i = 0; i < count1; i++) { | 604 | for (i = 0; i < count1; i++) { |
| 608 | status = acpi_ns_check_object_type(data, this_element, | 605 | status = acpi_ns_check_object_type(info, this_element, |
| 609 | type1, i + start_index); | 606 | type1, i + start_index); |
| 610 | if (ACPI_FAILURE(status)) { | 607 | if (ACPI_FAILURE(status)) { |
| 611 | return (status); | 608 | return (status); |
| @@ -614,7 +611,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data, | |||
| 614 | } | 611 | } |
| 615 | 612 | ||
| 616 | for (i = 0; i < count2; i++) { | 613 | for (i = 0; i < count2; i++) { |
| 617 | status = acpi_ns_check_object_type(data, this_element, | 614 | status = acpi_ns_check_object_type(info, this_element, |
| 618 | type2, | 615 | type2, |
| 619 | (i + count1 + start_index)); | 616 | (i + count1 + start_index)); |
| 620 | if (ACPI_FAILURE(status)) { | 617 | if (ACPI_FAILURE(status)) { |
diff --git a/drivers/acpi/acpica/nsrepair.c b/drivers/acpi/acpica/nsrepair.c index 18f02e4ece01..f8e71ea60319 100644 --- a/drivers/acpi/acpica/nsrepair.c +++ b/drivers/acpi/acpica/nsrepair.c | |||
| @@ -130,7 +130,7 @@ static const struct acpi_simple_repair_info acpi_object_repair_info[] = { | |||
| 130 | * | 130 | * |
| 131 | * FUNCTION: acpi_ns_simple_repair | 131 | * FUNCTION: acpi_ns_simple_repair |
| 132 | * | 132 | * |
| 133 | * PARAMETERS: data - Pointer to validation data structure | 133 | * PARAMETERS: info - Method execution information block |
| 134 | * expected_btypes - Object types expected | 134 | * expected_btypes - Object types expected |
| 135 | * package_index - Index of object within parent package (if | 135 | * package_index - Index of object within parent package (if |
| 136 | * applicable - ACPI_NOT_PACKAGE_ELEMENT | 136 | * applicable - ACPI_NOT_PACKAGE_ELEMENT |
| @@ -146,7 +146,7 @@ static const struct acpi_simple_repair_info acpi_object_repair_info[] = { | |||
| 146 | ******************************************************************************/ | 146 | ******************************************************************************/ |
| 147 | 147 | ||
| 148 | acpi_status | 148 | acpi_status |
| 149 | acpi_ns_simple_repair(struct acpi_predefined_data *data, | 149 | acpi_ns_simple_repair(struct acpi_evaluate_info *info, |
| 150 | u32 expected_btypes, | 150 | u32 expected_btypes, |
| 151 | u32 package_index, | 151 | u32 package_index, |
| 152 | union acpi_operand_object **return_object_ptr) | 152 | union acpi_operand_object **return_object_ptr) |
| @@ -162,12 +162,12 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data, | |||
| 162 | * Special repairs for certain names that are in the repair table. | 162 | * Special repairs for certain names that are in the repair table. |
| 163 | * Check if this name is in the list of repairable names. | 163 | * Check if this name is in the list of repairable names. |
| 164 | */ | 164 | */ |
| 165 | predefined = acpi_ns_match_simple_repair(data->node, | 165 | predefined = acpi_ns_match_simple_repair(info->node, |
| 166 | data->return_btype, | 166 | info->return_btype, |
| 167 | package_index); | 167 | package_index); |
| 168 | if (predefined) { | 168 | if (predefined) { |
| 169 | if (!return_object) { | 169 | if (!return_object) { |
| 170 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, | 170 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 171 | ACPI_WARN_ALWAYS, | 171 | ACPI_WARN_ALWAYS, |
| 172 | "Missing expected return value")); | 172 | "Missing expected return value")); |
| 173 | } | 173 | } |
| @@ -191,7 +191,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data, | |||
| 191 | * Do not perform simple object repair unless the return type is not | 191 | * Do not perform simple object repair unless the return type is not |
| 192 | * expected. | 192 | * expected. |
| 193 | */ | 193 | */ |
| 194 | if (data->return_btype & expected_btypes) { | 194 | if (info->return_btype & expected_btypes) { |
| 195 | return (AE_OK); | 195 | return (AE_OK); |
| 196 | } | 196 | } |
| 197 | 197 | ||
| @@ -211,7 +211,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data, | |||
| 211 | */ | 211 | */ |
| 212 | if (!return_object) { | 212 | if (!return_object) { |
| 213 | if (expected_btypes && (!(expected_btypes & ACPI_RTYPE_NONE))) { | 213 | if (expected_btypes && (!(expected_btypes & ACPI_RTYPE_NONE))) { |
| 214 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, | 214 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 215 | ACPI_WARN_ALWAYS, | 215 | ACPI_WARN_ALWAYS, |
| 216 | "Missing expected return value")); | 216 | "Missing expected return value")); |
| 217 | 217 | ||
| @@ -247,14 +247,14 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data, | |||
| 247 | * for correct contents (expected object type or types). | 247 | * for correct contents (expected object type or types). |
| 248 | */ | 248 | */ |
| 249 | status = | 249 | status = |
| 250 | acpi_ns_wrap_with_package(data, return_object, &new_object); | 250 | acpi_ns_wrap_with_package(info, return_object, &new_object); |
| 251 | if (ACPI_SUCCESS(status)) { | 251 | if (ACPI_SUCCESS(status)) { |
| 252 | /* | 252 | /* |
| 253 | * The original object just had its reference count | 253 | * The original object just had its reference count |
| 254 | * incremented for being inserted into the new package. | 254 | * incremented for being inserted into the new package. |
| 255 | */ | 255 | */ |
| 256 | *return_object_ptr = new_object; /* New Package object */ | 256 | *return_object_ptr = new_object; /* New Package object */ |
| 257 | data->flags |= ACPI_OBJECT_REPAIRED; | 257 | info->return_flags |= ACPI_OBJECT_REPAIRED; |
| 258 | return (AE_OK); | 258 | return (AE_OK); |
| 259 | } | 259 | } |
| 260 | } | 260 | } |
| @@ -277,7 +277,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data, | |||
| 277 | * package object as part of the repair, we don't need to | 277 | * package object as part of the repair, we don't need to |
| 278 | * change the reference count. | 278 | * change the reference count. |
| 279 | */ | 279 | */ |
| 280 | if (!(data->flags & ACPI_OBJECT_WRAPPED)) { | 280 | if (!(info->return_flags & ACPI_OBJECT_WRAPPED)) { |
| 281 | new_object->common.reference_count = | 281 | new_object->common.reference_count = |
| 282 | return_object->common.reference_count; | 282 | return_object->common.reference_count; |
| 283 | 283 | ||
| @@ -288,14 +288,14 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data, | |||
| 288 | 288 | ||
| 289 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 289 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 290 | "%s: Converted %s to expected %s at Package index %u\n", | 290 | "%s: Converted %s to expected %s at Package index %u\n", |
| 291 | data->pathname, | 291 | info->full_pathname, |
| 292 | acpi_ut_get_object_type_name(return_object), | 292 | acpi_ut_get_object_type_name(return_object), |
| 293 | acpi_ut_get_object_type_name(new_object), | 293 | acpi_ut_get_object_type_name(new_object), |
| 294 | package_index)); | 294 | package_index)); |
| 295 | } else { | 295 | } else { |
| 296 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 296 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 297 | "%s: Converted %s to expected %s\n", | 297 | "%s: Converted %s to expected %s\n", |
| 298 | data->pathname, | 298 | info->full_pathname, |
| 299 | acpi_ut_get_object_type_name(return_object), | 299 | acpi_ut_get_object_type_name(return_object), |
| 300 | acpi_ut_get_object_type_name(new_object))); | 300 | acpi_ut_get_object_type_name(new_object))); |
| 301 | } | 301 | } |
| @@ -304,7 +304,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data, | |||
| 304 | 304 | ||
| 305 | acpi_ut_remove_reference(return_object); | 305 | acpi_ut_remove_reference(return_object); |
| 306 | *return_object_ptr = new_object; | 306 | *return_object_ptr = new_object; |
| 307 | data->flags |= ACPI_OBJECT_REPAIRED; | 307 | info->return_flags |= ACPI_OBJECT_REPAIRED; |
| 308 | return (AE_OK); | 308 | return (AE_OK); |
| 309 | } | 309 | } |
| 310 | 310 | ||
| @@ -359,7 +359,7 @@ static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct | |||
| 359 | * | 359 | * |
| 360 | * FUNCTION: acpi_ns_repair_null_element | 360 | * FUNCTION: acpi_ns_repair_null_element |
| 361 | * | 361 | * |
| 362 | * PARAMETERS: data - Pointer to validation data structure | 362 | * PARAMETERS: info - Method execution information block |
| 363 | * expected_btypes - Object types expected | 363 | * expected_btypes - Object types expected |
| 364 | * package_index - Index of object within parent package (if | 364 | * package_index - Index of object within parent package (if |
| 365 | * applicable - ACPI_NOT_PACKAGE_ELEMENT | 365 | * applicable - ACPI_NOT_PACKAGE_ELEMENT |
| @@ -374,7 +374,7 @@ static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct | |||
| 374 | ******************************************************************************/ | 374 | ******************************************************************************/ |
| 375 | 375 | ||
| 376 | acpi_status | 376 | acpi_status |
| 377 | acpi_ns_repair_null_element(struct acpi_predefined_data *data, | 377 | acpi_ns_repair_null_element(struct acpi_evaluate_info * info, |
| 378 | u32 expected_btypes, | 378 | u32 expected_btypes, |
| 379 | u32 package_index, | 379 | u32 package_index, |
| 380 | union acpi_operand_object **return_object_ptr) | 380 | union acpi_operand_object **return_object_ptr) |
| @@ -424,16 +424,16 @@ acpi_ns_repair_null_element(struct acpi_predefined_data *data, | |||
| 424 | /* Set the reference count according to the parent Package object */ | 424 | /* Set the reference count according to the parent Package object */ |
| 425 | 425 | ||
| 426 | new_object->common.reference_count = | 426 | new_object->common.reference_count = |
| 427 | data->parent_package->common.reference_count; | 427 | info->parent_package->common.reference_count; |
| 428 | 428 | ||
| 429 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 429 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 430 | "%s: Converted NULL package element to expected %s at index %u\n", | 430 | "%s: Converted NULL package element to expected %s at index %u\n", |
| 431 | data->pathname, | 431 | info->full_pathname, |
| 432 | acpi_ut_get_object_type_name(new_object), | 432 | acpi_ut_get_object_type_name(new_object), |
| 433 | package_index)); | 433 | package_index)); |
| 434 | 434 | ||
| 435 | *return_object_ptr = new_object; | 435 | *return_object_ptr = new_object; |
| 436 | data->flags |= ACPI_OBJECT_REPAIRED; | 436 | info->return_flags |= ACPI_OBJECT_REPAIRED; |
| 437 | return (AE_OK); | 437 | return (AE_OK); |
| 438 | } | 438 | } |
| 439 | 439 | ||
| @@ -441,7 +441,7 @@ acpi_ns_repair_null_element(struct acpi_predefined_data *data, | |||
| 441 | * | 441 | * |
| 442 | * FUNCTION: acpi_ns_remove_null_elements | 442 | * FUNCTION: acpi_ns_remove_null_elements |
| 443 | * | 443 | * |
| 444 | * PARAMETERS: data - Pointer to validation data structure | 444 | * PARAMETERS: info - Method execution information block |
| 445 | * package_type - An acpi_return_package_types value | 445 | * package_type - An acpi_return_package_types value |
| 446 | * obj_desc - A Package object | 446 | * obj_desc - A Package object |
| 447 | * | 447 | * |
| @@ -454,7 +454,7 @@ acpi_ns_repair_null_element(struct acpi_predefined_data *data, | |||
| 454 | *****************************************************************************/ | 454 | *****************************************************************************/ |
| 455 | 455 | ||
| 456 | void | 456 | void |
| 457 | acpi_ns_remove_null_elements(struct acpi_predefined_data *data, | 457 | acpi_ns_remove_null_elements(struct acpi_evaluate_info *info, |
| 458 | u8 package_type, | 458 | u8 package_type, |
| 459 | union acpi_operand_object *obj_desc) | 459 | union acpi_operand_object *obj_desc) |
| 460 | { | 460 | { |
| @@ -480,6 +480,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data, | |||
| 480 | case ACPI_PTYPE2_MIN: | 480 | case ACPI_PTYPE2_MIN: |
| 481 | case ACPI_PTYPE2_REV_FIXED: | 481 | case ACPI_PTYPE2_REV_FIXED: |
| 482 | case ACPI_PTYPE2_FIX_VAR: | 482 | case ACPI_PTYPE2_FIX_VAR: |
| 483 | |||
| 483 | break; | 484 | break; |
| 484 | 485 | ||
| 485 | default: | 486 | default: |
| @@ -511,7 +512,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data, | |||
| 511 | if (new_count < count) { | 512 | if (new_count < count) { |
| 512 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 513 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 513 | "%s: Found and removed %u NULL elements\n", | 514 | "%s: Found and removed %u NULL elements\n", |
| 514 | data->pathname, (count - new_count))); | 515 | info->full_pathname, (count - new_count))); |
| 515 | 516 | ||
| 516 | /* NULL terminate list and update the package count */ | 517 | /* NULL terminate list and update the package count */ |
| 517 | 518 | ||
| @@ -524,7 +525,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data, | |||
| 524 | * | 525 | * |
| 525 | * FUNCTION: acpi_ns_wrap_with_package | 526 | * FUNCTION: acpi_ns_wrap_with_package |
| 526 | * | 527 | * |
| 527 | * PARAMETERS: data - Pointer to validation data structure | 528 | * PARAMETERS: info - Method execution information block |
| 528 | * original_object - Pointer to the object to repair. | 529 | * original_object - Pointer to the object to repair. |
| 529 | * obj_desc_ptr - The new package object is returned here | 530 | * obj_desc_ptr - The new package object is returned here |
| 530 | * | 531 | * |
| @@ -545,7 +546,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data, | |||
| 545 | ******************************************************************************/ | 546 | ******************************************************************************/ |
| 546 | 547 | ||
| 547 | acpi_status | 548 | acpi_status |
| 548 | acpi_ns_wrap_with_package(struct acpi_predefined_data *data, | 549 | acpi_ns_wrap_with_package(struct acpi_evaluate_info *info, |
| 549 | union acpi_operand_object *original_object, | 550 | union acpi_operand_object *original_object, |
| 550 | union acpi_operand_object **obj_desc_ptr) | 551 | union acpi_operand_object **obj_desc_ptr) |
| 551 | { | 552 | { |
| @@ -566,12 +567,12 @@ acpi_ns_wrap_with_package(struct acpi_predefined_data *data, | |||
| 566 | 567 | ||
| 567 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 568 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 568 | "%s: Wrapped %s with expected Package object\n", | 569 | "%s: Wrapped %s with expected Package object\n", |
| 569 | data->pathname, | 570 | info->full_pathname, |
| 570 | acpi_ut_get_object_type_name(original_object))); | 571 | acpi_ut_get_object_type_name(original_object))); |
| 571 | 572 | ||
| 572 | /* Return the new object in the object pointer */ | 573 | /* Return the new object in the object pointer */ |
| 573 | 574 | ||
| 574 | *obj_desc_ptr = pkg_obj_desc; | 575 | *obj_desc_ptr = pkg_obj_desc; |
| 575 | data->flags |= ACPI_OBJECT_REPAIRED | ACPI_OBJECT_WRAPPED; | 576 | info->return_flags |= ACPI_OBJECT_REPAIRED | ACPI_OBJECT_WRAPPED; |
| 576 | return (AE_OK); | 577 | return (AE_OK); |
| 577 | } | 578 | } |
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c index 149e9b9c2c1b..c84603ee83ae 100644 --- a/drivers/acpi/acpica/nsrepair2.c +++ b/drivers/acpi/acpica/nsrepair2.c | |||
| @@ -54,7 +54,7 @@ ACPI_MODULE_NAME("nsrepair2") | |||
| 54 | * be repaired on a per-name basis. | 54 | * be repaired on a per-name basis. |
| 55 | */ | 55 | */ |
| 56 | typedef | 56 | typedef |
| 57 | acpi_status(*acpi_repair_function) (struct acpi_predefined_data *data, | 57 | acpi_status(*acpi_repair_function) (struct acpi_evaluate_info * info, |
| 58 | union acpi_operand_object | 58 | union acpi_operand_object |
| 59 | **return_object_ptr); | 59 | **return_object_ptr); |
| 60 | 60 | ||
| @@ -71,45 +71,57 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct | |||
| 71 | *node); | 71 | *node); |
| 72 | 72 | ||
| 73 | static acpi_status | 73 | static acpi_status |
| 74 | acpi_ns_repair_ALR(struct acpi_predefined_data *data, | 74 | acpi_ns_repair_ALR(struct acpi_evaluate_info *info, |
| 75 | union acpi_operand_object **return_object_ptr); | 75 | union acpi_operand_object **return_object_ptr); |
| 76 | 76 | ||
| 77 | static acpi_status | 77 | static acpi_status |
| 78 | acpi_ns_repair_CID(struct acpi_predefined_data *data, | 78 | acpi_ns_repair_CID(struct acpi_evaluate_info *info, |
| 79 | union acpi_operand_object **return_object_ptr); | 79 | union acpi_operand_object **return_object_ptr); |
| 80 | 80 | ||
| 81 | static acpi_status | 81 | static acpi_status |
| 82 | acpi_ns_repair_FDE(struct acpi_predefined_data *data, | 82 | acpi_ns_repair_CST(struct acpi_evaluate_info *info, |
| 83 | union acpi_operand_object **return_object_ptr); | 83 | union acpi_operand_object **return_object_ptr); |
| 84 | 84 | ||
| 85 | static acpi_status | 85 | static acpi_status |
| 86 | acpi_ns_repair_HID(struct acpi_predefined_data *data, | 86 | acpi_ns_repair_FDE(struct acpi_evaluate_info *info, |
| 87 | union acpi_operand_object **return_object_ptr); | 87 | union acpi_operand_object **return_object_ptr); |
| 88 | 88 | ||
| 89 | static acpi_status | 89 | static acpi_status |
| 90 | acpi_ns_repair_PSS(struct acpi_predefined_data *data, | 90 | acpi_ns_repair_HID(struct acpi_evaluate_info *info, |
| 91 | union acpi_operand_object **return_object_ptr); | 91 | union acpi_operand_object **return_object_ptr); |
| 92 | 92 | ||
| 93 | static acpi_status | 93 | static acpi_status |
| 94 | acpi_ns_repair_TSS(struct acpi_predefined_data *data, | 94 | acpi_ns_repair_PRT(struct acpi_evaluate_info *info, |
| 95 | union acpi_operand_object **return_object_ptr); | 95 | union acpi_operand_object **return_object_ptr); |
| 96 | 96 | ||
| 97 | static acpi_status | 97 | static acpi_status |
| 98 | acpi_ns_check_sorted_list(struct acpi_predefined_data *data, | 98 | acpi_ns_repair_PSS(struct acpi_evaluate_info *info, |
| 99 | union acpi_operand_object **return_object_ptr); | ||
| 100 | |||
| 101 | static acpi_status | ||
| 102 | acpi_ns_repair_TSS(struct acpi_evaluate_info *info, | ||
| 103 | union acpi_operand_object **return_object_ptr); | ||
| 104 | |||
| 105 | static acpi_status | ||
| 106 | acpi_ns_check_sorted_list(struct acpi_evaluate_info *info, | ||
| 99 | union acpi_operand_object *return_object, | 107 | union acpi_operand_object *return_object, |
| 108 | u32 start_index, | ||
| 100 | u32 expected_count, | 109 | u32 expected_count, |
| 101 | u32 sort_index, | 110 | u32 sort_index, |
| 102 | u8 sort_direction, char *sort_key_name); | 111 | u8 sort_direction, char *sort_key_name); |
| 103 | 112 | ||
| 104 | static void | ||
| 105 | acpi_ns_sort_list(union acpi_operand_object **elements, | ||
| 106 | u32 count, u32 index, u8 sort_direction); | ||
| 107 | |||
| 108 | /* Values for sort_direction above */ | 113 | /* Values for sort_direction above */ |
| 109 | 114 | ||
| 110 | #define ACPI_SORT_ASCENDING 0 | 115 | #define ACPI_SORT_ASCENDING 0 |
| 111 | #define ACPI_SORT_DESCENDING 1 | 116 | #define ACPI_SORT_DESCENDING 1 |
| 112 | 117 | ||
| 118 | static void | ||
| 119 | acpi_ns_remove_element(union acpi_operand_object *obj_desc, u32 index); | ||
| 120 | |||
| 121 | static void | ||
| 122 | acpi_ns_sort_list(union acpi_operand_object **elements, | ||
| 123 | u32 count, u32 index, u8 sort_direction); | ||
| 124 | |||
| 113 | /* | 125 | /* |
| 114 | * This table contains the names of the predefined methods for which we can | 126 | * This table contains the names of the predefined methods for which we can |
| 115 | * perform more complex repairs. | 127 | * perform more complex repairs. |
| @@ -118,9 +130,11 @@ acpi_ns_sort_list(union acpi_operand_object **elements, | |||
| 118 | * | 130 | * |
| 119 | * _ALR: Sort the list ascending by ambient_illuminance | 131 | * _ALR: Sort the list ascending by ambient_illuminance |
| 120 | * _CID: Strings: uppercase all, remove any leading asterisk | 132 | * _CID: Strings: uppercase all, remove any leading asterisk |
| 133 | * _CST: Sort the list ascending by C state type | ||
| 121 | * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs | 134 | * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs |
| 122 | * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs | 135 | * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs |
| 123 | * _HID: Strings: uppercase all, remove any leading asterisk | 136 | * _HID: Strings: uppercase all, remove any leading asterisk |
| 137 | * _PRT: Fix reversed source_name and source_index | ||
| 124 | * _PSS: Sort the list descending by Power | 138 | * _PSS: Sort the list descending by Power |
| 125 | * _TSS: Sort the list descending by Power | 139 | * _TSS: Sort the list descending by Power |
| 126 | * | 140 | * |
| @@ -134,9 +148,11 @@ acpi_ns_sort_list(union acpi_operand_object **elements, | |||
| 134 | static const struct acpi_repair_info acpi_ns_repairable_names[] = { | 148 | static const struct acpi_repair_info acpi_ns_repairable_names[] = { |
| 135 | {"_ALR", acpi_ns_repair_ALR}, | 149 | {"_ALR", acpi_ns_repair_ALR}, |
| 136 | {"_CID", acpi_ns_repair_CID}, | 150 | {"_CID", acpi_ns_repair_CID}, |
| 151 | {"_CST", acpi_ns_repair_CST}, | ||
| 137 | {"_FDE", acpi_ns_repair_FDE}, | 152 | {"_FDE", acpi_ns_repair_FDE}, |
| 138 | {"_GTM", acpi_ns_repair_FDE}, /* _GTM has same repair as _FDE */ | 153 | {"_GTM", acpi_ns_repair_FDE}, /* _GTM has same repair as _FDE */ |
| 139 | {"_HID", acpi_ns_repair_HID}, | 154 | {"_HID", acpi_ns_repair_HID}, |
| 155 | {"_PRT", acpi_ns_repair_PRT}, | ||
| 140 | {"_PSS", acpi_ns_repair_PSS}, | 156 | {"_PSS", acpi_ns_repair_PSS}, |
| 141 | {"_TSS", acpi_ns_repair_TSS}, | 157 | {"_TSS", acpi_ns_repair_TSS}, |
| 142 | {{0, 0, 0, 0}, NULL} /* Table terminator */ | 158 | {{0, 0, 0, 0}, NULL} /* Table terminator */ |
| @@ -150,7 +166,7 @@ static const struct acpi_repair_info acpi_ns_repairable_names[] = { | |||
| 150 | * | 166 | * |
| 151 | * FUNCTION: acpi_ns_complex_repairs | 167 | * FUNCTION: acpi_ns_complex_repairs |
| 152 | * | 168 | * |
| 153 | * PARAMETERS: data - Pointer to validation data structure | 169 | * PARAMETERS: info - Method execution information block |
| 154 | * node - Namespace node for the method/object | 170 | * node - Namespace node for the method/object |
| 155 | * validate_status - Original status of earlier validation | 171 | * validate_status - Original status of earlier validation |
| 156 | * return_object_ptr - Pointer to the object returned from the | 172 | * return_object_ptr - Pointer to the object returned from the |
| @@ -165,7 +181,7 @@ static const struct acpi_repair_info acpi_ns_repairable_names[] = { | |||
| 165 | *****************************************************************************/ | 181 | *****************************************************************************/ |
| 166 | 182 | ||
| 167 | acpi_status | 183 | acpi_status |
| 168 | acpi_ns_complex_repairs(struct acpi_predefined_data *data, | 184 | acpi_ns_complex_repairs(struct acpi_evaluate_info *info, |
| 169 | struct acpi_namespace_node *node, | 185 | struct acpi_namespace_node *node, |
| 170 | acpi_status validate_status, | 186 | acpi_status validate_status, |
| 171 | union acpi_operand_object **return_object_ptr) | 187 | union acpi_operand_object **return_object_ptr) |
| @@ -180,7 +196,7 @@ acpi_ns_complex_repairs(struct acpi_predefined_data *data, | |||
| 180 | return (validate_status); | 196 | return (validate_status); |
| 181 | } | 197 | } |
| 182 | 198 | ||
| 183 | status = predefined->repair_function(data, return_object_ptr); | 199 | status = predefined->repair_function(info, return_object_ptr); |
| 184 | return (status); | 200 | return (status); |
| 185 | } | 201 | } |
| 186 | 202 | ||
| @@ -219,7 +235,7 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct | |||
| 219 | * | 235 | * |
| 220 | * FUNCTION: acpi_ns_repair_ALR | 236 | * FUNCTION: acpi_ns_repair_ALR |
| 221 | * | 237 | * |
| 222 | * PARAMETERS: data - Pointer to validation data structure | 238 | * PARAMETERS: info - Method execution information block |
| 223 | * return_object_ptr - Pointer to the object returned from the | 239 | * return_object_ptr - Pointer to the object returned from the |
| 224 | * evaluation of a method or object | 240 | * evaluation of a method or object |
| 225 | * | 241 | * |
| @@ -231,13 +247,13 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct | |||
| 231 | *****************************************************************************/ | 247 | *****************************************************************************/ |
| 232 | 248 | ||
| 233 | static acpi_status | 249 | static acpi_status |
| 234 | acpi_ns_repair_ALR(struct acpi_predefined_data *data, | 250 | acpi_ns_repair_ALR(struct acpi_evaluate_info *info, |
| 235 | union acpi_operand_object **return_object_ptr) | 251 | union acpi_operand_object **return_object_ptr) |
| 236 | { | 252 | { |
| 237 | union acpi_operand_object *return_object = *return_object_ptr; | 253 | union acpi_operand_object *return_object = *return_object_ptr; |
| 238 | acpi_status status; | 254 | acpi_status status; |
| 239 | 255 | ||
| 240 | status = acpi_ns_check_sorted_list(data, return_object, 2, 1, | 256 | status = acpi_ns_check_sorted_list(info, return_object, 0, 2, 1, |
| 241 | ACPI_SORT_ASCENDING, | 257 | ACPI_SORT_ASCENDING, |
| 242 | "AmbientIlluminance"); | 258 | "AmbientIlluminance"); |
| 243 | 259 | ||
| @@ -248,7 +264,7 @@ acpi_ns_repair_ALR(struct acpi_predefined_data *data, | |||
| 248 | * | 264 | * |
| 249 | * FUNCTION: acpi_ns_repair_FDE | 265 | * FUNCTION: acpi_ns_repair_FDE |
| 250 | * | 266 | * |
| 251 | * PARAMETERS: data - Pointer to validation data structure | 267 | * PARAMETERS: info - Method execution information block |
| 252 | * return_object_ptr - Pointer to the object returned from the | 268 | * return_object_ptr - Pointer to the object returned from the |
| 253 | * evaluation of a method or object | 269 | * evaluation of a method or object |
| 254 | * | 270 | * |
| @@ -262,7 +278,7 @@ acpi_ns_repair_ALR(struct acpi_predefined_data *data, | |||
| 262 | *****************************************************************************/ | 278 | *****************************************************************************/ |
| 263 | 279 | ||
| 264 | static acpi_status | 280 | static acpi_status |
| 265 | acpi_ns_repair_FDE(struct acpi_predefined_data *data, | 281 | acpi_ns_repair_FDE(struct acpi_evaluate_info *info, |
| 266 | union acpi_operand_object **return_object_ptr) | 282 | union acpi_operand_object **return_object_ptr) |
| 267 | { | 283 | { |
| 268 | union acpi_operand_object *return_object = *return_object_ptr; | 284 | union acpi_operand_object *return_object = *return_object_ptr; |
| @@ -285,8 +301,8 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data, | |||
| 285 | /* We can only repair if we have exactly 5 BYTEs */ | 301 | /* We can only repair if we have exactly 5 BYTEs */ |
| 286 | 302 | ||
| 287 | if (return_object->buffer.length != ACPI_FDE_BYTE_BUFFER_SIZE) { | 303 | if (return_object->buffer.length != ACPI_FDE_BYTE_BUFFER_SIZE) { |
| 288 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, | 304 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 289 | data->node_flags, | 305 | info->node_flags, |
| 290 | "Incorrect return buffer length %u, expected %u", | 306 | "Incorrect return buffer length %u, expected %u", |
| 291 | return_object->buffer.length, | 307 | return_object->buffer.length, |
| 292 | ACPI_FDE_DWORD_BUFFER_SIZE)); | 308 | ACPI_FDE_DWORD_BUFFER_SIZE)); |
| @@ -316,10 +332,11 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data, | |||
| 316 | 332 | ||
| 317 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 333 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 318 | "%s Expanded Byte Buffer to expected DWord Buffer\n", | 334 | "%s Expanded Byte Buffer to expected DWord Buffer\n", |
| 319 | data->pathname)); | 335 | info->full_pathname)); |
| 320 | break; | 336 | break; |
| 321 | 337 | ||
| 322 | default: | 338 | default: |
| 339 | |||
| 323 | return (AE_AML_OPERAND_TYPE); | 340 | return (AE_AML_OPERAND_TYPE); |
| 324 | } | 341 | } |
| 325 | 342 | ||
| @@ -328,7 +345,7 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data, | |||
| 328 | acpi_ut_remove_reference(return_object); | 345 | acpi_ut_remove_reference(return_object); |
| 329 | *return_object_ptr = buffer_object; | 346 | *return_object_ptr = buffer_object; |
| 330 | 347 | ||
| 331 | data->flags |= ACPI_OBJECT_REPAIRED; | 348 | info->return_flags |= ACPI_OBJECT_REPAIRED; |
| 332 | return (AE_OK); | 349 | return (AE_OK); |
| 333 | } | 350 | } |
| 334 | 351 | ||
| @@ -336,7 +353,7 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data, | |||
| 336 | * | 353 | * |
| 337 | * FUNCTION: acpi_ns_repair_CID | 354 | * FUNCTION: acpi_ns_repair_CID |
| 338 | * | 355 | * |
| 339 | * PARAMETERS: data - Pointer to validation data structure | 356 | * PARAMETERS: info - Method execution information block |
| 340 | * return_object_ptr - Pointer to the object returned from the | 357 | * return_object_ptr - Pointer to the object returned from the |
| 341 | * evaluation of a method or object | 358 | * evaluation of a method or object |
| 342 | * | 359 | * |
| @@ -349,7 +366,7 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data, | |||
| 349 | *****************************************************************************/ | 366 | *****************************************************************************/ |
| 350 | 367 | ||
| 351 | static acpi_status | 368 | static acpi_status |
| 352 | acpi_ns_repair_CID(struct acpi_predefined_data *data, | 369 | acpi_ns_repair_CID(struct acpi_evaluate_info *info, |
| 353 | union acpi_operand_object **return_object_ptr) | 370 | union acpi_operand_object **return_object_ptr) |
| 354 | { | 371 | { |
| 355 | acpi_status status; | 372 | acpi_status status; |
| @@ -362,7 +379,7 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data, | |||
| 362 | /* Check for _CID as a simple string */ | 379 | /* Check for _CID as a simple string */ |
| 363 | 380 | ||
| 364 | if (return_object->common.type == ACPI_TYPE_STRING) { | 381 | if (return_object->common.type == ACPI_TYPE_STRING) { |
| 365 | status = acpi_ns_repair_HID(data, return_object_ptr); | 382 | status = acpi_ns_repair_HID(info, return_object_ptr); |
| 366 | return (status); | 383 | return (status); |
| 367 | } | 384 | } |
| 368 | 385 | ||
| @@ -379,7 +396,7 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data, | |||
| 379 | original_element = *element_ptr; | 396 | original_element = *element_ptr; |
| 380 | original_ref_count = original_element->common.reference_count; | 397 | original_ref_count = original_element->common.reference_count; |
| 381 | 398 | ||
| 382 | status = acpi_ns_repair_HID(data, element_ptr); | 399 | status = acpi_ns_repair_HID(info, element_ptr); |
| 383 | if (ACPI_FAILURE(status)) { | 400 | if (ACPI_FAILURE(status)) { |
| 384 | return (status); | 401 | return (status); |
| 385 | } | 402 | } |
| @@ -404,9 +421,95 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data, | |||
| 404 | 421 | ||
| 405 | /****************************************************************************** | 422 | /****************************************************************************** |
| 406 | * | 423 | * |
| 424 | * FUNCTION: acpi_ns_repair_CST | ||
| 425 | * | ||
| 426 | * PARAMETERS: info - Method execution information block | ||
| 427 | * return_object_ptr - Pointer to the object returned from the | ||
| 428 | * evaluation of a method or object | ||
| 429 | * | ||
| 430 | * RETURN: Status. AE_OK if object is OK or was repaired successfully | ||
| 431 | * | ||
| 432 | * DESCRIPTION: Repair for the _CST object: | ||
| 433 | * 1. Sort the list ascending by C state type | ||
| 434 | * 2. Ensure type cannot be zero | ||
| 435 | * 3. A sub-package count of zero means _CST is meaningless | ||
| 436 | * 4. Count must match the number of C state sub-packages | ||
| 437 | * | ||
| 438 | *****************************************************************************/ | ||
| 439 | |||
| 440 | static acpi_status | ||
| 441 | acpi_ns_repair_CST(struct acpi_evaluate_info *info, | ||
| 442 | union acpi_operand_object **return_object_ptr) | ||
| 443 | { | ||
| 444 | union acpi_operand_object *return_object = *return_object_ptr; | ||
| 445 | union acpi_operand_object **outer_elements; | ||
| 446 | u32 outer_element_count; | ||
| 447 | union acpi_operand_object *obj_desc; | ||
| 448 | acpi_status status; | ||
| 449 | u8 removing; | ||
| 450 | u32 i; | ||
| 451 | |||
| 452 | ACPI_FUNCTION_NAME(ns_repair_CST); | ||
| 453 | |||
| 454 | /* | ||
| 455 | * Check if the C-state type values are proportional. | ||
| 456 | */ | ||
| 457 | outer_element_count = return_object->package.count - 1; | ||
| 458 | i = 0; | ||
| 459 | while (i < outer_element_count) { | ||
| 460 | outer_elements = &return_object->package.elements[i + 1]; | ||
| 461 | removing = FALSE; | ||
| 462 | |||
| 463 | if ((*outer_elements)->package.count == 0) { | ||
| 464 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, | ||
| 465 | info->node_flags, | ||
| 466 | "SubPackage[%u] - removing entry due to zero count", | ||
| 467 | i)); | ||
| 468 | removing = TRUE; | ||
| 469 | goto remove_element; | ||
| 470 | } | ||
| 471 | |||
| 472 | obj_desc = (*outer_elements)->package.elements[1]; /* Index1 = Type */ | ||
| 473 | if ((u32)obj_desc->integer.value == 0) { | ||
| 474 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, | ||
| 475 | info->node_flags, | ||
| 476 | "SubPackage[%u] - removing entry due to invalid Type(0)", | ||
| 477 | i)); | ||
| 478 | removing = TRUE; | ||
| 479 | } | ||
| 480 | |||
| 481 | remove_element: | ||
| 482 | if (removing) { | ||
| 483 | acpi_ns_remove_element(return_object, i + 1); | ||
| 484 | outer_element_count--; | ||
| 485 | } else { | ||
| 486 | i++; | ||
| 487 | } | ||
| 488 | } | ||
| 489 | |||
| 490 | /* Update top-level package count, Type "Integer" checked elsewhere */ | ||
| 491 | |||
| 492 | obj_desc = return_object->package.elements[0]; | ||
| 493 | obj_desc->integer.value = outer_element_count; | ||
| 494 | |||
| 495 | /* | ||
| 496 | * Entries (subpackages) in the _CST Package must be sorted by the | ||
| 497 | * C-state type, in ascending order. | ||
| 498 | */ | ||
| 499 | status = acpi_ns_check_sorted_list(info, return_object, 1, 4, 1, | ||
| 500 | ACPI_SORT_ASCENDING, "C-State Type"); | ||
| 501 | if (ACPI_FAILURE(status)) { | ||
| 502 | return (status); | ||
| 503 | } | ||
| 504 | |||
| 505 | return (AE_OK); | ||
| 506 | } | ||
| 507 | |||
| 508 | /****************************************************************************** | ||
| 509 | * | ||
| 407 | * FUNCTION: acpi_ns_repair_HID | 510 | * FUNCTION: acpi_ns_repair_HID |
| 408 | * | 511 | * |
| 409 | * PARAMETERS: data - Pointer to validation data structure | 512 | * PARAMETERS: info - Method execution information block |
| 410 | * return_object_ptr - Pointer to the object returned from the | 513 | * return_object_ptr - Pointer to the object returned from the |
| 411 | * evaluation of a method or object | 514 | * evaluation of a method or object |
| 412 | * | 515 | * |
| @@ -418,7 +521,7 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data, | |||
| 418 | *****************************************************************************/ | 521 | *****************************************************************************/ |
| 419 | 522 | ||
| 420 | static acpi_status | 523 | static acpi_status |
| 421 | acpi_ns_repair_HID(struct acpi_predefined_data *data, | 524 | acpi_ns_repair_HID(struct acpi_evaluate_info *info, |
| 422 | union acpi_operand_object **return_object_ptr) | 525 | union acpi_operand_object **return_object_ptr) |
| 423 | { | 526 | { |
| 424 | union acpi_operand_object *return_object = *return_object_ptr; | 527 | union acpi_operand_object *return_object = *return_object_ptr; |
| @@ -435,12 +538,13 @@ acpi_ns_repair_HID(struct acpi_predefined_data *data, | |||
| 435 | } | 538 | } |
| 436 | 539 | ||
| 437 | if (return_object->string.length == 0) { | 540 | if (return_object->string.length == 0) { |
| 438 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, | 541 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 542 | info->node_flags, | ||
| 439 | "Invalid zero-length _HID or _CID string")); | 543 | "Invalid zero-length _HID or _CID string")); |
| 440 | 544 | ||
| 441 | /* Return AE_OK anyway, let driver handle it */ | 545 | /* Return AE_OK anyway, let driver handle it */ |
| 442 | 546 | ||
| 443 | data->flags |= ACPI_OBJECT_REPAIRED; | 547 | info->return_flags |= ACPI_OBJECT_REPAIRED; |
| 444 | return (AE_OK); | 548 | return (AE_OK); |
| 445 | } | 549 | } |
| 446 | 550 | ||
| @@ -464,7 +568,7 @@ acpi_ns_repair_HID(struct acpi_predefined_data *data, | |||
| 464 | 568 | ||
| 465 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 569 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 466 | "%s: Removed invalid leading asterisk\n", | 570 | "%s: Removed invalid leading asterisk\n", |
| 467 | data->pathname)); | 571 | info->full_pathname)); |
| 468 | } | 572 | } |
| 469 | 573 | ||
| 470 | /* | 574 | /* |
| @@ -486,53 +590,69 @@ acpi_ns_repair_HID(struct acpi_predefined_data *data, | |||
| 486 | 590 | ||
| 487 | /****************************************************************************** | 591 | /****************************************************************************** |
| 488 | * | 592 | * |
| 489 | * FUNCTION: acpi_ns_repair_TSS | 593 | * FUNCTION: acpi_ns_repair_PRT |
| 490 | * | 594 | * |
| 491 | * PARAMETERS: data - Pointer to validation data structure | 595 | * PARAMETERS: info - Method execution information block |
| 492 | * return_object_ptr - Pointer to the object returned from the | 596 | * return_object_ptr - Pointer to the object returned from the |
| 493 | * evaluation of a method or object | 597 | * evaluation of a method or object |
| 494 | * | 598 | * |
| 495 | * RETURN: Status. AE_OK if object is OK or was repaired successfully | 599 | * RETURN: Status. AE_OK if object is OK or was repaired successfully |
| 496 | * | 600 | * |
| 497 | * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list | 601 | * DESCRIPTION: Repair for the _PRT object. If necessary, fix reversed |
| 498 | * descending by the power dissipation values. | 602 | * source_name and source_index field, a common BIOS bug. |
| 499 | * | 603 | * |
| 500 | *****************************************************************************/ | 604 | *****************************************************************************/ |
| 501 | 605 | ||
| 502 | static acpi_status | 606 | static acpi_status |
| 503 | acpi_ns_repair_TSS(struct acpi_predefined_data *data, | 607 | acpi_ns_repair_PRT(struct acpi_evaluate_info *info, |
| 504 | union acpi_operand_object **return_object_ptr) | 608 | union acpi_operand_object **return_object_ptr) |
| 505 | { | 609 | { |
| 506 | union acpi_operand_object *return_object = *return_object_ptr; | 610 | union acpi_operand_object *package_object = *return_object_ptr; |
| 507 | acpi_status status; | 611 | union acpi_operand_object **top_object_list; |
| 508 | struct acpi_namespace_node *node; | 612 | union acpi_operand_object **sub_object_list; |
| 613 | union acpi_operand_object *obj_desc; | ||
| 614 | u32 element_count; | ||
| 615 | u32 index; | ||
| 509 | 616 | ||
| 510 | /* | 617 | /* Each element in the _PRT package is a subpackage */ |
| 511 | * We can only sort the _TSS return package if there is no _PSS in the | ||
| 512 | * same scope. This is because if _PSS is present, the ACPI specification | ||
| 513 | * dictates that the _TSS Power Dissipation field is to be ignored, and | ||
| 514 | * therefore some BIOSs leave garbage values in the _TSS Power field(s). | ||
| 515 | * In this case, it is best to just return the _TSS package as-is. | ||
| 516 | * (May, 2011) | ||
| 517 | */ | ||
| 518 | status = | ||
| 519 | acpi_ns_get_node(data->node, "^_PSS", ACPI_NS_NO_UPSEARCH, &node); | ||
| 520 | if (ACPI_SUCCESS(status)) { | ||
| 521 | return (AE_OK); | ||
| 522 | } | ||
| 523 | 618 | ||
| 524 | status = acpi_ns_check_sorted_list(data, return_object, 5, 1, | 619 | top_object_list = package_object->package.elements; |
| 525 | ACPI_SORT_DESCENDING, | 620 | element_count = package_object->package.count; |
| 526 | "PowerDissipation"); | ||
| 527 | 621 | ||
| 528 | return (status); | 622 | for (index = 0; index < element_count; index++) { |
| 623 | sub_object_list = (*top_object_list)->package.elements; | ||
| 624 | |||
| 625 | /* | ||
| 626 | * If the BIOS has erroneously reversed the _PRT source_name (index 2) | ||
| 627 | * and the source_index (index 3), fix it. _PRT is important enough to | ||
| 628 | * workaround this BIOS error. This also provides compatibility with | ||
| 629 | * other ACPI implementations. | ||
| 630 | */ | ||
| 631 | obj_desc = sub_object_list[3]; | ||
| 632 | if (!obj_desc || (obj_desc->common.type != ACPI_TYPE_INTEGER)) { | ||
| 633 | sub_object_list[3] = sub_object_list[2]; | ||
| 634 | sub_object_list[2] = obj_desc; | ||
| 635 | info->return_flags |= ACPI_OBJECT_REPAIRED; | ||
| 636 | |||
| 637 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, | ||
| 638 | info->node_flags, | ||
| 639 | "PRT[%X]: Fixed reversed SourceName and SourceIndex", | ||
| 640 | index)); | ||
| 641 | } | ||
| 642 | |||
| 643 | /* Point to the next union acpi_operand_object in the top level package */ | ||
| 644 | |||
| 645 | top_object_list++; | ||
| 646 | } | ||
| 647 | |||
| 648 | return (AE_OK); | ||
| 529 | } | 649 | } |
| 530 | 650 | ||
| 531 | /****************************************************************************** | 651 | /****************************************************************************** |
| 532 | * | 652 | * |
| 533 | * FUNCTION: acpi_ns_repair_PSS | 653 | * FUNCTION: acpi_ns_repair_PSS |
| 534 | * | 654 | * |
| 535 | * PARAMETERS: data - Pointer to validation data structure | 655 | * PARAMETERS: info - Method execution information block |
| 536 | * return_object_ptr - Pointer to the object returned from the | 656 | * return_object_ptr - Pointer to the object returned from the |
| 537 | * evaluation of a method or object | 657 | * evaluation of a method or object |
| 538 | * | 658 | * |
| @@ -546,7 +666,7 @@ acpi_ns_repair_TSS(struct acpi_predefined_data *data, | |||
| 546 | *****************************************************************************/ | 666 | *****************************************************************************/ |
| 547 | 667 | ||
| 548 | static acpi_status | 668 | static acpi_status |
| 549 | acpi_ns_repair_PSS(struct acpi_predefined_data *data, | 669 | acpi_ns_repair_PSS(struct acpi_evaluate_info *info, |
| 550 | union acpi_operand_object **return_object_ptr) | 670 | union acpi_operand_object **return_object_ptr) |
| 551 | { | 671 | { |
| 552 | union acpi_operand_object *return_object = *return_object_ptr; | 672 | union acpi_operand_object *return_object = *return_object_ptr; |
| @@ -564,7 +684,7 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data, | |||
| 564 | * incorrectly sorted, sort it. We sort by cpu_frequency, since this | 684 | * incorrectly sorted, sort it. We sort by cpu_frequency, since this |
| 565 | * should be proportional to the power. | 685 | * should be proportional to the power. |
| 566 | */ | 686 | */ |
| 567 | status = acpi_ns_check_sorted_list(data, return_object, 6, 0, | 687 | status = acpi_ns_check_sorted_list(info, return_object, 0, 6, 0, |
| 568 | ACPI_SORT_DESCENDING, | 688 | ACPI_SORT_DESCENDING, |
| 569 | "CpuFrequency"); | 689 | "CpuFrequency"); |
| 570 | if (ACPI_FAILURE(status)) { | 690 | if (ACPI_FAILURE(status)) { |
| @@ -584,8 +704,8 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data, | |||
| 584 | obj_desc = elements[1]; /* Index1 = power_dissipation */ | 704 | obj_desc = elements[1]; /* Index1 = power_dissipation */ |
| 585 | 705 | ||
| 586 | if ((u32) obj_desc->integer.value > previous_value) { | 706 | if ((u32) obj_desc->integer.value > previous_value) { |
| 587 | ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, | 707 | ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
| 588 | data->node_flags, | 708 | info->node_flags, |
| 589 | "SubPackage[%u,%u] - suspicious power dissipation values", | 709 | "SubPackage[%u,%u] - suspicious power dissipation values", |
| 590 | i - 1, i)); | 710 | i - 1, i)); |
| 591 | } | 711 | } |
| @@ -599,10 +719,55 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data, | |||
| 599 | 719 | ||
| 600 | /****************************************************************************** | 720 | /****************************************************************************** |
| 601 | * | 721 | * |
| 722 | * FUNCTION: acpi_ns_repair_TSS | ||
| 723 | * | ||
| 724 | * PARAMETERS: info - Method execution information block | ||
| 725 | * return_object_ptr - Pointer to the object returned from the | ||
| 726 | * evaluation of a method or object | ||
| 727 | * | ||
| 728 | * RETURN: Status. AE_OK if object is OK or was repaired successfully | ||
| 729 | * | ||
| 730 | * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list | ||
| 731 | * descending by the power dissipation values. | ||
| 732 | * | ||
| 733 | *****************************************************************************/ | ||
| 734 | |||
| 735 | static acpi_status | ||
| 736 | acpi_ns_repair_TSS(struct acpi_evaluate_info *info, | ||
| 737 | union acpi_operand_object **return_object_ptr) | ||
| 738 | { | ||
| 739 | union acpi_operand_object *return_object = *return_object_ptr; | ||
| 740 | acpi_status status; | ||
| 741 | struct acpi_namespace_node *node; | ||
| 742 | |||
| 743 | /* | ||
| 744 | * We can only sort the _TSS return package if there is no _PSS in the | ||
| 745 | * same scope. This is because if _PSS is present, the ACPI specification | ||
| 746 | * dictates that the _TSS Power Dissipation field is to be ignored, and | ||
| 747 | * therefore some BIOSs leave garbage values in the _TSS Power field(s). | ||
| 748 | * In this case, it is best to just return the _TSS package as-is. | ||
| 749 | * (May, 2011) | ||
| 750 | */ | ||
| 751 | status = acpi_ns_get_node(info->node, "^_PSS", | ||
| 752 | ACPI_NS_NO_UPSEARCH, &node); | ||
| 753 | if (ACPI_SUCCESS(status)) { | ||
| 754 | return (AE_OK); | ||
| 755 | } | ||
| 756 | |||
| 757 | status = acpi_ns_check_sorted_list(info, return_object, 0, 5, 1, | ||
| 758 | ACPI_SORT_DESCENDING, | ||
| 759 | "PowerDissipation"); | ||
| 760 | |||
| 761 | return (status); | ||
| 762 | } | ||
| 763 | |||
| 764 | /****************************************************************************** | ||
| 765 | * | ||
| 602 | * FUNCTION: acpi_ns_check_sorted_list | 766 | * FUNCTION: acpi_ns_check_sorted_list |
| 603 | * | 767 | * |
| 604 | * PARAMETERS: data - Pointer to validation data structure | 768 | * PARAMETERS: info - Method execution information block |
| 605 | * return_object - Pointer to the top-level returned object | 769 | * return_object - Pointer to the top-level returned object |
| 770 | * start_index - Index of the first sub-package | ||
| 606 | * expected_count - Minimum length of each sub-package | 771 | * expected_count - Minimum length of each sub-package |
| 607 | * sort_index - Sub-package entry to sort on | 772 | * sort_index - Sub-package entry to sort on |
| 608 | * sort_direction - Ascending or descending | 773 | * sort_direction - Ascending or descending |
| @@ -617,8 +782,9 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data, | |||
| 617 | *****************************************************************************/ | 782 | *****************************************************************************/ |
| 618 | 783 | ||
| 619 | static acpi_status | 784 | static acpi_status |
| 620 | acpi_ns_check_sorted_list(struct acpi_predefined_data *data, | 785 | acpi_ns_check_sorted_list(struct acpi_evaluate_info *info, |
| 621 | union acpi_operand_object *return_object, | 786 | union acpi_operand_object *return_object, |
| 787 | u32 start_index, | ||
| 622 | u32 expected_count, | 788 | u32 expected_count, |
| 623 | u32 sort_index, | 789 | u32 sort_index, |
| 624 | u8 sort_direction, char *sort_key_name) | 790 | u8 sort_direction, char *sort_key_name) |
| @@ -643,12 +809,14 @@ acpi_ns_check_sorted_list(struct acpi_predefined_data *data, | |||
| 643 | * Any NULL elements should have been removed by earlier call | 809 | * Any NULL elements should have been removed by earlier call |
| 644 | * to acpi_ns_remove_null_elements. | 810 | * to acpi_ns_remove_null_elements. |
| 645 | */ | 811 | */ |
| 646 | outer_elements = return_object->package.elements; | ||
| 647 | outer_element_count = return_object->package.count; | 812 | outer_element_count = return_object->package.count; |
| 648 | if (!outer_element_count) { | 813 | if (!outer_element_count || start_index >= outer_element_count) { |
| 649 | return (AE_AML_PACKAGE_LIMIT); | 814 | return (AE_AML_PACKAGE_LIMIT); |
| 650 | } | 815 | } |
| 651 | 816 | ||
| 817 | outer_elements = &return_object->package.elements[start_index]; | ||
| 818 | outer_element_count -= start_index; | ||
| 819 | |||
| 652 | previous_value = 0; | 820 | previous_value = 0; |
| 653 | if (sort_direction == ACPI_SORT_DESCENDING) { | 821 | if (sort_direction == ACPI_SORT_DESCENDING) { |
| 654 | previous_value = ACPI_UINT32_MAX; | 822 | previous_value = ACPI_UINT32_MAX; |
| @@ -685,15 +853,16 @@ acpi_ns_check_sorted_list(struct acpi_predefined_data *data, | |||
| 685 | (obj_desc->integer.value < previous_value)) || | 853 | (obj_desc->integer.value < previous_value)) || |
| 686 | ((sort_direction == ACPI_SORT_DESCENDING) && | 854 | ((sort_direction == ACPI_SORT_DESCENDING) && |
| 687 | (obj_desc->integer.value > previous_value))) { | 855 | (obj_desc->integer.value > previous_value))) { |
| 688 | acpi_ns_sort_list(return_object->package.elements, | 856 | acpi_ns_sort_list(&return_object->package. |
| 857 | elements[start_index], | ||
| 689 | outer_element_count, sort_index, | 858 | outer_element_count, sort_index, |
| 690 | sort_direction); | 859 | sort_direction); |
| 691 | 860 | ||
| 692 | data->flags |= ACPI_OBJECT_REPAIRED; | 861 | info->return_flags |= ACPI_OBJECT_REPAIRED; |
| 693 | 862 | ||
| 694 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, | 863 | ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, |
| 695 | "%s: Repaired unsorted list - now sorted by %s\n", | 864 | "%s: Repaired unsorted list - now sorted by %s\n", |
| 696 | data->pathname, sort_key_name)); | 865 | info->full_pathname, sort_key_name)); |
| 697 | return (AE_OK); | 866 | return (AE_OK); |
| 698 | } | 867 | } |
| 699 | 868 | ||
| @@ -752,3 +921,52 @@ acpi_ns_sort_list(union acpi_operand_object **elements, | |||
| 752 | } | 921 | } |
| 753 | } | 922 | } |
| 754 | } | 923 | } |
| 924 | |||
| 925 | /****************************************************************************** | ||
| 926 | * | ||
| 927 | * FUNCTION: acpi_ns_remove_element | ||
| 928 | * | ||
| 929 | * PARAMETERS: obj_desc - Package object element list | ||
| 930 | * index - Index of element to remove | ||
| 931 | * | ||
| 932 | * RETURN: None | ||
| 933 | * | ||
| 934 | * DESCRIPTION: Remove the requested element of a package and delete it. | ||
| 935 | * | ||
| 936 | *****************************************************************************/ | ||
| 937 | |||
| 938 | static void | ||
| 939 | acpi_ns_remove_element(union acpi_operand_object *obj_desc, u32 index) | ||
| 940 | { | ||
| 941 | union acpi_operand_object **source; | ||
| 942 | union acpi_operand_object **dest; | ||
| 943 | u32 count; | ||
| 944 | u32 new_count; | ||
| 945 | u32 i; | ||
| 946 | |||
| 947 | ACPI_FUNCTION_NAME(ns_remove_element); | ||
| 948 | |||
| 949 | count = obj_desc->package.count; | ||
| 950 | new_count = count - 1; | ||
| 951 | |||
| 952 | source = obj_desc->package.elements; | ||
| 953 | dest = source; | ||
| 954 | |||
| 955 | /* Examine all elements of the package object, remove matched index */ | ||
| 956 | |||
| 957 | for (i = 0; i < count; i++) { | ||
| 958 | if (i == index) { | ||
| 959 | acpi_ut_remove_reference(*source); /* Remove one ref for being in pkg */ | ||
| 960 | acpi_ut_remove_reference(*source); | ||
| 961 | } else { | ||
| 962 | *dest = *source; | ||
| 963 | dest++; | ||
| 964 | } | ||
| 965 | source++; | ||
| 966 | } | ||
| 967 | |||
| 968 | /* NULL terminate list and update the package count */ | ||
| 969 | |||
| 970 | *dest = NULL; | ||
| 971 | obj_desc->package.count = new_count; | ||
| 972 | } | ||
diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c index 2808586fad30..08c0b5beec88 100644 --- a/drivers/acpi/acpica/nsutils.c +++ b/drivers/acpi/acpica/nsutils.c | |||
| @@ -419,10 +419,12 @@ acpi_ns_externalize_name(u32 internal_name_length, | |||
| 419 | 419 | ||
| 420 | switch (internal_name[0]) { | 420 | switch (internal_name[0]) { |
| 421 | case AML_ROOT_PREFIX: | 421 | case AML_ROOT_PREFIX: |
| 422 | |||
| 422 | prefix_length = 1; | 423 | prefix_length = 1; |
| 423 | break; | 424 | break; |
| 424 | 425 | ||
| 425 | case AML_PARENT_PREFIX: | 426 | case AML_PARENT_PREFIX: |
| 427 | |||
| 426 | for (i = 0; i < internal_name_length; i++) { | 428 | for (i = 0; i < internal_name_length; i++) { |
| 427 | if (ACPI_IS_PARENT_PREFIX(internal_name[i])) { | 429 | if (ACPI_IS_PARENT_PREFIX(internal_name[i])) { |
| 428 | prefix_length = i + 1; | 430 | prefix_length = i + 1; |
| @@ -438,6 +440,7 @@ acpi_ns_externalize_name(u32 internal_name_length, | |||
| 438 | break; | 440 | break; |
| 439 | 441 | ||
| 440 | default: | 442 | default: |
| 443 | |||
| 441 | break; | 444 | break; |
| 442 | } | 445 | } |
| 443 | 446 | ||
diff --git a/drivers/acpi/acpica/nsxfeval.c b/drivers/acpi/acpica/nsxfeval.c index fc69949151bb..f553cfdb71dd 100644 --- a/drivers/acpi/acpica/nsxfeval.c +++ b/drivers/acpi/acpica/nsxfeval.c | |||
| @@ -187,8 +187,6 @@ acpi_evaluate_object(acpi_handle handle, | |||
| 187 | return_ACPI_STATUS(AE_NO_MEMORY); | 187 | return_ACPI_STATUS(AE_NO_MEMORY); |
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | info->pathname = pathname; | ||
| 191 | |||
| 192 | /* Convert and validate the device handle */ | 190 | /* Convert and validate the device handle */ |
| 193 | 191 | ||
| 194 | info->prefix_node = acpi_ns_validate_handle(handle); | 192 | info->prefix_node = acpi_ns_validate_handle(handle); |
| @@ -198,17 +196,64 @@ acpi_evaluate_object(acpi_handle handle, | |||
| 198 | } | 196 | } |
| 199 | 197 | ||
| 200 | /* | 198 | /* |
| 201 | * If there are parameters to be passed to a control method, the external | 199 | * Get the actual namespace node for the target object. |
| 202 | * objects must all be converted to internal objects | 200 | * Handles these cases: |
| 201 | * | ||
| 202 | * 1) Null node, valid pathname from root (absolute path) | ||
| 203 | * 2) Node and valid pathname (path relative to Node) | ||
| 204 | * 3) Node, Null pathname | ||
| 205 | */ | ||
| 206 | if ((pathname) && (ACPI_IS_ROOT_PREFIX(pathname[0]))) { | ||
| 207 | |||
| 208 | /* The path is fully qualified, just evaluate by name */ | ||
| 209 | |||
| 210 | info->prefix_node = NULL; | ||
| 211 | } else if (!handle) { | ||
| 212 | /* | ||
| 213 | * A handle is optional iff a fully qualified pathname is specified. | ||
| 214 | * Since we've already handled fully qualified names above, this is | ||
| 215 | * an error. | ||
| 216 | */ | ||
| 217 | if (!pathname) { | ||
| 218 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 219 | "Both Handle and Pathname are NULL")); | ||
| 220 | } else { | ||
| 221 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 222 | "Null Handle with relative pathname [%s]", | ||
| 223 | pathname)); | ||
| 224 | } | ||
| 225 | |||
| 226 | status = AE_BAD_PARAMETER; | ||
| 227 | goto cleanup; | ||
| 228 | } | ||
| 229 | |||
| 230 | info->relative_pathname = pathname; | ||
| 231 | |||
| 232 | /* | ||
| 233 | * Convert all external objects passed as arguments to the | ||
| 234 | * internal version(s). | ||
| 203 | */ | 235 | */ |
| 204 | if (external_params && external_params->count) { | 236 | if (external_params && external_params->count) { |
| 237 | info->param_count = (u16)external_params->count; | ||
| 238 | |||
| 239 | /* Warn on impossible argument count */ | ||
| 240 | |||
| 241 | if (info->param_count > ACPI_METHOD_NUM_ARGS) { | ||
| 242 | ACPI_WARN_PREDEFINED((AE_INFO, pathname, | ||
| 243 | ACPI_WARN_ALWAYS, | ||
| 244 | "Excess arguments (%u) - using only %u", | ||
| 245 | info->param_count, | ||
| 246 | ACPI_METHOD_NUM_ARGS)); | ||
| 247 | |||
| 248 | info->param_count = ACPI_METHOD_NUM_ARGS; | ||
| 249 | } | ||
| 250 | |||
| 205 | /* | 251 | /* |
| 206 | * Allocate a new parameter block for the internal objects | 252 | * Allocate a new parameter block for the internal objects |
| 207 | * Add 1 to count to allow for null terminated internal list | 253 | * Add 1 to count to allow for null terminated internal list |
| 208 | */ | 254 | */ |
| 209 | info->parameters = ACPI_ALLOCATE_ZEROED(((acpi_size) | 255 | info->parameters = ACPI_ALLOCATE_ZEROED(((acpi_size) info-> |
| 210 | external_params-> | 256 | param_count + |
| 211 | count + | ||
| 212 | 1) * sizeof(void *)); | 257 | 1) * sizeof(void *)); |
| 213 | if (!info->parameters) { | 258 | if (!info->parameters) { |
| 214 | status = AE_NO_MEMORY; | 259 | status = AE_NO_MEMORY; |
| @@ -217,7 +262,7 @@ acpi_evaluate_object(acpi_handle handle, | |||
| 217 | 262 | ||
| 218 | /* Convert each external object in the list to an internal object */ | 263 | /* Convert each external object in the list to an internal object */ |
| 219 | 264 | ||
| 220 | for (i = 0; i < external_params->count; i++) { | 265 | for (i = 0; i < info->param_count; i++) { |
| 221 | status = | 266 | status = |
| 222 | acpi_ut_copy_eobject_to_iobject(&external_params-> | 267 | acpi_ut_copy_eobject_to_iobject(&external_params-> |
| 223 | pointer[i], | 268 | pointer[i], |
| @@ -227,43 +272,96 @@ acpi_evaluate_object(acpi_handle handle, | |||
| 227 | goto cleanup; | 272 | goto cleanup; |
| 228 | } | 273 | } |
| 229 | } | 274 | } |
| 230 | info->parameters[external_params->count] = NULL; | 275 | |
| 276 | info->parameters[info->param_count] = NULL; | ||
| 231 | } | 277 | } |
| 232 | 278 | ||
| 279 | #if 0 | ||
| 280 | |||
| 233 | /* | 281 | /* |
| 234 | * Three major cases: | 282 | * Begin incoming argument count analysis. Check for too few args |
| 235 | * 1) Fully qualified pathname | 283 | * and too many args. |
| 236 | * 2) No handle, not fully qualified pathname (error) | ||
| 237 | * 3) Valid handle | ||
| 238 | */ | 284 | */ |
| 239 | if ((pathname) && (ACPI_IS_ROOT_PREFIX(pathname[0]))) { | ||
| 240 | 285 | ||
| 241 | /* The path is fully qualified, just evaluate by name */ | 286 | switch (acpi_ns_get_type(info->node)) { |
| 287 | case ACPI_TYPE_METHOD: | ||
| 288 | |||
| 289 | /* Check incoming argument count against the method definition */ | ||
| 290 | |||
| 291 | if (info->obj_desc->method.param_count > info->param_count) { | ||
| 292 | ACPI_ERROR((AE_INFO, | ||
| 293 | "Insufficient arguments (%u) - %u are required", | ||
| 294 | info->param_count, | ||
| 295 | info->obj_desc->method.param_count)); | ||
| 296 | |||
| 297 | status = AE_MISSING_ARGUMENTS; | ||
| 298 | goto cleanup; | ||
| 299 | } | ||
| 300 | |||
| 301 | else if (info->obj_desc->method.param_count < info->param_count) { | ||
| 302 | ACPI_WARNING((AE_INFO, | ||
| 303 | "Excess arguments (%u) - only %u are required", | ||
| 304 | info->param_count, | ||
| 305 | info->obj_desc->method.param_count)); | ||
| 306 | |||
| 307 | /* Just pass the required number of arguments */ | ||
| 308 | |||
| 309 | info->param_count = info->obj_desc->method.param_count; | ||
| 310 | } | ||
| 242 | 311 | ||
| 243 | info->prefix_node = NULL; | ||
| 244 | status = acpi_ns_evaluate(info); | ||
| 245 | } else if (!handle) { | ||
| 246 | /* | 312 | /* |
| 247 | * A handle is optional iff a fully qualified pathname is specified. | 313 | * Any incoming external objects to be passed as arguments to the |
| 248 | * Since we've already handled fully qualified names above, this is | 314 | * method must be converted to internal objects |
| 249 | * an error | ||
| 250 | */ | 315 | */ |
| 251 | if (!pathname) { | 316 | if (info->param_count) { |
| 252 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 317 | /* |
| 253 | "Both Handle and Pathname are NULL")); | 318 | * Allocate a new parameter block for the internal objects |
| 254 | } else { | 319 | * Add 1 to count to allow for null terminated internal list |
| 255 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 320 | */ |
| 256 | "Null Handle with relative pathname [%s]", | 321 | info->parameters = ACPI_ALLOCATE_ZEROED(((acpi_size) |
| 257 | pathname)); | 322 | info-> |
| 323 | param_count + | ||
| 324 | 1) * | ||
| 325 | sizeof(void *)); | ||
| 326 | if (!info->parameters) { | ||
| 327 | status = AE_NO_MEMORY; | ||
| 328 | goto cleanup; | ||
| 329 | } | ||
| 330 | |||
| 331 | /* Convert each external object in the list to an internal object */ | ||
| 332 | |||
| 333 | for (i = 0; i < info->param_count; i++) { | ||
| 334 | status = | ||
| 335 | acpi_ut_copy_eobject_to_iobject | ||
| 336 | (&external_params->pointer[i], | ||
| 337 | &info->parameters[i]); | ||
| 338 | if (ACPI_FAILURE(status)) { | ||
| 339 | goto cleanup; | ||
| 340 | } | ||
| 341 | } | ||
| 342 | |||
| 343 | info->parameters[info->param_count] = NULL; | ||
| 258 | } | 344 | } |
| 345 | break; | ||
| 259 | 346 | ||
| 260 | status = AE_BAD_PARAMETER; | 347 | default: |
| 261 | } else { | 348 | |
| 262 | /* We have a namespace a node and a possible relative path */ | 349 | /* Warn if arguments passed to an object that is not a method */ |
| 263 | 350 | ||
| 264 | status = acpi_ns_evaluate(info); | 351 | if (info->param_count) { |
| 352 | ACPI_WARNING((AE_INFO, | ||
| 353 | "%u arguments were passed to a non-method ACPI object", | ||
| 354 | info->param_count)); | ||
| 355 | } | ||
| 356 | break; | ||
| 265 | } | 357 | } |
| 266 | 358 | ||
| 359 | #endif | ||
| 360 | |||
| 361 | /* Now we can evaluate the object */ | ||
| 362 | |||
| 363 | status = acpi_ns_evaluate(info); | ||
| 364 | |||
| 267 | /* | 365 | /* |
| 268 | * If we are expecting a return value, and all went well above, | 366 | * If we are expecting a return value, and all went well above, |
| 269 | * copy the return value to an external object. | 367 | * copy the return value to an external object. |
| @@ -413,6 +511,7 @@ static void acpi_ns_resolve_references(struct acpi_evaluate_info *info) | |||
| 413 | break; | 511 | break; |
| 414 | 512 | ||
| 415 | default: | 513 | default: |
| 514 | |||
| 416 | return; | 515 | return; |
| 417 | } | 516 | } |
| 418 | 517 | ||
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c index 9f25a3d4e992..91a5a69db80c 100644 --- a/drivers/acpi/acpica/psargs.c +++ b/drivers/acpi/acpica/psargs.c | |||
| @@ -629,24 +629,28 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state | |||
| 629 | 629 | ||
| 630 | switch (opcode) { | 630 | switch (opcode) { |
| 631 | case AML_BYTE_OP: /* AML_BYTEDATA_ARG */ | 631 | case AML_BYTE_OP: /* AML_BYTEDATA_ARG */ |
| 632 | |||
| 632 | buffer_length = | 633 | buffer_length = |
| 633 | ACPI_GET8(parser_state->aml); | 634 | ACPI_GET8(parser_state->aml); |
| 634 | parser_state->aml += 1; | 635 | parser_state->aml += 1; |
| 635 | break; | 636 | break; |
| 636 | 637 | ||
| 637 | case AML_WORD_OP: /* AML_WORDDATA_ARG */ | 638 | case AML_WORD_OP: /* AML_WORDDATA_ARG */ |
| 639 | |||
| 638 | buffer_length = | 640 | buffer_length = |
| 639 | ACPI_GET16(parser_state->aml); | 641 | ACPI_GET16(parser_state->aml); |
| 640 | parser_state->aml += 2; | 642 | parser_state->aml += 2; |
| 641 | break; | 643 | break; |
| 642 | 644 | ||
| 643 | case AML_DWORD_OP: /* AML_DWORDATA_ARG */ | 645 | case AML_DWORD_OP: /* AML_DWORDATA_ARG */ |
| 646 | |||
| 644 | buffer_length = | 647 | buffer_length = |
| 645 | ACPI_GET32(parser_state->aml); | 648 | ACPI_GET32(parser_state->aml); |
| 646 | parser_state->aml += 4; | 649 | parser_state->aml += 4; |
| 647 | break; | 650 | break; |
| 648 | 651 | ||
| 649 | default: | 652 | default: |
| 653 | |||
| 650 | buffer_length = 0; | 654 | buffer_length = 0; |
| 651 | break; | 655 | break; |
| 652 | } | 656 | } |
diff --git a/drivers/acpi/acpica/psloop.c b/drivers/acpi/acpica/psloop.c index 63c455447481..065b44ae538f 100644 --- a/drivers/acpi/acpica/psloop.c +++ b/drivers/acpi/acpica/psloop.c | |||
| @@ -164,7 +164,6 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state, | |||
| 164 | case AML_IF_OP: | 164 | case AML_IF_OP: |
| 165 | case AML_ELSE_OP: | 165 | case AML_ELSE_OP: |
| 166 | case AML_WHILE_OP: | 166 | case AML_WHILE_OP: |
| 167 | |||
| 168 | /* | 167 | /* |
| 169 | * Currently supported module-level opcodes are: | 168 | * Currently supported module-level opcodes are: |
| 170 | * IF/ELSE/WHILE. These appear to be the most common, | 169 | * IF/ELSE/WHILE. These appear to be the most common, |
| @@ -289,6 +288,7 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state, | |||
| 289 | default: | 288 | default: |
| 290 | 289 | ||
| 291 | /* No action for all other opcodes */ | 290 | /* No action for all other opcodes */ |
| 291 | |||
| 292 | break; | 292 | break; |
| 293 | } | 293 | } |
| 294 | 294 | ||
diff --git a/drivers/acpi/acpica/psobject.c b/drivers/acpi/acpica/psobject.c index 12c4028002b1..95dc608a66a8 100644 --- a/drivers/acpi/acpica/psobject.c +++ b/drivers/acpi/acpica/psobject.c | |||
| @@ -402,6 +402,7 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state, | |||
| 402 | 402 | ||
| 403 | switch (status) { | 403 | switch (status) { |
| 404 | case AE_OK: | 404 | case AE_OK: |
| 405 | |||
| 405 | break; | 406 | break; |
| 406 | 407 | ||
| 407 | case AE_CTRL_TRANSFER: | 408 | case AE_CTRL_TRANSFER: |
diff --git a/drivers/acpi/acpica/psparse.c b/drivers/acpi/acpica/psparse.c index abc4c48b2edd..86198a9139b5 100644 --- a/drivers/acpi/acpica/psparse.c +++ b/drivers/acpi/acpica/psparse.c | |||
| @@ -176,10 +176,10 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, | |||
| 176 | 176 | ||
| 177 | switch (parent_info->class) { | 177 | switch (parent_info->class) { |
| 178 | case AML_CLASS_CONTROL: | 178 | case AML_CLASS_CONTROL: |
| 179 | |||
| 179 | break; | 180 | break; |
| 180 | 181 | ||
| 181 | case AML_CLASS_CREATE: | 182 | case AML_CLASS_CREATE: |
| 182 | |||
| 183 | /* | 183 | /* |
| 184 | * These opcodes contain term_arg operands. The current | 184 | * These opcodes contain term_arg operands. The current |
| 185 | * op must be replaced by a placeholder return op | 185 | * op must be replaced by a placeholder return op |
| @@ -192,7 +192,6 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, | |||
| 192 | break; | 192 | break; |
| 193 | 193 | ||
| 194 | case AML_CLASS_NAMED_OBJECT: | 194 | case AML_CLASS_NAMED_OBJECT: |
| 195 | |||
| 196 | /* | 195 | /* |
| 197 | * These opcodes contain term_arg operands. The current | 196 | * These opcodes contain term_arg operands. The current |
| 198 | * op must be replaced by a placeholder return op | 197 | * op must be replaced by a placeholder return op |
diff --git a/drivers/acpi/acpica/pstree.c b/drivers/acpi/acpica/pstree.c index c1934bf04f0a..877dc0de8df3 100644 --- a/drivers/acpi/acpica/pstree.c +++ b/drivers/acpi/acpica/pstree.c | |||
| @@ -308,7 +308,9 @@ union acpi_parse_object *acpi_ps_get_child(union acpi_parse_object *op) | |||
| 308 | break; | 308 | break; |
| 309 | 309 | ||
| 310 | default: | 310 | default: |
| 311 | |||
| 311 | /* All others have no children */ | 312 | /* All others have no children */ |
| 313 | |||
| 312 | break; | 314 | break; |
| 313 | } | 315 | } |
| 314 | 316 | ||
diff --git a/drivers/acpi/acpica/psxface.c b/drivers/acpi/acpica/psxface.c index f68254268965..11b99ab20bb3 100644 --- a/drivers/acpi/acpica/psxface.c +++ b/drivers/acpi/acpica/psxface.c | |||
| @@ -125,7 +125,7 @@ static void acpi_ps_start_trace(struct acpi_evaluate_info *info) | |||
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | if ((!acpi_gbl_trace_method_name) || | 127 | if ((!acpi_gbl_trace_method_name) || |
| 128 | (acpi_gbl_trace_method_name != info->resolved_node->name.integer)) { | 128 | (acpi_gbl_trace_method_name != info->node->name.integer)) { |
| 129 | goto exit; | 129 | goto exit; |
| 130 | } | 130 | } |
| 131 | 131 | ||
| @@ -170,7 +170,7 @@ static void acpi_ps_stop_trace(struct acpi_evaluate_info *info) | |||
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | if ((!acpi_gbl_trace_method_name) || | 172 | if ((!acpi_gbl_trace_method_name) || |
| 173 | (acpi_gbl_trace_method_name != info->resolved_node->name.integer)) { | 173 | (acpi_gbl_trace_method_name != info->node->name.integer)) { |
| 174 | goto exit; | 174 | goto exit; |
| 175 | } | 175 | } |
| 176 | 176 | ||
| @@ -226,15 +226,14 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info) | |||
| 226 | 226 | ||
| 227 | /* Validate the Info and method Node */ | 227 | /* Validate the Info and method Node */ |
| 228 | 228 | ||
| 229 | if (!info || !info->resolved_node) { | 229 | if (!info || !info->node) { |
| 230 | return_ACPI_STATUS(AE_NULL_ENTRY); | 230 | return_ACPI_STATUS(AE_NULL_ENTRY); |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | /* Init for new method, wait on concurrency semaphore */ | 233 | /* Init for new method, wait on concurrency semaphore */ |
| 234 | 234 | ||
| 235 | status = | 235 | status = |
| 236 | acpi_ds_begin_method_execution(info->resolved_node, info->obj_desc, | 236 | acpi_ds_begin_method_execution(info->node, info->obj_desc, NULL); |
| 237 | NULL); | ||
| 238 | if (ACPI_FAILURE(status)) { | 237 | if (ACPI_FAILURE(status)) { |
| 239 | return_ACPI_STATUS(status); | 238 | return_ACPI_STATUS(status); |
| 240 | } | 239 | } |
| @@ -253,8 +252,7 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info) | |||
| 253 | */ | 252 | */ |
| 254 | ACPI_DEBUG_PRINT((ACPI_DB_PARSE, | 253 | ACPI_DEBUG_PRINT((ACPI_DB_PARSE, |
| 255 | "**** Begin Method Parse/Execute [%4.4s] **** Node=%p Obj=%p\n", | 254 | "**** Begin Method Parse/Execute [%4.4s] **** Node=%p Obj=%p\n", |
| 256 | info->resolved_node->name.ascii, info->resolved_node, | 255 | info->node->name.ascii, info->node, info->obj_desc)); |
| 257 | info->obj_desc)); | ||
| 258 | 256 | ||
| 259 | /* Create and init a Root Node */ | 257 | /* Create and init a Root Node */ |
| 260 | 258 | ||
| @@ -275,7 +273,7 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info) | |||
| 275 | goto cleanup; | 273 | goto cleanup; |
| 276 | } | 274 | } |
| 277 | 275 | ||
| 278 | status = acpi_ds_init_aml_walk(walk_state, op, info->resolved_node, | 276 | status = acpi_ds_init_aml_walk(walk_state, op, info->node, |
| 279 | info->obj_desc->method.aml_start, | 277 | info->obj_desc->method.aml_start, |
| 280 | info->obj_desc->method.aml_length, info, | 278 | info->obj_desc->method.aml_length, info, |
| 281 | info->pass_number); | 279 | info->pass_number); |
diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index 72077fa1eea5..b62a0f4f4f9b 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c | |||
| @@ -352,6 +352,7 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
| 352 | break; | 352 | break; |
| 353 | 353 | ||
| 354 | default: | 354 | default: |
| 355 | |||
| 355 | break; | 356 | break; |
| 356 | } | 357 | } |
| 357 | 358 | ||
| @@ -539,6 +540,7 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
| 539 | break; | 540 | break; |
| 540 | 541 | ||
| 541 | default: | 542 | default: |
| 543 | |||
| 542 | break; | 544 | break; |
| 543 | } | 545 | } |
| 544 | 546 | ||
| @@ -650,8 +652,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, | |||
| 650 | 652 | ||
| 651 | name_found = FALSE; | 653 | name_found = FALSE; |
| 652 | 654 | ||
| 653 | for (table_index = 0; table_index < 4 && !name_found; | 655 | for (table_index = 0; |
| 654 | table_index++) { | 656 | table_index < package_element->package.count |
| 657 | && !name_found; table_index++) { | ||
| 655 | if (*sub_object_list && /* Null object allowed */ | 658 | if (*sub_object_list && /* Null object allowed */ |
| 656 | ((ACPI_TYPE_STRING == | 659 | ((ACPI_TYPE_STRING == |
| 657 | (*sub_object_list)->common.type) || | 660 | (*sub_object_list)->common.type) || |
diff --git a/drivers/acpi/acpica/rscreate.c b/drivers/acpi/acpica/rscreate.c index f8b55b426c9d..65f3e1c5b598 100644 --- a/drivers/acpi/acpica/rscreate.c +++ b/drivers/acpi/acpica/rscreate.c | |||
| @@ -273,17 +273,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 273 | */ | 273 | */ |
| 274 | user_prt->length = (sizeof(struct acpi_pci_routing_table) - 4); | 274 | user_prt->length = (sizeof(struct acpi_pci_routing_table) - 4); |
| 275 | 275 | ||
| 276 | /* Each element of the top-level package must also be a package */ | ||
| 277 | |||
| 278 | if ((*top_object_list)->common.type != ACPI_TYPE_PACKAGE) { | ||
| 279 | ACPI_ERROR((AE_INFO, | ||
| 280 | "(PRT[%u]) Need sub-package, found %s", | ||
| 281 | index, | ||
| 282 | acpi_ut_get_object_type_name | ||
| 283 | (*top_object_list))); | ||
| 284 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | ||
| 285 | } | ||
| 286 | |||
| 287 | /* Each sub-package must be of length 4 */ | 276 | /* Each sub-package must be of length 4 */ |
| 288 | 277 | ||
| 289 | if ((*top_object_list)->package.count != 4) { | 278 | if ((*top_object_list)->package.count != 4) { |
| @@ -327,22 +316,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 327 | user_prt->pin = (u32) obj_desc->integer.value; | 316 | user_prt->pin = (u32) obj_desc->integer.value; |
| 328 | 317 | ||
| 329 | /* | 318 | /* |
| 330 | * If the BIOS has erroneously reversed the _PRT source_name (index 2) | ||
| 331 | * and the source_index (index 3), fix it. _PRT is important enough to | ||
| 332 | * workaround this BIOS error. This also provides compatibility with | ||
| 333 | * other ACPI implementations. | ||
| 334 | */ | ||
| 335 | obj_desc = sub_object_list[3]; | ||
| 336 | if (!obj_desc || (obj_desc->common.type != ACPI_TYPE_INTEGER)) { | ||
| 337 | sub_object_list[3] = sub_object_list[2]; | ||
| 338 | sub_object_list[2] = obj_desc; | ||
| 339 | |||
| 340 | ACPI_WARNING((AE_INFO, | ||
| 341 | "(PRT[%X].Source) SourceName and SourceIndex are reversed, fixed", | ||
| 342 | index)); | ||
| 343 | } | ||
| 344 | |||
| 345 | /* | ||
| 346 | * 3) Third subobject: Dereference the PRT.source_name | 319 | * 3) Third subobject: Dereference the PRT.source_name |
| 347 | * The name may be unresolved (slack mode), so allow a null object | 320 | * The name may be unresolved (slack mode), so allow a null object |
| 348 | */ | 321 | */ |
diff --git a/drivers/acpi/acpica/rsdump.c b/drivers/acpi/acpica/rsdump.c index b5fc0db2e87b..8a2d4986b0aa 100644 --- a/drivers/acpi/acpica/rsdump.c +++ b/drivers/acpi/acpica/rsdump.c | |||
| @@ -120,17 +120,20 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) | |||
| 120 | /* Strings */ | 120 | /* Strings */ |
| 121 | 121 | ||
| 122 | case ACPI_RSD_LITERAL: | 122 | case ACPI_RSD_LITERAL: |
| 123 | |||
| 123 | acpi_rs_out_string(name, | 124 | acpi_rs_out_string(name, |
| 124 | ACPI_CAST_PTR(char, table->pointer)); | 125 | ACPI_CAST_PTR(char, table->pointer)); |
| 125 | break; | 126 | break; |
| 126 | 127 | ||
| 127 | case ACPI_RSD_STRING: | 128 | case ACPI_RSD_STRING: |
| 129 | |||
| 128 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, target)); | 130 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, target)); |
| 129 | break; | 131 | break; |
| 130 | 132 | ||
| 131 | /* Data items, 8/16/32/64 bit */ | 133 | /* Data items, 8/16/32/64 bit */ |
| 132 | 134 | ||
| 133 | case ACPI_RSD_UINT8: | 135 | case ACPI_RSD_UINT8: |
| 136 | |||
| 134 | if (table->pointer) { | 137 | if (table->pointer) { |
| 135 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, | 138 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, |
| 136 | table-> | 139 | table-> |
| @@ -142,20 +145,24 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) | |||
| 142 | break; | 145 | break; |
| 143 | 146 | ||
| 144 | case ACPI_RSD_UINT16: | 147 | case ACPI_RSD_UINT16: |
| 148 | |||
| 145 | acpi_rs_out_integer16(name, ACPI_GET16(target)); | 149 | acpi_rs_out_integer16(name, ACPI_GET16(target)); |
| 146 | break; | 150 | break; |
| 147 | 151 | ||
| 148 | case ACPI_RSD_UINT32: | 152 | case ACPI_RSD_UINT32: |
| 153 | |||
| 149 | acpi_rs_out_integer32(name, ACPI_GET32(target)); | 154 | acpi_rs_out_integer32(name, ACPI_GET32(target)); |
| 150 | break; | 155 | break; |
| 151 | 156 | ||
| 152 | case ACPI_RSD_UINT64: | 157 | case ACPI_RSD_UINT64: |
| 158 | |||
| 153 | acpi_rs_out_integer64(name, ACPI_GET64(target)); | 159 | acpi_rs_out_integer64(name, ACPI_GET64(target)); |
| 154 | break; | 160 | break; |
| 155 | 161 | ||
| 156 | /* Flags: 1-bit and 2-bit flags supported */ | 162 | /* Flags: 1-bit and 2-bit flags supported */ |
| 157 | 163 | ||
| 158 | case ACPI_RSD_1BITFLAG: | 164 | case ACPI_RSD_1BITFLAG: |
| 165 | |||
| 159 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, | 166 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, |
| 160 | table-> | 167 | table-> |
| 161 | pointer[*target & | 168 | pointer[*target & |
| @@ -163,6 +170,7 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) | |||
| 163 | break; | 170 | break; |
| 164 | 171 | ||
| 165 | case ACPI_RSD_2BITFLAG: | 172 | case ACPI_RSD_2BITFLAG: |
| 173 | |||
| 166 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, | 174 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, |
| 167 | table-> | 175 | table-> |
| 168 | pointer[*target & | 176 | pointer[*target & |
| @@ -170,6 +178,7 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) | |||
| 170 | break; | 178 | break; |
| 171 | 179 | ||
| 172 | case ACPI_RSD_3BITFLAG: | 180 | case ACPI_RSD_3BITFLAG: |
| 181 | |||
| 173 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, | 182 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, |
| 174 | table-> | 183 | table-> |
| 175 | pointer[*target & | 184 | pointer[*target & |
| @@ -258,6 +267,7 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) | |||
| 258 | break; | 267 | break; |
| 259 | 268 | ||
| 260 | default: | 269 | default: |
| 270 | |||
| 261 | acpi_os_printf("**** Invalid table opcode [%X] ****\n", | 271 | acpi_os_printf("**** Invalid table opcode [%X] ****\n", |
| 262 | table->opcode); | 272 | table->opcode); |
| 263 | return; | 273 | return; |
diff --git a/drivers/acpi/acpica/rsmisc.c b/drivers/acpi/acpica/rsmisc.c index d5bf05a96096..80d12994e0d0 100644 --- a/drivers/acpi/acpica/rsmisc.c +++ b/drivers/acpi/acpica/rsmisc.c | |||
| @@ -194,7 +194,6 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, | |||
| 194 | break; | 194 | break; |
| 195 | 195 | ||
| 196 | case ACPI_RSC_COUNT_GPIO_RES: | 196 | case ACPI_RSC_COUNT_GPIO_RES: |
| 197 | |||
| 198 | /* | 197 | /* |
| 199 | * Vendor data is optional (length/offset may both be zero) | 198 | * Vendor data is optional (length/offset may both be zero) |
| 200 | * Examine vendor data length field first | 199 | * Examine vendor data length field first |
| @@ -410,12 +409,14 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, | |||
| 410 | */ | 409 | */ |
| 411 | switch (info->resource_offset) { | 410 | switch (info->resource_offset) { |
| 412 | case ACPI_RSC_COMPARE_AML_LENGTH: | 411 | case ACPI_RSC_COMPARE_AML_LENGTH: |
| 412 | |||
| 413 | if (aml_resource_length != info->value) { | 413 | if (aml_resource_length != info->value) { |
| 414 | goto exit; | 414 | goto exit; |
| 415 | } | 415 | } |
| 416 | break; | 416 | break; |
| 417 | 417 | ||
| 418 | case ACPI_RSC_COMPARE_VALUE: | 418 | case ACPI_RSC_COMPARE_VALUE: |
| 419 | |||
| 419 | if (ACPI_GET8(source) != info->value) { | 420 | if (ACPI_GET8(source) != info->value) { |
| 420 | goto exit; | 421 | goto exit; |
| 421 | } | 422 | } |
diff --git a/drivers/acpi/acpica/rsutils.c b/drivers/acpi/acpica/rsutils.c index a44953c6f75d..480b6b40c5ea 100644 --- a/drivers/acpi/acpica/rsutils.c +++ b/drivers/acpi/acpica/rsutils.c | |||
| @@ -147,6 +147,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) | |||
| 147 | case ACPI_RSC_MOVE_GPIO_RES: | 147 | case ACPI_RSC_MOVE_GPIO_RES: |
| 148 | case ACPI_RSC_MOVE_SERIAL_VEN: | 148 | case ACPI_RSC_MOVE_SERIAL_VEN: |
| 149 | case ACPI_RSC_MOVE_SERIAL_RES: | 149 | case ACPI_RSC_MOVE_SERIAL_RES: |
| 150 | |||
| 150 | ACPI_MEMCPY(destination, source, item_count); | 151 | ACPI_MEMCPY(destination, source, item_count); |
| 151 | return; | 152 | return; |
| 152 | 153 | ||
| @@ -157,21 +158,25 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) | |||
| 157 | */ | 158 | */ |
| 158 | case ACPI_RSC_MOVE16: | 159 | case ACPI_RSC_MOVE16: |
| 159 | case ACPI_RSC_MOVE_GPIO_PIN: | 160 | case ACPI_RSC_MOVE_GPIO_PIN: |
| 161 | |||
| 160 | ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i], | 162 | ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i], |
| 161 | &ACPI_CAST_PTR(u16, source)[i]); | 163 | &ACPI_CAST_PTR(u16, source)[i]); |
| 162 | break; | 164 | break; |
| 163 | 165 | ||
| 164 | case ACPI_RSC_MOVE32: | 166 | case ACPI_RSC_MOVE32: |
| 167 | |||
| 165 | ACPI_MOVE_32_TO_32(&ACPI_CAST_PTR(u32, destination)[i], | 168 | ACPI_MOVE_32_TO_32(&ACPI_CAST_PTR(u32, destination)[i], |
| 166 | &ACPI_CAST_PTR(u32, source)[i]); | 169 | &ACPI_CAST_PTR(u32, source)[i]); |
| 167 | break; | 170 | break; |
| 168 | 171 | ||
| 169 | case ACPI_RSC_MOVE64: | 172 | case ACPI_RSC_MOVE64: |
| 173 | |||
| 170 | ACPI_MOVE_64_TO_64(&ACPI_CAST_PTR(u64, destination)[i], | 174 | ACPI_MOVE_64_TO_64(&ACPI_CAST_PTR(u64, destination)[i], |
| 171 | &ACPI_CAST_PTR(u64, source)[i]); | 175 | &ACPI_CAST_PTR(u64, source)[i]); |
| 172 | break; | 176 | break; |
| 173 | 177 | ||
| 174 | default: | 178 | default: |
| 179 | |||
| 175 | return; | 180 | return; |
| 176 | } | 181 | } |
| 177 | } | 182 | } |
| @@ -736,7 +741,7 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node, | |||
| 736 | } | 741 | } |
| 737 | 742 | ||
| 738 | info->prefix_node = node; | 743 | info->prefix_node = node; |
| 739 | info->pathname = METHOD_NAME__SRS; | 744 | info->relative_pathname = METHOD_NAME__SRS; |
| 740 | info->parameters = args; | 745 | info->parameters = args; |
| 741 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 746 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
| 742 | 747 | ||
diff --git a/drivers/acpi/acpica/rsxface.c b/drivers/acpi/acpica/rsxface.c index c0e5d2d3ce67..94e3517554f9 100644 --- a/drivers/acpi/acpica/rsxface.c +++ b/drivers/acpi/acpica/rsxface.c | |||
| @@ -402,6 +402,7 @@ acpi_resource_to_address64(struct acpi_resource *resource, | |||
| 402 | break; | 402 | break; |
| 403 | 403 | ||
| 404 | default: | 404 | default: |
| 405 | |||
| 405 | return (AE_BAD_PARAMETER); | 406 | return (AE_BAD_PARAMETER); |
| 406 | } | 407 | } |
| 407 | 408 | ||
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c index e57cd38004e3..42a13c0d7015 100644 --- a/drivers/acpi/acpica/tbinstal.c +++ b/drivers/acpi/acpica/tbinstal.c | |||
| @@ -141,8 +141,7 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index) | |||
| 141 | ACPI_BIOS_ERROR((AE_INFO, | 141 | ACPI_BIOS_ERROR((AE_INFO, |
| 142 | "Table has invalid signature [%4.4s] (0x%8.8X), " | 142 | "Table has invalid signature [%4.4s] (0x%8.8X), " |
| 143 | "must be SSDT or OEMx", | 143 | "must be SSDT or OEMx", |
| 144 | acpi_ut_valid_acpi_name(*(u32 *)table_desc-> | 144 | acpi_ut_valid_acpi_name(table_desc->pointer-> |
| 145 | pointer-> | ||
| 146 | signature) ? | 145 | signature) ? |
| 147 | table_desc->pointer->signature : "????", | 146 | table_desc->pointer->signature : "????", |
| 148 | *(u32 *)table_desc->pointer->signature)); | 147 | *(u32 *)table_desc->pointer->signature)); |
| @@ -471,15 +470,19 @@ void acpi_tb_delete_table(struct acpi_table_desc *table_desc) | |||
| 471 | } | 470 | } |
| 472 | switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) { | 471 | switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) { |
| 473 | case ACPI_TABLE_ORIGIN_MAPPED: | 472 | case ACPI_TABLE_ORIGIN_MAPPED: |
| 473 | |||
| 474 | acpi_os_unmap_memory(table_desc->pointer, table_desc->length); | 474 | acpi_os_unmap_memory(table_desc->pointer, table_desc->length); |
| 475 | break; | 475 | break; |
| 476 | |||
| 476 | case ACPI_TABLE_ORIGIN_ALLOCATED: | 477 | case ACPI_TABLE_ORIGIN_ALLOCATED: |
| 478 | |||
| 477 | ACPI_FREE(table_desc->pointer); | 479 | ACPI_FREE(table_desc->pointer); |
| 478 | break; | 480 | break; |
| 479 | 481 | ||
| 480 | /* Not mapped or allocated, there is nothing we can do */ | 482 | /* Not mapped or allocated, there is nothing we can do */ |
| 481 | 483 | ||
| 482 | default: | 484 | default: |
| 485 | |||
| 483 | return; | 486 | return; |
| 484 | } | 487 | } |
| 485 | 488 | ||
diff --git a/drivers/acpi/acpica/tbprint.c b/drivers/acpi/acpica/tbprint.c new file mode 100644 index 000000000000..dc963f823d2c --- /dev/null +++ b/drivers/acpi/acpica/tbprint.c | |||
| @@ -0,0 +1,237 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * | ||
| 3 | * Module Name: tbprint - Table output utilities | ||
| 4 | * | ||
| 5 | *****************************************************************************/ | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Copyright (C) 2000 - 2013, Intel Corp. | ||
| 9 | * All rights reserved. | ||
| 10 | * | ||
| 11 | * Redistribution and use in source and binary forms, with or without | ||
| 12 | * modification, are permitted provided that the following conditions | ||
| 13 | * are met: | ||
| 14 | * 1. Redistributions of source code must retain the above copyright | ||
| 15 | * notice, this list of conditions, and the following disclaimer, | ||
| 16 | * without modification. | ||
| 17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
| 18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
| 19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
| 20 | * including a substantially similar Disclaimer requirement for further | ||
| 21 | * binary redistribution. | ||
| 22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
| 23 | * of any contributors may be used to endorse or promote products derived | ||
| 24 | * from this software without specific prior written permission. | ||
| 25 | * | ||
| 26 | * Alternatively, this software may be distributed under the terms of the | ||
| 27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
| 28 | * Software Foundation. | ||
| 29 | * | ||
| 30 | * NO WARRANTY | ||
| 31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
| 34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
| 40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 41 | * POSSIBILITY OF SUCH DAMAGES. | ||
| 42 | */ | ||
| 43 | |||
| 44 | #include <acpi/acpi.h> | ||
| 45 | #include "accommon.h" | ||
| 46 | #include "actables.h" | ||
| 47 | |||
| 48 | #define _COMPONENT ACPI_TABLES | ||
| 49 | ACPI_MODULE_NAME("tbprint") | ||
| 50 | |||
| 51 | /* Local prototypes */ | ||
| 52 | static void acpi_tb_fix_string(char *string, acpi_size length); | ||
| 53 | |||
| 54 | static void | ||
| 55 | acpi_tb_cleanup_table_header(struct acpi_table_header *out_header, | ||
| 56 | struct acpi_table_header *header); | ||
| 57 | |||
| 58 | /******************************************************************************* | ||
| 59 | * | ||
| 60 | * FUNCTION: acpi_tb_fix_string | ||
| 61 | * | ||
| 62 | * PARAMETERS: string - String to be repaired | ||
| 63 | * length - Maximum length | ||
| 64 | * | ||
| 65 | * RETURN: None | ||
| 66 | * | ||
| 67 | * DESCRIPTION: Replace every non-printable or non-ascii byte in the string | ||
| 68 | * with a question mark '?'. | ||
| 69 | * | ||
| 70 | ******************************************************************************/ | ||
| 71 | |||
| 72 | static void acpi_tb_fix_string(char *string, acpi_size length) | ||
| 73 | { | ||
| 74 | |||
| 75 | while (length && *string) { | ||
| 76 | if (!ACPI_IS_PRINT(*string)) { | ||
| 77 | *string = '?'; | ||
| 78 | } | ||
| 79 | string++; | ||
| 80 | length--; | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | /******************************************************************************* | ||
| 85 | * | ||
| 86 | * FUNCTION: acpi_tb_cleanup_table_header | ||
| 87 | * | ||
| 88 | * PARAMETERS: out_header - Where the cleaned header is returned | ||
| 89 | * header - Input ACPI table header | ||
| 90 | * | ||
| 91 | * RETURN: Returns the cleaned header in out_header | ||
| 92 | * | ||
| 93 | * DESCRIPTION: Copy the table header and ensure that all "string" fields in | ||
| 94 | * the header consist of printable characters. | ||
| 95 | * | ||
| 96 | ******************************************************************************/ | ||
| 97 | |||
| 98 | static void | ||
| 99 | acpi_tb_cleanup_table_header(struct acpi_table_header *out_header, | ||
| 100 | struct acpi_table_header *header) | ||
| 101 | { | ||
| 102 | |||
| 103 | ACPI_MEMCPY(out_header, header, sizeof(struct acpi_table_header)); | ||
| 104 | |||
| 105 | acpi_tb_fix_string(out_header->signature, ACPI_NAME_SIZE); | ||
| 106 | acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE); | ||
| 107 | acpi_tb_fix_string(out_header->oem_table_id, ACPI_OEM_TABLE_ID_SIZE); | ||
| 108 | acpi_tb_fix_string(out_header->asl_compiler_id, ACPI_NAME_SIZE); | ||
| 109 | } | ||
| 110 | |||
| 111 | /******************************************************************************* | ||
| 112 | * | ||
| 113 | * FUNCTION: acpi_tb_print_table_header | ||
| 114 | * | ||
| 115 | * PARAMETERS: address - Table physical address | ||
| 116 | * header - Table header | ||
| 117 | * | ||
| 118 | * RETURN: None | ||
| 119 | * | ||
| 120 | * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. | ||
| 121 | * | ||
| 122 | ******************************************************************************/ | ||
| 123 | |||
| 124 | void | ||
| 125 | acpi_tb_print_table_header(acpi_physical_address address, | ||
| 126 | struct acpi_table_header *header) | ||
| 127 | { | ||
| 128 | struct acpi_table_header local_header; | ||
| 129 | |||
| 130 | /* | ||
| 131 | * The reason that the Address is cast to a void pointer is so that we | ||
| 132 | * can use %p which will work properly on both 32-bit and 64-bit hosts. | ||
| 133 | */ | ||
| 134 | if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_FACS)) { | ||
| 135 | |||
| 136 | /* FACS only has signature and length fields */ | ||
| 137 | |||
| 138 | ACPI_INFO((AE_INFO, "%4.4s %p %05X", | ||
| 139 | header->signature, ACPI_CAST_PTR(void, address), | ||
| 140 | header->length)); | ||
| 141 | } else if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_RSDP)) { | ||
| 142 | |||
| 143 | /* RSDP has no common fields */ | ||
| 144 | |||
| 145 | ACPI_MEMCPY(local_header.oem_id, | ||
| 146 | ACPI_CAST_PTR(struct acpi_table_rsdp, | ||
| 147 | header)->oem_id, ACPI_OEM_ID_SIZE); | ||
| 148 | acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE); | ||
| 149 | |||
| 150 | ACPI_INFO((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)", | ||
| 151 | ACPI_CAST_PTR(void, address), | ||
| 152 | (ACPI_CAST_PTR(struct acpi_table_rsdp, header)-> | ||
| 153 | revision > | ||
| 154 | 0) ? ACPI_CAST_PTR(struct acpi_table_rsdp, | ||
| 155 | header)->length : 20, | ||
| 156 | ACPI_CAST_PTR(struct acpi_table_rsdp, | ||
| 157 | header)->revision, | ||
| 158 | local_header.oem_id)); | ||
| 159 | } else { | ||
| 160 | /* Standard ACPI table with full common header */ | ||
| 161 | |||
| 162 | acpi_tb_cleanup_table_header(&local_header, header); | ||
| 163 | |||
| 164 | ACPI_INFO((AE_INFO, | ||
| 165 | "%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)", | ||
| 166 | local_header.signature, ACPI_CAST_PTR(void, address), | ||
| 167 | local_header.length, local_header.revision, | ||
| 168 | local_header.oem_id, local_header.oem_table_id, | ||
| 169 | local_header.oem_revision, | ||
| 170 | local_header.asl_compiler_id, | ||
| 171 | local_header.asl_compiler_revision)); | ||
| 172 | } | ||
| 173 | } | ||
| 174 | |||
| 175 | /******************************************************************************* | ||
| 176 | * | ||
| 177 | * FUNCTION: acpi_tb_validate_checksum | ||
| 178 | * | ||
| 179 | * PARAMETERS: table - ACPI table to verify | ||
| 180 | * length - Length of entire table | ||
| 181 | * | ||
| 182 | * RETURN: Status | ||
| 183 | * | ||
| 184 | * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns | ||
| 185 | * exception on bad checksum. | ||
| 186 | * | ||
| 187 | ******************************************************************************/ | ||
| 188 | |||
| 189 | acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length) | ||
| 190 | { | ||
| 191 | u8 checksum; | ||
| 192 | |||
| 193 | /* Compute the checksum on the table */ | ||
| 194 | |||
| 195 | checksum = acpi_tb_checksum(ACPI_CAST_PTR(u8, table), length); | ||
| 196 | |||
| 197 | /* Checksum ok? (should be zero) */ | ||
| 198 | |||
| 199 | if (checksum) { | ||
| 200 | ACPI_BIOS_WARNING((AE_INFO, | ||
| 201 | "Incorrect checksum in table [%4.4s] - 0x%2.2X, " | ||
| 202 | "should be 0x%2.2X", | ||
| 203 | table->signature, table->checksum, | ||
| 204 | (u8)(table->checksum - checksum))); | ||
| 205 | |||
| 206 | #if (ACPI_CHECKSUM_ABORT) | ||
| 207 | return (AE_BAD_CHECKSUM); | ||
| 208 | #endif | ||
| 209 | } | ||
| 210 | |||
| 211 | return (AE_OK); | ||
| 212 | } | ||
| 213 | |||
| 214 | /******************************************************************************* | ||
| 215 | * | ||
| 216 | * FUNCTION: acpi_tb_checksum | ||
| 217 | * | ||
| 218 | * PARAMETERS: buffer - Pointer to memory region to be checked | ||
| 219 | * length - Length of this memory region | ||
| 220 | * | ||
| 221 | * RETURN: Checksum (u8) | ||
| 222 | * | ||
| 223 | * DESCRIPTION: Calculates circular checksum of memory region. | ||
| 224 | * | ||
| 225 | ******************************************************************************/ | ||
| 226 | |||
| 227 | u8 acpi_tb_checksum(u8 *buffer, u32 length) | ||
| 228 | { | ||
| 229 | u8 sum = 0; | ||
| 230 | u8 *end = buffer + length; | ||
| 231 | |||
| 232 | while (buffer < end) { | ||
| 233 | sum = (u8)(sum + *(buffer++)); | ||
| 234 | } | ||
| 235 | |||
| 236 | return (sum); | ||
| 237 | } | ||
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c index ce3d5db39a9c..bffdfc7b8322 100644 --- a/drivers/acpi/acpica/tbutils.c +++ b/drivers/acpi/acpica/tbutils.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /****************************************************************************** | 1 | /****************************************************************************** |
| 2 | * | 2 | * |
| 3 | * Module Name: tbutils - table utilities | 3 | * Module Name: tbutils - ACPI Table utilities |
| 4 | * | 4 | * |
| 5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
| 6 | 6 | ||
| @@ -49,12 +49,6 @@ | |||
| 49 | ACPI_MODULE_NAME("tbutils") | 49 | ACPI_MODULE_NAME("tbutils") |
| 50 | 50 | ||
| 51 | /* Local prototypes */ | 51 | /* Local prototypes */ |
| 52 | static void acpi_tb_fix_string(char *string, acpi_size length); | ||
| 53 | |||
| 54 | static void | ||
| 55 | acpi_tb_cleanup_table_header(struct acpi_table_header *out_header, | ||
| 56 | struct acpi_table_header *header); | ||
| 57 | |||
| 58 | static acpi_physical_address | 52 | static acpi_physical_address |
| 59 | acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size); | 53 | acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size); |
| 60 | 54 | ||
| @@ -176,189 +170,6 @@ u8 acpi_tb_tables_loaded(void) | |||
| 176 | 170 | ||
| 177 | /******************************************************************************* | 171 | /******************************************************************************* |
| 178 | * | 172 | * |
| 179 | * FUNCTION: acpi_tb_fix_string | ||
| 180 | * | ||
| 181 | * PARAMETERS: string - String to be repaired | ||
| 182 | * length - Maximum length | ||
| 183 | * | ||
| 184 | * RETURN: None | ||
| 185 | * | ||
| 186 | * DESCRIPTION: Replace every non-printable or non-ascii byte in the string | ||
| 187 | * with a question mark '?'. | ||
| 188 | * | ||
| 189 | ******************************************************************************/ | ||
| 190 | |||
| 191 | static void acpi_tb_fix_string(char *string, acpi_size length) | ||
| 192 | { | ||
| 193 | |||
| 194 | while (length && *string) { | ||
| 195 | if (!ACPI_IS_PRINT(*string)) { | ||
| 196 | *string = '?'; | ||
| 197 | } | ||
| 198 | string++; | ||
| 199 | length--; | ||
| 200 | } | ||
| 201 | } | ||
| 202 | |||
| 203 | /******************************************************************************* | ||
| 204 | * | ||
| 205 | * FUNCTION: acpi_tb_cleanup_table_header | ||
| 206 | * | ||
| 207 | * PARAMETERS: out_header - Where the cleaned header is returned | ||
| 208 | * header - Input ACPI table header | ||
| 209 | * | ||
| 210 | * RETURN: Returns the cleaned header in out_header | ||
| 211 | * | ||
| 212 | * DESCRIPTION: Copy the table header and ensure that all "string" fields in | ||
| 213 | * the header consist of printable characters. | ||
| 214 | * | ||
| 215 | ******************************************************************************/ | ||
| 216 | |||
| 217 | static void | ||
| 218 | acpi_tb_cleanup_table_header(struct acpi_table_header *out_header, | ||
| 219 | struct acpi_table_header *header) | ||
| 220 | { | ||
| 221 | |||
| 222 | ACPI_MEMCPY(out_header, header, sizeof(struct acpi_table_header)); | ||
| 223 | |||
| 224 | acpi_tb_fix_string(out_header->signature, ACPI_NAME_SIZE); | ||
| 225 | acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE); | ||
| 226 | acpi_tb_fix_string(out_header->oem_table_id, ACPI_OEM_TABLE_ID_SIZE); | ||
| 227 | acpi_tb_fix_string(out_header->asl_compiler_id, ACPI_NAME_SIZE); | ||
| 228 | } | ||
| 229 | |||
| 230 | /******************************************************************************* | ||
| 231 | * | ||
| 232 | * FUNCTION: acpi_tb_print_table_header | ||
| 233 | * | ||
| 234 | * PARAMETERS: address - Table physical address | ||
| 235 | * header - Table header | ||
| 236 | * | ||
| 237 | * RETURN: None | ||
| 238 | * | ||
| 239 | * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. | ||
| 240 | * | ||
| 241 | ******************************************************************************/ | ||
| 242 | |||
| 243 | void | ||
| 244 | acpi_tb_print_table_header(acpi_physical_address address, | ||
| 245 | struct acpi_table_header *header) | ||
| 246 | { | ||
| 247 | struct acpi_table_header local_header; | ||
| 248 | |||
| 249 | /* | ||
| 250 | * The reason that the Address is cast to a void pointer is so that we | ||
| 251 | * can use %p which will work properly on both 32-bit and 64-bit hosts. | ||
| 252 | */ | ||
| 253 | if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_FACS)) { | ||
| 254 | |||
| 255 | /* FACS only has signature and length fields */ | ||
| 256 | |||
| 257 | ACPI_INFO((AE_INFO, "%4.4s %p %05X", | ||
| 258 | header->signature, ACPI_CAST_PTR(void, address), | ||
| 259 | header->length)); | ||
| 260 | } else if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_RSDP)) { | ||
| 261 | |||
| 262 | /* RSDP has no common fields */ | ||
| 263 | |||
| 264 | ACPI_MEMCPY(local_header.oem_id, | ||
| 265 | ACPI_CAST_PTR(struct acpi_table_rsdp, | ||
| 266 | header)->oem_id, ACPI_OEM_ID_SIZE); | ||
| 267 | acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE); | ||
| 268 | |||
| 269 | ACPI_INFO((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)", | ||
| 270 | ACPI_CAST_PTR (void, address), | ||
| 271 | (ACPI_CAST_PTR(struct acpi_table_rsdp, header)-> | ||
| 272 | revision > | ||
| 273 | 0) ? ACPI_CAST_PTR(struct acpi_table_rsdp, | ||
| 274 | header)->length : 20, | ||
| 275 | ACPI_CAST_PTR(struct acpi_table_rsdp, | ||
| 276 | header)->revision, | ||
| 277 | local_header.oem_id)); | ||
| 278 | } else { | ||
| 279 | /* Standard ACPI table with full common header */ | ||
| 280 | |||
| 281 | acpi_tb_cleanup_table_header(&local_header, header); | ||
| 282 | |||
| 283 | ACPI_INFO((AE_INFO, | ||
| 284 | "%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)", | ||
| 285 | local_header.signature, ACPI_CAST_PTR(void, address), | ||
| 286 | local_header.length, local_header.revision, | ||
| 287 | local_header.oem_id, local_header.oem_table_id, | ||
| 288 | local_header.oem_revision, | ||
| 289 | local_header.asl_compiler_id, | ||
| 290 | local_header.asl_compiler_revision)); | ||
| 291 | |||
| 292 | } | ||
| 293 | } | ||
| 294 | |||
| 295 | /******************************************************************************* | ||
| 296 | * | ||
| 297 | * FUNCTION: acpi_tb_validate_checksum | ||
| 298 | * | ||
| 299 | * PARAMETERS: table - ACPI table to verify | ||
| 300 | * length - Length of entire table | ||
| 301 | * | ||
| 302 | * RETURN: Status | ||
| 303 | * | ||
| 304 | * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns | ||
| 305 | * exception on bad checksum. | ||
| 306 | * | ||
| 307 | ******************************************************************************/ | ||
| 308 | |||
| 309 | acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length) | ||
| 310 | { | ||
| 311 | u8 checksum; | ||
| 312 | |||
| 313 | /* Compute the checksum on the table */ | ||
| 314 | |||
| 315 | checksum = acpi_tb_checksum(ACPI_CAST_PTR(u8, table), length); | ||
| 316 | |||
| 317 | /* Checksum ok? (should be zero) */ | ||
| 318 | |||
| 319 | if (checksum) { | ||
| 320 | ACPI_BIOS_WARNING((AE_INFO, | ||
| 321 | "Incorrect checksum in table [%4.4s] - 0x%2.2X, " | ||
| 322 | "should be 0x%2.2X", | ||
| 323 | table->signature, table->checksum, | ||
| 324 | (u8)(table->checksum - checksum))); | ||
| 325 | |||
| 326 | #if (ACPI_CHECKSUM_ABORT) | ||
| 327 | |||
| 328 | return (AE_BAD_CHECKSUM); | ||
| 329 | #endif | ||
| 330 | } | ||
| 331 | |||
| 332 | return (AE_OK); | ||
| 333 | } | ||
| 334 | |||
| 335 | /******************************************************************************* | ||
| 336 | * | ||
| 337 | * FUNCTION: acpi_tb_checksum | ||
| 338 | * | ||
| 339 | * PARAMETERS: buffer - Pointer to memory region to be checked | ||
| 340 | * length - Length of this memory region | ||
| 341 | * | ||
| 342 | * RETURN: Checksum (u8) | ||
| 343 | * | ||
| 344 | * DESCRIPTION: Calculates circular checksum of memory region. | ||
| 345 | * | ||
| 346 | ******************************************************************************/ | ||
| 347 | |||
| 348 | u8 acpi_tb_checksum(u8 *buffer, u32 length) | ||
| 349 | { | ||
| 350 | u8 sum = 0; | ||
| 351 | u8 *end = buffer + length; | ||
| 352 | |||
| 353 | while (buffer < end) { | ||
| 354 | sum = (u8) (sum + *(buffer++)); | ||
| 355 | } | ||
| 356 | |||
| 357 | return (sum); | ||
| 358 | } | ||
| 359 | |||
| 360 | /******************************************************************************* | ||
| 361 | * | ||
| 362 | * FUNCTION: acpi_tb_check_dsdt_header | 173 | * FUNCTION: acpi_tb_check_dsdt_header |
| 363 | * | 174 | * |
| 364 | * PARAMETERS: None | 175 | * PARAMETERS: None |
diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c index 67e046ec8f0a..0ba9e328d5d7 100644 --- a/drivers/acpi/acpica/tbxfload.c +++ b/drivers/acpi/acpica/tbxfload.c | |||
| @@ -53,8 +53,6 @@ ACPI_MODULE_NAME("tbxfload") | |||
| 53 | /* Local prototypes */ | 53 | /* Local prototypes */ |
| 54 | static acpi_status acpi_tb_load_namespace(void); | 54 | static acpi_status acpi_tb_load_namespace(void); |
| 55 | 55 | ||
| 56 | static int no_auto_ssdt; | ||
| 57 | |||
| 58 | /******************************************************************************* | 56 | /******************************************************************************* |
| 59 | * | 57 | * |
| 60 | * FUNCTION: acpi_load_tables | 58 | * FUNCTION: acpi_load_tables |
| @@ -180,8 +178,16 @@ static acpi_status acpi_tb_load_namespace(void) | |||
| 180 | continue; | 178 | continue; |
| 181 | } | 179 | } |
| 182 | 180 | ||
| 183 | if (no_auto_ssdt) { | 181 | /* |
| 184 | printk(KERN_WARNING "ACPI: SSDT ignored due to \"acpi_no_auto_ssdt\"\n"); | 182 | * Optionally do not load any SSDTs from the RSDT/XSDT. This can |
| 183 | * be useful for debugging ACPI problems on some machines. | ||
| 184 | */ | ||
| 185 | if (acpi_gbl_disable_ssdt_table_load) { | ||
| 186 | ACPI_INFO((AE_INFO, "Ignoring %4.4s at %p", | ||
| 187 | acpi_gbl_root_table_list.tables[i].signature. | ||
| 188 | ascii, ACPI_CAST_PTR(void, | ||
| 189 | acpi_gbl_root_table_list. | ||
| 190 | tables[i].address))); | ||
| 185 | continue; | 191 | continue; |
| 186 | } | 192 | } |
| 187 | 193 | ||
| @@ -376,14 +382,3 @@ acpi_status acpi_unload_parent_table(acpi_handle object) | |||
| 376 | } | 382 | } |
| 377 | 383 | ||
| 378 | ACPI_EXPORT_SYMBOL(acpi_unload_parent_table) | 384 | ACPI_EXPORT_SYMBOL(acpi_unload_parent_table) |
| 379 | |||
| 380 | static int __init acpi_no_auto_ssdt_setup(char *s) { | ||
| 381 | |||
| 382 | printk(KERN_NOTICE "ACPI: SSDT auto-load disabled\n"); | ||
| 383 | |||
| 384 | no_auto_ssdt = 1; | ||
| 385 | |||
| 386 | return 1; | ||
| 387 | } | ||
| 388 | |||
| 389 | __setup("acpi_no_auto_ssdt", acpi_no_auto_ssdt_setup); | ||
diff --git a/drivers/acpi/acpica/utbuffer.c b/drivers/acpi/acpica/utbuffer.c new file mode 100644 index 000000000000..11fde93be120 --- /dev/null +++ b/drivers/acpi/acpica/utbuffer.c | |||
| @@ -0,0 +1,201 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * | ||
| 3 | * Module Name: utbuffer - Buffer dump routines | ||
| 4 | * | ||
| 5 | *****************************************************************************/ | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Copyright (C) 2000 - 2013, Intel Corp. | ||
| 9 | * All rights reserved. | ||
| 10 | * | ||
| 11 | * Redistribution and use in source and binary forms, with or without | ||
| 12 | * modification, are permitted provided that the following conditions | ||
| 13 | * are met: | ||
| 14 | * 1. Redistributions of source code must retain the above copyright | ||
| 15 | * notice, this list of conditions, and the following disclaimer, | ||
| 16 | * without modification. | ||
| 17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
| 18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
| 19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
| 20 | * including a substantially similar Disclaimer requirement for further | ||
| 21 | * binary redistribution. | ||
| 22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
| 23 | * of any contributors may be used to endorse or promote products derived | ||
| 24 | * from this software without specific prior written permission. | ||
| 25 | * | ||
| 26 | * Alternatively, this software may be distributed under the terms of the | ||
| 27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
| 28 | * Software Foundation. | ||
| 29 | * | ||
| 30 | * NO WARRANTY | ||
| 31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
| 34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
| 40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 41 | * POSSIBILITY OF SUCH DAMAGES. | ||
| 42 | */ | ||
| 43 | |||
| 44 | #include <acpi/acpi.h> | ||
| 45 | #include "accommon.h" | ||
| 46 | |||
| 47 | #define _COMPONENT ACPI_UTILITIES | ||
| 48 | ACPI_MODULE_NAME("utbuffer") | ||
| 49 | |||
| 50 | /******************************************************************************* | ||
| 51 | * | ||
| 52 | * FUNCTION: acpi_ut_dump_buffer | ||
| 53 | * | ||
| 54 | * PARAMETERS: buffer - Buffer to dump | ||
| 55 | * count - Amount to dump, in bytes | ||
| 56 | * display - BYTE, WORD, DWORD, or QWORD display: | ||
| 57 | * DB_BYTE_DISPLAY | ||
| 58 | * DB_WORD_DISPLAY | ||
| 59 | * DB_DWORD_DISPLAY | ||
| 60 | * DB_QWORD_DISPLAY | ||
| 61 | * base_offset - Beginning buffer offset (display only) | ||
| 62 | * | ||
| 63 | * RETURN: None | ||
| 64 | * | ||
| 65 | * DESCRIPTION: Generic dump buffer in both hex and ascii. | ||
| 66 | * | ||
| 67 | ******************************************************************************/ | ||
| 68 | void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset) | ||
| 69 | { | ||
| 70 | u32 i = 0; | ||
| 71 | u32 j; | ||
| 72 | u32 temp32; | ||
| 73 | u8 buf_char; | ||
| 74 | |||
| 75 | if (!buffer) { | ||
| 76 | acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n"); | ||
| 77 | return; | ||
| 78 | } | ||
| 79 | |||
| 80 | if ((count < 4) || (count & 0x01)) { | ||
| 81 | display = DB_BYTE_DISPLAY; | ||
| 82 | } | ||
| 83 | |||
| 84 | /* Nasty little dump buffer routine! */ | ||
| 85 | |||
| 86 | while (i < count) { | ||
| 87 | |||
| 88 | /* Print current offset */ | ||
| 89 | |||
| 90 | acpi_os_printf("%6.4X: ", (base_offset + i)); | ||
| 91 | |||
| 92 | /* Print 16 hex chars */ | ||
| 93 | |||
| 94 | for (j = 0; j < 16;) { | ||
| 95 | if (i + j >= count) { | ||
| 96 | |||
| 97 | /* Dump fill spaces */ | ||
| 98 | |||
| 99 | acpi_os_printf("%*s", ((display * 2) + 1), " "); | ||
| 100 | j += display; | ||
| 101 | continue; | ||
| 102 | } | ||
| 103 | |||
| 104 | switch (display) { | ||
| 105 | case DB_BYTE_DISPLAY: | ||
| 106 | default: /* Default is BYTE display */ | ||
| 107 | |||
| 108 | acpi_os_printf("%02X ", | ||
| 109 | buffer[(acpi_size) i + j]); | ||
| 110 | break; | ||
| 111 | |||
| 112 | case DB_WORD_DISPLAY: | ||
| 113 | |||
| 114 | ACPI_MOVE_16_TO_32(&temp32, | ||
| 115 | &buffer[(acpi_size) i + j]); | ||
| 116 | acpi_os_printf("%04X ", temp32); | ||
| 117 | break; | ||
| 118 | |||
| 119 | case DB_DWORD_DISPLAY: | ||
| 120 | |||
| 121 | ACPI_MOVE_32_TO_32(&temp32, | ||
| 122 | &buffer[(acpi_size) i + j]); | ||
| 123 | acpi_os_printf("%08X ", temp32); | ||
| 124 | break; | ||
| 125 | |||
| 126 | case DB_QWORD_DISPLAY: | ||
| 127 | |||
| 128 | ACPI_MOVE_32_TO_32(&temp32, | ||
| 129 | &buffer[(acpi_size) i + j]); | ||
| 130 | acpi_os_printf("%08X", temp32); | ||
| 131 | |||
| 132 | ACPI_MOVE_32_TO_32(&temp32, | ||
| 133 | &buffer[(acpi_size) i + j + | ||
| 134 | 4]); | ||
| 135 | acpi_os_printf("%08X ", temp32); | ||
| 136 | break; | ||
| 137 | } | ||
| 138 | |||
| 139 | j += display; | ||
| 140 | } | ||
| 141 | |||
| 142 | /* | ||
| 143 | * Print the ASCII equivalent characters but watch out for the bad | ||
| 144 | * unprintable ones (printable chars are 0x20 through 0x7E) | ||
| 145 | */ | ||
| 146 | acpi_os_printf(" "); | ||
| 147 | for (j = 0; j < 16; j++) { | ||
| 148 | if (i + j >= count) { | ||
| 149 | acpi_os_printf("\n"); | ||
| 150 | return; | ||
| 151 | } | ||
| 152 | |||
| 153 | buf_char = buffer[(acpi_size) i + j]; | ||
| 154 | if (ACPI_IS_PRINT(buf_char)) { | ||
| 155 | acpi_os_printf("%c", buf_char); | ||
| 156 | } else { | ||
| 157 | acpi_os_printf("."); | ||
| 158 | } | ||
| 159 | } | ||
| 160 | |||
| 161 | /* Done with that line. */ | ||
| 162 | |||
| 163 | acpi_os_printf("\n"); | ||
| 164 | i += 16; | ||
| 165 | } | ||
| 166 | |||
| 167 | return; | ||
| 168 | } | ||
| 169 | |||
| 170 | /******************************************************************************* | ||
| 171 | * | ||
| 172 | * FUNCTION: acpi_ut_debug_dump_buffer | ||
| 173 | * | ||
| 174 | * PARAMETERS: buffer - Buffer to dump | ||
| 175 | * count - Amount to dump, in bytes | ||
| 176 | * display - BYTE, WORD, DWORD, or QWORD display: | ||
| 177 | * DB_BYTE_DISPLAY | ||
| 178 | * DB_WORD_DISPLAY | ||
| 179 | * DB_DWORD_DISPLAY | ||
| 180 | * DB_QWORD_DISPLAY | ||
| 181 | * component_ID - Caller's component ID | ||
| 182 | * | ||
| 183 | * RETURN: None | ||
| 184 | * | ||
| 185 | * DESCRIPTION: Generic dump buffer in both hex and ascii. | ||
| 186 | * | ||
| 187 | ******************************************************************************/ | ||
| 188 | |||
| 189 | void | ||
| 190 | acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id) | ||
| 191 | { | ||
| 192 | |||
| 193 | /* Only dump the buffer if tracing is enabled */ | ||
| 194 | |||
| 195 | if (!((ACPI_LV_TABLES & acpi_dbg_level) && | ||
| 196 | (component_id & acpi_dbg_layer))) { | ||
| 197 | return; | ||
| 198 | } | ||
| 199 | |||
| 200 | acpi_ut_dump_buffer(buffer, count, display, 0); | ||
| 201 | } | ||
diff --git a/drivers/acpi/acpica/utcopy.c b/drivers/acpi/acpica/utcopy.c index e4c9291fc0a3..1731c27c36a6 100644 --- a/drivers/acpi/acpica/utcopy.c +++ b/drivers/acpi/acpica/utcopy.c | |||
| @@ -178,7 +178,6 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, | |||
| 178 | 178 | ||
| 179 | switch (internal_object->reference.class) { | 179 | switch (internal_object->reference.class) { |
| 180 | case ACPI_REFCLASS_NAME: | 180 | case ACPI_REFCLASS_NAME: |
| 181 | |||
| 182 | /* | 181 | /* |
| 183 | * For namepath, return the object handle ("reference") | 182 | * For namepath, return the object handle ("reference") |
| 184 | * We are referring to the namespace node | 183 | * We are referring to the namespace node |
| @@ -264,7 +263,6 @@ acpi_ut_copy_ielement_to_eelement(u8 object_type, | |||
| 264 | 263 | ||
| 265 | switch (object_type) { | 264 | switch (object_type) { |
| 266 | case ACPI_COPY_TYPE_SIMPLE: | 265 | case ACPI_COPY_TYPE_SIMPLE: |
| 267 | |||
| 268 | /* | 266 | /* |
| 269 | * This is a simple or null object | 267 | * This is a simple or null object |
| 270 | */ | 268 | */ |
| @@ -278,7 +276,6 @@ acpi_ut_copy_ielement_to_eelement(u8 object_type, | |||
| 278 | break; | 276 | break; |
| 279 | 277 | ||
| 280 | case ACPI_COPY_TYPE_PACKAGE: | 278 | case ACPI_COPY_TYPE_PACKAGE: |
| 281 | |||
| 282 | /* | 279 | /* |
| 283 | * Build the package object | 280 | * Build the package object |
| 284 | */ | 281 | */ |
| @@ -304,6 +301,7 @@ acpi_ut_copy_ielement_to_eelement(u8 object_type, | |||
| 304 | break; | 301 | break; |
| 305 | 302 | ||
| 306 | default: | 303 | default: |
| 304 | |||
| 307 | return (AE_BAD_PARAMETER); | 305 | return (AE_BAD_PARAMETER); |
| 308 | } | 306 | } |
| 309 | 307 | ||
| @@ -481,6 +479,7 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, | |||
| 481 | return_ACPI_STATUS(AE_OK); | 479 | return_ACPI_STATUS(AE_OK); |
| 482 | 480 | ||
| 483 | default: | 481 | default: |
| 482 | |||
| 484 | /* All other types are not supported */ | 483 | /* All other types are not supported */ |
| 485 | 484 | ||
| 486 | ACPI_ERROR((AE_INFO, | 485 | ACPI_ERROR((AE_INFO, |
| @@ -544,7 +543,9 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, | |||
| 544 | break; | 543 | break; |
| 545 | 544 | ||
| 546 | default: | 545 | default: |
| 546 | |||
| 547 | /* Other types can't get here */ | 547 | /* Other types can't get here */ |
| 548 | |||
| 548 | break; | 549 | break; |
| 549 | } | 550 | } |
| 550 | 551 | ||
| @@ -800,7 +801,9 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, | |||
| 800 | break; | 801 | break; |
| 801 | 802 | ||
| 802 | default: | 803 | default: |
| 804 | |||
| 803 | /* Nothing to do for other simple objects */ | 805 | /* Nothing to do for other simple objects */ |
| 806 | |||
| 804 | break; | 807 | break; |
| 805 | } | 808 | } |
| 806 | 809 | ||
| @@ -868,7 +871,6 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type, | |||
| 868 | break; | 871 | break; |
| 869 | 872 | ||
| 870 | case ACPI_COPY_TYPE_PACKAGE: | 873 | case ACPI_COPY_TYPE_PACKAGE: |
| 871 | |||
| 872 | /* | 874 | /* |
| 873 | * This object is a package - go down another nesting level | 875 | * This object is a package - go down another nesting level |
| 874 | * Create and build the package object | 876 | * Create and build the package object |
| @@ -891,6 +893,7 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type, | |||
| 891 | break; | 893 | break; |
| 892 | 894 | ||
| 893 | default: | 895 | default: |
| 896 | |||
| 894 | return (AE_BAD_PARAMETER); | 897 | return (AE_BAD_PARAMETER); |
| 895 | } | 898 | } |
| 896 | 899 | ||
diff --git a/drivers/acpi/acpica/utdebug.c b/drivers/acpi/acpica/utdebug.c index c57d9cc07ba9..5796e11a0671 100644 --- a/drivers/acpi/acpica/utdebug.c +++ b/drivers/acpi/acpica/utdebug.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /****************************************************************************** | 1 | /****************************************************************************** |
| 2 | * | 2 | * |
| 3 | * Module Name: utdebug - Debug print routines | 3 | * Module Name: utdebug - Debug print/trace routines |
| 4 | * | 4 | * |
| 5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
| 6 | 6 | ||
| @@ -543,149 +543,3 @@ acpi_ut_ptr_exit(u32 line_number, | |||
| 543 | } | 543 | } |
| 544 | 544 | ||
| 545 | #endif | 545 | #endif |
| 546 | |||
| 547 | /******************************************************************************* | ||
| 548 | * | ||
| 549 | * FUNCTION: acpi_ut_dump_buffer | ||
| 550 | * | ||
| 551 | * PARAMETERS: buffer - Buffer to dump | ||
| 552 | * count - Amount to dump, in bytes | ||
| 553 | * display - BYTE, WORD, DWORD, or QWORD display | ||
| 554 | * offset - Beginning buffer offset (display only) | ||
| 555 | * | ||
| 556 | * RETURN: None | ||
| 557 | * | ||
| 558 | * DESCRIPTION: Generic dump buffer in both hex and ascii. | ||
| 559 | * | ||
| 560 | ******************************************************************************/ | ||
| 561 | |||
| 562 | void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset) | ||
| 563 | { | ||
| 564 | u32 i = 0; | ||
| 565 | u32 j; | ||
| 566 | u32 temp32; | ||
| 567 | u8 buf_char; | ||
| 568 | |||
| 569 | if (!buffer) { | ||
| 570 | acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n"); | ||
| 571 | return; | ||
| 572 | } | ||
| 573 | |||
| 574 | if ((count < 4) || (count & 0x01)) { | ||
| 575 | display = DB_BYTE_DISPLAY; | ||
| 576 | } | ||
| 577 | |||
| 578 | /* Nasty little dump buffer routine! */ | ||
| 579 | |||
| 580 | while (i < count) { | ||
| 581 | |||
| 582 | /* Print current offset */ | ||
| 583 | |||
| 584 | acpi_os_printf("%6.4X: ", (base_offset + i)); | ||
| 585 | |||
| 586 | /* Print 16 hex chars */ | ||
| 587 | |||
| 588 | for (j = 0; j < 16;) { | ||
| 589 | if (i + j >= count) { | ||
| 590 | |||
| 591 | /* Dump fill spaces */ | ||
| 592 | |||
| 593 | acpi_os_printf("%*s", ((display * 2) + 1), " "); | ||
| 594 | j += display; | ||
| 595 | continue; | ||
| 596 | } | ||
| 597 | |||
| 598 | switch (display) { | ||
| 599 | case DB_BYTE_DISPLAY: | ||
| 600 | default: /* Default is BYTE display */ | ||
| 601 | |||
| 602 | acpi_os_printf("%02X ", | ||
| 603 | buffer[(acpi_size) i + j]); | ||
| 604 | break; | ||
| 605 | |||
| 606 | case DB_WORD_DISPLAY: | ||
| 607 | |||
| 608 | ACPI_MOVE_16_TO_32(&temp32, | ||
| 609 | &buffer[(acpi_size) i + j]); | ||
| 610 | acpi_os_printf("%04X ", temp32); | ||
| 611 | break; | ||
| 612 | |||
| 613 | case DB_DWORD_DISPLAY: | ||
| 614 | |||
| 615 | ACPI_MOVE_32_TO_32(&temp32, | ||
| 616 | &buffer[(acpi_size) i + j]); | ||
| 617 | acpi_os_printf("%08X ", temp32); | ||
| 618 | break; | ||
| 619 | |||
| 620 | case DB_QWORD_DISPLAY: | ||
| 621 | |||
| 622 | ACPI_MOVE_32_TO_32(&temp32, | ||
| 623 | &buffer[(acpi_size) i + j]); | ||
| 624 | acpi_os_printf("%08X", temp32); | ||
| 625 | |||
| 626 | ACPI_MOVE_32_TO_32(&temp32, | ||
| 627 | &buffer[(acpi_size) i + j + | ||
| 628 | 4]); | ||
| 629 | acpi_os_printf("%08X ", temp32); | ||
| 630 | break; | ||
| 631 | } | ||
| 632 | |||
| 633 | j += display; | ||
| 634 | } | ||
| 635 | |||
| 636 | /* | ||
| 637 | * Print the ASCII equivalent characters but watch out for the bad | ||
| 638 | * unprintable ones (printable chars are 0x20 through 0x7E) | ||
| 639 | */ | ||
| 640 | acpi_os_printf(" "); | ||
| 641 | for (j = 0; j < 16; j++) { | ||
| 642 | if (i + j >= count) { | ||
| 643 | acpi_os_printf("\n"); | ||
| 644 | return; | ||
| 645 | } | ||
| 646 | |||
| 647 | buf_char = buffer[(acpi_size) i + j]; | ||
| 648 | if (ACPI_IS_PRINT(buf_char)) { | ||
| 649 | acpi_os_printf("%c", buf_char); | ||
| 650 | } else { | ||
| 651 | acpi_os_printf("."); | ||
| 652 | } | ||
| 653 | } | ||
| 654 | |||
| 655 | /* Done with that line. */ | ||
| 656 | |||
| 657 | acpi_os_printf("\n"); | ||
| 658 | i += 16; | ||
| 659 | } | ||
| 660 | |||
| 661 | return; | ||
| 662 | } | ||
| 663 | |||
| 664 | /******************************************************************************* | ||
| 665 | * | ||
| 666 | * FUNCTION: acpi_ut_debug_dump_buffer | ||
| 667 | * | ||
| 668 | * PARAMETERS: buffer - Buffer to dump | ||
| 669 | * count - Amount to dump, in bytes | ||
| 670 | * display - BYTE, WORD, DWORD, or QWORD display | ||
| 671 | * component_ID - Caller's component ID | ||
| 672 | * | ||
| 673 | * RETURN: None | ||
| 674 | * | ||
| 675 | * DESCRIPTION: Generic dump buffer in both hex and ascii. | ||
| 676 | * | ||
| 677 | ******************************************************************************/ | ||
| 678 | |||
| 679 | void | ||
| 680 | acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id) | ||
| 681 | { | ||
| 682 | |||
| 683 | /* Only dump the buffer if tracing is enabled */ | ||
| 684 | |||
| 685 | if (!((ACPI_LV_TABLES & acpi_dbg_level) && | ||
| 686 | (component_id & acpi_dbg_layer))) { | ||
| 687 | return; | ||
| 688 | } | ||
| 689 | |||
| 690 | acpi_ut_dump_buffer(buffer, count, display, 0); | ||
| 691 | } | ||
diff --git a/drivers/acpi/acpica/utdelete.c b/drivers/acpi/acpica/utdelete.c index 29b930250b6f..d6b33f29d327 100644 --- a/drivers/acpi/acpica/utdelete.c +++ b/drivers/acpi/acpica/utdelete.c | |||
| @@ -303,6 +303,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object) | |||
| 303 | break; | 303 | break; |
| 304 | 304 | ||
| 305 | default: | 305 | default: |
| 306 | |||
| 306 | break; | 307 | break; |
| 307 | } | 308 | } |
| 308 | 309 | ||
| @@ -508,7 +509,6 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action) | |||
| 508 | case ACPI_TYPE_PROCESSOR: | 509 | case ACPI_TYPE_PROCESSOR: |
| 509 | case ACPI_TYPE_POWER: | 510 | case ACPI_TYPE_POWER: |
| 510 | case ACPI_TYPE_THERMAL: | 511 | case ACPI_TYPE_THERMAL: |
| 511 | |||
| 512 | /* | 512 | /* |
| 513 | * Update the notify objects for these types (if present) | 513 | * Update the notify objects for these types (if present) |
| 514 | * Two lists, system and device notify handlers. | 514 | * Two lists, system and device notify handlers. |
| @@ -623,6 +623,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action) | |||
| 623 | 623 | ||
| 624 | case ACPI_TYPE_REGION: | 624 | case ACPI_TYPE_REGION: |
| 625 | default: | 625 | default: |
| 626 | |||
| 626 | break; /* No subobjects for all other types */ | 627 | break; /* No subobjects for all other types */ |
| 627 | } | 628 | } |
| 628 | 629 | ||
diff --git a/drivers/acpi/acpica/uterror.c b/drivers/acpi/acpica/uterror.c new file mode 100644 index 000000000000..154fdcaa5830 --- /dev/null +++ b/drivers/acpi/acpica/uterror.c | |||
| @@ -0,0 +1,289 @@ | |||
| 1 | /******************************************************************************* | ||
| 2 | * | ||
| 3 | * Module Name: uterror - Various internal error/warning output functions | ||
| 4 | * | ||
| 5 | ******************************************************************************/ | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Copyright (C) 2000 - 2013, Intel Corp. | ||
| 9 | * All rights reserved. | ||
| 10 | * | ||
| 11 | * Redistribution and use in source and binary forms, with or without | ||
| 12 | * modification, are permitted provided that the following conditions | ||
| 13 | * are met: | ||
| 14 | * 1. Redistributions of source code must retain the above copyright | ||
| 15 | * notice, this list of conditions, and the following disclaimer, | ||
| 16 | * without modification. | ||
| 17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
| 18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
| 19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
| 20 | * including a substantially similar Disclaimer requirement for further | ||
| 21 | * binary redistribution. | ||
| 22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
| 23 | * of any contributors may be used to endorse or promote products derived | ||
| 24 | * from this software without specific prior written permission. | ||
| 25 | * | ||
| 26 | * Alternatively, this software may be distributed under the terms of the | ||
| 27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
| 28 | * Software Foundation. | ||
| 29 | * | ||
| 30 | * NO WARRANTY | ||
| 31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
| 34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
| 40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 41 | * POSSIBILITY OF SUCH DAMAGES. | ||
| 42 | */ | ||
| 43 | |||
| 44 | #include <acpi/acpi.h> | ||
| 45 | #include "accommon.h" | ||
| 46 | #include "acnamesp.h" | ||
| 47 | |||
| 48 | #define _COMPONENT ACPI_UTILITIES | ||
| 49 | ACPI_MODULE_NAME("uterror") | ||
| 50 | |||
| 51 | /* | ||
| 52 | * This module contains internal error functions that may | ||
| 53 | * be configured out. | ||
| 54 | */ | ||
| 55 | #if !defined (ACPI_NO_ERROR_MESSAGES) | ||
| 56 | /******************************************************************************* | ||
| 57 | * | ||
| 58 | * FUNCTION: acpi_ut_predefined_warning | ||
| 59 | * | ||
| 60 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 61 | * line_number - Caller's line number (for error output) | ||
| 62 | * pathname - Full pathname to the node | ||
| 63 | * node_flags - From Namespace node for the method/object | ||
| 64 | * format - Printf format string + additional args | ||
| 65 | * | ||
| 66 | * RETURN: None | ||
| 67 | * | ||
| 68 | * DESCRIPTION: Warnings for the predefined validation module. Messages are | ||
| 69 | * only emitted the first time a problem with a particular | ||
| 70 | * method/object is detected. This prevents a flood of error | ||
| 71 | * messages for methods that are repeatedly evaluated. | ||
| 72 | * | ||
| 73 | ******************************************************************************/ | ||
| 74 | void ACPI_INTERNAL_VAR_XFACE | ||
| 75 | acpi_ut_predefined_warning(const char *module_name, | ||
| 76 | u32 line_number, | ||
| 77 | char *pathname, | ||
| 78 | u8 node_flags, const char *format, ...) | ||
| 79 | { | ||
| 80 | va_list arg_list; | ||
| 81 | |||
| 82 | /* | ||
| 83 | * Warning messages for this method/object will be disabled after the | ||
| 84 | * first time a validation fails or an object is successfully repaired. | ||
| 85 | */ | ||
| 86 | if (node_flags & ANOBJ_EVALUATED) { | ||
| 87 | return; | ||
| 88 | } | ||
| 89 | |||
| 90 | acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname); | ||
| 91 | |||
| 92 | va_start(arg_list, format); | ||
| 93 | acpi_os_vprintf(format, arg_list); | ||
| 94 | ACPI_MSG_SUFFIX; | ||
| 95 | va_end(arg_list); | ||
| 96 | } | ||
| 97 | |||
| 98 | /******************************************************************************* | ||
| 99 | * | ||
| 100 | * FUNCTION: acpi_ut_predefined_info | ||
| 101 | * | ||
| 102 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 103 | * line_number - Caller's line number (for error output) | ||
| 104 | * pathname - Full pathname to the node | ||
| 105 | * node_flags - From Namespace node for the method/object | ||
| 106 | * format - Printf format string + additional args | ||
| 107 | * | ||
| 108 | * RETURN: None | ||
| 109 | * | ||
| 110 | * DESCRIPTION: Info messages for the predefined validation module. Messages | ||
| 111 | * are only emitted the first time a problem with a particular | ||
| 112 | * method/object is detected. This prevents a flood of | ||
| 113 | * messages for methods that are repeatedly evaluated. | ||
| 114 | * | ||
| 115 | ******************************************************************************/ | ||
| 116 | |||
| 117 | void ACPI_INTERNAL_VAR_XFACE | ||
| 118 | acpi_ut_predefined_info(const char *module_name, | ||
| 119 | u32 line_number, | ||
| 120 | char *pathname, u8 node_flags, const char *format, ...) | ||
| 121 | { | ||
| 122 | va_list arg_list; | ||
| 123 | |||
| 124 | /* | ||
| 125 | * Warning messages for this method/object will be disabled after the | ||
| 126 | * first time a validation fails or an object is successfully repaired. | ||
| 127 | */ | ||
| 128 | if (node_flags & ANOBJ_EVALUATED) { | ||
| 129 | return; | ||
| 130 | } | ||
| 131 | |||
| 132 | acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname); | ||
| 133 | |||
| 134 | va_start(arg_list, format); | ||
| 135 | acpi_os_vprintf(format, arg_list); | ||
| 136 | ACPI_MSG_SUFFIX; | ||
| 137 | va_end(arg_list); | ||
| 138 | } | ||
| 139 | |||
| 140 | /******************************************************************************* | ||
| 141 | * | ||
| 142 | * FUNCTION: acpi_ut_predefined_bios_error | ||
| 143 | * | ||
| 144 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 145 | * line_number - Caller's line number (for error output) | ||
| 146 | * pathname - Full pathname to the node | ||
| 147 | * node_flags - From Namespace node for the method/object | ||
| 148 | * format - Printf format string + additional args | ||
| 149 | * | ||
| 150 | * RETURN: None | ||
| 151 | * | ||
| 152 | * DESCRIPTION: BIOS error message for predefined names. Messages | ||
| 153 | * are only emitted the first time a problem with a particular | ||
| 154 | * method/object is detected. This prevents a flood of | ||
| 155 | * messages for methods that are repeatedly evaluated. | ||
| 156 | * | ||
| 157 | ******************************************************************************/ | ||
| 158 | |||
| 159 | void ACPI_INTERNAL_VAR_XFACE | ||
| 160 | acpi_ut_predefined_bios_error(const char *module_name, | ||
| 161 | u32 line_number, | ||
| 162 | char *pathname, | ||
| 163 | u8 node_flags, const char *format, ...) | ||
| 164 | { | ||
| 165 | va_list arg_list; | ||
| 166 | |||
| 167 | /* | ||
| 168 | * Warning messages for this method/object will be disabled after the | ||
| 169 | * first time a validation fails or an object is successfully repaired. | ||
| 170 | */ | ||
| 171 | if (node_flags & ANOBJ_EVALUATED) { | ||
| 172 | return; | ||
| 173 | } | ||
| 174 | |||
| 175 | acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname); | ||
| 176 | |||
| 177 | va_start(arg_list, format); | ||
| 178 | acpi_os_vprintf(format, arg_list); | ||
| 179 | ACPI_MSG_SUFFIX; | ||
| 180 | va_end(arg_list); | ||
| 181 | } | ||
| 182 | |||
| 183 | /******************************************************************************* | ||
| 184 | * | ||
| 185 | * FUNCTION: acpi_ut_namespace_error | ||
| 186 | * | ||
| 187 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 188 | * line_number - Caller's line number (for error output) | ||
| 189 | * internal_name - Name or path of the namespace node | ||
| 190 | * lookup_status - Exception code from NS lookup | ||
| 191 | * | ||
| 192 | * RETURN: None | ||
| 193 | * | ||
| 194 | * DESCRIPTION: Print error message with the full pathname for the NS node. | ||
| 195 | * | ||
| 196 | ******************************************************************************/ | ||
| 197 | |||
| 198 | void | ||
| 199 | acpi_ut_namespace_error(const char *module_name, | ||
| 200 | u32 line_number, | ||
| 201 | const char *internal_name, acpi_status lookup_status) | ||
| 202 | { | ||
| 203 | acpi_status status; | ||
| 204 | u32 bad_name; | ||
| 205 | char *name = NULL; | ||
| 206 | |||
| 207 | ACPI_MSG_REDIRECT_BEGIN; | ||
| 208 | acpi_os_printf(ACPI_MSG_ERROR); | ||
| 209 | |||
| 210 | if (lookup_status == AE_BAD_CHARACTER) { | ||
| 211 | |||
| 212 | /* There is a non-ascii character in the name */ | ||
| 213 | |||
| 214 | ACPI_MOVE_32_TO_32(&bad_name, | ||
| 215 | ACPI_CAST_PTR(u32, internal_name)); | ||
| 216 | acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name); | ||
| 217 | } else { | ||
| 218 | /* Convert path to external format */ | ||
| 219 | |||
| 220 | status = acpi_ns_externalize_name(ACPI_UINT32_MAX, | ||
| 221 | internal_name, NULL, &name); | ||
| 222 | |||
| 223 | /* Print target name */ | ||
| 224 | |||
| 225 | if (ACPI_SUCCESS(status)) { | ||
| 226 | acpi_os_printf("[%s]", name); | ||
| 227 | } else { | ||
| 228 | acpi_os_printf("[COULD NOT EXTERNALIZE NAME]"); | ||
| 229 | } | ||
| 230 | |||
| 231 | if (name) { | ||
| 232 | ACPI_FREE(name); | ||
| 233 | } | ||
| 234 | } | ||
| 235 | |||
| 236 | acpi_os_printf(" Namespace lookup failure, %s", | ||
| 237 | acpi_format_exception(lookup_status)); | ||
| 238 | |||
| 239 | ACPI_MSG_SUFFIX; | ||
| 240 | ACPI_MSG_REDIRECT_END; | ||
| 241 | } | ||
| 242 | |||
| 243 | /******************************************************************************* | ||
| 244 | * | ||
| 245 | * FUNCTION: acpi_ut_method_error | ||
| 246 | * | ||
| 247 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 248 | * line_number - Caller's line number (for error output) | ||
| 249 | * message - Error message to use on failure | ||
| 250 | * prefix_node - Prefix relative to the path | ||
| 251 | * path - Path to the node (optional) | ||
| 252 | * method_status - Execution status | ||
| 253 | * | ||
| 254 | * RETURN: None | ||
| 255 | * | ||
| 256 | * DESCRIPTION: Print error message with the full pathname for the method. | ||
| 257 | * | ||
| 258 | ******************************************************************************/ | ||
| 259 | |||
| 260 | void | ||
| 261 | acpi_ut_method_error(const char *module_name, | ||
| 262 | u32 line_number, | ||
| 263 | const char *message, | ||
| 264 | struct acpi_namespace_node *prefix_node, | ||
| 265 | const char *path, acpi_status method_status) | ||
| 266 | { | ||
| 267 | acpi_status status; | ||
| 268 | struct acpi_namespace_node *node = prefix_node; | ||
| 269 | |||
| 270 | ACPI_MSG_REDIRECT_BEGIN; | ||
| 271 | acpi_os_printf(ACPI_MSG_ERROR); | ||
| 272 | |||
| 273 | if (path) { | ||
| 274 | status = | ||
| 275 | acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH, | ||
| 276 | &node); | ||
| 277 | if (ACPI_FAILURE(status)) { | ||
| 278 | acpi_os_printf("[Could not get node by pathname]"); | ||
| 279 | } | ||
| 280 | } | ||
| 281 | |||
| 282 | acpi_ns_print_node_pathname(node, message); | ||
| 283 | acpi_os_printf(", %s", acpi_format_exception(method_status)); | ||
| 284 | |||
| 285 | ACPI_MSG_SUFFIX; | ||
| 286 | ACPI_MSG_REDIRECT_END; | ||
| 287 | } | ||
| 288 | |||
| 289 | #endif /* ACPI_NO_ERROR_MESSAGES */ | ||
diff --git a/drivers/acpi/acpica/uteval.c b/drivers/acpi/acpica/uteval.c index c3f3a7e7bdc7..ee83adb97b1e 100644 --- a/drivers/acpi/acpica/uteval.c +++ b/drivers/acpi/acpica/uteval.c | |||
| @@ -68,7 +68,7 @@ ACPI_MODULE_NAME("uteval") | |||
| 68 | ******************************************************************************/ | 68 | ******************************************************************************/ |
| 69 | 69 | ||
| 70 | acpi_status | 70 | acpi_status |
| 71 | acpi_ut_evaluate_object(struct acpi_namespace_node * prefix_node, | 71 | acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node, |
| 72 | char *path, | 72 | char *path, |
| 73 | u32 expected_return_btypes, | 73 | u32 expected_return_btypes, |
| 74 | union acpi_operand_object **return_desc) | 74 | union acpi_operand_object **return_desc) |
| @@ -87,7 +87,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node * prefix_node, | |||
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | info->prefix_node = prefix_node; | 89 | info->prefix_node = prefix_node; |
| 90 | info->pathname = path; | 90 | info->relative_pathname = path; |
| 91 | 91 | ||
| 92 | /* Evaluate the object/method */ | 92 | /* Evaluate the object/method */ |
| 93 | 93 | ||
| @@ -123,22 +123,27 @@ acpi_ut_evaluate_object(struct acpi_namespace_node * prefix_node, | |||
| 123 | 123 | ||
| 124 | switch ((info->return_object)->common.type) { | 124 | switch ((info->return_object)->common.type) { |
| 125 | case ACPI_TYPE_INTEGER: | 125 | case ACPI_TYPE_INTEGER: |
| 126 | |||
| 126 | return_btype = ACPI_BTYPE_INTEGER; | 127 | return_btype = ACPI_BTYPE_INTEGER; |
| 127 | break; | 128 | break; |
| 128 | 129 | ||
| 129 | case ACPI_TYPE_BUFFER: | 130 | case ACPI_TYPE_BUFFER: |
| 131 | |||
| 130 | return_btype = ACPI_BTYPE_BUFFER; | 132 | return_btype = ACPI_BTYPE_BUFFER; |
| 131 | break; | 133 | break; |
| 132 | 134 | ||
| 133 | case ACPI_TYPE_STRING: | 135 | case ACPI_TYPE_STRING: |
| 136 | |||
| 134 | return_btype = ACPI_BTYPE_STRING; | 137 | return_btype = ACPI_BTYPE_STRING; |
| 135 | break; | 138 | break; |
| 136 | 139 | ||
| 137 | case ACPI_TYPE_PACKAGE: | 140 | case ACPI_TYPE_PACKAGE: |
| 141 | |||
| 138 | return_btype = ACPI_BTYPE_PACKAGE; | 142 | return_btype = ACPI_BTYPE_PACKAGE; |
| 139 | break; | 143 | break; |
| 140 | 144 | ||
| 141 | default: | 145 | default: |
| 146 | |||
| 142 | return_btype = 0; | 147 | return_btype = 0; |
| 143 | break; | 148 | break; |
| 144 | } | 149 | } |
diff --git a/drivers/acpi/acpica/utexcep.c b/drivers/acpi/acpica/utexcep.c index b543a144941a..ff6d9e8aa842 100644 --- a/drivers/acpi/acpica/utexcep.c +++ b/drivers/acpi/acpica/utexcep.c | |||
| @@ -146,6 +146,7 @@ const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status) | |||
| 146 | break; | 146 | break; |
| 147 | 147 | ||
| 148 | default: | 148 | default: |
| 149 | |||
| 149 | break; | 150 | break; |
| 150 | } | 151 | } |
| 151 | 152 | ||
diff --git a/drivers/acpi/acpica/utids.c b/drivers/acpi/acpica/utids.c index 43a170a74a61..fa69071db418 100644 --- a/drivers/acpi/acpica/utids.c +++ b/drivers/acpi/acpica/utids.c | |||
| @@ -341,14 +341,17 @@ acpi_ut_execute_CID(struct acpi_namespace_node *device_node, | |||
| 341 | 341 | ||
| 342 | switch (cid_objects[i]->common.type) { | 342 | switch (cid_objects[i]->common.type) { |
| 343 | case ACPI_TYPE_INTEGER: | 343 | case ACPI_TYPE_INTEGER: |
| 344 | |||
| 344 | string_area_size += ACPI_EISAID_STRING_SIZE; | 345 | string_area_size += ACPI_EISAID_STRING_SIZE; |
| 345 | break; | 346 | break; |
| 346 | 347 | ||
| 347 | case ACPI_TYPE_STRING: | 348 | case ACPI_TYPE_STRING: |
| 349 | |||
| 348 | string_area_size += cid_objects[i]->string.length + 1; | 350 | string_area_size += cid_objects[i]->string.length + 1; |
| 349 | break; | 351 | break; |
| 350 | 352 | ||
| 351 | default: | 353 | default: |
| 354 | |||
| 352 | status = AE_TYPE; | 355 | status = AE_TYPE; |
| 353 | goto cleanup; | 356 | goto cleanup; |
| 354 | } | 357 | } |
diff --git a/drivers/acpi/acpica/utmisc.c b/drivers/acpi/acpica/utmisc.c index 785fdd07ae56..02f9101b65e4 100644 --- a/drivers/acpi/acpica/utmisc.c +++ b/drivers/acpi/acpica/utmisc.c | |||
| @@ -382,10 +382,12 @@ acpi_ut_display_init_pathname(u8 type, | |||
| 382 | 382 | ||
| 383 | switch (type) { | 383 | switch (type) { |
| 384 | case ACPI_TYPE_METHOD: | 384 | case ACPI_TYPE_METHOD: |
| 385 | |||
| 385 | acpi_os_printf("Executing "); | 386 | acpi_os_printf("Executing "); |
| 386 | break; | 387 | break; |
| 387 | 388 | ||
| 388 | default: | 389 | default: |
| 390 | |||
| 389 | acpi_os_printf("Initializing "); | 391 | acpi_os_printf("Initializing "); |
| 390 | break; | 392 | break; |
| 391 | } | 393 | } |
diff --git a/drivers/acpi/acpica/utobject.c b/drivers/acpi/acpica/utobject.c index 1099f5c069f8..aa61f66ee861 100644 --- a/drivers/acpi/acpica/utobject.c +++ b/drivers/acpi/acpica/utobject.c | |||
| @@ -129,6 +129,7 @@ union acpi_operand_object *acpi_ut_create_internal_object_dbg(const char | |||
| 129 | break; | 129 | break; |
| 130 | 130 | ||
| 131 | default: | 131 | default: |
| 132 | |||
| 132 | /* All others have no secondary object */ | 133 | /* All others have no secondary object */ |
| 133 | break; | 134 | break; |
| 134 | } | 135 | } |
| @@ -353,6 +354,7 @@ u8 acpi_ut_valid_internal_object(void *object) | |||
| 353 | return (TRUE); | 354 | return (TRUE); |
| 354 | 355 | ||
| 355 | default: | 356 | default: |
| 357 | |||
| 356 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | 358 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
| 357 | "%p is not not an ACPI operand obj [%s]\n", | 359 | "%p is not not an ACPI operand obj [%s]\n", |
| 358 | object, acpi_ut_get_descriptor_name(object))); | 360 | object, acpi_ut_get_descriptor_name(object))); |
| @@ -509,7 +511,6 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
| 509 | 511 | ||
| 510 | switch (internal_object->reference.class) { | 512 | switch (internal_object->reference.class) { |
| 511 | case ACPI_REFCLASS_NAME: | 513 | case ACPI_REFCLASS_NAME: |
| 512 | |||
| 513 | /* | 514 | /* |
| 514 | * Get the actual length of the full pathname to this object. | 515 | * Get the actual length of the full pathname to this object. |
| 515 | * The reference will be converted to the pathname to the object | 516 | * The reference will be converted to the pathname to the object |
| @@ -525,7 +526,6 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
| 525 | break; | 526 | break; |
| 526 | 527 | ||
| 527 | default: | 528 | default: |
| 528 | |||
| 529 | /* | 529 | /* |
| 530 | * No other reference opcodes are supported. | 530 | * No other reference opcodes are supported. |
| 531 | * Notably, Locals and Args are not supported, but this may be | 531 | * Notably, Locals and Args are not supported, but this may be |
| @@ -585,7 +585,6 @@ acpi_ut_get_element_length(u8 object_type, | |||
| 585 | 585 | ||
| 586 | switch (object_type) { | 586 | switch (object_type) { |
| 587 | case ACPI_COPY_TYPE_SIMPLE: | 587 | case ACPI_COPY_TYPE_SIMPLE: |
| 588 | |||
| 589 | /* | 588 | /* |
| 590 | * Simple object - just get the size (Null object/entry is handled | 589 | * Simple object - just get the size (Null object/entry is handled |
| 591 | * here also) and sum it into the running package length | 590 | * here also) and sum it into the running package length |
diff --git a/drivers/acpi/acpica/utpredef.c b/drivers/acpi/acpica/utpredef.c index 29459479148f..2b1ce4cd3207 100644 --- a/drivers/acpi/acpica/utpredef.c +++ b/drivers/acpi/acpica/utpredef.c | |||
| @@ -147,6 +147,11 @@ void acpi_ut_get_expected_return_types(char *buffer, u32 expected_btypes) | |||
| 147 | u32 i; | 147 | u32 i; |
| 148 | u32 j; | 148 | u32 j; |
| 149 | 149 | ||
| 150 | if (!expected_btypes) { | ||
| 151 | ACPI_STRCPY(buffer, "NONE"); | ||
| 152 | return; | ||
| 153 | } | ||
| 154 | |||
| 150 | j = 1; | 155 | j = 1; |
| 151 | buffer[0] = 0; | 156 | buffer[0] = 0; |
| 152 | this_rtype = ACPI_RTYPE_INTEGER; | 157 | this_rtype = ACPI_RTYPE_INTEGER; |
| @@ -328,9 +333,7 @@ static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types) | |||
| 328 | 333 | ||
| 329 | /* First field in the types list is the count of args to follow */ | 334 | /* First field in the types list is the count of args to follow */ |
| 330 | 335 | ||
| 331 | arg_count = (argument_types & METHOD_ARG_MASK); | 336 | arg_count = METHOD_GET_ARG_COUNT(argument_types); |
| 332 | argument_types >>= METHOD_ARG_BIT_WIDTH; | ||
| 333 | |||
| 334 | if (arg_count > METHOD_PREDEF_ARGS_MAX) { | 337 | if (arg_count > METHOD_PREDEF_ARGS_MAX) { |
| 335 | printf("**** Invalid argument count (%u) " | 338 | printf("**** Invalid argument count (%u) " |
| 336 | "in predefined info structure\n", arg_count); | 339 | "in predefined info structure\n", arg_count); |
| @@ -340,7 +343,8 @@ static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types) | |||
| 340 | /* Get each argument from the list, convert to ascii, store to buffer */ | 343 | /* Get each argument from the list, convert to ascii, store to buffer */ |
| 341 | 344 | ||
| 342 | for (i = 0; i < arg_count; i++) { | 345 | for (i = 0; i < arg_count; i++) { |
| 343 | this_argument_type = (argument_types & METHOD_ARG_MASK); | 346 | this_argument_type = METHOD_GET_NEXT_TYPE(argument_types); |
| 347 | |||
| 344 | if (!this_argument_type | 348 | if (!this_argument_type |
| 345 | || (this_argument_type > METHOD_MAX_ARG_TYPE)) { | 349 | || (this_argument_type > METHOD_MAX_ARG_TYPE)) { |
| 346 | printf("**** Invalid argument type (%u) " | 350 | printf("**** Invalid argument type (%u) " |
| @@ -351,10 +355,6 @@ static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types) | |||
| 351 | 355 | ||
| 352 | strcat(buffer, | 356 | strcat(buffer, |
| 353 | ut_external_type_names[this_argument_type] + sub_index); | 357 | ut_external_type_names[this_argument_type] + sub_index); |
| 354 | |||
| 355 | /* Shift to next argument type field */ | ||
| 356 | |||
| 357 | argument_types >>= METHOD_ARG_BIT_WIDTH; | ||
| 358 | sub_index = 0; | 358 | sub_index = 0; |
| 359 | } | 359 | } |
| 360 | 360 | ||
diff --git a/drivers/acpi/acpica/utstring.c b/drivers/acpi/acpica/utstring.c index b3e36a81aa4d..c53759b76a3f 100644 --- a/drivers/acpi/acpica/utstring.c +++ b/drivers/acpi/acpica/utstring.c | |||
| @@ -186,10 +186,13 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) | |||
| 186 | switch (base) { | 186 | switch (base) { |
| 187 | case ACPI_ANY_BASE: | 187 | case ACPI_ANY_BASE: |
| 188 | case 16: | 188 | case 16: |
| 189 | |||
| 189 | break; | 190 | break; |
| 190 | 191 | ||
| 191 | default: | 192 | default: |
| 193 | |||
| 192 | /* Invalid Base */ | 194 | /* Invalid Base */ |
| 195 | |||
| 193 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 196 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 194 | } | 197 | } |
| 195 | 198 | ||
| @@ -355,36 +358,44 @@ void acpi_ut_print_string(char *string, u8 max_length) | |||
| 355 | 358 | ||
| 356 | switch (string[i]) { | 359 | switch (string[i]) { |
| 357 | case 0x07: | 360 | case 0x07: |
| 361 | |||
| 358 | acpi_os_printf("\\a"); /* BELL */ | 362 | acpi_os_printf("\\a"); /* BELL */ |
| 359 | break; | 363 | break; |
| 360 | 364 | ||
| 361 | case 0x08: | 365 | case 0x08: |
| 366 | |||
| 362 | acpi_os_printf("\\b"); /* BACKSPACE */ | 367 | acpi_os_printf("\\b"); /* BACKSPACE */ |
| 363 | break; | 368 | break; |
| 364 | 369 | ||
| 365 | case 0x0C: | 370 | case 0x0C: |
| 371 | |||
| 366 | acpi_os_printf("\\f"); /* FORMFEED */ | 372 | acpi_os_printf("\\f"); /* FORMFEED */ |
| 367 | break; | 373 | break; |
| 368 | 374 | ||
| 369 | case 0x0A: | 375 | case 0x0A: |
| 376 | |||
| 370 | acpi_os_printf("\\n"); /* LINEFEED */ | 377 | acpi_os_printf("\\n"); /* LINEFEED */ |
| 371 | break; | 378 | break; |
| 372 | 379 | ||
| 373 | case 0x0D: | 380 | case 0x0D: |
| 381 | |||
| 374 | acpi_os_printf("\\r"); /* CARRIAGE RETURN */ | 382 | acpi_os_printf("\\r"); /* CARRIAGE RETURN */ |
| 375 | break; | 383 | break; |
| 376 | 384 | ||
| 377 | case 0x09: | 385 | case 0x09: |
| 386 | |||
| 378 | acpi_os_printf("\\t"); /* HORIZONTAL TAB */ | 387 | acpi_os_printf("\\t"); /* HORIZONTAL TAB */ |
| 379 | break; | 388 | break; |
| 380 | 389 | ||
| 381 | case 0x0B: | 390 | case 0x0B: |
| 391 | |||
| 382 | acpi_os_printf("\\v"); /* VERTICAL TAB */ | 392 | acpi_os_printf("\\v"); /* VERTICAL TAB */ |
| 383 | break; | 393 | break; |
| 384 | 394 | ||
| 385 | case '\'': /* Single Quote */ | 395 | case '\'': /* Single Quote */ |
| 386 | case '\"': /* Double Quote */ | 396 | case '\"': /* Double Quote */ |
| 387 | case '\\': /* Backslash */ | 397 | case '\\': /* Backslash */ |
| 398 | |||
| 388 | acpi_os_printf("\\%c", (int)string[i]); | 399 | acpi_os_printf("\\%c", (int)string[i]); |
| 389 | break; | 400 | break; |
| 390 | 401 | ||
| @@ -451,7 +462,8 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position) | |||
| 451 | * | 462 | * |
| 452 | * FUNCTION: acpi_ut_valid_acpi_name | 463 | * FUNCTION: acpi_ut_valid_acpi_name |
| 453 | * | 464 | * |
| 454 | * PARAMETERS: name - The name to be examined | 465 | * PARAMETERS: name - The name to be examined. Does not have to |
| 466 | * be NULL terminated string. | ||
| 455 | * | 467 | * |
| 456 | * RETURN: TRUE if the name is valid, FALSE otherwise | 468 | * RETURN: TRUE if the name is valid, FALSE otherwise |
| 457 | * | 469 | * |
| @@ -462,15 +474,14 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position) | |||
| 462 | * | 474 | * |
| 463 | ******************************************************************************/ | 475 | ******************************************************************************/ |
| 464 | 476 | ||
| 465 | u8 acpi_ut_valid_acpi_name(u32 name) | 477 | u8 acpi_ut_valid_acpi_name(char *name) |
| 466 | { | 478 | { |
| 467 | u32 i; | 479 | u32 i; |
| 468 | 480 | ||
| 469 | ACPI_FUNCTION_ENTRY(); | 481 | ACPI_FUNCTION_ENTRY(); |
| 470 | 482 | ||
| 471 | for (i = 0; i < ACPI_NAME_SIZE; i++) { | 483 | for (i = 0; i < ACPI_NAME_SIZE; i++) { |
| 472 | if (!acpi_ut_valid_acpi_char | 484 | if (!acpi_ut_valid_acpi_char(name[i], i)) { |
| 473 | ((ACPI_CAST_PTR(char, &name))[i], i)) { | ||
| 474 | return (FALSE); | 485 | return (FALSE); |
| 475 | } | 486 | } |
| 476 | } | 487 | } |
diff --git a/drivers/acpi/acpica/uttrack.c b/drivers/acpi/acpica/uttrack.c index 62774c7b76a8..160f13f4aab5 100644 --- a/drivers/acpi/acpica/uttrack.c +++ b/drivers/acpi/acpica/uttrack.c | |||
| @@ -603,6 +603,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 603 | switch (ACPI_GET_DESCRIPTOR_TYPE | 603 | switch (ACPI_GET_DESCRIPTOR_TYPE |
| 604 | (descriptor)) { | 604 | (descriptor)) { |
| 605 | case ACPI_DESC_TYPE_OPERAND: | 605 | case ACPI_DESC_TYPE_OPERAND: |
| 606 | |||
| 606 | if (element->size == | 607 | if (element->size == |
| 607 | sizeof(union | 608 | sizeof(union |
| 608 | acpi_operand_object)) | 609 | acpi_operand_object)) |
| @@ -613,6 +614,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 613 | break; | 614 | break; |
| 614 | 615 | ||
| 615 | case ACPI_DESC_TYPE_PARSER: | 616 | case ACPI_DESC_TYPE_PARSER: |
| 617 | |||
| 616 | if (element->size == | 618 | if (element->size == |
| 617 | sizeof(union | 619 | sizeof(union |
| 618 | acpi_parse_object)) { | 620 | acpi_parse_object)) { |
| @@ -622,6 +624,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 622 | break; | 624 | break; |
| 623 | 625 | ||
| 624 | case ACPI_DESC_TYPE_NAMED: | 626 | case ACPI_DESC_TYPE_NAMED: |
| 627 | |||
| 625 | if (element->size == | 628 | if (element->size == |
| 626 | sizeof(struct | 629 | sizeof(struct |
| 627 | acpi_namespace_node)) | 630 | acpi_namespace_node)) |
| @@ -632,6 +635,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 632 | break; | 635 | break; |
| 633 | 636 | ||
| 634 | default: | 637 | default: |
| 638 | |||
| 635 | break; | 639 | break; |
| 636 | } | 640 | } |
| 637 | 641 | ||
| @@ -639,6 +643,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 639 | 643 | ||
| 640 | switch (descriptor_type) { | 644 | switch (descriptor_type) { |
| 641 | case ACPI_DESC_TYPE_OPERAND: | 645 | case ACPI_DESC_TYPE_OPERAND: |
| 646 | |||
| 642 | acpi_os_printf | 647 | acpi_os_printf |
| 643 | ("%12.12s RefCount 0x%04X\n", | 648 | ("%12.12s RefCount 0x%04X\n", |
| 644 | acpi_ut_get_type_name | 649 | acpi_ut_get_type_name |
| @@ -649,6 +654,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 649 | break; | 654 | break; |
| 650 | 655 | ||
| 651 | case ACPI_DESC_TYPE_PARSER: | 656 | case ACPI_DESC_TYPE_PARSER: |
| 657 | |||
| 652 | acpi_os_printf | 658 | acpi_os_printf |
| 653 | ("AmlOpcode 0x%04hX\n", | 659 | ("AmlOpcode 0x%04hX\n", |
| 654 | descriptor->op.asl. | 660 | descriptor->op.asl. |
| @@ -656,6 +662,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 656 | break; | 662 | break; |
| 657 | 663 | ||
| 658 | case ACPI_DESC_TYPE_NAMED: | 664 | case ACPI_DESC_TYPE_NAMED: |
| 665 | |||
| 659 | acpi_os_printf("%4.4s\n", | 666 | acpi_os_printf("%4.4s\n", |
| 660 | acpi_ut_get_node_name | 667 | acpi_ut_get_node_name |
| 661 | (&descriptor-> | 668 | (&descriptor-> |
| @@ -663,6 +670,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) | |||
| 663 | break; | 670 | break; |
| 664 | 671 | ||
| 665 | default: | 672 | default: |
| 673 | |||
| 666 | acpi_os_printf("\n"); | 674 | acpi_os_printf("\n"); |
| 667 | break; | 675 | break; |
| 668 | } | 676 | } |
diff --git a/drivers/acpi/acpica/utxferror.c b/drivers/acpi/acpica/utxferror.c index 976b6c734fce..e966a2e47b76 100644 --- a/drivers/acpi/acpica/utxferror.c +++ b/drivers/acpi/acpica/utxferror.c | |||
| @@ -44,7 +44,6 @@ | |||
| 44 | #include <linux/export.h> | 44 | #include <linux/export.h> |
| 45 | #include <acpi/acpi.h> | 45 | #include <acpi/acpi.h> |
| 46 | #include "accommon.h" | 46 | #include "accommon.h" |
| 47 | #include "acnamesp.h" | ||
| 48 | 47 | ||
| 49 | #define _COMPONENT ACPI_UTILITIES | 48 | #define _COMPONENT ACPI_UTILITIES |
| 50 | ACPI_MODULE_NAME("utxferror") | 49 | ACPI_MODULE_NAME("utxferror") |
| @@ -52,43 +51,7 @@ ACPI_MODULE_NAME("utxferror") | |||
| 52 | /* | 51 | /* |
| 53 | * This module is used for the in-kernel ACPICA as well as the ACPICA | 52 | * This module is used for the in-kernel ACPICA as well as the ACPICA |
| 54 | * tools/applications. | 53 | * tools/applications. |
| 55 | * | ||
| 56 | * For the iASL compiler case, the output is redirected to stderr so that | ||
| 57 | * any of the various ACPI errors and warnings do not appear in the output | ||
| 58 | * files, for either the compiler or disassembler portions of the tool. | ||
| 59 | */ | 54 | */ |
| 60 | #ifdef ACPI_ASL_COMPILER | ||
| 61 | #include <stdio.h> | ||
| 62 | extern FILE *acpi_gbl_output_file; | ||
| 63 | |||
| 64 | #define ACPI_MSG_REDIRECT_BEGIN \ | ||
| 65 | FILE *output_file = acpi_gbl_output_file; \ | ||
| 66 | acpi_os_redirect_output (stderr); | ||
| 67 | |||
| 68 | #define ACPI_MSG_REDIRECT_END \ | ||
| 69 | acpi_os_redirect_output (output_file); | ||
| 70 | |||
| 71 | #else | ||
| 72 | /* | ||
| 73 | * non-iASL case - no redirection, nothing to do | ||
| 74 | */ | ||
| 75 | #define ACPI_MSG_REDIRECT_BEGIN | ||
| 76 | #define ACPI_MSG_REDIRECT_END | ||
| 77 | #endif | ||
| 78 | /* | ||
| 79 | * Common message prefixes | ||
| 80 | */ | ||
| 81 | #define ACPI_MSG_ERROR "ACPI Error: " | ||
| 82 | #define ACPI_MSG_EXCEPTION "ACPI Exception: " | ||
| 83 | #define ACPI_MSG_WARNING "ACPI Warning: " | ||
| 84 | #define ACPI_MSG_INFO "ACPI: " | ||
| 85 | #define ACPI_MSG_BIOS_ERROR "ACPI BIOS Bug: Error: " | ||
| 86 | #define ACPI_MSG_BIOS_WARNING "ACPI BIOS Bug: Warning: " | ||
| 87 | /* | ||
| 88 | * Common message suffix | ||
| 89 | */ | ||
| 90 | #define ACPI_MSG_SUFFIX \ | ||
| 91 | acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number) | ||
| 92 | /******************************************************************************* | 55 | /******************************************************************************* |
| 93 | * | 56 | * |
| 94 | * FUNCTION: acpi_error | 57 | * FUNCTION: acpi_error |
| @@ -285,200 +248,3 @@ acpi_bios_warning(const char *module_name, | |||
| 285 | } | 248 | } |
| 286 | 249 | ||
| 287 | ACPI_EXPORT_SYMBOL(acpi_bios_warning) | 250 | ACPI_EXPORT_SYMBOL(acpi_bios_warning) |
| 288 | |||
| 289 | /* | ||
| 290 | * The remainder of this module contains internal error functions that may | ||
| 291 | * be configured out. | ||
| 292 | */ | ||
| 293 | #if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP) | ||
| 294 | /******************************************************************************* | ||
| 295 | * | ||
| 296 | * FUNCTION: acpi_ut_predefined_warning | ||
| 297 | * | ||
| 298 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 299 | * line_number - Caller's line number (for error output) | ||
| 300 | * pathname - Full pathname to the node | ||
| 301 | * node_flags - From Namespace node for the method/object | ||
| 302 | * format - Printf format string + additional args | ||
| 303 | * | ||
| 304 | * RETURN: None | ||
| 305 | * | ||
| 306 | * DESCRIPTION: Warnings for the predefined validation module. Messages are | ||
| 307 | * only emitted the first time a problem with a particular | ||
| 308 | * method/object is detected. This prevents a flood of error | ||
| 309 | * messages for methods that are repeatedly evaluated. | ||
| 310 | * | ||
| 311 | ******************************************************************************/ | ||
| 312 | void ACPI_INTERNAL_VAR_XFACE | ||
| 313 | acpi_ut_predefined_warning(const char *module_name, | ||
| 314 | u32 line_number, | ||
| 315 | char *pathname, | ||
| 316 | u8 node_flags, const char *format, ...) | ||
| 317 | { | ||
| 318 | va_list arg_list; | ||
| 319 | |||
| 320 | /* | ||
| 321 | * Warning messages for this method/object will be disabled after the | ||
| 322 | * first time a validation fails or an object is successfully repaired. | ||
| 323 | */ | ||
| 324 | if (node_flags & ANOBJ_EVALUATED) { | ||
| 325 | return; | ||
| 326 | } | ||
| 327 | |||
| 328 | acpi_os_printf(ACPI_MSG_WARNING "For %s: ", pathname); | ||
| 329 | |||
| 330 | va_start(arg_list, format); | ||
| 331 | acpi_os_vprintf(format, arg_list); | ||
| 332 | ACPI_MSG_SUFFIX; | ||
| 333 | va_end(arg_list); | ||
| 334 | } | ||
| 335 | |||
| 336 | /******************************************************************************* | ||
| 337 | * | ||
| 338 | * FUNCTION: acpi_ut_predefined_info | ||
| 339 | * | ||
| 340 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 341 | * line_number - Caller's line number (for error output) | ||
| 342 | * pathname - Full pathname to the node | ||
| 343 | * node_flags - From Namespace node for the method/object | ||
| 344 | * format - Printf format string + additional args | ||
| 345 | * | ||
| 346 | * RETURN: None | ||
| 347 | * | ||
| 348 | * DESCRIPTION: Info messages for the predefined validation module. Messages | ||
| 349 | * are only emitted the first time a problem with a particular | ||
| 350 | * method/object is detected. This prevents a flood of | ||
| 351 | * messages for methods that are repeatedly evaluated. | ||
| 352 | * | ||
| 353 | ******************************************************************************/ | ||
| 354 | |||
| 355 | void ACPI_INTERNAL_VAR_XFACE | ||
| 356 | acpi_ut_predefined_info(const char *module_name, | ||
| 357 | u32 line_number, | ||
| 358 | char *pathname, u8 node_flags, const char *format, ...) | ||
| 359 | { | ||
| 360 | va_list arg_list; | ||
| 361 | |||
| 362 | /* | ||
| 363 | * Warning messages for this method/object will be disabled after the | ||
| 364 | * first time a validation fails or an object is successfully repaired. | ||
| 365 | */ | ||
| 366 | if (node_flags & ANOBJ_EVALUATED) { | ||
| 367 | return; | ||
| 368 | } | ||
| 369 | |||
| 370 | acpi_os_printf(ACPI_MSG_INFO "For %s: ", pathname); | ||
| 371 | |||
| 372 | va_start(arg_list, format); | ||
| 373 | acpi_os_vprintf(format, arg_list); | ||
| 374 | ACPI_MSG_SUFFIX; | ||
| 375 | va_end(arg_list); | ||
| 376 | } | ||
| 377 | |||
| 378 | /******************************************************************************* | ||
| 379 | * | ||
| 380 | * FUNCTION: acpi_ut_namespace_error | ||
| 381 | * | ||
| 382 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 383 | * line_number - Caller's line number (for error output) | ||
| 384 | * internal_name - Name or path of the namespace node | ||
| 385 | * lookup_status - Exception code from NS lookup | ||
| 386 | * | ||
| 387 | * RETURN: None | ||
| 388 | * | ||
| 389 | * DESCRIPTION: Print error message with the full pathname for the NS node. | ||
| 390 | * | ||
| 391 | ******************************************************************************/ | ||
| 392 | |||
| 393 | void | ||
| 394 | acpi_ut_namespace_error(const char *module_name, | ||
| 395 | u32 line_number, | ||
| 396 | const char *internal_name, acpi_status lookup_status) | ||
| 397 | { | ||
| 398 | acpi_status status; | ||
| 399 | u32 bad_name; | ||
| 400 | char *name = NULL; | ||
| 401 | |||
| 402 | ACPI_MSG_REDIRECT_BEGIN; | ||
| 403 | acpi_os_printf(ACPI_MSG_ERROR); | ||
| 404 | |||
| 405 | if (lookup_status == AE_BAD_CHARACTER) { | ||
| 406 | |||
| 407 | /* There is a non-ascii character in the name */ | ||
| 408 | |||
| 409 | ACPI_MOVE_32_TO_32(&bad_name, | ||
| 410 | ACPI_CAST_PTR(u32, internal_name)); | ||
| 411 | acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name); | ||
| 412 | } else { | ||
| 413 | /* Convert path to external format */ | ||
| 414 | |||
| 415 | status = acpi_ns_externalize_name(ACPI_UINT32_MAX, | ||
| 416 | internal_name, NULL, &name); | ||
| 417 | |||
| 418 | /* Print target name */ | ||
| 419 | |||
| 420 | if (ACPI_SUCCESS(status)) { | ||
| 421 | acpi_os_printf("[%s]", name); | ||
| 422 | } else { | ||
| 423 | acpi_os_printf("[COULD NOT EXTERNALIZE NAME]"); | ||
| 424 | } | ||
| 425 | |||
| 426 | if (name) { | ||
| 427 | ACPI_FREE(name); | ||
| 428 | } | ||
| 429 | } | ||
| 430 | |||
| 431 | acpi_os_printf(" Namespace lookup failure, %s", | ||
| 432 | acpi_format_exception(lookup_status)); | ||
| 433 | |||
| 434 | ACPI_MSG_SUFFIX; | ||
| 435 | ACPI_MSG_REDIRECT_END; | ||
| 436 | } | ||
| 437 | |||
| 438 | /******************************************************************************* | ||
| 439 | * | ||
| 440 | * FUNCTION: acpi_ut_method_error | ||
| 441 | * | ||
| 442 | * PARAMETERS: module_name - Caller's module name (for error output) | ||
| 443 | * line_number - Caller's line number (for error output) | ||
| 444 | * message - Error message to use on failure | ||
| 445 | * prefix_node - Prefix relative to the path | ||
| 446 | * path - Path to the node (optional) | ||
| 447 | * method_status - Execution status | ||
| 448 | * | ||
| 449 | * RETURN: None | ||
| 450 | * | ||
| 451 | * DESCRIPTION: Print error message with the full pathname for the method. | ||
| 452 | * | ||
| 453 | ******************************************************************************/ | ||
| 454 | |||
| 455 | void | ||
| 456 | acpi_ut_method_error(const char *module_name, | ||
| 457 | u32 line_number, | ||
| 458 | const char *message, | ||
| 459 | struct acpi_namespace_node *prefix_node, | ||
| 460 | const char *path, acpi_status method_status) | ||
| 461 | { | ||
| 462 | acpi_status status; | ||
| 463 | struct acpi_namespace_node *node = prefix_node; | ||
| 464 | |||
| 465 | ACPI_MSG_REDIRECT_BEGIN; | ||
| 466 | acpi_os_printf(ACPI_MSG_ERROR); | ||
| 467 | |||
| 468 | if (path) { | ||
| 469 | status = | ||
| 470 | acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH, | ||
| 471 | &node); | ||
| 472 | if (ACPI_FAILURE(status)) { | ||
| 473 | acpi_os_printf("[Could not get node by pathname]"); | ||
| 474 | } | ||
| 475 | } | ||
| 476 | |||
| 477 | acpi_ns_print_node_pathname(node, message); | ||
| 478 | acpi_os_printf(", %s", acpi_format_exception(method_status)); | ||
| 479 | |||
| 480 | ACPI_MSG_SUFFIX; | ||
| 481 | ACPI_MSG_REDIRECT_END; | ||
| 482 | } | ||
| 483 | |||
| 484 | #endif /* ACPI_NO_ERROR_MESSAGES */ | ||
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index fd363b57a596..5f3597b87f27 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
| @@ -290,6 +290,26 @@ int acpi_bus_init_power(struct acpi_device *device) | |||
| 290 | return 0; | 290 | return 0; |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | /** | ||
| 294 | * acpi_device_fix_up_power - Force device with missing _PSC into D0. | ||
| 295 | * @device: Device object whose power state is to be fixed up. | ||
| 296 | * | ||
| 297 | * Devices without power resources and _PSC, but having _PS0 and _PS3 defined, | ||
| 298 | * are assumed to be put into D0 by the BIOS. However, in some cases that may | ||
| 299 | * not be the case and this function should be used then. | ||
| 300 | */ | ||
| 301 | int acpi_device_fix_up_power(struct acpi_device *device) | ||
| 302 | { | ||
| 303 | int ret = 0; | ||
| 304 | |||
| 305 | if (!device->power.flags.power_resources | ||
| 306 | && !device->power.flags.explicit_get | ||
| 307 | && device->power.state == ACPI_STATE_D0) | ||
| 308 | ret = acpi_dev_pm_explicit_set(device, ACPI_STATE_D0); | ||
| 309 | |||
| 310 | return ret; | ||
| 311 | } | ||
| 312 | |||
| 293 | int acpi_bus_update_power(acpi_handle handle, int *state_p) | 313 | int acpi_bus_update_power(acpi_handle handle, int *state_p) |
| 294 | { | 314 | { |
| 295 | struct acpi_device *device; | 315 | struct acpi_device *device; |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 4fdea381ef21..14de9f46972e 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
| @@ -66,20 +66,21 @@ struct dock_station { | |||
| 66 | spinlock_t dd_lock; | 66 | spinlock_t dd_lock; |
| 67 | struct mutex hp_lock; | 67 | struct mutex hp_lock; |
| 68 | struct list_head dependent_devices; | 68 | struct list_head dependent_devices; |
| 69 | struct list_head hotplug_devices; | ||
| 70 | 69 | ||
| 71 | struct list_head sibling; | 70 | struct list_head sibling; |
| 72 | struct platform_device *dock_device; | 71 | struct platform_device *dock_device; |
| 73 | }; | 72 | }; |
| 74 | static LIST_HEAD(dock_stations); | 73 | static LIST_HEAD(dock_stations); |
| 75 | static int dock_station_count; | 74 | static int dock_station_count; |
| 75 | static DEFINE_MUTEX(hotplug_lock); | ||
| 76 | 76 | ||
| 77 | struct dock_dependent_device { | 77 | struct dock_dependent_device { |
| 78 | struct list_head list; | 78 | struct list_head list; |
| 79 | struct list_head hotplug_list; | ||
| 80 | acpi_handle handle; | 79 | acpi_handle handle; |
| 81 | const struct acpi_dock_ops *ops; | 80 | const struct acpi_dock_ops *hp_ops; |
| 82 | void *context; | 81 | void *hp_context; |
| 82 | unsigned int hp_refcount; | ||
| 83 | void (*hp_release)(void *); | ||
| 83 | }; | 84 | }; |
| 84 | 85 | ||
| 85 | #define DOCK_DOCKING 0x00000001 | 86 | #define DOCK_DOCKING 0x00000001 |
| @@ -111,7 +112,6 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle) | |||
| 111 | 112 | ||
| 112 | dd->handle = handle; | 113 | dd->handle = handle; |
| 113 | INIT_LIST_HEAD(&dd->list); | 114 | INIT_LIST_HEAD(&dd->list); |
| 114 | INIT_LIST_HEAD(&dd->hotplug_list); | ||
| 115 | 115 | ||
| 116 | spin_lock(&ds->dd_lock); | 116 | spin_lock(&ds->dd_lock); |
| 117 | list_add_tail(&dd->list, &ds->dependent_devices); | 117 | list_add_tail(&dd->list, &ds->dependent_devices); |
| @@ -121,35 +121,90 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle) | |||
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | /** | 123 | /** |
| 124 | * dock_add_hotplug_device - associate a hotplug handler with the dock station | 124 | * dock_init_hotplug - Initialize a hotplug device on a docking station. |
| 125 | * @ds: The dock station | 125 | * @dd: Dock-dependent device. |
| 126 | * @dd: The dependent device struct | 126 | * @ops: Dock operations to attach to the dependent device. |
| 127 | * | 127 | * @context: Data to pass to the @ops callbacks and @release. |
| 128 | * Add the dependent device to the dock's hotplug device list | 128 | * @init: Optional initialization routine to run after setting up context. |
| 129 | * @release: Optional release routine to run on removal. | ||
| 129 | */ | 130 | */ |
| 130 | static void | 131 | static int dock_init_hotplug(struct dock_dependent_device *dd, |
| 131 | dock_add_hotplug_device(struct dock_station *ds, | 132 | const struct acpi_dock_ops *ops, void *context, |
| 132 | struct dock_dependent_device *dd) | 133 | void (*init)(void *), void (*release)(void *)) |
| 133 | { | 134 | { |
| 134 | mutex_lock(&ds->hp_lock); | 135 | int ret = 0; |
| 135 | list_add_tail(&dd->hotplug_list, &ds->hotplug_devices); | 136 | |
| 136 | mutex_unlock(&ds->hp_lock); | 137 | mutex_lock(&hotplug_lock); |
| 138 | |||
| 139 | if (dd->hp_context) { | ||
| 140 | ret = -EEXIST; | ||
| 141 | } else { | ||
| 142 | dd->hp_refcount = 1; | ||
| 143 | dd->hp_ops = ops; | ||
| 144 | dd->hp_context = context; | ||
| 145 | dd->hp_release = release; | ||
| 146 | } | ||
| 147 | |||
| 148 | if (!WARN_ON(ret) && init) | ||
| 149 | init(context); | ||
| 150 | |||
| 151 | mutex_unlock(&hotplug_lock); | ||
| 152 | return ret; | ||
| 137 | } | 153 | } |
| 138 | 154 | ||
| 139 | /** | 155 | /** |
| 140 | * dock_del_hotplug_device - remove a hotplug handler from the dock station | 156 | * dock_release_hotplug - Decrement hotplug reference counter of dock device. |
| 141 | * @ds: The dock station | 157 | * @dd: Dock-dependent device. |
| 142 | * @dd: the dependent device struct | ||
| 143 | * | 158 | * |
| 144 | * Delete the dependent device from the dock's hotplug device list | 159 | * Decrement the reference counter of @dd and if 0, detach its hotplug |
| 160 | * operations from it, reset its context pointer and run the optional release | ||
| 161 | * routine if present. | ||
| 145 | */ | 162 | */ |
| 146 | static void | 163 | static void dock_release_hotplug(struct dock_dependent_device *dd) |
| 147 | dock_del_hotplug_device(struct dock_station *ds, | ||
| 148 | struct dock_dependent_device *dd) | ||
| 149 | { | 164 | { |
| 150 | mutex_lock(&ds->hp_lock); | 165 | void (*release)(void *) = NULL; |
| 151 | list_del(&dd->hotplug_list); | 166 | void *context = NULL; |
| 152 | mutex_unlock(&ds->hp_lock); | 167 | |
| 168 | mutex_lock(&hotplug_lock); | ||
| 169 | |||
| 170 | if (dd->hp_context && !--dd->hp_refcount) { | ||
| 171 | dd->hp_ops = NULL; | ||
| 172 | context = dd->hp_context; | ||
| 173 | dd->hp_context = NULL; | ||
| 174 | release = dd->hp_release; | ||
| 175 | dd->hp_release = NULL; | ||
| 176 | } | ||
| 177 | |||
| 178 | if (release && context) | ||
| 179 | release(context); | ||
| 180 | |||
| 181 | mutex_unlock(&hotplug_lock); | ||
| 182 | } | ||
| 183 | |||
| 184 | static void dock_hotplug_event(struct dock_dependent_device *dd, u32 event, | ||
| 185 | bool uevent) | ||
| 186 | { | ||
| 187 | acpi_notify_handler cb = NULL; | ||
| 188 | bool run = false; | ||
| 189 | |||
| 190 | mutex_lock(&hotplug_lock); | ||
| 191 | |||
| 192 | if (dd->hp_context) { | ||
| 193 | run = true; | ||
| 194 | dd->hp_refcount++; | ||
| 195 | if (dd->hp_ops) | ||
| 196 | cb = uevent ? dd->hp_ops->uevent : dd->hp_ops->handler; | ||
| 197 | } | ||
| 198 | |||
| 199 | mutex_unlock(&hotplug_lock); | ||
| 200 | |||
| 201 | if (!run) | ||
| 202 | return; | ||
| 203 | |||
| 204 | if (cb) | ||
| 205 | cb(dd->handle, event, dd->hp_context); | ||
| 206 | |||
| 207 | dock_release_hotplug(dd); | ||
| 153 | } | 208 | } |
| 154 | 209 | ||
| 155 | /** | 210 | /** |
| @@ -360,9 +415,8 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event) | |||
| 360 | /* | 415 | /* |
| 361 | * First call driver specific hotplug functions | 416 | * First call driver specific hotplug functions |
| 362 | */ | 417 | */ |
| 363 | list_for_each_entry(dd, &ds->hotplug_devices, hotplug_list) | 418 | list_for_each_entry(dd, &ds->dependent_devices, list) |
| 364 | if (dd->ops && dd->ops->handler) | 419 | dock_hotplug_event(dd, event, false); |
| 365 | dd->ops->handler(dd->handle, event, dd->context); | ||
| 366 | 420 | ||
| 367 | /* | 421 | /* |
| 368 | * Now make sure that an acpi_device is created for each | 422 | * Now make sure that an acpi_device is created for each |
| @@ -398,9 +452,8 @@ static void dock_event(struct dock_station *ds, u32 event, int num) | |||
| 398 | if (num == DOCK_EVENT) | 452 | if (num == DOCK_EVENT) |
| 399 | kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); | 453 | kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); |
| 400 | 454 | ||
| 401 | list_for_each_entry(dd, &ds->hotplug_devices, hotplug_list) | 455 | list_for_each_entry(dd, &ds->dependent_devices, list) |
| 402 | if (dd->ops && dd->ops->uevent) | 456 | dock_hotplug_event(dd, event, true); |
| 403 | dd->ops->uevent(dd->handle, event, dd->context); | ||
| 404 | 457 | ||
| 405 | if (num != DOCK_EVENT) | 458 | if (num != DOCK_EVENT) |
| 406 | kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); | 459 | kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); |
| @@ -570,19 +623,24 @@ EXPORT_SYMBOL_GPL(unregister_dock_notifier); | |||
| 570 | * @handle: the handle of the device | 623 | * @handle: the handle of the device |
| 571 | * @ops: handlers to call after docking | 624 | * @ops: handlers to call after docking |
| 572 | * @context: device specific data | 625 | * @context: device specific data |
| 626 | * @init: Optional initialization routine to run after registration | ||
| 627 | * @release: Optional release routine to run on unregistration | ||
| 573 | * | 628 | * |
| 574 | * If a driver would like to perform a hotplug operation after a dock | 629 | * If a driver would like to perform a hotplug operation after a dock |
| 575 | * event, they can register an acpi_notifiy_handler to be called by | 630 | * event, they can register an acpi_notifiy_handler to be called by |
| 576 | * the dock driver after _DCK is executed. | 631 | * the dock driver after _DCK is executed. |
| 577 | */ | 632 | */ |
| 578 | int | 633 | int register_hotplug_dock_device(acpi_handle handle, |
| 579 | register_hotplug_dock_device(acpi_handle handle, const struct acpi_dock_ops *ops, | 634 | const struct acpi_dock_ops *ops, void *context, |
| 580 | void *context) | 635 | void (*init)(void *), void (*release)(void *)) |
| 581 | { | 636 | { |
| 582 | struct dock_dependent_device *dd; | 637 | struct dock_dependent_device *dd; |
| 583 | struct dock_station *dock_station; | 638 | struct dock_station *dock_station; |
| 584 | int ret = -EINVAL; | 639 | int ret = -EINVAL; |
| 585 | 640 | ||
| 641 | if (WARN_ON(!context)) | ||
| 642 | return -EINVAL; | ||
| 643 | |||
| 586 | if (!dock_station_count) | 644 | if (!dock_station_count) |
| 587 | return -ENODEV; | 645 | return -ENODEV; |
| 588 | 646 | ||
| @@ -597,12 +655,8 @@ register_hotplug_dock_device(acpi_handle handle, const struct acpi_dock_ops *ops | |||
| 597 | * ops | 655 | * ops |
| 598 | */ | 656 | */ |
| 599 | dd = find_dock_dependent_device(dock_station, handle); | 657 | dd = find_dock_dependent_device(dock_station, handle); |
| 600 | if (dd) { | 658 | if (dd && !dock_init_hotplug(dd, ops, context, init, release)) |
| 601 | dd->ops = ops; | ||
| 602 | dd->context = context; | ||
| 603 | dock_add_hotplug_device(dock_station, dd); | ||
| 604 | ret = 0; | 659 | ret = 0; |
| 605 | } | ||
| 606 | } | 660 | } |
| 607 | 661 | ||
| 608 | return ret; | 662 | return ret; |
| @@ -624,7 +678,7 @@ void unregister_hotplug_dock_device(acpi_handle handle) | |||
| 624 | list_for_each_entry(dock_station, &dock_stations, sibling) { | 678 | list_for_each_entry(dock_station, &dock_stations, sibling) { |
| 625 | dd = find_dock_dependent_device(dock_station, handle); | 679 | dd = find_dock_dependent_device(dock_station, handle); |
| 626 | if (dd) | 680 | if (dd) |
| 627 | dock_del_hotplug_device(dock_station, dd); | 681 | dock_release_hotplug(dd); |
| 628 | } | 682 | } |
| 629 | } | 683 | } |
| 630 | EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device); | 684 | EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device); |
| @@ -868,8 +922,10 @@ static ssize_t write_undock(struct device *dev, struct device_attribute *attr, | |||
| 868 | if (!count) | 922 | if (!count) |
| 869 | return -EINVAL; | 923 | return -EINVAL; |
| 870 | 924 | ||
| 925 | acpi_scan_lock_acquire(); | ||
| 871 | begin_undock(dock_station); | 926 | begin_undock(dock_station); |
| 872 | ret = handle_eject_request(dock_station, ACPI_NOTIFY_EJECT_REQUEST); | 927 | ret = handle_eject_request(dock_station, ACPI_NOTIFY_EJECT_REQUEST); |
| 928 | acpi_scan_lock_release(); | ||
| 873 | return ret ? ret: count; | 929 | return ret ? ret: count; |
| 874 | } | 930 | } |
| 875 | static DEVICE_ATTR(undock, S_IWUSR, NULL, write_undock); | 931 | static DEVICE_ATTR(undock, S_IWUSR, NULL, write_undock); |
| @@ -951,7 +1007,6 @@ static int __init dock_add(acpi_handle handle) | |||
| 951 | mutex_init(&dock_station->hp_lock); | 1007 | mutex_init(&dock_station->hp_lock); |
| 952 | spin_lock_init(&dock_station->dd_lock); | 1008 | spin_lock_init(&dock_station->dd_lock); |
| 953 | INIT_LIST_HEAD(&dock_station->sibling); | 1009 | INIT_LIST_HEAD(&dock_station->sibling); |
| 954 | INIT_LIST_HEAD(&dock_station->hotplug_devices); | ||
| 955 | ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list); | 1010 | ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list); |
| 956 | INIT_LIST_HEAD(&dock_station->dependent_devices); | 1011 | INIT_LIST_HEAD(&dock_station->dependent_devices); |
| 957 | 1012 | ||
| @@ -992,30 +1047,6 @@ err_unregister: | |||
| 992 | } | 1047 | } |
| 993 | 1048 | ||
| 994 | /** | 1049 | /** |
| 995 | * dock_remove - free up resources related to the dock station | ||
| 996 | */ | ||
| 997 | static int dock_remove(struct dock_station *ds) | ||
| 998 | { | ||
| 999 | struct dock_dependent_device *dd, *tmp; | ||
| 1000 | struct platform_device *dock_device = ds->dock_device; | ||
| 1001 | |||
| 1002 | if (!dock_station_count) | ||
| 1003 | return 0; | ||
| 1004 | |||
| 1005 | /* remove dependent devices */ | ||
| 1006 | list_for_each_entry_safe(dd, tmp, &ds->dependent_devices, list) | ||
| 1007 | kfree(dd); | ||
| 1008 | |||
| 1009 | list_del(&ds->sibling); | ||
| 1010 | |||
| 1011 | /* cleanup sysfs */ | ||
| 1012 | sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group); | ||
| 1013 | platform_device_unregister(dock_device); | ||
| 1014 | |||
| 1015 | return 0; | ||
| 1016 | } | ||
| 1017 | |||
| 1018 | /** | ||
| 1019 | * find_dock_and_bay - look for dock stations and bays | 1050 | * find_dock_and_bay - look for dock stations and bays |
| 1020 | * @handle: acpi handle of a device | 1051 | * @handle: acpi handle of a device |
| 1021 | * @lvl: unused | 1052 | * @lvl: unused |
| @@ -1033,7 +1064,7 @@ find_dock_and_bay(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
| 1033 | return AE_OK; | 1064 | return AE_OK; |
| 1034 | } | 1065 | } |
| 1035 | 1066 | ||
| 1036 | static int __init dock_init(void) | 1067 | int __init acpi_dock_init(void) |
| 1037 | { | 1068 | { |
| 1038 | if (acpi_disabled) | 1069 | if (acpi_disabled) |
| 1039 | return 0; | 1070 | return 0; |
| @@ -1052,19 +1083,3 @@ static int __init dock_init(void) | |||
| 1052 | ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count); | 1083 | ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count); |
| 1053 | return 0; | 1084 | return 0; |
| 1054 | } | 1085 | } |
| 1055 | |||
| 1056 | static void __exit dock_exit(void) | ||
| 1057 | { | ||
| 1058 | struct dock_station *tmp, *dock_station; | ||
| 1059 | |||
| 1060 | unregister_acpi_bus_notifier(&dock_acpi_notifier); | ||
| 1061 | list_for_each_entry_safe(dock_station, tmp, &dock_stations, sibling) | ||
| 1062 | dock_remove(dock_station); | ||
| 1063 | } | ||
| 1064 | |||
| 1065 | /* | ||
| 1066 | * Must be called before drivers of devices in dock, otherwise we can't know | ||
| 1067 | * which devices are in a dock | ||
| 1068 | */ | ||
| 1069 | subsys_initcall(dock_init); | ||
| 1070 | module_exit(dock_exit); | ||
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 40a84cc6740c..9783f400d857 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -105,7 +105,7 @@ acpi_handle acpi_get_child(acpi_handle parent, u64 address) | |||
| 105 | } | 105 | } |
| 106 | EXPORT_SYMBOL(acpi_get_child); | 106 | EXPORT_SYMBOL(acpi_get_child); |
| 107 | 107 | ||
| 108 | static int acpi_bind_one(struct device *dev, acpi_handle handle) | 108 | int acpi_bind_one(struct device *dev, acpi_handle handle) |
| 109 | { | 109 | { |
| 110 | struct acpi_device *acpi_dev; | 110 | struct acpi_device *acpi_dev; |
| 111 | acpi_status status; | 111 | acpi_status status; |
| @@ -188,8 +188,9 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
| 188 | kfree(physical_node); | 188 | kfree(physical_node); |
| 189 | goto err; | 189 | goto err; |
| 190 | } | 190 | } |
| 191 | EXPORT_SYMBOL_GPL(acpi_bind_one); | ||
| 191 | 192 | ||
| 192 | static int acpi_unbind_one(struct device *dev) | 193 | int acpi_unbind_one(struct device *dev) |
| 193 | { | 194 | { |
| 194 | struct acpi_device_physical_node *entry; | 195 | struct acpi_device_physical_node *entry; |
| 195 | struct acpi_device *acpi_dev; | 196 | struct acpi_device *acpi_dev; |
| @@ -238,6 +239,7 @@ err: | |||
| 238 | dev_err(dev, "Oops, 'acpi_handle' corrupt\n"); | 239 | dev_err(dev, "Oops, 'acpi_handle' corrupt\n"); |
| 239 | return -EINVAL; | 240 | return -EINVAL; |
| 240 | } | 241 | } |
| 242 | EXPORT_SYMBOL_GPL(acpi_unbind_one); | ||
| 241 | 243 | ||
| 242 | static int acpi_platform_notify(struct device *dev) | 244 | static int acpi_platform_notify(struct device *dev) |
| 243 | { | 245 | { |
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h index 297cbf456f86..520073ba36b4 100644 --- a/drivers/acpi/internal.h +++ b/drivers/acpi/internal.h | |||
| @@ -33,6 +33,7 @@ static inline void acpi_pci_slot_init(void) { } | |||
| 33 | void acpi_pci_root_init(void); | 33 | void acpi_pci_root_init(void); |
| 34 | void acpi_pci_link_init(void); | 34 | void acpi_pci_link_init(void); |
| 35 | void acpi_pci_root_hp_init(void); | 35 | void acpi_pci_root_hp_init(void); |
| 36 | void acpi_processor_init(void); | ||
| 36 | void acpi_platform_init(void); | 37 | void acpi_platform_init(void); |
| 37 | int acpi_sysfs_init(void); | 38 | int acpi_sysfs_init(void); |
| 38 | #ifdef CONFIG_ACPI_CONTAINER | 39 | #ifdef CONFIG_ACPI_CONTAINER |
| @@ -40,12 +41,19 @@ void acpi_container_init(void); | |||
| 40 | #else | 41 | #else |
| 41 | static inline void acpi_container_init(void) {} | 42 | static inline void acpi_container_init(void) {} |
| 42 | #endif | 43 | #endif |
| 44 | #ifdef CONFIG_ACPI_DOCK | ||
| 45 | void acpi_dock_init(void); | ||
| 46 | #else | ||
| 47 | static inline void acpi_dock_init(void) {} | ||
| 48 | #endif | ||
| 43 | #ifdef CONFIG_ACPI_HOTPLUG_MEMORY | 49 | #ifdef CONFIG_ACPI_HOTPLUG_MEMORY |
| 44 | void acpi_memory_hotplug_init(void); | 50 | void acpi_memory_hotplug_init(void); |
| 45 | #else | 51 | #else |
| 46 | static inline void acpi_memory_hotplug_init(void) {} | 52 | static inline void acpi_memory_hotplug_init(void) {} |
| 47 | #endif | 53 | #endif |
| 48 | 54 | ||
| 55 | extern bool acpi_force_hot_remove; | ||
| 56 | |||
| 49 | void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug, | 57 | void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug, |
| 50 | const char *name); | 58 | const char *name); |
| 51 | int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler, | 59 | int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler, |
| @@ -76,6 +84,8 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, | |||
| 76 | int type, unsigned long long sta); | 84 | int type, unsigned long long sta); |
| 77 | void acpi_device_add_finalize(struct acpi_device *device); | 85 | void acpi_device_add_finalize(struct acpi_device *device); |
| 78 | void acpi_free_pnp_ids(struct acpi_device_pnp *pnp); | 86 | void acpi_free_pnp_ids(struct acpi_device_pnp *pnp); |
| 87 | int acpi_bind_one(struct device *dev, acpi_handle handle); | ||
| 88 | int acpi_unbind_one(struct device *dev); | ||
| 79 | 89 | ||
| 80 | /* -------------------------------------------------------------------------- | 90 | /* -------------------------------------------------------------------------- |
| 81 | Power Resource | 91 | Power Resource |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index e72186340fec..da6b6634e5b3 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -1715,6 +1715,17 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) | |||
| 1715 | } | 1715 | } |
| 1716 | #endif | 1716 | #endif |
| 1717 | 1717 | ||
| 1718 | static int __init acpi_no_auto_ssdt_setup(char *s) | ||
| 1719 | { | ||
| 1720 | printk(KERN_NOTICE PREFIX "SSDT auto-load disabled\n"); | ||
| 1721 | |||
| 1722 | acpi_gbl_disable_ssdt_table_load = TRUE; | ||
| 1723 | |||
| 1724 | return 1; | ||
| 1725 | } | ||
| 1726 | |||
| 1727 | __setup("acpi_no_auto_ssdt", acpi_no_auto_ssdt_setup); | ||
| 1728 | |||
| 1718 | acpi_status __init acpi_os_initialize(void) | 1729 | acpi_status __init acpi_os_initialize(void) |
| 1719 | { | 1730 | { |
| 1720 | acpi_os_map_generic_address(&acpi_gbl_FADT.xpm1a_event_block); | 1731 | acpi_os_map_generic_address(&acpi_gbl_FADT.xpm1a_event_block); |
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index f962047c6c85..288bb270f8ed 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
| @@ -885,6 +885,7 @@ int acpi_add_power_resource(acpi_handle handle) | |||
| 885 | ACPI_STA_DEFAULT); | 885 | ACPI_STA_DEFAULT); |
| 886 | mutex_init(&resource->resource_lock); | 886 | mutex_init(&resource->resource_lock); |
| 887 | INIT_LIST_HEAD(&resource->dependent); | 887 | INIT_LIST_HEAD(&resource->dependent); |
| 888 | INIT_LIST_HEAD(&resource->list_node); | ||
| 888 | resource->name = device->pnp.bus_id; | 889 | resource->name = device->pnp.bus_id; |
| 889 | strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); | 890 | strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); |
| 890 | strcpy(acpi_device_class(device), ACPI_POWER_CLASS); | 891 | strcpy(acpi_device_class(device), ACPI_POWER_CLASS); |
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index c266cdc11784..d93963f1e8f4 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
| @@ -1,11 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * acpi_processor.c - ACPI Processor Driver ($Revision: 71 $) | 2 | * processor_driver.c - ACPI Processor Driver |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> | 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> |
| 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> |
| 6 | * Copyright (C) 2004 Dominik Brodowski <linux@brodo.de> | 6 | * Copyright (C) 2004 Dominik Brodowski <linux@brodo.de> |
| 7 | * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | 7 | * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> |
| 8 | * - Added processor hotplug support | 8 | * - Added processor hotplug support |
| 9 | * Copyright (C) 2013, Intel Corporation | ||
| 10 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||
| 9 | * | 11 | * |
| 10 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 12 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 11 | * | 13 | * |
| @@ -24,52 +26,29 @@ | |||
| 24 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | 26 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
| 25 | * | 27 | * |
| 26 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 28 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 27 | * TBD: | ||
| 28 | * 1. Make # power states dynamic. | ||
| 29 | * 2. Support duty_cycle values that span bit 4. | ||
| 30 | * 3. Optimize by having scheduler determine business instead of | ||
| 31 | * having us try to calculate it here. | ||
| 32 | * 4. Need C1 timing -- must modify kernel (IRQ handler) to get this. | ||
| 33 | */ | 29 | */ |
| 34 | 30 | ||
| 35 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
| 36 | #include <linux/module.h> | 32 | #include <linux/module.h> |
| 37 | #include <linux/init.h> | 33 | #include <linux/init.h> |
| 38 | #include <linux/types.h> | ||
| 39 | #include <linux/pci.h> | ||
| 40 | #include <linux/pm.h> | ||
| 41 | #include <linux/cpufreq.h> | 34 | #include <linux/cpufreq.h> |
| 42 | #include <linux/cpu.h> | 35 | #include <linux/cpu.h> |
| 43 | #include <linux/dmi.h> | ||
| 44 | #include <linux/moduleparam.h> | ||
| 45 | #include <linux/cpuidle.h> | 36 | #include <linux/cpuidle.h> |
| 46 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
| 47 | #include <linux/acpi.h> | 38 | #include <linux/acpi.h> |
| 48 | #include <linux/memory_hotplug.h> | 39 | |
| 49 | |||
| 50 | #include <asm/io.h> | ||
| 51 | #include <asm/cpu.h> | ||
| 52 | #include <asm/delay.h> | ||
| 53 | #include <asm/uaccess.h> | ||
| 54 | #include <asm/processor.h> | ||
| 55 | #include <asm/smp.h> | ||
| 56 | #include <asm/acpi.h> | ||
| 57 | |||
| 58 | #include <acpi/acpi_bus.h> | ||
| 59 | #include <acpi/acpi_drivers.h> | ||
| 60 | #include <acpi/processor.h> | 40 | #include <acpi/processor.h> |
| 61 | 41 | ||
| 42 | #include "internal.h" | ||
| 43 | |||
| 62 | #define PREFIX "ACPI: " | 44 | #define PREFIX "ACPI: " |
| 63 | 45 | ||
| 64 | #define ACPI_PROCESSOR_CLASS "processor" | ||
| 65 | #define ACPI_PROCESSOR_DEVICE_NAME "Processor" | ||
| 66 | #define ACPI_PROCESSOR_FILE_INFO "info" | 46 | #define ACPI_PROCESSOR_FILE_INFO "info" |
| 67 | #define ACPI_PROCESSOR_FILE_THROTTLING "throttling" | 47 | #define ACPI_PROCESSOR_FILE_THROTTLING "throttling" |
| 68 | #define ACPI_PROCESSOR_FILE_LIMIT "limit" | 48 | #define ACPI_PROCESSOR_FILE_LIMIT "limit" |
| 69 | #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 | 49 | #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 |
| 70 | #define ACPI_PROCESSOR_NOTIFY_POWER 0x81 | 50 | #define ACPI_PROCESSOR_NOTIFY_POWER 0x81 |
| 71 | #define ACPI_PROCESSOR_NOTIFY_THROTTLING 0x82 | 51 | #define ACPI_PROCESSOR_NOTIFY_THROTTLING 0x82 |
| 72 | #define ACPI_PROCESSOR_DEVICE_HID "ACPI0007" | ||
| 73 | 52 | ||
| 74 | #define ACPI_PROCESSOR_LIMIT_USER 0 | 53 | #define ACPI_PROCESSOR_LIMIT_USER 0 |
| 75 | #define ACPI_PROCESSOR_LIMIT_THERMAL 1 | 54 | #define ACPI_PROCESSOR_LIMIT_THERMAL 1 |
| @@ -81,12 +60,8 @@ MODULE_AUTHOR("Paul Diefenbaugh"); | |||
| 81 | MODULE_DESCRIPTION("ACPI Processor Driver"); | 60 | MODULE_DESCRIPTION("ACPI Processor Driver"); |
| 82 | MODULE_LICENSE("GPL"); | 61 | MODULE_LICENSE("GPL"); |
| 83 | 62 | ||
| 84 | static int acpi_processor_add(struct acpi_device *device); | 63 | static int acpi_processor_start(struct device *dev); |
| 85 | static int acpi_processor_remove(struct acpi_device *device); | 64 | static int acpi_processor_stop(struct device *dev); |
| 86 | static void acpi_processor_notify(struct acpi_device *device, u32 event); | ||
| 87 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr); | ||
| 88 | static int acpi_processor_handle_eject(struct acpi_processor *pr); | ||
| 89 | static int acpi_processor_start(struct acpi_processor *pr); | ||
| 90 | 65 | ||
| 91 | static const struct acpi_device_id processor_device_ids[] = { | 66 | static const struct acpi_device_id processor_device_ids[] = { |
| 92 | {ACPI_PROCESSOR_OBJECT_HID, 0}, | 67 | {ACPI_PROCESSOR_OBJECT_HID, 0}, |
| @@ -95,295 +70,24 @@ static const struct acpi_device_id processor_device_ids[] = { | |||
| 95 | }; | 70 | }; |
| 96 | MODULE_DEVICE_TABLE(acpi, processor_device_ids); | 71 | MODULE_DEVICE_TABLE(acpi, processor_device_ids); |
| 97 | 72 | ||
| 98 | static struct acpi_driver acpi_processor_driver = { | 73 | static struct device_driver acpi_processor_driver = { |
| 99 | .name = "processor", | 74 | .name = "processor", |
| 100 | .class = ACPI_PROCESSOR_CLASS, | 75 | .bus = &cpu_subsys, |
| 101 | .ids = processor_device_ids, | 76 | .acpi_match_table = processor_device_ids, |
| 102 | .ops = { | 77 | .probe = acpi_processor_start, |
| 103 | .add = acpi_processor_add, | 78 | .remove = acpi_processor_stop, |
| 104 | .remove = acpi_processor_remove, | ||
| 105 | .notify = acpi_processor_notify, | ||
| 106 | }, | ||
| 107 | }; | 79 | }; |
| 108 | 80 | ||
| 109 | #define INSTALL_NOTIFY_HANDLER 1 | 81 | static void acpi_processor_notify(acpi_handle handle, u32 event, void *data) |
| 110 | #define UNINSTALL_NOTIFY_HANDLER 2 | ||
| 111 | |||
| 112 | DEFINE_PER_CPU(struct acpi_processor *, processors); | ||
| 113 | EXPORT_PER_CPU_SYMBOL(processors); | ||
| 114 | |||
| 115 | struct acpi_processor_errata errata __read_mostly; | ||
| 116 | |||
| 117 | /* -------------------------------------------------------------------------- | ||
| 118 | Errata Handling | ||
| 119 | -------------------------------------------------------------------------- */ | ||
| 120 | |||
| 121 | static int acpi_processor_errata_piix4(struct pci_dev *dev) | ||
| 122 | { | 82 | { |
| 123 | u8 value1 = 0; | 83 | struct acpi_device *device = data; |
| 124 | u8 value2 = 0; | ||
| 125 | |||
| 126 | |||
| 127 | if (!dev) | ||
| 128 | return -EINVAL; | ||
| 129 | |||
| 130 | /* | ||
| 131 | * Note that 'dev' references the PIIX4 ACPI Controller. | ||
| 132 | */ | ||
| 133 | |||
| 134 | switch (dev->revision) { | ||
| 135 | case 0: | ||
| 136 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n")); | ||
| 137 | break; | ||
| 138 | case 1: | ||
| 139 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n")); | ||
| 140 | break; | ||
| 141 | case 2: | ||
| 142 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n")); | ||
| 143 | break; | ||
| 144 | case 3: | ||
| 145 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n")); | ||
| 146 | break; | ||
| 147 | default: | ||
| 148 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n")); | ||
| 149 | break; | ||
| 150 | } | ||
| 151 | |||
| 152 | switch (dev->revision) { | ||
| 153 | |||
| 154 | case 0: /* PIIX4 A-step */ | ||
| 155 | case 1: /* PIIX4 B-step */ | ||
| 156 | /* | ||
| 157 | * See specification changes #13 ("Manual Throttle Duty Cycle") | ||
| 158 | * and #14 ("Enabling and Disabling Manual Throttle"), plus | ||
| 159 | * erratum #5 ("STPCLK# Deassertion Time") from the January | ||
| 160 | * 2002 PIIX4 specification update. Applies to only older | ||
| 161 | * PIIX4 models. | ||
| 162 | */ | ||
| 163 | errata.piix4.throttle = 1; | ||
| 164 | |||
| 165 | case 2: /* PIIX4E */ | ||
| 166 | case 3: /* PIIX4M */ | ||
| 167 | /* | ||
| 168 | * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA | ||
| 169 | * Livelock") from the January 2002 PIIX4 specification update. | ||
| 170 | * Applies to all PIIX4 models. | ||
| 171 | */ | ||
| 172 | |||
| 173 | /* | ||
| 174 | * BM-IDE | ||
| 175 | * ------ | ||
| 176 | * Find the PIIX4 IDE Controller and get the Bus Master IDE | ||
| 177 | * Status register address. We'll use this later to read | ||
| 178 | * each IDE controller's DMA status to make sure we catch all | ||
| 179 | * DMA activity. | ||
| 180 | */ | ||
| 181 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
| 182 | PCI_DEVICE_ID_INTEL_82371AB, | ||
| 183 | PCI_ANY_ID, PCI_ANY_ID, NULL); | ||
| 184 | if (dev) { | ||
| 185 | errata.piix4.bmisx = pci_resource_start(dev, 4); | ||
| 186 | pci_dev_put(dev); | ||
| 187 | } | ||
| 188 | |||
| 189 | /* | ||
| 190 | * Type-F DMA | ||
| 191 | * ---------- | ||
| 192 | * Find the PIIX4 ISA Controller and read the Motherboard | ||
| 193 | * DMA controller's status to see if Type-F (Fast) DMA mode | ||
| 194 | * is enabled (bit 7) on either channel. Note that we'll | ||
| 195 | * disable C3 support if this is enabled, as some legacy | ||
| 196 | * devices won't operate well if fast DMA is disabled. | ||
| 197 | */ | ||
| 198 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
| 199 | PCI_DEVICE_ID_INTEL_82371AB_0, | ||
| 200 | PCI_ANY_ID, PCI_ANY_ID, NULL); | ||
| 201 | if (dev) { | ||
| 202 | pci_read_config_byte(dev, 0x76, &value1); | ||
| 203 | pci_read_config_byte(dev, 0x77, &value2); | ||
| 204 | if ((value1 & 0x80) || (value2 & 0x80)) | ||
| 205 | errata.piix4.fdma = 1; | ||
| 206 | pci_dev_put(dev); | ||
| 207 | } | ||
| 208 | |||
| 209 | break; | ||
| 210 | } | ||
| 211 | |||
| 212 | if (errata.piix4.bmisx) | ||
| 213 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 214 | "Bus master activity detection (BM-IDE) erratum enabled\n")); | ||
| 215 | if (errata.piix4.fdma) | ||
| 216 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 217 | "Type-F DMA livelock erratum (C3 disabled)\n")); | ||
| 218 | |||
| 219 | return 0; | ||
| 220 | } | ||
| 221 | |||
| 222 | static int acpi_processor_errata(struct acpi_processor *pr) | ||
| 223 | { | ||
| 224 | int result = 0; | ||
| 225 | struct pci_dev *dev = NULL; | ||
| 226 | |||
| 227 | |||
| 228 | if (!pr) | ||
| 229 | return -EINVAL; | ||
| 230 | |||
| 231 | /* | ||
| 232 | * PIIX4 | ||
| 233 | */ | ||
| 234 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
| 235 | PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID, | ||
| 236 | PCI_ANY_ID, NULL); | ||
| 237 | if (dev) { | ||
| 238 | result = acpi_processor_errata_piix4(dev); | ||
| 239 | pci_dev_put(dev); | ||
| 240 | } | ||
| 241 | |||
| 242 | return result; | ||
| 243 | } | ||
| 244 | |||
| 245 | /* -------------------------------------------------------------------------- | ||
| 246 | Driver Interface | ||
| 247 | -------------------------------------------------------------------------- */ | ||
| 248 | |||
| 249 | static int acpi_processor_get_info(struct acpi_device *device) | ||
| 250 | { | ||
| 251 | acpi_status status = 0; | ||
| 252 | union acpi_object object = { 0 }; | ||
| 253 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; | ||
| 254 | struct acpi_processor *pr; | 84 | struct acpi_processor *pr; |
| 255 | int cpu_index, device_declaration = 0; | ||
| 256 | static int cpu0_initialized; | ||
| 257 | |||
| 258 | pr = acpi_driver_data(device); | ||
| 259 | if (!pr) | ||
| 260 | return -EINVAL; | ||
| 261 | |||
| 262 | if (num_online_cpus() > 1) | ||
| 263 | errata.smp = TRUE; | ||
| 264 | |||
| 265 | acpi_processor_errata(pr); | ||
| 266 | |||
| 267 | /* | ||
| 268 | * Check to see if we have bus mastering arbitration control. This | ||
| 269 | * is required for proper C3 usage (to maintain cache coherency). | ||
| 270 | */ | ||
| 271 | if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) { | ||
| 272 | pr->flags.bm_control = 1; | ||
| 273 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 274 | "Bus mastering arbitration control present\n")); | ||
| 275 | } else | ||
| 276 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 277 | "No bus mastering arbitration control\n")); | ||
| 278 | |||
| 279 | if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) { | ||
| 280 | /* Declared with "Processor" statement; match ProcessorID */ | ||
| 281 | status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); | ||
| 282 | if (ACPI_FAILURE(status)) { | ||
| 283 | dev_err(&device->dev, | ||
| 284 | "Failed to evaluate processor object (0x%x)\n", | ||
| 285 | status); | ||
| 286 | return -ENODEV; | ||
| 287 | } | ||
| 288 | |||
| 289 | /* | ||
| 290 | * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. | ||
| 291 | * >>> 'acpi_get_processor_id(acpi_id, &id)' in | ||
| 292 | * arch/xxx/acpi.c | ||
| 293 | */ | ||
| 294 | pr->acpi_id = object.processor.proc_id; | ||
| 295 | } else { | ||
| 296 | /* | ||
| 297 | * Declared with "Device" statement; match _UID. | ||
| 298 | * Note that we don't handle string _UIDs yet. | ||
| 299 | */ | ||
| 300 | unsigned long long value; | ||
| 301 | status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, | ||
| 302 | NULL, &value); | ||
| 303 | if (ACPI_FAILURE(status)) { | ||
| 304 | dev_err(&device->dev, | ||
| 305 | "Failed to evaluate processor _UID (0x%x)\n", | ||
| 306 | status); | ||
| 307 | return -ENODEV; | ||
| 308 | } | ||
| 309 | device_declaration = 1; | ||
| 310 | pr->acpi_id = value; | ||
| 311 | } | ||
| 312 | cpu_index = acpi_get_cpuid(pr->handle, device_declaration, pr->acpi_id); | ||
| 313 | |||
| 314 | /* Handle UP system running SMP kernel, with no LAPIC in MADT */ | ||
| 315 | if (!cpu0_initialized && (cpu_index == -1) && | ||
| 316 | (num_online_cpus() == 1)) { | ||
| 317 | cpu_index = 0; | ||
| 318 | } | ||
| 319 | |||
| 320 | cpu0_initialized = 1; | ||
| 321 | |||
| 322 | pr->id = cpu_index; | ||
| 323 | |||
| 324 | /* | ||
| 325 | * Extra Processor objects may be enumerated on MP systems with | ||
| 326 | * less than the max # of CPUs. They should be ignored _iff | ||
| 327 | * they are physically not present. | ||
| 328 | */ | ||
| 329 | if (pr->id == -1) { | ||
| 330 | if (ACPI_FAILURE(acpi_processor_hotadd_init(pr))) | ||
| 331 | return -ENODEV; | ||
| 332 | } | ||
| 333 | /* | ||
| 334 | * On some boxes several processors use the same processor bus id. | ||
| 335 | * But they are located in different scope. For example: | ||
| 336 | * \_SB.SCK0.CPU0 | ||
| 337 | * \_SB.SCK1.CPU0 | ||
| 338 | * Rename the processor device bus id. And the new bus id will be | ||
| 339 | * generated as the following format: | ||
| 340 | * CPU+CPU ID. | ||
| 341 | */ | ||
| 342 | sprintf(acpi_device_bid(device), "CPU%X", pr->id); | ||
| 343 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, | ||
| 344 | pr->acpi_id)); | ||
| 345 | |||
| 346 | if (!object.processor.pblk_address) | ||
| 347 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n")); | ||
| 348 | else if (object.processor.pblk_length != 6) | ||
| 349 | dev_err(&device->dev, "Invalid PBLK length [%d]\n", | ||
| 350 | object.processor.pblk_length); | ||
| 351 | else { | ||
| 352 | pr->throttling.address = object.processor.pblk_address; | ||
| 353 | pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; | ||
| 354 | pr->throttling.duty_width = acpi_gbl_FADT.duty_width; | ||
| 355 | |||
| 356 | pr->pblk = object.processor.pblk_address; | ||
| 357 | |||
| 358 | /* | ||
| 359 | * We don't care about error returns - we just try to mark | ||
| 360 | * these reserved so that nobody else is confused into thinking | ||
| 361 | * that this region might be unused.. | ||
| 362 | * | ||
| 363 | * (In particular, allocating the IO range for Cardbus) | ||
| 364 | */ | ||
| 365 | request_region(pr->throttling.address, 6, "ACPI CPU throttle"); | ||
| 366 | } | ||
| 367 | |||
| 368 | /* | ||
| 369 | * If ACPI describes a slot number for this CPU, we can use it | ||
| 370 | * ensure we get the right value in the "physical id" field | ||
| 371 | * of /proc/cpuinfo | ||
| 372 | */ | ||
| 373 | status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer); | ||
| 374 | if (ACPI_SUCCESS(status)) | ||
| 375 | arch_fix_phys_package_id(pr->id, object.integer.value); | ||
| 376 | |||
| 377 | return 0; | ||
| 378 | } | ||
| 379 | |||
| 380 | static DEFINE_PER_CPU(void *, processor_device_array); | ||
| 381 | |||
| 382 | static void acpi_processor_notify(struct acpi_device *device, u32 event) | ||
| 383 | { | ||
| 384 | struct acpi_processor *pr = acpi_driver_data(device); | ||
| 385 | int saved; | 85 | int saved; |
| 386 | 86 | ||
| 87 | if (device->handle != handle) | ||
| 88 | return; | ||
| 89 | |||
| 90 | pr = acpi_driver_data(device); | ||
| 387 | if (!pr) | 91 | if (!pr) |
| 388 | return; | 92 | return; |
| 389 | 93 | ||
| @@ -420,55 +124,62 @@ static void acpi_processor_notify(struct acpi_device *device, u32 event) | |||
| 420 | return; | 124 | return; |
| 421 | } | 125 | } |
| 422 | 126 | ||
| 423 | static int acpi_cpu_soft_notify(struct notifier_block *nfb, | 127 | static __cpuinit int __acpi_processor_start(struct acpi_device *device); |
| 424 | unsigned long action, void *hcpu) | 128 | |
| 129 | static int __cpuinit acpi_cpu_soft_notify(struct notifier_block *nfb, | ||
| 130 | unsigned long action, void *hcpu) | ||
| 425 | { | 131 | { |
| 426 | unsigned int cpu = (unsigned long)hcpu; | 132 | unsigned int cpu = (unsigned long)hcpu; |
| 427 | struct acpi_processor *pr = per_cpu(processors, cpu); | 133 | struct acpi_processor *pr = per_cpu(processors, cpu); |
| 134 | struct acpi_device *device; | ||
| 135 | |||
| 136 | if (!pr || acpi_bus_get_device(pr->handle, &device)) | ||
| 137 | return NOTIFY_DONE; | ||
| 428 | 138 | ||
| 429 | if (action == CPU_ONLINE && pr) { | 139 | if (action == CPU_ONLINE) { |
| 430 | /* CPU got physically hotplugged and onlined the first time: | 140 | /* |
| 431 | * Initialize missing things | 141 | * CPU got physically hotplugged and onlined for the first time: |
| 142 | * Initialize missing things. | ||
| 432 | */ | 143 | */ |
| 433 | if (pr->flags.need_hotplug_init) { | 144 | if (pr->flags.need_hotplug_init) { |
| 145 | int ret; | ||
| 146 | |||
| 434 | pr_info("Will online and init hotplugged CPU: %d\n", | 147 | pr_info("Will online and init hotplugged CPU: %d\n", |
| 435 | pr->id); | 148 | pr->id); |
| 436 | WARN(acpi_processor_start(pr), "Failed to start CPU:" | ||
| 437 | " %d\n", pr->id); | ||
| 438 | pr->flags.need_hotplug_init = 0; | 149 | pr->flags.need_hotplug_init = 0; |
| 439 | /* Normal CPU soft online event */ | 150 | ret = __acpi_processor_start(device); |
| 151 | WARN(ret, "Failed to start CPU: %d\n", pr->id); | ||
| 440 | } else { | 152 | } else { |
| 153 | /* Normal CPU soft online event. */ | ||
| 441 | acpi_processor_ppc_has_changed(pr, 0); | 154 | acpi_processor_ppc_has_changed(pr, 0); |
| 442 | acpi_processor_hotplug(pr); | 155 | acpi_processor_hotplug(pr); |
| 443 | acpi_processor_reevaluate_tstate(pr, action); | 156 | acpi_processor_reevaluate_tstate(pr, action); |
| 444 | acpi_processor_tstate_has_changed(pr); | 157 | acpi_processor_tstate_has_changed(pr); |
| 445 | } | 158 | } |
| 446 | } | 159 | } else if (action == CPU_DEAD) { |
| 447 | if (action == CPU_DEAD && pr) { | 160 | /* Invalidate flag.throttling after the CPU is offline. */ |
| 448 | /* invalidate the flag.throttling after one CPU is offline */ | ||
| 449 | acpi_processor_reevaluate_tstate(pr, action); | 161 | acpi_processor_reevaluate_tstate(pr, action); |
| 450 | } | 162 | } |
| 451 | return NOTIFY_OK; | 163 | return NOTIFY_OK; |
| 452 | } | 164 | } |
| 453 | 165 | ||
| 454 | static struct notifier_block acpi_cpu_notifier = | 166 | static struct notifier_block __refdata acpi_cpu_notifier = |
| 455 | { | 167 | { |
| 456 | .notifier_call = acpi_cpu_soft_notify, | 168 | .notifier_call = acpi_cpu_soft_notify, |
| 457 | }; | 169 | }; |
| 458 | 170 | ||
| 459 | /* | 171 | static __cpuinit int __acpi_processor_start(struct acpi_device *device) |
| 460 | * acpi_processor_start() is called by the cpu_hotplug_notifier func: | ||
| 461 | * acpi_cpu_soft_notify(). Getting it __cpuinit{data} is difficult, the | ||
| 462 | * root cause seem to be that acpi_processor_uninstall_hotplug_notify() | ||
| 463 | * is in the module_exit (__exit) func. Allowing acpi_processor_start() | ||
| 464 | * to not be in __cpuinit section, but being called from __cpuinit funcs | ||
| 465 | * via __ref looks like the right thing to do here. | ||
| 466 | */ | ||
| 467 | static __ref int acpi_processor_start(struct acpi_processor *pr) | ||
| 468 | { | 172 | { |
| 469 | struct acpi_device *device = per_cpu(processor_device_array, pr->id); | 173 | struct acpi_processor *pr = acpi_driver_data(device); |
| 174 | acpi_status status; | ||
| 470 | int result = 0; | 175 | int result = 0; |
| 471 | 176 | ||
| 177 | if (!pr) | ||
| 178 | return -ENODEV; | ||
| 179 | |||
| 180 | if (pr->flags.need_hotplug_init) | ||
| 181 | return 0; | ||
| 182 | |||
| 472 | #ifdef CONFIG_CPU_FREQ | 183 | #ifdef CONFIG_CPU_FREQ |
| 473 | acpi_processor_ppc_has_changed(pr, 0); | 184 | acpi_processor_ppc_has_changed(pr, 0); |
| 474 | acpi_processor_load_module(pr); | 185 | acpi_processor_load_module(pr); |
| @@ -506,462 +217,95 @@ static __ref int acpi_processor_start(struct acpi_processor *pr) | |||
| 506 | goto err_remove_sysfs_thermal; | 217 | goto err_remove_sysfs_thermal; |
| 507 | } | 218 | } |
| 508 | 219 | ||
| 509 | return 0; | 220 | status = acpi_install_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, |
| 221 | acpi_processor_notify, device); | ||
| 222 | if (ACPI_SUCCESS(status)) | ||
| 223 | return 0; | ||
| 510 | 224 | ||
| 511 | err_remove_sysfs_thermal: | 225 | sysfs_remove_link(&pr->cdev->device.kobj, "device"); |
| 226 | err_remove_sysfs_thermal: | ||
| 512 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); | 227 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); |
| 513 | err_thermal_unregister: | 228 | err_thermal_unregister: |
| 514 | thermal_cooling_device_unregister(pr->cdev); | 229 | thermal_cooling_device_unregister(pr->cdev); |
| 515 | err_power_exit: | 230 | err_power_exit: |
| 516 | acpi_processor_power_exit(pr); | 231 | acpi_processor_power_exit(pr); |
| 517 | |||
| 518 | return result; | 232 | return result; |
| 519 | } | 233 | } |
| 520 | 234 | ||
| 521 | /* | 235 | static int __cpuinit acpi_processor_start(struct device *dev) |
| 522 | * Do not put anything in here which needs the core to be online. | ||
| 523 | * For example MSR access or setting up things which check for cpuinfo_x86 | ||
| 524 | * (cpu_data(cpu)) values, like CPU feature flags, family, model, etc. | ||
| 525 | * Such things have to be put in and set up above in acpi_processor_start() | ||
| 526 | */ | ||
| 527 | static int __cpuinit acpi_processor_add(struct acpi_device *device) | ||
| 528 | { | 236 | { |
| 529 | struct acpi_processor *pr = NULL; | 237 | struct acpi_device *device; |
| 530 | int result = 0; | ||
| 531 | struct device *dev; | ||
| 532 | |||
| 533 | pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); | ||
| 534 | if (!pr) | ||
| 535 | return -ENOMEM; | ||
| 536 | |||
| 537 | if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { | ||
| 538 | result = -ENOMEM; | ||
| 539 | goto err_free_pr; | ||
| 540 | } | ||
| 541 | |||
| 542 | pr->handle = device->handle; | ||
| 543 | strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); | ||
| 544 | strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); | ||
| 545 | device->driver_data = pr; | ||
| 546 | |||
| 547 | result = acpi_processor_get_info(device); | ||
| 548 | if (result) { | ||
| 549 | /* Processor is physically not present */ | ||
| 550 | return 0; | ||
| 551 | } | ||
| 552 | |||
| 553 | #ifdef CONFIG_SMP | ||
| 554 | if (pr->id >= setup_max_cpus && pr->id != 0) | ||
| 555 | return 0; | ||
| 556 | #endif | ||
| 557 | |||
| 558 | BUG_ON(pr->id >= nr_cpu_ids); | ||
| 559 | |||
| 560 | /* | ||
| 561 | * Buggy BIOS check | ||
| 562 | * ACPI id of processors can be reported wrongly by the BIOS. | ||
| 563 | * Don't trust it blindly | ||
| 564 | */ | ||
| 565 | if (per_cpu(processor_device_array, pr->id) != NULL && | ||
| 566 | per_cpu(processor_device_array, pr->id) != device) { | ||
| 567 | dev_warn(&device->dev, | ||
| 568 | "BIOS reported wrong ACPI id %d for the processor\n", | ||
| 569 | pr->id); | ||
| 570 | result = -ENODEV; | ||
| 571 | goto err_free_cpumask; | ||
| 572 | } | ||
| 573 | per_cpu(processor_device_array, pr->id) = device; | ||
| 574 | |||
| 575 | per_cpu(processors, pr->id) = pr; | ||
| 576 | |||
| 577 | dev = get_cpu_device(pr->id); | ||
| 578 | if (sysfs_create_link(&device->dev.kobj, &dev->kobj, "sysdev")) { | ||
| 579 | result = -EFAULT; | ||
| 580 | goto err_clear_processor; | ||
| 581 | } | ||
| 582 | 238 | ||
| 583 | /* | 239 | if (acpi_bus_get_device(ACPI_HANDLE(dev), &device)) |
| 584 | * Do not start hotplugged CPUs now, but when they | 240 | return -ENODEV; |
| 585 | * are onlined the first time | ||
| 586 | */ | ||
| 587 | if (pr->flags.need_hotplug_init) | ||
| 588 | return 0; | ||
| 589 | |||
| 590 | result = acpi_processor_start(pr); | ||
| 591 | if (result) | ||
| 592 | goto err_remove_sysfs; | ||
| 593 | |||
| 594 | return 0; | ||
| 595 | 241 | ||
| 596 | err_remove_sysfs: | 242 | return __acpi_processor_start(device); |
| 597 | sysfs_remove_link(&device->dev.kobj, "sysdev"); | ||
| 598 | err_clear_processor: | ||
| 599 | /* | ||
| 600 | * processor_device_array is not cleared to allow checks for buggy BIOS | ||
| 601 | */ | ||
| 602 | per_cpu(processors, pr->id) = NULL; | ||
| 603 | err_free_cpumask: | ||
| 604 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
| 605 | err_free_pr: | ||
| 606 | kfree(pr); | ||
| 607 | return result; | ||
| 608 | } | 243 | } |
| 609 | 244 | ||
| 610 | static int acpi_processor_remove(struct acpi_device *device) | 245 | static int acpi_processor_stop(struct device *dev) |
| 611 | { | 246 | { |
| 612 | struct acpi_processor *pr = NULL; | 247 | struct acpi_device *device; |
| 248 | struct acpi_processor *pr; | ||
| 613 | 249 | ||
| 250 | if (acpi_bus_get_device(ACPI_HANDLE(dev), &device)) | ||
| 251 | return 0; | ||
| 614 | 252 | ||
| 615 | if (!device || !acpi_driver_data(device)) | 253 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, |
| 616 | return -EINVAL; | 254 | acpi_processor_notify); |
| 617 | 255 | ||
| 618 | pr = acpi_driver_data(device); | 256 | pr = acpi_driver_data(device); |
| 619 | 257 | if (!pr) | |
| 620 | if (pr->id >= nr_cpu_ids) | 258 | return 0; |
| 621 | goto free; | ||
| 622 | |||
| 623 | if (device->removal_type == ACPI_BUS_REMOVAL_EJECT) { | ||
| 624 | if (acpi_processor_handle_eject(pr)) | ||
| 625 | return -EINVAL; | ||
| 626 | } | ||
| 627 | 259 | ||
| 628 | acpi_processor_power_exit(pr); | 260 | acpi_processor_power_exit(pr); |
| 629 | 261 | ||
| 630 | sysfs_remove_link(&device->dev.kobj, "sysdev"); | ||
| 631 | |||
| 632 | if (pr->cdev) { | 262 | if (pr->cdev) { |
| 633 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); | 263 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); |
| 634 | sysfs_remove_link(&pr->cdev->device.kobj, "device"); | 264 | sysfs_remove_link(&pr->cdev->device.kobj, "device"); |
| 635 | thermal_cooling_device_unregister(pr->cdev); | 265 | thermal_cooling_device_unregister(pr->cdev); |
| 636 | pr->cdev = NULL; | 266 | pr->cdev = NULL; |
| 637 | } | 267 | } |
| 638 | |||
| 639 | per_cpu(processors, pr->id) = NULL; | ||
| 640 | per_cpu(processor_device_array, pr->id) = NULL; | ||
| 641 | try_offline_node(cpu_to_node(pr->id)); | ||
| 642 | |||
| 643 | free: | ||
| 644 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
| 645 | kfree(pr); | ||
| 646 | |||
| 647 | return 0; | 268 | return 0; |
| 648 | } | 269 | } |
| 649 | 270 | ||
| 650 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
| 651 | /**************************************************************************** | ||
| 652 | * Acpi processor hotplug support * | ||
| 653 | ****************************************************************************/ | ||
| 654 | |||
| 655 | static int is_processor_present(acpi_handle handle) | ||
| 656 | { | ||
| 657 | acpi_status status; | ||
| 658 | unsigned long long sta = 0; | ||
| 659 | |||
| 660 | |||
| 661 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | ||
| 662 | |||
| 663 | if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT)) | ||
| 664 | return 1; | ||
| 665 | |||
| 666 | /* | ||
| 667 | * _STA is mandatory for a processor that supports hot plug | ||
| 668 | */ | ||
| 669 | if (status == AE_NOT_FOUND) | ||
| 670 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 671 | "Processor does not support hot plug\n")); | ||
| 672 | else | ||
| 673 | ACPI_EXCEPTION((AE_INFO, status, | ||
| 674 | "Processor Device is not present")); | ||
| 675 | return 0; | ||
| 676 | } | ||
| 677 | |||
| 678 | static void acpi_processor_hotplug_notify(acpi_handle handle, | ||
| 679 | u32 event, void *data) | ||
| 680 | { | ||
| 681 | struct acpi_device *device = NULL; | ||
| 682 | struct acpi_eject_event *ej_event = NULL; | ||
| 683 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */ | ||
| 684 | acpi_status status; | ||
| 685 | int result; | ||
| 686 | |||
| 687 | acpi_scan_lock_acquire(); | ||
| 688 | |||
| 689 | switch (event) { | ||
| 690 | case ACPI_NOTIFY_BUS_CHECK: | ||
| 691 | case ACPI_NOTIFY_DEVICE_CHECK: | ||
| 692 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 693 | "Processor driver received %s event\n", | ||
| 694 | (event == ACPI_NOTIFY_BUS_CHECK) ? | ||
| 695 | "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK")); | ||
| 696 | |||
| 697 | if (!is_processor_present(handle)) | ||
| 698 | break; | ||
| 699 | |||
| 700 | if (!acpi_bus_get_device(handle, &device)) | ||
| 701 | break; | ||
| 702 | |||
| 703 | result = acpi_bus_scan(handle); | ||
| 704 | if (result) { | ||
| 705 | acpi_handle_err(handle, "Unable to add the device\n"); | ||
| 706 | break; | ||
| 707 | } | ||
| 708 | result = acpi_bus_get_device(handle, &device); | ||
| 709 | if (result) { | ||
| 710 | acpi_handle_err(handle, "Missing device object\n"); | ||
| 711 | break; | ||
| 712 | } | ||
| 713 | ost_code = ACPI_OST_SC_SUCCESS; | ||
| 714 | break; | ||
| 715 | |||
| 716 | case ACPI_NOTIFY_EJECT_REQUEST: | ||
| 717 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 718 | "received ACPI_NOTIFY_EJECT_REQUEST\n")); | ||
| 719 | |||
| 720 | if (acpi_bus_get_device(handle, &device)) { | ||
| 721 | acpi_handle_err(handle, | ||
| 722 | "Device don't exist, dropping EJECT\n"); | ||
| 723 | break; | ||
| 724 | } | ||
| 725 | if (!acpi_driver_data(device)) { | ||
| 726 | acpi_handle_err(handle, | ||
| 727 | "Driver data is NULL, dropping EJECT\n"); | ||
| 728 | break; | ||
| 729 | } | ||
| 730 | |||
| 731 | ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL); | ||
| 732 | if (!ej_event) { | ||
| 733 | acpi_handle_err(handle, "No memory, dropping EJECT\n"); | ||
| 734 | break; | ||
| 735 | } | ||
| 736 | |||
| 737 | get_device(&device->dev); | ||
| 738 | ej_event->device = device; | ||
| 739 | ej_event->event = ACPI_NOTIFY_EJECT_REQUEST; | ||
| 740 | /* The eject is carried out asynchronously. */ | ||
| 741 | status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, | ||
| 742 | ej_event); | ||
| 743 | if (ACPI_FAILURE(status)) { | ||
| 744 | put_device(&device->dev); | ||
| 745 | kfree(ej_event); | ||
| 746 | break; | ||
| 747 | } | ||
| 748 | goto out; | ||
| 749 | |||
| 750 | default: | ||
| 751 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 752 | "Unsupported event [0x%x]\n", event)); | ||
| 753 | |||
| 754 | /* non-hotplug event; possibly handled by other handler */ | ||
| 755 | goto out; | ||
| 756 | } | ||
| 757 | |||
| 758 | /* Inform firmware that the hotplug operation has completed */ | ||
| 759 | (void) acpi_evaluate_hotplug_ost(handle, event, ost_code, NULL); | ||
| 760 | |||
| 761 | out: | ||
| 762 | acpi_scan_lock_release(); | ||
| 763 | } | ||
| 764 | |||
| 765 | static acpi_status is_processor_device(acpi_handle handle) | ||
| 766 | { | ||
| 767 | struct acpi_device_info *info; | ||
| 768 | char *hid; | ||
| 769 | acpi_status status; | ||
| 770 | |||
| 771 | status = acpi_get_object_info(handle, &info); | ||
| 772 | if (ACPI_FAILURE(status)) | ||
| 773 | return status; | ||
| 774 | |||
| 775 | if (info->type == ACPI_TYPE_PROCESSOR) { | ||
| 776 | kfree(info); | ||
| 777 | return AE_OK; /* found a processor object */ | ||
| 778 | } | ||
| 779 | |||
| 780 | if (!(info->valid & ACPI_VALID_HID)) { | ||
| 781 | kfree(info); | ||
| 782 | return AE_ERROR; | ||
| 783 | } | ||
| 784 | |||
| 785 | hid = info->hardware_id.string; | ||
| 786 | if ((hid == NULL) || strcmp(hid, ACPI_PROCESSOR_DEVICE_HID)) { | ||
| 787 | kfree(info); | ||
| 788 | return AE_ERROR; | ||
| 789 | } | ||
| 790 | |||
| 791 | kfree(info); | ||
| 792 | return AE_OK; /* found a processor device object */ | ||
| 793 | } | ||
| 794 | |||
| 795 | static acpi_status | ||
| 796 | processor_walk_namespace_cb(acpi_handle handle, | ||
| 797 | u32 lvl, void *context, void **rv) | ||
| 798 | { | ||
| 799 | acpi_status status; | ||
| 800 | int *action = context; | ||
| 801 | |||
| 802 | status = is_processor_device(handle); | ||
| 803 | if (ACPI_FAILURE(status)) | ||
| 804 | return AE_OK; /* not a processor; continue to walk */ | ||
| 805 | |||
| 806 | switch (*action) { | ||
| 807 | case INSTALL_NOTIFY_HANDLER: | ||
| 808 | acpi_install_notify_handler(handle, | ||
| 809 | ACPI_SYSTEM_NOTIFY, | ||
| 810 | acpi_processor_hotplug_notify, | ||
| 811 | NULL); | ||
| 812 | break; | ||
| 813 | case UNINSTALL_NOTIFY_HANDLER: | ||
| 814 | acpi_remove_notify_handler(handle, | ||
| 815 | ACPI_SYSTEM_NOTIFY, | ||
| 816 | acpi_processor_hotplug_notify); | ||
| 817 | break; | ||
| 818 | default: | ||
| 819 | break; | ||
| 820 | } | ||
| 821 | |||
| 822 | /* found a processor; skip walking underneath */ | ||
| 823 | return AE_CTRL_DEPTH; | ||
| 824 | } | ||
| 825 | |||
| 826 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
| 827 | { | ||
| 828 | acpi_handle handle = pr->handle; | ||
| 829 | |||
| 830 | if (!is_processor_present(handle)) { | ||
| 831 | return AE_ERROR; | ||
| 832 | } | ||
| 833 | |||
| 834 | if (acpi_map_lsapic(handle, &pr->id)) | ||
| 835 | return AE_ERROR; | ||
| 836 | |||
| 837 | if (arch_register_cpu(pr->id)) { | ||
| 838 | acpi_unmap_lsapic(pr->id); | ||
| 839 | return AE_ERROR; | ||
| 840 | } | ||
| 841 | |||
| 842 | /* CPU got hot-plugged, but cpu_data is not initialized yet | ||
| 843 | * Set flag to delay cpu_idle/throttling initialization | ||
| 844 | * in: | ||
| 845 | * acpi_processor_add() | ||
| 846 | * acpi_processor_get_info() | ||
| 847 | * and do it when the CPU gets online the first time | ||
| 848 | * TBD: Cleanup above functions and try to do this more elegant. | ||
| 849 | */ | ||
| 850 | pr_info("CPU %d got hotplugged\n", pr->id); | ||
| 851 | pr->flags.need_hotplug_init = 1; | ||
| 852 | |||
| 853 | return AE_OK; | ||
| 854 | } | ||
| 855 | |||
| 856 | static int acpi_processor_handle_eject(struct acpi_processor *pr) | ||
| 857 | { | ||
| 858 | if (cpu_online(pr->id)) | ||
| 859 | cpu_down(pr->id); | ||
| 860 | |||
| 861 | get_online_cpus(); | ||
| 862 | /* | ||
| 863 | * The cpu might become online again at this point. So we check whether | ||
| 864 | * the cpu has been onlined or not. If the cpu became online, it means | ||
| 865 | * that someone wants to use the cpu. So acpi_processor_handle_eject() | ||
| 866 | * returns -EAGAIN. | ||
| 867 | */ | ||
| 868 | if (unlikely(cpu_online(pr->id))) { | ||
| 869 | put_online_cpus(); | ||
| 870 | pr_warn("Failed to remove CPU %d, because other task " | ||
| 871 | "brought the CPU back online\n", pr->id); | ||
| 872 | return -EAGAIN; | ||
| 873 | } | ||
| 874 | arch_unregister_cpu(pr->id); | ||
| 875 | acpi_unmap_lsapic(pr->id); | ||
| 876 | put_online_cpus(); | ||
| 877 | return (0); | ||
| 878 | } | ||
| 879 | #else | ||
| 880 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
| 881 | { | ||
| 882 | return AE_ERROR; | ||
| 883 | } | ||
| 884 | static int acpi_processor_handle_eject(struct acpi_processor *pr) | ||
| 885 | { | ||
| 886 | return (-EINVAL); | ||
| 887 | } | ||
| 888 | #endif | ||
| 889 | |||
| 890 | static | ||
| 891 | void acpi_processor_install_hotplug_notify(void) | ||
| 892 | { | ||
| 893 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
| 894 | int action = INSTALL_NOTIFY_HANDLER; | ||
| 895 | acpi_walk_namespace(ACPI_TYPE_ANY, | ||
| 896 | ACPI_ROOT_OBJECT, | ||
| 897 | ACPI_UINT32_MAX, | ||
| 898 | processor_walk_namespace_cb, NULL, &action, NULL); | ||
| 899 | #endif | ||
| 900 | register_hotcpu_notifier(&acpi_cpu_notifier); | ||
| 901 | } | ||
| 902 | |||
| 903 | static | ||
| 904 | void acpi_processor_uninstall_hotplug_notify(void) | ||
| 905 | { | ||
| 906 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
| 907 | int action = UNINSTALL_NOTIFY_HANDLER; | ||
| 908 | acpi_walk_namespace(ACPI_TYPE_ANY, | ||
| 909 | ACPI_ROOT_OBJECT, | ||
| 910 | ACPI_UINT32_MAX, | ||
| 911 | processor_walk_namespace_cb, NULL, &action, NULL); | ||
| 912 | #endif | ||
| 913 | unregister_hotcpu_notifier(&acpi_cpu_notifier); | ||
| 914 | } | ||
| 915 | |||
| 916 | /* | 271 | /* |
| 917 | * We keep the driver loaded even when ACPI is not running. | 272 | * We keep the driver loaded even when ACPI is not running. |
| 918 | * This is needed for the powernow-k8 driver, that works even without | 273 | * This is needed for the powernow-k8 driver, that works even without |
| 919 | * ACPI, but needs symbols from this driver | 274 | * ACPI, but needs symbols from this driver |
| 920 | */ | 275 | */ |
| 921 | 276 | ||
| 922 | static int __init acpi_processor_init(void) | 277 | static int __init acpi_processor_driver_init(void) |
| 923 | { | 278 | { |
| 924 | int result = 0; | 279 | int result = 0; |
| 925 | 280 | ||
| 926 | if (acpi_disabled) | 281 | if (acpi_disabled) |
| 927 | return 0; | 282 | return 0; |
| 928 | 283 | ||
| 929 | result = acpi_bus_register_driver(&acpi_processor_driver); | 284 | result = driver_register(&acpi_processor_driver); |
| 930 | if (result < 0) | 285 | if (result < 0) |
| 931 | return result; | 286 | return result; |
| 932 | 287 | ||
| 933 | acpi_processor_syscore_init(); | 288 | acpi_processor_syscore_init(); |
| 934 | 289 | register_hotcpu_notifier(&acpi_cpu_notifier); | |
| 935 | acpi_processor_install_hotplug_notify(); | ||
| 936 | |||
| 937 | acpi_thermal_cpufreq_init(); | 290 | acpi_thermal_cpufreq_init(); |
| 938 | |||
| 939 | acpi_processor_ppc_init(); | 291 | acpi_processor_ppc_init(); |
| 940 | |||
| 941 | acpi_processor_throttling_init(); | 292 | acpi_processor_throttling_init(); |
| 942 | |||
| 943 | return 0; | 293 | return 0; |
| 944 | } | 294 | } |
| 945 | 295 | ||
| 946 | static void __exit acpi_processor_exit(void) | 296 | static void __exit acpi_processor_driver_exit(void) |
| 947 | { | 297 | { |
| 948 | if (acpi_disabled) | 298 | if (acpi_disabled) |
| 949 | return; | 299 | return; |
| 950 | 300 | ||
| 951 | acpi_processor_ppc_exit(); | 301 | acpi_processor_ppc_exit(); |
| 952 | |||
| 953 | acpi_thermal_cpufreq_exit(); | 302 | acpi_thermal_cpufreq_exit(); |
| 954 | 303 | unregister_hotcpu_notifier(&acpi_cpu_notifier); | |
| 955 | acpi_processor_uninstall_hotplug_notify(); | ||
| 956 | |||
| 957 | acpi_processor_syscore_exit(); | 304 | acpi_processor_syscore_exit(); |
| 958 | 305 | driver_unregister(&acpi_processor_driver); | |
| 959 | acpi_bus_unregister_driver(&acpi_processor_driver); | ||
| 960 | |||
| 961 | return; | ||
| 962 | } | 306 | } |
| 963 | 307 | ||
| 964 | module_init(acpi_processor_init); | 308 | module_init(acpi_processor_driver_init); |
| 965 | module_exit(acpi_processor_exit); | 309 | module_exit(acpi_processor_driver_exit); |
| 966 | 310 | ||
| 967 | MODULE_ALIAS("processor"); | 311 | MODULE_ALIAS("processor"); |
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index a3868f6c222a..3322b47ab7ca 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c | |||
| @@ -304,7 +304,8 @@ static void acpi_dev_irqresource_disabled(struct resource *res, u32 gsi) | |||
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | static void acpi_dev_get_irqresource(struct resource *res, u32 gsi, | 306 | static void acpi_dev_get_irqresource(struct resource *res, u32 gsi, |
| 307 | u8 triggering, u8 polarity, u8 shareable) | 307 | u8 triggering, u8 polarity, u8 shareable, |
| 308 | bool legacy) | ||
| 308 | { | 309 | { |
| 309 | int irq, p, t; | 310 | int irq, p, t; |
| 310 | 311 | ||
| @@ -317,14 +318,19 @@ static void acpi_dev_get_irqresource(struct resource *res, u32 gsi, | |||
| 317 | * In IO-APIC mode, use overrided attribute. Two reasons: | 318 | * In IO-APIC mode, use overrided attribute. Two reasons: |
| 318 | * 1. BIOS bug in DSDT | 319 | * 1. BIOS bug in DSDT |
| 319 | * 2. BIOS uses IO-APIC mode Interrupt Source Override | 320 | * 2. BIOS uses IO-APIC mode Interrupt Source Override |
| 321 | * | ||
| 322 | * We do this only if we are dealing with IRQ() or IRQNoFlags() | ||
| 323 | * resource (the legacy ISA resources). With modern ACPI 5 devices | ||
| 324 | * using extended IRQ descriptors we take the IRQ configuration | ||
| 325 | * from _CRS directly. | ||
| 320 | */ | 326 | */ |
| 321 | if (!acpi_get_override_irq(gsi, &t, &p)) { | 327 | if (legacy && !acpi_get_override_irq(gsi, &t, &p)) { |
| 322 | u8 trig = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; | 328 | u8 trig = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; |
| 323 | u8 pol = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; | 329 | u8 pol = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; |
| 324 | 330 | ||
| 325 | if (triggering != trig || polarity != pol) { | 331 | if (triggering != trig || polarity != pol) { |
| 326 | pr_warning("ACPI: IRQ %d override to %s, %s\n", gsi, | 332 | pr_warning("ACPI: IRQ %d override to %s, %s\n", gsi, |
| 327 | t ? "edge" : "level", p ? "low" : "high"); | 333 | t ? "level" : "edge", p ? "low" : "high"); |
| 328 | triggering = trig; | 334 | triggering = trig; |
| 329 | polarity = pol; | 335 | polarity = pol; |
| 330 | } | 336 | } |
| @@ -373,7 +379,7 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index, | |||
| 373 | } | 379 | } |
| 374 | acpi_dev_get_irqresource(res, irq->interrupts[index], | 380 | acpi_dev_get_irqresource(res, irq->interrupts[index], |
| 375 | irq->triggering, irq->polarity, | 381 | irq->triggering, irq->polarity, |
| 376 | irq->sharable); | 382 | irq->sharable, true); |
| 377 | break; | 383 | break; |
| 378 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: | 384 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: |
| 379 | ext_irq = &ares->data.extended_irq; | 385 | ext_irq = &ares->data.extended_irq; |
| @@ -383,7 +389,7 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index, | |||
| 383 | } | 389 | } |
| 384 | acpi_dev_get_irqresource(res, ext_irq->interrupts[index], | 390 | acpi_dev_get_irqresource(res, ext_irq->interrupts[index], |
| 385 | ext_irq->triggering, ext_irq->polarity, | 391 | ext_irq->triggering, ext_irq->polarity, |
| 386 | ext_irq->sharable); | 392 | ext_irq->sharable, false); |
| 387 | break; | 393 | break; |
| 388 | default: | 394 | default: |
| 389 | return false; | 395 | return false; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index b14ac46948c9..e0db2dc42370 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -27,6 +27,12 @@ extern struct acpi_device *acpi_root; | |||
| 27 | 27 | ||
| 28 | #define ACPI_IS_ROOT_DEVICE(device) (!(device)->parent) | 28 | #define ACPI_IS_ROOT_DEVICE(device) (!(device)->parent) |
| 29 | 29 | ||
| 30 | /* | ||
| 31 | * If set, devices will be hot-removed even if they cannot be put offline | ||
| 32 | * gracefully (from the kernel's standpoint). | ||
| 33 | */ | ||
| 34 | bool acpi_force_hot_remove; | ||
| 35 | |||
| 30 | static const char *dummy_hid = "device"; | 36 | static const char *dummy_hid = "device"; |
| 31 | 37 | ||
| 32 | static LIST_HEAD(acpi_device_list); | 38 | static LIST_HEAD(acpi_device_list); |
| @@ -120,12 +126,78 @@ acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, cha | |||
| 120 | } | 126 | } |
| 121 | static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL); | 127 | static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL); |
| 122 | 128 | ||
| 129 | static acpi_status acpi_bus_offline_companions(acpi_handle handle, u32 lvl, | ||
| 130 | void *data, void **ret_p) | ||
| 131 | { | ||
| 132 | struct acpi_device *device = NULL; | ||
| 133 | struct acpi_device_physical_node *pn; | ||
| 134 | bool second_pass = (bool)data; | ||
| 135 | acpi_status status = AE_OK; | ||
| 136 | |||
| 137 | if (acpi_bus_get_device(handle, &device)) | ||
| 138 | return AE_OK; | ||
| 139 | |||
| 140 | mutex_lock(&device->physical_node_lock); | ||
| 141 | |||
| 142 | list_for_each_entry(pn, &device->physical_node_list, node) { | ||
| 143 | int ret; | ||
| 144 | |||
| 145 | if (second_pass) { | ||
| 146 | /* Skip devices offlined by the first pass. */ | ||
| 147 | if (pn->put_online) | ||
| 148 | continue; | ||
| 149 | } else { | ||
| 150 | pn->put_online = false; | ||
| 151 | } | ||
| 152 | ret = device_offline(pn->dev); | ||
| 153 | if (acpi_force_hot_remove) | ||
| 154 | continue; | ||
| 155 | |||
| 156 | if (ret >= 0) { | ||
| 157 | pn->put_online = !ret; | ||
| 158 | } else { | ||
| 159 | *ret_p = pn->dev; | ||
| 160 | if (second_pass) { | ||
| 161 | status = AE_ERROR; | ||
| 162 | break; | ||
| 163 | } | ||
| 164 | } | ||
| 165 | } | ||
| 166 | |||
| 167 | mutex_unlock(&device->physical_node_lock); | ||
| 168 | |||
| 169 | return status; | ||
| 170 | } | ||
| 171 | |||
| 172 | static acpi_status acpi_bus_online_companions(acpi_handle handle, u32 lvl, | ||
| 173 | void *data, void **ret_p) | ||
| 174 | { | ||
| 175 | struct acpi_device *device = NULL; | ||
| 176 | struct acpi_device_physical_node *pn; | ||
| 177 | |||
| 178 | if (acpi_bus_get_device(handle, &device)) | ||
| 179 | return AE_OK; | ||
| 180 | |||
| 181 | mutex_lock(&device->physical_node_lock); | ||
| 182 | |||
| 183 | list_for_each_entry(pn, &device->physical_node_list, node) | ||
| 184 | if (pn->put_online) { | ||
| 185 | device_online(pn->dev); | ||
| 186 | pn->put_online = false; | ||
| 187 | } | ||
| 188 | |||
| 189 | mutex_unlock(&device->physical_node_lock); | ||
| 190 | |||
| 191 | return AE_OK; | ||
| 192 | } | ||
| 193 | |||
| 123 | static int acpi_scan_hot_remove(struct acpi_device *device) | 194 | static int acpi_scan_hot_remove(struct acpi_device *device) |
| 124 | { | 195 | { |
| 125 | acpi_handle handle = device->handle; | 196 | acpi_handle handle = device->handle; |
| 126 | acpi_handle not_used; | 197 | acpi_handle not_used; |
| 127 | struct acpi_object_list arg_list; | 198 | struct acpi_object_list arg_list; |
| 128 | union acpi_object arg; | 199 | union acpi_object arg; |
| 200 | struct device *errdev; | ||
| 129 | acpi_status status; | 201 | acpi_status status; |
| 130 | unsigned long long sta; | 202 | unsigned long long sta; |
| 131 | 203 | ||
| @@ -136,10 +208,53 @@ static int acpi_scan_hot_remove(struct acpi_device *device) | |||
| 136 | return -EINVAL; | 208 | return -EINVAL; |
| 137 | } | 209 | } |
| 138 | 210 | ||
| 211 | lock_device_hotplug(); | ||
| 212 | |||
| 213 | /* | ||
| 214 | * Carry out two passes here and ignore errors in the first pass, | ||
| 215 | * because if the devices in question are memory blocks and | ||
| 216 | * CONFIG_MEMCG is set, one of the blocks may hold data structures | ||
| 217 | * that the other blocks depend on, but it is not known in advance which | ||
| 218 | * block holds them. | ||
| 219 | * | ||
| 220 | * If the first pass is successful, the second one isn't needed, though. | ||
| 221 | */ | ||
| 222 | errdev = NULL; | ||
| 223 | acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX, | ||
| 224 | NULL, acpi_bus_offline_companions, | ||
| 225 | (void *)false, (void **)&errdev); | ||
| 226 | acpi_bus_offline_companions(handle, 0, (void *)false, (void **)&errdev); | ||
| 227 | if (errdev) { | ||
| 228 | errdev = NULL; | ||
| 229 | acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX, | ||
| 230 | NULL, acpi_bus_offline_companions, | ||
| 231 | (void *)true , (void **)&errdev); | ||
| 232 | if (!errdev || acpi_force_hot_remove) | ||
| 233 | acpi_bus_offline_companions(handle, 0, (void *)true, | ||
| 234 | (void **)&errdev); | ||
| 235 | |||
| 236 | if (errdev && !acpi_force_hot_remove) { | ||
| 237 | dev_warn(errdev, "Offline failed.\n"); | ||
| 238 | acpi_bus_online_companions(handle, 0, NULL, NULL); | ||
| 239 | acpi_walk_namespace(ACPI_TYPE_ANY, handle, | ||
| 240 | ACPI_UINT32_MAX, | ||
| 241 | acpi_bus_online_companions, NULL, | ||
| 242 | NULL, NULL); | ||
| 243 | |||
| 244 | unlock_device_hotplug(); | ||
| 245 | |||
| 246 | put_device(&device->dev); | ||
| 247 | return -EBUSY; | ||
| 248 | } | ||
| 249 | } | ||
| 250 | |||
| 139 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 251 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 140 | "Hot-removing device %s...\n", dev_name(&device->dev))); | 252 | "Hot-removing device %s...\n", dev_name(&device->dev))); |
| 141 | 253 | ||
| 142 | acpi_bus_trim(device); | 254 | acpi_bus_trim(device); |
| 255 | |||
| 256 | unlock_device_hotplug(); | ||
| 257 | |||
| 143 | /* Device node has been unregistered. */ | 258 | /* Device node has been unregistered. */ |
| 144 | put_device(&device->dev); | 259 | put_device(&device->dev); |
| 145 | device = NULL; | 260 | device = NULL; |
| @@ -236,6 +351,7 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) | |||
| 236 | int error; | 351 | int error; |
| 237 | 352 | ||
| 238 | mutex_lock(&acpi_scan_lock); | 353 | mutex_lock(&acpi_scan_lock); |
| 354 | lock_device_hotplug(); | ||
| 239 | 355 | ||
| 240 | acpi_bus_get_device(handle, &device); | 356 | acpi_bus_get_device(handle, &device); |
| 241 | if (device) { | 357 | if (device) { |
| @@ -259,6 +375,7 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) | |||
| 259 | kobject_uevent(&device->dev.kobj, KOBJ_ONLINE); | 375 | kobject_uevent(&device->dev.kobj, KOBJ_ONLINE); |
| 260 | 376 | ||
| 261 | out: | 377 | out: |
| 378 | unlock_device_hotplug(); | ||
| 262 | acpi_evaluate_hotplug_ost(handle, ost_source, ost_code, NULL); | 379 | acpi_evaluate_hotplug_ost(handle, ost_source, ost_code, NULL); |
| 263 | mutex_unlock(&acpi_scan_lock); | 380 | mutex_unlock(&acpi_scan_lock); |
| 264 | } | 381 | } |
| @@ -816,32 +933,43 @@ static void acpi_device_remove_notify_handler(struct acpi_device *device) | |||
| 816 | acpi_device_notify); | 933 | acpi_device_notify); |
| 817 | } | 934 | } |
| 818 | 935 | ||
| 819 | static int acpi_bus_driver_init(struct acpi_device *, struct acpi_driver *); | 936 | static int acpi_device_probe(struct device *dev) |
| 820 | static int acpi_device_probe(struct device * dev) | ||
| 821 | { | 937 | { |
| 822 | struct acpi_device *acpi_dev = to_acpi_device(dev); | 938 | struct acpi_device *acpi_dev = to_acpi_device(dev); |
| 823 | struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver); | 939 | struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver); |
| 824 | int ret; | 940 | int ret; |
| 825 | 941 | ||
| 826 | ret = acpi_bus_driver_init(acpi_dev, acpi_drv); | 942 | if (acpi_dev->handler) |
| 827 | if (!ret) { | 943 | return -EINVAL; |
| 828 | if (acpi_drv->ops.notify) { | ||
| 829 | ret = acpi_device_install_notify_handler(acpi_dev); | ||
| 830 | if (ret) { | ||
| 831 | if (acpi_drv->ops.remove) | ||
| 832 | acpi_drv->ops.remove(acpi_dev); | ||
| 833 | acpi_dev->driver = NULL; | ||
| 834 | acpi_dev->driver_data = NULL; | ||
| 835 | return ret; | ||
| 836 | } | ||
| 837 | } | ||
| 838 | 944 | ||
| 839 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 945 | if (!acpi_drv->ops.add) |
| 840 | "Found driver [%s] for device [%s]\n", | 946 | return -ENOSYS; |
| 841 | acpi_drv->name, acpi_dev->pnp.bus_id)); | 947 | |
| 842 | get_device(dev); | 948 | ret = acpi_drv->ops.add(acpi_dev); |
| 949 | if (ret) | ||
| 950 | return ret; | ||
| 951 | |||
| 952 | acpi_dev->driver = acpi_drv; | ||
| 953 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 954 | "Driver [%s] successfully bound to device [%s]\n", | ||
| 955 | acpi_drv->name, acpi_dev->pnp.bus_id)); | ||
| 956 | |||
| 957 | if (acpi_drv->ops.notify) { | ||
| 958 | ret = acpi_device_install_notify_handler(acpi_dev); | ||
| 959 | if (ret) { | ||
| 960 | if (acpi_drv->ops.remove) | ||
| 961 | acpi_drv->ops.remove(acpi_dev); | ||
| 962 | |||
| 963 | acpi_dev->driver = NULL; | ||
| 964 | acpi_dev->driver_data = NULL; | ||
| 965 | return ret; | ||
| 966 | } | ||
| 843 | } | 967 | } |
| 844 | return ret; | 968 | |
| 969 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found driver [%s] for device [%s]\n", | ||
| 970 | acpi_drv->name, acpi_dev->pnp.bus_id)); | ||
| 971 | get_device(dev); | ||
| 972 | return 0; | ||
| 845 | } | 973 | } |
| 846 | 974 | ||
| 847 | static int acpi_device_remove(struct device * dev) | 975 | static int acpi_device_remove(struct device * dev) |
| @@ -952,7 +1080,6 @@ int acpi_device_add(struct acpi_device *device, | |||
| 952 | printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n", | 1080 | printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n", |
| 953 | dev_name(&device->dev)); | 1081 | dev_name(&device->dev)); |
| 954 | 1082 | ||
| 955 | device->removal_type = ACPI_BUS_REMOVAL_NORMAL; | ||
| 956 | return 0; | 1083 | return 0; |
| 957 | 1084 | ||
| 958 | err: | 1085 | err: |
| @@ -998,41 +1125,6 @@ static void acpi_device_unregister(struct acpi_device *device) | |||
| 998 | Driver Management | 1125 | Driver Management |
| 999 | -------------------------------------------------------------------------- */ | 1126 | -------------------------------------------------------------------------- */ |
| 1000 | /** | 1127 | /** |
| 1001 | * acpi_bus_driver_init - add a device to a driver | ||
| 1002 | * @device: the device to add and initialize | ||
| 1003 | * @driver: driver for the device | ||
| 1004 | * | ||
| 1005 | * Used to initialize a device via its device driver. Called whenever a | ||
| 1006 | * driver is bound to a device. Invokes the driver's add() ops. | ||
| 1007 | */ | ||
| 1008 | static int | ||
| 1009 | acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver) | ||
| 1010 | { | ||
| 1011 | int result = 0; | ||
| 1012 | |||
| 1013 | if (!device || !driver) | ||
| 1014 | return -EINVAL; | ||
| 1015 | |||
| 1016 | if (!driver->ops.add) | ||
| 1017 | return -ENOSYS; | ||
| 1018 | |||
| 1019 | result = driver->ops.add(device); | ||
| 1020 | if (result) | ||
| 1021 | return result; | ||
| 1022 | |||
| 1023 | device->driver = driver; | ||
| 1024 | |||
| 1025 | /* | ||
| 1026 | * TBD - Configuration Management: Assign resources to device based | ||
| 1027 | * upon possible configuration and currently allocated resources. | ||
| 1028 | */ | ||
| 1029 | |||
| 1030 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
| 1031 | "Driver successfully bound to device\n")); | ||
| 1032 | return 0; | ||
| 1033 | } | ||
| 1034 | |||
| 1035 | /** | ||
| 1036 | * acpi_bus_register_driver - register a driver with the ACPI bus | 1128 | * acpi_bus_register_driver - register a driver with the ACPI bus |
| 1037 | * @driver: driver being registered | 1129 | * @driver: driver being registered |
| 1038 | * | 1130 | * |
| @@ -1939,7 +2031,6 @@ static acpi_status acpi_bus_device_detach(acpi_handle handle, u32 lvl_not_used, | |||
| 1939 | if (!acpi_bus_get_device(handle, &device)) { | 2031 | if (!acpi_bus_get_device(handle, &device)) { |
| 1940 | struct acpi_scan_handler *dev_handler = device->handler; | 2032 | struct acpi_scan_handler *dev_handler = device->handler; |
| 1941 | 2033 | ||
| 1942 | device->removal_type = ACPI_BUS_REMOVAL_EJECT; | ||
| 1943 | if (dev_handler) { | 2034 | if (dev_handler) { |
| 1944 | if (dev_handler->detach) | 2035 | if (dev_handler->detach) |
| 1945 | dev_handler->detach(device); | 2036 | dev_handler->detach(device); |
| @@ -2038,10 +2129,12 @@ int __init acpi_scan_init(void) | |||
| 2038 | 2129 | ||
| 2039 | acpi_pci_root_init(); | 2130 | acpi_pci_root_init(); |
| 2040 | acpi_pci_link_init(); | 2131 | acpi_pci_link_init(); |
| 2132 | acpi_processor_init(); | ||
| 2041 | acpi_platform_init(); | 2133 | acpi_platform_init(); |
| 2042 | acpi_lpss_init(); | 2134 | acpi_lpss_init(); |
| 2043 | acpi_container_init(); | 2135 | acpi_container_init(); |
| 2044 | acpi_memory_hotplug_init(); | 2136 | acpi_memory_hotplug_init(); |
| 2137 | acpi_dock_init(); | ||
| 2045 | 2138 | ||
| 2046 | mutex_lock(&acpi_scan_lock); | 2139 | mutex_lock(&acpi_scan_lock); |
| 2047 | /* | 2140 | /* |
diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c index fcae5fa2e1b3..5c5d1624fa2c 100644 --- a/drivers/acpi/sysfs.c +++ b/drivers/acpi/sysfs.c | |||
| @@ -780,6 +780,33 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug, | |||
| 780 | pr_err(PREFIX "Unable to add hotplug profile '%s'\n", name); | 780 | pr_err(PREFIX "Unable to add hotplug profile '%s'\n", name); |
| 781 | } | 781 | } |
| 782 | 782 | ||
| 783 | static ssize_t force_remove_show(struct kobject *kobj, | ||
| 784 | struct kobj_attribute *attr, char *buf) | ||
| 785 | { | ||
| 786 | return sprintf(buf, "%d\n", !!acpi_force_hot_remove); | ||
| 787 | } | ||
| 788 | |||
| 789 | static ssize_t force_remove_store(struct kobject *kobj, | ||
| 790 | struct kobj_attribute *attr, | ||
| 791 | const char *buf, size_t size) | ||
| 792 | { | ||
| 793 | bool val; | ||
| 794 | int ret; | ||
| 795 | |||
| 796 | ret = strtobool(buf, &val); | ||
| 797 | if (ret < 0) | ||
| 798 | return ret; | ||
| 799 | |||
| 800 | lock_device_hotplug(); | ||
| 801 | acpi_force_hot_remove = val; | ||
| 802 | unlock_device_hotplug(); | ||
| 803 | return size; | ||
| 804 | } | ||
| 805 | |||
| 806 | static const struct kobj_attribute force_remove_attr = | ||
| 807 | __ATTR(force_remove, S_IRUGO | S_IWUSR, force_remove_show, | ||
| 808 | force_remove_store); | ||
| 809 | |||
| 783 | int __init acpi_sysfs_init(void) | 810 | int __init acpi_sysfs_init(void) |
| 784 | { | 811 | { |
| 785 | int result; | 812 | int result; |
| @@ -789,6 +816,10 @@ int __init acpi_sysfs_init(void) | |||
| 789 | return result; | 816 | return result; |
| 790 | 817 | ||
| 791 | hotplug_kobj = kobject_create_and_add("hotplug", acpi_kobj); | 818 | hotplug_kobj = kobject_create_and_add("hotplug", acpi_kobj); |
| 819 | result = sysfs_create_file(hotplug_kobj, &force_remove_attr.attr); | ||
| 820 | if (result) | ||
| 821 | return result; | ||
| 822 | |||
| 792 | result = sysfs_create_file(acpi_kobj, &pm_profile_attr.attr); | 823 | result = sysfs_create_file(acpi_kobj, &pm_profile_attr.attr); |
| 793 | return result; | 824 | return result; |
| 794 | } | 825 | } |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 440eadf2d32c..5d7075d25700 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -1722,9 +1722,6 @@ static int acpi_video_bus_add(struct acpi_device *device) | |||
| 1722 | int error; | 1722 | int error; |
| 1723 | acpi_status status; | 1723 | acpi_status status; |
| 1724 | 1724 | ||
| 1725 | if (device->handler) | ||
| 1726 | return -EINVAL; | ||
| 1727 | |||
| 1728 | status = acpi_walk_namespace(ACPI_TYPE_DEVICE, | 1725 | status = acpi_walk_namespace(ACPI_TYPE_DEVICE, |
| 1729 | device->parent->handle, 1, | 1726 | device->parent->handle, 1, |
| 1730 | acpi_video_bus_match, NULL, | 1727 | acpi_video_bus_match, NULL, |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 87f2f395d79a..cf4e7020adac 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -156,8 +156,10 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, | |||
| 156 | 156 | ||
| 157 | spin_unlock_irqrestore(ap->lock, flags); | 157 | spin_unlock_irqrestore(ap->lock, flags); |
| 158 | 158 | ||
| 159 | if (wait) | 159 | if (wait) { |
| 160 | ata_port_wait_eh(ap); | 160 | ata_port_wait_eh(ap); |
| 161 | flush_work(&ap->hotplug_task.work); | ||
| 162 | } | ||
| 161 | } | 163 | } |
| 162 | 164 | ||
| 163 | static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data) | 165 | static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data) |
| @@ -214,6 +216,39 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = { | |||
| 214 | .uevent = ata_acpi_ap_uevent, | 216 | .uevent = ata_acpi_ap_uevent, |
| 215 | }; | 217 | }; |
| 216 | 218 | ||
| 219 | void ata_acpi_hotplug_init(struct ata_host *host) | ||
| 220 | { | ||
| 221 | int i; | ||
| 222 | |||
| 223 | for (i = 0; i < host->n_ports; i++) { | ||
| 224 | struct ata_port *ap = host->ports[i]; | ||
| 225 | acpi_handle handle; | ||
| 226 | struct ata_device *dev; | ||
| 227 | |||
| 228 | if (!ap) | ||
| 229 | continue; | ||
| 230 | |||
| 231 | handle = ata_ap_acpi_handle(ap); | ||
| 232 | if (handle) { | ||
| 233 | /* we might be on a docking station */ | ||
| 234 | register_hotplug_dock_device(handle, | ||
| 235 | &ata_acpi_ap_dock_ops, ap, | ||
| 236 | NULL, NULL); | ||
| 237 | } | ||
| 238 | |||
| 239 | ata_for_each_dev(dev, &ap->link, ALL) { | ||
| 240 | handle = ata_dev_acpi_handle(dev); | ||
| 241 | if (!handle) | ||
| 242 | continue; | ||
| 243 | |||
| 244 | /* we might be on a docking station */ | ||
| 245 | register_hotplug_dock_device(handle, | ||
| 246 | &ata_acpi_dev_dock_ops, | ||
| 247 | dev, NULL, NULL); | ||
| 248 | } | ||
| 249 | } | ||
| 250 | } | ||
| 251 | |||
| 217 | /** | 252 | /** |
| 218 | * ata_acpi_dissociate - dissociate ATA host from ACPI objects | 253 | * ata_acpi_dissociate - dissociate ATA host from ACPI objects |
| 219 | * @host: target ATA host | 254 | * @host: target ATA host |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index f2184276539d..adf002a3c584 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -6148,6 +6148,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) | |||
| 6148 | if (rc) | 6148 | if (rc) |
| 6149 | goto err_tadd; | 6149 | goto err_tadd; |
| 6150 | 6150 | ||
| 6151 | ata_acpi_hotplug_init(host); | ||
| 6152 | |||
| 6151 | /* set cable, sata_spd_limit and report */ | 6153 | /* set cable, sata_spd_limit and report */ |
| 6152 | for (i = 0; i < host->n_ports; i++) { | 6154 | for (i = 0; i < host->n_ports; i++) { |
| 6153 | struct ata_port *ap = host->ports[i]; | 6155 | struct ata_port *ap = host->ports[i]; |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index c949dd311b2e..577d902bc4de 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
| @@ -122,6 +122,7 @@ extern int ata_acpi_register(void); | |||
| 122 | extern void ata_acpi_unregister(void); | 122 | extern void ata_acpi_unregister(void); |
| 123 | extern void ata_acpi_bind(struct ata_device *dev); | 123 | extern void ata_acpi_bind(struct ata_device *dev); |
| 124 | extern void ata_acpi_unbind(struct ata_device *dev); | 124 | extern void ata_acpi_unbind(struct ata_device *dev); |
| 125 | extern void ata_acpi_hotplug_init(struct ata_host *host); | ||
| 125 | #else | 126 | #else |
| 126 | static inline void ata_acpi_dissociate(struct ata_host *host) { } | 127 | static inline void ata_acpi_dissociate(struct ata_host *host) { } |
| 127 | static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } | 128 | static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } |
| @@ -134,6 +135,7 @@ static inline int ata_acpi_register(void) { return 0; } | |||
| 134 | static inline void ata_acpi_unregister(void) { } | 135 | static inline void ata_acpi_unregister(void) { } |
| 135 | static inline void ata_acpi_bind(struct ata_device *dev) { } | 136 | static inline void ata_acpi_bind(struct ata_device *dev) { } |
| 136 | static inline void ata_acpi_unbind(struct ata_device *dev) { } | 137 | static inline void ata_acpi_unbind(struct ata_device *dev) { } |
| 138 | static inline void ata_acpi_hotplug_init(struct ata_host *host) {} | ||
| 137 | #endif | 139 | #endif |
| 138 | 140 | ||
| 139 | /* libata-scsi.c */ | 141 | /* libata-scsi.c */ |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 2499cefdcdf2..2166f34b7d84 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -403,6 +403,36 @@ static ssize_t store_uevent(struct device *dev, struct device_attribute *attr, | |||
| 403 | static struct device_attribute uevent_attr = | 403 | static struct device_attribute uevent_attr = |
| 404 | __ATTR(uevent, S_IRUGO | S_IWUSR, show_uevent, store_uevent); | 404 | __ATTR(uevent, S_IRUGO | S_IWUSR, show_uevent, store_uevent); |
| 405 | 405 | ||
| 406 | static ssize_t show_online(struct device *dev, struct device_attribute *attr, | ||
| 407 | char *buf) | ||
| 408 | { | ||
| 409 | bool val; | ||
| 410 | |||
| 411 | lock_device_hotplug(); | ||
| 412 | val = !dev->offline; | ||
| 413 | unlock_device_hotplug(); | ||
| 414 | return sprintf(buf, "%u\n", val); | ||
| 415 | } | ||
| 416 | |||
| 417 | static ssize_t store_online(struct device *dev, struct device_attribute *attr, | ||
| 418 | const char *buf, size_t count) | ||
| 419 | { | ||
| 420 | bool val; | ||
| 421 | int ret; | ||
| 422 | |||
| 423 | ret = strtobool(buf, &val); | ||
| 424 | if (ret < 0) | ||
| 425 | return ret; | ||
| 426 | |||
| 427 | lock_device_hotplug(); | ||
| 428 | ret = val ? device_online(dev) : device_offline(dev); | ||
| 429 | unlock_device_hotplug(); | ||
| 430 | return ret < 0 ? ret : count; | ||
| 431 | } | ||
| 432 | |||
| 433 | static struct device_attribute online_attr = | ||
| 434 | __ATTR(online, S_IRUGO | S_IWUSR, show_online, store_online); | ||
| 435 | |||
| 406 | static int device_add_attributes(struct device *dev, | 436 | static int device_add_attributes(struct device *dev, |
| 407 | struct device_attribute *attrs) | 437 | struct device_attribute *attrs) |
| 408 | { | 438 | { |
| @@ -516,6 +546,12 @@ static int device_add_attrs(struct device *dev) | |||
| 516 | if (error) | 546 | if (error) |
| 517 | goto err_remove_type_groups; | 547 | goto err_remove_type_groups; |
| 518 | 548 | ||
| 549 | if (device_supports_offline(dev) && !dev->offline_disabled) { | ||
| 550 | error = device_create_file(dev, &online_attr); | ||
| 551 | if (error) | ||
| 552 | goto err_remove_type_groups; | ||
| 553 | } | ||
| 554 | |||
| 519 | return 0; | 555 | return 0; |
| 520 | 556 | ||
| 521 | err_remove_type_groups: | 557 | err_remove_type_groups: |
| @@ -536,6 +572,7 @@ static void device_remove_attrs(struct device *dev) | |||
| 536 | struct class *class = dev->class; | 572 | struct class *class = dev->class; |
| 537 | const struct device_type *type = dev->type; | 573 | const struct device_type *type = dev->type; |
| 538 | 574 | ||
| 575 | device_remove_file(dev, &online_attr); | ||
| 539 | device_remove_groups(dev, dev->groups); | 576 | device_remove_groups(dev, dev->groups); |
| 540 | 577 | ||
| 541 | if (type) | 578 | if (type) |
| @@ -1433,6 +1470,99 @@ EXPORT_SYMBOL_GPL(put_device); | |||
| 1433 | EXPORT_SYMBOL_GPL(device_create_file); | 1470 | EXPORT_SYMBOL_GPL(device_create_file); |
| 1434 | EXPORT_SYMBOL_GPL(device_remove_file); | 1471 | EXPORT_SYMBOL_GPL(device_remove_file); |
| 1435 | 1472 | ||
| 1473 | static DEFINE_MUTEX(device_hotplug_lock); | ||
| 1474 | |||
| 1475 | void lock_device_hotplug(void) | ||
| 1476 | { | ||
| 1477 | mutex_lock(&device_hotplug_lock); | ||
| 1478 | } | ||
| 1479 | |||
| 1480 | void unlock_device_hotplug(void) | ||
| 1481 | { | ||
| 1482 | mutex_unlock(&device_hotplug_lock); | ||
| 1483 | } | ||
| 1484 | |||
| 1485 | static int device_check_offline(struct device *dev, void *not_used) | ||
| 1486 | { | ||
| 1487 | int ret; | ||
| 1488 | |||
| 1489 | ret = device_for_each_child(dev, NULL, device_check_offline); | ||
| 1490 | if (ret) | ||
| 1491 | return ret; | ||
| 1492 | |||
| 1493 | return device_supports_offline(dev) && !dev->offline ? -EBUSY : 0; | ||
| 1494 | } | ||
| 1495 | |||
| 1496 | /** | ||
| 1497 | * device_offline - Prepare the device for hot-removal. | ||
| 1498 | * @dev: Device to be put offline. | ||
| 1499 | * | ||
| 1500 | * Execute the device bus type's .offline() callback, if present, to prepare | ||
| 1501 | * the device for a subsequent hot-removal. If that succeeds, the device must | ||
| 1502 | * not be used until either it is removed or its bus type's .online() callback | ||
| 1503 | * is executed. | ||
| 1504 | * | ||
| 1505 | * Call under device_hotplug_lock. | ||
| 1506 | */ | ||
| 1507 | int device_offline(struct device *dev) | ||
| 1508 | { | ||
| 1509 | int ret; | ||
| 1510 | |||
| 1511 | if (dev->offline_disabled) | ||
| 1512 | return -EPERM; | ||
| 1513 | |||
| 1514 | ret = device_for_each_child(dev, NULL, device_check_offline); | ||
| 1515 | if (ret) | ||
| 1516 | return ret; | ||
| 1517 | |||
| 1518 | device_lock(dev); | ||
| 1519 | if (device_supports_offline(dev)) { | ||
| 1520 | if (dev->offline) { | ||
| 1521 | ret = 1; | ||
| 1522 | } else { | ||
| 1523 | ret = dev->bus->offline(dev); | ||
| 1524 | if (!ret) { | ||
| 1525 | kobject_uevent(&dev->kobj, KOBJ_OFFLINE); | ||
| 1526 | dev->offline = true; | ||
| 1527 | } | ||
| 1528 | } | ||
| 1529 | } | ||
| 1530 | device_unlock(dev); | ||
| 1531 | |||
| 1532 | return ret; | ||
| 1533 | } | ||
| 1534 | |||
| 1535 | /** | ||
| 1536 | * device_online - Put the device back online after successful device_offline(). | ||
| 1537 | * @dev: Device to be put back online. | ||
| 1538 | * | ||
| 1539 | * If device_offline() has been successfully executed for @dev, but the device | ||
| 1540 | * has not been removed subsequently, execute its bus type's .online() callback | ||
| 1541 | * to indicate that the device can be used again. | ||
| 1542 | * | ||
| 1543 | * Call under device_hotplug_lock. | ||
| 1544 | */ | ||
| 1545 | int device_online(struct device *dev) | ||
| 1546 | { | ||
| 1547 | int ret = 0; | ||
| 1548 | |||
| 1549 | device_lock(dev); | ||
| 1550 | if (device_supports_offline(dev)) { | ||
| 1551 | if (dev->offline) { | ||
| 1552 | ret = dev->bus->online(dev); | ||
| 1553 | if (!ret) { | ||
| 1554 | kobject_uevent(&dev->kobj, KOBJ_ONLINE); | ||
| 1555 | dev->offline = false; | ||
| 1556 | } | ||
| 1557 | } else { | ||
| 1558 | ret = 1; | ||
| 1559 | } | ||
| 1560 | } | ||
| 1561 | device_unlock(dev); | ||
| 1562 | |||
| 1563 | return ret; | ||
| 1564 | } | ||
| 1565 | |||
| 1436 | struct root_device { | 1566 | struct root_device { |
| 1437 | struct device dev; | 1567 | struct device dev; |
| 1438 | struct module *owner; | 1568 | struct module *owner; |
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 3d48fc887ef4..1d110dc6f0c1 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c | |||
| @@ -13,17 +13,21 @@ | |||
| 13 | #include <linux/gfp.h> | 13 | #include <linux/gfp.h> |
| 14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 15 | #include <linux/percpu.h> | 15 | #include <linux/percpu.h> |
| 16 | #include <linux/acpi.h> | ||
| 16 | 17 | ||
| 17 | #include "base.h" | 18 | #include "base.h" |
| 18 | 19 | ||
| 19 | struct bus_type cpu_subsys = { | ||
| 20 | .name = "cpu", | ||
| 21 | .dev_name = "cpu", | ||
| 22 | }; | ||
| 23 | EXPORT_SYMBOL_GPL(cpu_subsys); | ||
| 24 | |||
| 25 | static DEFINE_PER_CPU(struct device *, cpu_sys_devices); | 20 | static DEFINE_PER_CPU(struct device *, cpu_sys_devices); |
| 26 | 21 | ||
| 22 | static int cpu_subsys_match(struct device *dev, struct device_driver *drv) | ||
| 23 | { | ||
| 24 | /* ACPI style match is the only one that may succeed. */ | ||
| 25 | if (acpi_driver_match_device(dev, drv)) | ||
| 26 | return 1; | ||
| 27 | |||
| 28 | return 0; | ||
| 29 | } | ||
| 30 | |||
| 27 | #ifdef CONFIG_HOTPLUG_CPU | 31 | #ifdef CONFIG_HOTPLUG_CPU |
| 28 | static void change_cpu_under_node(struct cpu *cpu, | 32 | static void change_cpu_under_node(struct cpu *cpu, |
| 29 | unsigned int from_nid, unsigned int to_nid) | 33 | unsigned int from_nid, unsigned int to_nid) |
| @@ -34,69 +38,45 @@ static void change_cpu_under_node(struct cpu *cpu, | |||
| 34 | cpu->node_id = to_nid; | 38 | cpu->node_id = to_nid; |
| 35 | } | 39 | } |
| 36 | 40 | ||
| 37 | static ssize_t show_online(struct device *dev, | 41 | static int __ref cpu_subsys_online(struct device *dev) |
| 38 | struct device_attribute *attr, | ||
| 39 | char *buf) | ||
| 40 | { | 42 | { |
| 41 | struct cpu *cpu = container_of(dev, struct cpu, dev); | 43 | struct cpu *cpu = container_of(dev, struct cpu, dev); |
| 44 | int cpuid = dev->id; | ||
| 45 | int from_nid, to_nid; | ||
| 46 | int ret; | ||
| 42 | 47 | ||
| 43 | return sprintf(buf, "%u\n", !!cpu_online(cpu->dev.id)); | 48 | cpu_hotplug_driver_lock(); |
| 49 | |||
| 50 | from_nid = cpu_to_node(cpuid); | ||
| 51 | ret = cpu_up(cpuid); | ||
| 52 | /* | ||
| 53 | * When hot adding memory to memoryless node and enabling a cpu | ||
| 54 | * on the node, node number of the cpu may internally change. | ||
| 55 | */ | ||
| 56 | to_nid = cpu_to_node(cpuid); | ||
| 57 | if (from_nid != to_nid) | ||
| 58 | change_cpu_under_node(cpu, from_nid, to_nid); | ||
| 59 | |||
| 60 | cpu_hotplug_driver_unlock(); | ||
| 61 | return ret; | ||
| 44 | } | 62 | } |
| 45 | 63 | ||
| 46 | static ssize_t __ref store_online(struct device *dev, | 64 | static int cpu_subsys_offline(struct device *dev) |
| 47 | struct device_attribute *attr, | ||
| 48 | const char *buf, size_t count) | ||
| 49 | { | 65 | { |
| 50 | struct cpu *cpu = container_of(dev, struct cpu, dev); | 66 | int ret; |
| 51 | int cpuid = cpu->dev.id; | ||
| 52 | int from_nid, to_nid; | ||
| 53 | ssize_t ret; | ||
| 54 | 67 | ||
| 55 | cpu_hotplug_driver_lock(); | 68 | cpu_hotplug_driver_lock(); |
| 56 | switch (buf[0]) { | 69 | ret = cpu_down(dev->id); |
| 57 | case '0': | ||
| 58 | ret = cpu_down(cpuid); | ||
| 59 | if (!ret) | ||
| 60 | kobject_uevent(&dev->kobj, KOBJ_OFFLINE); | ||
| 61 | break; | ||
| 62 | case '1': | ||
| 63 | from_nid = cpu_to_node(cpuid); | ||
| 64 | ret = cpu_up(cpuid); | ||
| 65 | |||
| 66 | /* | ||
| 67 | * When hot adding memory to memoryless node and enabling a cpu | ||
| 68 | * on the node, node number of the cpu may internally change. | ||
| 69 | */ | ||
| 70 | to_nid = cpu_to_node(cpuid); | ||
| 71 | if (from_nid != to_nid) | ||
| 72 | change_cpu_under_node(cpu, from_nid, to_nid); | ||
| 73 | |||
| 74 | if (!ret) | ||
| 75 | kobject_uevent(&dev->kobj, KOBJ_ONLINE); | ||
| 76 | break; | ||
| 77 | default: | ||
| 78 | ret = -EINVAL; | ||
| 79 | } | ||
| 80 | cpu_hotplug_driver_unlock(); | 70 | cpu_hotplug_driver_unlock(); |
| 81 | |||
| 82 | if (ret >= 0) | ||
| 83 | ret = count; | ||
| 84 | return ret; | 71 | return ret; |
| 85 | } | 72 | } |
| 86 | static DEVICE_ATTR(online, 0644, show_online, store_online); | ||
| 87 | 73 | ||
| 88 | static void __cpuinit register_cpu_control(struct cpu *cpu) | ||
| 89 | { | ||
| 90 | device_create_file(&cpu->dev, &dev_attr_online); | ||
| 91 | } | ||
| 92 | void unregister_cpu(struct cpu *cpu) | 74 | void unregister_cpu(struct cpu *cpu) |
| 93 | { | 75 | { |
| 94 | int logical_cpu = cpu->dev.id; | 76 | int logical_cpu = cpu->dev.id; |
| 95 | 77 | ||
| 96 | unregister_cpu_under_node(logical_cpu, cpu_to_node(logical_cpu)); | 78 | unregister_cpu_under_node(logical_cpu, cpu_to_node(logical_cpu)); |
| 97 | 79 | ||
| 98 | device_remove_file(&cpu->dev, &dev_attr_online); | ||
| 99 | |||
| 100 | device_unregister(&cpu->dev); | 80 | device_unregister(&cpu->dev); |
| 101 | per_cpu(cpu_sys_devices, logical_cpu) = NULL; | 81 | per_cpu(cpu_sys_devices, logical_cpu) = NULL; |
| 102 | return; | 82 | return; |
| @@ -123,12 +103,19 @@ static DEVICE_ATTR(probe, S_IWUSR, NULL, cpu_probe_store); | |||
| 123 | static DEVICE_ATTR(release, S_IWUSR, NULL, cpu_release_store); | 103 | static DEVICE_ATTR(release, S_IWUSR, NULL, cpu_release_store); |
| 124 | #endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */ | 104 | #endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */ |
| 125 | 105 | ||
| 126 | #else /* ... !CONFIG_HOTPLUG_CPU */ | ||
| 127 | static inline void register_cpu_control(struct cpu *cpu) | ||
| 128 | { | ||
| 129 | } | ||
| 130 | #endif /* CONFIG_HOTPLUG_CPU */ | 106 | #endif /* CONFIG_HOTPLUG_CPU */ |
| 131 | 107 | ||
| 108 | struct bus_type cpu_subsys = { | ||
| 109 | .name = "cpu", | ||
| 110 | .dev_name = "cpu", | ||
| 111 | .match = cpu_subsys_match, | ||
| 112 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 113 | .online = cpu_subsys_online, | ||
| 114 | .offline = cpu_subsys_offline, | ||
| 115 | #endif | ||
| 116 | }; | ||
| 117 | EXPORT_SYMBOL_GPL(cpu_subsys); | ||
| 118 | |||
| 132 | #ifdef CONFIG_KEXEC | 119 | #ifdef CONFIG_KEXEC |
| 133 | #include <linux/kexec.h> | 120 | #include <linux/kexec.h> |
| 134 | 121 | ||
| @@ -277,12 +264,12 @@ int __cpuinit register_cpu(struct cpu *cpu, int num) | |||
| 277 | cpu->dev.id = num; | 264 | cpu->dev.id = num; |
| 278 | cpu->dev.bus = &cpu_subsys; | 265 | cpu->dev.bus = &cpu_subsys; |
| 279 | cpu->dev.release = cpu_device_release; | 266 | cpu->dev.release = cpu_device_release; |
| 267 | cpu->dev.offline_disabled = !cpu->hotpluggable; | ||
| 268 | cpu->dev.offline = !cpu_online(num); | ||
| 280 | #ifdef CONFIG_ARCH_HAS_CPU_AUTOPROBE | 269 | #ifdef CONFIG_ARCH_HAS_CPU_AUTOPROBE |
| 281 | cpu->dev.bus->uevent = arch_cpu_uevent; | 270 | cpu->dev.bus->uevent = arch_cpu_uevent; |
| 282 | #endif | 271 | #endif |
| 283 | error = device_register(&cpu->dev); | 272 | error = device_register(&cpu->dev); |
| 284 | if (!error && cpu->hotpluggable) | ||
| 285 | register_cpu_control(cpu); | ||
| 286 | if (!error) | 273 | if (!error) |
| 287 | per_cpu(cpu_sys_devices, num) = &cpu->dev; | 274 | per_cpu(cpu_sys_devices, num) = &cpu->dev; |
| 288 | if (!error) | 275 | if (!error) |
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 4b1f9265887f..01e21037d8fe 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
| @@ -450,8 +450,18 @@ static void fw_load_abort(struct firmware_priv *fw_priv) | |||
| 450 | { | 450 | { |
| 451 | struct firmware_buf *buf = fw_priv->buf; | 451 | struct firmware_buf *buf = fw_priv->buf; |
| 452 | 452 | ||
| 453 | /* | ||
| 454 | * There is a small window in which user can write to 'loading' | ||
| 455 | * between loading done and disappearance of 'loading' | ||
| 456 | */ | ||
| 457 | if (test_bit(FW_STATUS_DONE, &buf->status)) | ||
| 458 | return; | ||
| 459 | |||
| 453 | set_bit(FW_STATUS_ABORT, &buf->status); | 460 | set_bit(FW_STATUS_ABORT, &buf->status); |
| 454 | complete_all(&buf->completion); | 461 | complete_all(&buf->completion); |
| 462 | |||
| 463 | /* avoid user action after loading abort */ | ||
| 464 | fw_priv->buf = NULL; | ||
| 455 | } | 465 | } |
| 456 | 466 | ||
| 457 | #define is_fw_load_aborted(buf) \ | 467 | #define is_fw_load_aborted(buf) \ |
| @@ -528,7 +538,12 @@ static ssize_t firmware_loading_show(struct device *dev, | |||
| 528 | struct device_attribute *attr, char *buf) | 538 | struct device_attribute *attr, char *buf) |
| 529 | { | 539 | { |
| 530 | struct firmware_priv *fw_priv = to_firmware_priv(dev); | 540 | struct firmware_priv *fw_priv = to_firmware_priv(dev); |
| 531 | int loading = test_bit(FW_STATUS_LOADING, &fw_priv->buf->status); | 541 | int loading = 0; |
| 542 | |||
| 543 | mutex_lock(&fw_lock); | ||
| 544 | if (fw_priv->buf) | ||
| 545 | loading = test_bit(FW_STATUS_LOADING, &fw_priv->buf->status); | ||
| 546 | mutex_unlock(&fw_lock); | ||
| 532 | 547 | ||
| 533 | return sprintf(buf, "%d\n", loading); | 548 | return sprintf(buf, "%d\n", loading); |
| 534 | } | 549 | } |
| @@ -570,12 +585,12 @@ static ssize_t firmware_loading_store(struct device *dev, | |||
| 570 | const char *buf, size_t count) | 585 | const char *buf, size_t count) |
| 571 | { | 586 | { |
| 572 | struct firmware_priv *fw_priv = to_firmware_priv(dev); | 587 | struct firmware_priv *fw_priv = to_firmware_priv(dev); |
| 573 | struct firmware_buf *fw_buf = fw_priv->buf; | 588 | struct firmware_buf *fw_buf; |
| 574 | int loading = simple_strtol(buf, NULL, 10); | 589 | int loading = simple_strtol(buf, NULL, 10); |
| 575 | int i; | 590 | int i; |
| 576 | 591 | ||
| 577 | mutex_lock(&fw_lock); | 592 | mutex_lock(&fw_lock); |
| 578 | 593 | fw_buf = fw_priv->buf; | |
| 579 | if (!fw_buf) | 594 | if (!fw_buf) |
| 580 | goto out; | 595 | goto out; |
| 581 | 596 | ||
| @@ -777,10 +792,6 @@ static void firmware_class_timeout_work(struct work_struct *work) | |||
| 777 | struct firmware_priv, timeout_work.work); | 792 | struct firmware_priv, timeout_work.work); |
| 778 | 793 | ||
| 779 | mutex_lock(&fw_lock); | 794 | mutex_lock(&fw_lock); |
| 780 | if (test_bit(FW_STATUS_DONE, &(fw_priv->buf->status))) { | ||
| 781 | mutex_unlock(&fw_lock); | ||
| 782 | return; | ||
| 783 | } | ||
| 784 | fw_load_abort(fw_priv); | 795 | fw_load_abort(fw_priv); |
| 785 | mutex_unlock(&fw_lock); | 796 | mutex_unlock(&fw_lock); |
| 786 | } | 797 | } |
| @@ -861,8 +872,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, | |||
| 861 | 872 | ||
| 862 | cancel_delayed_work_sync(&fw_priv->timeout_work); | 873 | cancel_delayed_work_sync(&fw_priv->timeout_work); |
| 863 | 874 | ||
| 864 | fw_priv->buf = NULL; | ||
| 865 | |||
| 866 | device_remove_file(f_dev, &dev_attr_loading); | 875 | device_remove_file(f_dev, &dev_attr_loading); |
| 867 | err_del_bin_attr: | 876 | err_del_bin_attr: |
| 868 | device_remove_bin_file(f_dev, &firmware_attr_data); | 877 | device_remove_bin_file(f_dev, &firmware_attr_data); |
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 14f8a6954da0..4ebf97f99fae 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c | |||
| @@ -37,9 +37,14 @@ static inline int base_memory_block_id(int section_nr) | |||
| 37 | return section_nr / sections_per_block; | 37 | return section_nr / sections_per_block; |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | static int memory_subsys_online(struct device *dev); | ||
| 41 | static int memory_subsys_offline(struct device *dev); | ||
| 42 | |||
| 40 | static struct bus_type memory_subsys = { | 43 | static struct bus_type memory_subsys = { |
| 41 | .name = MEMORY_CLASS_NAME, | 44 | .name = MEMORY_CLASS_NAME, |
| 42 | .dev_name = MEMORY_CLASS_NAME, | 45 | .dev_name = MEMORY_CLASS_NAME, |
| 46 | .online = memory_subsys_online, | ||
| 47 | .offline = memory_subsys_offline, | ||
| 43 | }; | 48 | }; |
| 44 | 49 | ||
| 45 | static BLOCKING_NOTIFIER_HEAD(memory_chain); | 50 | static BLOCKING_NOTIFIER_HEAD(memory_chain); |
| @@ -88,6 +93,7 @@ int register_memory(struct memory_block *memory) | |||
| 88 | memory->dev.bus = &memory_subsys; | 93 | memory->dev.bus = &memory_subsys; |
| 89 | memory->dev.id = memory->start_section_nr / sections_per_block; | 94 | memory->dev.id = memory->start_section_nr / sections_per_block; |
| 90 | memory->dev.release = memory_block_release; | 95 | memory->dev.release = memory_block_release; |
| 96 | memory->dev.offline = memory->state == MEM_OFFLINE; | ||
| 91 | 97 | ||
| 92 | error = device_register(&memory->dev); | 98 | error = device_register(&memory->dev); |
| 93 | return error; | 99 | return error; |
| @@ -278,33 +284,64 @@ static int __memory_block_change_state(struct memory_block *mem, | |||
| 278 | { | 284 | { |
| 279 | int ret = 0; | 285 | int ret = 0; |
| 280 | 286 | ||
| 281 | if (mem->state != from_state_req) { | 287 | if (mem->state != from_state_req) |
| 282 | ret = -EINVAL; | 288 | return -EINVAL; |
| 283 | goto out; | ||
| 284 | } | ||
| 285 | 289 | ||
| 286 | if (to_state == MEM_OFFLINE) | 290 | if (to_state == MEM_OFFLINE) |
| 287 | mem->state = MEM_GOING_OFFLINE; | 291 | mem->state = MEM_GOING_OFFLINE; |
| 288 | 292 | ||
| 289 | ret = memory_block_action(mem->start_section_nr, to_state, online_type); | 293 | ret = memory_block_action(mem->start_section_nr, to_state, online_type); |
| 294 | mem->state = ret ? from_state_req : to_state; | ||
| 295 | return ret; | ||
| 296 | } | ||
| 290 | 297 | ||
| 291 | if (ret) { | 298 | static int memory_subsys_online(struct device *dev) |
| 292 | mem->state = from_state_req; | 299 | { |
| 293 | goto out; | 300 | struct memory_block *mem = container_of(dev, struct memory_block, dev); |
| 294 | } | 301 | int ret; |
| 295 | 302 | ||
| 296 | mem->state = to_state; | 303 | mutex_lock(&mem->state_mutex); |
| 297 | switch (mem->state) { | 304 | |
| 298 | case MEM_OFFLINE: | 305 | ret = mem->state == MEM_ONLINE ? 0 : |
| 299 | kobject_uevent(&mem->dev.kobj, KOBJ_OFFLINE); | 306 | __memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE, |
| 300 | break; | 307 | ONLINE_KEEP); |
| 301 | case MEM_ONLINE: | 308 | |
| 302 | kobject_uevent(&mem->dev.kobj, KOBJ_ONLINE); | 309 | mutex_unlock(&mem->state_mutex); |
| 303 | break; | 310 | return ret; |
| 304 | default: | 311 | } |
| 305 | break; | 312 | |
| 313 | static int memory_subsys_offline(struct device *dev) | ||
| 314 | { | ||
| 315 | struct memory_block *mem = container_of(dev, struct memory_block, dev); | ||
| 316 | int ret; | ||
| 317 | |||
| 318 | mutex_lock(&mem->state_mutex); | ||
| 319 | |||
| 320 | ret = mem->state == MEM_OFFLINE ? 0 : | ||
| 321 | __memory_block_change_state(mem, MEM_OFFLINE, MEM_ONLINE, -1); | ||
| 322 | |||
| 323 | mutex_unlock(&mem->state_mutex); | ||
| 324 | return ret; | ||
| 325 | } | ||
| 326 | |||
| 327 | static int __memory_block_change_state_uevent(struct memory_block *mem, | ||
| 328 | unsigned long to_state, unsigned long from_state_req, | ||
| 329 | int online_type) | ||
| 330 | { | ||
| 331 | int ret = __memory_block_change_state(mem, to_state, from_state_req, | ||
| 332 | online_type); | ||
| 333 | if (!ret) { | ||
| 334 | switch (mem->state) { | ||
| 335 | case MEM_OFFLINE: | ||
| 336 | kobject_uevent(&mem->dev.kobj, KOBJ_OFFLINE); | ||
| 337 | break; | ||
| 338 | case MEM_ONLINE: | ||
| 339 | kobject_uevent(&mem->dev.kobj, KOBJ_ONLINE); | ||
| 340 | break; | ||
| 341 | default: | ||
| 342 | break; | ||
| 343 | } | ||
| 306 | } | 344 | } |
| 307 | out: | ||
| 308 | return ret; | 345 | return ret; |
| 309 | } | 346 | } |
| 310 | 347 | ||
| @@ -315,8 +352,8 @@ static int memory_block_change_state(struct memory_block *mem, | |||
| 315 | int ret; | 352 | int ret; |
| 316 | 353 | ||
| 317 | mutex_lock(&mem->state_mutex); | 354 | mutex_lock(&mem->state_mutex); |
| 318 | ret = __memory_block_change_state(mem, to_state, from_state_req, | 355 | ret = __memory_block_change_state_uevent(mem, to_state, from_state_req, |
| 319 | online_type); | 356 | online_type); |
| 320 | mutex_unlock(&mem->state_mutex); | 357 | mutex_unlock(&mem->state_mutex); |
| 321 | 358 | ||
| 322 | return ret; | 359 | return ret; |
| @@ -326,22 +363,34 @@ store_mem_state(struct device *dev, | |||
| 326 | struct device_attribute *attr, const char *buf, size_t count) | 363 | struct device_attribute *attr, const char *buf, size_t count) |
| 327 | { | 364 | { |
| 328 | struct memory_block *mem; | 365 | struct memory_block *mem; |
| 366 | bool offline; | ||
| 329 | int ret = -EINVAL; | 367 | int ret = -EINVAL; |
| 330 | 368 | ||
| 331 | mem = container_of(dev, struct memory_block, dev); | 369 | mem = container_of(dev, struct memory_block, dev); |
| 332 | 370 | ||
| 333 | if (!strncmp(buf, "online_kernel", min_t(int, count, 13))) | 371 | lock_device_hotplug(); |
| 372 | |||
| 373 | if (!strncmp(buf, "online_kernel", min_t(int, count, 13))) { | ||
| 374 | offline = false; | ||
| 334 | ret = memory_block_change_state(mem, MEM_ONLINE, | 375 | ret = memory_block_change_state(mem, MEM_ONLINE, |
| 335 | MEM_OFFLINE, ONLINE_KERNEL); | 376 | MEM_OFFLINE, ONLINE_KERNEL); |
| 336 | else if (!strncmp(buf, "online_movable", min_t(int, count, 14))) | 377 | } else if (!strncmp(buf, "online_movable", min_t(int, count, 14))) { |
| 378 | offline = false; | ||
| 337 | ret = memory_block_change_state(mem, MEM_ONLINE, | 379 | ret = memory_block_change_state(mem, MEM_ONLINE, |
| 338 | MEM_OFFLINE, ONLINE_MOVABLE); | 380 | MEM_OFFLINE, ONLINE_MOVABLE); |
| 339 | else if (!strncmp(buf, "online", min_t(int, count, 6))) | 381 | } else if (!strncmp(buf, "online", min_t(int, count, 6))) { |
| 382 | offline = false; | ||
| 340 | ret = memory_block_change_state(mem, MEM_ONLINE, | 383 | ret = memory_block_change_state(mem, MEM_ONLINE, |
| 341 | MEM_OFFLINE, ONLINE_KEEP); | 384 | MEM_OFFLINE, ONLINE_KEEP); |
| 342 | else if(!strncmp(buf, "offline", min_t(int, count, 7))) | 385 | } else if(!strncmp(buf, "offline", min_t(int, count, 7))) { |
| 386 | offline = true; | ||
| 343 | ret = memory_block_change_state(mem, MEM_OFFLINE, | 387 | ret = memory_block_change_state(mem, MEM_OFFLINE, |
| 344 | MEM_ONLINE, -1); | 388 | MEM_ONLINE, -1); |
| 389 | } | ||
| 390 | if (!ret) | ||
| 391 | dev->offline = offline; | ||
| 392 | |||
| 393 | unlock_device_hotplug(); | ||
| 345 | 394 | ||
| 346 | if (ret) | 395 | if (ret) |
| 347 | return ret; | 396 | return ret; |
| @@ -679,21 +728,6 @@ int unregister_memory_section(struct mem_section *section) | |||
| 679 | } | 728 | } |
| 680 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | 729 | #endif /* CONFIG_MEMORY_HOTREMOVE */ |
| 681 | 730 | ||
| 682 | /* | ||
| 683 | * offline one memory block. If the memory block has been offlined, do nothing. | ||
| 684 | */ | ||
| 685 | int offline_memory_block(struct memory_block *mem) | ||
| 686 | { | ||
| 687 | int ret = 0; | ||
| 688 | |||
| 689 | mutex_lock(&mem->state_mutex); | ||
| 690 | if (mem->state != MEM_OFFLINE) | ||
| 691 | ret = __memory_block_change_state(mem, MEM_OFFLINE, MEM_ONLINE, -1); | ||
| 692 | mutex_unlock(&mem->state_mutex); | ||
| 693 | |||
| 694 | return ret; | ||
| 695 | } | ||
| 696 | |||
| 697 | /* return true if the memory block is offlined, otherwise, return false */ | 731 | /* return true if the memory block is offlined, otherwise, return false */ |
| 698 | bool is_memblock_offlined(struct memory_block *mem) | 732 | bool is_memblock_offlined(struct memory_block *mem) |
| 699 | { | 733 | { |
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 3063452e55da..49394e3f31bc 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
| @@ -1036,12 +1036,16 @@ static const char *rbd_segment_name(struct rbd_device *rbd_dev, u64 offset) | |||
| 1036 | char *name; | 1036 | char *name; |
| 1037 | u64 segment; | 1037 | u64 segment; |
| 1038 | int ret; | 1038 | int ret; |
| 1039 | char *name_format; | ||
| 1039 | 1040 | ||
| 1040 | name = kmem_cache_alloc(rbd_segment_name_cache, GFP_NOIO); | 1041 | name = kmem_cache_alloc(rbd_segment_name_cache, GFP_NOIO); |
| 1041 | if (!name) | 1042 | if (!name) |
| 1042 | return NULL; | 1043 | return NULL; |
| 1043 | segment = offset >> rbd_dev->header.obj_order; | 1044 | segment = offset >> rbd_dev->header.obj_order; |
| 1044 | ret = snprintf(name, MAX_OBJ_NAME_SIZE + 1, "%s.%012llx", | 1045 | name_format = "%s.%012llx"; |
| 1046 | if (rbd_dev->image_format == 2) | ||
| 1047 | name_format = "%s.%016llx"; | ||
| 1048 | ret = snprintf(name, MAX_OBJ_NAME_SIZE + 1, name_format, | ||
| 1045 | rbd_dev->header.object_prefix, segment); | 1049 | rbd_dev->header.object_prefix, segment); |
| 1046 | if (ret < 0 || ret > MAX_OBJ_NAME_SIZE) { | 1050 | if (ret < 0 || ret > MAX_OBJ_NAME_SIZE) { |
| 1047 | pr_err("error formatting segment name for #%llu (%d)\n", | 1051 | pr_err("error formatting segment name for #%llu (%d)\n", |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 934cfd18f72d..1144e8c7579d 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
| @@ -1955,6 +1955,7 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb) | |||
| 1955 | /* XXX the notifier code should handle this better */ | 1955 | /* XXX the notifier code should handle this better */ |
| 1956 | if (!cn->notifier_head.head) { | 1956 | if (!cn->notifier_head.head) { |
| 1957 | srcu_cleanup_notifier_head(&cn->notifier_head); | 1957 | srcu_cleanup_notifier_head(&cn->notifier_head); |
| 1958 | list_del(&cn->node); | ||
| 1958 | kfree(cn); | 1959 | kfree(cn); |
| 1959 | } | 1960 | } |
| 1960 | 1961 | ||
diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk-exynos5250.c index 5c97e75924a8..22d7699e7ced 100644 --- a/drivers/clk/samsung/clk-exynos5250.c +++ b/drivers/clk/samsung/clk-exynos5250.c | |||
| @@ -155,7 +155,7 @@ static __initdata unsigned long exynos5250_clk_regs[] = { | |||
| 155 | 155 | ||
| 156 | /* list of all parent clock list */ | 156 | /* list of all parent clock list */ |
| 157 | PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; | 157 | PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; |
| 158 | PNAME(mout_cpu_p) = { "mout_apll", "mout_mpll", }; | 158 | PNAME(mout_cpu_p) = { "mout_apll", "sclk_mpll", }; |
| 159 | PNAME(mout_mpll_fout_p) = { "fout_mplldiv2", "fout_mpll" }; | 159 | PNAME(mout_mpll_fout_p) = { "fout_mplldiv2", "fout_mpll" }; |
| 160 | PNAME(mout_mpll_p) = { "fin_pll", "mout_mpll_fout" }; | 160 | PNAME(mout_mpll_p) = { "fin_pll", "mout_mpll_fout" }; |
| 161 | PNAME(mout_bpll_fout_p) = { "fout_bplldiv2", "fout_bpll" }; | 161 | PNAME(mout_bpll_fout_p) = { "fout_bplldiv2", "fout_bpll" }; |
| @@ -208,10 +208,10 @@ struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initdata = { | |||
| 208 | }; | 208 | }; |
| 209 | 209 | ||
| 210 | struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { | 210 | struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { |
| 211 | MUX(none, "mout_apll", mout_apll_p, SRC_CPU, 0, 1), | 211 | MUX_A(none, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, "mout_apll"), |
| 212 | MUX(none, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1), | 212 | MUX_A(none, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1, "mout_cpu"), |
| 213 | MUX(none, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), | 213 | MUX(none, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), |
| 214 | MUX(none, "sclk_mpll", mout_mpll_p, SRC_CORE1, 8, 1), | 214 | MUX_A(none, "sclk_mpll", mout_mpll_p, SRC_CORE1, 8, 1, "mout_mpll"), |
| 215 | MUX(none, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), | 215 | MUX(none, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), |
| 216 | MUX(none, "sclk_bpll", mout_bpll_p, SRC_CDREX, 0, 1), | 216 | MUX(none, "sclk_bpll", mout_bpll_p, SRC_CDREX, 0, 1), |
| 217 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), | 217 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), |
| @@ -378,7 +378,7 @@ struct samsung_gate_clock exynos5250_gate_clks[] __initdata = { | |||
| 378 | GATE(hsi2c3, "hsi2c3", "aclk66", GATE_IP_PERIC, 31, 0, 0), | 378 | GATE(hsi2c3, "hsi2c3", "aclk66", GATE_IP_PERIC, 31, 0, 0), |
| 379 | GATE(chipid, "chipid", "aclk66", GATE_IP_PERIS, 0, 0, 0), | 379 | GATE(chipid, "chipid", "aclk66", GATE_IP_PERIS, 0, 0, 0), |
| 380 | GATE(sysreg, "sysreg", "aclk66", GATE_IP_PERIS, 1, 0, 0), | 380 | GATE(sysreg, "sysreg", "aclk66", GATE_IP_PERIS, 1, 0, 0), |
| 381 | GATE(pmu, "pmu", "aclk66", GATE_IP_PERIS, 2, 0, 0), | 381 | GATE(pmu, "pmu", "aclk66", GATE_IP_PERIS, 2, CLK_IGNORE_UNUSED, 0), |
| 382 | GATE(tzpc0, "tzpc0", "aclk66", GATE_IP_PERIS, 6, 0, 0), | 382 | GATE(tzpc0, "tzpc0", "aclk66", GATE_IP_PERIS, 6, 0, 0), |
| 383 | GATE(tzpc1, "tzpc1", "aclk66", GATE_IP_PERIS, 7, 0, 0), | 383 | GATE(tzpc1, "tzpc1", "aclk66", GATE_IP_PERIS, 7, 0, 0), |
| 384 | GATE(tzpc2, "tzpc2", "aclk66", GATE_IP_PERIS, 8, 0, 0), | 384 | GATE(tzpc2, "tzpc2", "aclk66", GATE_IP_PERIS, 8, 0, 0), |
diff --git a/drivers/clk/samsung/clk-pll.c b/drivers/clk/samsung/clk-pll.c index 89135f6be116..362f12dcd944 100644 --- a/drivers/clk/samsung/clk-pll.c +++ b/drivers/clk/samsung/clk-pll.c | |||
| @@ -111,7 +111,8 @@ static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, | |||
| 111 | unsigned long parent_rate) | 111 | unsigned long parent_rate) |
| 112 | { | 112 | { |
| 113 | struct samsung_clk_pll36xx *pll = to_clk_pll36xx(hw); | 113 | struct samsung_clk_pll36xx *pll = to_clk_pll36xx(hw); |
| 114 | u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1; | 114 | u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; |
| 115 | s16 kdiv; | ||
| 115 | u64 fvco = parent_rate; | 116 | u64 fvco = parent_rate; |
| 116 | 117 | ||
| 117 | pll_con0 = __raw_readl(pll->con_reg); | 118 | pll_con0 = __raw_readl(pll->con_reg); |
| @@ -119,7 +120,7 @@ static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, | |||
| 119 | mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; | 120 | mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; |
| 120 | pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; | 121 | pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; |
| 121 | sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK; | 122 | sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK; |
| 122 | kdiv = pll_con1 & PLL36XX_KDIV_MASK; | 123 | kdiv = (s16)(pll_con1 & PLL36XX_KDIV_MASK); |
| 123 | 124 | ||
| 124 | fvco *= (mdiv << 16) + kdiv; | 125 | fvco *= (mdiv << 16) + kdiv; |
| 125 | do_div(fvco, (pdiv << sdiv)); | 126 | do_div(fvco, (pdiv << sdiv)); |
diff --git a/drivers/clk/spear/spear3xx_clock.c b/drivers/clk/spear/spear3xx_clock.c index f9ec43fd1320..080c3c5e33f6 100644 --- a/drivers/clk/spear/spear3xx_clock.c +++ b/drivers/clk/spear/spear3xx_clock.c | |||
| @@ -369,7 +369,7 @@ static void __init spear320_clk_init(void __iomem *soc_config_base) | |||
| 369 | clk_register_clkdev(clk, NULL, "60100000.serial"); | 369 | clk_register_clkdev(clk, NULL, "60100000.serial"); |
| 370 | } | 370 | } |
| 371 | #else | 371 | #else |
| 372 | static inline void spear320_clk_init(void) { } | 372 | static inline void spear320_clk_init(void __iomem *soc_config_base) { } |
| 373 | #endif | 373 | #endif |
| 374 | 374 | ||
| 375 | void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_base) | 375 | void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_base) |
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c index c6921f538e28..ba99e3844106 100644 --- a/drivers/clk/tegra/clk-tegra30.c +++ b/drivers/clk/tegra/clk-tegra30.c | |||
| @@ -1598,6 +1598,12 @@ static void __init tegra30_periph_clk_init(void) | |||
| 1598 | clk_register_clkdev(clk, "afi", "tegra-pcie"); | 1598 | clk_register_clkdev(clk, "afi", "tegra-pcie"); |
| 1599 | clks[afi] = clk; | 1599 | clks[afi] = clk; |
| 1600 | 1600 | ||
| 1601 | /* pciex */ | ||
| 1602 | clk = tegra_clk_register_periph_gate("pciex", "pll_e", 0, clk_base, 0, | ||
| 1603 | 74, &periph_u_regs, periph_clk_enb_refcnt); | ||
| 1604 | clk_register_clkdev(clk, "pciex", "tegra-pcie"); | ||
| 1605 | clks[pciex] = clk; | ||
| 1606 | |||
| 1601 | /* kfuse */ | 1607 | /* kfuse */ |
| 1602 | clk = tegra_clk_register_periph_gate("kfuse", "clk_m", | 1608 | clk = tegra_clk_register_periph_gate("kfuse", "clk_m", |
| 1603 | TEGRA_PERIPH_ON_APB, | 1609 | TEGRA_PERIPH_ON_APB, |
| @@ -1716,11 +1722,6 @@ static void __init tegra30_fixed_clk_init(void) | |||
| 1716 | 1, 0, &cml_lock); | 1722 | 1, 0, &cml_lock); |
| 1717 | clk_register_clkdev(clk, "cml1", NULL); | 1723 | clk_register_clkdev(clk, "cml1", NULL); |
| 1718 | clks[cml1] = clk; | 1724 | clks[cml1] = clk; |
| 1719 | |||
| 1720 | /* pciex */ | ||
| 1721 | clk = clk_register_fixed_rate(NULL, "pciex", "pll_e", 0, 100000000); | ||
| 1722 | clk_register_clkdev(clk, "pciex", NULL); | ||
| 1723 | clks[pciex] = clk; | ||
| 1724 | } | 1725 | } |
| 1725 | 1726 | ||
| 1726 | static void __init tegra30_osc_clk_init(void) | 1727 | static void __init tegra30_osc_clk_init(void) |
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index edc089e9d0c4..b8efacf01d69 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c | |||
| @@ -1034,4 +1034,11 @@ static const struct x86_cpu_id acpi_cpufreq_ids[] = { | |||
| 1034 | }; | 1034 | }; |
| 1035 | MODULE_DEVICE_TABLE(x86cpu, acpi_cpufreq_ids); | 1035 | MODULE_DEVICE_TABLE(x86cpu, acpi_cpufreq_ids); |
| 1036 | 1036 | ||
| 1037 | static const struct acpi_device_id processor_device_ids[] = { | ||
| 1038 | {ACPI_PROCESSOR_OBJECT_HID, }, | ||
| 1039 | {ACPI_PROCESSOR_DEVICE_HID, }, | ||
| 1040 | {}, | ||
| 1041 | }; | ||
| 1042 | MODULE_DEVICE_TABLE(acpi, processor_device_ids); | ||
| 1043 | |||
| 1037 | MODULE_ALIAS("acpi"); | 1044 | MODULE_ALIAS("acpi"); |
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index 4b9bb5def6f1..93eb5cbcc1f6 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c | |||
| @@ -47,6 +47,8 @@ static struct od_ops od_ops; | |||
| 47 | static struct cpufreq_governor cpufreq_gov_ondemand; | 47 | static struct cpufreq_governor cpufreq_gov_ondemand; |
| 48 | #endif | 48 | #endif |
| 49 | 49 | ||
| 50 | static unsigned int default_powersave_bias; | ||
| 51 | |||
| 50 | static void ondemand_powersave_bias_init_cpu(int cpu) | 52 | static void ondemand_powersave_bias_init_cpu(int cpu) |
| 51 | { | 53 | { |
| 52 | struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu); | 54 | struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu); |
| @@ -543,7 +545,7 @@ static int od_init(struct dbs_data *dbs_data) | |||
| 543 | 545 | ||
| 544 | tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR; | 546 | tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR; |
| 545 | tuners->ignore_nice = 0; | 547 | tuners->ignore_nice = 0; |
| 546 | tuners->powersave_bias = 0; | 548 | tuners->powersave_bias = default_powersave_bias; |
| 547 | tuners->io_is_busy = should_io_be_busy(); | 549 | tuners->io_is_busy = should_io_be_busy(); |
| 548 | 550 | ||
| 549 | dbs_data->tuners = tuners; | 551 | dbs_data->tuners = tuners; |
| @@ -585,6 +587,7 @@ static void od_set_powersave_bias(unsigned int powersave_bias) | |||
| 585 | unsigned int cpu; | 587 | unsigned int cpu; |
| 586 | cpumask_t done; | 588 | cpumask_t done; |
| 587 | 589 | ||
| 590 | default_powersave_bias = powersave_bias; | ||
| 588 | cpumask_clear(&done); | 591 | cpumask_clear(&done); |
| 589 | 592 | ||
| 590 | get_online_cpus(); | 593 | get_online_cpus(); |
| @@ -593,11 +596,17 @@ static void od_set_powersave_bias(unsigned int powersave_bias) | |||
| 593 | continue; | 596 | continue; |
| 594 | 597 | ||
| 595 | policy = per_cpu(od_cpu_dbs_info, cpu).cdbs.cur_policy; | 598 | policy = per_cpu(od_cpu_dbs_info, cpu).cdbs.cur_policy; |
| 596 | dbs_data = policy->governor_data; | 599 | if (!policy) |
| 597 | od_tuners = dbs_data->tuners; | 600 | continue; |
| 598 | od_tuners->powersave_bias = powersave_bias; | ||
| 599 | 601 | ||
| 600 | cpumask_or(&done, &done, policy->cpus); | 602 | cpumask_or(&done, &done, policy->cpus); |
| 603 | |||
| 604 | if (policy->governor != &cpufreq_gov_ondemand) | ||
| 605 | continue; | ||
| 606 | |||
| 607 | dbs_data = policy->governor_data; | ||
| 608 | od_tuners = dbs_data->tuners; | ||
| 609 | od_tuners->powersave_bias = default_powersave_bias; | ||
| 601 | } | 610 | } |
| 602 | put_online_cpus(); | 611 | put_online_cpus(); |
| 603 | } | 612 | } |
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index dcde35231e25..5b7b9110254b 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c | |||
| @@ -190,8 +190,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev, | |||
| 190 | if (ret) | 190 | if (ret) |
| 191 | return ERR_PTR(ret); | 191 | return ERR_PTR(ret); |
| 192 | } | 192 | } |
| 193 | return dma_buf_export(obj, &drm_gem_prime_dmabuf_ops, obj->size, | 193 | return dma_buf_export(obj, &drm_gem_prime_dmabuf_ops, obj->size, flags); |
| 194 | 0600); | ||
| 195 | } | 194 | } |
| 196 | EXPORT_SYMBOL(drm_gem_prime_export); | 195 | EXPORT_SYMBOL(drm_gem_prime_export); |
| 197 | 196 | ||
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 0e5341695922..6948eb88c2b7 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -2687,6 +2687,9 @@ void r600_uvd_rbc_stop(struct radeon_device *rdev) | |||
| 2687 | int r600_uvd_init(struct radeon_device *rdev) | 2687 | int r600_uvd_init(struct radeon_device *rdev) |
| 2688 | { | 2688 | { |
| 2689 | int i, j, r; | 2689 | int i, j, r; |
| 2690 | /* disable byte swapping */ | ||
| 2691 | u32 lmi_swap_cntl = 0; | ||
| 2692 | u32 mp_swap_cntl = 0; | ||
| 2690 | 2693 | ||
| 2691 | /* raise clocks while booting up the VCPU */ | 2694 | /* raise clocks while booting up the VCPU */ |
| 2692 | radeon_set_uvd_clocks(rdev, 53300, 40000); | 2695 | radeon_set_uvd_clocks(rdev, 53300, 40000); |
| @@ -2711,9 +2714,13 @@ int r600_uvd_init(struct radeon_device *rdev) | |||
| 2711 | WREG32(UVD_LMI_CTRL, 0x40 | (1 << 8) | (1 << 13) | | 2714 | WREG32(UVD_LMI_CTRL, 0x40 | (1 << 8) | (1 << 13) | |
| 2712 | (1 << 21) | (1 << 9) | (1 << 20)); | 2715 | (1 << 21) | (1 << 9) | (1 << 20)); |
| 2713 | 2716 | ||
| 2714 | /* disable byte swapping */ | 2717 | #ifdef __BIG_ENDIAN |
| 2715 | WREG32(UVD_LMI_SWAP_CNTL, 0); | 2718 | /* swap (8 in 32) RB and IB */ |
| 2716 | WREG32(UVD_MP_SWAP_CNTL, 0); | 2719 | lmi_swap_cntl = 0xa; |
| 2720 | mp_swap_cntl = 0; | ||
| 2721 | #endif | ||
| 2722 | WREG32(UVD_LMI_SWAP_CNTL, lmi_swap_cntl); | ||
| 2723 | WREG32(UVD_MP_SWAP_CNTL, mp_swap_cntl); | ||
| 2717 | 2724 | ||
| 2718 | WREG32(UVD_MPC_SET_MUXA0, 0x40c2040); | 2725 | WREG32(UVD_MPC_SET_MUXA0, 0x40c2040); |
| 2719 | WREG32(UVD_MPC_SET_MUXA1, 0x0); | 2726 | WREG32(UVD_MPC_SET_MUXA1, 0x0); |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 189973836cff..b0dc0b6cb4e0 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -244,16 +244,6 @@ void radeon_scratch_free(struct radeon_device *rdev, uint32_t reg) | |||
| 244 | */ | 244 | */ |
| 245 | void radeon_wb_disable(struct radeon_device *rdev) | 245 | void radeon_wb_disable(struct radeon_device *rdev) |
| 246 | { | 246 | { |
| 247 | int r; | ||
| 248 | |||
| 249 | if (rdev->wb.wb_obj) { | ||
| 250 | r = radeon_bo_reserve(rdev->wb.wb_obj, false); | ||
| 251 | if (unlikely(r != 0)) | ||
| 252 | return; | ||
| 253 | radeon_bo_kunmap(rdev->wb.wb_obj); | ||
| 254 | radeon_bo_unpin(rdev->wb.wb_obj); | ||
| 255 | radeon_bo_unreserve(rdev->wb.wb_obj); | ||
| 256 | } | ||
| 257 | rdev->wb.enabled = false; | 247 | rdev->wb.enabled = false; |
| 258 | } | 248 | } |
| 259 | 249 | ||
| @@ -269,6 +259,11 @@ void radeon_wb_fini(struct radeon_device *rdev) | |||
| 269 | { | 259 | { |
| 270 | radeon_wb_disable(rdev); | 260 | radeon_wb_disable(rdev); |
| 271 | if (rdev->wb.wb_obj) { | 261 | if (rdev->wb.wb_obj) { |
| 262 | if (!radeon_bo_reserve(rdev->wb.wb_obj, false)) { | ||
| 263 | radeon_bo_kunmap(rdev->wb.wb_obj); | ||
| 264 | radeon_bo_unpin(rdev->wb.wb_obj); | ||
| 265 | radeon_bo_unreserve(rdev->wb.wb_obj); | ||
| 266 | } | ||
| 272 | radeon_bo_unref(&rdev->wb.wb_obj); | 267 | radeon_bo_unref(&rdev->wb.wb_obj); |
| 273 | rdev->wb.wb = NULL; | 268 | rdev->wb.wb = NULL; |
| 274 | rdev->wb.wb_obj = NULL; | 269 | rdev->wb.wb_obj = NULL; |
| @@ -295,26 +290,26 @@ int radeon_wb_init(struct radeon_device *rdev) | |||
| 295 | dev_warn(rdev->dev, "(%d) create WB bo failed\n", r); | 290 | dev_warn(rdev->dev, "(%d) create WB bo failed\n", r); |
| 296 | return r; | 291 | return r; |
| 297 | } | 292 | } |
| 298 | } | 293 | r = radeon_bo_reserve(rdev->wb.wb_obj, false); |
| 299 | r = radeon_bo_reserve(rdev->wb.wb_obj, false); | 294 | if (unlikely(r != 0)) { |
| 300 | if (unlikely(r != 0)) { | 295 | radeon_wb_fini(rdev); |
| 301 | radeon_wb_fini(rdev); | 296 | return r; |
| 302 | return r; | 297 | } |
| 303 | } | 298 | r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT, |
| 304 | r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT, | 299 | &rdev->wb.gpu_addr); |
| 305 | &rdev->wb.gpu_addr); | 300 | if (r) { |
| 306 | if (r) { | 301 | radeon_bo_unreserve(rdev->wb.wb_obj); |
| 302 | dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r); | ||
| 303 | radeon_wb_fini(rdev); | ||
| 304 | return r; | ||
| 305 | } | ||
| 306 | r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); | ||
| 307 | radeon_bo_unreserve(rdev->wb.wb_obj); | 307 | radeon_bo_unreserve(rdev->wb.wb_obj); |
| 308 | dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r); | 308 | if (r) { |
| 309 | radeon_wb_fini(rdev); | 309 | dev_warn(rdev->dev, "(%d) map WB bo failed\n", r); |
| 310 | return r; | 310 | radeon_wb_fini(rdev); |
| 311 | } | 311 | return r; |
| 312 | r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); | 312 | } |
| 313 | radeon_bo_unreserve(rdev->wb.wb_obj); | ||
| 314 | if (r) { | ||
| 315 | dev_warn(rdev->dev, "(%d) map WB bo failed\n", r); | ||
| 316 | radeon_wb_fini(rdev); | ||
| 317 | return r; | ||
| 318 | } | 313 | } |
| 319 | 314 | ||
| 320 | /* clear wb memory */ | 315 | /* clear wb memory */ |
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 5b937dfe6f65..ddb8f8e04eb5 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
| @@ -63,7 +63,9 @@ static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring) | |||
| 63 | { | 63 | { |
| 64 | struct radeon_fence_driver *drv = &rdev->fence_drv[ring]; | 64 | struct radeon_fence_driver *drv = &rdev->fence_drv[ring]; |
| 65 | if (likely(rdev->wb.enabled || !drv->scratch_reg)) { | 65 | if (likely(rdev->wb.enabled || !drv->scratch_reg)) { |
| 66 | *drv->cpu_addr = cpu_to_le32(seq); | 66 | if (drv->cpu_addr) { |
| 67 | *drv->cpu_addr = cpu_to_le32(seq); | ||
| 68 | } | ||
| 67 | } else { | 69 | } else { |
| 68 | WREG32(drv->scratch_reg, seq); | 70 | WREG32(drv->scratch_reg, seq); |
| 69 | } | 71 | } |
| @@ -84,7 +86,11 @@ static u32 radeon_fence_read(struct radeon_device *rdev, int ring) | |||
| 84 | u32 seq = 0; | 86 | u32 seq = 0; |
| 85 | 87 | ||
| 86 | if (likely(rdev->wb.enabled || !drv->scratch_reg)) { | 88 | if (likely(rdev->wb.enabled || !drv->scratch_reg)) { |
| 87 | seq = le32_to_cpu(*drv->cpu_addr); | 89 | if (drv->cpu_addr) { |
| 90 | seq = le32_to_cpu(*drv->cpu_addr); | ||
| 91 | } else { | ||
| 92 | seq = lower_32_bits(atomic64_read(&drv->last_seq)); | ||
| 93 | } | ||
| 88 | } else { | 94 | } else { |
| 89 | seq = RREG32(drv->scratch_reg); | 95 | seq = RREG32(drv->scratch_reg); |
| 90 | } | 96 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 2c1341f63dc5..43ec4a401f07 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
| @@ -1197,11 +1197,13 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev, | |||
| 1197 | int radeon_vm_bo_rmv(struct radeon_device *rdev, | 1197 | int radeon_vm_bo_rmv(struct radeon_device *rdev, |
| 1198 | struct radeon_bo_va *bo_va) | 1198 | struct radeon_bo_va *bo_va) |
| 1199 | { | 1199 | { |
| 1200 | int r; | 1200 | int r = 0; |
| 1201 | 1201 | ||
| 1202 | mutex_lock(&rdev->vm_manager.lock); | 1202 | mutex_lock(&rdev->vm_manager.lock); |
| 1203 | mutex_lock(&bo_va->vm->mutex); | 1203 | mutex_lock(&bo_va->vm->mutex); |
| 1204 | r = radeon_vm_bo_update_pte(rdev, bo_va->vm, bo_va->bo, NULL); | 1204 | if (bo_va->soffset) { |
| 1205 | r = radeon_vm_bo_update_pte(rdev, bo_va->vm, bo_va->bo, NULL); | ||
| 1206 | } | ||
| 1205 | mutex_unlock(&rdev->vm_manager.lock); | 1207 | mutex_unlock(&rdev->vm_manager.lock); |
| 1206 | list_del(&bo_va->vm_list); | 1208 | list_del(&bo_va->vm_list); |
| 1207 | mutex_unlock(&bo_va->vm->mutex); | 1209 | mutex_unlock(&bo_va->vm->mutex); |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index e17faa7cf732..82434018cbe8 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
| @@ -402,6 +402,13 @@ int radeon_ring_alloc(struct radeon_device *rdev, struct radeon_ring *ring, unsi | |||
| 402 | return -ENOMEM; | 402 | return -ENOMEM; |
| 403 | /* Align requested size with padding so unlock_commit can | 403 | /* Align requested size with padding so unlock_commit can |
| 404 | * pad safely */ | 404 | * pad safely */ |
| 405 | radeon_ring_free_size(rdev, ring); | ||
| 406 | if (ring->ring_free_dw == (ring->ring_size / 4)) { | ||
| 407 | /* This is an empty ring update lockup info to avoid | ||
| 408 | * false positive. | ||
| 409 | */ | ||
| 410 | radeon_ring_lockup_update(ring); | ||
| 411 | } | ||
| 405 | ndw = (ndw + ring->align_mask) & ~ring->align_mask; | 412 | ndw = (ndw + ring->align_mask) & ~ring->align_mask; |
| 406 | while (ndw > (ring->ring_free_dw - 1)) { | 413 | while (ndw > (ring->ring_free_dw - 1)) { |
| 407 | radeon_ring_free_size(rdev, ring); | 414 | radeon_ring_free_size(rdev, ring); |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index 906e5c0ca3b9..cad735dd02c6 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
| @@ -159,7 +159,17 @@ int radeon_uvd_suspend(struct radeon_device *rdev) | |||
| 159 | if (!r) { | 159 | if (!r) { |
| 160 | radeon_bo_kunmap(rdev->uvd.vcpu_bo); | 160 | radeon_bo_kunmap(rdev->uvd.vcpu_bo); |
| 161 | radeon_bo_unpin(rdev->uvd.vcpu_bo); | 161 | radeon_bo_unpin(rdev->uvd.vcpu_bo); |
| 162 | rdev->uvd.cpu_addr = NULL; | ||
| 163 | if (!radeon_bo_pin(rdev->uvd.vcpu_bo, RADEON_GEM_DOMAIN_CPU, NULL)) { | ||
| 164 | radeon_bo_kmap(rdev->uvd.vcpu_bo, &rdev->uvd.cpu_addr); | ||
| 165 | } | ||
| 162 | radeon_bo_unreserve(rdev->uvd.vcpu_bo); | 166 | radeon_bo_unreserve(rdev->uvd.vcpu_bo); |
| 167 | |||
| 168 | if (rdev->uvd.cpu_addr) { | ||
| 169 | radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX); | ||
| 170 | } else { | ||
| 171 | rdev->fence_drv[R600_RING_TYPE_UVD_INDEX].cpu_addr = NULL; | ||
| 172 | } | ||
| 163 | } | 173 | } |
| 164 | return r; | 174 | return r; |
| 165 | } | 175 | } |
| @@ -178,6 +188,10 @@ int radeon_uvd_resume(struct radeon_device *rdev) | |||
| 178 | return r; | 188 | return r; |
| 179 | } | 189 | } |
| 180 | 190 | ||
| 191 | /* Have been pin in cpu unmap unpin */ | ||
| 192 | radeon_bo_kunmap(rdev->uvd.vcpu_bo); | ||
| 193 | radeon_bo_unpin(rdev->uvd.vcpu_bo); | ||
| 194 | |||
| 181 | r = radeon_bo_pin(rdev->uvd.vcpu_bo, RADEON_GEM_DOMAIN_VRAM, | 195 | r = radeon_bo_pin(rdev->uvd.vcpu_bo, RADEON_GEM_DOMAIN_VRAM, |
| 182 | &rdev->uvd.gpu_addr); | 196 | &rdev->uvd.gpu_addr); |
| 183 | if (r) { | 197 | if (r) { |
| @@ -613,19 +627,19 @@ int radeon_uvd_get_create_msg(struct radeon_device *rdev, int ring, | |||
| 613 | } | 627 | } |
| 614 | 628 | ||
| 615 | /* stitch together an UVD create msg */ | 629 | /* stitch together an UVD create msg */ |
| 616 | msg[0] = 0x00000de4; | 630 | msg[0] = cpu_to_le32(0x00000de4); |
| 617 | msg[1] = 0x00000000; | 631 | msg[1] = cpu_to_le32(0x00000000); |
| 618 | msg[2] = handle; | 632 | msg[2] = cpu_to_le32(handle); |
| 619 | msg[3] = 0x00000000; | 633 | msg[3] = cpu_to_le32(0x00000000); |
| 620 | msg[4] = 0x00000000; | 634 | msg[4] = cpu_to_le32(0x00000000); |
| 621 | msg[5] = 0x00000000; | 635 | msg[5] = cpu_to_le32(0x00000000); |
| 622 | msg[6] = 0x00000000; | 636 | msg[6] = cpu_to_le32(0x00000000); |
| 623 | msg[7] = 0x00000780; | 637 | msg[7] = cpu_to_le32(0x00000780); |
| 624 | msg[8] = 0x00000440; | 638 | msg[8] = cpu_to_le32(0x00000440); |
| 625 | msg[9] = 0x00000000; | 639 | msg[9] = cpu_to_le32(0x00000000); |
| 626 | msg[10] = 0x01b37000; | 640 | msg[10] = cpu_to_le32(0x01b37000); |
| 627 | for (i = 11; i < 1024; ++i) | 641 | for (i = 11; i < 1024; ++i) |
| 628 | msg[i] = 0x0; | 642 | msg[i] = cpu_to_le32(0x0); |
| 629 | 643 | ||
| 630 | radeon_bo_kunmap(bo); | 644 | radeon_bo_kunmap(bo); |
| 631 | radeon_bo_unreserve(bo); | 645 | radeon_bo_unreserve(bo); |
| @@ -659,12 +673,12 @@ int radeon_uvd_get_destroy_msg(struct radeon_device *rdev, int ring, | |||
| 659 | } | 673 | } |
| 660 | 674 | ||
| 661 | /* stitch together an UVD destroy msg */ | 675 | /* stitch together an UVD destroy msg */ |
| 662 | msg[0] = 0x00000de4; | 676 | msg[0] = cpu_to_le32(0x00000de4); |
| 663 | msg[1] = 0x00000002; | 677 | msg[1] = cpu_to_le32(0x00000002); |
| 664 | msg[2] = handle; | 678 | msg[2] = cpu_to_le32(handle); |
| 665 | msg[3] = 0x00000000; | 679 | msg[3] = cpu_to_le32(0x00000000); |
| 666 | for (i = 4; i < 1024; ++i) | 680 | for (i = 4; i < 1024; ++i) |
| 667 | msg[i] = 0x0; | 681 | msg[i] = cpu_to_le32(0x0); |
| 668 | 682 | ||
| 669 | radeon_bo_kunmap(bo); | 683 | radeon_bo_kunmap(bo); |
| 670 | radeon_bo_unreserve(bo); | 684 | radeon_bo_unreserve(bo); |
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 1760ceb68b7b..19ceaa60e0f4 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c | |||
| @@ -705,7 +705,7 @@ static int gic_irq_domain_xlate(struct irq_domain *d, | |||
| 705 | static int __cpuinit gic_secondary_init(struct notifier_block *nfb, | 705 | static int __cpuinit gic_secondary_init(struct notifier_block *nfb, |
| 706 | unsigned long action, void *hcpu) | 706 | unsigned long action, void *hcpu) |
| 707 | { | 707 | { |
| 708 | if (action == CPU_STARTING) | 708 | if (action == CPU_STARTING || action == CPU_STARTING_FROZEN) |
| 709 | gic_cpu_init(&gic_data[0]); | 709 | gic_cpu_init(&gic_data[0]); |
| 710 | return NOTIFY_OK; | 710 | return NOTIFY_OK; |
| 711 | } | 711 | } |
diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig index 7f5a7cac6dc7..8270388e2a0d 100644 --- a/drivers/media/Kconfig +++ b/drivers/media/Kconfig | |||
| @@ -136,9 +136,9 @@ config DVB_NET | |||
| 136 | 136 | ||
| 137 | # This Kconfig option is used by both PCI and USB drivers | 137 | # This Kconfig option is used by both PCI and USB drivers |
| 138 | config TTPCI_EEPROM | 138 | config TTPCI_EEPROM |
| 139 | tristate | 139 | tristate |
| 140 | depends on I2C | 140 | depends on I2C |
| 141 | default n | 141 | default n |
| 142 | 142 | ||
| 143 | source "drivers/media/dvb-core/Kconfig" | 143 | source "drivers/media/dvb-core/Kconfig" |
| 144 | 144 | ||
| @@ -189,6 +189,12 @@ config MEDIA_SUBDRV_AUTOSELECT | |||
| 189 | 189 | ||
| 190 | If unsure say Y. | 190 | If unsure say Y. |
| 191 | 191 | ||
| 192 | config MEDIA_ATTACH | ||
| 193 | bool | ||
| 194 | depends on MEDIA_ANALOG_TV_SUPPORT || MEDIA_DIGITAL_TV_SUPPORT || MEDIA_RADIO_SUPPORT | ||
| 195 | depends on MODULES | ||
| 196 | default MODULES | ||
| 197 | |||
| 192 | source "drivers/media/i2c/Kconfig" | 198 | source "drivers/media/i2c/Kconfig" |
| 193 | source "drivers/media/tuners/Kconfig" | 199 | source "drivers/media/tuners/Kconfig" |
| 194 | source "drivers/media/dvb-frontends/Kconfig" | 200 | source "drivers/media/dvb-frontends/Kconfig" |
diff --git a/drivers/media/i2c/s5c73m3/s5c73m3-core.c b/drivers/media/i2c/s5c73m3/s5c73m3-core.c index cb52438e53ac..9eac5310942f 100644 --- a/drivers/media/i2c/s5c73m3/s5c73m3-core.c +++ b/drivers/media/i2c/s5c73m3/s5c73m3-core.c | |||
| @@ -956,7 +956,7 @@ static int s5c73m3_oif_enum_frame_interval(struct v4l2_subdev *sd, | |||
| 956 | 956 | ||
| 957 | if (fie->pad != OIF_SOURCE_PAD) | 957 | if (fie->pad != OIF_SOURCE_PAD) |
| 958 | return -EINVAL; | 958 | return -EINVAL; |
| 959 | if (fie->index > ARRAY_SIZE(s5c73m3_intervals)) | 959 | if (fie->index >= ARRAY_SIZE(s5c73m3_intervals)) |
| 960 | return -EINVAL; | 960 | return -EINVAL; |
| 961 | 961 | ||
| 962 | mutex_lock(&state->lock); | 962 | mutex_lock(&state->lock); |
diff --git a/drivers/media/pci/cx88/cx88-alsa.c b/drivers/media/pci/cx88/cx88-alsa.c index 27d62623274b..aba5b1c649e6 100644 --- a/drivers/media/pci/cx88/cx88-alsa.c +++ b/drivers/media/pci/cx88/cx88-alsa.c | |||
| @@ -615,7 +615,7 @@ static int snd_cx88_volume_put(struct snd_kcontrol *kcontrol, | |||
| 615 | int changed = 0; | 615 | int changed = 0; |
| 616 | u32 old; | 616 | u32 old; |
| 617 | 617 | ||
| 618 | if (core->board.audio_chip == V4L2_IDENT_WM8775) | 618 | if (core->sd_wm8775) |
| 619 | snd_cx88_wm8775_volume_put(kcontrol, value); | 619 | snd_cx88_wm8775_volume_put(kcontrol, value); |
| 620 | 620 | ||
| 621 | left = value->value.integer.value[0] & 0x3f; | 621 | left = value->value.integer.value[0] & 0x3f; |
| @@ -682,8 +682,7 @@ static int snd_cx88_switch_put(struct snd_kcontrol *kcontrol, | |||
| 682 | vol ^= bit; | 682 | vol ^= bit; |
| 683 | cx_swrite(SHADOW_AUD_VOL_CTL, AUD_VOL_CTL, vol); | 683 | cx_swrite(SHADOW_AUD_VOL_CTL, AUD_VOL_CTL, vol); |
| 684 | /* Pass mute onto any WM8775 */ | 684 | /* Pass mute onto any WM8775 */ |
| 685 | if ((core->board.audio_chip == V4L2_IDENT_WM8775) && | 685 | if (core->sd_wm8775 && ((1<<6) == bit)) |
| 686 | ((1<<6) == bit)) | ||
| 687 | wm8775_s_ctrl(core, V4L2_CID_AUDIO_MUTE, 0 != (vol & bit)); | 686 | wm8775_s_ctrl(core, V4L2_CID_AUDIO_MUTE, 0 != (vol & bit)); |
| 688 | ret = 1; | 687 | ret = 1; |
| 689 | } | 688 | } |
| @@ -903,7 +902,7 @@ static int cx88_audio_initdev(struct pci_dev *pci, | |||
| 903 | goto error; | 902 | goto error; |
| 904 | 903 | ||
| 905 | /* If there's a wm8775 then add a Line-In ALC switch */ | 904 | /* If there's a wm8775 then add a Line-In ALC switch */ |
| 906 | if (core->board.audio_chip == V4L2_IDENT_WM8775) | 905 | if (core->sd_wm8775) |
| 907 | snd_ctl_add(card, snd_ctl_new1(&snd_cx88_alc_switch, chip)); | 906 | snd_ctl_add(card, snd_ctl_new1(&snd_cx88_alc_switch, chip)); |
| 908 | 907 | ||
| 909 | strcpy (card->driver, "CX88x"); | 908 | strcpy (card->driver, "CX88x"); |
diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c index 1b00615fd395..c7a9be1065c0 100644 --- a/drivers/media/pci/cx88/cx88-video.c +++ b/drivers/media/pci/cx88/cx88-video.c | |||
| @@ -385,8 +385,7 @@ int cx88_video_mux(struct cx88_core *core, unsigned int input) | |||
| 385 | /* The wm8775 module has the "2" route hardwired into | 385 | /* The wm8775 module has the "2" route hardwired into |
| 386 | the initialization. Some boards may use different | 386 | the initialization. Some boards may use different |
| 387 | routes for different inputs. HVR-1300 surely does */ | 387 | routes for different inputs. HVR-1300 surely does */ |
| 388 | if (core->board.audio_chip && | 388 | if (core->sd_wm8775) { |
| 389 | core->board.audio_chip == V4L2_IDENT_WM8775) { | ||
| 390 | call_all(core, audio, s_routing, | 389 | call_all(core, audio, s_routing, |
| 391 | INPUT(input).audioroute, 0, 0); | 390 | INPUT(input).audioroute, 0, 0); |
| 392 | } | 391 | } |
| @@ -771,8 +770,7 @@ static int video_open(struct file *file) | |||
| 771 | cx_write(MO_GP1_IO, core->board.radio.gpio1); | 770 | cx_write(MO_GP1_IO, core->board.radio.gpio1); |
| 772 | cx_write(MO_GP2_IO, core->board.radio.gpio2); | 771 | cx_write(MO_GP2_IO, core->board.radio.gpio2); |
| 773 | if (core->board.radio.audioroute) { | 772 | if (core->board.radio.audioroute) { |
| 774 | if(core->board.audio_chip && | 773 | if (core->sd_wm8775) { |
| 775 | core->board.audio_chip == V4L2_IDENT_WM8775) { | ||
| 776 | call_all(core, audio, s_routing, | 774 | call_all(core, audio, s_routing, |
| 777 | core->board.radio.audioroute, 0, 0); | 775 | core->board.radio.audioroute, 0, 0); |
| 778 | } | 776 | } |
| @@ -959,7 +957,7 @@ static int cx8800_s_aud_ctrl(struct v4l2_ctrl *ctrl) | |||
| 959 | u32 value,mask; | 957 | u32 value,mask; |
| 960 | 958 | ||
| 961 | /* Pass changes onto any WM8775 */ | 959 | /* Pass changes onto any WM8775 */ |
| 962 | if (core->board.audio_chip == V4L2_IDENT_WM8775) { | 960 | if (core->sd_wm8775) { |
| 963 | switch (ctrl->id) { | 961 | switch (ctrl->id) { |
| 964 | case V4L2_CID_AUDIO_MUTE: | 962 | case V4L2_CID_AUDIO_MUTE: |
| 965 | wm8775_s_ctrl(core, ctrl->id, ctrl->val); | 963 | wm8775_s_ctrl(core, ctrl->id, ctrl->val); |
diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c index 48b8d7af386d..9d1481a60bd9 100644 --- a/drivers/media/platform/coda.c +++ b/drivers/media/platform/coda.c | |||
| @@ -576,6 +576,14 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) | |||
| 576 | return v4l2_m2m_dqbuf(file, ctx->m2m_ctx, buf); | 576 | return v4l2_m2m_dqbuf(file, ctx->m2m_ctx, buf); |
| 577 | } | 577 | } |
| 578 | 578 | ||
| 579 | static int vidioc_create_bufs(struct file *file, void *priv, | ||
| 580 | struct v4l2_create_buffers *create) | ||
| 581 | { | ||
| 582 | struct coda_ctx *ctx = fh_to_ctx(priv); | ||
| 583 | |||
| 584 | return v4l2_m2m_create_bufs(file, ctx->m2m_ctx, create); | ||
| 585 | } | ||
| 586 | |||
| 579 | static int vidioc_streamon(struct file *file, void *priv, | 587 | static int vidioc_streamon(struct file *file, void *priv, |
| 580 | enum v4l2_buf_type type) | 588 | enum v4l2_buf_type type) |
| 581 | { | 589 | { |
| @@ -610,6 +618,7 @@ static const struct v4l2_ioctl_ops coda_ioctl_ops = { | |||
| 610 | 618 | ||
| 611 | .vidioc_qbuf = vidioc_qbuf, | 619 | .vidioc_qbuf = vidioc_qbuf, |
| 612 | .vidioc_dqbuf = vidioc_dqbuf, | 620 | .vidioc_dqbuf = vidioc_dqbuf, |
| 621 | .vidioc_create_bufs = vidioc_create_bufs, | ||
| 613 | 622 | ||
| 614 | .vidioc_streamon = vidioc_streamon, | 623 | .vidioc_streamon = vidioc_streamon, |
| 615 | .vidioc_streamoff = vidioc_streamoff, | 624 | .vidioc_streamoff = vidioc_streamoff, |
diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c index 1802f11e939f..d0b375cf565f 100644 --- a/drivers/media/platform/davinci/vpbe_display.c +++ b/drivers/media/platform/davinci/vpbe_display.c | |||
| @@ -916,6 +916,21 @@ static int vpbe_display_s_fmt(struct file *file, void *priv, | |||
| 916 | other video window */ | 916 | other video window */ |
| 917 | 917 | ||
| 918 | layer->pix_fmt = *pixfmt; | 918 | layer->pix_fmt = *pixfmt; |
| 919 | if (pixfmt->pixelformat == V4L2_PIX_FMT_NV12) { | ||
| 920 | struct vpbe_layer *otherlayer; | ||
| 921 | |||
| 922 | otherlayer = _vpbe_display_get_other_win_layer(disp_dev, layer); | ||
| 923 | /* if other layer is available, only | ||
| 924 | * claim it, do not configure it | ||
| 925 | */ | ||
| 926 | ret = osd_device->ops.request_layer(osd_device, | ||
| 927 | otherlayer->layer_info.id); | ||
| 928 | if (ret < 0) { | ||
| 929 | v4l2_err(&vpbe_dev->v4l2_dev, | ||
| 930 | "Display Manager failed to allocate layer\n"); | ||
| 931 | return -EBUSY; | ||
| 932 | } | ||
| 933 | } | ||
| 919 | 934 | ||
| 920 | /* Get osd layer config */ | 935 | /* Get osd layer config */ |
| 921 | osd_device->ops.get_layer_config(osd_device, | 936 | osd_device->ops.get_layer_config(osd_device, |
diff --git a/drivers/media/platform/davinci/vpfe_capture.c b/drivers/media/platform/davinci/vpfe_capture.c index 8c50d3074866..93609091cb23 100644 --- a/drivers/media/platform/davinci/vpfe_capture.c +++ b/drivers/media/platform/davinci/vpfe_capture.c | |||
| @@ -1837,7 +1837,7 @@ static int vpfe_probe(struct platform_device *pdev) | |||
| 1837 | if (NULL == ccdc_cfg) { | 1837 | if (NULL == ccdc_cfg) { |
| 1838 | v4l2_err(pdev->dev.driver, | 1838 | v4l2_err(pdev->dev.driver, |
| 1839 | "Memory allocation failed for ccdc_cfg\n"); | 1839 | "Memory allocation failed for ccdc_cfg\n"); |
| 1840 | goto probe_free_lock; | 1840 | goto probe_free_dev_mem; |
| 1841 | } | 1841 | } |
| 1842 | 1842 | ||
| 1843 | mutex_lock(&ccdc_lock); | 1843 | mutex_lock(&ccdc_lock); |
| @@ -1991,7 +1991,6 @@ probe_out_release_irq: | |||
| 1991 | free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); | 1991 | free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); |
| 1992 | probe_free_ccdc_cfg_mem: | 1992 | probe_free_ccdc_cfg_mem: |
| 1993 | kfree(ccdc_cfg); | 1993 | kfree(ccdc_cfg); |
| 1994 | probe_free_lock: | ||
| 1995 | mutex_unlock(&ccdc_lock); | 1994 | mutex_unlock(&ccdc_lock); |
| 1996 | probe_free_dev_mem: | 1995 | probe_free_dev_mem: |
| 1997 | kfree(vpfe_dev); | 1996 | kfree(vpfe_dev); |
diff --git a/drivers/media/platform/exynos4-is/fimc-is-regs.c b/drivers/media/platform/exynos4-is/fimc-is-regs.c index b0ff67bc1b05..d05eaa2c8490 100644 --- a/drivers/media/platform/exynos4-is/fimc-is-regs.c +++ b/drivers/media/platform/exynos4-is/fimc-is-regs.c | |||
| @@ -174,7 +174,7 @@ int fimc_is_hw_change_mode(struct fimc_is *is) | |||
| 174 | HIC_CAPTURE_STILL, HIC_CAPTURE_VIDEO, | 174 | HIC_CAPTURE_STILL, HIC_CAPTURE_VIDEO, |
| 175 | }; | 175 | }; |
| 176 | 176 | ||
| 177 | if (WARN_ON(is->config_index > ARRAY_SIZE(cmd))) | 177 | if (WARN_ON(is->config_index >= ARRAY_SIZE(cmd))) |
| 178 | return -EINVAL; | 178 | return -EINVAL; |
| 179 | 179 | ||
| 180 | mcuctl_write(cmd[is->config_index], is, MCUCTL_REG_ISSR(0)); | 180 | mcuctl_write(cmd[is->config_index], is, MCUCTL_REG_ISSR(0)); |
diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c index 47c6363d04e2..0741945b79ed 100644 --- a/drivers/media/platform/exynos4-is/fimc-is.c +++ b/drivers/media/platform/exynos4-is/fimc-is.c | |||
| @@ -48,7 +48,6 @@ static char *fimc_is_clocks[ISS_CLKS_MAX] = { | |||
| 48 | [ISS_CLK_LITE0] = "lite0", | 48 | [ISS_CLK_LITE0] = "lite0", |
| 49 | [ISS_CLK_LITE1] = "lite1", | 49 | [ISS_CLK_LITE1] = "lite1", |
| 50 | [ISS_CLK_MPLL] = "mpll", | 50 | [ISS_CLK_MPLL] = "mpll", |
| 51 | [ISS_CLK_SYSREG] = "sysreg", | ||
| 52 | [ISS_CLK_ISP] = "isp", | 51 | [ISS_CLK_ISP] = "isp", |
| 53 | [ISS_CLK_DRC] = "drc", | 52 | [ISS_CLK_DRC] = "drc", |
| 54 | [ISS_CLK_FD] = "fd", | 53 | [ISS_CLK_FD] = "fd", |
| @@ -71,7 +70,6 @@ static void fimc_is_put_clocks(struct fimc_is *is) | |||
| 71 | for (i = 0; i < ISS_CLKS_MAX; i++) { | 70 | for (i = 0; i < ISS_CLKS_MAX; i++) { |
| 72 | if (IS_ERR(is->clocks[i])) | 71 | if (IS_ERR(is->clocks[i])) |
| 73 | continue; | 72 | continue; |
| 74 | clk_unprepare(is->clocks[i]); | ||
| 75 | clk_put(is->clocks[i]); | 73 | clk_put(is->clocks[i]); |
| 76 | is->clocks[i] = ERR_PTR(-EINVAL); | 74 | is->clocks[i] = ERR_PTR(-EINVAL); |
| 77 | } | 75 | } |
| @@ -90,12 +88,6 @@ static int fimc_is_get_clocks(struct fimc_is *is) | |||
| 90 | ret = PTR_ERR(is->clocks[i]); | 88 | ret = PTR_ERR(is->clocks[i]); |
| 91 | goto err; | 89 | goto err; |
| 92 | } | 90 | } |
| 93 | ret = clk_prepare(is->clocks[i]); | ||
| 94 | if (ret < 0) { | ||
| 95 | clk_put(is->clocks[i]); | ||
| 96 | is->clocks[i] = ERR_PTR(-EINVAL); | ||
| 97 | goto err; | ||
| 98 | } | ||
| 99 | } | 91 | } |
| 100 | 92 | ||
| 101 | return 0; | 93 | return 0; |
| @@ -103,7 +95,7 @@ err: | |||
| 103 | fimc_is_put_clocks(is); | 95 | fimc_is_put_clocks(is); |
| 104 | dev_err(&is->pdev->dev, "failed to get clock: %s\n", | 96 | dev_err(&is->pdev->dev, "failed to get clock: %s\n", |
| 105 | fimc_is_clocks[i]); | 97 | fimc_is_clocks[i]); |
| 106 | return -ENXIO; | 98 | return ret; |
| 107 | } | 99 | } |
| 108 | 100 | ||
| 109 | static int fimc_is_setup_clocks(struct fimc_is *is) | 101 | static int fimc_is_setup_clocks(struct fimc_is *is) |
| @@ -144,7 +136,7 @@ int fimc_is_enable_clocks(struct fimc_is *is) | |||
| 144 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { | 136 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { |
| 145 | if (IS_ERR(is->clocks[i])) | 137 | if (IS_ERR(is->clocks[i])) |
| 146 | continue; | 138 | continue; |
| 147 | ret = clk_enable(is->clocks[i]); | 139 | ret = clk_prepare_enable(is->clocks[i]); |
| 148 | if (ret < 0) { | 140 | if (ret < 0) { |
| 149 | dev_err(&is->pdev->dev, "clock %s enable failed\n", | 141 | dev_err(&is->pdev->dev, "clock %s enable failed\n", |
| 150 | fimc_is_clocks[i]); | 142 | fimc_is_clocks[i]); |
| @@ -163,7 +155,7 @@ void fimc_is_disable_clocks(struct fimc_is *is) | |||
| 163 | 155 | ||
| 164 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { | 156 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { |
| 165 | if (!IS_ERR(is->clocks[i])) { | 157 | if (!IS_ERR(is->clocks[i])) { |
| 166 | clk_disable(is->clocks[i]); | 158 | clk_disable_unprepare(is->clocks[i]); |
| 167 | pr_debug("disabled clock: %s\n", fimc_is_clocks[i]); | 159 | pr_debug("disabled clock: %s\n", fimc_is_clocks[i]); |
| 168 | } | 160 | } |
| 169 | } | 161 | } |
| @@ -326,6 +318,11 @@ int fimc_is_start_firmware(struct fimc_is *is) | |||
| 326 | struct device *dev = &is->pdev->dev; | 318 | struct device *dev = &is->pdev->dev; |
| 327 | int ret; | 319 | int ret; |
| 328 | 320 | ||
| 321 | if (is->fw.f_w == NULL) { | ||
| 322 | dev_err(dev, "firmware is not loaded\n"); | ||
| 323 | return -EINVAL; | ||
| 324 | } | ||
| 325 | |||
| 329 | memcpy(is->memory.vaddr, is->fw.f_w->data, is->fw.f_w->size); | 326 | memcpy(is->memory.vaddr, is->fw.f_w->data, is->fw.f_w->size); |
| 330 | wmb(); | 327 | wmb(); |
| 331 | 328 | ||
| @@ -837,23 +834,11 @@ static int fimc_is_probe(struct platform_device *pdev) | |||
| 837 | goto err_clk; | 834 | goto err_clk; |
| 838 | } | 835 | } |
| 839 | pm_runtime_enable(dev); | 836 | pm_runtime_enable(dev); |
| 840 | /* | ||
| 841 | * Enable only the ISP power domain, keep FIMC-IS clocks off until | ||
| 842 | * the whole clock tree is configured. The ISP power domain needs | ||
| 843 | * be active in order to acces any CMU_ISP clock registers. | ||
| 844 | */ | ||
| 845 | ret = pm_runtime_get_sync(dev); | ||
| 846 | if (ret < 0) | ||
| 847 | goto err_irq; | ||
| 848 | |||
| 849 | ret = fimc_is_setup_clocks(is); | ||
| 850 | pm_runtime_put_sync(dev); | ||
| 851 | 837 | ||
| 838 | ret = pm_runtime_get_sync(dev); | ||
| 852 | if (ret < 0) | 839 | if (ret < 0) |
| 853 | goto err_irq; | 840 | goto err_irq; |
| 854 | 841 | ||
| 855 | is->clk_init = true; | ||
| 856 | |||
| 857 | is->alloc_ctx = vb2_dma_contig_init_ctx(dev); | 842 | is->alloc_ctx = vb2_dma_contig_init_ctx(dev); |
| 858 | if (IS_ERR(is->alloc_ctx)) { | 843 | if (IS_ERR(is->alloc_ctx)) { |
| 859 | ret = PTR_ERR(is->alloc_ctx); | 844 | ret = PTR_ERR(is->alloc_ctx); |
| @@ -875,6 +860,8 @@ static int fimc_is_probe(struct platform_device *pdev) | |||
| 875 | if (ret < 0) | 860 | if (ret < 0) |
| 876 | goto err_dfs; | 861 | goto err_dfs; |
| 877 | 862 | ||
| 863 | pm_runtime_put_sync(dev); | ||
| 864 | |||
| 878 | dev_dbg(dev, "FIMC-IS registered successfully\n"); | 865 | dev_dbg(dev, "FIMC-IS registered successfully\n"); |
| 879 | return 0; | 866 | return 0; |
| 880 | 867 | ||
| @@ -894,9 +881,11 @@ err_clk: | |||
| 894 | static int fimc_is_runtime_resume(struct device *dev) | 881 | static int fimc_is_runtime_resume(struct device *dev) |
| 895 | { | 882 | { |
| 896 | struct fimc_is *is = dev_get_drvdata(dev); | 883 | struct fimc_is *is = dev_get_drvdata(dev); |
| 884 | int ret; | ||
| 897 | 885 | ||
| 898 | if (!is->clk_init) | 886 | ret = fimc_is_setup_clocks(is); |
| 899 | return 0; | 887 | if (ret) |
| 888 | return ret; | ||
| 900 | 889 | ||
| 901 | return fimc_is_enable_clocks(is); | 890 | return fimc_is_enable_clocks(is); |
| 902 | } | 891 | } |
| @@ -905,9 +894,7 @@ static int fimc_is_runtime_suspend(struct device *dev) | |||
| 905 | { | 894 | { |
| 906 | struct fimc_is *is = dev_get_drvdata(dev); | 895 | struct fimc_is *is = dev_get_drvdata(dev); |
| 907 | 896 | ||
| 908 | if (is->clk_init) | 897 | fimc_is_disable_clocks(is); |
| 909 | fimc_is_disable_clocks(is); | ||
| 910 | |||
| 911 | return 0; | 898 | return 0; |
| 912 | } | 899 | } |
| 913 | 900 | ||
| @@ -941,7 +928,8 @@ static int fimc_is_remove(struct platform_device *pdev) | |||
| 941 | vb2_dma_contig_cleanup_ctx(is->alloc_ctx); | 928 | vb2_dma_contig_cleanup_ctx(is->alloc_ctx); |
| 942 | fimc_is_put_clocks(is); | 929 | fimc_is_put_clocks(is); |
| 943 | fimc_is_debugfs_remove(is); | 930 | fimc_is_debugfs_remove(is); |
| 944 | release_firmware(is->fw.f_w); | 931 | if (is->fw.f_w) |
| 932 | release_firmware(is->fw.f_w); | ||
| 945 | fimc_is_free_cpu_memory(is); | 933 | fimc_is_free_cpu_memory(is); |
| 946 | 934 | ||
| 947 | return 0; | 935 | return 0; |
diff --git a/drivers/media/platform/exynos4-is/fimc-is.h b/drivers/media/platform/exynos4-is/fimc-is.h index f5275a5b0156..d7db133b493f 100644 --- a/drivers/media/platform/exynos4-is/fimc-is.h +++ b/drivers/media/platform/exynos4-is/fimc-is.h | |||
| @@ -73,7 +73,6 @@ enum { | |||
| 73 | ISS_CLK_LITE0, | 73 | ISS_CLK_LITE0, |
| 74 | ISS_CLK_LITE1, | 74 | ISS_CLK_LITE1, |
| 75 | ISS_CLK_MPLL, | 75 | ISS_CLK_MPLL, |
| 76 | ISS_CLK_SYSREG, | ||
| 77 | ISS_CLK_ISP, | 76 | ISS_CLK_ISP, |
| 78 | ISS_CLK_DRC, | 77 | ISS_CLK_DRC, |
| 79 | ISS_CLK_FD, | 78 | ISS_CLK_FD, |
| @@ -265,7 +264,6 @@ struct fimc_is { | |||
| 265 | spinlock_t slock; | 264 | spinlock_t slock; |
| 266 | 265 | ||
| 267 | struct clk *clocks[ISS_CLKS_MAX]; | 266 | struct clk *clocks[ISS_CLKS_MAX]; |
| 268 | bool clk_init; | ||
| 269 | void __iomem *regs; | 267 | void __iomem *regs; |
| 270 | void __iomem *pmu_regs; | 268 | void __iomem *pmu_regs; |
| 271 | int irq; | 269 | int irq; |
diff --git a/drivers/media/platform/exynos4-is/fimc-isp.c b/drivers/media/platform/exynos4-is/fimc-isp.c index d63947f7b302..7ede30b5910f 100644 --- a/drivers/media/platform/exynos4-is/fimc-isp.c +++ b/drivers/media/platform/exynos4-is/fimc-isp.c | |||
| @@ -138,7 +138,7 @@ static int fimc_isp_subdev_get_fmt(struct v4l2_subdev *sd, | |||
| 138 | return 0; | 138 | return 0; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | mf->colorspace = V4L2_COLORSPACE_JPEG; | 141 | mf->colorspace = V4L2_COLORSPACE_SRGB; |
| 142 | 142 | ||
| 143 | mutex_lock(&isp->subdev_lock); | 143 | mutex_lock(&isp->subdev_lock); |
| 144 | __is_get_frame_size(is, &cur_fmt); | 144 | __is_get_frame_size(is, &cur_fmt); |
| @@ -194,7 +194,7 @@ static int fimc_isp_subdev_set_fmt(struct v4l2_subdev *sd, | |||
| 194 | v4l2_dbg(1, debug, sd, "%s: pad%d: code: 0x%x, %dx%d\n", | 194 | v4l2_dbg(1, debug, sd, "%s: pad%d: code: 0x%x, %dx%d\n", |
| 195 | __func__, fmt->pad, mf->code, mf->width, mf->height); | 195 | __func__, fmt->pad, mf->code, mf->width, mf->height); |
| 196 | 196 | ||
| 197 | mf->colorspace = V4L2_COLORSPACE_JPEG; | 197 | mf->colorspace = V4L2_COLORSPACE_SRGB; |
| 198 | 198 | ||
| 199 | mutex_lock(&isp->subdev_lock); | 199 | mutex_lock(&isp->subdev_lock); |
| 200 | __isp_subdev_try_format(isp, fmt); | 200 | __isp_subdev_try_format(isp, fmt); |
diff --git a/drivers/media/platform/exynos4-is/mipi-csis.c b/drivers/media/platform/exynos4-is/mipi-csis.c index a2eda9d5ac87..254d70fe762a 100644 --- a/drivers/media/platform/exynos4-is/mipi-csis.c +++ b/drivers/media/platform/exynos4-is/mipi-csis.c | |||
| @@ -746,7 +746,7 @@ static int s5pcsis_parse_dt(struct platform_device *pdev, | |||
| 746 | node = v4l2_of_get_next_endpoint(node, NULL); | 746 | node = v4l2_of_get_next_endpoint(node, NULL); |
| 747 | if (!node) { | 747 | if (!node) { |
| 748 | dev_err(&pdev->dev, "No port node at %s\n", | 748 | dev_err(&pdev->dev, "No port node at %s\n", |
| 749 | node->full_name); | 749 | pdev->dev.of_node->full_name); |
| 750 | return -EINVAL; | 750 | return -EINVAL; |
| 751 | } | 751 | } |
| 752 | /* Get port node and validate MIPI-CSI channel id. */ | 752 | /* Get port node and validate MIPI-CSI channel id. */ |
diff --git a/drivers/media/platform/s3c-camif/camif-core.h b/drivers/media/platform/s3c-camif/camif-core.h index 261134baa655..35d2fcdc0036 100644 --- a/drivers/media/platform/s3c-camif/camif-core.h +++ b/drivers/media/platform/s3c-camif/camif-core.h | |||
| @@ -229,7 +229,7 @@ struct camif_vp { | |||
| 229 | unsigned int state; | 229 | unsigned int state; |
| 230 | u16 fmt_flags; | 230 | u16 fmt_flags; |
| 231 | u8 id; | 231 | u8 id; |
| 232 | u8 rotation; | 232 | u16 rotation; |
| 233 | u8 hflip; | 233 | u8 hflip; |
| 234 | u8 vflip; | 234 | u8 vflip; |
| 235 | unsigned int offset; | 235 | unsigned int offset; |
diff --git a/drivers/media/platform/s5p-jpeg/Makefile b/drivers/media/platform/s5p-jpeg/Makefile index ddc2900d88a2..d18cb5edd2d5 100644 --- a/drivers/media/platform/s5p-jpeg/Makefile +++ b/drivers/media/platform/s5p-jpeg/Makefile | |||
| @@ -1,2 +1,2 @@ | |||
| 1 | s5p-jpeg-objs := jpeg-core.o | 1 | s5p-jpeg-objs := jpeg-core.o |
| 2 | obj-$(CONFIG_VIDEO_SAMSUNG_S5P_JPEG) := s5p-jpeg.o | 2 | obj-$(CONFIG_VIDEO_SAMSUNG_S5P_JPEG) += s5p-jpeg.o |
diff --git a/drivers/media/platform/s5p-mfc/Makefile b/drivers/media/platform/s5p-mfc/Makefile index 379008c6d09a..15f59b324fef 100644 --- a/drivers/media/platform/s5p-mfc/Makefile +++ b/drivers/media/platform/s5p-mfc/Makefile | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | obj-$(CONFIG_VIDEO_SAMSUNG_S5P_MFC) := s5p-mfc.o | 1 | obj-$(CONFIG_VIDEO_SAMSUNG_S5P_MFC) += s5p-mfc.o |
| 2 | s5p-mfc-y += s5p_mfc.o s5p_mfc_intr.o | 2 | s5p-mfc-y += s5p_mfc.o s5p_mfc_intr.o |
| 3 | s5p-mfc-y += s5p_mfc_dec.o s5p_mfc_enc.o | 3 | s5p-mfc-y += s5p_mfc_dec.o s5p_mfc_enc.o |
| 4 | s5p-mfc-y += s5p_mfc_ctrl.o s5p_mfc_pm.o | 4 | s5p-mfc-y += s5p_mfc_ctrl.o s5p_mfc_pm.o |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c index 01f9ae0dadb0..d12faa691af8 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c | |||
| @@ -397,7 +397,7 @@ static void s5p_mfc_handle_frame(struct s5p_mfc_ctx *ctx, | |||
| 397 | leave_handle_frame: | 397 | leave_handle_frame: |
| 398 | spin_unlock_irqrestore(&dev->irqlock, flags); | 398 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 399 | if ((ctx->src_queue_cnt == 0 && ctx->state != MFCINST_FINISHING) | 399 | if ((ctx->src_queue_cnt == 0 && ctx->state != MFCINST_FINISHING) |
| 400 | || ctx->dst_queue_cnt < ctx->dpb_count) | 400 | || ctx->dst_queue_cnt < ctx->pb_count) |
| 401 | clear_work_bit(ctx); | 401 | clear_work_bit(ctx); |
| 402 | s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); | 402 | s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); |
| 403 | wake_up_ctx(ctx, reason, err); | 403 | wake_up_ctx(ctx, reason, err); |
| @@ -473,7 +473,7 @@ static void s5p_mfc_handle_seq_done(struct s5p_mfc_ctx *ctx, | |||
| 473 | 473 | ||
| 474 | s5p_mfc_hw_call(dev->mfc_ops, dec_calc_dpb_size, ctx); | 474 | s5p_mfc_hw_call(dev->mfc_ops, dec_calc_dpb_size, ctx); |
| 475 | 475 | ||
| 476 | ctx->dpb_count = s5p_mfc_hw_call(dev->mfc_ops, get_dpb_count, | 476 | ctx->pb_count = s5p_mfc_hw_call(dev->mfc_ops, get_dpb_count, |
| 477 | dev); | 477 | dev); |
| 478 | ctx->mv_count = s5p_mfc_hw_call(dev->mfc_ops, get_mv_count, | 478 | ctx->mv_count = s5p_mfc_hw_call(dev->mfc_ops, get_mv_count, |
| 479 | dev); | 479 | dev); |
| @@ -562,7 +562,7 @@ static void s5p_mfc_handle_stream_complete(struct s5p_mfc_ctx *ctx, | |||
| 562 | struct s5p_mfc_dev *dev = ctx->dev; | 562 | struct s5p_mfc_dev *dev = ctx->dev; |
| 563 | struct s5p_mfc_buf *mb_entry; | 563 | struct s5p_mfc_buf *mb_entry; |
| 564 | 564 | ||
| 565 | mfc_debug(2, "Stream completed"); | 565 | mfc_debug(2, "Stream completed\n"); |
| 566 | 566 | ||
| 567 | s5p_mfc_clear_int_flags(dev); | 567 | s5p_mfc_clear_int_flags(dev); |
| 568 | ctx->int_type = reason; | 568 | ctx->int_type = reason; |
| @@ -1362,7 +1362,6 @@ static struct s5p_mfc_variant mfc_drvdata_v5 = { | |||
| 1362 | .port_num = MFC_NUM_PORTS, | 1362 | .port_num = MFC_NUM_PORTS, |
| 1363 | .buf_size = &buf_size_v5, | 1363 | .buf_size = &buf_size_v5, |
| 1364 | .buf_align = &mfc_buf_align_v5, | 1364 | .buf_align = &mfc_buf_align_v5, |
| 1365 | .mclk_name = "sclk_mfc", | ||
| 1366 | .fw_name = "s5p-mfc.fw", | 1365 | .fw_name = "s5p-mfc.fw", |
| 1367 | }; | 1366 | }; |
| 1368 | 1367 | ||
| @@ -1389,7 +1388,6 @@ static struct s5p_mfc_variant mfc_drvdata_v6 = { | |||
| 1389 | .port_num = MFC_NUM_PORTS_V6, | 1388 | .port_num = MFC_NUM_PORTS_V6, |
| 1390 | .buf_size = &buf_size_v6, | 1389 | .buf_size = &buf_size_v6, |
| 1391 | .buf_align = &mfc_buf_align_v6, | 1390 | .buf_align = &mfc_buf_align_v6, |
| 1392 | .mclk_name = "aclk_333", | ||
| 1393 | .fw_name = "s5p-mfc-v6.fw", | 1391 | .fw_name = "s5p-mfc-v6.fw", |
| 1394 | }; | 1392 | }; |
| 1395 | 1393 | ||
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h index 202d1d7a37a8..ef4074cd5316 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h | |||
| @@ -138,6 +138,7 @@ enum s5p_mfc_inst_state { | |||
| 138 | MFCINST_INIT = 100, | 138 | MFCINST_INIT = 100, |
| 139 | MFCINST_GOT_INST, | 139 | MFCINST_GOT_INST, |
| 140 | MFCINST_HEAD_PARSED, | 140 | MFCINST_HEAD_PARSED, |
| 141 | MFCINST_HEAD_PRODUCED, | ||
| 141 | MFCINST_BUFS_SET, | 142 | MFCINST_BUFS_SET, |
| 142 | MFCINST_RUNNING, | 143 | MFCINST_RUNNING, |
| 143 | MFCINST_FINISHING, | 144 | MFCINST_FINISHING, |
| @@ -231,7 +232,6 @@ struct s5p_mfc_variant { | |||
| 231 | unsigned int port_num; | 232 | unsigned int port_num; |
| 232 | struct s5p_mfc_buf_size *buf_size; | 233 | struct s5p_mfc_buf_size *buf_size; |
| 233 | struct s5p_mfc_buf_align *buf_align; | 234 | struct s5p_mfc_buf_align *buf_align; |
| 234 | char *mclk_name; | ||
| 235 | char *fw_name; | 235 | char *fw_name; |
| 236 | }; | 236 | }; |
| 237 | 237 | ||
| @@ -438,7 +438,7 @@ struct s5p_mfc_enc_params { | |||
| 438 | u32 rc_framerate_num; | 438 | u32 rc_framerate_num; |
| 439 | u32 rc_framerate_denom; | 439 | u32 rc_framerate_denom; |
| 440 | 440 | ||
| 441 | union { | 441 | struct { |
| 442 | struct s5p_mfc_h264_enc_params h264; | 442 | struct s5p_mfc_h264_enc_params h264; |
| 443 | struct s5p_mfc_mpeg4_enc_params mpeg4; | 443 | struct s5p_mfc_mpeg4_enc_params mpeg4; |
| 444 | } codec; | 444 | } codec; |
| @@ -602,7 +602,7 @@ struct s5p_mfc_ctx { | |||
| 602 | int after_packed_pb; | 602 | int after_packed_pb; |
| 603 | int sei_fp_parse; | 603 | int sei_fp_parse; |
| 604 | 604 | ||
| 605 | int dpb_count; | 605 | int pb_count; |
| 606 | int total_dpb_count; | 606 | int total_dpb_count; |
| 607 | int mv_count; | 607 | int mv_count; |
| 608 | /* Buffers */ | 608 | /* Buffers */ |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c index 2e5f30b40dea..dc1fc94a488d 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c | |||
| @@ -38,7 +38,7 @@ int s5p_mfc_alloc_firmware(struct s5p_mfc_dev *dev) | |||
| 38 | dev->fw_virt_addr = dma_alloc_coherent(dev->mem_dev_l, dev->fw_size, | 38 | dev->fw_virt_addr = dma_alloc_coherent(dev->mem_dev_l, dev->fw_size, |
| 39 | &dev->bank1, GFP_KERNEL); | 39 | &dev->bank1, GFP_KERNEL); |
| 40 | 40 | ||
| 41 | if (IS_ERR(dev->fw_virt_addr)) { | 41 | if (IS_ERR_OR_NULL(dev->fw_virt_addr)) { |
| 42 | dev->fw_virt_addr = NULL; | 42 | dev->fw_virt_addr = NULL; |
| 43 | mfc_err("Allocating bitprocessor buffer failed\n"); | 43 | mfc_err("Allocating bitprocessor buffer failed\n"); |
| 44 | return -ENOMEM; | 44 | return -ENOMEM; |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h b/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h index bd5cd4ae993c..8e608f5aa0d7 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h | |||
| @@ -30,8 +30,8 @@ extern int debug; | |||
| 30 | #define mfc_debug(level, fmt, args...) | 30 | #define mfc_debug(level, fmt, args...) |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
| 33 | #define mfc_debug_enter() mfc_debug(5, "enter") | 33 | #define mfc_debug_enter() mfc_debug(5, "enter\n") |
| 34 | #define mfc_debug_leave() mfc_debug(5, "leave") | 34 | #define mfc_debug_leave() mfc_debug(5, "leave\n") |
| 35 | 35 | ||
| 36 | #define mfc_err(fmt, args...) \ | 36 | #define mfc_err(fmt, args...) \ |
| 37 | do { \ | 37 | do { \ |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c index 4af53bd2f182..00b07032f4f0 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c | |||
| @@ -210,11 +210,11 @@ static int s5p_mfc_ctx_ready(struct s5p_mfc_ctx *ctx) | |||
| 210 | /* Context is to decode a frame */ | 210 | /* Context is to decode a frame */ |
| 211 | if (ctx->src_queue_cnt >= 1 && | 211 | if (ctx->src_queue_cnt >= 1 && |
| 212 | ctx->state == MFCINST_RUNNING && | 212 | ctx->state == MFCINST_RUNNING && |
| 213 | ctx->dst_queue_cnt >= ctx->dpb_count) | 213 | ctx->dst_queue_cnt >= ctx->pb_count) |
| 214 | return 1; | 214 | return 1; |
| 215 | /* Context is to return last frame */ | 215 | /* Context is to return last frame */ |
| 216 | if (ctx->state == MFCINST_FINISHING && | 216 | if (ctx->state == MFCINST_FINISHING && |
| 217 | ctx->dst_queue_cnt >= ctx->dpb_count) | 217 | ctx->dst_queue_cnt >= ctx->pb_count) |
| 218 | return 1; | 218 | return 1; |
| 219 | /* Context is to set buffers */ | 219 | /* Context is to set buffers */ |
| 220 | if (ctx->src_queue_cnt >= 1 && | 220 | if (ctx->src_queue_cnt >= 1 && |
| @@ -224,7 +224,7 @@ static int s5p_mfc_ctx_ready(struct s5p_mfc_ctx *ctx) | |||
| 224 | /* Resolution change */ | 224 | /* Resolution change */ |
| 225 | if ((ctx->state == MFCINST_RES_CHANGE_INIT || | 225 | if ((ctx->state == MFCINST_RES_CHANGE_INIT || |
| 226 | ctx->state == MFCINST_RES_CHANGE_FLUSH) && | 226 | ctx->state == MFCINST_RES_CHANGE_FLUSH) && |
| 227 | ctx->dst_queue_cnt >= ctx->dpb_count) | 227 | ctx->dst_queue_cnt >= ctx->pb_count) |
| 228 | return 1; | 228 | return 1; |
| 229 | if (ctx->state == MFCINST_RES_CHANGE_END && | 229 | if (ctx->state == MFCINST_RES_CHANGE_END && |
| 230 | ctx->src_queue_cnt >= 1) | 230 | ctx->src_queue_cnt >= 1) |
| @@ -537,7 +537,7 @@ static int vidioc_reqbufs(struct file *file, void *priv, | |||
| 537 | mfc_err("vb2_reqbufs on capture failed\n"); | 537 | mfc_err("vb2_reqbufs on capture failed\n"); |
| 538 | return ret; | 538 | return ret; |
| 539 | } | 539 | } |
| 540 | if (reqbufs->count < ctx->dpb_count) { | 540 | if (reqbufs->count < ctx->pb_count) { |
| 541 | mfc_err("Not enough buffers allocated\n"); | 541 | mfc_err("Not enough buffers allocated\n"); |
| 542 | reqbufs->count = 0; | 542 | reqbufs->count = 0; |
| 543 | s5p_mfc_clock_on(); | 543 | s5p_mfc_clock_on(); |
| @@ -751,7 +751,7 @@ static int s5p_mfc_dec_g_v_ctrl(struct v4l2_ctrl *ctrl) | |||
| 751 | case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: | 751 | case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: |
| 752 | if (ctx->state >= MFCINST_HEAD_PARSED && | 752 | if (ctx->state >= MFCINST_HEAD_PARSED && |
| 753 | ctx->state < MFCINST_ABORT) { | 753 | ctx->state < MFCINST_ABORT) { |
| 754 | ctrl->val = ctx->dpb_count; | 754 | ctrl->val = ctx->pb_count; |
| 755 | break; | 755 | break; |
| 756 | } else if (ctx->state != MFCINST_INIT) { | 756 | } else if (ctx->state != MFCINST_INIT) { |
| 757 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); | 757 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); |
| @@ -763,7 +763,7 @@ static int s5p_mfc_dec_g_v_ctrl(struct v4l2_ctrl *ctrl) | |||
| 763 | S5P_MFC_R2H_CMD_SEQ_DONE_RET, 0); | 763 | S5P_MFC_R2H_CMD_SEQ_DONE_RET, 0); |
| 764 | if (ctx->state >= MFCINST_HEAD_PARSED && | 764 | if (ctx->state >= MFCINST_HEAD_PARSED && |
| 765 | ctx->state < MFCINST_ABORT) { | 765 | ctx->state < MFCINST_ABORT) { |
| 766 | ctrl->val = ctx->dpb_count; | 766 | ctrl->val = ctx->pb_count; |
| 767 | } else { | 767 | } else { |
| 768 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); | 768 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); |
| 769 | return -EINVAL; | 769 | return -EINVAL; |
| @@ -924,10 +924,10 @@ static int s5p_mfc_queue_setup(struct vb2_queue *vq, | |||
| 924 | /* Output plane count is 2 - one for Y and one for CbCr */ | 924 | /* Output plane count is 2 - one for Y and one for CbCr */ |
| 925 | *plane_count = 2; | 925 | *plane_count = 2; |
| 926 | /* Setup buffer count */ | 926 | /* Setup buffer count */ |
| 927 | if (*buf_count < ctx->dpb_count) | 927 | if (*buf_count < ctx->pb_count) |
| 928 | *buf_count = ctx->dpb_count; | 928 | *buf_count = ctx->pb_count; |
| 929 | if (*buf_count > ctx->dpb_count + MFC_MAX_EXTRA_DPB) | 929 | if (*buf_count > ctx->pb_count + MFC_MAX_EXTRA_DPB) |
| 930 | *buf_count = ctx->dpb_count + MFC_MAX_EXTRA_DPB; | 930 | *buf_count = ctx->pb_count + MFC_MAX_EXTRA_DPB; |
| 931 | if (*buf_count > MFC_MAX_BUFFERS) | 931 | if (*buf_count > MFC_MAX_BUFFERS) |
| 932 | *buf_count = MFC_MAX_BUFFERS; | 932 | *buf_count = MFC_MAX_BUFFERS; |
| 933 | } else { | 933 | } else { |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c index 4f6b553c4b2d..2549967b2f85 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | |||
| @@ -592,7 +592,7 @@ static int s5p_mfc_ctx_ready(struct s5p_mfc_ctx *ctx) | |||
| 592 | return 1; | 592 | return 1; |
| 593 | /* context is ready to encode a frame */ | 593 | /* context is ready to encode a frame */ |
| 594 | if ((ctx->state == MFCINST_RUNNING || | 594 | if ((ctx->state == MFCINST_RUNNING || |
| 595 | ctx->state == MFCINST_HEAD_PARSED) && | 595 | ctx->state == MFCINST_HEAD_PRODUCED) && |
| 596 | ctx->src_queue_cnt >= 1 && ctx->dst_queue_cnt >= 1) | 596 | ctx->src_queue_cnt >= 1 && ctx->dst_queue_cnt >= 1) |
| 597 | return 1; | 597 | return 1; |
| 598 | /* context is ready to encode remaining frames */ | 598 | /* context is ready to encode remaining frames */ |
| @@ -649,6 +649,7 @@ static int enc_post_seq_start(struct s5p_mfc_ctx *ctx) | |||
| 649 | struct s5p_mfc_enc_params *p = &ctx->enc_params; | 649 | struct s5p_mfc_enc_params *p = &ctx->enc_params; |
| 650 | struct s5p_mfc_buf *dst_mb; | 650 | struct s5p_mfc_buf *dst_mb; |
| 651 | unsigned long flags; | 651 | unsigned long flags; |
| 652 | unsigned int enc_pb_count; | ||
| 652 | 653 | ||
| 653 | if (p->seq_hdr_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) { | 654 | if (p->seq_hdr_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) { |
| 654 | spin_lock_irqsave(&dev->irqlock, flags); | 655 | spin_lock_irqsave(&dev->irqlock, flags); |
| @@ -661,18 +662,19 @@ static int enc_post_seq_start(struct s5p_mfc_ctx *ctx) | |||
| 661 | vb2_buffer_done(dst_mb->b, VB2_BUF_STATE_DONE); | 662 | vb2_buffer_done(dst_mb->b, VB2_BUF_STATE_DONE); |
| 662 | spin_unlock_irqrestore(&dev->irqlock, flags); | 663 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 663 | } | 664 | } |
| 664 | if (IS_MFCV6(dev)) { | 665 | |
| 665 | ctx->state = MFCINST_HEAD_PARSED; /* for INIT_BUFFER cmd */ | 666 | if (!IS_MFCV6(dev)) { |
| 666 | } else { | ||
| 667 | ctx->state = MFCINST_RUNNING; | 667 | ctx->state = MFCINST_RUNNING; |
| 668 | if (s5p_mfc_ctx_ready(ctx)) | 668 | if (s5p_mfc_ctx_ready(ctx)) |
| 669 | set_work_bit_irqsave(ctx); | 669 | set_work_bit_irqsave(ctx); |
| 670 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); | 670 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); |
| 671 | } | 671 | } else { |
| 672 | 672 | enc_pb_count = s5p_mfc_hw_call(dev->mfc_ops, | |
| 673 | if (IS_MFCV6(dev)) | ||
| 674 | ctx->dpb_count = s5p_mfc_hw_call(dev->mfc_ops, | ||
| 675 | get_enc_dpb_count, dev); | 673 | get_enc_dpb_count, dev); |
| 674 | if (ctx->pb_count < enc_pb_count) | ||
| 675 | ctx->pb_count = enc_pb_count; | ||
| 676 | ctx->state = MFCINST_HEAD_PRODUCED; | ||
| 677 | } | ||
| 676 | 678 | ||
| 677 | return 0; | 679 | return 0; |
| 678 | } | 680 | } |
| @@ -717,9 +719,9 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) | |||
| 717 | 719 | ||
| 718 | slice_type = s5p_mfc_hw_call(dev->mfc_ops, get_enc_slice_type, dev); | 720 | slice_type = s5p_mfc_hw_call(dev->mfc_ops, get_enc_slice_type, dev); |
| 719 | strm_size = s5p_mfc_hw_call(dev->mfc_ops, get_enc_strm_size, dev); | 721 | strm_size = s5p_mfc_hw_call(dev->mfc_ops, get_enc_strm_size, dev); |
| 720 | mfc_debug(2, "Encoded slice type: %d", slice_type); | 722 | mfc_debug(2, "Encoded slice type: %d\n", slice_type); |
| 721 | mfc_debug(2, "Encoded stream size: %d", strm_size); | 723 | mfc_debug(2, "Encoded stream size: %d\n", strm_size); |
| 722 | mfc_debug(2, "Display order: %d", | 724 | mfc_debug(2, "Display order: %d\n", |
| 723 | mfc_read(dev, S5P_FIMV_ENC_SI_PIC_CNT)); | 725 | mfc_read(dev, S5P_FIMV_ENC_SI_PIC_CNT)); |
| 724 | spin_lock_irqsave(&dev->irqlock, flags); | 726 | spin_lock_irqsave(&dev->irqlock, flags); |
| 725 | if (slice_type >= 0) { | 727 | if (slice_type >= 0) { |
| @@ -1055,15 +1057,13 @@ static int vidioc_reqbufs(struct file *file, void *priv, | |||
| 1055 | } | 1057 | } |
| 1056 | ctx->capture_state = QUEUE_BUFS_REQUESTED; | 1058 | ctx->capture_state = QUEUE_BUFS_REQUESTED; |
| 1057 | 1059 | ||
| 1058 | if (!IS_MFCV6(dev)) { | 1060 | ret = s5p_mfc_hw_call(ctx->dev->mfc_ops, |
| 1059 | ret = s5p_mfc_hw_call(ctx->dev->mfc_ops, | 1061 | alloc_codec_buffers, ctx); |
| 1060 | alloc_codec_buffers, ctx); | 1062 | if (ret) { |
| 1061 | if (ret) { | 1063 | mfc_err("Failed to allocate encoding buffers\n"); |
| 1062 | mfc_err("Failed to allocate encoding buffers\n"); | 1064 | reqbufs->count = 0; |
| 1063 | reqbufs->count = 0; | 1065 | ret = vb2_reqbufs(&ctx->vq_dst, reqbufs); |
| 1064 | ret = vb2_reqbufs(&ctx->vq_dst, reqbufs); | 1066 | return -ENOMEM; |
| 1065 | return -ENOMEM; | ||
| 1066 | } | ||
| 1067 | } | 1067 | } |
| 1068 | } else if (reqbufs->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { | 1068 | } else if (reqbufs->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { |
| 1069 | if (ctx->output_state != QUEUE_FREE) { | 1069 | if (ctx->output_state != QUEUE_FREE) { |
| @@ -1071,6 +1071,19 @@ static int vidioc_reqbufs(struct file *file, void *priv, | |||
| 1071 | ctx->output_state); | 1071 | ctx->output_state); |
| 1072 | return -EINVAL; | 1072 | return -EINVAL; |
| 1073 | } | 1073 | } |
| 1074 | |||
| 1075 | if (IS_MFCV6(dev)) { | ||
| 1076 | /* Check for min encoder buffers */ | ||
| 1077 | if (ctx->pb_count && | ||
| 1078 | (reqbufs->count < ctx->pb_count)) { | ||
| 1079 | reqbufs->count = ctx->pb_count; | ||
| 1080 | mfc_debug(2, "Minimum %d output buffers needed\n", | ||
| 1081 | ctx->pb_count); | ||
| 1082 | } else { | ||
| 1083 | ctx->pb_count = reqbufs->count; | ||
| 1084 | } | ||
| 1085 | } | ||
| 1086 | |||
| 1074 | ret = vb2_reqbufs(&ctx->vq_src, reqbufs); | 1087 | ret = vb2_reqbufs(&ctx->vq_src, reqbufs); |
| 1075 | if (ret != 0) { | 1088 | if (ret != 0) { |
| 1076 | mfc_err("error in vb2_reqbufs() for E(S)\n"); | 1089 | mfc_err("error in vb2_reqbufs() for E(S)\n"); |
| @@ -1533,14 +1546,14 @@ int vidioc_encoder_cmd(struct file *file, void *priv, | |||
| 1533 | 1546 | ||
| 1534 | spin_lock_irqsave(&dev->irqlock, flags); | 1547 | spin_lock_irqsave(&dev->irqlock, flags); |
| 1535 | if (list_empty(&ctx->src_queue)) { | 1548 | if (list_empty(&ctx->src_queue)) { |
| 1536 | mfc_debug(2, "EOS: empty src queue, entering finishing state"); | 1549 | mfc_debug(2, "EOS: empty src queue, entering finishing state\n"); |
| 1537 | ctx->state = MFCINST_FINISHING; | 1550 | ctx->state = MFCINST_FINISHING; |
| 1538 | if (s5p_mfc_ctx_ready(ctx)) | 1551 | if (s5p_mfc_ctx_ready(ctx)) |
| 1539 | set_work_bit_irqsave(ctx); | 1552 | set_work_bit_irqsave(ctx); |
| 1540 | spin_unlock_irqrestore(&dev->irqlock, flags); | 1553 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 1541 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); | 1554 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); |
| 1542 | } else { | 1555 | } else { |
| 1543 | mfc_debug(2, "EOS: marking last buffer of stream"); | 1556 | mfc_debug(2, "EOS: marking last buffer of stream\n"); |
| 1544 | buf = list_entry(ctx->src_queue.prev, | 1557 | buf = list_entry(ctx->src_queue.prev, |
| 1545 | struct s5p_mfc_buf, list); | 1558 | struct s5p_mfc_buf, list); |
| 1546 | if (buf->flags & MFC_BUF_FLAG_USED) | 1559 | if (buf->flags & MFC_BUF_FLAG_USED) |
| @@ -1609,9 +1622,9 @@ static int check_vb_with_fmt(struct s5p_mfc_fmt *fmt, struct vb2_buffer *vb) | |||
| 1609 | mfc_err("failed to get plane cookie\n"); | 1622 | mfc_err("failed to get plane cookie\n"); |
| 1610 | return -EINVAL; | 1623 | return -EINVAL; |
| 1611 | } | 1624 | } |
| 1612 | mfc_debug(2, "index: %d, plane[%d] cookie: 0x%08zx", | 1625 | mfc_debug(2, "index: %d, plane[%d] cookie: 0x%08zx\n", |
| 1613 | vb->v4l2_buf.index, i, | 1626 | vb->v4l2_buf.index, i, |
| 1614 | vb2_dma_contig_plane_dma_addr(vb, i)); | 1627 | vb2_dma_contig_plane_dma_addr(vb, i)); |
| 1615 | } | 1628 | } |
| 1616 | return 0; | 1629 | return 0; |
| 1617 | } | 1630 | } |
| @@ -1760,11 +1773,27 @@ static int s5p_mfc_start_streaming(struct vb2_queue *q, unsigned int count) | |||
| 1760 | struct s5p_mfc_ctx *ctx = fh_to_ctx(q->drv_priv); | 1773 | struct s5p_mfc_ctx *ctx = fh_to_ctx(q->drv_priv); |
| 1761 | struct s5p_mfc_dev *dev = ctx->dev; | 1774 | struct s5p_mfc_dev *dev = ctx->dev; |
| 1762 | 1775 | ||
| 1763 | v4l2_ctrl_handler_setup(&ctx->ctrl_handler); | 1776 | if (IS_MFCV6(dev) && (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)) { |
| 1777 | |||
| 1778 | if ((ctx->state == MFCINST_GOT_INST) && | ||
| 1779 | (dev->curr_ctx == ctx->num) && dev->hw_lock) { | ||
| 1780 | s5p_mfc_wait_for_done_ctx(ctx, | ||
| 1781 | S5P_MFC_R2H_CMD_SEQ_DONE_RET, | ||
| 1782 | 0); | ||
| 1783 | } | ||
| 1784 | |||
| 1785 | if (ctx->src_bufs_cnt < ctx->pb_count) { | ||
| 1786 | mfc_err("Need minimum %d OUTPUT buffers\n", | ||
| 1787 | ctx->pb_count); | ||
| 1788 | return -EINVAL; | ||
| 1789 | } | ||
| 1790 | } | ||
| 1791 | |||
| 1764 | /* If context is ready then dev = work->data;schedule it to run */ | 1792 | /* If context is ready then dev = work->data;schedule it to run */ |
| 1765 | if (s5p_mfc_ctx_ready(ctx)) | 1793 | if (s5p_mfc_ctx_ready(ctx)) |
| 1766 | set_work_bit_irqsave(ctx); | 1794 | set_work_bit_irqsave(ctx); |
| 1767 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); | 1795 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); |
| 1796 | |||
| 1768 | return 0; | 1797 | return 0; |
| 1769 | } | 1798 | } |
| 1770 | 1799 | ||
| @@ -1920,6 +1949,7 @@ int s5p_mfc_enc_ctrls_setup(struct s5p_mfc_ctx *ctx) | |||
| 1920 | if (controls[i].is_volatile && ctx->ctrls[i]) | 1949 | if (controls[i].is_volatile && ctx->ctrls[i]) |
| 1921 | ctx->ctrls[i]->flags |= V4L2_CTRL_FLAG_VOLATILE; | 1950 | ctx->ctrls[i]->flags |= V4L2_CTRL_FLAG_VOLATILE; |
| 1922 | } | 1951 | } |
| 1952 | v4l2_ctrl_handler_setup(&ctx->ctrl_handler); | ||
| 1923 | return 0; | 1953 | return 0; |
| 1924 | } | 1954 | } |
| 1925 | 1955 | ||
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c index 0af05a2d1cd4..368582b091bf 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c | |||
| @@ -1275,8 +1275,8 @@ static int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx) | |||
| 1275 | spin_unlock_irqrestore(&dev->irqlock, flags); | 1275 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 1276 | dev->curr_ctx = ctx->num; | 1276 | dev->curr_ctx = ctx->num; |
| 1277 | s5p_mfc_clean_ctx_int_flags(ctx); | 1277 | s5p_mfc_clean_ctx_int_flags(ctx); |
| 1278 | mfc_debug(2, "encoding buffer with index=%d state=%d", | 1278 | mfc_debug(2, "encoding buffer with index=%d state=%d\n", |
| 1279 | src_mb ? src_mb->b->v4l2_buf.index : -1, ctx->state); | 1279 | src_mb ? src_mb->b->v4l2_buf.index : -1, ctx->state); |
| 1280 | s5p_mfc_encode_one_frame_v5(ctx); | 1280 | s5p_mfc_encode_one_frame_v5(ctx); |
| 1281 | return 0; | 1281 | return 0; |
| 1282 | } | 1282 | } |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c index 7e76fce2e524..66f0d042357f 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c | |||
| @@ -62,12 +62,6 @@ static void s5p_mfc_release_dec_desc_buffer_v6(struct s5p_mfc_ctx *ctx) | |||
| 62 | /* NOP */ | 62 | /* NOP */ |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | static int s5p_mfc_get_dec_status_v6(struct s5p_mfc_dev *dev) | ||
| 66 | { | ||
| 67 | /* NOP */ | ||
| 68 | return -1; | ||
| 69 | } | ||
| 70 | |||
| 71 | /* Allocate codec buffers */ | 65 | /* Allocate codec buffers */ |
| 72 | static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | 66 | static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) |
| 73 | { | 67 | { |
| @@ -167,7 +161,7 @@ static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | |||
| 167 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); | 161 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); |
| 168 | ctx->bank1.size = | 162 | ctx->bank1.size = |
| 169 | ctx->scratch_buf_size + ctx->tmv_buffer_size + | 163 | ctx->scratch_buf_size + ctx->tmv_buffer_size + |
| 170 | (ctx->dpb_count * (ctx->luma_dpb_size + | 164 | (ctx->pb_count * (ctx->luma_dpb_size + |
| 171 | ctx->chroma_dpb_size + ctx->me_buffer_size)); | 165 | ctx->chroma_dpb_size + ctx->me_buffer_size)); |
| 172 | ctx->bank2.size = 0; | 166 | ctx->bank2.size = 0; |
| 173 | break; | 167 | break; |
| @@ -181,7 +175,7 @@ static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | |||
| 181 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); | 175 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); |
| 182 | ctx->bank1.size = | 176 | ctx->bank1.size = |
| 183 | ctx->scratch_buf_size + ctx->tmv_buffer_size + | 177 | ctx->scratch_buf_size + ctx->tmv_buffer_size + |
| 184 | (ctx->dpb_count * (ctx->luma_dpb_size + | 178 | (ctx->pb_count * (ctx->luma_dpb_size + |
| 185 | ctx->chroma_dpb_size + ctx->me_buffer_size)); | 179 | ctx->chroma_dpb_size + ctx->me_buffer_size)); |
| 186 | ctx->bank2.size = 0; | 180 | ctx->bank2.size = 0; |
| 187 | break; | 181 | break; |
| @@ -198,7 +192,6 @@ static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | |||
| 198 | } | 192 | } |
| 199 | BUG_ON(ctx->bank1.dma & ((1 << MFC_BANK1_ALIGN_ORDER) - 1)); | 193 | BUG_ON(ctx->bank1.dma & ((1 << MFC_BANK1_ALIGN_ORDER) - 1)); |
| 200 | } | 194 | } |
| 201 | |||
| 202 | return 0; | 195 | return 0; |
| 203 | } | 196 | } |
| 204 | 197 | ||
| @@ -449,8 +442,8 @@ static int s5p_mfc_set_enc_stream_buffer_v6(struct s5p_mfc_ctx *ctx, | |||
| 449 | WRITEL(addr, S5P_FIMV_E_STREAM_BUFFER_ADDR_V6); /* 16B align */ | 442 | WRITEL(addr, S5P_FIMV_E_STREAM_BUFFER_ADDR_V6); /* 16B align */ |
| 450 | WRITEL(size, S5P_FIMV_E_STREAM_BUFFER_SIZE_V6); | 443 | WRITEL(size, S5P_FIMV_E_STREAM_BUFFER_SIZE_V6); |
| 451 | 444 | ||
| 452 | mfc_debug(2, "stream buf addr: 0x%08lx, size: 0x%d", | 445 | mfc_debug(2, "stream buf addr: 0x%08lx, size: 0x%d\n", |
| 453 | addr, size); | 446 | addr, size); |
| 454 | 447 | ||
| 455 | return 0; | 448 | return 0; |
| 456 | } | 449 | } |
| @@ -463,8 +456,8 @@ static void s5p_mfc_set_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, | |||
| 463 | WRITEL(y_addr, S5P_FIMV_E_SOURCE_LUMA_ADDR_V6); /* 256B align */ | 456 | WRITEL(y_addr, S5P_FIMV_E_SOURCE_LUMA_ADDR_V6); /* 256B align */ |
| 464 | WRITEL(c_addr, S5P_FIMV_E_SOURCE_CHROMA_ADDR_V6); | 457 | WRITEL(c_addr, S5P_FIMV_E_SOURCE_CHROMA_ADDR_V6); |
| 465 | 458 | ||
| 466 | mfc_debug(2, "enc src y buf addr: 0x%08lx", y_addr); | 459 | mfc_debug(2, "enc src y buf addr: 0x%08lx\n", y_addr); |
| 467 | mfc_debug(2, "enc src c buf addr: 0x%08lx", c_addr); | 460 | mfc_debug(2, "enc src c buf addr: 0x%08lx\n", c_addr); |
| 468 | } | 461 | } |
| 469 | 462 | ||
| 470 | static void s5p_mfc_get_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, | 463 | static void s5p_mfc_get_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, |
| @@ -479,8 +472,8 @@ static void s5p_mfc_get_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, | |||
| 479 | enc_recon_y_addr = READL(S5P_FIMV_E_RECON_LUMA_DPB_ADDR_V6); | 472 | enc_recon_y_addr = READL(S5P_FIMV_E_RECON_LUMA_DPB_ADDR_V6); |
| 480 | enc_recon_c_addr = READL(S5P_FIMV_E_RECON_CHROMA_DPB_ADDR_V6); | 473 | enc_recon_c_addr = READL(S5P_FIMV_E_RECON_CHROMA_DPB_ADDR_V6); |
| 481 | 474 | ||
| 482 | mfc_debug(2, "recon y addr: 0x%08lx", enc_recon_y_addr); | 475 | mfc_debug(2, "recon y addr: 0x%08lx\n", enc_recon_y_addr); |
| 483 | mfc_debug(2, "recon c addr: 0x%08lx", enc_recon_c_addr); | 476 | mfc_debug(2, "recon c addr: 0x%08lx\n", enc_recon_c_addr); |
| 484 | } | 477 | } |
| 485 | 478 | ||
| 486 | /* Set encoding ref & codec buffer */ | 479 | /* Set encoding ref & codec buffer */ |
| @@ -497,7 +490,7 @@ static int s5p_mfc_set_enc_ref_buffer_v6(struct s5p_mfc_ctx *ctx) | |||
| 497 | 490 | ||
| 498 | mfc_debug(2, "Buf1: %p (%d)\n", (void *)buf_addr1, buf_size1); | 491 | mfc_debug(2, "Buf1: %p (%d)\n", (void *)buf_addr1, buf_size1); |
| 499 | 492 | ||
| 500 | for (i = 0; i < ctx->dpb_count; i++) { | 493 | for (i = 0; i < ctx->pb_count; i++) { |
| 501 | WRITEL(buf_addr1, S5P_FIMV_E_LUMA_DPB_V6 + (4 * i)); | 494 | WRITEL(buf_addr1, S5P_FIMV_E_LUMA_DPB_V6 + (4 * i)); |
| 502 | buf_addr1 += ctx->luma_dpb_size; | 495 | buf_addr1 += ctx->luma_dpb_size; |
| 503 | WRITEL(buf_addr1, S5P_FIMV_E_CHROMA_DPB_V6 + (4 * i)); | 496 | WRITEL(buf_addr1, S5P_FIMV_E_CHROMA_DPB_V6 + (4 * i)); |
| @@ -520,7 +513,7 @@ static int s5p_mfc_set_enc_ref_buffer_v6(struct s5p_mfc_ctx *ctx) | |||
| 520 | buf_size1 -= ctx->tmv_buffer_size; | 513 | buf_size1 -= ctx->tmv_buffer_size; |
| 521 | 514 | ||
| 522 | mfc_debug(2, "Buf1: %u, buf_size1: %d (ref frames %d)\n", | 515 | mfc_debug(2, "Buf1: %u, buf_size1: %d (ref frames %d)\n", |
| 523 | buf_addr1, buf_size1, ctx->dpb_count); | 516 | buf_addr1, buf_size1, ctx->pb_count); |
| 524 | if (buf_size1 < 0) { | 517 | if (buf_size1 < 0) { |
| 525 | mfc_debug(2, "Not enough memory has been allocated.\n"); | 518 | mfc_debug(2, "Not enough memory has been allocated.\n"); |
| 526 | return -ENOMEM; | 519 | return -ENOMEM; |
| @@ -1431,8 +1424,8 @@ static inline int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx) | |||
| 1431 | src_y_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 0); | 1424 | src_y_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 0); |
| 1432 | src_c_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 1); | 1425 | src_c_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 1); |
| 1433 | 1426 | ||
| 1434 | mfc_debug(2, "enc src y addr: 0x%08lx", src_y_addr); | 1427 | mfc_debug(2, "enc src y addr: 0x%08lx\n", src_y_addr); |
| 1435 | mfc_debug(2, "enc src c addr: 0x%08lx", src_c_addr); | 1428 | mfc_debug(2, "enc src c addr: 0x%08lx\n", src_c_addr); |
| 1436 | 1429 | ||
| 1437 | s5p_mfc_set_enc_frame_buffer_v6(ctx, src_y_addr, src_c_addr); | 1430 | s5p_mfc_set_enc_frame_buffer_v6(ctx, src_y_addr, src_c_addr); |
| 1438 | 1431 | ||
| @@ -1522,22 +1515,6 @@ static inline int s5p_mfc_run_init_enc_buffers(struct s5p_mfc_ctx *ctx) | |||
| 1522 | struct s5p_mfc_dev *dev = ctx->dev; | 1515 | struct s5p_mfc_dev *dev = ctx->dev; |
| 1523 | int ret; | 1516 | int ret; |
| 1524 | 1517 | ||
| 1525 | ret = s5p_mfc_alloc_codec_buffers_v6(ctx); | ||
| 1526 | if (ret) { | ||
| 1527 | mfc_err("Failed to allocate encoding buffers.\n"); | ||
| 1528 | return -ENOMEM; | ||
| 1529 | } | ||
| 1530 | |||
| 1531 | /* Header was generated now starting processing | ||
| 1532 | * First set the reference frame buffers | ||
| 1533 | */ | ||
| 1534 | if (ctx->capture_state != QUEUE_BUFS_REQUESTED) { | ||
| 1535 | mfc_err("It seems that destionation buffers were not\n" | ||
| 1536 | "requested.MFC requires that header should be generated\n" | ||
| 1537 | "before allocating codec buffer.\n"); | ||
| 1538 | return -EAGAIN; | ||
| 1539 | } | ||
| 1540 | |||
| 1541 | dev->curr_ctx = ctx->num; | 1518 | dev->curr_ctx = ctx->num; |
| 1542 | s5p_mfc_clean_ctx_int_flags(ctx); | 1519 | s5p_mfc_clean_ctx_int_flags(ctx); |
| 1543 | ret = s5p_mfc_set_enc_ref_buffer_v6(ctx); | 1520 | ret = s5p_mfc_set_enc_ref_buffer_v6(ctx); |
| @@ -1582,7 +1559,7 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev) | |||
| 1582 | mfc_debug(1, "Seting new context to %p\n", ctx); | 1559 | mfc_debug(1, "Seting new context to %p\n", ctx); |
| 1583 | /* Got context to run in ctx */ | 1560 | /* Got context to run in ctx */ |
| 1584 | mfc_debug(1, "ctx->dst_queue_cnt=%d ctx->dpb_count=%d ctx->src_queue_cnt=%d\n", | 1561 | mfc_debug(1, "ctx->dst_queue_cnt=%d ctx->dpb_count=%d ctx->src_queue_cnt=%d\n", |
| 1585 | ctx->dst_queue_cnt, ctx->dpb_count, ctx->src_queue_cnt); | 1562 | ctx->dst_queue_cnt, ctx->pb_count, ctx->src_queue_cnt); |
| 1586 | mfc_debug(1, "ctx->state=%d\n", ctx->state); | 1563 | mfc_debug(1, "ctx->state=%d\n", ctx->state); |
| 1587 | /* Last frame has already been sent to MFC | 1564 | /* Last frame has already been sent to MFC |
| 1588 | * Now obtaining frames from MFC buffer */ | 1565 | * Now obtaining frames from MFC buffer */ |
| @@ -1647,7 +1624,7 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev) | |||
| 1647 | case MFCINST_GOT_INST: | 1624 | case MFCINST_GOT_INST: |
| 1648 | s5p_mfc_run_init_enc(ctx); | 1625 | s5p_mfc_run_init_enc(ctx); |
| 1649 | break; | 1626 | break; |
| 1650 | case MFCINST_HEAD_PARSED: /* Only for MFC6.x */ | 1627 | case MFCINST_HEAD_PRODUCED: |
| 1651 | ret = s5p_mfc_run_init_enc_buffers(ctx); | 1628 | ret = s5p_mfc_run_init_enc_buffers(ctx); |
| 1652 | break; | 1629 | break; |
| 1653 | default: | 1630 | default: |
| @@ -1730,7 +1707,7 @@ static int s5p_mfc_get_dspl_status_v6(struct s5p_mfc_dev *dev) | |||
| 1730 | return mfc_read(dev, S5P_FIMV_D_DISPLAY_STATUS_V6); | 1707 | return mfc_read(dev, S5P_FIMV_D_DISPLAY_STATUS_V6); |
| 1731 | } | 1708 | } |
| 1732 | 1709 | ||
| 1733 | static int s5p_mfc_get_decoded_status_v6(struct s5p_mfc_dev *dev) | 1710 | static int s5p_mfc_get_dec_status_v6(struct s5p_mfc_dev *dev) |
| 1734 | { | 1711 | { |
| 1735 | return mfc_read(dev, S5P_FIMV_D_DECODED_STATUS_V6); | 1712 | return mfc_read(dev, S5P_FIMV_D_DECODED_STATUS_V6); |
| 1736 | } | 1713 | } |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c index 6aa38a56aaf2..11d5f1dada32 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c | |||
| @@ -50,19 +50,6 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev) | |||
| 50 | goto err_p_ip_clk; | 50 | goto err_p_ip_clk; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | pm->clock = clk_get(&dev->plat_dev->dev, dev->variant->mclk_name); | ||
| 54 | if (IS_ERR(pm->clock)) { | ||
| 55 | mfc_err("Failed to get MFC clock\n"); | ||
| 56 | ret = PTR_ERR(pm->clock); | ||
| 57 | goto err_g_ip_clk_2; | ||
| 58 | } | ||
| 59 | |||
| 60 | ret = clk_prepare(pm->clock); | ||
| 61 | if (ret) { | ||
| 62 | mfc_err("Failed to prepare MFC clock\n"); | ||
| 63 | goto err_p_ip_clk_2; | ||
| 64 | } | ||
| 65 | |||
| 66 | atomic_set(&pm->power, 0); | 53 | atomic_set(&pm->power, 0); |
| 67 | #ifdef CONFIG_PM_RUNTIME | 54 | #ifdef CONFIG_PM_RUNTIME |
| 68 | pm->device = &dev->plat_dev->dev; | 55 | pm->device = &dev->plat_dev->dev; |
| @@ -72,10 +59,6 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev) | |||
| 72 | atomic_set(&clk_ref, 0); | 59 | atomic_set(&clk_ref, 0); |
| 73 | #endif | 60 | #endif |
| 74 | return 0; | 61 | return 0; |
| 75 | err_p_ip_clk_2: | ||
| 76 | clk_put(pm->clock); | ||
| 77 | err_g_ip_clk_2: | ||
| 78 | clk_unprepare(pm->clock_gate); | ||
| 79 | err_p_ip_clk: | 62 | err_p_ip_clk: |
| 80 | clk_put(pm->clock_gate); | 63 | clk_put(pm->clock_gate); |
| 81 | err_g_ip_clk: | 64 | err_g_ip_clk: |
| @@ -86,8 +69,6 @@ void s5p_mfc_final_pm(struct s5p_mfc_dev *dev) | |||
| 86 | { | 69 | { |
| 87 | clk_unprepare(pm->clock_gate); | 70 | clk_unprepare(pm->clock_gate); |
| 88 | clk_put(pm->clock_gate); | 71 | clk_put(pm->clock_gate); |
| 89 | clk_unprepare(pm->clock); | ||
| 90 | clk_put(pm->clock); | ||
| 91 | #ifdef CONFIG_PM_RUNTIME | 72 | #ifdef CONFIG_PM_RUNTIME |
| 92 | pm_runtime_disable(pm->device); | 73 | pm_runtime_disable(pm->device); |
| 93 | #endif | 74 | #endif |
| @@ -98,7 +79,7 @@ int s5p_mfc_clock_on(void) | |||
| 98 | int ret; | 79 | int ret; |
| 99 | #ifdef CLK_DEBUG | 80 | #ifdef CLK_DEBUG |
| 100 | atomic_inc(&clk_ref); | 81 | atomic_inc(&clk_ref); |
| 101 | mfc_debug(3, "+ %d", atomic_read(&clk_ref)); | 82 | mfc_debug(3, "+ %d\n", atomic_read(&clk_ref)); |
| 102 | #endif | 83 | #endif |
| 103 | ret = clk_enable(pm->clock_gate); | 84 | ret = clk_enable(pm->clock_gate); |
| 104 | return ret; | 85 | return ret; |
| @@ -108,7 +89,7 @@ void s5p_mfc_clock_off(void) | |||
| 108 | { | 89 | { |
| 109 | #ifdef CLK_DEBUG | 90 | #ifdef CLK_DEBUG |
| 110 | atomic_dec(&clk_ref); | 91 | atomic_dec(&clk_ref); |
| 111 | mfc_debug(3, "- %d", atomic_read(&clk_ref)); | 92 | mfc_debug(3, "- %d\n", atomic_read(&clk_ref)); |
| 112 | #endif | 93 | #endif |
| 113 | clk_disable(pm->clock_gate); | 94 | clk_disable(pm->clock_gate); |
| 114 | } | 95 | } |
diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c index 0b32cc3f6a47..59a9deefb242 100644 --- a/drivers/media/platform/sh_veu.c +++ b/drivers/media/platform/sh_veu.c | |||
| @@ -905,11 +905,11 @@ static int sh_veu_queue_setup(struct vb2_queue *vq, | |||
| 905 | if (ftmp.fmt.pix.width != pix->width || | 905 | if (ftmp.fmt.pix.width != pix->width || |
| 906 | ftmp.fmt.pix.height != pix->height) | 906 | ftmp.fmt.pix.height != pix->height) |
| 907 | return -EINVAL; | 907 | return -EINVAL; |
| 908 | size = pix->bytesperline ? pix->bytesperline * pix->height : | 908 | size = pix->bytesperline ? pix->bytesperline * pix->height * fmt->depth / fmt->ydepth : |
| 909 | pix->width * pix->height * fmt->depth >> 3; | 909 | pix->width * pix->height * fmt->depth / fmt->ydepth; |
| 910 | } else { | 910 | } else { |
| 911 | vfmt = sh_veu_get_vfmt(veu, vq->type); | 911 | vfmt = sh_veu_get_vfmt(veu, vq->type); |
| 912 | size = vfmt->bytesperline * vfmt->frame.height; | 912 | size = vfmt->bytesperline * vfmt->frame.height * vfmt->fmt->depth / vfmt->fmt->ydepth; |
| 913 | } | 913 | } |
| 914 | 914 | ||
| 915 | if (count < 2) | 915 | if (count < 2) |
| @@ -1033,8 +1033,6 @@ static int sh_veu_release(struct file *file) | |||
| 1033 | 1033 | ||
| 1034 | dev_dbg(veu->dev, "Releasing instance %p\n", veu_file); | 1034 | dev_dbg(veu->dev, "Releasing instance %p\n", veu_file); |
| 1035 | 1035 | ||
| 1036 | pm_runtime_put(veu->dev); | ||
| 1037 | |||
| 1038 | if (veu_file == veu->capture) { | 1036 | if (veu_file == veu->capture) { |
| 1039 | veu->capture = NULL; | 1037 | veu->capture = NULL; |
| 1040 | vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE)); | 1038 | vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE)); |
| @@ -1050,6 +1048,8 @@ static int sh_veu_release(struct file *file) | |||
| 1050 | veu->m2m_ctx = NULL; | 1048 | veu->m2m_ctx = NULL; |
| 1051 | } | 1049 | } |
| 1052 | 1050 | ||
| 1051 | pm_runtime_put(veu->dev); | ||
| 1052 | |||
| 1053 | kfree(veu_file); | 1053 | kfree(veu_file); |
| 1054 | 1054 | ||
| 1055 | return 0; | 1055 | return 0; |
| @@ -1138,10 +1138,7 @@ static irqreturn_t sh_veu_isr(int irq, void *dev_id) | |||
| 1138 | 1138 | ||
| 1139 | veu->xaction++; | 1139 | veu->xaction++; |
| 1140 | 1140 | ||
| 1141 | if (!veu->aborting) | 1141 | return IRQ_WAKE_THREAD; |
| 1142 | return IRQ_WAKE_THREAD; | ||
| 1143 | |||
| 1144 | return IRQ_HANDLED; | ||
| 1145 | } | 1142 | } |
| 1146 | 1143 | ||
| 1147 | static int sh_veu_probe(struct platform_device *pdev) | 1144 | static int sh_veu_probe(struct platform_device *pdev) |
diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c index eea832c5fd01..3a4efbdc7668 100644 --- a/drivers/media/platform/soc_camera/soc_camera.c +++ b/drivers/media/platform/soc_camera/soc_camera.c | |||
| @@ -643,9 +643,9 @@ static int soc_camera_close(struct file *file) | |||
| 643 | 643 | ||
| 644 | if (ici->ops->init_videobuf2) | 644 | if (ici->ops->init_videobuf2) |
| 645 | vb2_queue_release(&icd->vb2_vidq); | 645 | vb2_queue_release(&icd->vb2_vidq); |
| 646 | ici->ops->remove(icd); | ||
| 647 | |||
| 648 | __soc_camera_power_off(icd); | 646 | __soc_camera_power_off(icd); |
| 647 | |||
| 648 | ici->ops->remove(icd); | ||
| 649 | } | 649 | } |
| 650 | 650 | ||
| 651 | if (icd->streamer == file) | 651 | if (icd->streamer == file) |
diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index c0beee2fa37c..d529ba788f41 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig | |||
| @@ -22,6 +22,7 @@ config RADIO_SI476X | |||
| 22 | tristate "Silicon Laboratories Si476x I2C FM Radio" | 22 | tristate "Silicon Laboratories Si476x I2C FM Radio" |
| 23 | depends on I2C && VIDEO_V4L2 | 23 | depends on I2C && VIDEO_V4L2 |
| 24 | depends on MFD_SI476X_CORE | 24 | depends on MFD_SI476X_CORE |
| 25 | depends on SND_SOC | ||
| 25 | select SND_SOC_SI476X | 26 | select SND_SOC_SI476X |
| 26 | ---help--- | 27 | ---help--- |
| 27 | Choose Y here if you have this FM radio chip. | 28 | Choose Y here if you have this FM radio chip. |
diff --git a/drivers/media/radio/radio-si476x.c b/drivers/media/radio/radio-si476x.c index 9430c6a29937..9dc8bafe6486 100644 --- a/drivers/media/radio/radio-si476x.c +++ b/drivers/media/radio/radio-si476x.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | 44 | ||
| 45 | #define FREQ_MUL (10000000 / 625) | 45 | #define FREQ_MUL (10000000 / 625) |
| 46 | 46 | ||
| 47 | #define SI476X_PHDIV_STATUS_LINK_LOCKED(status) (0b10000000 & (status)) | 47 | #define SI476X_PHDIV_STATUS_LINK_LOCKED(status) (0x80 & (status)) |
| 48 | 48 | ||
| 49 | #define DRIVER_NAME "si476x-radio" | 49 | #define DRIVER_NAME "si476x-radio" |
| 50 | #define DRIVER_CARD "SI476x AM/FM Receiver" | 50 | #define DRIVER_CARD "SI476x AM/FM Receiver" |
diff --git a/drivers/media/tuners/Kconfig b/drivers/media/tuners/Kconfig index f6768cad001a..15665debc572 100644 --- a/drivers/media/tuners/Kconfig +++ b/drivers/media/tuners/Kconfig | |||
| @@ -1,23 +1,3 @@ | |||
| 1 | config MEDIA_ATTACH | ||
| 2 | bool "Load and attach frontend and tuner driver modules as needed" | ||
| 3 | depends on MEDIA_ANALOG_TV_SUPPORT || MEDIA_DIGITAL_TV_SUPPORT || MEDIA_RADIO_SUPPORT | ||
| 4 | depends on MODULES | ||
| 5 | default y if !EXPERT | ||
| 6 | help | ||
| 7 | Remove the static dependency of DVB card drivers on all | ||
| 8 | frontend modules for all possible card variants. Instead, | ||
| 9 | allow the card drivers to only load the frontend modules | ||
| 10 | they require. | ||
| 11 | |||
| 12 | Also, tuner module will automatically load a tuner driver | ||
| 13 | when needed, for analog mode. | ||
| 14 | |||
| 15 | This saves several KBytes of memory. | ||
| 16 | |||
| 17 | Note: You will need module-init-tools v3.2 or later for this feature. | ||
| 18 | |||
| 19 | If unsure say Y. | ||
| 20 | |||
| 21 | # Analog TV tuners, auto-loaded via tuner.ko | 1 | # Analog TV tuners, auto-loaded via tuner.ko |
| 22 | config MEDIA_TUNER | 2 | config MEDIA_TUNER |
| 23 | tristate | 3 | tristate |
diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c index 22015fe1a0f3..2cc8ec70e3b6 100644 --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c | |||
| @@ -376,7 +376,7 @@ static int rtl2832u_read_config(struct dvb_usb_device *d) | |||
| 376 | struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf}; | 376 | struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf}; |
| 377 | struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf}; | 377 | struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf}; |
| 378 | struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf}; | 378 | struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf}; |
| 379 | struct rtl28xxu_req req_r820t = {0x0034, CMD_I2C_RD, 5, buf}; | 379 | struct rtl28xxu_req req_r820t = {0x0034, CMD_I2C_RD, 1, buf}; |
| 380 | 380 | ||
| 381 | dev_dbg(&d->udev->dev, "%s:\n", __func__); | 381 | dev_dbg(&d->udev->dev, "%s:\n", __func__); |
| 382 | 382 | ||
| @@ -481,9 +481,9 @@ static int rtl2832u_read_config(struct dvb_usb_device *d) | |||
| 481 | goto found; | 481 | goto found; |
| 482 | } | 482 | } |
| 483 | 483 | ||
| 484 | /* check R820T by reading tuner stats at I2C addr 0x1a */ | 484 | /* check R820T ID register; reg=00 val=69 */ |
| 485 | ret = rtl28xxu_ctrl_msg(d, &req_r820t); | 485 | ret = rtl28xxu_ctrl_msg(d, &req_r820t); |
| 486 | if (ret == 0) { | 486 | if (ret == 0 && buf[0] == 0x69) { |
| 487 | priv->tuner = TUNER_RTL2832_R820T; | 487 | priv->tuner = TUNER_RTL2832_R820T; |
| 488 | priv->tuner_name = "R820T"; | 488 | priv->tuner_name = "R820T"; |
| 489 | goto found; | 489 | goto found; |
diff --git a/drivers/media/usb/gspca/sonixb.c b/drivers/media/usb/gspca/sonixb.c index 3fe207e038c7..d7ff3b9687c5 100644 --- a/drivers/media/usb/gspca/sonixb.c +++ b/drivers/media/usb/gspca/sonixb.c | |||
| @@ -1159,6 +1159,13 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 1159 | regs[0x01] = 0x44; /* Select 24 Mhz clock */ | 1159 | regs[0x01] = 0x44; /* Select 24 Mhz clock */ |
| 1160 | regs[0x12] = 0x02; /* Set hstart to 2 */ | 1160 | regs[0x12] = 0x02; /* Set hstart to 2 */ |
| 1161 | } | 1161 | } |
| 1162 | break; | ||
| 1163 | case SENSOR_PAS202: | ||
| 1164 | /* For some unknown reason we need to increase hstart by 1 on | ||
| 1165 | the sn9c103, otherwise we get wrong colors (bayer shift). */ | ||
| 1166 | if (sd->bridge == BRIDGE_103) | ||
| 1167 | regs[0x12] += 1; | ||
| 1168 | break; | ||
| 1162 | } | 1169 | } |
| 1163 | /* Disable compression when the raw bayer format has been selected */ | 1170 | /* Disable compression when the raw bayer format has been selected */ |
| 1164 | if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) | 1171 | if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) |
diff --git a/drivers/media/usb/pwc/pwc.h b/drivers/media/usb/pwc/pwc.h index 7a6a0d39c2c6..81b017a554bc 100644 --- a/drivers/media/usb/pwc/pwc.h +++ b/drivers/media/usb/pwc/pwc.h | |||
| @@ -226,7 +226,7 @@ struct pwc_device | |||
| 226 | struct list_head queued_bufs; | 226 | struct list_head queued_bufs; |
| 227 | spinlock_t queued_bufs_lock; /* Protects queued_bufs */ | 227 | spinlock_t queued_bufs_lock; /* Protects queued_bufs */ |
| 228 | 228 | ||
| 229 | /* Note if taking both locks v4l2_lock must always be locked first! */ | 229 | /* If taking both locks vb_queue_lock must always be locked first! */ |
| 230 | struct mutex v4l2_lock; /* Protects everything else */ | 230 | struct mutex v4l2_lock; /* Protects everything else */ |
| 231 | struct mutex vb_queue_lock; /* Protects vb_queue and capt_file */ | 231 | struct mutex vb_queue_lock; /* Protects vb_queue and capt_file */ |
| 232 | 232 | ||
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index ebb8e48619a2..fccd08b66d1a 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c | |||
| @@ -1835,6 +1835,8 @@ bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl) | |||
| 1835 | { | 1835 | { |
| 1836 | if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_TX) | 1836 | if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_TX) |
| 1837 | return true; | 1837 | return true; |
| 1838 | if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_RX) | ||
| 1839 | return true; | ||
| 1838 | switch (ctrl->id) { | 1840 | switch (ctrl->id) { |
| 1839 | case V4L2_CID_AUDIO_MUTE: | 1841 | case V4L2_CID_AUDIO_MUTE: |
| 1840 | case V4L2_CID_AUDIO_VOLUME: | 1842 | case V4L2_CID_AUDIO_VOLUME: |
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index f81bda1a48ec..7658586fe5f4 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c | |||
| @@ -243,7 +243,6 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
| 243 | const struct v4l2_vbi_format *vbi; | 243 | const struct v4l2_vbi_format *vbi; |
| 244 | const struct v4l2_sliced_vbi_format *sliced; | 244 | const struct v4l2_sliced_vbi_format *sliced; |
| 245 | const struct v4l2_window *win; | 245 | const struct v4l2_window *win; |
| 246 | const struct v4l2_clip *clip; | ||
| 247 | unsigned i; | 246 | unsigned i; |
| 248 | 247 | ||
| 249 | pr_cont("type=%s", prt_names(p->type, v4l2_type_names)); | 248 | pr_cont("type=%s", prt_names(p->type, v4l2_type_names)); |
| @@ -253,7 +252,7 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
| 253 | pix = &p->fmt.pix; | 252 | pix = &p->fmt.pix; |
| 254 | pr_cont(", width=%u, height=%u, " | 253 | pr_cont(", width=%u, height=%u, " |
| 255 | "pixelformat=%c%c%c%c, field=%s, " | 254 | "pixelformat=%c%c%c%c, field=%s, " |
| 256 | "bytesperline=%u sizeimage=%u, colorspace=%d\n", | 255 | "bytesperline=%u, sizeimage=%u, colorspace=%d\n", |
| 257 | pix->width, pix->height, | 256 | pix->width, pix->height, |
| 258 | (pix->pixelformat & 0xff), | 257 | (pix->pixelformat & 0xff), |
| 259 | (pix->pixelformat >> 8) & 0xff, | 258 | (pix->pixelformat >> 8) & 0xff, |
| @@ -284,20 +283,14 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
| 284 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | 283 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: |
| 285 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: | 284 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: |
| 286 | win = &p->fmt.win; | 285 | win = &p->fmt.win; |
| 287 | pr_cont(", wxh=%dx%d, x,y=%d,%d, field=%s, " | 286 | /* Note: we can't print the clip list here since the clips |
| 288 | "chromakey=0x%08x, bitmap=%p, " | 287 | * pointer is a userspace pointer, not a kernelspace |
| 289 | "global_alpha=0x%02x\n", | 288 | * pointer. */ |
| 290 | win->w.width, win->w.height, | 289 | pr_cont(", wxh=%dx%d, x,y=%d,%d, field=%s, chromakey=0x%08x, clipcount=%u, clips=%p, bitmap=%p, global_alpha=0x%02x\n", |
| 291 | win->w.left, win->w.top, | 290 | win->w.width, win->w.height, win->w.left, win->w.top, |
| 292 | prt_names(win->field, v4l2_field_names), | 291 | prt_names(win->field, v4l2_field_names), |
| 293 | win->chromakey, win->bitmap, win->global_alpha); | 292 | win->chromakey, win->clipcount, win->clips, |
| 294 | clip = win->clips; | 293 | win->bitmap, win->global_alpha); |
| 295 | for (i = 0; i < win->clipcount; i++) { | ||
| 296 | printk(KERN_DEBUG "clip %u: wxh=%dx%d, x,y=%d,%d\n", | ||
| 297 | i, clip->c.width, clip->c.height, | ||
| 298 | clip->c.left, clip->c.top); | ||
| 299 | clip = clip->next; | ||
| 300 | } | ||
| 301 | break; | 294 | break; |
| 302 | case V4L2_BUF_TYPE_VBI_CAPTURE: | 295 | case V4L2_BUF_TYPE_VBI_CAPTURE: |
| 303 | case V4L2_BUF_TYPE_VBI_OUTPUT: | 296 | case V4L2_BUF_TYPE_VBI_OUTPUT: |
| @@ -332,7 +325,7 @@ static void v4l_print_framebuffer(const void *arg, bool write_only) | |||
| 332 | 325 | ||
| 333 | pr_cont("capability=0x%x, flags=0x%x, base=0x%p, width=%u, " | 326 | pr_cont("capability=0x%x, flags=0x%x, base=0x%p, width=%u, " |
| 334 | "height=%u, pixelformat=%c%c%c%c, " | 327 | "height=%u, pixelformat=%c%c%c%c, " |
| 335 | "bytesperline=%u sizeimage=%u, colorspace=%d\n", | 328 | "bytesperline=%u, sizeimage=%u, colorspace=%d\n", |
| 336 | p->capability, p->flags, p->base, | 329 | p->capability, p->flags, p->base, |
| 337 | p->fmt.width, p->fmt.height, | 330 | p->fmt.width, p->fmt.height, |
| 338 | (p->fmt.pixelformat & 0xff), | 331 | (p->fmt.pixelformat & 0xff), |
| @@ -353,7 +346,7 @@ static void v4l_print_modulator(const void *arg, bool write_only) | |||
| 353 | const struct v4l2_modulator *p = arg; | 346 | const struct v4l2_modulator *p = arg; |
| 354 | 347 | ||
| 355 | if (write_only) | 348 | if (write_only) |
| 356 | pr_cont("index=%u, txsubchans=0x%x", p->index, p->txsubchans); | 349 | pr_cont("index=%u, txsubchans=0x%x\n", p->index, p->txsubchans); |
| 357 | else | 350 | else |
| 358 | pr_cont("index=%u, name=%.*s, capability=0x%x, " | 351 | pr_cont("index=%u, name=%.*s, capability=0x%x, " |
| 359 | "rangelow=%u, rangehigh=%u, txsubchans=0x%x\n", | 352 | "rangelow=%u, rangehigh=%u, txsubchans=0x%x\n", |
| @@ -445,13 +438,13 @@ static void v4l_print_buffer(const void *arg, bool write_only) | |||
| 445 | for (i = 0; i < p->length; ++i) { | 438 | for (i = 0; i < p->length; ++i) { |
| 446 | plane = &p->m.planes[i]; | 439 | plane = &p->m.planes[i]; |
| 447 | printk(KERN_DEBUG | 440 | printk(KERN_DEBUG |
| 448 | "plane %d: bytesused=%d, data_offset=0x%08x " | 441 | "plane %d: bytesused=%d, data_offset=0x%08x, " |
| 449 | "offset/userptr=0x%lx, length=%d\n", | 442 | "offset/userptr=0x%lx, length=%d\n", |
| 450 | i, plane->bytesused, plane->data_offset, | 443 | i, plane->bytesused, plane->data_offset, |
| 451 | plane->m.userptr, plane->length); | 444 | plane->m.userptr, plane->length); |
| 452 | } | 445 | } |
| 453 | } else { | 446 | } else { |
| 454 | pr_cont("bytesused=%d, offset/userptr=0x%lx, length=%d\n", | 447 | pr_cont(", bytesused=%d, offset/userptr=0x%lx, length=%d\n", |
| 455 | p->bytesused, p->m.userptr, p->length); | 448 | p->bytesused, p->m.userptr, p->length); |
| 456 | } | 449 | } |
| 457 | 450 | ||
| @@ -504,6 +497,8 @@ static void v4l_print_streamparm(const void *arg, bool write_only) | |||
| 504 | c->capability, c->outputmode, | 497 | c->capability, c->outputmode, |
| 505 | c->timeperframe.numerator, c->timeperframe.denominator, | 498 | c->timeperframe.numerator, c->timeperframe.denominator, |
| 506 | c->extendedmode, c->writebuffers); | 499 | c->extendedmode, c->writebuffers); |
| 500 | } else { | ||
| 501 | pr_cont("\n"); | ||
| 507 | } | 502 | } |
| 508 | } | 503 | } |
| 509 | 504 | ||
| @@ -734,11 +729,11 @@ static void v4l_print_frmsizeenum(const void *arg, bool write_only) | |||
| 734 | p->type); | 729 | p->type); |
| 735 | switch (p->type) { | 730 | switch (p->type) { |
| 736 | case V4L2_FRMSIZE_TYPE_DISCRETE: | 731 | case V4L2_FRMSIZE_TYPE_DISCRETE: |
| 737 | pr_cont(" wxh=%ux%u\n", | 732 | pr_cont(", wxh=%ux%u\n", |
| 738 | p->discrete.width, p->discrete.height); | 733 | p->discrete.width, p->discrete.height); |
| 739 | break; | 734 | break; |
| 740 | case V4L2_FRMSIZE_TYPE_STEPWISE: | 735 | case V4L2_FRMSIZE_TYPE_STEPWISE: |
| 741 | pr_cont(" min=%ux%u, max=%ux%u, step=%ux%u\n", | 736 | pr_cont(", min=%ux%u, max=%ux%u, step=%ux%u\n", |
| 742 | p->stepwise.min_width, p->stepwise.min_height, | 737 | p->stepwise.min_width, p->stepwise.min_height, |
| 743 | p->stepwise.step_width, p->stepwise.step_height, | 738 | p->stepwise.step_width, p->stepwise.step_height, |
| 744 | p->stepwise.max_width, p->stepwise.max_height); | 739 | p->stepwise.max_width, p->stepwise.max_height); |
| @@ -764,12 +759,12 @@ static void v4l_print_frmivalenum(const void *arg, bool write_only) | |||
| 764 | p->width, p->height, p->type); | 759 | p->width, p->height, p->type); |
| 765 | switch (p->type) { | 760 | switch (p->type) { |
| 766 | case V4L2_FRMIVAL_TYPE_DISCRETE: | 761 | case V4L2_FRMIVAL_TYPE_DISCRETE: |
| 767 | pr_cont(" fps=%d/%d\n", | 762 | pr_cont(", fps=%d/%d\n", |
| 768 | p->discrete.numerator, | 763 | p->discrete.numerator, |
| 769 | p->discrete.denominator); | 764 | p->discrete.denominator); |
| 770 | break; | 765 | break; |
| 771 | case V4L2_FRMIVAL_TYPE_STEPWISE: | 766 | case V4L2_FRMIVAL_TYPE_STEPWISE: |
| 772 | pr_cont(" min=%d/%d, max=%d/%d, step=%d/%d\n", | 767 | pr_cont(", min=%d/%d, max=%d/%d, step=%d/%d\n", |
| 773 | p->stepwise.min.numerator, | 768 | p->stepwise.min.numerator, |
| 774 | p->stepwise.min.denominator, | 769 | p->stepwise.min.denominator, |
| 775 | p->stepwise.max.numerator, | 770 | p->stepwise.max.numerator, |
| @@ -807,8 +802,8 @@ static void v4l_print_event(const void *arg, bool write_only) | |||
| 807 | pr_cont("value64=%lld, ", c->value64); | 802 | pr_cont("value64=%lld, ", c->value64); |
| 808 | else | 803 | else |
| 809 | pr_cont("value=%d, ", c->value); | 804 | pr_cont("value=%d, ", c->value); |
| 810 | pr_cont("flags=0x%x, minimum=%d, maximum=%d, step=%d," | 805 | pr_cont("flags=0x%x, minimum=%d, maximum=%d, step=%d, " |
| 811 | " default_value=%d\n", | 806 | "default_value=%d\n", |
| 812 | c->flags, c->minimum, c->maximum, | 807 | c->flags, c->minimum, c->maximum, |
| 813 | c->step, c->default_value); | 808 | c->step, c->default_value); |
| 814 | break; | 809 | break; |
| @@ -845,7 +840,7 @@ static void v4l_print_freq_band(const void *arg, bool write_only) | |||
| 845 | const struct v4l2_frequency_band *p = arg; | 840 | const struct v4l2_frequency_band *p = arg; |
| 846 | 841 | ||
| 847 | pr_cont("tuner=%u, type=%u, index=%u, capability=0x%x, " | 842 | pr_cont("tuner=%u, type=%u, index=%u, capability=0x%x, " |
| 848 | "rangelow=%u, rangehigh=%u, modulation=0x%x\n", | 843 | "rangelow=%u, rangehigh=%u, modulation=0x%x\n", |
| 849 | p->tuner, p->type, p->index, | 844 | p->tuner, p->type, p->index, |
| 850 | p->capability, p->rangelow, | 845 | p->capability, p->rangelow, |
| 851 | p->rangehigh, p->modulation); | 846 | p->rangehigh, p->modulation); |
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c index 66f599fcb829..e96497f7c3ed 100644 --- a/drivers/media/v4l2-core/v4l2-mem2mem.c +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c | |||
| @@ -205,7 +205,7 @@ static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev) | |||
| 205 | static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) | 205 | static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) |
| 206 | { | 206 | { |
| 207 | struct v4l2_m2m_dev *m2m_dev; | 207 | struct v4l2_m2m_dev *m2m_dev; |
| 208 | unsigned long flags_job, flags; | 208 | unsigned long flags_job, flags_out, flags_cap; |
| 209 | 209 | ||
| 210 | m2m_dev = m2m_ctx->m2m_dev; | 210 | m2m_dev = m2m_ctx->m2m_dev; |
| 211 | dprintk("Trying to schedule a job for m2m_ctx: %p\n", m2m_ctx); | 211 | dprintk("Trying to schedule a job for m2m_ctx: %p\n", m2m_ctx); |
| @@ -223,23 +223,26 @@ static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) | |||
| 223 | return; | 223 | return; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 226 | spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out); |
| 227 | if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)) { | 227 | if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)) { |
| 228 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 228 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, |
| 229 | flags_out); | ||
| 229 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); | 230 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); |
| 230 | dprintk("No input buffers available\n"); | 231 | dprintk("No input buffers available\n"); |
| 231 | return; | 232 | return; |
| 232 | } | 233 | } |
| 233 | spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); | 234 | spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap); |
| 234 | if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)) { | 235 | if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)) { |
| 235 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); | 236 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, |
| 236 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 237 | flags_cap); |
| 238 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, | ||
| 239 | flags_out); | ||
| 237 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); | 240 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); |
| 238 | dprintk("No output buffers available\n"); | 241 | dprintk("No output buffers available\n"); |
| 239 | return; | 242 | return; |
| 240 | } | 243 | } |
| 241 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); | 244 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap); |
| 242 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 245 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out); |
| 243 | 246 | ||
| 244 | if (m2m_dev->m2m_ops->job_ready | 247 | if (m2m_dev->m2m_ops->job_ready |
| 245 | && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { | 248 | && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { |
| @@ -372,6 +375,20 @@ int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | |||
| 372 | EXPORT_SYMBOL_GPL(v4l2_m2m_dqbuf); | 375 | EXPORT_SYMBOL_GPL(v4l2_m2m_dqbuf); |
| 373 | 376 | ||
| 374 | /** | 377 | /** |
| 378 | * v4l2_m2m_create_bufs() - create a source or destination buffer, depending | ||
| 379 | * on the type | ||
| 380 | */ | ||
| 381 | int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | ||
| 382 | struct v4l2_create_buffers *create) | ||
| 383 | { | ||
| 384 | struct vb2_queue *vq; | ||
| 385 | |||
| 386 | vq = v4l2_m2m_get_vq(m2m_ctx, create->format.type); | ||
| 387 | return vb2_create_bufs(vq, create); | ||
| 388 | } | ||
| 389 | EXPORT_SYMBOL_GPL(v4l2_m2m_create_bufs); | ||
| 390 | |||
| 391 | /** | ||
| 375 | * v4l2_m2m_expbuf() - export a source or destination buffer, depending on | 392 | * v4l2_m2m_expbuf() - export a source or destination buffer, depending on |
| 376 | * the type | 393 | * the type |
| 377 | */ | 394 | */ |
| @@ -486,8 +503,10 @@ unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | |||
| 486 | if (m2m_ctx->m2m_dev->m2m_ops->unlock) | 503 | if (m2m_ctx->m2m_dev->m2m_ops->unlock) |
| 487 | m2m_ctx->m2m_dev->m2m_ops->unlock(m2m_ctx->priv); | 504 | m2m_ctx->m2m_dev->m2m_ops->unlock(m2m_ctx->priv); |
| 488 | 505 | ||
| 489 | poll_wait(file, &src_q->done_wq, wait); | 506 | if (list_empty(&src_q->done_list)) |
| 490 | poll_wait(file, &dst_q->done_wq, wait); | 507 | poll_wait(file, &src_q->done_wq, wait); |
| 508 | if (list_empty(&dst_q->done_list)) | ||
| 509 | poll_wait(file, &dst_q->done_wq, wait); | ||
| 491 | 510 | ||
| 492 | if (m2m_ctx->m2m_dev->m2m_ops->lock) | 511 | if (m2m_ctx->m2m_dev->m2m_ops->lock) |
| 493 | m2m_ctx->m2m_dev->m2m_ops->lock(m2m_ctx->priv); | 512 | m2m_ctx->m2m_dev->m2m_ops->lock(m2m_ctx->priv); |
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index 7d833eefaf4e..e3bdc3be91e1 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c | |||
| @@ -2014,7 +2014,8 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) | |||
| 2014 | if (list_empty(&q->queued_list)) | 2014 | if (list_empty(&q->queued_list)) |
| 2015 | return res | POLLERR; | 2015 | return res | POLLERR; |
| 2016 | 2016 | ||
| 2017 | poll_wait(file, &q->done_wq, wait); | 2017 | if (list_empty(&q->done_list)) |
| 2018 | poll_wait(file, &q->done_wq, wait); | ||
| 2018 | 2019 | ||
| 2019 | /* | 2020 | /* |
| 2020 | * Take first buffer available for dequeuing. | 2021 | * Take first buffer available for dequeuing. |
diff --git a/drivers/net/ethernet/brocade/bna/bnad_debugfs.c b/drivers/net/ethernet/brocade/bna/bnad_debugfs.c index 6e8bc9d88c41..94d957d203a6 100644 --- a/drivers/net/ethernet/brocade/bna/bnad_debugfs.c +++ b/drivers/net/ethernet/brocade/bna/bnad_debugfs.c | |||
| @@ -244,7 +244,7 @@ bnad_debugfs_lseek(struct file *file, loff_t offset, int orig) | |||
| 244 | file->f_pos += offset; | 244 | file->f_pos += offset; |
| 245 | break; | 245 | break; |
| 246 | case 2: | 246 | case 2: |
| 247 | file->f_pos = debug->buffer_len - offset; | 247 | file->f_pos = debug->buffer_len + offset; |
| 248 | break; | 248 | break; |
| 249 | default: | 249 | default: |
| 250 | return -EINVAL; | 250 | return -EINVAL; |
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 9544cdc0d1af..e79e006eb9ab 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
| @@ -811,6 +811,70 @@ int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) | |||
| 811 | return pcidev->irq; | 811 | return pcidev->irq; |
| 812 | } | 812 | } |
| 813 | 813 | ||
| 814 | static struct iosapic_info *first_isi = NULL; | ||
| 815 | |||
| 816 | #ifdef CONFIG_64BIT | ||
| 817 | int iosapic_serial_irq(int num) | ||
| 818 | { | ||
| 819 | struct iosapic_info *isi = first_isi; | ||
| 820 | struct irt_entry *irte = NULL; /* only used if PAT PDC */ | ||
| 821 | struct vector_info *vi; | ||
| 822 | int isi_line; /* line used by device */ | ||
| 823 | |||
| 824 | /* lookup IRT entry for isi/slot/pin set */ | ||
| 825 | irte = &irt_cell[num]; | ||
| 826 | |||
| 827 | DBG_IRT("iosapic_serial_irq(): irte %p %x %x %x %x %x %x %x %x\n", | ||
| 828 | irte, | ||
| 829 | irte->entry_type, | ||
| 830 | irte->entry_length, | ||
| 831 | irte->polarity_trigger, | ||
| 832 | irte->src_bus_irq_devno, | ||
| 833 | irte->src_bus_id, | ||
| 834 | irte->src_seg_id, | ||
| 835 | irte->dest_iosapic_intin, | ||
| 836 | (u32) irte->dest_iosapic_addr); | ||
| 837 | isi_line = irte->dest_iosapic_intin; | ||
| 838 | |||
| 839 | /* get vector info for this input line */ | ||
| 840 | vi = isi->isi_vector + isi_line; | ||
| 841 | DBG_IRT("iosapic_serial_irq: line %d vi 0x%p\n", isi_line, vi); | ||
| 842 | |||
| 843 | /* If this IRQ line has already been setup, skip it */ | ||
| 844 | if (vi->irte) | ||
| 845 | goto out; | ||
| 846 | |||
| 847 | vi->irte = irte; | ||
| 848 | |||
| 849 | /* | ||
| 850 | * Allocate processor IRQ | ||
| 851 | * | ||
| 852 | * XXX/FIXME The txn_alloc_irq() code and related code should be | ||
| 853 | * moved to enable_irq(). That way we only allocate processor IRQ | ||
| 854 | * bits for devices that actually have drivers claiming them. | ||
| 855 | * Right now we assign an IRQ to every PCI device present, | ||
| 856 | * regardless of whether it's used or not. | ||
| 857 | */ | ||
| 858 | vi->txn_irq = txn_alloc_irq(8); | ||
| 859 | |||
| 860 | if (vi->txn_irq < 0) | ||
| 861 | panic("I/O sapic: couldn't get TXN IRQ\n"); | ||
| 862 | |||
| 863 | /* enable_irq() will use txn_* to program IRdT */ | ||
| 864 | vi->txn_addr = txn_alloc_addr(vi->txn_irq); | ||
| 865 | vi->txn_data = txn_alloc_data(vi->txn_irq); | ||
| 866 | |||
| 867 | vi->eoi_addr = isi->addr + IOSAPIC_REG_EOI; | ||
| 868 | vi->eoi_data = cpu_to_le32(vi->txn_data); | ||
| 869 | |||
| 870 | cpu_claim_irq(vi->txn_irq, &iosapic_interrupt_type, vi); | ||
| 871 | |||
| 872 | out: | ||
| 873 | |||
| 874 | return vi->txn_irq; | ||
| 875 | } | ||
| 876 | #endif | ||
| 877 | |||
| 814 | 878 | ||
| 815 | /* | 879 | /* |
| 816 | ** squirrel away the I/O Sapic Version | 880 | ** squirrel away the I/O Sapic Version |
| @@ -877,6 +941,8 @@ void *iosapic_register(unsigned long hpa) | |||
| 877 | vip->irqline = (unsigned char) cnt; | 941 | vip->irqline = (unsigned char) cnt; |
| 878 | vip->iosapic = isi; | 942 | vip->iosapic = isi; |
| 879 | } | 943 | } |
| 944 | if (!first_isi) | ||
| 945 | first_isi = isi; | ||
| 880 | return isi; | 946 | return isi; |
| 881 | } | 947 | } |
| 882 | 948 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index 716aa93fff76..59df8575a48c 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -61,6 +61,7 @@ static DEFINE_MUTEX(bridge_mutex); | |||
| 61 | static void handle_hotplug_event_bridge (acpi_handle, u32, void *); | 61 | static void handle_hotplug_event_bridge (acpi_handle, u32, void *); |
| 62 | static void acpiphp_sanitize_bus(struct pci_bus *bus); | 62 | static void acpiphp_sanitize_bus(struct pci_bus *bus); |
| 63 | static void acpiphp_set_hpp_values(struct pci_bus *bus); | 63 | static void acpiphp_set_hpp_values(struct pci_bus *bus); |
| 64 | static void hotplug_event_func(acpi_handle handle, u32 type, void *context); | ||
| 64 | static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context); | 65 | static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context); |
| 65 | static void free_bridge(struct kref *kref); | 66 | static void free_bridge(struct kref *kref); |
| 66 | 67 | ||
| @@ -147,7 +148,7 @@ static int post_dock_fixups(struct notifier_block *nb, unsigned long val, | |||
| 147 | 148 | ||
| 148 | 149 | ||
| 149 | static const struct acpi_dock_ops acpiphp_dock_ops = { | 150 | static const struct acpi_dock_ops acpiphp_dock_ops = { |
| 150 | .handler = handle_hotplug_event_func, | 151 | .handler = hotplug_event_func, |
| 151 | }; | 152 | }; |
| 152 | 153 | ||
| 153 | /* Check whether the PCI device is managed by native PCIe hotplug driver */ | 154 | /* Check whether the PCI device is managed by native PCIe hotplug driver */ |
| @@ -179,6 +180,20 @@ static bool device_is_managed_by_native_pciehp(struct pci_dev *pdev) | |||
| 179 | return true; | 180 | return true; |
| 180 | } | 181 | } |
| 181 | 182 | ||
| 183 | static void acpiphp_dock_init(void *data) | ||
| 184 | { | ||
| 185 | struct acpiphp_func *func = data; | ||
| 186 | |||
| 187 | get_bridge(func->slot->bridge); | ||
| 188 | } | ||
| 189 | |||
| 190 | static void acpiphp_dock_release(void *data) | ||
| 191 | { | ||
| 192 | struct acpiphp_func *func = data; | ||
| 193 | |||
| 194 | put_bridge(func->slot->bridge); | ||
| 195 | } | ||
| 196 | |||
| 182 | /* callback routine to register each ACPI PCI slot object */ | 197 | /* callback routine to register each ACPI PCI slot object */ |
| 183 | static acpi_status | 198 | static acpi_status |
| 184 | register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | 199 | register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) |
| @@ -298,7 +313,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
| 298 | */ | 313 | */ |
| 299 | newfunc->flags &= ~FUNC_HAS_EJ0; | 314 | newfunc->flags &= ~FUNC_HAS_EJ0; |
| 300 | if (register_hotplug_dock_device(handle, | 315 | if (register_hotplug_dock_device(handle, |
| 301 | &acpiphp_dock_ops, newfunc)) | 316 | &acpiphp_dock_ops, newfunc, |
| 317 | acpiphp_dock_init, acpiphp_dock_release)) | ||
| 302 | dbg("failed to register dock device\n"); | 318 | dbg("failed to register dock device\n"); |
| 303 | 319 | ||
| 304 | /* we need to be notified when dock events happen | 320 | /* we need to be notified when dock events happen |
| @@ -670,6 +686,7 @@ static int __ref enable_device(struct acpiphp_slot *slot) | |||
| 670 | struct pci_bus *bus = slot->bridge->pci_bus; | 686 | struct pci_bus *bus = slot->bridge->pci_bus; |
| 671 | struct acpiphp_func *func; | 687 | struct acpiphp_func *func; |
| 672 | int num, max, pass; | 688 | int num, max, pass; |
| 689 | LIST_HEAD(add_list); | ||
| 673 | 690 | ||
| 674 | if (slot->flags & SLOT_ENABLED) | 691 | if (slot->flags & SLOT_ENABLED) |
| 675 | goto err_exit; | 692 | goto err_exit; |
| @@ -694,13 +711,15 @@ static int __ref enable_device(struct acpiphp_slot *slot) | |||
| 694 | max = pci_scan_bridge(bus, dev, max, pass); | 711 | max = pci_scan_bridge(bus, dev, max, pass); |
| 695 | if (pass && dev->subordinate) { | 712 | if (pass && dev->subordinate) { |
| 696 | check_hotplug_bridge(slot, dev); | 713 | check_hotplug_bridge(slot, dev); |
| 697 | pci_bus_size_bridges(dev->subordinate); | 714 | pcibios_resource_survey_bus(dev->subordinate); |
| 715 | __pci_bus_size_bridges(dev->subordinate, | ||
| 716 | &add_list); | ||
| 698 | } | 717 | } |
| 699 | } | 718 | } |
| 700 | } | 719 | } |
| 701 | } | 720 | } |
| 702 | 721 | ||
| 703 | pci_bus_assign_resources(bus); | 722 | __pci_bus_assign_resources(bus, &add_list, NULL); |
| 704 | acpiphp_sanitize_bus(bus); | 723 | acpiphp_sanitize_bus(bus); |
| 705 | acpiphp_set_hpp_values(bus); | 724 | acpiphp_set_hpp_values(bus); |
| 706 | acpiphp_set_acpi_region(slot); | 725 | acpiphp_set_acpi_region(slot); |
| @@ -1065,22 +1084,12 @@ static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, | |||
| 1065 | alloc_acpi_hp_work(handle, type, context, _handle_hotplug_event_bridge); | 1084 | alloc_acpi_hp_work(handle, type, context, _handle_hotplug_event_bridge); |
| 1066 | } | 1085 | } |
| 1067 | 1086 | ||
| 1068 | static void _handle_hotplug_event_func(struct work_struct *work) | 1087 | static void hotplug_event_func(acpi_handle handle, u32 type, void *context) |
| 1069 | { | 1088 | { |
| 1070 | struct acpiphp_func *func; | 1089 | struct acpiphp_func *func = context; |
| 1071 | char objname[64]; | 1090 | char objname[64]; |
| 1072 | struct acpi_buffer buffer = { .length = sizeof(objname), | 1091 | struct acpi_buffer buffer = { .length = sizeof(objname), |
| 1073 | .pointer = objname }; | 1092 | .pointer = objname }; |
| 1074 | struct acpi_hp_work *hp_work; | ||
| 1075 | acpi_handle handle; | ||
| 1076 | u32 type; | ||
| 1077 | |||
| 1078 | hp_work = container_of(work, struct acpi_hp_work, work); | ||
| 1079 | handle = hp_work->handle; | ||
| 1080 | type = hp_work->type; | ||
| 1081 | func = (struct acpiphp_func *)hp_work->context; | ||
| 1082 | |||
| 1083 | acpi_scan_lock_acquire(); | ||
| 1084 | 1093 | ||
| 1085 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); | 1094 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); |
| 1086 | 1095 | ||
| @@ -1113,6 +1122,18 @@ static void _handle_hotplug_event_func(struct work_struct *work) | |||
| 1113 | warn("notify_handler: unknown event type 0x%x for %s\n", type, objname); | 1122 | warn("notify_handler: unknown event type 0x%x for %s\n", type, objname); |
| 1114 | break; | 1123 | break; |
| 1115 | } | 1124 | } |
| 1125 | } | ||
| 1126 | |||
| 1127 | static void _handle_hotplug_event_func(struct work_struct *work) | ||
| 1128 | { | ||
| 1129 | struct acpi_hp_work *hp_work; | ||
| 1130 | struct acpiphp_func *func; | ||
| 1131 | |||
| 1132 | hp_work = container_of(work, struct acpi_hp_work, work); | ||
| 1133 | func = hp_work->context; | ||
| 1134 | acpi_scan_lock_acquire(); | ||
| 1135 | |||
| 1136 | hotplug_event_func(hp_work->handle, hp_work->type, func); | ||
| 1116 | 1137 | ||
| 1117 | acpi_scan_lock_release(); | 1138 | acpi_scan_lock_release(); |
| 1118 | kfree(hp_work); /* allocated in handle_hotplug_event_func */ | 1139 | kfree(hp_work); /* allocated in handle_hotplug_event_func */ |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 68678ed76b0d..d1182c4a754e 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
| @@ -202,6 +202,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 202 | struct resource *res, unsigned int reg); | 202 | struct resource *res, unsigned int reg); |
| 203 | int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type); | 203 | int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type); |
| 204 | void pci_configure_ari(struct pci_dev *dev); | 204 | void pci_configure_ari(struct pci_dev *dev); |
| 205 | void __ref __pci_bus_size_bridges(struct pci_bus *bus, | ||
| 206 | struct list_head *realloc_head); | ||
| 207 | void __ref __pci_bus_assign_resources(const struct pci_bus *bus, | ||
| 208 | struct list_head *realloc_head, | ||
| 209 | struct list_head *fail_head); | ||
| 205 | 210 | ||
| 206 | /** | 211 | /** |
| 207 | * pci_ari_enabled - query ARI forwarding status | 212 | * pci_ari_enabled - query ARI forwarding status |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 16abaaa1f83c..d254e2379533 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
| @@ -1044,7 +1044,7 @@ handle_done: | |||
| 1044 | ; | 1044 | ; |
| 1045 | } | 1045 | } |
| 1046 | 1046 | ||
| 1047 | static void __ref __pci_bus_size_bridges(struct pci_bus *bus, | 1047 | void __ref __pci_bus_size_bridges(struct pci_bus *bus, |
| 1048 | struct list_head *realloc_head) | 1048 | struct list_head *realloc_head) |
| 1049 | { | 1049 | { |
| 1050 | struct pci_dev *dev; | 1050 | struct pci_dev *dev; |
| @@ -1115,9 +1115,9 @@ void __ref pci_bus_size_bridges(struct pci_bus *bus) | |||
| 1115 | } | 1115 | } |
| 1116 | EXPORT_SYMBOL(pci_bus_size_bridges); | 1116 | EXPORT_SYMBOL(pci_bus_size_bridges); |
| 1117 | 1117 | ||
| 1118 | static void __ref __pci_bus_assign_resources(const struct pci_bus *bus, | 1118 | void __ref __pci_bus_assign_resources(const struct pci_bus *bus, |
| 1119 | struct list_head *realloc_head, | 1119 | struct list_head *realloc_head, |
| 1120 | struct list_head *fail_head) | 1120 | struct list_head *fail_head) |
| 1121 | { | 1121 | { |
| 1122 | struct pci_bus *b; | 1122 | struct pci_bus *b; |
| 1123 | struct pci_dev *dev; | 1123 | struct pci_dev *dev; |
diff --git a/drivers/scsi/bfa/bfad_debugfs.c b/drivers/scsi/bfa/bfad_debugfs.c index 439c012be763..b63d534192e3 100644 --- a/drivers/scsi/bfa/bfad_debugfs.c +++ b/drivers/scsi/bfa/bfad_debugfs.c | |||
| @@ -186,7 +186,7 @@ bfad_debugfs_lseek(struct file *file, loff_t offset, int orig) | |||
| 186 | file->f_pos += offset; | 186 | file->f_pos += offset; |
| 187 | break; | 187 | break; |
| 188 | case 2: | 188 | case 2: |
| 189 | file->f_pos = debug->buffer_len - offset; | 189 | file->f_pos = debug->buffer_len + offset; |
| 190 | break; | 190 | break; |
| 191 | default: | 191 | default: |
| 192 | return -EINVAL; | 192 | return -EINVAL; |
diff --git a/drivers/scsi/fnic/fnic_debugfs.c b/drivers/scsi/fnic/fnic_debugfs.c index adc1f7f471f5..85e1ffd0e5c5 100644 --- a/drivers/scsi/fnic/fnic_debugfs.c +++ b/drivers/scsi/fnic/fnic_debugfs.c | |||
| @@ -174,7 +174,7 @@ static loff_t fnic_trace_debugfs_lseek(struct file *file, | |||
| 174 | pos = file->f_pos + offset; | 174 | pos = file->f_pos + offset; |
| 175 | break; | 175 | break; |
| 176 | case 2: | 176 | case 2: |
| 177 | pos = fnic_dbg_prt->buffer_len - offset; | 177 | pos = fnic_dbg_prt->buffer_len + offset; |
| 178 | } | 178 | } |
| 179 | return (pos < 0 || pos > fnic_dbg_prt->buffer_len) ? | 179 | return (pos < 0 || pos > fnic_dbg_prt->buffer_len) ? |
| 180 | -EINVAL : (file->f_pos = pos); | 180 | -EINVAL : (file->f_pos = pos); |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index f63f5ff7f274..f525ecb7a9c6 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
| @@ -1178,7 +1178,7 @@ lpfc_debugfs_lseek(struct file *file, loff_t off, int whence) | |||
| 1178 | pos = file->f_pos + off; | 1178 | pos = file->f_pos + off; |
| 1179 | break; | 1179 | break; |
| 1180 | case 2: | 1180 | case 2: |
| 1181 | pos = debug->len - off; | 1181 | pos = debug->len + off; |
| 1182 | } | 1182 | } |
| 1183 | return (pos < 0 || pos > debug->len) ? -EINVAL : (file->f_pos = pos); | 1183 | return (pos < 0 || pos > debug->len) ? -EINVAL : (file->f_pos = pos); |
| 1184 | } | 1184 | } |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index 7a3870f385f6..66b0b26a1381 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
| @@ -688,8 +688,12 @@ static int tcm_qla2xxx_queue_status(struct se_cmd *se_cmd) | |||
| 688 | * For FCP_READ with CHECK_CONDITION status, clear cmd->bufflen | 688 | * For FCP_READ with CHECK_CONDITION status, clear cmd->bufflen |
| 689 | * for qla_tgt_xmit_response LLD code | 689 | * for qla_tgt_xmit_response LLD code |
| 690 | */ | 690 | */ |
| 691 | if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) { | ||
| 692 | se_cmd->se_cmd_flags &= ~SCF_OVERFLOW_BIT; | ||
| 693 | se_cmd->residual_count = 0; | ||
| 694 | } | ||
| 691 | se_cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; | 695 | se_cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; |
| 692 | se_cmd->residual_count = se_cmd->data_length; | 696 | se_cmd->residual_count += se_cmd->data_length; |
| 693 | 697 | ||
| 694 | cmd->bufflen = 0; | 698 | cmd->bufflen = 0; |
| 695 | } | 699 | } |
diff --git a/drivers/staging/media/davinci_vpfe/Kconfig b/drivers/staging/media/davinci_vpfe/Kconfig index 2e4a28b018e8..12f321dd2399 100644 --- a/drivers/staging/media/davinci_vpfe/Kconfig +++ b/drivers/staging/media/davinci_vpfe/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config VIDEO_DM365_VPFE | 1 | config VIDEO_DM365_VPFE |
| 2 | tristate "DM365 VPFE Media Controller Capture Driver" | 2 | tristate "DM365 VPFE Media Controller Capture Driver" |
| 3 | depends on VIDEO_V4L2 && ARCH_DAVINCI_DM365 && !VIDEO_VPFE_CAPTURE | 3 | depends on VIDEO_V4L2 && ARCH_DAVINCI_DM365 && !VIDEO_DM365_ISIF |
| 4 | select VIDEOBUF2_DMA_CONTIG | 4 | select VIDEOBUF2_DMA_CONTIG |
| 5 | help | 5 | help |
| 6 | Support for DM365 VPFE based Media Controller Capture driver. | 6 | Support for DM365 VPFE based Media Controller Capture driver. |
diff --git a/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c b/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c index b88e1ddce229..d8ce20d2fbda 100644 --- a/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c +++ b/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c | |||
| @@ -639,7 +639,8 @@ static int vpfe_probe(struct platform_device *pdev) | |||
| 639 | if (ret) | 639 | if (ret) |
| 640 | goto probe_free_dev_mem; | 640 | goto probe_free_dev_mem; |
| 641 | 641 | ||
| 642 | if (vpfe_initialize_modules(vpfe_dev, pdev)) | 642 | ret = vpfe_initialize_modules(vpfe_dev, pdev); |
| 643 | if (ret) | ||
| 643 | goto probe_disable_clock; | 644 | goto probe_disable_clock; |
| 644 | 645 | ||
| 645 | vpfe_dev->media_dev.dev = vpfe_dev->pdev; | 646 | vpfe_dev->media_dev.dev = vpfe_dev->pdev; |
| @@ -663,7 +664,8 @@ static int vpfe_probe(struct platform_device *pdev) | |||
| 663 | /* set the driver data in platform device */ | 664 | /* set the driver data in platform device */ |
| 664 | platform_set_drvdata(pdev, vpfe_dev); | 665 | platform_set_drvdata(pdev, vpfe_dev); |
| 665 | /* register subdevs/entities */ | 666 | /* register subdevs/entities */ |
| 666 | if (vpfe_register_entities(vpfe_dev)) | 667 | ret = vpfe_register_entities(vpfe_dev); |
| 668 | if (ret) | ||
| 667 | goto probe_out_v4l2_unregister; | 669 | goto probe_out_v4l2_unregister; |
| 668 | 670 | ||
| 669 | ret = vpfe_attach_irq(vpfe_dev); | 671 | ret = vpfe_attach_irq(vpfe_dev); |
diff --git a/drivers/staging/media/solo6x10/Kconfig b/drivers/staging/media/solo6x10/Kconfig index df6569b997b8..34f3b6d02d2a 100644 --- a/drivers/staging/media/solo6x10/Kconfig +++ b/drivers/staging/media/solo6x10/Kconfig | |||
| @@ -5,6 +5,7 @@ config SOLO6X10 | |||
| 5 | select VIDEOBUF2_DMA_SG | 5 | select VIDEOBUF2_DMA_SG |
| 6 | select VIDEOBUF2_DMA_CONTIG | 6 | select VIDEOBUF2_DMA_CONTIG |
| 7 | select SND_PCM | 7 | select SND_PCM |
| 8 | select FONT_8x16 | ||
| 8 | ---help--- | 9 | ---help--- |
| 9 | This driver supports the Softlogic based MPEG-4 and h.264 codec | 10 | This driver supports the Softlogic based MPEG-4 and h.264 codec |
| 10 | cards. | 11 | cards. |
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index 13e9e715ad2e..8d8b3ff68490 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c | |||
| @@ -155,7 +155,7 @@ static ssize_t lio_target_np_store_iser( | |||
| 155 | struct iscsi_tpg_np *tpg_np_iser = NULL; | 155 | struct iscsi_tpg_np *tpg_np_iser = NULL; |
| 156 | char *endptr; | 156 | char *endptr; |
| 157 | u32 op; | 157 | u32 op; |
| 158 | int rc; | 158 | int rc = 0; |
| 159 | 159 | ||
| 160 | op = simple_strtoul(page, &endptr, 0); | 160 | op = simple_strtoul(page, &endptr, 0); |
| 161 | if ((op != 1) && (op != 0)) { | 161 | if ((op != 1) && (op != 0)) { |
| @@ -174,31 +174,32 @@ static ssize_t lio_target_np_store_iser( | |||
| 174 | return -EINVAL; | 174 | return -EINVAL; |
| 175 | 175 | ||
| 176 | if (op) { | 176 | if (op) { |
| 177 | int rc = request_module("ib_isert"); | 177 | rc = request_module("ib_isert"); |
| 178 | if (rc != 0) | 178 | if (rc != 0) { |
| 179 | pr_warn("Unable to request_module for ib_isert\n"); | 179 | pr_warn("Unable to request_module for ib_isert\n"); |
| 180 | rc = 0; | ||
| 181 | } | ||
| 180 | 182 | ||
| 181 | tpg_np_iser = iscsit_tpg_add_network_portal(tpg, &np->np_sockaddr, | 183 | tpg_np_iser = iscsit_tpg_add_network_portal(tpg, &np->np_sockaddr, |
| 182 | np->np_ip, tpg_np, ISCSI_INFINIBAND); | 184 | np->np_ip, tpg_np, ISCSI_INFINIBAND); |
| 183 | if (!tpg_np_iser || IS_ERR(tpg_np_iser)) | 185 | if (IS_ERR(tpg_np_iser)) { |
| 186 | rc = PTR_ERR(tpg_np_iser); | ||
| 184 | goto out; | 187 | goto out; |
| 188 | } | ||
| 185 | } else { | 189 | } else { |
| 186 | tpg_np_iser = iscsit_tpg_locate_child_np(tpg_np, ISCSI_INFINIBAND); | 190 | tpg_np_iser = iscsit_tpg_locate_child_np(tpg_np, ISCSI_INFINIBAND); |
| 187 | if (!tpg_np_iser) | 191 | if (tpg_np_iser) { |
| 188 | goto out; | 192 | rc = iscsit_tpg_del_network_portal(tpg, tpg_np_iser); |
| 189 | 193 | if (rc < 0) | |
| 190 | rc = iscsit_tpg_del_network_portal(tpg, tpg_np_iser); | 194 | goto out; |
| 191 | if (rc < 0) | 195 | } |
| 192 | goto out; | ||
| 193 | } | 196 | } |
| 194 | 197 | ||
| 195 | printk("lio_target_np_store_iser() done, op: %d\n", op); | ||
| 196 | |||
| 197 | iscsit_put_tpg(tpg); | 198 | iscsit_put_tpg(tpg); |
| 198 | return count; | 199 | return count; |
| 199 | out: | 200 | out: |
| 200 | iscsit_put_tpg(tpg); | 201 | iscsit_put_tpg(tpg); |
| 201 | return -EINVAL; | 202 | return rc; |
| 202 | } | 203 | } |
| 203 | 204 | ||
| 204 | TF_NP_BASE_ATTR(lio_target, iser, S_IRUGO | S_IWUSR); | 205 | TF_NP_BASE_ATTR(lio_target, iser, S_IRUGO | S_IWUSR); |
diff --git a/drivers/target/iscsi/iscsi_target_erl0.c b/drivers/target/iscsi/iscsi_target_erl0.c index 8e6298cc8839..dcb199da06b9 100644 --- a/drivers/target/iscsi/iscsi_target_erl0.c +++ b/drivers/target/iscsi/iscsi_target_erl0.c | |||
| @@ -842,11 +842,11 @@ int iscsit_stop_time2retain_timer(struct iscsi_session *sess) | |||
| 842 | return 0; | 842 | return 0; |
| 843 | 843 | ||
| 844 | sess->time2retain_timer_flags |= ISCSI_TF_STOP; | 844 | sess->time2retain_timer_flags |= ISCSI_TF_STOP; |
| 845 | spin_unlock_bh(&se_tpg->session_lock); | 845 | spin_unlock(&se_tpg->session_lock); |
| 846 | 846 | ||
| 847 | del_timer_sync(&sess->time2retain_timer); | 847 | del_timer_sync(&sess->time2retain_timer); |
| 848 | 848 | ||
| 849 | spin_lock_bh(&se_tpg->session_lock); | 849 | spin_lock(&se_tpg->session_lock); |
| 850 | sess->time2retain_timer_flags &= ~ISCSI_TF_RUNNING; | 850 | sess->time2retain_timer_flags &= ~ISCSI_TF_RUNNING; |
| 851 | pr_debug("Stopped Time2Retain Timer for SID: %u\n", | 851 | pr_debug("Stopped Time2Retain Timer for SID: %u\n", |
| 852 | sess->sid); | 852 | sess->sid); |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index bb5d5c5bce65..3402241be87c 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
| @@ -984,8 +984,6 @@ int iscsi_target_setup_login_socket( | |||
| 984 | } | 984 | } |
| 985 | 985 | ||
| 986 | np->np_transport = t; | 986 | np->np_transport = t; |
| 987 | printk("Set np->np_transport to %p -> %s\n", np->np_transport, | ||
| 988 | np->np_transport->name); | ||
| 989 | return 0; | 987 | return 0; |
| 990 | } | 988 | } |
| 991 | 989 | ||
| @@ -1002,7 +1000,6 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn) | |||
| 1002 | 1000 | ||
| 1003 | conn->sock = new_sock; | 1001 | conn->sock = new_sock; |
| 1004 | conn->login_family = np->np_sockaddr.ss_family; | 1002 | conn->login_family = np->np_sockaddr.ss_family; |
| 1005 | printk("iSCSI/TCP: Setup conn->sock from new_sock: %p\n", new_sock); | ||
| 1006 | 1003 | ||
| 1007 | if (np->np_sockaddr.ss_family == AF_INET6) { | 1004 | if (np->np_sockaddr.ss_family == AF_INET6) { |
| 1008 | memset(&sock_in6, 0, sizeof(struct sockaddr_in6)); | 1005 | memset(&sock_in6, 0, sizeof(struct sockaddr_in6)); |
diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c index 7ad912060e21..cd5018ff9cd7 100644 --- a/drivers/target/iscsi/iscsi_target_nego.c +++ b/drivers/target/iscsi/iscsi_target_nego.c | |||
| @@ -721,9 +721,6 @@ int iscsi_target_locate_portal( | |||
| 721 | 721 | ||
| 722 | start += strlen(key) + strlen(value) + 2; | 722 | start += strlen(key) + strlen(value) + 2; |
| 723 | } | 723 | } |
| 724 | |||
| 725 | printk("i_buf: %s, s_buf: %s, t_buf: %s\n", i_buf, s_buf, t_buf); | ||
| 726 | |||
| 727 | /* | 724 | /* |
| 728 | * See 5.3. Login Phase. | 725 | * See 5.3. Login Phase. |
| 729 | */ | 726 | */ |
diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c index 59bfaecc4e14..abfd99089781 100644 --- a/drivers/tty/pty.c +++ b/drivers/tty/pty.c | |||
| @@ -244,14 +244,9 @@ static void pty_flush_buffer(struct tty_struct *tty) | |||
| 244 | 244 | ||
| 245 | static int pty_open(struct tty_struct *tty, struct file *filp) | 245 | static int pty_open(struct tty_struct *tty, struct file *filp) |
| 246 | { | 246 | { |
| 247 | int retval = -ENODEV; | ||
| 248 | |||
| 249 | if (!tty || !tty->link) | 247 | if (!tty || !tty->link) |
| 250 | goto out; | 248 | return -ENODEV; |
| 251 | |||
| 252 | set_bit(TTY_IO_ERROR, &tty->flags); | ||
| 253 | 249 | ||
| 254 | retval = -EIO; | ||
| 255 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) | 250 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) |
| 256 | goto out; | 251 | goto out; |
| 257 | if (test_bit(TTY_PTY_LOCK, &tty->link->flags)) | 252 | if (test_bit(TTY_PTY_LOCK, &tty->link->flags)) |
| @@ -262,9 +257,11 @@ static int pty_open(struct tty_struct *tty, struct file *filp) | |||
| 262 | clear_bit(TTY_IO_ERROR, &tty->flags); | 257 | clear_bit(TTY_IO_ERROR, &tty->flags); |
| 263 | clear_bit(TTY_OTHER_CLOSED, &tty->link->flags); | 258 | clear_bit(TTY_OTHER_CLOSED, &tty->link->flags); |
| 264 | set_bit(TTY_THROTTLED, &tty->flags); | 259 | set_bit(TTY_THROTTLED, &tty->flags); |
| 265 | retval = 0; | 260 | return 0; |
| 261 | |||
| 266 | out: | 262 | out: |
| 267 | return retval; | 263 | set_bit(TTY_IO_ERROR, &tty->flags); |
| 264 | return -EIO; | ||
| 268 | } | 265 | } |
| 269 | 266 | ||
| 270 | static void pty_set_termios(struct tty_struct *tty, | 267 | static void pty_set_termios(struct tty_struct *tty, |
diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c index 097dff9c08ad..bb91b4713ebd 100644 --- a/drivers/tty/serial/8250/8250_gsc.c +++ b/drivers/tty/serial/8250/8250_gsc.c | |||
| @@ -30,6 +30,12 @@ static int __init serial_init_chip(struct parisc_device *dev) | |||
| 30 | unsigned long address; | 30 | unsigned long address; |
| 31 | int err; | 31 | int err; |
| 32 | 32 | ||
| 33 | #ifdef CONFIG_64BIT | ||
| 34 | extern int iosapic_serial_irq(int cellnum); | ||
| 35 | if (!dev->irq && (dev->id.sversion == 0xad)) | ||
| 36 | dev->irq = iosapic_serial_irq(dev->mod_index-1); | ||
| 37 | #endif | ||
| 38 | |||
| 33 | if (!dev->irq) { | 39 | if (!dev->irq) { |
| 34 | /* We find some unattached serial ports by walking native | 40 | /* We find some unattached serial ports by walking native |
| 35 | * busses. These should be silently ignored. Otherwise, | 41 | * busses. These should be silently ignored. Otherwise, |
| @@ -51,7 +57,8 @@ static int __init serial_init_chip(struct parisc_device *dev) | |||
| 51 | memset(&uart, 0, sizeof(uart)); | 57 | memset(&uart, 0, sizeof(uart)); |
| 52 | uart.port.iotype = UPIO_MEM; | 58 | uart.port.iotype = UPIO_MEM; |
| 53 | /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */ | 59 | /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */ |
| 54 | uart.port.uartclk = 7272727; | 60 | uart.port.uartclk = (dev->id.sversion != 0xad) ? |
| 61 | 7272727 : 1843200; | ||
| 55 | uart.port.mapbase = address; | 62 | uart.port.mapbase = address; |
| 56 | uart.port.membase = ioremap_nocache(address, 16); | 63 | uart.port.membase = ioremap_nocache(address, 16); |
| 57 | uart.port.irq = dev->irq; | 64 | uart.port.irq = dev->irq; |
| @@ -73,6 +80,7 @@ static struct parisc_device_id serial_tbl[] = { | |||
| 73 | { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00075 }, | 80 | { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00075 }, |
| 74 | { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008c }, | 81 | { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008c }, |
| 75 | { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008d }, | 82 | { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008d }, |
| 83 | { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x000ad }, | ||
| 76 | { 0 } | 84 | { 0 } |
| 77 | }; | 85 | }; |
| 78 | 86 | ||
diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c index fc2c06c66e89..2bd78e2ac8ec 100644 --- a/drivers/tty/vt/vt_ioctl.c +++ b/drivers/tty/vt/vt_ioctl.c | |||
| @@ -289,13 +289,10 @@ static int vt_disallocate(unsigned int vc_num) | |||
| 289 | struct vc_data *vc = NULL; | 289 | struct vc_data *vc = NULL; |
| 290 | int ret = 0; | 290 | int ret = 0; |
| 291 | 291 | ||
| 292 | if (!vc_num) | ||
| 293 | return 0; | ||
| 294 | |||
| 295 | console_lock(); | 292 | console_lock(); |
| 296 | if (VT_BUSY(vc_num)) | 293 | if (VT_BUSY(vc_num)) |
| 297 | ret = -EBUSY; | 294 | ret = -EBUSY; |
| 298 | else | 295 | else if (vc_num) |
| 299 | vc = vc_deallocate(vc_num); | 296 | vc = vc_deallocate(vc_num); |
| 300 | console_unlock(); | 297 | console_unlock(); |
| 301 | 298 | ||
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 7ef3eb8617a6..2311b1e4e43c 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig | |||
| @@ -4,11 +4,17 @@ | |||
| 4 | menuconfig USB_PHY | 4 | menuconfig USB_PHY |
| 5 | bool "USB Physical Layer drivers" | 5 | bool "USB Physical Layer drivers" |
| 6 | help | 6 | help |
| 7 | USB controllers (those which are host, device or DRD) need a | 7 | Most USB controllers have the physical layer signalling part |
| 8 | device to handle the physical layer signalling, commonly called | 8 | (commonly called a PHY) built in. However, dual-role devices |
| 9 | a PHY. | 9 | (a.k.a. USB on-the-go) which support being USB master or slave |
| 10 | with the same connector often use an external PHY. | ||
| 10 | 11 | ||
| 11 | The following drivers add support for such PHY devices. | 12 | The drivers in this submenu add support for such PHY devices. |
| 13 | They are not needed for standard master-only (or the vast | ||
| 14 | majority of slave-only) USB interfaces. | ||
| 15 | |||
| 16 | If you're not sure if this applies to you, it probably doesn't; | ||
| 17 | say N here. | ||
| 12 | 18 | ||
| 13 | if USB_PHY | 19 | if USB_PHY |
| 14 | 20 | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index c92c5ed4e580..e581c2549a57 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
| @@ -172,7 +172,8 @@ static struct usb_device_id ti_id_table_3410[15+TI_EXTRA_VID_PID_COUNT+1] = { | |||
| 172 | { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, | 172 | { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, |
| 173 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, | 173 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, |
| 174 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, | 174 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, |
| 175 | { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) }, | 175 | { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STEREO_PLUG_ID) }, |
| 176 | { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) }, | ||
| 176 | { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) }, | 177 | { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) }, |
| 177 | }; | 178 | }; |
| 178 | 179 | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h index b353e7e3d480..4a2423e84d55 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.h +++ b/drivers/usb/serial/ti_usb_3410_5052.h | |||
| @@ -52,7 +52,9 @@ | |||
| 52 | 52 | ||
| 53 | /* Abbott Diabetics vendor and product ids */ | 53 | /* Abbott Diabetics vendor and product ids */ |
| 54 | #define ABBOTT_VENDOR_ID 0x1a61 | 54 | #define ABBOTT_VENDOR_ID 0x1a61 |
| 55 | #define ABBOTT_PRODUCT_ID 0x3410 | 55 | #define ABBOTT_STEREO_PLUG_ID 0x3410 |
| 56 | #define ABBOTT_PRODUCT_ID ABBOTT_STEREO_PLUG_ID | ||
| 57 | #define ABBOTT_STRIP_PORT_ID 0x3420 | ||
| 56 | 58 | ||
| 57 | /* Commands */ | 59 | /* Commands */ |
| 58 | #define TI_GET_VERSION 0x01 | 60 | #define TI_GET_VERSION 0x01 |
diff --git a/fs/internal.h b/fs/internal.h index eaa75f75b625..68121584ae37 100644 --- a/fs/internal.h +++ b/fs/internal.h | |||
| @@ -132,6 +132,12 @@ extern struct dentry *__d_alloc(struct super_block *, const struct qstr *); | |||
| 132 | extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *); | 132 | extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *); |
| 133 | 133 | ||
| 134 | /* | 134 | /* |
| 135 | * splice.c | ||
| 136 | */ | ||
| 137 | extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | ||
| 138 | loff_t *opos, size_t len, unsigned int flags); | ||
| 139 | |||
| 140 | /* | ||
| 135 | * pipe.c | 141 | * pipe.c |
| 136 | */ | 142 | */ |
| 137 | extern const struct file_operations pipefifo_fops; | 143 | extern const struct file_operations pipefifo_fops; |
diff --git a/fs/read_write.c b/fs/read_write.c index 03430008704e..2cefa417be34 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
| @@ -1064,6 +1064,7 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, | |||
| 1064 | struct fd in, out; | 1064 | struct fd in, out; |
| 1065 | struct inode *in_inode, *out_inode; | 1065 | struct inode *in_inode, *out_inode; |
| 1066 | loff_t pos; | 1066 | loff_t pos; |
| 1067 | loff_t out_pos; | ||
| 1067 | ssize_t retval; | 1068 | ssize_t retval; |
| 1068 | int fl; | 1069 | int fl; |
| 1069 | 1070 | ||
| @@ -1077,12 +1078,14 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, | |||
| 1077 | if (!(in.file->f_mode & FMODE_READ)) | 1078 | if (!(in.file->f_mode & FMODE_READ)) |
| 1078 | goto fput_in; | 1079 | goto fput_in; |
| 1079 | retval = -ESPIPE; | 1080 | retval = -ESPIPE; |
| 1080 | if (!ppos) | 1081 | if (!ppos) { |
| 1081 | ppos = &in.file->f_pos; | 1082 | pos = in.file->f_pos; |
| 1082 | else | 1083 | } else { |
| 1084 | pos = *ppos; | ||
| 1083 | if (!(in.file->f_mode & FMODE_PREAD)) | 1085 | if (!(in.file->f_mode & FMODE_PREAD)) |
| 1084 | goto fput_in; | 1086 | goto fput_in; |
| 1085 | retval = rw_verify_area(READ, in.file, ppos, count); | 1087 | } |
| 1088 | retval = rw_verify_area(READ, in.file, &pos, count); | ||
| 1086 | if (retval < 0) | 1089 | if (retval < 0) |
| 1087 | goto fput_in; | 1090 | goto fput_in; |
| 1088 | count = retval; | 1091 | count = retval; |
| @@ -1099,7 +1102,8 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, | |||
| 1099 | retval = -EINVAL; | 1102 | retval = -EINVAL; |
| 1100 | in_inode = file_inode(in.file); | 1103 | in_inode = file_inode(in.file); |
| 1101 | out_inode = file_inode(out.file); | 1104 | out_inode = file_inode(out.file); |
| 1102 | retval = rw_verify_area(WRITE, out.file, &out.file->f_pos, count); | 1105 | out_pos = out.file->f_pos; |
| 1106 | retval = rw_verify_area(WRITE, out.file, &out_pos, count); | ||
| 1103 | if (retval < 0) | 1107 | if (retval < 0) |
| 1104 | goto fput_out; | 1108 | goto fput_out; |
| 1105 | count = retval; | 1109 | count = retval; |
| @@ -1107,7 +1111,6 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, | |||
| 1107 | if (!max) | 1111 | if (!max) |
| 1108 | max = min(in_inode->i_sb->s_maxbytes, out_inode->i_sb->s_maxbytes); | 1112 | max = min(in_inode->i_sb->s_maxbytes, out_inode->i_sb->s_maxbytes); |
| 1109 | 1113 | ||
| 1110 | pos = *ppos; | ||
| 1111 | if (unlikely(pos + count > max)) { | 1114 | if (unlikely(pos + count > max)) { |
| 1112 | retval = -EOVERFLOW; | 1115 | retval = -EOVERFLOW; |
| 1113 | if (pos >= max) | 1116 | if (pos >= max) |
| @@ -1126,18 +1129,23 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, | |||
| 1126 | if (in.file->f_flags & O_NONBLOCK) | 1129 | if (in.file->f_flags & O_NONBLOCK) |
| 1127 | fl = SPLICE_F_NONBLOCK; | 1130 | fl = SPLICE_F_NONBLOCK; |
| 1128 | #endif | 1131 | #endif |
| 1129 | retval = do_splice_direct(in.file, ppos, out.file, count, fl); | 1132 | retval = do_splice_direct(in.file, &pos, out.file, &out_pos, count, fl); |
| 1130 | 1133 | ||
| 1131 | if (retval > 0) { | 1134 | if (retval > 0) { |
| 1132 | add_rchar(current, retval); | 1135 | add_rchar(current, retval); |
| 1133 | add_wchar(current, retval); | 1136 | add_wchar(current, retval); |
| 1134 | fsnotify_access(in.file); | 1137 | fsnotify_access(in.file); |
| 1135 | fsnotify_modify(out.file); | 1138 | fsnotify_modify(out.file); |
| 1139 | out.file->f_pos = out_pos; | ||
| 1140 | if (ppos) | ||
| 1141 | *ppos = pos; | ||
| 1142 | else | ||
| 1143 | in.file->f_pos = pos; | ||
| 1136 | } | 1144 | } |
| 1137 | 1145 | ||
| 1138 | inc_syscr(current); | 1146 | inc_syscr(current); |
| 1139 | inc_syscw(current); | 1147 | inc_syscw(current); |
| 1140 | if (*ppos > max) | 1148 | if (pos > max) |
| 1141 | retval = -EOVERFLOW; | 1149 | retval = -EOVERFLOW; |
| 1142 | 1150 | ||
| 1143 | fput_out: | 1151 | fput_out: |
diff --git a/fs/splice.c b/fs/splice.c index e6b25598c8c4..9eca476227d5 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
| @@ -1274,7 +1274,7 @@ static int direct_splice_actor(struct pipe_inode_info *pipe, | |||
| 1274 | { | 1274 | { |
| 1275 | struct file *file = sd->u.file; | 1275 | struct file *file = sd->u.file; |
| 1276 | 1276 | ||
| 1277 | return do_splice_from(pipe, file, &file->f_pos, sd->total_len, | 1277 | return do_splice_from(pipe, file, sd->opos, sd->total_len, |
| 1278 | sd->flags); | 1278 | sd->flags); |
| 1279 | } | 1279 | } |
| 1280 | 1280 | ||
| @@ -1294,7 +1294,7 @@ static int direct_splice_actor(struct pipe_inode_info *pipe, | |||
| 1294 | * | 1294 | * |
| 1295 | */ | 1295 | */ |
| 1296 | long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | 1296 | long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, |
| 1297 | size_t len, unsigned int flags) | 1297 | loff_t *opos, size_t len, unsigned int flags) |
| 1298 | { | 1298 | { |
| 1299 | struct splice_desc sd = { | 1299 | struct splice_desc sd = { |
| 1300 | .len = len, | 1300 | .len = len, |
| @@ -1302,6 +1302,7 @@ long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | |||
| 1302 | .flags = flags, | 1302 | .flags = flags, |
| 1303 | .pos = *ppos, | 1303 | .pos = *ppos, |
| 1304 | .u.file = out, | 1304 | .u.file = out, |
| 1305 | .opos = opos, | ||
| 1305 | }; | 1306 | }; |
| 1306 | long ret; | 1307 | long ret; |
| 1307 | 1308 | ||
| @@ -1325,7 +1326,7 @@ static long do_splice(struct file *in, loff_t __user *off_in, | |||
| 1325 | { | 1326 | { |
| 1326 | struct pipe_inode_info *ipipe; | 1327 | struct pipe_inode_info *ipipe; |
| 1327 | struct pipe_inode_info *opipe; | 1328 | struct pipe_inode_info *opipe; |
| 1328 | loff_t offset, *off; | 1329 | loff_t offset; |
| 1329 | long ret; | 1330 | long ret; |
| 1330 | 1331 | ||
| 1331 | ipipe = get_pipe_info(in); | 1332 | ipipe = get_pipe_info(in); |
| @@ -1356,13 +1357,15 @@ static long do_splice(struct file *in, loff_t __user *off_in, | |||
| 1356 | return -EINVAL; | 1357 | return -EINVAL; |
| 1357 | if (copy_from_user(&offset, off_out, sizeof(loff_t))) | 1358 | if (copy_from_user(&offset, off_out, sizeof(loff_t))) |
| 1358 | return -EFAULT; | 1359 | return -EFAULT; |
| 1359 | off = &offset; | 1360 | } else { |
| 1360 | } else | 1361 | offset = out->f_pos; |
| 1361 | off = &out->f_pos; | 1362 | } |
| 1362 | 1363 | ||
| 1363 | ret = do_splice_from(ipipe, out, off, len, flags); | 1364 | ret = do_splice_from(ipipe, out, &offset, len, flags); |
| 1364 | 1365 | ||
| 1365 | if (off_out && copy_to_user(off_out, off, sizeof(loff_t))) | 1366 | if (!off_out) |
| 1367 | out->f_pos = offset; | ||
| 1368 | else if (copy_to_user(off_out, &offset, sizeof(loff_t))) | ||
| 1366 | ret = -EFAULT; | 1369 | ret = -EFAULT; |
| 1367 | 1370 | ||
| 1368 | return ret; | 1371 | return ret; |
| @@ -1376,13 +1379,15 @@ static long do_splice(struct file *in, loff_t __user *off_in, | |||
| 1376 | return -EINVAL; | 1379 | return -EINVAL; |
| 1377 | if (copy_from_user(&offset, off_in, sizeof(loff_t))) | 1380 | if (copy_from_user(&offset, off_in, sizeof(loff_t))) |
| 1378 | return -EFAULT; | 1381 | return -EFAULT; |
| 1379 | off = &offset; | 1382 | } else { |
| 1380 | } else | 1383 | offset = in->f_pos; |
| 1381 | off = &in->f_pos; | 1384 | } |
| 1382 | 1385 | ||
| 1383 | ret = do_splice_to(in, off, opipe, len, flags); | 1386 | ret = do_splice_to(in, &offset, opipe, len, flags); |
| 1384 | 1387 | ||
| 1385 | if (off_in && copy_to_user(off_in, off, sizeof(loff_t))) | 1388 | if (!off_in) |
| 1389 | in->f_pos = offset; | ||
| 1390 | else if (copy_to_user(off_in, &offset, sizeof(loff_t))) | ||
| 1386 | ret = -EFAULT; | 1391 | ret = -EFAULT; |
| 1387 | 1392 | ||
| 1388 | return ret; | 1393 | return ret; |
diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h index 14ceff788c40..1c16f821434f 100644 --- a/include/acpi/acconfig.h +++ b/include/acpi/acconfig.h | |||
| @@ -219,8 +219,8 @@ | |||
| 219 | * | 219 | * |
| 220 | *****************************************************************************/ | 220 | *****************************************************************************/ |
| 221 | 221 | ||
| 222 | #define ACPI_DEBUGGER_MAX_ARGS 8 /* Must be max method args + 1 */ | 222 | #define ACPI_DEBUGGER_MAX_ARGS ACPI_METHOD_NUM_ARGS + 4 /* Max command line arguments */ |
| 223 | #define ACPI_DB_LINE_BUFFER_SIZE 512 | 223 | #define ACPI_DB_LINE_BUFFER_SIZE 512 |
| 224 | 224 | ||
| 225 | #define ACPI_DEBUGGER_COMMAND_PROMPT '-' | 225 | #define ACPI_DEBUGGER_COMMAND_PROMPT '-' |
| 226 | #define ACPI_DEBUGGER_EXECUTE_PROMPT '%' | 226 | #define ACPI_DEBUGGER_EXECUTE_PROMPT '%' |
diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h index 4f52ea795c7a..4607b027a657 100644 --- a/include/acpi/acoutput.h +++ b/include/acpi/acoutput.h | |||
| @@ -428,27 +428,21 @@ | |||
| 428 | * This is the non-debug case -- make everything go away, | 428 | * This is the non-debug case -- make everything go away, |
| 429 | * leaving no executable debug code! | 429 | * leaving no executable debug code! |
| 430 | */ | 430 | */ |
| 431 | #define ACPI_FUNCTION_NAME(a) | ||
| 432 | #define ACPI_DEBUG_PRINT(pl) | 431 | #define ACPI_DEBUG_PRINT(pl) |
| 433 | #define ACPI_DEBUG_PRINT_RAW(pl) | 432 | #define ACPI_DEBUG_PRINT_RAW(pl) |
| 434 | #define ACPI_DEBUG_EXEC(a) | 433 | #define ACPI_DEBUG_EXEC(a) |
| 435 | #define ACPI_DEBUG_ONLY_MEMBERS(a) | 434 | #define ACPI_DEBUG_ONLY_MEMBERS(a) |
| 435 | #define ACPI_FUNCTION_NAME(a) | ||
| 436 | #define ACPI_FUNCTION_TRACE(a) | 436 | #define ACPI_FUNCTION_TRACE(a) |
| 437 | #define ACPI_FUNCTION_TRACE_PTR(a, b) | 437 | #define ACPI_FUNCTION_TRACE_PTR(a, b) |
| 438 | #define ACPI_FUNCTION_TRACE_U32(a, b) | 438 | #define ACPI_FUNCTION_TRACE_U32(a, b) |
| 439 | #define ACPI_FUNCTION_TRACE_STR(a, b) | 439 | #define ACPI_FUNCTION_TRACE_STR(a, b) |
| 440 | #define ACPI_FUNCTION_EXIT | ||
| 441 | #define ACPI_FUNCTION_STATUS_EXIT(s) | ||
| 442 | #define ACPI_FUNCTION_VALUE_EXIT(s) | ||
| 443 | #define ACPI_FUNCTION_ENTRY() | 440 | #define ACPI_FUNCTION_ENTRY() |
| 444 | #define ACPI_DUMP_STACK_ENTRY(a) | 441 | #define ACPI_DUMP_STACK_ENTRY(a) |
| 445 | #define ACPI_DUMP_OPERANDS(a, b, c) | 442 | #define ACPI_DUMP_OPERANDS(a, b, c) |
| 446 | #define ACPI_DUMP_ENTRY(a, b) | 443 | #define ACPI_DUMP_ENTRY(a, b) |
| 447 | #define ACPI_DUMP_TABLES(a, b) | ||
| 448 | #define ACPI_DUMP_PATHNAME(a, b, c, d) | 444 | #define ACPI_DUMP_PATHNAME(a, b, c, d) |
| 449 | #define ACPI_DUMP_BUFFER(a, b) | 445 | #define ACPI_DUMP_BUFFER(a, b) |
| 450 | #define ACPI_DEBUG_PRINT(pl) | ||
| 451 | #define ACPI_DEBUG_PRINT_RAW(pl) | ||
| 452 | #define ACPI_IS_DEBUG_ENABLED(level, component) 0 | 446 | #define ACPI_IS_DEBUG_ENABLED(level, component) 0 |
| 453 | 447 | ||
| 454 | /* Return macros must have a return statement at the minimum */ | 448 | /* Return macros must have a return statement at the minimum */ |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index c3dc203a90f4..cac0dfb2a082 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
| @@ -63,13 +63,6 @@ acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld | |||
| 63 | #define ACPI_BUS_FILE_ROOT "acpi" | 63 | #define ACPI_BUS_FILE_ROOT "acpi" |
| 64 | extern struct proc_dir_entry *acpi_root_dir; | 64 | extern struct proc_dir_entry *acpi_root_dir; |
| 65 | 65 | ||
| 66 | enum acpi_bus_removal_type { | ||
| 67 | ACPI_BUS_REMOVAL_NORMAL = 0, | ||
| 68 | ACPI_BUS_REMOVAL_EJECT, | ||
| 69 | ACPI_BUS_REMOVAL_SUPRISE, | ||
| 70 | ACPI_BUS_REMOVAL_TYPE_COUNT | ||
| 71 | }; | ||
| 72 | |||
| 73 | enum acpi_bus_device_type { | 66 | enum acpi_bus_device_type { |
| 74 | ACPI_BUS_TYPE_DEVICE = 0, | 67 | ACPI_BUS_TYPE_DEVICE = 0, |
| 75 | ACPI_BUS_TYPE_POWER, | 68 | ACPI_BUS_TYPE_POWER, |
| @@ -286,6 +279,7 @@ struct acpi_device_physical_node { | |||
| 286 | u8 node_id; | 279 | u8 node_id; |
| 287 | struct list_head node; | 280 | struct list_head node; |
| 288 | struct device *dev; | 281 | struct device *dev; |
| 282 | bool put_online:1; | ||
| 289 | }; | 283 | }; |
| 290 | 284 | ||
| 291 | /* set maximum of physical nodes to 32 for expansibility */ | 285 | /* set maximum of physical nodes to 32 for expansibility */ |
| @@ -310,7 +304,6 @@ struct acpi_device { | |||
| 310 | struct acpi_driver *driver; | 304 | struct acpi_driver *driver; |
| 311 | void *driver_data; | 305 | void *driver_data; |
| 312 | struct device dev; | 306 | struct device dev; |
| 313 | enum acpi_bus_removal_type removal_type; /* indicate for different removal type */ | ||
| 314 | u8 physical_node_count; | 307 | u8 physical_node_count; |
| 315 | struct list_head physical_node_list; | 308 | struct list_head physical_node_list; |
| 316 | struct mutex physical_node_lock; | 309 | struct mutex physical_node_lock; |
| @@ -382,6 +375,7 @@ const char *acpi_power_state_string(int state); | |||
| 382 | int acpi_device_get_power(struct acpi_device *device, int *state); | 375 | int acpi_device_get_power(struct acpi_device *device, int *state); |
| 383 | int acpi_device_set_power(struct acpi_device *device, int state); | 376 | int acpi_device_set_power(struct acpi_device *device, int state); |
| 384 | int acpi_bus_init_power(struct acpi_device *device); | 377 | int acpi_bus_init_power(struct acpi_device *device); |
| 378 | int acpi_device_fix_up_power(struct acpi_device *device); | ||
| 385 | int acpi_bus_update_power(acpi_handle handle, int *state_p); | 379 | int acpi_bus_update_power(acpi_handle handle, int *state_p); |
| 386 | bool acpi_bus_power_manageable(acpi_handle handle); | 380 | bool acpi_bus_power_manageable(acpi_handle handle); |
| 387 | 381 | ||
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h index e6168a24b9f0..b420939f5eb5 100644 --- a/include/acpi/acpi_drivers.h +++ b/include/acpi/acpi_drivers.h | |||
| @@ -123,7 +123,9 @@ extern int register_dock_notifier(struct notifier_block *nb); | |||
| 123 | extern void unregister_dock_notifier(struct notifier_block *nb); | 123 | extern void unregister_dock_notifier(struct notifier_block *nb); |
| 124 | extern int register_hotplug_dock_device(acpi_handle handle, | 124 | extern int register_hotplug_dock_device(acpi_handle handle, |
| 125 | const struct acpi_dock_ops *ops, | 125 | const struct acpi_dock_ops *ops, |
| 126 | void *context); | 126 | void *context, |
| 127 | void (*init)(void *), | ||
| 128 | void (*release)(void *)); | ||
| 127 | extern void unregister_hotplug_dock_device(acpi_handle handle); | 129 | extern void unregister_hotplug_dock_device(acpi_handle handle); |
| 128 | #else | 130 | #else |
| 129 | static inline int is_dock_device(acpi_handle handle) | 131 | static inline int is_dock_device(acpi_handle handle) |
| @@ -139,7 +141,9 @@ static inline void unregister_dock_notifier(struct notifier_block *nb) | |||
| 139 | } | 141 | } |
| 140 | static inline int register_hotplug_dock_device(acpi_handle handle, | 142 | static inline int register_hotplug_dock_device(acpi_handle handle, |
| 141 | const struct acpi_dock_ops *ops, | 143 | const struct acpi_dock_ops *ops, |
| 142 | void *context) | 144 | void *context, |
| 145 | void (*init)(void *), | ||
| 146 | void (*release)(void *)) | ||
| 143 | { | 147 | { |
| 144 | return -ENODEV; | 148 | return -ENODEV; |
| 145 | } | 149 | } |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 454881e6450a..1b09300810e6 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | 46 | ||
| 47 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 47 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
| 48 | 48 | ||
| 49 | #define ACPI_CA_VERSION 0x20130328 | 49 | #define ACPI_CA_VERSION 0x20130517 |
| 50 | 50 | ||
| 51 | #include <acpi/acconfig.h> | 51 | #include <acpi/acconfig.h> |
| 52 | #include <acpi/actypes.h> | 52 | #include <acpi/actypes.h> |
| @@ -80,6 +80,7 @@ extern bool acpi_gbl_enable_aml_debug_object; | |||
| 80 | extern u8 acpi_gbl_copy_dsdt_locally; | 80 | extern u8 acpi_gbl_copy_dsdt_locally; |
| 81 | extern u8 acpi_gbl_truncate_io_addresses; | 81 | extern u8 acpi_gbl_truncate_io_addresses; |
| 82 | extern u8 acpi_gbl_disable_auto_repair; | 82 | extern u8 acpi_gbl_disable_auto_repair; |
| 83 | extern u8 acpi_gbl_disable_ssdt_table_load; | ||
| 83 | 84 | ||
| 84 | /* | 85 | /* |
| 85 | * Hardware-reduced prototypes. All interfaces that use these macros will | 86 | * Hardware-reduced prototypes. All interfaces that use these macros will |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index ea69367fdd3b..66096d06925e 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
| @@ -6,6 +6,10 @@ | |||
| 6 | #include <linux/thermal.h> | 6 | #include <linux/thermal.h> |
| 7 | #include <asm/acpi.h> | 7 | #include <asm/acpi.h> |
| 8 | 8 | ||
| 9 | #define ACPI_PROCESSOR_CLASS "processor" | ||
| 10 | #define ACPI_PROCESSOR_DEVICE_NAME "Processor" | ||
| 11 | #define ACPI_PROCESSOR_DEVICE_HID "ACPI0007" | ||
| 12 | |||
| 9 | #define ACPI_PROCESSOR_BUSY_METRIC 10 | 13 | #define ACPI_PROCESSOR_BUSY_METRIC 10 |
| 10 | 14 | ||
| 11 | #define ACPI_PROCESSOR_MAX_POWER 8 | 15 | #define ACPI_PROCESSOR_MAX_POWER 8 |
| @@ -207,6 +211,7 @@ struct acpi_processor { | |||
| 207 | struct acpi_processor_throttling throttling; | 211 | struct acpi_processor_throttling throttling; |
| 208 | struct acpi_processor_limit limit; | 212 | struct acpi_processor_limit limit; |
| 209 | struct thermal_cooling_device *cdev; | 213 | struct thermal_cooling_device *cdev; |
| 214 | struct device *dev; /* Processor device. */ | ||
| 210 | }; | 215 | }; |
| 211 | 216 | ||
| 212 | struct acpi_processor_errata { | 217 | struct acpi_processor_errata { |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 17b5b5967641..353ba256f368 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
| @@ -352,8 +352,7 @@ extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, | |||
| 352 | 352 | ||
| 353 | /* Enable _OST when all relevant hotplug operations are enabled */ | 353 | /* Enable _OST when all relevant hotplug operations are enabled */ |
| 354 | #if defined(CONFIG_ACPI_HOTPLUG_CPU) && \ | 354 | #if defined(CONFIG_ACPI_HOTPLUG_CPU) && \ |
| 355 | (defined(CONFIG_ACPI_HOTPLUG_MEMORY) || \ | 355 | defined(CONFIG_ACPI_HOTPLUG_MEMORY) && \ |
| 356 | defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)) && \ | ||
| 357 | defined(CONFIG_ACPI_CONTAINER) | 356 | defined(CONFIG_ACPI_CONTAINER) |
| 358 | #define ACPI_HOTPLUG_OST | 357 | #define ACPI_HOTPLUG_OST |
| 359 | #endif | 358 | #endif |
diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h index 365f4a61bf04..fc09d7b0dacf 100644 --- a/include/linux/context_tracking.h +++ b/include/linux/context_tracking.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/sched.h> | 4 | #include <linux/sched.h> |
| 5 | #include <linux/percpu.h> | 5 | #include <linux/percpu.h> |
| 6 | #include <linux/vtime.h> | ||
| 6 | #include <asm/ptrace.h> | 7 | #include <asm/ptrace.h> |
| 7 | 8 | ||
| 8 | struct context_tracking { | 9 | struct context_tracking { |
| @@ -19,6 +20,26 @@ struct context_tracking { | |||
| 19 | } state; | 20 | } state; |
| 20 | }; | 21 | }; |
| 21 | 22 | ||
| 23 | static inline void __guest_enter(void) | ||
| 24 | { | ||
| 25 | /* | ||
| 26 | * This is running in ioctl context so we can avoid | ||
| 27 | * the call to vtime_account() with its unnecessary idle check. | ||
| 28 | */ | ||
| 29 | vtime_account_system(current); | ||
| 30 | current->flags |= PF_VCPU; | ||
| 31 | } | ||
| 32 | |||
| 33 | static inline void __guest_exit(void) | ||
| 34 | { | ||
| 35 | /* | ||
| 36 | * This is running in ioctl context so we can avoid | ||
| 37 | * the call to vtime_account() with its unnecessary idle check. | ||
| 38 | */ | ||
| 39 | vtime_account_system(current); | ||
| 40 | current->flags &= ~PF_VCPU; | ||
| 41 | } | ||
| 42 | |||
| 22 | #ifdef CONFIG_CONTEXT_TRACKING | 43 | #ifdef CONFIG_CONTEXT_TRACKING |
| 23 | DECLARE_PER_CPU(struct context_tracking, context_tracking); | 44 | DECLARE_PER_CPU(struct context_tracking, context_tracking); |
| 24 | 45 | ||
| @@ -35,6 +56,9 @@ static inline bool context_tracking_active(void) | |||
| 35 | extern void user_enter(void); | 56 | extern void user_enter(void); |
| 36 | extern void user_exit(void); | 57 | extern void user_exit(void); |
| 37 | 58 | ||
| 59 | extern void guest_enter(void); | ||
| 60 | extern void guest_exit(void); | ||
| 61 | |||
| 38 | static inline enum ctx_state exception_enter(void) | 62 | static inline enum ctx_state exception_enter(void) |
| 39 | { | 63 | { |
| 40 | enum ctx_state prev_ctx; | 64 | enum ctx_state prev_ctx; |
| @@ -57,6 +81,17 @@ extern void context_tracking_task_switch(struct task_struct *prev, | |||
| 57 | static inline bool context_tracking_in_user(void) { return false; } | 81 | static inline bool context_tracking_in_user(void) { return false; } |
| 58 | static inline void user_enter(void) { } | 82 | static inline void user_enter(void) { } |
| 59 | static inline void user_exit(void) { } | 83 | static inline void user_exit(void) { } |
| 84 | |||
| 85 | static inline void guest_enter(void) | ||
| 86 | { | ||
| 87 | __guest_enter(); | ||
| 88 | } | ||
| 89 | |||
| 90 | static inline void guest_exit(void) | ||
| 91 | { | ||
| 92 | __guest_exit(); | ||
| 93 | } | ||
| 94 | |||
| 60 | static inline enum ctx_state exception_enter(void) { return 0; } | 95 | static inline enum ctx_state exception_enter(void) { return 0; } |
| 61 | static inline void exception_exit(enum ctx_state prev_ctx) { } | 96 | static inline void exception_exit(enum ctx_state prev_ctx) { } |
| 62 | static inline void context_tracking_task_switch(struct task_struct *prev, | 97 | static inline void context_tracking_task_switch(struct task_struct *prev, |
diff --git a/include/linux/device.h b/include/linux/device.h index c0a126125325..eeb33315514c 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -71,6 +71,10 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *); | |||
| 71 | * the specific driver's probe to initial the matched device. | 71 | * the specific driver's probe to initial the matched device. |
| 72 | * @remove: Called when a device removed from this bus. | 72 | * @remove: Called when a device removed from this bus. |
| 73 | * @shutdown: Called at shut-down time to quiesce the device. | 73 | * @shutdown: Called at shut-down time to quiesce the device. |
| 74 | * | ||
| 75 | * @online: Called to put the device back online (after offlining it). | ||
| 76 | * @offline: Called to put the device offline for hot-removal. May fail. | ||
| 77 | * | ||
| 74 | * @suspend: Called when a device on this bus wants to go to sleep mode. | 78 | * @suspend: Called when a device on this bus wants to go to sleep mode. |
| 75 | * @resume: Called to bring a device on this bus out of sleep mode. | 79 | * @resume: Called to bring a device on this bus out of sleep mode. |
| 76 | * @pm: Power management operations of this bus, callback the specific | 80 | * @pm: Power management operations of this bus, callback the specific |
| @@ -104,6 +108,9 @@ struct bus_type { | |||
| 104 | int (*remove)(struct device *dev); | 108 | int (*remove)(struct device *dev); |
| 105 | void (*shutdown)(struct device *dev); | 109 | void (*shutdown)(struct device *dev); |
| 106 | 110 | ||
| 111 | int (*online)(struct device *dev); | ||
| 112 | int (*offline)(struct device *dev); | ||
| 113 | |||
| 107 | int (*suspend)(struct device *dev, pm_message_t state); | 114 | int (*suspend)(struct device *dev, pm_message_t state); |
| 108 | int (*resume)(struct device *dev); | 115 | int (*resume)(struct device *dev); |
| 109 | 116 | ||
| @@ -648,6 +655,8 @@ struct acpi_dev_node { | |||
| 648 | * @release: Callback to free the device after all references have | 655 | * @release: Callback to free the device after all references have |
| 649 | * gone away. This should be set by the allocator of the | 656 | * gone away. This should be set by the allocator of the |
| 650 | * device (i.e. the bus driver that discovered the device). | 657 | * device (i.e. the bus driver that discovered the device). |
| 658 | * @offline_disabled: If set, the device is permanently online. | ||
| 659 | * @offline: Set after successful invocation of bus type's .offline(). | ||
| 651 | * | 660 | * |
| 652 | * At the lowest level, every device in a Linux system is represented by an | 661 | * At the lowest level, every device in a Linux system is represented by an |
| 653 | * instance of struct device. The device structure contains the information | 662 | * instance of struct device. The device structure contains the information |
| @@ -720,6 +729,9 @@ struct device { | |||
| 720 | 729 | ||
| 721 | void (*release)(struct device *dev); | 730 | void (*release)(struct device *dev); |
| 722 | struct iommu_group *iommu_group; | 731 | struct iommu_group *iommu_group; |
| 732 | |||
| 733 | bool offline_disabled:1; | ||
| 734 | bool offline:1; | ||
| 723 | }; | 735 | }; |
| 724 | 736 | ||
| 725 | static inline struct device *kobj_to_dev(struct kobject *kobj) | 737 | static inline struct device *kobj_to_dev(struct kobject *kobj) |
| @@ -856,6 +868,15 @@ extern const char *device_get_devnode(struct device *dev, | |||
| 856 | extern void *dev_get_drvdata(const struct device *dev); | 868 | extern void *dev_get_drvdata(const struct device *dev); |
| 857 | extern int dev_set_drvdata(struct device *dev, void *data); | 869 | extern int dev_set_drvdata(struct device *dev, void *data); |
| 858 | 870 | ||
| 871 | static inline bool device_supports_offline(struct device *dev) | ||
| 872 | { | ||
| 873 | return dev->bus && dev->bus->offline && dev->bus->online; | ||
| 874 | } | ||
| 875 | |||
| 876 | extern void lock_device_hotplug(void); | ||
| 877 | extern void unlock_device_hotplug(void); | ||
| 878 | extern int device_offline(struct device *dev); | ||
| 879 | extern int device_online(struct device *dev); | ||
| 859 | /* | 880 | /* |
| 860 | * Root device objects for grouping under /sys/devices | 881 | * Root device objects for grouping under /sys/devices |
| 861 | */ | 882 | */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 43db02e9c9fa..65c2be22b601 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -2414,8 +2414,6 @@ extern ssize_t generic_file_splice_write(struct pipe_inode_info *, | |||
| 2414 | struct file *, loff_t *, size_t, unsigned int); | 2414 | struct file *, loff_t *, size_t, unsigned int); |
| 2415 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, | 2415 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, |
| 2416 | struct file *out, loff_t *, size_t len, unsigned int flags); | 2416 | struct file *out, loff_t *, size_t len, unsigned int flags); |
| 2417 | extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | ||
| 2418 | size_t len, unsigned int flags); | ||
| 2419 | 2417 | ||
| 2420 | extern void | 2418 | extern void |
| 2421 | file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); | 2419 | file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index f0eea07d2c2b..8db53cfaccdb 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/ratelimit.h> | 23 | #include <linux/ratelimit.h> |
| 24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
| 25 | #include <linux/irqflags.h> | 25 | #include <linux/irqflags.h> |
| 26 | #include <linux/context_tracking.h> | ||
| 26 | #include <asm/signal.h> | 27 | #include <asm/signal.h> |
| 27 | 28 | ||
| 28 | #include <linux/kvm.h> | 29 | #include <linux/kvm.h> |
| @@ -760,42 +761,6 @@ static inline int kvm_iommu_unmap_guest(struct kvm *kvm) | |||
| 760 | } | 761 | } |
| 761 | #endif | 762 | #endif |
| 762 | 763 | ||
| 763 | static inline void __guest_enter(void) | ||
| 764 | { | ||
| 765 | /* | ||
| 766 | * This is running in ioctl context so we can avoid | ||
| 767 | * the call to vtime_account() with its unnecessary idle check. | ||
| 768 | */ | ||
| 769 | vtime_account_system(current); | ||
| 770 | current->flags |= PF_VCPU; | ||
| 771 | } | ||
| 772 | |||
| 773 | static inline void __guest_exit(void) | ||
| 774 | { | ||
| 775 | /* | ||
| 776 | * This is running in ioctl context so we can avoid | ||
| 777 | * the call to vtime_account() with its unnecessary idle check. | ||
| 778 | */ | ||
| 779 | vtime_account_system(current); | ||
| 780 | current->flags &= ~PF_VCPU; | ||
| 781 | } | ||
| 782 | |||
| 783 | #ifdef CONFIG_CONTEXT_TRACKING | ||
| 784 | extern void guest_enter(void); | ||
| 785 | extern void guest_exit(void); | ||
| 786 | |||
| 787 | #else /* !CONFIG_CONTEXT_TRACKING */ | ||
| 788 | static inline void guest_enter(void) | ||
| 789 | { | ||
| 790 | __guest_enter(); | ||
| 791 | } | ||
| 792 | |||
| 793 | static inline void guest_exit(void) | ||
| 794 | { | ||
| 795 | __guest_exit(); | ||
| 796 | } | ||
| 797 | #endif /* !CONFIG_CONTEXT_TRACKING */ | ||
| 798 | |||
| 799 | static inline void kvm_guest_enter(void) | 764 | static inline void kvm_guest_enter(void) |
| 800 | { | 765 | { |
| 801 | unsigned long flags; | 766 | unsigned long flags; |
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 3e622c610925..dd38e62b84d2 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h | |||
| @@ -234,6 +234,8 @@ static inline void unlock_memory_hotplug(void) {} | |||
| 234 | 234 | ||
| 235 | extern int is_mem_section_removable(unsigned long pfn, unsigned long nr_pages); | 235 | extern int is_mem_section_removable(unsigned long pfn, unsigned long nr_pages); |
| 236 | extern void try_offline_node(int nid); | 236 | extern void try_offline_node(int nid); |
| 237 | extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); | ||
| 238 | extern void remove_memory(int nid, u64 start, u64 size); | ||
| 237 | 239 | ||
| 238 | #else | 240 | #else |
| 239 | static inline int is_mem_section_removable(unsigned long pfn, | 241 | static inline int is_mem_section_removable(unsigned long pfn, |
| @@ -243,15 +245,23 @@ static inline int is_mem_section_removable(unsigned long pfn, | |||
| 243 | } | 245 | } |
| 244 | 246 | ||
| 245 | static inline void try_offline_node(int nid) {} | 247 | static inline void try_offline_node(int nid) {} |
| 248 | |||
| 249 | static inline int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | ||
| 250 | { | ||
| 251 | return -EINVAL; | ||
| 252 | } | ||
| 253 | |||
| 254 | static inline void remove_memory(int nid, u64 start, u64 size) {} | ||
| 246 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | 255 | #endif /* CONFIG_MEMORY_HOTREMOVE */ |
| 247 | 256 | ||
| 257 | extern int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn, | ||
| 258 | void *arg, int (*func)(struct memory_block *, void *)); | ||
| 248 | extern int mem_online_node(int nid); | 259 | extern int mem_online_node(int nid); |
| 249 | extern int add_memory(int nid, u64 start, u64 size); | 260 | extern int add_memory(int nid, u64 start, u64 size); |
| 250 | extern int arch_add_memory(int nid, u64 start, u64 size); | 261 | extern int arch_add_memory(int nid, u64 start, u64 size); |
| 251 | extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); | 262 | extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); |
| 252 | extern int offline_memory_block(struct memory_block *mem); | ||
| 253 | extern bool is_memblock_offlined(struct memory_block *mem); | 263 | extern bool is_memblock_offlined(struct memory_block *mem); |
| 254 | extern int remove_memory(int nid, u64 start, u64 size); | 264 | extern void remove_memory(int nid, u64 start, u64 size); |
| 255 | extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, | 265 | extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, |
| 256 | int nr_pages); | 266 | int nr_pages); |
| 257 | extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms); | 267 | extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms); |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index f463a46424e2..c5b6dbf9c2fc 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -389,8 +389,7 @@ struct perf_event { | |||
| 389 | /* mmap bits */ | 389 | /* mmap bits */ |
| 390 | struct mutex mmap_mutex; | 390 | struct mutex mmap_mutex; |
| 391 | atomic_t mmap_count; | 391 | atomic_t mmap_count; |
| 392 | int mmap_locked; | 392 | |
| 393 | struct user_struct *mmap_user; | ||
| 394 | struct ring_buffer *rb; | 393 | struct ring_buffer *rb; |
| 395 | struct list_head rb_entry; | 394 | struct list_head rb_entry; |
| 396 | 395 | ||
diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 87a03c746f17..f5d4723cdb3d 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h | |||
| @@ -33,9 +33,25 @@ do { \ | |||
| 33 | preempt_schedule(); \ | 33 | preempt_schedule(); \ |
| 34 | } while (0) | 34 | } while (0) |
| 35 | 35 | ||
| 36 | #ifdef CONFIG_CONTEXT_TRACKING | ||
| 37 | |||
| 38 | void preempt_schedule_context(void); | ||
| 39 | |||
| 40 | #define preempt_check_resched_context() \ | ||
| 41 | do { \ | ||
| 42 | if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \ | ||
| 43 | preempt_schedule_context(); \ | ||
| 44 | } while (0) | ||
| 45 | #else | ||
| 46 | |||
| 47 | #define preempt_check_resched_context() preempt_check_resched() | ||
| 48 | |||
| 49 | #endif /* CONFIG_CONTEXT_TRACKING */ | ||
| 50 | |||
| 36 | #else /* !CONFIG_PREEMPT */ | 51 | #else /* !CONFIG_PREEMPT */ |
| 37 | 52 | ||
| 38 | #define preempt_check_resched() do { } while (0) | 53 | #define preempt_check_resched() do { } while (0) |
| 54 | #define preempt_check_resched_context() do { } while (0) | ||
| 39 | 55 | ||
| 40 | #endif /* CONFIG_PREEMPT */ | 56 | #endif /* CONFIG_PREEMPT */ |
| 41 | 57 | ||
| @@ -88,7 +104,7 @@ do { \ | |||
| 88 | do { \ | 104 | do { \ |
| 89 | preempt_enable_no_resched_notrace(); \ | 105 | preempt_enable_no_resched_notrace(); \ |
| 90 | barrier(); \ | 106 | barrier(); \ |
| 91 | preempt_check_resched(); \ | 107 | preempt_check_resched_context(); \ |
| 92 | } while (0) | 108 | } while (0) |
| 93 | 109 | ||
| 94 | #else /* !CONFIG_PREEMPT_COUNT */ | 110 | #else /* !CONFIG_PREEMPT_COUNT */ |
diff --git a/include/linux/splice.h b/include/linux/splice.h index 09a545a7dfa3..74575cbf2d6f 100644 --- a/include/linux/splice.h +++ b/include/linux/splice.h | |||
| @@ -35,6 +35,7 @@ struct splice_desc { | |||
| 35 | void *data; /* cookie */ | 35 | void *data; /* cookie */ |
| 36 | } u; | 36 | } u; |
| 37 | loff_t pos; /* file position */ | 37 | loff_t pos; /* file position */ |
| 38 | loff_t *opos; /* sendfile: output position */ | ||
| 38 | size_t num_spliced; /* number of bytes already spliced */ | 39 | size_t num_spliced; /* number of bytes already spliced */ |
| 39 | bool need_wakeup; /* need to wake up writer */ | 40 | bool need_wakeup; /* need to wake up writer */ |
| 40 | }; | 41 | }; |
diff --git a/include/linux/vtime.h b/include/linux/vtime.h index 71a5782d8c59..b1dd2db80076 100644 --- a/include/linux/vtime.h +++ b/include/linux/vtime.h | |||
| @@ -34,7 +34,7 @@ static inline void vtime_user_exit(struct task_struct *tsk) | |||
| 34 | } | 34 | } |
| 35 | extern void vtime_guest_enter(struct task_struct *tsk); | 35 | extern void vtime_guest_enter(struct task_struct *tsk); |
| 36 | extern void vtime_guest_exit(struct task_struct *tsk); | 36 | extern void vtime_guest_exit(struct task_struct *tsk); |
| 37 | extern void vtime_init_idle(struct task_struct *tsk); | 37 | extern void vtime_init_idle(struct task_struct *tsk, int cpu); |
| 38 | #else | 38 | #else |
| 39 | static inline void vtime_account_irq_exit(struct task_struct *tsk) | 39 | static inline void vtime_account_irq_exit(struct task_struct *tsk) |
| 40 | { | 40 | { |
| @@ -45,7 +45,7 @@ static inline void vtime_user_enter(struct task_struct *tsk) { } | |||
| 45 | static inline void vtime_user_exit(struct task_struct *tsk) { } | 45 | static inline void vtime_user_exit(struct task_struct *tsk) { } |
| 46 | static inline void vtime_guest_enter(struct task_struct *tsk) { } | 46 | static inline void vtime_guest_enter(struct task_struct *tsk) { } |
| 47 | static inline void vtime_guest_exit(struct task_struct *tsk) { } | 47 | static inline void vtime_guest_exit(struct task_struct *tsk) { } |
| 48 | static inline void vtime_init_idle(struct task_struct *tsk) { } | 48 | static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { } |
| 49 | #endif | 49 | #endif |
| 50 | 50 | ||
| 51 | #ifdef CONFIG_IRQ_TIME_ACCOUNTING | 51 | #ifdef CONFIG_IRQ_TIME_ACCOUNTING |
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h index d3eef01da648..0f4555b2a31b 100644 --- a/include/media/v4l2-mem2mem.h +++ b/include/media/v4l2-mem2mem.h | |||
| @@ -110,6 +110,8 @@ int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | |||
| 110 | struct v4l2_buffer *buf); | 110 | struct v4l2_buffer *buf); |
| 111 | int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | 111 | int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, |
| 112 | struct v4l2_buffer *buf); | 112 | struct v4l2_buffer *buf); |
| 113 | int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | ||
| 114 | struct v4l2_create_buffers *create); | ||
| 113 | 115 | ||
| 114 | int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | 116 | int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, |
| 115 | struct v4l2_exportbuffer *eb); | 117 | struct v4l2_exportbuffer *eb); |
diff --git a/kernel/context_tracking.c b/kernel/context_tracking.c index 65349f07b878..383f8231e436 100644 --- a/kernel/context_tracking.c +++ b/kernel/context_tracking.c | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/context_tracking.h> | 17 | #include <linux/context_tracking.h> |
| 18 | #include <linux/kvm_host.h> | ||
| 19 | #include <linux/rcupdate.h> | 18 | #include <linux/rcupdate.h> |
| 20 | #include <linux/sched.h> | 19 | #include <linux/sched.h> |
| 21 | #include <linux/hardirq.h> | 20 | #include <linux/hardirq.h> |
| @@ -71,6 +70,46 @@ void user_enter(void) | |||
| 71 | local_irq_restore(flags); | 70 | local_irq_restore(flags); |
| 72 | } | 71 | } |
| 73 | 72 | ||
| 73 | #ifdef CONFIG_PREEMPT | ||
| 74 | /** | ||
| 75 | * preempt_schedule_context - preempt_schedule called by tracing | ||
| 76 | * | ||
| 77 | * The tracing infrastructure uses preempt_enable_notrace to prevent | ||
| 78 | * recursion and tracing preempt enabling caused by the tracing | ||
| 79 | * infrastructure itself. But as tracing can happen in areas coming | ||
| 80 | * from userspace or just about to enter userspace, a preempt enable | ||
| 81 | * can occur before user_exit() is called. This will cause the scheduler | ||
| 82 | * to be called when the system is still in usermode. | ||
| 83 | * | ||
| 84 | * To prevent this, the preempt_enable_notrace will use this function | ||
| 85 | * instead of preempt_schedule() to exit user context if needed before | ||
| 86 | * calling the scheduler. | ||
| 87 | */ | ||
| 88 | void __sched notrace preempt_schedule_context(void) | ||
| 89 | { | ||
| 90 | struct thread_info *ti = current_thread_info(); | ||
| 91 | enum ctx_state prev_ctx; | ||
| 92 | |||
| 93 | if (likely(ti->preempt_count || irqs_disabled())) | ||
| 94 | return; | ||
| 95 | |||
| 96 | /* | ||
| 97 | * Need to disable preemption in case user_exit() is traced | ||
| 98 | * and the tracer calls preempt_enable_notrace() causing | ||
| 99 | * an infinite recursion. | ||
| 100 | */ | ||
| 101 | preempt_disable_notrace(); | ||
| 102 | prev_ctx = exception_enter(); | ||
| 103 | preempt_enable_no_resched_notrace(); | ||
| 104 | |||
| 105 | preempt_schedule(); | ||
| 106 | |||
| 107 | preempt_disable_notrace(); | ||
| 108 | exception_exit(prev_ctx); | ||
| 109 | preempt_enable_notrace(); | ||
| 110 | } | ||
| 111 | EXPORT_SYMBOL_GPL(preempt_schedule_context); | ||
| 112 | #endif /* CONFIG_PREEMPT */ | ||
| 74 | 113 | ||
| 75 | /** | 114 | /** |
| 76 | * user_exit - Inform the context tracking that the CPU is | 115 | * user_exit - Inform the context tracking that the CPU is |
diff --git a/kernel/cpu/idle.c b/kernel/cpu/idle.c index d5585f5e038e..e695c0a0bcb5 100644 --- a/kernel/cpu/idle.c +++ b/kernel/cpu/idle.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <linux/cpu.h> | 5 | #include <linux/cpu.h> |
| 6 | #include <linux/tick.h> | 6 | #include <linux/tick.h> |
| 7 | #include <linux/mm.h> | 7 | #include <linux/mm.h> |
| 8 | #include <linux/stackprotector.h> | ||
| 8 | 9 | ||
| 9 | #include <asm/tlb.h> | 10 | #include <asm/tlb.h> |
| 10 | 11 | ||
| @@ -58,6 +59,7 @@ void __weak arch_cpu_idle_dead(void) { } | |||
| 58 | void __weak arch_cpu_idle(void) | 59 | void __weak arch_cpu_idle(void) |
| 59 | { | 60 | { |
| 60 | cpu_idle_force_poll = 1; | 61 | cpu_idle_force_poll = 1; |
| 62 | local_irq_enable(); | ||
| 61 | } | 63 | } |
| 62 | 64 | ||
| 63 | /* | 65 | /* |
| @@ -112,6 +114,21 @@ static void cpu_idle_loop(void) | |||
| 112 | 114 | ||
| 113 | void cpu_startup_entry(enum cpuhp_state state) | 115 | void cpu_startup_entry(enum cpuhp_state state) |
| 114 | { | 116 | { |
| 117 | /* | ||
| 118 | * This #ifdef needs to die, but it's too late in the cycle to | ||
| 119 | * make this generic (arm and sh have never invoked the canary | ||
| 120 | * init for the non boot cpus!). Will be fixed in 3.11 | ||
| 121 | */ | ||
| 122 | #ifdef CONFIG_X86 | ||
| 123 | /* | ||
| 124 | * If we're the non-boot CPU, nothing set the stack canary up | ||
| 125 | * for us. The boot CPU already has it initialized but no harm | ||
| 126 | * in doing it again. This is a good place for updating it, as | ||
| 127 | * we wont ever return from this function (so the invalid | ||
| 128 | * canaries already on the stack wont ever trigger). | ||
| 129 | */ | ||
| 130 | boot_init_stack_canary(); | ||
| 131 | #endif | ||
| 115 | current_set_polling(); | 132 | current_set_polling(); |
| 116 | arch_cpu_idle_prepare(); | 133 | arch_cpu_idle_prepare(); |
| 117 | cpu_idle_loop(); | 134 | cpu_idle_loop(); |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 9dc297faf7c0..b391907d5352 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -196,9 +196,6 @@ static void cpu_ctx_sched_in(struct perf_cpu_context *cpuctx, | |||
| 196 | static void update_context_time(struct perf_event_context *ctx); | 196 | static void update_context_time(struct perf_event_context *ctx); |
| 197 | static u64 perf_event_time(struct perf_event *event); | 197 | static u64 perf_event_time(struct perf_event *event); |
| 198 | 198 | ||
| 199 | static void ring_buffer_attach(struct perf_event *event, | ||
| 200 | struct ring_buffer *rb); | ||
| 201 | |||
| 202 | void __weak perf_event_print_debug(void) { } | 199 | void __weak perf_event_print_debug(void) { } |
| 203 | 200 | ||
| 204 | extern __weak const char *perf_pmu_name(void) | 201 | extern __weak const char *perf_pmu_name(void) |
| @@ -2918,6 +2915,7 @@ static void free_event_rcu(struct rcu_head *head) | |||
| 2918 | } | 2915 | } |
| 2919 | 2916 | ||
| 2920 | static void ring_buffer_put(struct ring_buffer *rb); | 2917 | static void ring_buffer_put(struct ring_buffer *rb); |
| 2918 | static void ring_buffer_detach(struct perf_event *event, struct ring_buffer *rb); | ||
| 2921 | 2919 | ||
| 2922 | static void free_event(struct perf_event *event) | 2920 | static void free_event(struct perf_event *event) |
| 2923 | { | 2921 | { |
| @@ -2942,15 +2940,30 @@ static void free_event(struct perf_event *event) | |||
| 2942 | if (has_branch_stack(event)) { | 2940 | if (has_branch_stack(event)) { |
| 2943 | static_key_slow_dec_deferred(&perf_sched_events); | 2941 | static_key_slow_dec_deferred(&perf_sched_events); |
| 2944 | /* is system-wide event */ | 2942 | /* is system-wide event */ |
| 2945 | if (!(event->attach_state & PERF_ATTACH_TASK)) | 2943 | if (!(event->attach_state & PERF_ATTACH_TASK)) { |
| 2946 | atomic_dec(&per_cpu(perf_branch_stack_events, | 2944 | atomic_dec(&per_cpu(perf_branch_stack_events, |
| 2947 | event->cpu)); | 2945 | event->cpu)); |
| 2946 | } | ||
| 2948 | } | 2947 | } |
| 2949 | } | 2948 | } |
| 2950 | 2949 | ||
| 2951 | if (event->rb) { | 2950 | if (event->rb) { |
| 2952 | ring_buffer_put(event->rb); | 2951 | struct ring_buffer *rb; |
| 2953 | event->rb = NULL; | 2952 | |
| 2953 | /* | ||
| 2954 | * Can happen when we close an event with re-directed output. | ||
| 2955 | * | ||
| 2956 | * Since we have a 0 refcount, perf_mmap_close() will skip | ||
| 2957 | * over us; possibly making our ring_buffer_put() the last. | ||
| 2958 | */ | ||
| 2959 | mutex_lock(&event->mmap_mutex); | ||
| 2960 | rb = event->rb; | ||
| 2961 | if (rb) { | ||
| 2962 | rcu_assign_pointer(event->rb, NULL); | ||
| 2963 | ring_buffer_detach(event, rb); | ||
| 2964 | ring_buffer_put(rb); /* could be last */ | ||
| 2965 | } | ||
| 2966 | mutex_unlock(&event->mmap_mutex); | ||
| 2954 | } | 2967 | } |
| 2955 | 2968 | ||
| 2956 | if (is_cgroup_event(event)) | 2969 | if (is_cgroup_event(event)) |
| @@ -3188,30 +3201,13 @@ static unsigned int perf_poll(struct file *file, poll_table *wait) | |||
| 3188 | unsigned int events = POLL_HUP; | 3201 | unsigned int events = POLL_HUP; |
| 3189 | 3202 | ||
| 3190 | /* | 3203 | /* |
| 3191 | * Race between perf_event_set_output() and perf_poll(): perf_poll() | 3204 | * Pin the event->rb by taking event->mmap_mutex; otherwise |
| 3192 | * grabs the rb reference but perf_event_set_output() overrides it. | 3205 | * perf_event_set_output() can swizzle our rb and make us miss wakeups. |
| 3193 | * Here is the timeline for two threads T1, T2: | ||
| 3194 | * t0: T1, rb = rcu_dereference(event->rb) | ||
| 3195 | * t1: T2, old_rb = event->rb | ||
| 3196 | * t2: T2, event->rb = new rb | ||
| 3197 | * t3: T2, ring_buffer_detach(old_rb) | ||
| 3198 | * t4: T1, ring_buffer_attach(rb1) | ||
| 3199 | * t5: T1, poll_wait(event->waitq) | ||
| 3200 | * | ||
| 3201 | * To avoid this problem, we grab mmap_mutex in perf_poll() | ||
| 3202 | * thereby ensuring that the assignment of the new ring buffer | ||
| 3203 | * and the detachment of the old buffer appear atomic to perf_poll() | ||
| 3204 | */ | 3206 | */ |
| 3205 | mutex_lock(&event->mmap_mutex); | 3207 | mutex_lock(&event->mmap_mutex); |
| 3206 | 3208 | rb = event->rb; | |
| 3207 | rcu_read_lock(); | 3209 | if (rb) |
| 3208 | rb = rcu_dereference(event->rb); | ||
| 3209 | if (rb) { | ||
| 3210 | ring_buffer_attach(event, rb); | ||
| 3211 | events = atomic_xchg(&rb->poll, 0); | 3210 | events = atomic_xchg(&rb->poll, 0); |
| 3212 | } | ||
| 3213 | rcu_read_unlock(); | ||
| 3214 | |||
| 3215 | mutex_unlock(&event->mmap_mutex); | 3211 | mutex_unlock(&event->mmap_mutex); |
| 3216 | 3212 | ||
| 3217 | poll_wait(file, &event->waitq, wait); | 3213 | poll_wait(file, &event->waitq, wait); |
| @@ -3521,16 +3517,12 @@ static void ring_buffer_attach(struct perf_event *event, | |||
| 3521 | return; | 3517 | return; |
| 3522 | 3518 | ||
| 3523 | spin_lock_irqsave(&rb->event_lock, flags); | 3519 | spin_lock_irqsave(&rb->event_lock, flags); |
| 3524 | if (!list_empty(&event->rb_entry)) | 3520 | if (list_empty(&event->rb_entry)) |
| 3525 | goto unlock; | 3521 | list_add(&event->rb_entry, &rb->event_list); |
| 3526 | |||
| 3527 | list_add(&event->rb_entry, &rb->event_list); | ||
| 3528 | unlock: | ||
| 3529 | spin_unlock_irqrestore(&rb->event_lock, flags); | 3522 | spin_unlock_irqrestore(&rb->event_lock, flags); |
| 3530 | } | 3523 | } |
| 3531 | 3524 | ||
| 3532 | static void ring_buffer_detach(struct perf_event *event, | 3525 | static void ring_buffer_detach(struct perf_event *event, struct ring_buffer *rb) |
| 3533 | struct ring_buffer *rb) | ||
| 3534 | { | 3526 | { |
| 3535 | unsigned long flags; | 3527 | unsigned long flags; |
| 3536 | 3528 | ||
| @@ -3549,13 +3541,10 @@ static void ring_buffer_wakeup(struct perf_event *event) | |||
| 3549 | 3541 | ||
| 3550 | rcu_read_lock(); | 3542 | rcu_read_lock(); |
| 3551 | rb = rcu_dereference(event->rb); | 3543 | rb = rcu_dereference(event->rb); |
| 3552 | if (!rb) | 3544 | if (rb) { |
| 3553 | goto unlock; | 3545 | list_for_each_entry_rcu(event, &rb->event_list, rb_entry) |
| 3554 | 3546 | wake_up_all(&event->waitq); | |
| 3555 | list_for_each_entry_rcu(event, &rb->event_list, rb_entry) | 3547 | } |
| 3556 | wake_up_all(&event->waitq); | ||
| 3557 | |||
| 3558 | unlock: | ||
| 3559 | rcu_read_unlock(); | 3548 | rcu_read_unlock(); |
| 3560 | } | 3549 | } |
| 3561 | 3550 | ||
| @@ -3584,18 +3573,10 @@ static struct ring_buffer *ring_buffer_get(struct perf_event *event) | |||
| 3584 | 3573 | ||
| 3585 | static void ring_buffer_put(struct ring_buffer *rb) | 3574 | static void ring_buffer_put(struct ring_buffer *rb) |
| 3586 | { | 3575 | { |
| 3587 | struct perf_event *event, *n; | ||
| 3588 | unsigned long flags; | ||
| 3589 | |||
| 3590 | if (!atomic_dec_and_test(&rb->refcount)) | 3576 | if (!atomic_dec_and_test(&rb->refcount)) |
| 3591 | return; | 3577 | return; |
| 3592 | 3578 | ||
| 3593 | spin_lock_irqsave(&rb->event_lock, flags); | 3579 | WARN_ON_ONCE(!list_empty(&rb->event_list)); |
| 3594 | list_for_each_entry_safe(event, n, &rb->event_list, rb_entry) { | ||
| 3595 | list_del_init(&event->rb_entry); | ||
| 3596 | wake_up_all(&event->waitq); | ||
| 3597 | } | ||
| 3598 | spin_unlock_irqrestore(&rb->event_lock, flags); | ||
| 3599 | 3580 | ||
| 3600 | call_rcu(&rb->rcu_head, rb_free_rcu); | 3581 | call_rcu(&rb->rcu_head, rb_free_rcu); |
| 3601 | } | 3582 | } |
| @@ -3605,26 +3586,100 @@ static void perf_mmap_open(struct vm_area_struct *vma) | |||
| 3605 | struct perf_event *event = vma->vm_file->private_data; | 3586 | struct perf_event *event = vma->vm_file->private_data; |
| 3606 | 3587 | ||
| 3607 | atomic_inc(&event->mmap_count); | 3588 | atomic_inc(&event->mmap_count); |
| 3589 | atomic_inc(&event->rb->mmap_count); | ||
| 3608 | } | 3590 | } |
| 3609 | 3591 | ||
| 3592 | /* | ||
| 3593 | * A buffer can be mmap()ed multiple times; either directly through the same | ||
| 3594 | * event, or through other events by use of perf_event_set_output(). | ||
| 3595 | * | ||
| 3596 | * In order to undo the VM accounting done by perf_mmap() we need to destroy | ||
| 3597 | * the buffer here, where we still have a VM context. This means we need | ||
| 3598 | * to detach all events redirecting to us. | ||
| 3599 | */ | ||
| 3610 | static void perf_mmap_close(struct vm_area_struct *vma) | 3600 | static void perf_mmap_close(struct vm_area_struct *vma) |
| 3611 | { | 3601 | { |
| 3612 | struct perf_event *event = vma->vm_file->private_data; | 3602 | struct perf_event *event = vma->vm_file->private_data; |
| 3613 | 3603 | ||
| 3614 | if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) { | 3604 | struct ring_buffer *rb = event->rb; |
| 3615 | unsigned long size = perf_data_size(event->rb); | 3605 | struct user_struct *mmap_user = rb->mmap_user; |
| 3616 | struct user_struct *user = event->mmap_user; | 3606 | int mmap_locked = rb->mmap_locked; |
| 3617 | struct ring_buffer *rb = event->rb; | 3607 | unsigned long size = perf_data_size(rb); |
| 3608 | |||
| 3609 | atomic_dec(&rb->mmap_count); | ||
| 3610 | |||
| 3611 | if (!atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) | ||
| 3612 | return; | ||
| 3618 | 3613 | ||
| 3619 | atomic_long_sub((size >> PAGE_SHIFT) + 1, &user->locked_vm); | 3614 | /* Detach current event from the buffer. */ |
| 3620 | vma->vm_mm->pinned_vm -= event->mmap_locked; | 3615 | rcu_assign_pointer(event->rb, NULL); |
| 3621 | rcu_assign_pointer(event->rb, NULL); | 3616 | ring_buffer_detach(event, rb); |
| 3622 | ring_buffer_detach(event, rb); | 3617 | mutex_unlock(&event->mmap_mutex); |
| 3618 | |||
| 3619 | /* If there's still other mmap()s of this buffer, we're done. */ | ||
| 3620 | if (atomic_read(&rb->mmap_count)) { | ||
| 3621 | ring_buffer_put(rb); /* can't be last */ | ||
| 3622 | return; | ||
| 3623 | } | ||
| 3624 | |||
| 3625 | /* | ||
| 3626 | * No other mmap()s, detach from all other events that might redirect | ||
| 3627 | * into the now unreachable buffer. Somewhat complicated by the | ||
| 3628 | * fact that rb::event_lock otherwise nests inside mmap_mutex. | ||
| 3629 | */ | ||
| 3630 | again: | ||
| 3631 | rcu_read_lock(); | ||
| 3632 | list_for_each_entry_rcu(event, &rb->event_list, rb_entry) { | ||
| 3633 | if (!atomic_long_inc_not_zero(&event->refcount)) { | ||
| 3634 | /* | ||
| 3635 | * This event is en-route to free_event() which will | ||
| 3636 | * detach it and remove it from the list. | ||
| 3637 | */ | ||
| 3638 | continue; | ||
| 3639 | } | ||
| 3640 | rcu_read_unlock(); | ||
| 3641 | |||
| 3642 | mutex_lock(&event->mmap_mutex); | ||
| 3643 | /* | ||
| 3644 | * Check we didn't race with perf_event_set_output() which can | ||
| 3645 | * swizzle the rb from under us while we were waiting to | ||
| 3646 | * acquire mmap_mutex. | ||
| 3647 | * | ||
| 3648 | * If we find a different rb; ignore this event, a next | ||
| 3649 | * iteration will no longer find it on the list. We have to | ||
| 3650 | * still restart the iteration to make sure we're not now | ||
| 3651 | * iterating the wrong list. | ||
| 3652 | */ | ||
| 3653 | if (event->rb == rb) { | ||
| 3654 | rcu_assign_pointer(event->rb, NULL); | ||
| 3655 | ring_buffer_detach(event, rb); | ||
| 3656 | ring_buffer_put(rb); /* can't be last, we still have one */ | ||
| 3657 | } | ||
| 3623 | mutex_unlock(&event->mmap_mutex); | 3658 | mutex_unlock(&event->mmap_mutex); |
| 3659 | put_event(event); | ||
| 3624 | 3660 | ||
| 3625 | ring_buffer_put(rb); | 3661 | /* |
| 3626 | free_uid(user); | 3662 | * Restart the iteration; either we're on the wrong list or |
| 3663 | * destroyed its integrity by doing a deletion. | ||
| 3664 | */ | ||
| 3665 | goto again; | ||
| 3627 | } | 3666 | } |
| 3667 | rcu_read_unlock(); | ||
| 3668 | |||
| 3669 | /* | ||
| 3670 | * It could be there's still a few 0-ref events on the list; they'll | ||
| 3671 | * get cleaned up by free_event() -- they'll also still have their | ||
| 3672 | * ref on the rb and will free it whenever they are done with it. | ||
| 3673 | * | ||
| 3674 | * Aside from that, this buffer is 'fully' detached and unmapped, | ||
| 3675 | * undo the VM accounting. | ||
| 3676 | */ | ||
| 3677 | |||
| 3678 | atomic_long_sub((size >> PAGE_SHIFT) + 1, &mmap_user->locked_vm); | ||
| 3679 | vma->vm_mm->pinned_vm -= mmap_locked; | ||
| 3680 | free_uid(mmap_user); | ||
| 3681 | |||
| 3682 | ring_buffer_put(rb); /* could be last */ | ||
| 3628 | } | 3683 | } |
| 3629 | 3684 | ||
| 3630 | static const struct vm_operations_struct perf_mmap_vmops = { | 3685 | static const struct vm_operations_struct perf_mmap_vmops = { |
| @@ -3674,12 +3729,24 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 3674 | return -EINVAL; | 3729 | return -EINVAL; |
| 3675 | 3730 | ||
| 3676 | WARN_ON_ONCE(event->ctx->parent_ctx); | 3731 | WARN_ON_ONCE(event->ctx->parent_ctx); |
| 3732 | again: | ||
| 3677 | mutex_lock(&event->mmap_mutex); | 3733 | mutex_lock(&event->mmap_mutex); |
| 3678 | if (event->rb) { | 3734 | if (event->rb) { |
| 3679 | if (event->rb->nr_pages == nr_pages) | 3735 | if (event->rb->nr_pages != nr_pages) { |
| 3680 | atomic_inc(&event->rb->refcount); | ||
| 3681 | else | ||
| 3682 | ret = -EINVAL; | 3736 | ret = -EINVAL; |
| 3737 | goto unlock; | ||
| 3738 | } | ||
| 3739 | |||
| 3740 | if (!atomic_inc_not_zero(&event->rb->mmap_count)) { | ||
| 3741 | /* | ||
| 3742 | * Raced against perf_mmap_close() through | ||
| 3743 | * perf_event_set_output(). Try again, hope for better | ||
| 3744 | * luck. | ||
| 3745 | */ | ||
| 3746 | mutex_unlock(&event->mmap_mutex); | ||
| 3747 | goto again; | ||
| 3748 | } | ||
| 3749 | |||
| 3683 | goto unlock; | 3750 | goto unlock; |
| 3684 | } | 3751 | } |
| 3685 | 3752 | ||
| @@ -3720,12 +3787,16 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 3720 | ret = -ENOMEM; | 3787 | ret = -ENOMEM; |
| 3721 | goto unlock; | 3788 | goto unlock; |
| 3722 | } | 3789 | } |
| 3723 | rcu_assign_pointer(event->rb, rb); | 3790 | |
| 3791 | atomic_set(&rb->mmap_count, 1); | ||
| 3792 | rb->mmap_locked = extra; | ||
| 3793 | rb->mmap_user = get_current_user(); | ||
| 3724 | 3794 | ||
| 3725 | atomic_long_add(user_extra, &user->locked_vm); | 3795 | atomic_long_add(user_extra, &user->locked_vm); |
| 3726 | event->mmap_locked = extra; | 3796 | vma->vm_mm->pinned_vm += extra; |
| 3727 | event->mmap_user = get_current_user(); | 3797 | |
| 3728 | vma->vm_mm->pinned_vm += event->mmap_locked; | 3798 | ring_buffer_attach(event, rb); |
| 3799 | rcu_assign_pointer(event->rb, rb); | ||
| 3729 | 3800 | ||
| 3730 | perf_event_update_userpage(event); | 3801 | perf_event_update_userpage(event); |
| 3731 | 3802 | ||
| @@ -3734,7 +3805,11 @@ unlock: | |||
| 3734 | atomic_inc(&event->mmap_count); | 3805 | atomic_inc(&event->mmap_count); |
| 3735 | mutex_unlock(&event->mmap_mutex); | 3806 | mutex_unlock(&event->mmap_mutex); |
| 3736 | 3807 | ||
| 3737 | vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP; | 3808 | /* |
| 3809 | * Since pinned accounting is per vm we cannot allow fork() to copy our | ||
| 3810 | * vma. | ||
| 3811 | */ | ||
| 3812 | vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP; | ||
| 3738 | vma->vm_ops = &perf_mmap_vmops; | 3813 | vma->vm_ops = &perf_mmap_vmops; |
| 3739 | 3814 | ||
| 3740 | return ret; | 3815 | return ret; |
| @@ -6412,6 +6487,8 @@ set: | |||
| 6412 | if (atomic_read(&event->mmap_count)) | 6487 | if (atomic_read(&event->mmap_count)) |
| 6413 | goto unlock; | 6488 | goto unlock; |
| 6414 | 6489 | ||
| 6490 | old_rb = event->rb; | ||
| 6491 | |||
| 6415 | if (output_event) { | 6492 | if (output_event) { |
| 6416 | /* get the rb we want to redirect to */ | 6493 | /* get the rb we want to redirect to */ |
| 6417 | rb = ring_buffer_get(output_event); | 6494 | rb = ring_buffer_get(output_event); |
| @@ -6419,16 +6496,28 @@ set: | |||
| 6419 | goto unlock; | 6496 | goto unlock; |
| 6420 | } | 6497 | } |
| 6421 | 6498 | ||
| 6422 | old_rb = event->rb; | ||
| 6423 | rcu_assign_pointer(event->rb, rb); | ||
| 6424 | if (old_rb) | 6499 | if (old_rb) |
| 6425 | ring_buffer_detach(event, old_rb); | 6500 | ring_buffer_detach(event, old_rb); |
| 6501 | |||
| 6502 | if (rb) | ||
| 6503 | ring_buffer_attach(event, rb); | ||
| 6504 | |||
| 6505 | rcu_assign_pointer(event->rb, rb); | ||
| 6506 | |||
| 6507 | if (old_rb) { | ||
| 6508 | ring_buffer_put(old_rb); | ||
| 6509 | /* | ||
| 6510 | * Since we detached before setting the new rb, so that we | ||
| 6511 | * could attach the new rb, we could have missed a wakeup. | ||
| 6512 | * Provide it now. | ||
| 6513 | */ | ||
| 6514 | wake_up_all(&event->waitq); | ||
| 6515 | } | ||
| 6516 | |||
| 6426 | ret = 0; | 6517 | ret = 0; |
| 6427 | unlock: | 6518 | unlock: |
| 6428 | mutex_unlock(&event->mmap_mutex); | 6519 | mutex_unlock(&event->mmap_mutex); |
| 6429 | 6520 | ||
| 6430 | if (old_rb) | ||
| 6431 | ring_buffer_put(old_rb); | ||
| 6432 | out: | 6521 | out: |
| 6433 | return ret; | 6522 | return ret; |
| 6434 | } | 6523 | } |
diff --git a/kernel/events/internal.h b/kernel/events/internal.h index eb675c4d59df..ca6599723be5 100644 --- a/kernel/events/internal.h +++ b/kernel/events/internal.h | |||
| @@ -31,6 +31,10 @@ struct ring_buffer { | |||
| 31 | spinlock_t event_lock; | 31 | spinlock_t event_lock; |
| 32 | struct list_head event_list; | 32 | struct list_head event_list; |
| 33 | 33 | ||
| 34 | atomic_t mmap_count; | ||
| 35 | unsigned long mmap_locked; | ||
| 36 | struct user_struct *mmap_user; | ||
| 37 | |||
| 34 | struct perf_event_mmap_page *user_page; | 38 | struct perf_event_mmap_page *user_page; |
| 35 | void *data_pages[0]; | 39 | void *data_pages[0]; |
| 36 | }; | 40 | }; |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 3fed7f0cbcdf..bddf3b201a48 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -467,6 +467,7 @@ static struct kprobe *__kprobes get_optimized_kprobe(unsigned long addr) | |||
| 467 | /* Optimization staging list, protected by kprobe_mutex */ | 467 | /* Optimization staging list, protected by kprobe_mutex */ |
| 468 | static LIST_HEAD(optimizing_list); | 468 | static LIST_HEAD(optimizing_list); |
| 469 | static LIST_HEAD(unoptimizing_list); | 469 | static LIST_HEAD(unoptimizing_list); |
| 470 | static LIST_HEAD(freeing_list); | ||
| 470 | 471 | ||
| 471 | static void kprobe_optimizer(struct work_struct *work); | 472 | static void kprobe_optimizer(struct work_struct *work); |
| 472 | static DECLARE_DELAYED_WORK(optimizing_work, kprobe_optimizer); | 473 | static DECLARE_DELAYED_WORK(optimizing_work, kprobe_optimizer); |
| @@ -504,7 +505,7 @@ static __kprobes void do_optimize_kprobes(void) | |||
| 504 | * Unoptimize (replace a jump with a breakpoint and remove the breakpoint | 505 | * Unoptimize (replace a jump with a breakpoint and remove the breakpoint |
| 505 | * if need) kprobes listed on unoptimizing_list. | 506 | * if need) kprobes listed on unoptimizing_list. |
| 506 | */ | 507 | */ |
| 507 | static __kprobes void do_unoptimize_kprobes(struct list_head *free_list) | 508 | static __kprobes void do_unoptimize_kprobes(void) |
| 508 | { | 509 | { |
| 509 | struct optimized_kprobe *op, *tmp; | 510 | struct optimized_kprobe *op, *tmp; |
| 510 | 511 | ||
| @@ -515,9 +516,9 @@ static __kprobes void do_unoptimize_kprobes(struct list_head *free_list) | |||
| 515 | /* Ditto to do_optimize_kprobes */ | 516 | /* Ditto to do_optimize_kprobes */ |
| 516 | get_online_cpus(); | 517 | get_online_cpus(); |
| 517 | mutex_lock(&text_mutex); | 518 | mutex_lock(&text_mutex); |
| 518 | arch_unoptimize_kprobes(&unoptimizing_list, free_list); | 519 | arch_unoptimize_kprobes(&unoptimizing_list, &freeing_list); |
| 519 | /* Loop free_list for disarming */ | 520 | /* Loop free_list for disarming */ |
| 520 | list_for_each_entry_safe(op, tmp, free_list, list) { | 521 | list_for_each_entry_safe(op, tmp, &freeing_list, list) { |
| 521 | /* Disarm probes if marked disabled */ | 522 | /* Disarm probes if marked disabled */ |
| 522 | if (kprobe_disabled(&op->kp)) | 523 | if (kprobe_disabled(&op->kp)) |
| 523 | arch_disarm_kprobe(&op->kp); | 524 | arch_disarm_kprobe(&op->kp); |
| @@ -536,11 +537,11 @@ static __kprobes void do_unoptimize_kprobes(struct list_head *free_list) | |||
| 536 | } | 537 | } |
| 537 | 538 | ||
| 538 | /* Reclaim all kprobes on the free_list */ | 539 | /* Reclaim all kprobes on the free_list */ |
| 539 | static __kprobes void do_free_cleaned_kprobes(struct list_head *free_list) | 540 | static __kprobes void do_free_cleaned_kprobes(void) |
| 540 | { | 541 | { |
| 541 | struct optimized_kprobe *op, *tmp; | 542 | struct optimized_kprobe *op, *tmp; |
| 542 | 543 | ||
| 543 | list_for_each_entry_safe(op, tmp, free_list, list) { | 544 | list_for_each_entry_safe(op, tmp, &freeing_list, list) { |
| 544 | BUG_ON(!kprobe_unused(&op->kp)); | 545 | BUG_ON(!kprobe_unused(&op->kp)); |
| 545 | list_del_init(&op->list); | 546 | list_del_init(&op->list); |
| 546 | free_aggr_kprobe(&op->kp); | 547 | free_aggr_kprobe(&op->kp); |
| @@ -556,8 +557,6 @@ static __kprobes void kick_kprobe_optimizer(void) | |||
| 556 | /* Kprobe jump optimizer */ | 557 | /* Kprobe jump optimizer */ |
| 557 | static __kprobes void kprobe_optimizer(struct work_struct *work) | 558 | static __kprobes void kprobe_optimizer(struct work_struct *work) |
| 558 | { | 559 | { |
| 559 | LIST_HEAD(free_list); | ||
| 560 | |||
| 561 | mutex_lock(&kprobe_mutex); | 560 | mutex_lock(&kprobe_mutex); |
| 562 | /* Lock modules while optimizing kprobes */ | 561 | /* Lock modules while optimizing kprobes */ |
| 563 | mutex_lock(&module_mutex); | 562 | mutex_lock(&module_mutex); |
| @@ -566,7 +565,7 @@ static __kprobes void kprobe_optimizer(struct work_struct *work) | |||
| 566 | * Step 1: Unoptimize kprobes and collect cleaned (unused and disarmed) | 565 | * Step 1: Unoptimize kprobes and collect cleaned (unused and disarmed) |
| 567 | * kprobes before waiting for quiesence period. | 566 | * kprobes before waiting for quiesence period. |
| 568 | */ | 567 | */ |
| 569 | do_unoptimize_kprobes(&free_list); | 568 | do_unoptimize_kprobes(); |
| 570 | 569 | ||
| 571 | /* | 570 | /* |
| 572 | * Step 2: Wait for quiesence period to ensure all running interrupts | 571 | * Step 2: Wait for quiesence period to ensure all running interrupts |
| @@ -581,7 +580,7 @@ static __kprobes void kprobe_optimizer(struct work_struct *work) | |||
| 581 | do_optimize_kprobes(); | 580 | do_optimize_kprobes(); |
| 582 | 581 | ||
| 583 | /* Step 4: Free cleaned kprobes after quiesence period */ | 582 | /* Step 4: Free cleaned kprobes after quiesence period */ |
| 584 | do_free_cleaned_kprobes(&free_list); | 583 | do_free_cleaned_kprobes(); |
| 585 | 584 | ||
| 586 | mutex_unlock(&module_mutex); | 585 | mutex_unlock(&module_mutex); |
| 587 | mutex_unlock(&kprobe_mutex); | 586 | mutex_unlock(&kprobe_mutex); |
| @@ -723,8 +722,19 @@ static void __kprobes kill_optimized_kprobe(struct kprobe *p) | |||
| 723 | if (!list_empty(&op->list)) | 722 | if (!list_empty(&op->list)) |
| 724 | /* Dequeue from the (un)optimization queue */ | 723 | /* Dequeue from the (un)optimization queue */ |
| 725 | list_del_init(&op->list); | 724 | list_del_init(&op->list); |
| 726 | |||
| 727 | op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; | 725 | op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; |
| 726 | |||
| 727 | if (kprobe_unused(p)) { | ||
| 728 | /* Enqueue if it is unused */ | ||
| 729 | list_add(&op->list, &freeing_list); | ||
| 730 | /* | ||
| 731 | * Remove unused probes from the hash list. After waiting | ||
| 732 | * for synchronization, this probe is reclaimed. | ||
| 733 | * (reclaiming is done by do_free_cleaned_kprobes().) | ||
| 734 | */ | ||
| 735 | hlist_del_rcu(&op->kp.hlist); | ||
| 736 | } | ||
| 737 | |||
| 728 | /* Don't touch the code, because it is already freed. */ | 738 | /* Don't touch the code, because it is already freed. */ |
| 729 | arch_remove_optimized_kprobe(op); | 739 | arch_remove_optimized_kprobe(op); |
| 730 | } | 740 | } |
diff --git a/kernel/range.c b/kernel/range.c index eb911dbce267..322ea8e93e4b 100644 --- a/kernel/range.c +++ b/kernel/range.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #include <linux/kernel.h> | 4 | #include <linux/kernel.h> |
| 5 | #include <linux/init.h> | 5 | #include <linux/init.h> |
| 6 | #include <linux/sort.h> | 6 | #include <linux/sort.h> |
| 7 | 7 | #include <linux/string.h> | |
| 8 | #include <linux/range.h> | 8 | #include <linux/range.h> |
| 9 | 9 | ||
| 10 | int add_range(struct range *range, int az, int nr_range, u64 start, u64 end) | 10 | int add_range(struct range *range, int az, int nr_range, u64 start, u64 end) |
| @@ -32,9 +32,8 @@ int add_range_with_merge(struct range *range, int az, int nr_range, | |||
| 32 | if (start >= end) | 32 | if (start >= end) |
| 33 | return nr_range; | 33 | return nr_range; |
| 34 | 34 | ||
| 35 | /* Try to merge it with old one: */ | 35 | /* get new start/end: */ |
| 36 | for (i = 0; i < nr_range; i++) { | 36 | for (i = 0; i < nr_range; i++) { |
| 37 | u64 final_start, final_end; | ||
| 38 | u64 common_start, common_end; | 37 | u64 common_start, common_end; |
| 39 | 38 | ||
| 40 | if (!range[i].end) | 39 | if (!range[i].end) |
| @@ -45,14 +44,16 @@ int add_range_with_merge(struct range *range, int az, int nr_range, | |||
| 45 | if (common_start > common_end) | 44 | if (common_start > common_end) |
| 46 | continue; | 45 | continue; |
| 47 | 46 | ||
| 48 | final_start = min(range[i].start, start); | 47 | /* new start/end, will add it back at last */ |
| 49 | final_end = max(range[i].end, end); | 48 | start = min(range[i].start, start); |
| 49 | end = max(range[i].end, end); | ||
| 50 | 50 | ||
| 51 | /* clear it and add it back for further merge */ | 51 | memmove(&range[i], &range[i + 1], |
| 52 | range[i].start = 0; | 52 | (nr_range - (i + 1)) * sizeof(range[i])); |
| 53 | range[i].end = 0; | 53 | range[nr_range - 1].start = 0; |
| 54 | return add_range_with_merge(range, az, nr_range, | 54 | range[nr_range - 1].end = 0; |
| 55 | final_start, final_end); | 55 | nr_range--; |
| 56 | i--; | ||
| 56 | } | 57 | } |
| 57 | 58 | ||
| 58 | /* Need to add it: */ | 59 | /* Need to add it: */ |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 58453b8272fd..e8b335016c52 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -633,7 +633,19 @@ void wake_up_nohz_cpu(int cpu) | |||
| 633 | static inline bool got_nohz_idle_kick(void) | 633 | static inline bool got_nohz_idle_kick(void) |
| 634 | { | 634 | { |
| 635 | int cpu = smp_processor_id(); | 635 | int cpu = smp_processor_id(); |
| 636 | return idle_cpu(cpu) && test_bit(NOHZ_BALANCE_KICK, nohz_flags(cpu)); | 636 | |
| 637 | if (!test_bit(NOHZ_BALANCE_KICK, nohz_flags(cpu))) | ||
| 638 | return false; | ||
| 639 | |||
| 640 | if (idle_cpu(cpu) && !need_resched()) | ||
| 641 | return true; | ||
| 642 | |||
| 643 | /* | ||
| 644 | * We can't run Idle Load Balance on this CPU for this time so we | ||
| 645 | * cancel it and clear NOHZ_BALANCE_KICK | ||
| 646 | */ | ||
| 647 | clear_bit(NOHZ_BALANCE_KICK, nohz_flags(cpu)); | ||
| 648 | return false; | ||
| 637 | } | 649 | } |
| 638 | 650 | ||
| 639 | #else /* CONFIG_NO_HZ_COMMON */ | 651 | #else /* CONFIG_NO_HZ_COMMON */ |
| @@ -1393,8 +1405,9 @@ static void sched_ttwu_pending(void) | |||
| 1393 | 1405 | ||
| 1394 | void scheduler_ipi(void) | 1406 | void scheduler_ipi(void) |
| 1395 | { | 1407 | { |
| 1396 | if (llist_empty(&this_rq()->wake_list) && !got_nohz_idle_kick() | 1408 | if (llist_empty(&this_rq()->wake_list) |
| 1397 | && !tick_nohz_full_cpu(smp_processor_id())) | 1409 | && !tick_nohz_full_cpu(smp_processor_id()) |
| 1410 | && !got_nohz_idle_kick()) | ||
| 1398 | return; | 1411 | return; |
| 1399 | 1412 | ||
| 1400 | /* | 1413 | /* |
| @@ -1417,7 +1430,7 @@ void scheduler_ipi(void) | |||
| 1417 | /* | 1430 | /* |
| 1418 | * Check if someone kicked us for doing the nohz idle load balance. | 1431 | * Check if someone kicked us for doing the nohz idle load balance. |
| 1419 | */ | 1432 | */ |
| 1420 | if (unlikely(got_nohz_idle_kick() && !need_resched())) { | 1433 | if (unlikely(got_nohz_idle_kick())) { |
| 1421 | this_rq()->idle_balance = 1; | 1434 | this_rq()->idle_balance = 1; |
| 1422 | raise_softirq_irqoff(SCHED_SOFTIRQ); | 1435 | raise_softirq_irqoff(SCHED_SOFTIRQ); |
| 1423 | } | 1436 | } |
| @@ -4745,7 +4758,7 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) | |||
| 4745 | */ | 4758 | */ |
| 4746 | idle->sched_class = &idle_sched_class; | 4759 | idle->sched_class = &idle_sched_class; |
| 4747 | ftrace_graph_init_idle_task(idle, cpu); | 4760 | ftrace_graph_init_idle_task(idle, cpu); |
| 4748 | vtime_init_idle(idle); | 4761 | vtime_init_idle(idle, cpu); |
| 4749 | #if defined(CONFIG_SMP) | 4762 | #if defined(CONFIG_SMP) |
| 4750 | sprintf(idle->comm, "%s/%d", INIT_TASK_COMM, cpu); | 4763 | sprintf(idle->comm, "%s/%d", INIT_TASK_COMM, cpu); |
| 4751 | #endif | 4764 | #endif |
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index cc2dc3eea8a3..b5ccba22603b 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c | |||
| @@ -747,17 +747,17 @@ void arch_vtime_task_switch(struct task_struct *prev) | |||
| 747 | 747 | ||
| 748 | write_seqlock(¤t->vtime_seqlock); | 748 | write_seqlock(¤t->vtime_seqlock); |
| 749 | current->vtime_snap_whence = VTIME_SYS; | 749 | current->vtime_snap_whence = VTIME_SYS; |
| 750 | current->vtime_snap = sched_clock(); | 750 | current->vtime_snap = sched_clock_cpu(smp_processor_id()); |
| 751 | write_sequnlock(¤t->vtime_seqlock); | 751 | write_sequnlock(¤t->vtime_seqlock); |
| 752 | } | 752 | } |
| 753 | 753 | ||
| 754 | void vtime_init_idle(struct task_struct *t) | 754 | void vtime_init_idle(struct task_struct *t, int cpu) |
| 755 | { | 755 | { |
| 756 | unsigned long flags; | 756 | unsigned long flags; |
| 757 | 757 | ||
| 758 | write_seqlock_irqsave(&t->vtime_seqlock, flags); | 758 | write_seqlock_irqsave(&t->vtime_seqlock, flags); |
| 759 | t->vtime_snap_whence = VTIME_SYS; | 759 | t->vtime_snap_whence = VTIME_SYS; |
| 760 | t->vtime_snap = sched_clock(); | 760 | t->vtime_snap = sched_clock_cpu(cpu); |
| 761 | write_sequnlock_irqrestore(&t->vtime_seqlock, flags); | 761 | write_sequnlock_irqrestore(&t->vtime_seqlock, flags); |
| 762 | } | 762 | } |
| 763 | 763 | ||
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 0c739423b0f9..b4c245580b79 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -698,10 +698,6 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |||
| 698 | 698 | ||
| 699 | bc->event_handler = tick_handle_oneshot_broadcast; | 699 | bc->event_handler = tick_handle_oneshot_broadcast; |
| 700 | 700 | ||
| 701 | /* Take the do_timer update */ | ||
| 702 | if (!tick_nohz_full_cpu(cpu)) | ||
| 703 | tick_do_timer_cpu = cpu; | ||
| 704 | |||
| 705 | /* | 701 | /* |
| 706 | * We must be careful here. There might be other CPUs | 702 | * We must be careful here. There might be other CPUs |
| 707 | * waiting for periodic broadcast. We need to set the | 703 | * waiting for periodic broadcast. We need to set the |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index f4208138fbf4..0cf1c1453181 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -306,7 +306,7 @@ static int __cpuinit tick_nohz_cpu_down_callback(struct notifier_block *nfb, | |||
| 306 | * we can't safely shutdown that CPU. | 306 | * we can't safely shutdown that CPU. |
| 307 | */ | 307 | */ |
| 308 | if (have_nohz_full_mask && tick_do_timer_cpu == cpu) | 308 | if (have_nohz_full_mask && tick_do_timer_cpu == cpu) |
| 309 | return -EINVAL; | 309 | return NOTIFY_BAD; |
| 310 | break; | 310 | break; |
| 311 | } | 311 | } |
| 312 | return NOTIFY_OK; | 312 | return NOTIFY_OK; |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 1ad92b46753e..081b4d654ed6 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -1621,6 +1621,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | |||
| 1621 | { | 1621 | { |
| 1622 | return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ); | 1622 | return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ); |
| 1623 | } | 1623 | } |
| 1624 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | ||
| 1624 | 1625 | ||
| 1625 | /** | 1626 | /** |
| 1626 | * walk_memory_range - walks through all mem sections in [start_pfn, end_pfn) | 1627 | * walk_memory_range - walks through all mem sections in [start_pfn, end_pfn) |
| @@ -1634,7 +1635,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | |||
| 1634 | * | 1635 | * |
| 1635 | * Returns the return value of func. | 1636 | * Returns the return value of func. |
| 1636 | */ | 1637 | */ |
| 1637 | static int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn, | 1638 | int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn, |
| 1638 | void *arg, int (*func)(struct memory_block *, void *)) | 1639 | void *arg, int (*func)(struct memory_block *, void *)) |
| 1639 | { | 1640 | { |
| 1640 | struct memory_block *mem = NULL; | 1641 | struct memory_block *mem = NULL; |
| @@ -1671,24 +1672,7 @@ static int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn, | |||
| 1671 | return 0; | 1672 | return 0; |
| 1672 | } | 1673 | } |
| 1673 | 1674 | ||
| 1674 | /** | 1675 | #ifdef CONFIG_MEMORY_HOTREMOVE |
| 1675 | * offline_memory_block_cb - callback function for offlining memory block | ||
| 1676 | * @mem: the memory block to be offlined | ||
| 1677 | * @arg: buffer to hold error msg | ||
| 1678 | * | ||
| 1679 | * Always return 0, and put the error msg in arg if any. | ||
| 1680 | */ | ||
| 1681 | static int offline_memory_block_cb(struct memory_block *mem, void *arg) | ||
| 1682 | { | ||
| 1683 | int *ret = arg; | ||
| 1684 | int error = offline_memory_block(mem); | ||
| 1685 | |||
| 1686 | if (error != 0 && *ret == 0) | ||
| 1687 | *ret = error; | ||
| 1688 | |||
| 1689 | return 0; | ||
| 1690 | } | ||
| 1691 | |||
| 1692 | static int is_memblock_offlined_cb(struct memory_block *mem, void *arg) | 1676 | static int is_memblock_offlined_cb(struct memory_block *mem, void *arg) |
| 1693 | { | 1677 | { |
| 1694 | int ret = !is_memblock_offlined(mem); | 1678 | int ret = !is_memblock_offlined(mem); |
| @@ -1814,54 +1798,22 @@ void try_offline_node(int nid) | |||
| 1814 | } | 1798 | } |
| 1815 | EXPORT_SYMBOL(try_offline_node); | 1799 | EXPORT_SYMBOL(try_offline_node); |
| 1816 | 1800 | ||
| 1817 | int __ref remove_memory(int nid, u64 start, u64 size) | 1801 | void __ref remove_memory(int nid, u64 start, u64 size) |
| 1818 | { | 1802 | { |
| 1819 | unsigned long start_pfn, end_pfn; | 1803 | int ret; |
| 1820 | int ret = 0; | ||
| 1821 | int retry = 1; | ||
| 1822 | |||
| 1823 | start_pfn = PFN_DOWN(start); | ||
| 1824 | end_pfn = PFN_UP(start + size - 1); | ||
| 1825 | |||
| 1826 | /* | ||
| 1827 | * When CONFIG_MEMCG is on, one memory block may be used by other | ||
| 1828 | * blocks to store page cgroup when onlining pages. But we don't know | ||
| 1829 | * in what order pages are onlined. So we iterate twice to offline | ||
| 1830 | * memory: | ||
| 1831 | * 1st iterate: offline every non primary memory block. | ||
| 1832 | * 2nd iterate: offline primary (i.e. first added) memory block. | ||
| 1833 | */ | ||
| 1834 | repeat: | ||
| 1835 | walk_memory_range(start_pfn, end_pfn, &ret, | ||
| 1836 | offline_memory_block_cb); | ||
| 1837 | if (ret) { | ||
| 1838 | if (!retry) | ||
| 1839 | return ret; | ||
| 1840 | |||
| 1841 | retry = 0; | ||
| 1842 | ret = 0; | ||
| 1843 | goto repeat; | ||
| 1844 | } | ||
| 1845 | 1804 | ||
| 1846 | lock_memory_hotplug(); | 1805 | lock_memory_hotplug(); |
| 1847 | 1806 | ||
| 1848 | /* | 1807 | /* |
| 1849 | * we have offlined all memory blocks like this: | 1808 | * All memory blocks must be offlined before removing memory. Check |
| 1850 | * 1. lock memory hotplug | 1809 | * whether all memory blocks in question are offline and trigger a BUG() |
| 1851 | * 2. offline a memory block | 1810 | * if this is not the case. |
| 1852 | * 3. unlock memory hotplug | ||
| 1853 | * | ||
| 1854 | * repeat step1-3 to offline the memory block. All memory blocks | ||
| 1855 | * must be offlined before removing memory. But we don't hold the | ||
| 1856 | * lock in the whole operation. So we should check whether all | ||
| 1857 | * memory blocks are offlined. | ||
| 1858 | */ | 1811 | */ |
| 1859 | 1812 | ret = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), NULL, | |
| 1860 | ret = walk_memory_range(start_pfn, end_pfn, NULL, | ||
| 1861 | is_memblock_offlined_cb); | 1813 | is_memblock_offlined_cb); |
| 1862 | if (ret) { | 1814 | if (ret) { |
| 1863 | unlock_memory_hotplug(); | 1815 | unlock_memory_hotplug(); |
| 1864 | return ret; | 1816 | BUG(); |
| 1865 | } | 1817 | } |
| 1866 | 1818 | ||
| 1867 | /* remove memmap entry */ | 1819 | /* remove memmap entry */ |
| @@ -1872,17 +1824,6 @@ repeat: | |||
| 1872 | try_offline_node(nid); | 1824 | try_offline_node(nid); |
| 1873 | 1825 | ||
| 1874 | unlock_memory_hotplug(); | 1826 | unlock_memory_hotplug(); |
| 1875 | |||
| 1876 | return 0; | ||
| 1877 | } | 1827 | } |
| 1878 | #else | ||
| 1879 | int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | ||
| 1880 | { | ||
| 1881 | return -EINVAL; | ||
| 1882 | } | ||
| 1883 | int remove_memory(int nid, u64 start, u64 size) | ||
| 1884 | { | ||
| 1885 | return -EINVAL; | ||
| 1886 | } | ||
| 1887 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | ||
| 1888 | EXPORT_SYMBOL_GPL(remove_memory); | 1828 | EXPORT_SYMBOL_GPL(remove_memory); |
| 1829 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | ||
diff --git a/mm/slab_common.c b/mm/slab_common.c index ff3218a0f5e1..2d414508e9ec 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
| @@ -373,8 +373,10 @@ struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags) | |||
| 373 | { | 373 | { |
| 374 | int index; | 374 | int index; |
| 375 | 375 | ||
| 376 | if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE)) | 376 | if (size > KMALLOC_MAX_SIZE) { |
| 377 | WARN_ON_ONCE(!(flags & __GFP_NOWARN)); | ||
| 377 | return NULL; | 378 | return NULL; |
| 379 | } | ||
| 378 | 380 | ||
| 379 | if (size <= 192) { | 381 | if (size <= 192) { |
| 380 | if (!size) | 382 | if (!size) |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index bd8d46cca2b3..cccaf9c7a7bb 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
| @@ -58,6 +58,7 @@ enum { | |||
| 58 | CS420X_GPIO_23, | 58 | CS420X_GPIO_23, |
| 59 | CS420X_MBP101, | 59 | CS420X_MBP101, |
| 60 | CS420X_MBP81, | 60 | CS420X_MBP81, |
| 61 | CS420X_MBA42, | ||
| 61 | CS420X_AUTO, | 62 | CS420X_AUTO, |
| 62 | /* aliases */ | 63 | /* aliases */ |
| 63 | CS420X_IMAC27_122 = CS420X_GPIO_23, | 64 | CS420X_IMAC27_122 = CS420X_GPIO_23, |
| @@ -346,6 +347,7 @@ static const struct hda_model_fixup cs420x_models[] = { | |||
| 346 | { .id = CS420X_APPLE, .name = "apple" }, | 347 | { .id = CS420X_APPLE, .name = "apple" }, |
| 347 | { .id = CS420X_MBP101, .name = "mbp101" }, | 348 | { .id = CS420X_MBP101, .name = "mbp101" }, |
| 348 | { .id = CS420X_MBP81, .name = "mbp81" }, | 349 | { .id = CS420X_MBP81, .name = "mbp81" }, |
| 350 | { .id = CS420X_MBA42, .name = "mba42" }, | ||
| 349 | {} | 351 | {} |
| 350 | }; | 352 | }; |
| 351 | 353 | ||
| @@ -361,6 +363,7 @@ static const struct snd_pci_quirk cs420x_fixup_tbl[] = { | |||
| 361 | SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81), | 363 | SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81), |
| 362 | SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122), | 364 | SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122), |
| 363 | SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101), | 365 | SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101), |
| 366 | SND_PCI_QUIRK(0x106b, 0x5b00, "MacBookAir 4,2", CS420X_MBA42), | ||
| 364 | SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE), | 367 | SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE), |
| 365 | {} /* terminator */ | 368 | {} /* terminator */ |
| 366 | }; | 369 | }; |
| @@ -414,6 +417,20 @@ static const struct hda_pintbl mbp101_pincfgs[] = { | |||
| 414 | {} /* terminator */ | 417 | {} /* terminator */ |
| 415 | }; | 418 | }; |
| 416 | 419 | ||
| 420 | static const struct hda_pintbl mba42_pincfgs[] = { | ||
| 421 | { 0x09, 0x012b4030 }, /* HP */ | ||
| 422 | { 0x0a, 0x400000f0 }, | ||
| 423 | { 0x0b, 0x90100120 }, /* speaker */ | ||
| 424 | { 0x0c, 0x400000f0 }, | ||
| 425 | { 0x0d, 0x90a00110 }, /* mic */ | ||
| 426 | { 0x0e, 0x400000f0 }, | ||
| 427 | { 0x0f, 0x400000f0 }, | ||
| 428 | { 0x10, 0x400000f0 }, | ||
| 429 | { 0x12, 0x400000f0 }, | ||
| 430 | { 0x15, 0x400000f0 }, | ||
| 431 | {} /* terminator */ | ||
| 432 | }; | ||
| 433 | |||
| 417 | static void cs420x_fixup_gpio_13(struct hda_codec *codec, | 434 | static void cs420x_fixup_gpio_13(struct hda_codec *codec, |
| 418 | const struct hda_fixup *fix, int action) | 435 | const struct hda_fixup *fix, int action) |
| 419 | { | 436 | { |
| @@ -482,6 +499,12 @@ static const struct hda_fixup cs420x_fixups[] = { | |||
| 482 | .chained = true, | 499 | .chained = true, |
| 483 | .chain_id = CS420X_GPIO_13, | 500 | .chain_id = CS420X_GPIO_13, |
| 484 | }, | 501 | }, |
| 502 | [CS420X_MBA42] = { | ||
| 503 | .type = HDA_FIXUP_PINS, | ||
| 504 | .v.pins = mba42_pincfgs, | ||
| 505 | .chained = true, | ||
| 506 | .chain_id = CS420X_GPIO_13, | ||
| 507 | }, | ||
| 485 | }; | 508 | }; |
| 486 | 509 | ||
| 487 | static struct cs_spec *cs_alloc_spec(struct hda_codec *codec, int vendor_nid) | 510 | static struct cs_spec *cs_alloc_spec(struct hda_codec *codec, int vendor_nid) |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 02e22b4458d2..403010c9e82e 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -3483,6 +3483,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 3483 | SND_PCI_QUIRK(0x1028, 0x05ca, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 3483 | SND_PCI_QUIRK(0x1028, 0x05ca, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| 3484 | SND_PCI_QUIRK(0x1028, 0x05cb, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 3484 | SND_PCI_QUIRK(0x1028, 0x05cb, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| 3485 | SND_PCI_QUIRK(0x1028, 0x05de, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 3485 | SND_PCI_QUIRK(0x1028, 0x05de, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| 3486 | SND_PCI_QUIRK(0x1028, 0x05e0, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | ||
| 3486 | SND_PCI_QUIRK(0x1028, 0x05e9, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3487 | SND_PCI_QUIRK(0x1028, 0x05e9, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3487 | SND_PCI_QUIRK(0x1028, 0x05ea, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3488 | SND_PCI_QUIRK(0x1028, 0x05ea, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3488 | SND_PCI_QUIRK(0x1028, 0x05eb, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3489 | SND_PCI_QUIRK(0x1028, 0x05eb, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| @@ -3494,6 +3495,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 3494 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3495 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3495 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3496 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3496 | SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3497 | SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3498 | SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 3499 | SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 3497 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3500 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3498 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 3501 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
| 3499 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), | 3502 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), |
| @@ -3596,6 +3599,8 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | |||
| 3596 | {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"}, | 3599 | {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"}, |
| 3597 | {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"}, | 3600 | {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"}, |
| 3598 | {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"}, | 3601 | {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"}, |
| 3602 | {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"}, | ||
| 3603 | {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"}, | ||
| 3599 | {} | 3604 | {} |
| 3600 | }; | 3605 | }; |
| 3601 | 3606 | ||
| @@ -4275,6 +4280,7 @@ static const struct hda_model_fixup alc662_fixup_models[] = { | |||
| 4275 | {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"}, | 4280 | {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"}, |
| 4276 | {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"}, | 4281 | {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"}, |
| 4277 | {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"}, | 4282 | {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"}, |
| 4283 | {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"}, | ||
| 4278 | {} | 4284 | {} |
| 4279 | }; | 4285 | }; |
| 4280 | 4286 | ||
diff --git a/sound/usb/card.c b/sound/usb/card.c index 1a033177b83f..64952e2d3ed1 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
| @@ -147,14 +147,32 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int | |||
| 147 | return -EINVAL; | 147 | return -EINVAL; |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | alts = &iface->altsetting[0]; | ||
| 151 | altsd = get_iface_desc(alts); | ||
| 152 | |||
| 153 | /* | ||
| 154 | * Android with both accessory and audio interfaces enabled gets the | ||
| 155 | * interface numbers wrong. | ||
| 156 | */ | ||
| 157 | if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) || | ||
| 158 | chip->usb_id == USB_ID(0x18d1, 0x2d05)) && | ||
| 159 | interface == 0 && | ||
| 160 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC && | ||
| 161 | altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) { | ||
| 162 | interface = 2; | ||
| 163 | iface = usb_ifnum_to_if(dev, interface); | ||
| 164 | if (!iface) | ||
| 165 | return -EINVAL; | ||
| 166 | alts = &iface->altsetting[0]; | ||
| 167 | altsd = get_iface_desc(alts); | ||
| 168 | } | ||
| 169 | |||
| 150 | if (usb_interface_claimed(iface)) { | 170 | if (usb_interface_claimed(iface)) { |
| 151 | snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", | 171 | snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", |
| 152 | dev->devnum, ctrlif, interface); | 172 | dev->devnum, ctrlif, interface); |
| 153 | return -EINVAL; | 173 | return -EINVAL; |
| 154 | } | 174 | } |
| 155 | 175 | ||
| 156 | alts = &iface->altsetting[0]; | ||
| 157 | altsd = get_iface_desc(alts); | ||
| 158 | if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || | 176 | if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || |
| 159 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && | 177 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && |
| 160 | altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { | 178 | altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index e5c7f9f20fdd..d5438083fd6a 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
| @@ -885,6 +885,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, | |||
| 885 | 885 | ||
| 886 | case USB_ID(0x046d, 0x0808): | 886 | case USB_ID(0x046d, 0x0808): |
| 887 | case USB_ID(0x046d, 0x0809): | 887 | case USB_ID(0x046d, 0x0809): |
| 888 | case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ | ||
| 888 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ | 889 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ |
| 889 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ | 890 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ |
| 890 | case USB_ID(0x046d, 0x0991): | 891 | case USB_ID(0x046d, 0x0991): |
