Merge branch 'x86/numa' into x86-mm

Merge reason: Pick up x86-32 remap allocator cleanup changes - 14
commits, 3fe14ab541^..993ba1585c.

  3fe14ab541: x86-32, numa: Fix failure condition check in alloc_remap()
  993ba1585c: x86-32, numa: Update remap allocator comments

Scheduled NUMA init 32/64bit unification changes depend on them.

Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
Tejun Heo 2011-05-02 14:08:43 +02:00
commit aff364860a
192 changed files with 1377 additions and 1014 deletions

View File

@ -206,8 +206,8 @@ laptops/
- directory with laptop related info and laptop driver documentation. - directory with laptop related info and laptop driver documentation.
ldm.txt ldm.txt
- a brief description of LDM (Windows Dynamic Disks). - a brief description of LDM (Windows Dynamic Disks).
leds-class.txt leds/
- documents LED handling under Linux. - directory with info about LED handling under Linux.
local_ops.txt local_ops.txt
- semantics and behavior of local atomic operations. - semantics and behavior of local atomic operations.
lockdep-design.txt lockdep-design.txt

View File

@ -40,7 +40,7 @@ What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-
Date: March 2010 Date: March 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile holds informations like button press of a button. A profile holds information like button
mappings, sensitivity, the colors of the 5 leds and light mappings, sensitivity, the colors of the 5 leds and light
effects. effects.
When read, these files return the respective profile. The When read, these files return the respective profile. The

View File

@ -33,7 +33,7 @@ Date: August 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_buttons holds informations about button layout. profile_buttons holds information about button layout.
When written, this file lets one write the respective profile When written, this file lets one write the respective profile
buttons back to the mouse. The data has to be 77 bytes long. buttons back to the mouse. The data has to be 77 bytes long.
The mouse will reject invalid data. The mouse will reject invalid data.
@ -47,7 +47,7 @@ Date: August 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_buttons holds informations about button layout. profile_buttons holds information about button layout.
When read, these files return the respective profile buttons. When read, these files return the respective profile buttons.
The returned data is 77 bytes in size. The returned data is 77 bytes in size.
This file is readonly. This file is readonly.
@ -58,7 +58,7 @@ Date: October 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_settings holds informations like resolution, sensitivity profile_settings holds information like resolution, sensitivity
and light effects. and light effects.
When written, this file lets one write the respective profile When written, this file lets one write the respective profile
settings back to the mouse. The data has to be 43 bytes long. settings back to the mouse. The data has to be 43 bytes long.
@ -73,7 +73,7 @@ Date: August 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_settings holds informations like resolution, sensitivity profile_settings holds information like resolution, sensitivity
and light effects. and light effects.
When read, these files return the respective profile settings. When read, these files return the respective profile settings.
The returned data is 43 bytes in size. The returned data is 43 bytes in size.

View File

@ -52,7 +52,7 @@ Date: January 2011
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_buttons holds informations about button layout. profile_buttons holds information about button layout.
When written, this file lets one write the respective profile When written, this file lets one write the respective profile
buttons back to the mouse. The data has to be 23 bytes long. buttons back to the mouse. The data has to be 23 bytes long.
The mouse will reject invalid data. The mouse will reject invalid data.
@ -66,7 +66,7 @@ Date: January 2011
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_buttons holds informations about button layout. profile_buttons holds information about button layout.
When read, these files return the respective profile buttons. When read, these files return the respective profile buttons.
The returned data is 23 bytes in size. The returned data is 23 bytes in size.
This file is readonly. This file is readonly.
@ -77,7 +77,7 @@ Date: January 2011
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_settings holds informations like resolution, sensitivity profile_settings holds information like resolution, sensitivity
and light effects. and light effects.
When written, this file lets one write the respective profile When written, this file lets one write the respective profile
settings back to the mouse. The data has to be 16 bytes long. settings back to the mouse. The data has to be 16 bytes long.
@ -92,7 +92,7 @@ Date: January 2011
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_settings holds informations like resolution, sensitivity profile_settings holds information like resolution, sensitivity
and light effects. and light effects.
When read, these files return the respective profile settings. When read, these files return the respective profile settings.
The returned data is 16 bytes in size. The returned data is 16 bytes in size.

View File

@ -39,7 +39,7 @@ Date: August 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_settings holds informations like resolution, sensitivity profile_settings holds information like resolution, sensitivity
and light effects. and light effects.
When written, this file lets one write the respective profile When written, this file lets one write the respective profile
settings back to the mouse. The data has to be 13 bytes long. settings back to the mouse. The data has to be 13 bytes long.
@ -54,7 +54,7 @@ Date: August 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_settings holds informations like resolution, sensitivity profile_settings holds information like resolution, sensitivity
and light effects. and light effects.
When read, these files return the respective profile settings. When read, these files return the respective profile settings.
The returned data is 13 bytes in size. The returned data is 13 bytes in size.
@ -66,7 +66,7 @@ Date: August 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_buttons holds informations about button layout. profile_buttons holds information about button layout.
When written, this file lets one write the respective profile When written, this file lets one write the respective profile
buttons back to the mouse. The data has to be 19 bytes long. buttons back to the mouse. The data has to be 19 bytes long.
The mouse will reject invalid data. The mouse will reject invalid data.
@ -80,7 +80,7 @@ Date: August 2010
Contact: Stefan Achatz <erazor_de@users.sourceforge.net> Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
Description: The mouse can store 5 profiles which can be switched by the Description: The mouse can store 5 profiles which can be switched by the
press of a button. A profile is split in settings and buttons. press of a button. A profile is split in settings and buttons.
profile_buttons holds informations about button layout. profile_buttons holds information about button layout.
When read, these files return the respective profile buttons. When read, these files return the respective profile buttons.
The returned data is 19 bytes in size. The returned data is 19 bytes in size.
This file is readonly. This file is readonly.

View File

@ -27,7 +27,7 @@ KernelVersion: 2.6.20
Contact: "Corentin Chary" <corentincj@iksaif.net> Contact: "Corentin Chary" <corentincj@iksaif.net>
Description: Description:
Some models like the W1N have a LED display that can be Some models like the W1N have a LED display that can be
used to display several informations. used to display several items of information.
To control the LED display, use the following : To control the LED display, use the following :
echo 0x0T000DDD > /sys/devices/platform/asus_laptop/ echo 0x0T000DDD > /sys/devices/platform/asus_laptop/
where T control the 3 letters display, and DDD the 3 digits display. where T control the 3 letters display, and DDD the 3 digits display.

View File

@ -110,22 +110,22 @@ university server with various users - students, professors, system
tasks etc. The resource planning for this server could be along the tasks etc. The resource planning for this server could be along the
following lines: following lines:
CPU : Top cpuset CPU : "Top cpuset"
/ \ / \
CPUSet1 CPUSet2 CPUSet1 CPUSet2
| | | |
(Profs) (Students) (Professors) (Students)
In addition (system tasks) are attached to topcpuset (so In addition (system tasks) are attached to topcpuset (so
that they can run anywhere) with a limit of 20% that they can run anywhere) with a limit of 20%
Memory : Professors (50%), students (30%), system (20%) Memory : Professors (50%), Students (30%), system (20%)
Disk : Prof (50%), students (30%), system (20%) Disk : Professors (50%), Students (30%), system (20%)
Network : WWW browsing (20%), Network File System (60%), others (20%) Network : WWW browsing (20%), Network File System (60%), others (20%)
/ \ / \
Prof (15%) students (5%) Professors (15%) students (5%)
Browsers like Firefox/Lynx go into the WWW network class, while (k)nfsd go Browsers like Firefox/Lynx go into the WWW network class, while (k)nfsd go
into NFS network class. into NFS network class.

View File

@ -138,7 +138,7 @@ and properties to be present. This will be described in detail in
section III, but, for example, the kernel does not require you to section III, but, for example, the kernel does not require you to
create a node for every PCI device in the system. It is a requirement create a node for every PCI device in the system. It is a requirement
to have a node for PCI host bridges in order to provide interrupt to have a node for PCI host bridges in order to provide interrupt
routing informations and memory/IO ranges, among others. It is also routing information and memory/IO ranges, among others. It is also
recommended to define nodes for on chip devices and other buses that recommended to define nodes for on chip devices and other buses that
don't specifically fit in an existing OF specification. This creates a don't specifically fit in an existing OF specification. This creates a
great flexibility in the way the kernel can then probe those and match great flexibility in the way the kernel can then probe those and match
@ -385,7 +385,7 @@ struct boot_param_header {
among others, by kexec. If you are on an SMP system, this value among others, by kexec. If you are on an SMP system, this value
should match the content of the "reg" property of the CPU node in should match the content of the "reg" property of the CPU node in
the device-tree corresponding to the CPU calling the kernel entry the device-tree corresponding to the CPU calling the kernel entry
point (see further chapters for more informations on the required point (see further chapters for more information on the required
device-tree contents) device-tree contents)
- size_dt_strings - size_dt_strings
@ -553,7 +553,7 @@ looks like in practice.
This tree is almost a minimal tree. It pretty much contains the This tree is almost a minimal tree. It pretty much contains the
minimal set of required nodes and properties to boot a linux kernel; minimal set of required nodes and properties to boot a linux kernel;
that is, some basic model informations at the root, the CPUs, and the that is, some basic model information at the root, the CPUs, and the
physical memory layout. It also includes misc information passed physical memory layout. It also includes misc information passed
through /chosen, like in this example, the platform type (mandatory) through /chosen, like in this example, the platform type (mandatory)
and the kernel command line arguments (optional). and the kernel command line arguments (optional).

View File

@ -1,7 +1,7 @@
The DVB subsystem currently registers to the sysfs subsystem using the The DVB subsystem currently registers to the sysfs subsystem using the
"class_simple" interface. "class_simple" interface.
This means that only the basic informations like module loading parameters This means that only the basic information like module loading parameters
are presented through sysfs. Other things that might be interesting are are presented through sysfs. Other things that might be interesting are
currently *not* available. currently *not* available.

View File

@ -311,7 +311,7 @@ Total Correctable Errors count attribute file:
'ce_noinfo_count' 'ce_noinfo_count'
This attribute file displays the number of CEs that This attribute file displays the number of CEs that
have occurred wherewith no informations as to which DIMM slot have occurred wherewith no information as to which DIMM slot
is having errors. Memory is handicapped, but operational, is having errors. Memory is handicapped, but operational,
yet no information is available to indicate which slot yet no information is available to indicate which slot
the failing memory is in. This count field should be also the failing memory is in. This count field should be also

View File

@ -1832,15 +1832,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
perfmon on Intel CPUs instead of the perfmon on Intel CPUs instead of the
CPU specific event set. CPU specific event set.
oops=panic Always panic on oopses. Default is to just kill the process, oops=panic Always panic on oopses. Default is to just kill the
but there is a small probability of deadlocking the machine. process, but there is a small probability of
deadlocking the machine.
This will also cause panics on machine check exceptions. This will also cause panics on machine check exceptions.
Useful together with panic=30 to trigger a reboot. Useful together with panic=30 to trigger a reboot.
OSS [HW,OSS] OSS [HW,OSS]
See Documentation/sound/oss/oss-parameters.txt See Documentation/sound/oss/oss-parameters.txt
panic= [KNL] Kernel behaviour on panic panic= [KNL] Kernel behaviour on panic: delay <timeout>
seconds before rebooting
Format: <timeout> Format: <timeout>
parkbd.port= [HW] Parallel port number the keyboard adapter is parkbd.port= [HW] Parallel port number the keyboard adapter is
@ -2343,6 +2345,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
softlockup_panic= softlockup_panic=
[KNL] Should the soft-lockup detector generate panics. [KNL] Should the soft-lockup detector generate panics.
Format: <integer>
sonypi.*= [HW] Sony Programmable I/O Control Device driver sonypi.*= [HW] Sony Programmable I/O Control Device driver
See Documentation/sonypi.txt See Documentation/sonypi.txt
@ -2475,8 +2478,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
topology= [S390] topology= [S390]
Format: {off | on} Format: {off | on}
Specify if the kernel should make use of the cpu Specify if the kernel should make use of the cpu
topology informations if the hardware supports these. topology information if the hardware supports this.
The scheduler will make use of these informations and The scheduler will make use of this information and
e.g. base its process migration decisions on it. e.g. base its process migration decisions on it.
Default is on. Default is on.
@ -2529,8 +2532,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
reported either. reported either.
unknown_nmi_panic unknown_nmi_panic
[X86] [X86] Cause panic on unknown NMI.
Set unknown_nmi_panic=1 early on boot.
usbcore.autosuspend= usbcore.autosuspend=
[USB] The autosuspend time delay (in seconds) used [USB] The autosuspend time delay (in seconds) used

View File

@ -11,6 +11,7 @@ with the difference that the orphan objects are not freed but only
reported via /sys/kernel/debug/kmemleak. A similar method is used by the reported via /sys/kernel/debug/kmemleak. A similar method is used by the
Valgrind tool (memcheck --leak-check) to detect the memory leaks in Valgrind tool (memcheck --leak-check) to detect the memory leaks in
user-space applications. user-space applications.
Kmemleak is supported on x86, arm, powerpc, sparc, sh, microblaze and tile.
Usage Usage
----- -----
@ -178,5 +179,4 @@ block doesn't need to be freed (some cases in the init_call functions),
the pointer is calculated by other methods than the usual container_of the pointer is calculated by other methods than the usual container_of
macro or the pointer is stored in a location not scanned by kmemleak. macro or the pointer is stored in a location not scanned by kmemleak.
Page allocations and ioremap are not tracked. Only the ARM and x86 Page allocations and ioremap are not tracked.
architectures are currently supported.

View File

@ -61,7 +61,7 @@ Usage
Hotkeys are also reported as input keys (like keyboards) you can check Hotkeys are also reported as input keys (like keyboards) you can check
which key are supported using "xev" under X11. which key are supported using "xev" under X11.
You can get informations on the version of your DSDT table by reading the You can get information on the version of your DSDT table by reading the
/sys/devices/platform/asus-laptop/infos entry. If you have a question or a /sys/devices/platform/asus-laptop/infos entry. If you have a question or a
bug report to do, please include the output of this entry. bug report to do, please include the output of this entry.
@ -178,7 +178,7 @@ LED display
----------- -----------
Some models like the W1N have a LED display that can be used to display Some models like the W1N have a LED display that can be used to display
several informations. several items of information.
LED display works for the following models: LED display works for the following models:
W1000N W1000N

View File

@ -0,0 +1,8 @@
leds-class.txt
- documents LED handling under Linux.
leds-lp3944.txt
- notes on how to use the leds-lp3944 driver.
leds-lp5521.txt
- notes on how to use the leds-lp5521 driver.
leds-lp5523.txt
- notes on how to use the leds-lp5523 driver.

View File

@ -95,4 +95,3 @@ There are a number of cases where a trigger might only be mappable to a
particular LED (ACPI?). The addition of triggers provided by the LED driver particular LED (ACPI?). The addition of triggers provided by the LED driver
should cover this option and be possible to add without breaking the should cover this option and be possible to add without breaking the
current interface. current interface.

View File

@ -72,7 +72,7 @@ folder:
# fragmentation gw_sel_class vis_mode # fragmentation gw_sel_class vis_mode
There is a special folder for debugging informations: There is a special folder for debugging information:
# ls /sys/kernel/debug/batman_adv/bat0/ # ls /sys/kernel/debug/batman_adv/bat0/
# gateways socket transtable_global vis_data # gateways socket transtable_global vis_data

View File

@ -2273,7 +2273,7 @@ IP forwarding is on.
There is a lot of useful info in here best found by going in & having a look around, There is a lot of useful info in here best found by going in & having a look around,
so I'll take you through some entries I consider important. so I'll take you through some entries I consider important.
All the processes running on the machine have there own entry defined by All the processes running on the machine have their own entry defined by
/proc/<pid> /proc/<pid>
So lets have a look at the init process So lets have a look at the init process
cd /proc/1 cd /proc/1

View File

@ -1,8 +1,7 @@
Each CPU has a "base" scheduling domain (struct sched_domain). These are Each CPU has a "base" scheduling domain (struct sched_domain). The domain
accessed via cpu_sched_domain(i) and this_sched_domain() macros. The domain
hierarchy is built from these base domains via the ->parent pointer. ->parent hierarchy is built from these base domains via the ->parent pointer. ->parent
MUST be NULL terminated, and domain structures should be per-CPU as they MUST be NULL terminated, and domain structures should be per-CPU as they are
are locklessly updated. locklessly updated.
Each scheduling domain spans a number of CPUs (stored in the ->span field). Each scheduling domain spans a number of CPUs (stored in the ->span field).
A domain's span MUST be a superset of it child's span (this restriction could A domain's span MUST be a superset of it child's span (this restriction could
@ -26,11 +25,26 @@ is treated as one entity. The load of a group is defined as the sum of the
load of each of its member CPUs, and only when the load of a group becomes load of each of its member CPUs, and only when the load of a group becomes
out of balance are tasks moved between groups. out of balance are tasks moved between groups.
In kernel/sched.c, rebalance_tick is run periodically on each CPU. This In kernel/sched.c, trigger_load_balance() is run periodically on each CPU
function takes its CPU's base sched domain and checks to see if has reached through scheduler_tick(). It raises a softirq after the next regularly scheduled
its rebalance interval. If so, then it will run load_balance on that domain. rebalancing event for the current runqueue has arrived. The actual load
rebalance_tick then checks the parent sched_domain (if it exists), and the balancing workhorse, run_rebalance_domains()->rebalance_domains(), is then run
parent of the parent and so forth. in softirq context (SCHED_SOFTIRQ).
The latter function takes two arguments: the current CPU and whether it was idle
at the time the scheduler_tick() happened and iterates over all sched domains
our CPU is on, starting from its base domain and going up the ->parent chain.
While doing that, it checks to see if the current domain has exhausted its
rebalance interval. If so, it runs load_balance() on that domain. It then checks
the parent sched_domain (if it exists), and the parent of the parent and so
forth.
Initially, load_balance() finds the busiest group in the current sched domain.
If it succeeds, it looks for the busiest runqueue of all the CPUs' runqueues in
that group. If it manages to find such a runqueue, it locks both our initial
CPU's runqueue and the newly found busiest one and starts moving tasks from it
to our runqueue. The exact number of tasks amounts to an imbalance previously
computed while iterating over this sched domain's groups.
*** Implementing sched domains *** *** Implementing sched domains ***
The "base" domain will "span" the first level of the hierarchy. In the case The "base" domain will "span" the first level of the hierarchy. In the case

View File

@ -285,7 +285,7 @@ from the driver.
7. Profiling information 7. Profiling information
This driver does not provide profiling informations as did its predecessors. This driver does not provide profiling information as did its predecessors.
This feature was not this useful and added complexity to the code. This feature was not this useful and added complexity to the code.
As the driver code got more complex, I have decided to remove everything As the driver code got more complex, I have decided to remove everything
that didn't seem actually useful. that didn't seem actually useful.

View File

@ -2229,7 +2229,7 @@ Proc interfaces (/proc/asound)
/proc/asound/card#/pcm#[cp]/oss /proc/asound/card#/pcm#[cp]/oss
------------------------------- -------------------------------
String "erase" - erase all additional informations about OSS applications String "erase" - erase all additional information about OSS applications
String "<app_name> <fragments> <fragment_size> [<options>]" String "<app_name> <fragments> <fragment_size> [<options>]"
<app_name> - name of application with (higher priority) or without path <app_name> - name of application with (higher priority) or without path

View File

@ -1,10 +1,10 @@
Driver Driver
------ ------
Informations about Audio Excel DSP 16 driver can be found in the source Information about Audio Excel DSP 16 driver can be found in the source
file aedsp16.c file aedsp16.c
Please, read the head of the source before using it. It contain useful Please, read the head of the source before using it. It contain useful
informations. information.
Configuration Configuration
------------- -------------
@ -68,7 +68,7 @@ Sound cards supported
This driver supports the SC-6000 and SC-6600 based Gallant's sound card. This driver supports the SC-6000 and SC-6600 based Gallant's sound card.
It don't support the Audio Excel DSP 16 III (try the SC-6600 code). It don't support the Audio Excel DSP 16 III (try the SC-6600 code).
I'm working on the III version of the card: if someone have useful I'm working on the III version of the card: if someone have useful
informations about it, please let me know. information about it, please let me know.
For all the non-supported audio cards, you have to boot MS-DOS (or WIN95) For all the non-supported audio cards, you have to boot MS-DOS (or WIN95)
activating the audio card with the MS-DOS device driver, then you have to activating the audio card with the MS-DOS device driver, then you have to
<ctrl>-<alt>-<del> and boot Linux. <ctrl>-<alt>-<del> and boot Linux.

View File

@ -5,7 +5,7 @@ FIRST OF ALL
============ ============
This code references YAMAHA's sample codes and data sheets. This code references YAMAHA's sample codes and data sheets.
I respect and thank for all people they made open the informations I respect and thank for all people they made open the information
about YMF7xx cards. about YMF7xx cards.
And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s

View File

@ -1,5 +1,5 @@
Note: "modinfo <module>" prints various informations about a kernel Note: "modinfo <module>" prints various information about a kernel
module, among them a complete and up-to-date list of insmod options. module, among them a complete and up-to-date list of insmod options.
This list tends to be outdated because it is updated manually ... This list tends to be outdated because it is updated manually ...

View File

@ -8,7 +8,7 @@ completely by the bt8xx chip, which is common on all boards. But
sound is handled in slightly different ways on each board. sound is handled in slightly different ways on each board.
To handle the grabber boards correctly, there is a array tvcards[] in To handle the grabber boards correctly, there is a array tvcards[] in
bttv-cards.c, which holds the informations required for each board. bttv-cards.c, which holds the information required for each board.
Sound will work only, if the correct entry is used (for video it often Sound will work only, if the correct entry is used (for video it often
makes no difference). The bttv driver prints a line to the kernel makes no difference). The bttv driver prints a line to the kernel
log, telling which card type is used. Like this one: log, telling which card type is used. Like this one:

View File

@ -191,10 +191,10 @@ Syntax: <n>
Description: Debugging information level, from 0 to 3: Description: Debugging information level, from 0 to 3:
0 = none (use carefully) 0 = none (use carefully)
1 = critical errors 1 = critical errors
2 = significant informations 2 = significant information
3 = more verbose messages 3 = more verbose messages
Level 3 is useful for testing only, when only one device Level 3 is useful for testing only, when only one device
is used at the same time. It also shows some more informations is used at the same time. It also shows some more information
about the hardware being detected. This module parameter can be about the hardware being detected. This module parameter can be
changed at runtime thanks to the /sys filesystem interface. changed at runtime thanks to the /sys filesystem interface.
Default: 2 Default: 2

View File

@ -214,10 +214,10 @@ Syntax: <n>
Description: Debugging information level, from 0 to 3: Description: Debugging information level, from 0 to 3:
0 = none (use carefully) 0 = none (use carefully)
1 = critical errors 1 = critical errors
2 = significant informations 2 = significant information
3 = more verbose messages 3 = more verbose messages
Level 3 is useful for testing only. It also shows some more Level 3 is useful for testing only. It also shows some more
informations about the hardware being detected. information about the hardware being detected.
This parameter can be changed at runtime thanks to the /sys This parameter can be changed at runtime thanks to the /sys
filesystem interface. filesystem interface.
Default: 2 Default: 2

View File

@ -413,7 +413,7 @@ Syntax: <n>
Description: Debugging information level, from 0 to 6: Description: Debugging information level, from 0 to 6:
0 = none (use carefully) 0 = none (use carefully)
1 = critical errors 1 = critical errors
2 = significant informations 2 = significant information
3 = configuration or general messages 3 = configuration or general messages
4 = warnings 4 = warnings
5 = called functions 5 = called functions

View File

@ -181,10 +181,10 @@ Syntax: <n>
Description: Debugging information level, from 0 to 3: Description: Debugging information level, from 0 to 3:
0 = none (use carefully) 0 = none (use carefully)
1 = critical errors 1 = critical errors
2 = significant informations 2 = significant information
3 = more verbose messages 3 = more verbose messages
Level 3 is useful for testing only, when only one device Level 3 is useful for testing only, when only one device
is used at the same time. It also shows some more informations is used at the same time. It also shows some information
about the hardware being detected. This module parameter can be about the hardware being detected. This module parameter can be
changed at runtime thanks to the /sys filesystem interface. changed at runtime thanks to the /sys filesystem interface.
Default: 2 Default: 2
@ -261,7 +261,7 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
11. Credits 11. Credits
=========== ===========
- Informations about the chip internals needed to enable the I2C protocol have - Information about the chip internals needed to enable the I2C protocol have
been taken from the documentation of the ZC030x Video4Linux1 driver written been taken from the documentation of the ZC030x Video4Linux1 driver written
by Andrew Birkett <andy@nobugs.org>; by Andrew Birkett <andy@nobugs.org>;
- The initialization values of the ZC0301 controller connected to the PAS202BCB - The initialization values of the ZC0301 controller connected to the PAS202BCB

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 39 SUBLEVEL = 39
EXTRAVERSION = -rc1 EXTRAVERSION = -rc2
NAME = Flesh-Eating Bats with Fangs NAME = Flesh-Eating Bats with Fangs
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -386,8 +386,12 @@
#define __NR_fanotify_init 368 #define __NR_fanotify_init 368
#define __NR_fanotify_mark 369 #define __NR_fanotify_mark 369
#define __NR_prlimit64 370 #define __NR_prlimit64 370
#define __NR_name_to_handle_at 371
#define __NR_open_by_handle_at 372
#define __NR_clock_adjtime 373
#define __NR_syncfs 374
#define __NR_syscalls 371 #define __NR_syscalls 375
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__

View File

@ -10,6 +10,7 @@ CFLAGS_REMOVE_early_printk.o = -pg
CFLAGS_REMOVE_selfmod.o = -pg CFLAGS_REMOVE_selfmod.o = -pg
CFLAGS_REMOVE_heartbeat.o = -pg CFLAGS_REMOVE_heartbeat.o = -pg
CFLAGS_REMOVE_ftrace.o = -pg CFLAGS_REMOVE_ftrace.o = -pg
CFLAGS_REMOVE_process.o = -pg
endif endif
extra-y := head.o vmlinux.lds extra-y := head.o vmlinux.lds

View File

@ -51,6 +51,9 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
: "r" (parent), "r" (return_hooker) : "r" (parent), "r" (return_hooker)
); );
flush_dcache_range((u32)parent, (u32)parent + 4);
flush_icache_range((u32)parent, (u32)parent + 4);
if (unlikely(faulted)) { if (unlikely(faulted)) {
ftrace_graph_stop(); ftrace_graph_stop();
WARN_ON(1); WARN_ON(1);
@ -95,6 +98,9 @@ static int ftrace_modify_code(unsigned long addr, unsigned int value)
if (unlikely(faulted)) if (unlikely(faulted))
return -EFAULT; return -EFAULT;
flush_dcache_range(addr, addr + 4);
flush_icache_range(addr, addr + 4);
return 0; return 0;
} }
@ -195,8 +201,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
ret += ftrace_modify_code((unsigned long)&ftrace_caller, ret += ftrace_modify_code((unsigned long)&ftrace_caller,
MICROBLAZE_NOP); MICROBLAZE_NOP);
/* All changes are done - lets do caches consistent */
flush_icache();
return ret; return ret;
} }
@ -210,7 +214,6 @@ int ftrace_enable_ftrace_graph_caller(void)
old_jump = *(unsigned int *)ip; /* save jump over instruction */ old_jump = *(unsigned int *)ip; /* save jump over instruction */
ret = ftrace_modify_code(ip, MICROBLAZE_NOP); ret = ftrace_modify_code(ip, MICROBLAZE_NOP);
flush_icache();
pr_debug("%s: Replace instruction: 0x%x\n", __func__, old_jump); pr_debug("%s: Replace instruction: 0x%x\n", __func__, old_jump);
return ret; return ret;
@ -222,7 +225,6 @@ int ftrace_disable_ftrace_graph_caller(void)
unsigned long ip = (unsigned long)(&ftrace_call_graph); unsigned long ip = (unsigned long)(&ftrace_call_graph);
ret = ftrace_modify_code(ip, old_jump); ret = ftrace_modify_code(ip, old_jump);
flush_icache();
pr_debug("%s\n", __func__); pr_debug("%s\n", __func__);
return ret; return ret;

View File

@ -158,11 +158,11 @@ void __init init_IRQ(void)
for (i = 0; i < nr_irq; ++i) { for (i = 0; i < nr_irq; ++i) {
if (intr_type & (0x00000001 << i)) { if (intr_type & (0x00000001 << i)) {
irq_set_chip_and_handler_name(i, &intc_dev, irq_set_chip_and_handler_name(i, &intc_dev,
handle_edge_irq, intc_dev.name); handle_edge_irq, "edge");
irq_clear_status_flags(i, IRQ_LEVEL); irq_clear_status_flags(i, IRQ_LEVEL);
} else { } else {
irq_set_chip_and_handler_name(i, &intc_dev, irq_set_chip_and_handler_name(i, &intc_dev,
handle_level_irq, intc_dev.name); handle_level_irq, "level");
irq_set_status_flags(i, IRQ_LEVEL); irq_set_status_flags(i, IRQ_LEVEL);
} }
} }

View File

@ -375,3 +375,7 @@ ENTRY(sys_call_table)
.long sys_fanotify_init .long sys_fanotify_init
.long sys_fanotify_mark .long sys_fanotify_mark
.long sys_prlimit64 /* 370 */ .long sys_prlimit64 /* 370 */
.long sys_name_to_handle_at
.long sys_open_by_handle_at
.long sys_clock_adjtime
.long sys_syncfs

View File

@ -2,6 +2,12 @@
# Makefile # Makefile
# #
ifdef CONFIG_FUNCTION_TRACER
CFLAGS_REMOVE_ashldi3.o = -pg
CFLAGS_REMOVE_ashrdi3.o = -pg
CFLAGS_REMOVE_lshrdi3.o = -pg
endif
lib-y := memset.o lib-y := memset.o
ifeq ($(CONFIG_OPT_LIB_ASM),y) ifeq ($(CONFIG_OPT_LIB_ASM),y)

View File

@ -1,7 +1,7 @@
/* /*
* P1020 RDB Device Tree Source * P1020 RDB Device Tree Source
* *
* Copyright 2009 Freescale Semiconductor Inc. * Copyright 2009-2011 Freescale Semiconductor Inc.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@ -553,7 +553,7 @@
reg = <0 0xffe09000 0 0x1000>; reg = <0 0xffe09000 0 0x1000>;
bus-range = <0 255>; bus-range = <0 255>;
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000 ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc30000 0x0 0x10000>; 0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <16 2>; interrupts = <16 2>;
@ -580,8 +580,8 @@
#address-cells = <3>; #address-cells = <3>;
reg = <0 0xffe0a000 0 0x1000>; reg = <0 0xffe0a000 0 0x1000>;
bus-range = <0 255>; bus-range = <0 255>;
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000 ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>; 0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <16 2>; interrupts = <16 2>;
@ -590,8 +590,8 @@
#size-cells = <2>; #size-cells = <2>;
#address-cells = <3>; #address-cells = <3>;
device_type = "pci"; device_type = "pci";
ranges = <0x2000000 0x0 0xc0000000 ranges = <0x2000000 0x0 0x80000000
0x2000000 0x0 0xc0000000 0x2000000 0x0 0x80000000
0x0 0x20000000 0x0 0x20000000
0x1000000 0x0 0x0 0x1000000 0x0 0x0

View File

@ -1,7 +1,7 @@
/* /*
* P2020 RDB Device Tree Source * P2020 RDB Device Tree Source
* *
* Copyright 2009 Freescale Semiconductor Inc. * Copyright 2009-2011 Freescale Semiconductor Inc.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@ -537,7 +537,7 @@
reg = <0 0xffe09000 0 0x1000>; reg = <0 0xffe09000 0 0x1000>;
bus-range = <0 255>; bus-range = <0 255>;
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000 ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc30000 0x0 0x10000>; 0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <25 2>; interrupts = <25 2>;
@ -564,8 +564,8 @@
#address-cells = <3>; #address-cells = <3>;
reg = <0 0xffe0a000 0 0x1000>; reg = <0 0xffe0a000 0 0x1000>;
bus-range = <0 255>; bus-range = <0 255>;
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000 ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>; 0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <26 2>; interrupts = <26 2>;
@ -574,8 +574,8 @@
#size-cells = <2>; #size-cells = <2>;
#address-cells = <3>; #address-cells = <3>;
device_type = "pci"; device_type = "pci";
ranges = <0x2000000 0x0 0xc0000000 ranges = <0x2000000 0x0 0x80000000
0x2000000 0x0 0xc0000000 0x2000000 0x0 0x80000000
0x0 0x20000000 0x0 0x20000000
0x1000000 0x0 0x0 0x1000000 0x0 0x0

View File

@ -6,7 +6,7 @@
* This dts file allows core0 to have memory, l2, i2c, spi, gpio, dma1, usb, * This dts file allows core0 to have memory, l2, i2c, spi, gpio, dma1, usb,
* eth1, eth2, sdhc, crypto, global-util, pci0. * eth1, eth2, sdhc, crypto, global-util, pci0.
* *
* Copyright 2009 Freescale Semiconductor Inc. * Copyright 2009-2011 Freescale Semiconductor Inc.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@ -342,7 +342,7 @@
reg = <0 0xffe09000 0 0x1000>; reg = <0 0xffe09000 0 0x1000>;
bus-range = <0 255>; bus-range = <0 255>;
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000 ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc30000 0x0 0x10000>; 0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <25 2>; interrupts = <25 2>;

View File

@ -7,7 +7,7 @@
* *
* Please note to add "-b 1" for core1's dts compiling. * Please note to add "-b 1" for core1's dts compiling.
* *
* Copyright 2009 Freescale Semiconductor Inc. * Copyright 2009-2011 Freescale Semiconductor Inc.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@ -162,8 +162,8 @@
#address-cells = <3>; #address-cells = <3>;
reg = <0 0xffe0a000 0 0x1000>; reg = <0 0xffe0a000 0 0x1000>;
bus-range = <0 255>; bus-range = <0 255>;
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000 ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>; 0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <26 2>; interrupts = <26 2>;
@ -172,8 +172,8 @@
#size-cells = <2>; #size-cells = <2>;
#address-cells = <3>; #address-cells = <3>;
device_type = "pci"; device_type = "pci";
ranges = <0x2000000 0x0 0xc0000000 ranges = <0x2000000 0x0 0x80000000
0x2000000 0x0 0xc0000000 0x2000000 0x0 0x80000000
0x0 0x20000000 0x0 0x20000000
0x1000000 0x0 0x0 0x1000000 0x0 0x0

View File

@ -163,7 +163,7 @@ static void crash_kexec_prepare_cpus(int cpu)
} }
/* wait for all the CPUs to hit real mode but timeout if they don't come in */ /* wait for all the CPUs to hit real mode but timeout if they don't come in */
#ifdef CONFIG_PPC_STD_MMU_64 #if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
static void crash_kexec_wait_realmode(int cpu) static void crash_kexec_wait_realmode(int cpu)
{ {
unsigned int msecs; unsigned int msecs;
@ -188,6 +188,8 @@ static void crash_kexec_wait_realmode(int cpu)
} }
mb(); mb();
} }
#else
static inline void crash_kexec_wait_realmode(int cpu) {}
#endif #endif
/* /*
@ -344,9 +346,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
crash_save_cpu(regs, crashing_cpu); crash_save_cpu(regs, crashing_cpu);
crash_kexec_prepare_cpus(crashing_cpu); crash_kexec_prepare_cpus(crashing_cpu);
cpu_set(crashing_cpu, cpus_in_crash); cpu_set(crashing_cpu, cpus_in_crash);
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
crash_kexec_wait_realmode(crashing_cpu); crash_kexec_wait_realmode(crashing_cpu);
#endif
machine_kexec_mask_interrupts(); machine_kexec_mask_interrupts();

View File

@ -203,7 +203,7 @@ void __init free_unused_pacas(void)
{ {
int new_size; int new_size;
new_size = PAGE_ALIGN(sizeof(struct paca_struct) * num_possible_cpus()); new_size = PAGE_ALIGN(sizeof(struct paca_struct) * nr_cpu_ids);
if (new_size >= paca_size) if (new_size >= paca_size)
return; return;

View File

@ -509,6 +509,9 @@ void __init smp_setup_cpu_maps(void)
*/ */
cpu_init_thread_core_maps(nthreads); cpu_init_thread_core_maps(nthreads);
/* Now that possible cpus are set, set nr_cpu_ids for later use */
nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
free_unused_pacas(); free_unused_pacas();
} }
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */

View File

@ -431,7 +431,7 @@ virt_page_table_tlb_miss_fault:
* The thing is, we know that in normal circumstances, this is * The thing is, we know that in normal circumstances, this is
* always called as a second level tlb miss for SW load or as a first * always called as a second level tlb miss for SW load or as a first
* level TLB miss for HW load, so we should be able to peek at the * level TLB miss for HW load, so we should be able to peek at the
* relevant informations in the first exception frame in the PACA. * relevant information in the first exception frame in the PACA.
* *
* However, we do need to double check that, because we may just hit * However, we do need to double check that, because we may just hit
* a stray kernel pointer or a userland attack trying to hit those * a stray kernel pointer or a userland attack trying to hit those

View File

@ -46,7 +46,7 @@ config PPC_OF_BOOT_TRAMPOLINE
help help
Support from booting from Open Firmware or yaboot using an Support from booting from Open Firmware or yaboot using an
Open Firmware client interface. This enables the kernel to Open Firmware client interface. This enables the kernel to
communicate with open firmware to retrieve system informations communicate with open firmware to retrieve system information
such as the device tree. such as the device tree.
In case of doubt, say Y In case of doubt, say Y

View File

@ -378,7 +378,7 @@ static int __init pSeries_init_panel(void)
return 0; return 0;
} }
arch_initcall(pSeries_init_panel); machine_arch_initcall(pseries, pSeries_init_panel);
static int pseries_set_dabr(unsigned long dabr) static int pseries_set_dabr(unsigned long dabr)
{ {

View File

@ -112,10 +112,10 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
/* Fixup atomic count: it exited inside IRQ handler. */ /* Fixup atomic count: it exited inside IRQ handler. */
task_thread_info(paca[lcpu].__current)->preempt_count = 0; task_thread_info(paca[lcpu].__current)->preempt_count = 0;
#ifdef CONFIG_HOTPLUG_CPU
if (get_cpu_current_state(lcpu) == CPU_STATE_INACTIVE) if (get_cpu_current_state(lcpu) == CPU_STATE_INACTIVE)
goto out; goto out;
#endif
/* /*
* If the RTAS start-cpu token does not exist then presume the * If the RTAS start-cpu token does not exist then presume the
* cpu is already spinning. * cpu is already spinning.
@ -130,7 +130,9 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
return 0; return 0;
} }
#ifdef CONFIG_HOTPLUG_CPU
out: out:
#endif
return 1; return 1;
} }
@ -144,16 +146,15 @@ static void __devinit smp_xics_setup_cpu(int cpu)
vpa_init(cpu); vpa_init(cpu);
cpumask_clear_cpu(cpu, of_spin_mask); cpumask_clear_cpu(cpu, of_spin_mask);
#ifdef CONFIG_HOTPLUG_CPU
set_cpu_current_state(cpu, CPU_STATE_ONLINE); set_cpu_current_state(cpu, CPU_STATE_ONLINE);
set_default_offline_state(cpu); set_default_offline_state(cpu);
#endif
} }
#endif /* CONFIG_XICS */ #endif /* CONFIG_XICS */
static void __devinit smp_pSeries_kick_cpu(int nr) static void __devinit smp_pSeries_kick_cpu(int nr)
{ {
long rc;
unsigned long hcpuid;
BUG_ON(nr < 0 || nr >= NR_CPUS); BUG_ON(nr < 0 || nr >= NR_CPUS);
if (!smp_startup_cpu(nr)) if (!smp_startup_cpu(nr))
@ -165,16 +166,20 @@ static void __devinit smp_pSeries_kick_cpu(int nr)
* the processor will continue on to secondary_start * the processor will continue on to secondary_start
*/ */
paca[nr].cpu_start = 1; paca[nr].cpu_start = 1;
#ifdef CONFIG_HOTPLUG_CPU
set_preferred_offline_state(nr, CPU_STATE_ONLINE); set_preferred_offline_state(nr, CPU_STATE_ONLINE);
if (get_cpu_current_state(nr) == CPU_STATE_INACTIVE) { if (get_cpu_current_state(nr) == CPU_STATE_INACTIVE) {
long rc;
unsigned long hcpuid;
hcpuid = get_hard_smp_processor_id(nr); hcpuid = get_hard_smp_processor_id(nr);
rc = plpar_hcall_norets(H_PROD, hcpuid); rc = plpar_hcall_norets(H_PROD, hcpuid);
if (rc != H_SUCCESS) if (rc != H_SUCCESS)
printk(KERN_ERR "Error: Prod to wake up processor %d " printk(KERN_ERR "Error: Prod to wake up processor %d "
"Ret= %ld\n", nr, rc); "Ret= %ld\n", nr, rc);
} }
#endif
} }
static int smp_pSeries_cpu_bootable(unsigned int nr) static int smp_pSeries_cpu_bootable(unsigned int nr)

View File

@ -48,7 +48,7 @@ ASM_GENERIC_HEADERS += bitsperlong.h bug.h bugs.h
ASM_GENERIC_HEADERS += cputime.h current.h ASM_GENERIC_HEADERS += cputime.h current.h
ASM_GENERIC_HEADERS += device.h div64.h ASM_GENERIC_HEADERS += device.h div64.h
ASM_GENERIC_HEADERS += emergency-restart.h errno.h ASM_GENERIC_HEADERS += emergency-restart.h errno.h
ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h futex.h
ASM_GENERIC_HEADERS += hardirq.h hw_irq.h ASM_GENERIC_HEADERS += hardirq.h hw_irq.h
ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h
ASM_GENERIC_HEADERS += kdebug.h kmap_types.h ASM_GENERIC_HEADERS += kdebug.h kmap_types.h

View File

@ -1,143 +0,0 @@
/*
* linux/arch/unicore32/include/asm/futex.h
*
* Code specific to PKUnity SoC and UniCore ISA
*
* Copyright (C) 2001-2010 GUAN Xue-tao
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __UNICORE_FUTEX_H__
#define __UNICORE_FUTEX_H__
#ifdef __KERNEL__
#include <linux/futex.h>
#include <linux/preempt.h>
#include <linux/uaccess.h>
#include <linux/errno.h>
#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
__asm__ __volatile__( \
"1: ldw.u %1, [%2]\n" \
" " insn "\n" \
"2: stw.u %0, [%2]\n" \
" mov %0, #0\n" \
"3:\n" \
" .pushsection __ex_table,\"a\"\n" \
" .align 3\n" \
" .long 1b, 4f, 2b, 4f\n" \
" .popsection\n" \
" .pushsection .fixup,\"ax\"\n" \
"4: mov %0, %4\n" \
" b 3b\n" \
" .popsection" \
: "=&r" (ret), "=&r" (oldval) \
: "r" (uaddr), "r" (oparg), "Ir" (-EFAULT) \
: "cc", "memory")
static inline int
futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
{
int op = (encoded_op >> 28) & 7;
int cmp = (encoded_op >> 24) & 15;
int oparg = (encoded_op << 8) >> 20;
int cmparg = (encoded_op << 20) >> 20;
int oldval = 0, ret;
if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
oparg = 1 << oparg;
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
return -EFAULT;
pagefault_disable(); /* implies preempt_disable() */
switch (op) {
case FUTEX_OP_SET:
__futex_atomic_op("mov %0, %3", ret, oldval, uaddr, oparg);
break;
case FUTEX_OP_ADD:
__futex_atomic_op("add %0, %1, %3", ret, oldval, uaddr, oparg);
break;
case FUTEX_OP_OR:
__futex_atomic_op("or %0, %1, %3", ret, oldval, uaddr, oparg);
break;
case FUTEX_OP_ANDN:
__futex_atomic_op("and %0, %1, %3",
ret, oldval, uaddr, ~oparg);
break;
case FUTEX_OP_XOR:
__futex_atomic_op("xor %0, %1, %3", ret, oldval, uaddr, oparg);
break;
default:
ret = -ENOSYS;
}
pagefault_enable(); /* subsumes preempt_enable() */
if (!ret) {
switch (cmp) {
case FUTEX_OP_CMP_EQ:
ret = (oldval == cmparg);
break;
case FUTEX_OP_CMP_NE:
ret = (oldval != cmparg);
break;
case FUTEX_OP_CMP_LT:
ret = (oldval < cmparg);
break;
case FUTEX_OP_CMP_GE:
ret = (oldval >= cmparg);
break;
case FUTEX_OP_CMP_LE:
ret = (oldval <= cmparg);
break;
case FUTEX_OP_CMP_GT:
ret = (oldval > cmparg);
break;
default:
ret = -ENOSYS;
}
}
return ret;
}
static inline int
futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
{
int val;
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
return -EFAULT;
pagefault_disable(); /* implies preempt_disable() */
__asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n"
"1: ldw.u %0, [%3]\n"
" cmpxor.a %0, %1\n"
" bne 3f\n"
"2: stw.u %2, [%3]\n"
"3:\n"
" .pushsection __ex_table,\"a\"\n"
" .align 3\n"
" .long 1b, 4f, 2b, 4f\n"
" .popsection\n"
" .pushsection .fixup,\"ax\"\n"
"4: mov %0, %4\n"
" b 3b\n"
" .popsection"
: "=&r" (val)
: "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT)
: "cc", "memory");
pagefault_enable(); /* subsumes preempt_enable() */
return val;
}
#endif /* __KERNEL__ */
#endif /* __UNICORE_FUTEX_H__ */

View File

@ -23,16 +23,6 @@
#define PKUNITY_SDRAM_BASE 0x00000000 /* 0x00000000 - 0x7FFFFFFF 2GB */ #define PKUNITY_SDRAM_BASE 0x00000000 /* 0x00000000 - 0x7FFFFFFF 2GB */
#define PKUNITY_MMIO_BASE 0x80000000 /* 0x80000000 - 0xFFFFFFFF 2GB */ #define PKUNITY_MMIO_BASE 0x80000000 /* 0x80000000 - 0xFFFFFFFF 2GB */
/*
* PKUNITY Memory Map Addresses: 0x0D000000 - 0x0EFFFFFF (32MB)
* 0x0D000000 - 0x0DFFFFFF 16MB: for UVC
* 0x0E000000 - 0x0EFFFFFF 16MB: for UNIGFX
*/
#define PKUNITY_UVC_MMAP_BASE 0x0D000000
#define PKUNITY_UVC_MMAP_SIZE 0x01000000 /* 16MB */
#define PKUNITY_UNIGFX_MMAP_BASE 0x0E000000
#define PKUNITY_UNIGFX_MMAP_SIZE 0x01000000 /* 16MB */
/* /*
* PKUNITY System Bus Addresses (PCI): 0x80000000 - 0xBFFFFFFF (1GB) * PKUNITY System Bus Addresses (PCI): 0x80000000 - 0xBFFFFFFF (1GB)
* 0x80000000 - 0x8000000B 12B PCI Configuration regs * 0x80000000 - 0x8000000B 12B PCI Configuration regs

View File

@ -50,7 +50,6 @@ void puv3_pci_adjust_zones(unsigned long *size, unsigned long *holes);
/* kuser area */ /* kuser area */
#define KUSER_VECPAGE_BASE (KUSER_BASE + UL(0x3fff0000)) #define KUSER_VECPAGE_BASE (KUSER_BASE + UL(0x3fff0000))
#define KUSER_UNIGFX_BASE (PAGE_OFFSET + PKUNITY_UNIGFX_MMAP_BASE)
/* kuser_vecpage (0xbfff0000) is ro, and vectors page (0xffff0000) is rw */ /* kuser_vecpage (0xbfff0000) is ro, and vectors page (0xffff0000) is rw */
#define kuser_vecpage_to_vectors(x) ((x) - (KUSER_VECPAGE_BASE) \ #define kuser_vecpage_to_vectors(x) ((x) - (KUSER_VECPAGE_BASE) \
+ (VECTORS_BASE)) + (VECTORS_BASE))

View File

@ -99,11 +99,6 @@ static struct resource puv3_unigfx_resources[] = {
.end = io_v2p(PKUNITY_UNIGFX_BASE) + 0xfff, .end = io_v2p(PKUNITY_UNIGFX_BASE) + 0xfff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = {
.start = PKUNITY_UNIGFX_MMAP_BASE,
.end = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE,
.flags = IORESOURCE_MEM,
},
}; };
static struct resource puv3_rtc_resources[] = { static struct resource puv3_rtc_resources[] = {

View File

@ -88,11 +88,6 @@ static int puv3_rtc_setpie(struct device *dev, int enabled)
return 0; return 0;
} }
static int puv3_rtc_setfreq(struct device *dev, int freq)
{
return 0;
}
/* Time read/write */ /* Time read/write */
static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
@ -214,8 +209,6 @@ static const struct rtc_class_ops puv3_rtcops = {
.set_time = puv3_rtc_settime, .set_time = puv3_rtc_settime,
.read_alarm = puv3_rtc_getalarm, .read_alarm = puv3_rtc_getalarm,
.set_alarm = puv3_rtc_setalarm, .set_alarm = puv3_rtc_setalarm,
.irq_set_freq = puv3_rtc_setfreq,
.irq_set_state = puv3_rtc_setpie,
.proc = puv3_rtc_proc, .proc = puv3_rtc_proc,
}; };
@ -294,8 +287,6 @@ static int puv3_rtc_probe(struct platform_device *pdev)
puv3_rtc_enable(pdev, 1); puv3_rtc_enable(pdev, 1);
puv3_rtc_setfreq(&pdev->dev, 1);
/* register RTC and exit */ /* register RTC and exit */
rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops, rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops,

View File

@ -63,12 +63,6 @@ static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
* Standard memory resources * Standard memory resources
*/ */
static struct resource mem_res[] = { static struct resource mem_res[] = {
{
.name = "Video RAM",
.start = 0,
.end = 0,
.flags = IORESOURCE_MEM
},
{ {
.name = "Kernel text", .name = "Kernel text",
.start = 0, .start = 0,
@ -83,9 +77,8 @@ static struct resource mem_res[] = {
} }
}; };
#define video_ram mem_res[0] #define kernel_code mem_res[0]
#define kernel_code mem_res[1] #define kernel_data mem_res[1]
#define kernel_data mem_res[2]
/* /*
* These functions re-use the assembly code in head.S, which * These functions re-use the assembly code in head.S, which
@ -224,10 +217,6 @@ request_standard_resources(struct meminfo *mi)
kernel_data.end <= res->end) kernel_data.end <= res->end)
request_resource(res, &kernel_data); request_resource(res, &kernel_data);
} }
video_ram.start = PKUNITY_UNIGFX_MMAP_BASE;
video_ram.end = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE;
request_resource(&iomem_resource, &video_ram);
} }
static void (*init_machine)(void) __initdata; static void (*init_machine)(void) __initdata;

View File

@ -22,7 +22,6 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/hardirq.h> #include <linux/hardirq.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/uaccess.h>
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/unistd.h> #include <linux/unistd.h>

View File

@ -14,6 +14,7 @@
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/memory.h> #include <asm/memory.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/cache.h>
OUTPUT_ARCH(unicore32) OUTPUT_ARCH(unicore32)
ENTRY(stext) ENTRY(stext)
@ -29,7 +30,7 @@ SECTIONS
HEAD_TEXT_SECTION HEAD_TEXT_SECTION
INIT_TEXT_SECTION(PAGE_SIZE) INIT_TEXT_SECTION(PAGE_SIZE)
INIT_DATA_SECTION(16) INIT_DATA_SECTION(16)
PERCPU(PAGE_SIZE) PERCPU(L1_CACHE_BYTES, PAGE_SIZE)
__init_end = .; __init_end = .;
_stext = .; _stext = .;
@ -45,10 +46,10 @@ SECTIONS
_sdata = .; _sdata = .;
RO_DATA_SECTION(PAGE_SIZE) RO_DATA_SECTION(PAGE_SIZE)
RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
_edata = .; _edata = .;
EXCEPTION_TABLE(32) EXCEPTION_TABLE(L1_CACHE_BYTES)
NOTES NOTES
BSS_SECTION(0, 0, 0) BSS_SECTION(0, 0, 0)

View File

@ -338,15 +338,6 @@ void __init uc32_mm_memblock_reserve(void)
* and can only be in node 0. * and can only be in node 0.
*/ */
memblock_reserve(__pa(swapper_pg_dir), PTRS_PER_PGD * sizeof(pgd_t)); memblock_reserve(__pa(swapper_pg_dir), PTRS_PER_PGD * sizeof(pgd_t));
#ifdef CONFIG_PUV3_UNIGFX
/*
* These should likewise go elsewhere. They pre-reserve the
* screen/video memory region at the 48M~64M of main system memory.
*/
memblock_reserve(PKUNITY_UNIGFX_MMAP_BASE, PKUNITY_UNIGFX_MMAP_SIZE);
memblock_reserve(PKUNITY_UVC_MMAP_BASE, PKUNITY_UVC_MMAP_SIZE);
#endif
} }
/* /*
@ -370,17 +361,6 @@ static void __init devicemaps_init(void)
for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE) for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
pmd_clear(pmd_off_k(addr)); pmd_clear(pmd_off_k(addr));
/*
* Create a mapping for UniGFX VRAM
*/
#ifdef CONFIG_PUV3_UNIGFX
map.pfn = __phys_to_pfn(PKUNITY_UNIGFX_MMAP_BASE);
map.virtual = KUSER_UNIGFX_BASE;
map.length = PKUNITY_UNIGFX_MMAP_SIZE;
map.type = MT_KUSER;
create_mapping(&map);
#endif
/* /*
* Create a mapping for the machine vectors at the high-vectors * Create a mapping for the machine vectors at the high-vectors
* location (0xffff0000). If we aren't using high-vectors, also * location (0xffff0000). If we aren't using high-vectors, also

View File

@ -2,7 +2,6 @@
#define _ASM_X86_APIC_H #define _ASM_X86_APIC_H
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/delay.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <asm/alternative.h> #include <asm/alternative.h>

View File

@ -10,7 +10,6 @@
#include <linux/spinlock.h> /* And spinlocks */ #include <linux/spinlock.h> /* And spinlocks */
#include <asm/io.h> /* need byte IO */ #include <asm/io.h> /* need byte IO */
#include <linux/delay.h>
#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER #ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
#define dma_outb outb_p #define dma_outb outb_p

View File

@ -95,7 +95,6 @@ extern void setup_node_to_cpumask_map(void);
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
extern unsigned long node_start_pfn[]; extern unsigned long node_start_pfn[];
extern unsigned long node_end_pfn[]; extern unsigned long node_end_pfn[];
extern unsigned long node_remap_size[];
#define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid]) #define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid])
# define SD_CACHE_NICE_TRIES 1 # define SD_CACHE_NICE_TRIES 1

View File

@ -21,7 +21,7 @@ const struct pci_device_id amd_nb_misc_ids[] = {
EXPORT_SYMBOL(amd_nb_misc_ids); EXPORT_SYMBOL(amd_nb_misc_ids);
static struct pci_device_id amd_nb_link_ids[] = { static struct pci_device_id amd_nb_link_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_LINK) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) },
{} {}
}; };

View File

@ -16,6 +16,7 @@
#include <linux/kprobes.h> #include <linux/kprobes.h>
#include <linux/nmi.h> #include <linux/nmi.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/delay.h>
#ifdef CONFIG_HARDLOCKUP_DETECTOR #ifdef CONFIG_HARDLOCKUP_DETECTOR
u64 hw_nmi_get_sample_period(void) u64 hw_nmi_get_sample_period(void)

View File

@ -93,10 +93,6 @@ static inline void numaq_register_node(int node, struct sys_cfg_data *scd)
node_end_pfn[node]); node_end_pfn[node]);
memory_present(node, node_start_pfn[node], node_end_pfn[node]); memory_present(node, node_start_pfn[node], node_end_pfn[node]);
node_remap_size[node] = node_memmap_size_bytes(node,
node_start_pfn[node],
node_end_pfn[node]);
} }
/* /*

View File

@ -23,6 +23,8 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/delay.h>
#include <linux/crash_dump.h>
#include <asm/uv/uv_mmrs.h> #include <asm/uv/uv_mmrs.h>
#include <asm/uv/uv_hub.h> #include <asm/uv/uv_hub.h>
@ -34,6 +36,7 @@
#include <asm/ipi.h> #include <asm/ipi.h>
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/x86_init.h> #include <asm/x86_init.h>
#include <asm/emergency-restart.h>
DEFINE_PER_CPU(int, x2apic_extra_bits); DEFINE_PER_CPU(int, x2apic_extra_bits);
@ -810,4 +813,11 @@ void __init uv_system_init(void)
/* register Legacy VGA I/O redirection handler */ /* register Legacy VGA I/O redirection handler */
pci_register_set_vga_state(uv_set_vga_state); pci_register_set_vga_state(uv_set_vga_state);
/*
* For a kdump kernel the reset must be BOOT_ACPI, not BOOT_EFI, as
* EFI is not enabled in the kdump kernel.
*/
if (is_kdump_kernel())
reboot_type = BOOT_ACPI;
} }

View File

@ -1626,7 +1626,7 @@ out:
static unsigned int mce_poll(struct file *file, poll_table *wait) static unsigned int mce_poll(struct file *file, poll_table *wait)
{ {
poll_wait(file, &mce_wait, wait); poll_wait(file, &mce_wait, wait);
if (rcu_dereference_check_mce(mcelog.next)) if (rcu_access_index(mcelog.next))
return POLLIN | POLLRDNORM; return POLLIN | POLLRDNORM;
if (!mce_apei_read_done && apei_check_mce()) if (!mce_apei_read_done && apei_check_mce())
return POLLIN | POLLRDNORM; return POLLIN | POLLRDNORM;

View File

@ -293,14 +293,24 @@ set_mtrr(unsigned int reg, unsigned long base, unsigned long size, mtrr_type typ
/* /*
* HACK! * HACK!
* We use this same function to initialize the mtrrs on boot. *
* The state of the boot cpu's mtrrs has been saved, and we want * We use this same function to initialize the mtrrs during boot,
* to replicate across all the APs. * resume, runtime cpu online and on an explicit request to set a
* If we're doing that @reg is set to something special... * specific MTRR.
*
* During boot or suspend, the state of the boot cpu's mtrrs has been
* saved, and we want to replicate that across all the cpus that come
* online (either at the end of boot or resume or during a runtime cpu
* online). If we're doing that, @reg is set to something special and on
* this cpu we still do mtrr_if->set_all(). During boot/resume, this
* is unnecessary if at this point we are still on the cpu that started
* the boot/resume sequence. But there is no guarantee that we are still
* on the same cpu. So we do mtrr_if->set_all() on this cpu aswell to be
* sure that we are in sync with everyone else.
*/ */
if (reg != ~0U) if (reg != ~0U)
mtrr_if->set(reg, base, size, type); mtrr_if->set(reg, base, size, type);
else if (!mtrr_aps_delayed_init) else
mtrr_if->set_all(); mtrr_if->set_all();
/* Wait for the others */ /* Wait for the others */

View File

@ -8,6 +8,7 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/ftrace.h> #include <linux/ftrace.h>
#include <linux/delay.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/io_apic.h> #include <asm/io_apic.h>

View File

@ -550,6 +550,7 @@ static void __exit microcode_exit(void)
microcode_dev_exit(); microcode_dev_exit();
unregister_hotcpu_notifier(&mc_cpu_notifier); unregister_hotcpu_notifier(&mc_cpu_notifier);
unregister_syscore_ops(&mc_syscore_ops);
get_online_cpus(); get_online_cpus();
mutex_lock(&microcode_mutex); mutex_lock(&microcode_mutex);

View File

@ -6,6 +6,7 @@
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/tboot.h> #include <linux/tboot.h>
#include <linux/delay.h>
#include <acpi/reboot.h> #include <acpi/reboot.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/apic.h> #include <asm/apic.h>

View File

@ -104,13 +104,9 @@ extern unsigned long highend_pfn, highstart_pfn;
#define LARGE_PAGE_BYTES (PTRS_PER_PTE * PAGE_SIZE) #define LARGE_PAGE_BYTES (PTRS_PER_PTE * PAGE_SIZE)
unsigned long node_remap_size[MAX_NUMNODES];
static void *node_remap_start_vaddr[MAX_NUMNODES]; static void *node_remap_start_vaddr[MAX_NUMNODES];
void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags);
static unsigned long kva_start_pfn;
static unsigned long kva_pages;
int __cpuinit numa_cpu_node(int cpu) int __cpuinit numa_cpu_node(int cpu)
{ {
return apic->x86_32_numa_cpu_node(cpu); return apic->x86_32_numa_cpu_node(cpu);
@ -129,7 +125,6 @@ int __init get_memcfg_numa_flat(void)
node_end_pfn[0] = max_pfn; node_end_pfn[0] = max_pfn;
memblock_x86_register_active_regions(0, 0, max_pfn); memblock_x86_register_active_regions(0, 0, max_pfn);
memory_present(0, 0, max_pfn); memory_present(0, 0, max_pfn);
node_remap_size[0] = node_memmap_size_bytes(0, 0, max_pfn);
/* Indicate there is one node available. */ /* Indicate there is one node available. */
nodes_clear(node_online_map); nodes_clear(node_online_map);
@ -164,9 +159,8 @@ static void __init allocate_pgdat(int nid)
{ {
char buf[16]; char buf[16];
if (node_has_online_mem(nid) && node_remap_start_vaddr[nid]) NODE_DATA(nid) = alloc_remap(nid, ALIGN(sizeof(pg_data_t), PAGE_SIZE));
NODE_DATA(nid) = (pg_data_t *)node_remap_start_vaddr[nid]; if (!NODE_DATA(nid)) {
else {
unsigned long pgdat_phys; unsigned long pgdat_phys;
pgdat_phys = memblock_find_in_range(min_low_pfn<<PAGE_SHIFT, pgdat_phys = memblock_find_in_range(min_low_pfn<<PAGE_SHIFT,
max_pfn_mapped<<PAGE_SHIFT, max_pfn_mapped<<PAGE_SHIFT,
@ -182,25 +176,38 @@ static void __init allocate_pgdat(int nid)
} }
/* /*
* In the DISCONTIGMEM and SPARSEMEM memory model, a portion of the kernel * Remap memory allocator
* virtual address space (KVA) is reserved and portions of nodes are mapped
* using it. This is to allow node-local memory to be allocated for
* structures that would normally require ZONE_NORMAL. The memory is
* allocated with alloc_remap() and callers should be prepared to allocate
* from the bootmem allocator instead.
*/ */
static unsigned long node_remap_start_pfn[MAX_NUMNODES]; static unsigned long node_remap_start_pfn[MAX_NUMNODES];
static void *node_remap_end_vaddr[MAX_NUMNODES]; static void *node_remap_end_vaddr[MAX_NUMNODES];
static void *node_remap_alloc_vaddr[MAX_NUMNODES]; static void *node_remap_alloc_vaddr[MAX_NUMNODES];
static unsigned long node_remap_offset[MAX_NUMNODES];
/**
* alloc_remap - Allocate remapped memory
* @nid: NUMA node to allocate memory from
* @size: The size of allocation
*
* Allocate @size bytes from the remap area of NUMA node @nid. The
* size of the remap area is predetermined by init_alloc_remap() and
* only the callers considered there should call this function. For
* more info, please read the comment on top of init_alloc_remap().
*
* The caller must be ready to handle allocation failure from this
* function and fall back to regular memory allocator in such cases.
*
* CONTEXT:
* Single CPU early boot context.
*
* RETURNS:
* Pointer to the allocated memory on success, %NULL on failure.
*/
void *alloc_remap(int nid, unsigned long size) void *alloc_remap(int nid, unsigned long size)
{ {
void *allocation = node_remap_alloc_vaddr[nid]; void *allocation = node_remap_alloc_vaddr[nid];
size = ALIGN(size, L1_CACHE_BYTES); size = ALIGN(size, L1_CACHE_BYTES);
if (!allocation || (allocation + size) >= node_remap_end_vaddr[nid]) if (!allocation || (allocation + size) > node_remap_end_vaddr[nid])
return NULL; return NULL;
node_remap_alloc_vaddr[nid] += size; node_remap_alloc_vaddr[nid] += size;
@ -209,26 +216,6 @@ void *alloc_remap(int nid, unsigned long size)
return allocation; return allocation;
} }
static void __init remap_numa_kva(void)
{
void *vaddr;
unsigned long pfn;
int node;
for_each_online_node(node) {
printk(KERN_DEBUG "remap_numa_kva: node %d\n", node);
for (pfn=0; pfn < node_remap_size[node]; pfn += PTRS_PER_PTE) {
vaddr = node_remap_start_vaddr[node]+(pfn<<PAGE_SHIFT);
printk(KERN_DEBUG "remap_numa_kva: %08lx to pfn %08lx\n",
(unsigned long)vaddr,
node_remap_start_pfn[node] + pfn);
set_pmd_pfn((ulong) vaddr,
node_remap_start_pfn[node] + pfn,
PAGE_KERNEL_LARGE);
}
}
}
#ifdef CONFIG_HIBERNATION #ifdef CONFIG_HIBERNATION
/** /**
* resume_map_numa_kva - add KVA mapping to the temporary page tables created * resume_map_numa_kva - add KVA mapping to the temporary page tables created
@ -240,15 +227,16 @@ void resume_map_numa_kva(pgd_t *pgd_base)
int node; int node;
for_each_online_node(node) { for_each_online_node(node) {
unsigned long start_va, start_pfn, size, pfn; unsigned long start_va, start_pfn, nr_pages, pfn;
start_va = (unsigned long)node_remap_start_vaddr[node]; start_va = (unsigned long)node_remap_start_vaddr[node];
start_pfn = node_remap_start_pfn[node]; start_pfn = node_remap_start_pfn[node];
size = node_remap_size[node]; nr_pages = (node_remap_end_vaddr[node] -
node_remap_start_vaddr[node]) >> PAGE_SHIFT;
printk(KERN_DEBUG "%s: node %d\n", __func__, node); printk(KERN_DEBUG "%s: node %d\n", __func__, node);
for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { for (pfn = 0; pfn < nr_pages; pfn += PTRS_PER_PTE) {
unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); unsigned long vaddr = start_va + (pfn << PAGE_SHIFT);
pgd_t *pgd = pgd_base + pgd_index(vaddr); pgd_t *pgd = pgd_base + pgd_index(vaddr);
pud_t *pud = pud_offset(pgd, vaddr); pud_t *pud = pud_offset(pgd, vaddr);
@ -264,132 +252,102 @@ void resume_map_numa_kva(pgd_t *pgd_base)
} }
#endif #endif
static __init unsigned long calculate_numa_remap_pages(void) /**
* init_alloc_remap - Initialize remap allocator for a NUMA node
* @nid: NUMA node to initizlie remap allocator for
*
* NUMA nodes may end up without any lowmem. As allocating pgdat and
* memmap on a different node with lowmem is inefficient, a special
* remap allocator is implemented which can be used by alloc_remap().
*
* For each node, the amount of memory which will be necessary for
* pgdat and memmap is calculated and two memory areas of the size are
* allocated - one in the node and the other in lowmem; then, the area
* in the node is remapped to the lowmem area.
*
* As pgdat and memmap must be allocated in lowmem anyway, this
* doesn't waste lowmem address space; however, the actual lowmem
* which gets remapped over is wasted. The amount shouldn't be
* problematic on machines this feature will be used.
*
* Initialization failure isn't fatal. alloc_remap() is used
* opportunistically and the callers will fall back to other memory
* allocation mechanisms on failure.
*/
static __init void init_alloc_remap(int nid)
{ {
int nid; unsigned long size, pfn;
unsigned long size, reserve_pages = 0; u64 node_pa, remap_pa;
void *remap_va;
for_each_online_node(nid) { /*
u64 node_kva_target; * The acpi/srat node info can show hot-add memroy zones where
u64 node_kva_final; * memory could be added but not currently present.
*/
printk(KERN_DEBUG "node %d pfn: [%lx - %lx]\n",
nid, node_start_pfn[nid], node_end_pfn[nid]);
if (node_start_pfn[nid] > max_pfn)
return;
if (!node_end_pfn[nid])
return;
if (node_end_pfn[nid] > max_pfn)
node_end_pfn[nid] = max_pfn;
/* /* calculate the necessary space aligned to large page size */
* The acpi/srat node info can show hot-add memroy zones size = node_memmap_size_bytes(nid, node_start_pfn[nid],
* where memory could be added but not currently present. min(node_end_pfn[nid], max_pfn));
*/ size += ALIGN(sizeof(pg_data_t), PAGE_SIZE);
printk(KERN_DEBUG "node %d pfn: [%lx - %lx]\n", size = ALIGN(size, LARGE_PAGE_BYTES);
nid, node_start_pfn[nid], node_end_pfn[nid]);
if (node_start_pfn[nid] > max_pfn)
continue;
if (!node_end_pfn[nid])
continue;
if (node_end_pfn[nid] > max_pfn)
node_end_pfn[nid] = max_pfn;
/* ensure the remap includes space for the pgdat. */ /* allocate node memory and the lowmem remap area */
size = node_remap_size[nid] + sizeof(pg_data_t); node_pa = memblock_find_in_range(node_start_pfn[nid] << PAGE_SHIFT,
(u64)node_end_pfn[nid] << PAGE_SHIFT,
/* convert size to large (pmd size) pages, rounding up */ size, LARGE_PAGE_BYTES);
size = (size + LARGE_PAGE_BYTES - 1) / LARGE_PAGE_BYTES; if (node_pa == MEMBLOCK_ERROR) {
/* now the roundup is correct, convert to PAGE_SIZE pages */ pr_warning("remap_alloc: failed to allocate %lu bytes for node %d\n",
size = size * PTRS_PER_PTE; size, nid);
return;
node_kva_target = round_down(node_end_pfn[nid] - size,
PTRS_PER_PTE);
node_kva_target <<= PAGE_SHIFT;
do {
node_kva_final = memblock_find_in_range(node_kva_target,
((u64)node_end_pfn[nid])<<PAGE_SHIFT,
((u64)size)<<PAGE_SHIFT,
LARGE_PAGE_BYTES);
node_kva_target -= LARGE_PAGE_BYTES;
} while (node_kva_final == MEMBLOCK_ERROR &&
(node_kva_target>>PAGE_SHIFT) > (node_start_pfn[nid]));
if (node_kva_final == MEMBLOCK_ERROR)
panic("Can not get kva ram\n");
node_remap_size[nid] = size;
node_remap_offset[nid] = reserve_pages;
reserve_pages += size;
printk(KERN_DEBUG "Reserving %ld pages of KVA for lmem_map of"
" node %d at %llx\n",
size, nid, node_kva_final>>PAGE_SHIFT);
/*
* prevent kva address below max_low_pfn want it on system
* with less memory later.
* layout will be: KVA address , KVA RAM
*
* we are supposed to only record the one less then max_low_pfn
* but we could have some hole in high memory, and it will only
* check page_is_ram(pfn) && !page_is_reserved_early(pfn) to decide
* to use it as free.
* So memblock_x86_reserve_range here, hope we don't run out of that array
*/
memblock_x86_reserve_range(node_kva_final,
node_kva_final+(((u64)size)<<PAGE_SHIFT),
"KVA RAM");
node_remap_start_pfn[nid] = node_kva_final>>PAGE_SHIFT;
} }
printk(KERN_INFO "Reserving total of %lx pages for numa KVA remap\n", memblock_x86_reserve_range(node_pa, node_pa + size, "KVA RAM");
reserve_pages);
return reserve_pages;
}
static void init_remap_allocator(int nid) remap_pa = memblock_find_in_range(min_low_pfn << PAGE_SHIFT,
{ max_low_pfn << PAGE_SHIFT,
node_remap_start_vaddr[nid] = pfn_to_kaddr( size, LARGE_PAGE_BYTES);
kva_start_pfn + node_remap_offset[nid]); if (remap_pa == MEMBLOCK_ERROR) {
node_remap_end_vaddr[nid] = node_remap_start_vaddr[nid] + pr_warning("remap_alloc: failed to allocate %lu bytes remap area for node %d\n",
(node_remap_size[nid] * PAGE_SIZE); size, nid);
node_remap_alloc_vaddr[nid] = node_remap_start_vaddr[nid] + memblock_x86_free_range(node_pa, node_pa + size);
ALIGN(sizeof(pg_data_t), PAGE_SIZE); return;
}
memblock_x86_reserve_range(remap_pa, remap_pa + size, "KVA PG");
remap_va = phys_to_virt(remap_pa);
printk(KERN_DEBUG "node %d will remap to vaddr %08lx - %08lx\n", nid, /* perform actual remap */
(ulong) node_remap_start_vaddr[nid], for (pfn = 0; pfn < size >> PAGE_SHIFT; pfn += PTRS_PER_PTE)
(ulong) node_remap_end_vaddr[nid]); set_pmd_pfn((unsigned long)remap_va + (pfn << PAGE_SHIFT),
(node_pa >> PAGE_SHIFT) + pfn,
PAGE_KERNEL_LARGE);
/* initialize remap allocator parameters */
node_remap_start_pfn[nid] = node_pa >> PAGE_SHIFT;
node_remap_start_vaddr[nid] = remap_va;
node_remap_end_vaddr[nid] = remap_va + size;
node_remap_alloc_vaddr[nid] = remap_va;
printk(KERN_DEBUG "remap_alloc: node %d [%08llx-%08llx) -> [%p-%p)\n",
nid, node_pa, node_pa + size, remap_va, remap_va + size);
} }
void __init initmem_init(void) void __init initmem_init(void)
{ {
int nid; int nid;
long kva_target_pfn;
/*
* When mapping a NUMA machine we allocate the node_mem_map arrays
* from node local memory. They are then mapped directly into KVA
* between zone normal and vmalloc space. Calculate the size of
* this space and use it to adjust the boundary between ZONE_NORMAL
* and ZONE_HIGHMEM.
*/
get_memcfg_numa(); get_memcfg_numa();
numa_init_array(); numa_init_array();
kva_pages = roundup(calculate_numa_remap_pages(), PTRS_PER_PTE); for_each_online_node(nid)
init_alloc_remap(nid);
kva_target_pfn = round_down(max_low_pfn - kva_pages, PTRS_PER_PTE);
do {
kva_start_pfn = memblock_find_in_range(kva_target_pfn<<PAGE_SHIFT,
max_low_pfn<<PAGE_SHIFT,
kva_pages<<PAGE_SHIFT,
PTRS_PER_PTE<<PAGE_SHIFT) >> PAGE_SHIFT;
kva_target_pfn -= PTRS_PER_PTE;
} while (kva_start_pfn == MEMBLOCK_ERROR && kva_target_pfn > min_low_pfn);
if (kva_start_pfn == MEMBLOCK_ERROR)
panic("Can not get kva space\n");
printk(KERN_INFO "kva_start_pfn ~ %lx max_low_pfn ~ %lx\n",
kva_start_pfn, max_low_pfn);
printk(KERN_INFO "max_pfn = %lx\n", max_pfn);
/* avoid clash with initrd */
memblock_x86_reserve_range(kva_start_pfn<<PAGE_SHIFT,
(kva_start_pfn + kva_pages)<<PAGE_SHIFT,
"KVA PG");
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
highstart_pfn = highend_pfn = max_pfn; highstart_pfn = highend_pfn = max_pfn;
if (max_pfn > max_low_pfn) if (max_pfn > max_low_pfn)
@ -409,12 +367,8 @@ void __init initmem_init(void)
printk(KERN_DEBUG "Low memory ends at vaddr %08lx\n", printk(KERN_DEBUG "Low memory ends at vaddr %08lx\n",
(ulong) pfn_to_kaddr(max_low_pfn)); (ulong) pfn_to_kaddr(max_low_pfn));
for_each_online_node(nid) { for_each_online_node(nid)
init_remap_allocator(nid);
allocate_pgdat(nid); allocate_pgdat(nid);
}
remap_numa_kva();
printk(KERN_DEBUG "High memory starts at vaddr %08lx\n", printk(KERN_DEBUG "High memory starts at vaddr %08lx\n",
(ulong) pfn_to_kaddr(highstart_pfn)); (ulong) pfn_to_kaddr(highstart_pfn));

View File

@ -276,7 +276,6 @@ int __init get_memcfg_from_srat(void)
unsigned long end = min(node_end_pfn[nid], max_pfn); unsigned long end = min(node_end_pfn[nid], max_pfn);
memory_present(nid, start, end); memory_present(nid, start, end);
node_remap_size[nid] = node_memmap_size_bytes(nid, start, end);
} }
return 1; return 1;
out_fail: out_fail:

View File

@ -49,6 +49,10 @@ u64 op_x86_get_ctrl(struct op_x86_model_spec const *model,
val |= counter_config->user ? ARCH_PERFMON_EVENTSEL_USR : 0; val |= counter_config->user ? ARCH_PERFMON_EVENTSEL_USR : 0;
val |= counter_config->kernel ? ARCH_PERFMON_EVENTSEL_OS : 0; val |= counter_config->kernel ? ARCH_PERFMON_EVENTSEL_OS : 0;
val |= (counter_config->unit_mask & 0xFF) << 8; val |= (counter_config->unit_mask & 0xFF) << 8;
counter_config->extra &= (ARCH_PERFMON_EVENTSEL_INV |
ARCH_PERFMON_EVENTSEL_EDGE |
ARCH_PERFMON_EVENTSEL_CMASK);
val |= counter_config->extra;
event &= model->event_mask ? model->event_mask : 0xFF; event &= model->event_mask ? model->event_mask : 0xFF;
val |= event & 0xFF; val |= event & 0xFF;
val |= (event & 0x0F00) << 24; val |= (event & 0x0F00) << 24;
@ -440,6 +444,7 @@ static int nmi_create_files(struct super_block *sb, struct dentry *root)
oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask); oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask);
oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel); oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel);
oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user); oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user);
oprofilefs_create_ulong(sb, dir, "extra", &counter_config[i].extra);
} }
return 0; return 0;

View File

@ -22,6 +22,7 @@ struct op_counter_config {
unsigned long kernel; unsigned long kernel;
unsigned long user; unsigned long user;
unsigned long unit_mask; unsigned long unit_mask;
unsigned long extra;
}; };
extern struct op_counter_config counter_config[]; extern struct op_counter_config counter_config[];

View File

@ -11,6 +11,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
#include <asm/uv/uv.h> #include <asm/uv/uv.h>

View File

@ -2163,7 +2163,7 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes)
* size, something has gone terribly wrong. * size, something has gone terribly wrong.
*/ */
if (blk_rq_bytes(req) < blk_rq_cur_bytes(req)) { if (blk_rq_bytes(req) < blk_rq_cur_bytes(req)) {
printk(KERN_ERR "blk: request botched\n"); blk_dump_rq_flags(req, "request botched");
req->__data_len = blk_rq_cur_bytes(req); req->__data_len = blk_rq_cur_bytes(req);
} }
@ -2665,7 +2665,7 @@ static int plug_rq_cmp(void *priv, struct list_head *a, struct list_head *b)
struct request *rqa = container_of(a, struct request, queuelist); struct request *rqa = container_of(a, struct request, queuelist);
struct request *rqb = container_of(b, struct request, queuelist); struct request *rqb = container_of(b, struct request, queuelist);
return !(rqa->q == rqb->q); return !(rqa->q <= rqb->q);
} }
static void flush_plug_list(struct blk_plug *plug) static void flush_plug_list(struct blk_plug *plug)

View File

@ -261,7 +261,7 @@ static bool blk_kick_flush(struct request_queue *q)
q->flush_rq.end_io = flush_end_io; q->flush_rq.end_io = flush_end_io;
q->flush_pending_idx ^= 1; q->flush_pending_idx ^= 1;
elv_insert(q, &q->flush_rq, ELEVATOR_INSERT_REQUEUE); list_add_tail(&q->flush_rq.queuelist, &q->queue_head);
return true; return true;
} }
@ -281,7 +281,7 @@ static void flush_data_end_io(struct request *rq, int error)
* blk_insert_flush - insert a new FLUSH/FUA request * blk_insert_flush - insert a new FLUSH/FUA request
* @rq: request to insert * @rq: request to insert
* *
* To be called from elv_insert() for %ELEVATOR_INSERT_FLUSH insertions. * To be called from __elv_add_request() for %ELEVATOR_INSERT_FLUSH insertions.
* @rq is being submitted. Analyze what needs to be done and put it on the * @rq is being submitted. Analyze what needs to be done and put it on the
* right queue. * right queue.
* *
@ -312,7 +312,7 @@ void blk_insert_flush(struct request *rq)
*/ */
if ((policy & REQ_FSEQ_DATA) && if ((policy & REQ_FSEQ_DATA) &&
!(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) { !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) {
list_add(&rq->queuelist, &q->queue_head); list_add_tail(&rq->queuelist, &q->queue_head);
return; return;
} }

View File

@ -30,6 +30,8 @@
static struct kmem_cache *integrity_cachep; static struct kmem_cache *integrity_cachep;
static const char *bi_unsupported_name = "unsupported";
/** /**
* blk_rq_count_integrity_sg - Count number of integrity scatterlist elements * blk_rq_count_integrity_sg - Count number of integrity scatterlist elements
* @q: request queue * @q: request queue
@ -358,6 +360,14 @@ static struct kobj_type integrity_ktype = {
.release = blk_integrity_release, .release = blk_integrity_release,
}; };
bool blk_integrity_is_initialized(struct gendisk *disk)
{
struct blk_integrity *bi = blk_get_integrity(disk);
return (bi && bi->name && strcmp(bi->name, bi_unsupported_name) != 0);
}
EXPORT_SYMBOL(blk_integrity_is_initialized);
/** /**
* blk_integrity_register - Register a gendisk as being integrity-capable * blk_integrity_register - Register a gendisk as being integrity-capable
* @disk: struct gendisk pointer to make integrity-aware * @disk: struct gendisk pointer to make integrity-aware
@ -407,7 +417,7 @@ int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template)
bi->get_tag_fn = template->get_tag_fn; bi->get_tag_fn = template->get_tag_fn;
bi->tag_size = template->tag_size; bi->tag_size = template->tag_size;
} else } else
bi->name = "unsupported"; bi->name = bi_unsupported_name;
return 0; return 0;
} }

View File

@ -77,7 +77,7 @@ struct throtl_grp {
unsigned long slice_end[2]; unsigned long slice_end[2];
/* Some throttle limits got updated for the group */ /* Some throttle limits got updated for the group */
bool limits_changed; int limits_changed;
}; };
struct throtl_data struct throtl_data
@ -102,7 +102,7 @@ struct throtl_data
/* Work for dispatching throttled bios */ /* Work for dispatching throttled bios */
struct delayed_work throtl_work; struct delayed_work throtl_work;
bool limits_changed; int limits_changed;
}; };
enum tg_state_flags { enum tg_state_flags {

View File

@ -610,7 +610,7 @@ void elv_requeue_request(struct request_queue *q, struct request *rq)
rq->cmd_flags &= ~REQ_STARTED; rq->cmd_flags &= ~REQ_STARTED;
elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE); __elv_add_request(q, rq, ELEVATOR_INSERT_REQUEUE);
} }
void elv_drain_elevator(struct request_queue *q) void elv_drain_elevator(struct request_queue *q)
@ -655,12 +655,25 @@ void elv_quiesce_end(struct request_queue *q)
queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q); queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
} }
void elv_insert(struct request_queue *q, struct request *rq, int where) void __elv_add_request(struct request_queue *q, struct request *rq, int where)
{ {
trace_block_rq_insert(q, rq); trace_block_rq_insert(q, rq);
rq->q = q; rq->q = q;
BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
if (rq->cmd_flags & REQ_SOFTBARRIER) {
/* barriers are scheduling boundary, update end_sector */
if (rq->cmd_type == REQ_TYPE_FS ||
(rq->cmd_flags & REQ_DISCARD)) {
q->end_sector = rq_end_sector(rq);
q->boundary_rq = rq;
}
} else if (!(rq->cmd_flags & REQ_ELVPRIV) &&
where == ELEVATOR_INSERT_SORT)
where = ELEVATOR_INSERT_BACK;
switch (where) { switch (where) {
case ELEVATOR_INSERT_REQUEUE: case ELEVATOR_INSERT_REQUEUE:
case ELEVATOR_INSERT_FRONT: case ELEVATOR_INSERT_FRONT:
@ -722,24 +735,6 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)
BUG(); BUG();
} }
} }
void __elv_add_request(struct request_queue *q, struct request *rq, int where)
{
BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
if (rq->cmd_flags & REQ_SOFTBARRIER) {
/* barriers are scheduling boundary, update end_sector */
if (rq->cmd_type == REQ_TYPE_FS ||
(rq->cmd_flags & REQ_DISCARD)) {
q->end_sector = rq_end_sector(rq);
q->boundary_rq = rq;
}
} else if (!(rq->cmd_flags & REQ_ELVPRIV) &&
where == ELEVATOR_INSERT_SORT)
where = ELEVATOR_INSERT_BACK;
elv_insert(q, rq, where);
}
EXPORT_SYMBOL(__elv_add_request); EXPORT_SYMBOL(__elv_add_request);
void elv_add_request(struct request_queue *q, struct request *rq, int where) void elv_add_request(struct request_queue *q, struct request *rq, int where)

View File

@ -71,6 +71,9 @@ static struct usb_device_id btusb_table[] = {
/* Apple MacBookAir3,1, MacBookAir3,2 */ /* Apple MacBookAir3,1, MacBookAir3,2 */
{ USB_DEVICE(0x05ac, 0x821b) }, { USB_DEVICE(0x05ac, 0x821b) },
/* Apple MacBookPro8,2 */
{ USB_DEVICE(0x05ac, 0x821a) },
/* AVM BlueFRITZ! USB v2.0 */ /* AVM BlueFRITZ! USB v2.0 */
{ USB_DEVICE(0x057c, 0x3800) }, { USB_DEVICE(0x057c, 0x3800) },
@ -690,7 +693,8 @@ static int btusb_send_frame(struct sk_buff *skb)
break; break;
case HCI_ACLDATA_PKT: case HCI_ACLDATA_PKT:
if (!data->bulk_tx_ep || hdev->conn_hash.acl_num < 1) if (!data->bulk_tx_ep || (hdev->conn_hash.acl_num < 1 &&
hdev->conn_hash.le_num < 1))
return -ENODEV; return -ENODEV;
urb = usb_alloc_urb(0, GFP_ATOMIC); urb = usb_alloc_urb(0, GFP_ATOMIC);

View File

@ -1147,13 +1147,14 @@ static struct platform_driver mpc85xx_mc_err_driver = {
static void __init mpc85xx_mc_clear_rfxe(void *data) static void __init mpc85xx_mc_clear_rfxe(void *data)
{ {
orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1); orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1);
mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~0x20000)); mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~HID1_RFXE));
} }
#endif #endif
static int __init mpc85xx_mc_init(void) static int __init mpc85xx_mc_init(void)
{ {
int res = 0; int res = 0;
u32 pvr = 0;
printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, " printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, "
"(C) 2006 Montavista Software\n"); "(C) 2006 Montavista Software\n");
@ -1183,12 +1184,17 @@ static int __init mpc85xx_mc_init(void)
#endif #endif
#ifdef CONFIG_FSL_SOC_BOOKE #ifdef CONFIG_FSL_SOC_BOOKE
/* pvr = mfspr(SPRN_PVR);
* need to clear HID1[RFXE] to disable machine check int
* so we can catch it if ((PVR_VER(pvr) == PVR_VER_E500V1) ||
*/ (PVR_VER(pvr) == PVR_VER_E500V2)) {
if (edac_op_state == EDAC_OPSTATE_INT) /*
on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0); * need to clear HID1[RFXE] to disable machine check int
* so we can catch it
*/
if (edac_op_state == EDAC_OPSTATE_INT)
on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0);
}
#endif #endif
return 0; return 0;
@ -1206,7 +1212,12 @@ static void __exit mpc85xx_mc_restore_hid1(void *data)
static void __exit mpc85xx_mc_exit(void) static void __exit mpc85xx_mc_exit(void)
{ {
#ifdef CONFIG_FSL_SOC_BOOKE #ifdef CONFIG_FSL_SOC_BOOKE
on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0); u32 pvr = mfspr(SPRN_PVR);
if ((PVR_VER(pvr) == PVR_VER_E500V1) ||
(PVR_VER(pvr) == PVR_VER_E500V2)) {
on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0);
}
#endif #endif
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
platform_driver_unregister(&mpc85xx_pci_err_driver); platform_driver_unregister(&mpc85xx_pci_err_driver);

View File

@ -1297,7 +1297,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
/** /**
* Search EDID for CEA extension block. * Search EDID for CEA extension block.
*/ */
static u8 *drm_find_cea_extension(struct edid *edid) u8 *drm_find_cea_extension(struct edid *edid)
{ {
u8 *edid_ext = NULL; u8 *edid_ext = NULL;
int i; int i;
@ -1318,6 +1318,7 @@ static u8 *drm_find_cea_extension(struct edid *edid)
return edid_ext; return edid_ext;
} }
EXPORT_SYMBOL(drm_find_cea_extension);
/** /**
* drm_detect_hdmi_monitor - detect whether monitor is hdmi. * drm_detect_hdmi_monitor - detect whether monitor is hdmi.

View File

@ -269,21 +269,6 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
return ret; return ret;
} }
static bool intel_crt_ddc_probe(struct drm_i915_private *dev_priv, int ddc_bus)
{
u8 buf;
struct i2c_msg msgs[] = {
{
.addr = 0xA0,
.flags = 0,
.len = 1,
.buf = &buf,
},
};
/* DDC monitor detect: Does it ACK a write to 0xA0? */
return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 1) == 1;
}
static bool intel_crt_detect_ddc(struct drm_connector *connector) static bool intel_crt_detect_ddc(struct drm_connector *connector)
{ {
struct intel_crt *crt = intel_attached_crt(connector); struct intel_crt *crt = intel_attached_crt(connector);
@ -293,11 +278,6 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
if (crt->base.type != INTEL_OUTPUT_ANALOG) if (crt->base.type != INTEL_OUTPUT_ANALOG)
return false; return false;
if (intel_crt_ddc_probe(dev_priv, dev_priv->crt_ddc_pin)) {
DRM_DEBUG_KMS("CRT detected via DDC:0xa0\n");
return true;
}
if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) { if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) {
struct edid *edid; struct edid *edid;
bool is_digital = false; bool is_digital = false;

View File

@ -39,7 +39,7 @@
ret__ = -ETIMEDOUT; \ ret__ = -ETIMEDOUT; \
break; \ break; \
} \ } \
if (W && !in_dbg_master()) msleep(W); \ if (W && !(in_atomic() || in_dbg_master())) msleep(W); \
} \ } \
ret__; \ ret__; \
}) })

View File

@ -259,7 +259,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50)) if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
goto timeout; goto timeout;
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
return 0; goto clear_err;
val = I915_READ(GMBUS3 + reg_offset); val = I915_READ(GMBUS3 + reg_offset);
do { do {
@ -287,7 +287,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50)) if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
goto timeout; goto timeout;
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
return 0; goto clear_err;
val = loop = 0; val = loop = 0;
do { do {
@ -302,14 +302,31 @@ gmbus_xfer(struct i2c_adapter *adapter,
if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50)) if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50))
goto timeout; goto timeout;
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
return 0; goto clear_err;
} }
return num; goto done;
clear_err:
/* Toggle the Software Clear Interrupt bit. This has the effect
* of resetting the GMBUS controller and so clearing the
* BUS_ERROR raised by the slave's NAK.
*/
I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT);
I915_WRITE(GMBUS1 + reg_offset, 0);
done:
/* Mark the GMBUS interface as disabled. We will re-enable it at the
* start of the next xfer, till then let it sleep.
*/
I915_WRITE(GMBUS0 + reg_offset, 0);
return i;
timeout: timeout:
DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n", DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n",
bus->reg0 & 0xff, bus->adapter.name); bus->reg0 & 0xff, bus->adapter.name);
I915_WRITE(GMBUS0 + reg_offset, 0);
/* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */ /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff); bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff);
if (!bus->force_bit) if (!bus->force_bit)

View File

@ -473,19 +473,13 @@ static enum drm_connector_status
intel_lvds_detect(struct drm_connector *connector, bool force) intel_lvds_detect(struct drm_connector *connector, bool force)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
enum drm_connector_status status = connector_status_connected; enum drm_connector_status status;
status = intel_panel_detect(dev); status = intel_panel_detect(dev);
if (status != connector_status_unknown) if (status != connector_status_unknown)
return status; return status;
/* ACPI lid methods were generally unreliable in this generation, so return connector_status_connected;
* don't even bother.
*/
if (IS_GEN2(dev) || IS_GEN3(dev))
return connector_status_connected;
return status;
} }
/** /**
@ -835,25 +829,6 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev,
return false; return false;
} }
static bool intel_lvds_ddc_probe(struct drm_device *dev, u8 pin)
{
struct drm_i915_private *dev_priv = dev->dev_private;
u8 buf = 0;
struct i2c_msg msgs[] = {
{
.addr = 0xA0,
.flags = 0,
.len = 1,
.buf = &buf,
},
};
struct i2c_adapter *i2c = &dev_priv->gmbus[pin].adapter;
/* XXX this only appears to work when using GMBUS */
if (intel_gmbus_is_forced_bit(i2c))
return true;
return i2c_transfer(i2c, msgs, 1) == 1;
}
/** /**
* intel_lvds_init - setup LVDS connectors on this device * intel_lvds_init - setup LVDS connectors on this device
* @dev: drm device * @dev: drm device
@ -894,11 +869,6 @@ bool intel_lvds_init(struct drm_device *dev)
} }
} }
if (!intel_lvds_ddc_probe(dev, pin)) {
DRM_DEBUG_KMS("LVDS did not respond to DDC probe\n");
return false;
}
intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL); intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL);
if (!intel_lvds) { if (!intel_lvds) {
return false; return false;

View File

@ -97,7 +97,7 @@ nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan,
return -ENOMEM; return -ENOMEM;
} }
nvbo->bo.persistant_swap_storage = nvbo->gem->filp; nvbo->bo.persistent_swap_storage = nvbo->gem->filp;
nvbo->gem->driver_private = nvbo; nvbo->gem->driver_private = nvbo;
return 0; return 0;
} }

View File

@ -1009,6 +1009,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
uint64_t fb_location; uint64_t fb_location;
uint32_t fb_format, fb_pitch_pixels, tiling_flags; uint32_t fb_format, fb_pitch_pixels, tiling_flags;
u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
u32 tmp;
int r; int r;
/* no fb bound */ /* no fb bound */
@ -1137,6 +1138,15 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
/* pageflip setup */
/* make sure flip is at vb rather than hb */
tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
/* set pageflip to happen anywhere in vblank interval */
WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
if (!atomic && fb && fb != crtc->fb) { if (!atomic && fb && fb != crtc->fb) {
radeon_fb = to_radeon_framebuffer(fb); radeon_fb = to_radeon_framebuffer(fb);
rbo = gem_to_radeon_bo(radeon_fb->obj); rbo = gem_to_radeon_bo(radeon_fb->obj);
@ -1167,6 +1177,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
uint64_t fb_location; uint64_t fb_location;
uint32_t fb_format, fb_pitch_pixels, tiling_flags; uint32_t fb_format, fb_pitch_pixels, tiling_flags;
u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
u32 tmp;
int r; int r;
/* no fb bound */ /* no fb bound */
@ -1294,6 +1305,15 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
/* pageflip setup */
/* make sure flip is at vb rather than hb */
tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
/* set pageflip to happen anywhere in vblank interval */
WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
if (!atomic && fb && fb != crtc->fb) { if (!atomic && fb && fb != crtc->fb) {
radeon_fb = to_radeon_framebuffer(fb); radeon_fb = to_radeon_framebuffer(fb);
rbo = gem_to_radeon_bo(radeon_fb->obj); rbo = gem_to_radeon_bo(radeon_fb->obj);

View File

@ -43,17 +43,6 @@ static void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc) void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)
{ {
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
u32 tmp;
/* make sure flip is at vb rather than hb */
tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
/* set pageflip to happen anywhere in vblank interval */
WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
/* enable the pflip int */ /* enable the pflip int */
radeon_irq_kms_pflip_irq_get(rdev, crtc); radeon_irq_kms_pflip_irq_get(rdev, crtc);
} }

View File

@ -675,7 +675,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
ATOM_ENCODER_CAP_RECORD *cap_record; ATOM_ENCODER_CAP_RECORD *cap_record;
u16 caps = 0; u16 caps = 0;
while (record->ucRecordType > 0 && while (record->ucRecordSize > 0 &&
record->ucRecordType > 0 &&
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
switch (record->ucRecordType) { switch (record->ucRecordType) {
case ATOM_ENCODER_CAP_RECORD_TYPE: case ATOM_ENCODER_CAP_RECORD_TYPE:
@ -720,7 +721,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
break; break;
} }
while (record->ucRecordType > 0 && while (record->ucRecordSize > 0 &&
record->ucRecordType > 0 &&
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
switch (record->ucRecordType) { switch (record->ucRecordType) {
case ATOM_I2C_RECORD_TYPE: case ATOM_I2C_RECORD_TYPE:
@ -782,10 +784,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
ATOM_HPD_INT_RECORD *hpd_record; ATOM_HPD_INT_RECORD *hpd_record;
ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
while (record->ucRecordType > 0 while (record->ucRecordSize > 0 &&
&& record-> record->ucRecordType > 0 &&
ucRecordType <= record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
ATOM_MAX_OBJECT_RECORD_NUMBER) {
switch (record->ucRecordType) { switch (record->ucRecordType) {
case ATOM_I2C_RECORD_TYPE: case ATOM_I2C_RECORD_TYPE:
i2c_record = i2c_record =

View File

@ -2079,6 +2079,19 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_MODE_CONNECTOR_DVII, &ddc_i2c, DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
&hpd); &hpd);
/* TV - TV DAC */
ddc_i2c.valid = false;
hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev,
radeon_get_encoder_enum(dev,
ATOM_DEVICE_TV1_SUPPORT,
2),
ATOM_DEVICE_TV1_SUPPORT);
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
DRM_MODE_CONNECTOR_SVIDEO,
&ddc_i2c,
CONNECTOR_OBJECT_ID_SVIDEO,
&hpd);
break; break;
default: default:
DRM_INFO("Connector table: %d (invalid)\n", DRM_INFO("Connector table: %d (invalid)\n",

View File

@ -48,17 +48,6 @@ int rs600_mc_wait_for_idle(struct radeon_device *rdev);
void rs600_pre_page_flip(struct radeon_device *rdev, int crtc) void rs600_pre_page_flip(struct radeon_device *rdev, int crtc)
{ {
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
u32 tmp;
/* make sure flip is at vb rather than hb */
tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
/* set pageflip to happen anywhere in vblank interval */
WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
/* enable the pflip int */ /* enable the pflip int */
radeon_irq_kms_pflip_irq_get(rdev, crtc); radeon_irq_kms_pflip_irq_get(rdev, crtc);
} }

View File

@ -1168,7 +1168,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
uint32_t page_alignment, uint32_t page_alignment,
unsigned long buffer_start, unsigned long buffer_start,
bool interruptible, bool interruptible,
struct file *persistant_swap_storage, struct file *persistent_swap_storage,
size_t acc_size, size_t acc_size,
void (*destroy) (struct ttm_buffer_object *)) void (*destroy) (struct ttm_buffer_object *))
{ {
@ -1211,7 +1211,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
bo->priv_flags = 0; bo->priv_flags = 0;
bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);
bo->seq_valid = false; bo->seq_valid = false;
bo->persistant_swap_storage = persistant_swap_storage; bo->persistent_swap_storage = persistent_swap_storage;
bo->acc_size = acc_size; bo->acc_size = acc_size;
atomic_inc(&bo->glob->bo_count); atomic_inc(&bo->glob->bo_count);
@ -1260,7 +1260,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
uint32_t page_alignment, uint32_t page_alignment,
unsigned long buffer_start, unsigned long buffer_start,
bool interruptible, bool interruptible,
struct file *persistant_swap_storage, struct file *persistent_swap_storage,
struct ttm_buffer_object **p_bo) struct ttm_buffer_object **p_bo)
{ {
struct ttm_buffer_object *bo; struct ttm_buffer_object *bo;
@ -1282,7 +1282,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
buffer_start, interruptible, buffer_start, interruptible,
persistant_swap_storage, acc_size, NULL); persistent_swap_storage, acc_size, NULL);
if (likely(ret == 0)) if (likely(ret == 0))
*p_bo = bo; *p_bo = bo;
@ -1863,7 +1863,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
if (bo->bdev->driver->swap_notify) if (bo->bdev->driver->swap_notify)
bo->bdev->driver->swap_notify(bo); bo->bdev->driver->swap_notify(bo);
ret = ttm_tt_swapout(bo->ttm, bo->persistant_swap_storage); ret = ttm_tt_swapout(bo->ttm, bo->persistent_swap_storage);
out: out:
/** /**

View File

@ -332,7 +332,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
ttm_tt_free_page_directory(ttm); ttm_tt_free_page_directory(ttm);
} }
if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP) && if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) &&
ttm->swap_storage) ttm->swap_storage)
fput(ttm->swap_storage); fput(ttm->swap_storage);
@ -503,7 +503,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
page_cache_release(from_page); page_cache_release(from_page);
} }
if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP)) if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP))
fput(swap_storage); fput(swap_storage);
ttm->swap_storage = NULL; ttm->swap_storage = NULL;
ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED; ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED;
@ -514,7 +514,7 @@ out_err:
return ret; return ret;
} }
int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
{ {
struct address_space *swap_space; struct address_space *swap_space;
struct file *swap_storage; struct file *swap_storage;
@ -540,7 +540,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
return 0; return 0;
} }
if (!persistant_swap_storage) { if (!persistent_swap_storage) {
swap_storage = shmem_file_setup("ttm swap", swap_storage = shmem_file_setup("ttm swap",
ttm->num_pages << PAGE_SHIFT, ttm->num_pages << PAGE_SHIFT,
0); 0);
@ -549,7 +549,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
return PTR_ERR(swap_storage); return PTR_ERR(swap_storage);
} }
} else } else
swap_storage = persistant_swap_storage; swap_storage = persistent_swap_storage;
swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
@ -577,12 +577,12 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
ttm_tt_free_alloced_pages(ttm); ttm_tt_free_alloced_pages(ttm);
ttm->swap_storage = swap_storage; ttm->swap_storage = swap_storage;
ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED; ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
if (persistant_swap_storage) if (persistent_swap_storage)
ttm->page_flags |= TTM_PAGE_FLAG_PERSISTANT_SWAP; ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP;
return 0; return 0;
out_err: out_err:
if (!persistant_swap_storage) if (!persistent_swap_storage)
fput(swap_storage); fput(swap_storage);
return ret; return ret;

View File

@ -154,4 +154,4 @@ module_exit(twl4030_madc_hwmon_exit);
MODULE_DESCRIPTION("TWL4030 ADC Hwmon driver"); MODULE_DESCRIPTION("TWL4030 ADC Hwmon driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("J Keerthy"); MODULE_AUTHOR("J Keerthy");
MODULE_ALIAS("twl4030_madc_hwmon"); MODULE_ALIAS("platform:twl4030_madc_hwmon");

View File

@ -430,6 +430,26 @@ static inline void ide_unlock_host(struct ide_host *host)
} }
} }
static void __ide_requeue_and_plug(struct request_queue *q, struct request *rq)
{
if (rq)
blk_requeue_request(q, rq);
if (rq || blk_peek_request(q)) {
/* Use 3ms as that was the old plug delay */
blk_delay_queue(q, 3);
}
}
void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq)
{
struct request_queue *q = drive->queue;
unsigned long flags;
spin_lock_irqsave(q->queue_lock, flags);
__ide_requeue_and_plug(q, rq);
spin_unlock_irqrestore(q->queue_lock, flags);
}
/* /*
* Issue a new request to a device. * Issue a new request to a device.
*/ */
@ -550,28 +570,7 @@ plug_device:
ide_unlock_host(host); ide_unlock_host(host);
plug_device_2: plug_device_2:
spin_lock_irq(q->queue_lock); spin_lock_irq(q->queue_lock);
__ide_requeue_and_plug(q, rq);
if (rq) {
blk_requeue_request(q, rq);
blk_delay_queue(q, queue_run_ms);
}
}
void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq)
{
struct request_queue *q = drive->queue;
unsigned long flags;
spin_lock_irqsave(q->queue_lock, flags);
if (rq)
blk_requeue_request(q, rq);
spin_unlock_irqrestore(q->queue_lock, flags);
/* Use 3ms as that was the old plug delay */
if (rq)
blk_delay_queue(q, 3);
} }
static int drive_is_ready(ide_drive_t *drive) static int drive_is_ready(ide_drive_t *drive)

View File

@ -69,7 +69,7 @@ static irqreturn_t spear_kbd_interrupt(int irq, void *dev_id)
u8 sts, val; u8 sts, val;
sts = readb(kbd->io_base + STATUS_REG); sts = readb(kbd->io_base + STATUS_REG);
if (sts & DATA_AVAIL) if (!(sts & DATA_AVAIL))
return IRQ_NONE; return IRQ_NONE;
if (kbd->last_key != KEY_RESERVED) { if (kbd->last_key != KEY_RESERVED) {

View File

@ -302,10 +302,14 @@ static int uinput_validate_absbits(struct input_dev *dev)
int retval = 0; int retval = 0;
for (cnt = 0; cnt < ABS_CNT; cnt++) { for (cnt = 0; cnt < ABS_CNT; cnt++) {
int min, max;
if (!test_bit(cnt, dev->absbit)) if (!test_bit(cnt, dev->absbit))
continue; continue;
if (input_abs_get_max(dev, cnt) <= input_abs_get_min(dev, cnt)) { min = input_abs_get_min(dev, cnt);
max = input_abs_get_max(dev, cnt);
if ((min != 0 || max != 0) && max <= min) {
printk(KERN_DEBUG printk(KERN_DEBUG
"%s: invalid abs[%02x] min:%d max:%d\n", "%s: invalid abs[%02x] min:%d max:%d\n",
UINPUT_NAME, cnt, UINPUT_NAME, cnt,

View File

@ -836,8 +836,8 @@ static const struct dmi_system_id __initconst toshiba_dmi_table[] = {
}, },
}, },
{ }
#endif #endif
{ }
}; };
static bool broken_olpc_ec; static bool broken_olpc_ec;
@ -851,8 +851,8 @@ static const struct dmi_system_id __initconst olpc_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "XO"), DMI_MATCH(DMI_PRODUCT_NAME, "XO"),
}, },
}, },
{ }
#endif #endif
{ }
}; };
void __init synaptics_module_init(void) void __init synaptics_module_init(void)

View File

@ -869,15 +869,15 @@ static int i8042_controller_selftest(void)
do { do {
if (i8042_command(&param, I8042_CMD_CTL_TEST)) { if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
pr_err("i8042 controller self test timeout\n"); pr_err("i8042 controller selftest timeout\n");
return -ENODEV; return -ENODEV;
} }
if (param == I8042_RET_CTL_TEST) if (param == I8042_RET_CTL_TEST)
return 0; return 0;
pr_err("i8042 controller selftest failed. (%#x != %#x)\n", dbg("i8042 controller selftest: %#x != %#x\n",
param, I8042_RET_CTL_TEST); param, I8042_RET_CTL_TEST);
msleep(50); msleep(50);
} while (i++ < 5); } while (i++ < 5);
@ -891,6 +891,7 @@ static int i8042_controller_selftest(void)
pr_info("giving up on controller selftest, continuing anyway...\n"); pr_info("giving up on controller selftest, continuing anyway...\n");
return 0; return 0;
#else #else
pr_err("i8042 controller selftest failed\n");
return -EIO; return -EIO;
#endif #endif
} }

Some files were not shown because too many files have changed in this diff Show More