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:
commit
aff364860a
@ -206,8 +206,8 @@ laptops/
|
||||
- directory with laptop related info and laptop driver documentation.
|
||||
ldm.txt
|
||||
- a brief description of LDM (Windows Dynamic Disks).
|
||||
leds-class.txt
|
||||
- documents LED handling under Linux.
|
||||
leds/
|
||||
- directory with info about LED handling under Linux.
|
||||
local_ops.txt
|
||||
- semantics and behavior of local atomic operations.
|
||||
lockdep-design.txt
|
||||
|
@ -40,7 +40,7 @@ What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-
|
||||
Date: March 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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
|
||||
effects.
|
||||
When read, these files return the respective profile. The
|
||||
|
@ -33,7 +33,7 @@ Date: August 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When written, this file lets one write the respective profile
|
||||
buttons back to the mouse. The data has to be 77 bytes long.
|
||||
The mouse will reject invalid data.
|
||||
@ -47,7 +47,7 @@ Date: August 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When read, these files return the respective profile buttons.
|
||||
The returned data is 77 bytes in size.
|
||||
This file is readonly.
|
||||
@ -58,7 +58,7 @@ Date: October 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When written, this file lets one write the respective profile
|
||||
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>
|
||||
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.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When read, these files return the respective profile settings.
|
||||
The returned data is 43 bytes in size.
|
||||
|
@ -52,7 +52,7 @@ Date: January 2011
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When written, this file lets one write the respective profile
|
||||
buttons back to the mouse. The data has to be 23 bytes long.
|
||||
The mouse will reject invalid data.
|
||||
@ -66,7 +66,7 @@ Date: January 2011
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When read, these files return the respective profile buttons.
|
||||
The returned data is 23 bytes in size.
|
||||
This file is readonly.
|
||||
@ -77,7 +77,7 @@ Date: January 2011
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When written, this file lets one write the respective profile
|
||||
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>
|
||||
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.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When read, these files return the respective profile settings.
|
||||
The returned data is 16 bytes in size.
|
||||
|
@ -39,7 +39,7 @@ Date: August 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When written, this file lets one write the respective profile
|
||||
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>
|
||||
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.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When read, these files return the respective profile settings.
|
||||
The returned data is 13 bytes in size.
|
||||
@ -66,7 +66,7 @@ Date: August 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When written, this file lets one write the respective profile
|
||||
buttons back to the mouse. The data has to be 19 bytes long.
|
||||
The mouse will reject invalid data.
|
||||
@ -80,7 +80,7 @@ Date: August 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
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.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When read, these files return the respective profile buttons.
|
||||
The returned data is 19 bytes in size.
|
||||
This file is readonly.
|
||||
|
@ -27,7 +27,7 @@ KernelVersion: 2.6.20
|
||||
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
||||
Description:
|
||||
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 :
|
||||
echo 0x0T000DDD > /sys/devices/platform/asus_laptop/
|
||||
where T control the 3 letters display, and DDD the 3 digits display.
|
||||
|
@ -110,22 +110,22 @@ university server with various users - students, professors, system
|
||||
tasks etc. The resource planning for this server could be along the
|
||||
following lines:
|
||||
|
||||
CPU : Top cpuset
|
||||
CPU : "Top cpuset"
|
||||
/ \
|
||||
CPUSet1 CPUSet2
|
||||
| |
|
||||
(Profs) (Students)
|
||||
| |
|
||||
(Professors) (Students)
|
||||
|
||||
In addition (system tasks) are attached to topcpuset (so
|
||||
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%)
|
||||
/ \
|
||||
Prof (15%) students (5%)
|
||||
Professors (15%) students (5%)
|
||||
|
||||
Browsers like Firefox/Lynx go into the WWW network class, while (k)nfsd go
|
||||
into NFS network class.
|
||||
|
@ -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
|
||||
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
|
||||
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
|
||||
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
|
||||
@ -385,7 +385,7 @@ struct boot_param_header {
|
||||
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
|
||||
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)
|
||||
|
||||
- size_dt_strings
|
||||
@ -553,7 +553,7 @@ looks like in practice.
|
||||
|
||||
This tree is almost a minimal tree. It pretty much contains the
|
||||
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
|
||||
through /chosen, like in this example, the platform type (mandatory)
|
||||
and the kernel command line arguments (optional).
|
||||
|
@ -1,7 +1,7 @@
|
||||
The DVB subsystem currently registers to the sysfs subsystem using the
|
||||
"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
|
||||
currently *not* available.
|
||||
|
||||
|
@ -311,7 +311,7 @@ Total Correctable Errors count attribute file:
|
||||
'ce_noinfo_count'
|
||||
|
||||
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,
|
||||
yet no information is available to indicate which slot
|
||||
the failing memory is in. This count field should be also
|
||||
|
@ -1832,15 +1832,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
perfmon on Intel CPUs instead of the
|
||||
CPU specific event set.
|
||||
|
||||
oops=panic Always panic on oopses. Default is to just kill the process,
|
||||
but there is a small probability of deadlocking the machine.
|
||||
oops=panic Always panic on oopses. Default is to just kill the
|
||||
process, but there is a small probability of
|
||||
deadlocking the machine.
|
||||
This will also cause panics on machine check exceptions.
|
||||
Useful together with panic=30 to trigger a reboot.
|
||||
|
||||
OSS [HW,OSS]
|
||||
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>
|
||||
|
||||
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=
|
||||
[KNL] Should the soft-lockup detector generate panics.
|
||||
Format: <integer>
|
||||
|
||||
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
||||
See Documentation/sonypi.txt
|
||||
@ -2475,8 +2478,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
topology= [S390]
|
||||
Format: {off | on}
|
||||
Specify if the kernel should make use of the cpu
|
||||
topology informations if the hardware supports these.
|
||||
The scheduler will make use of these informations and
|
||||
topology information if the hardware supports this.
|
||||
The scheduler will make use of this information and
|
||||
e.g. base its process migration decisions on it.
|
||||
Default is on.
|
||||
|
||||
@ -2529,8 +2532,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
reported either.
|
||||
|
||||
unknown_nmi_panic
|
||||
[X86]
|
||||
Set unknown_nmi_panic=1 early on boot.
|
||||
[X86] Cause panic on unknown NMI.
|
||||
|
||||
usbcore.autosuspend=
|
||||
[USB] The autosuspend time delay (in seconds) used
|
||||
|
@ -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
|
||||
Valgrind tool (memcheck --leak-check) to detect the memory leaks in
|
||||
user-space applications.
|
||||
Kmemleak is supported on x86, arm, powerpc, sparc, sh, microblaze and tile.
|
||||
|
||||
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
|
||||
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
|
||||
architectures are currently supported.
|
||||
Page allocations and ioremap are not tracked.
|
||||
|
@ -61,7 +61,7 @@ Usage
|
||||
Hotkeys are also reported as input keys (like keyboards) you can check
|
||||
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
|
||||
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
|
||||
several informations.
|
||||
several items of information.
|
||||
|
||||
LED display works for the following models:
|
||||
W1000N
|
||||
|
8
Documentation/leds/00-INDEX
Normal file
8
Documentation/leds/00-INDEX
Normal 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.
|
@ -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
|
||||
should cover this option and be possible to add without breaking the
|
||||
current interface.
|
||||
|
@ -72,7 +72,7 @@ folder:
|
||||
# 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/
|
||||
# gateways socket transtable_global vis_data
|
||||
|
@ -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,
|
||||
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>
|
||||
So lets have a look at the init process
|
||||
cd /proc/1
|
||||
|
@ -1,8 +1,7 @@
|
||||
Each CPU has a "base" scheduling domain (struct sched_domain). These are
|
||||
accessed via cpu_sched_domain(i) and this_sched_domain() macros. The domain
|
||||
Each CPU has a "base" scheduling domain (struct sched_domain). The domain
|
||||
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
|
||||
are locklessly updated.
|
||||
MUST be NULL terminated, and domain structures should be per-CPU as they are
|
||||
locklessly updated.
|
||||
|
||||
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
|
||||
@ -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
|
||||
out of balance are tasks moved between groups.
|
||||
|
||||
In kernel/sched.c, rebalance_tick is run periodically on each CPU. This
|
||||
function takes its CPU's base sched domain and checks to see if has reached
|
||||
its rebalance interval. If so, then it will run load_balance on that domain.
|
||||
rebalance_tick then checks the parent sched_domain (if it exists), and the
|
||||
parent of the parent and so forth.
|
||||
In kernel/sched.c, trigger_load_balance() is run periodically on each CPU
|
||||
through scheduler_tick(). It raises a softirq after the next regularly scheduled
|
||||
rebalancing event for the current runqueue has arrived. The actual load
|
||||
balancing workhorse, run_rebalance_domains()->rebalance_domains(), is then run
|
||||
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 ***
|
||||
The "base" domain will "span" the first level of the hierarchy. In the case
|
||||
|
@ -285,7 +285,7 @@ from the driver.
|
||||
|
||||
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.
|
||||
As the driver code got more complex, I have decided to remove everything
|
||||
that didn't seem actually useful.
|
||||
|
@ -2229,7 +2229,7 @@ Proc interfaces (/proc/asound)
|
||||
|
||||
/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>]"
|
||||
|
||||
<app_name> - name of application with (higher priority) or without path
|
||||
|
@ -1,10 +1,10 @@
|
||||
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
|
||||
Please, read the head of the source before using it. It contain useful
|
||||
informations.
|
||||
information.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
@ -68,7 +68,7 @@ Sound cards supported
|
||||
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).
|
||||
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)
|
||||
activating the audio card with the MS-DOS device driver, then you have to
|
||||
<ctrl>-<alt>-<del> and boot Linux.
|
||||
|
@ -5,7 +5,7 @@ FIRST OF ALL
|
||||
============
|
||||
|
||||
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.
|
||||
|
||||
And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s
|
||||
|
@ -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.
|
||||
This list tends to be outdated because it is updated manually ...
|
||||
|
||||
|
@ -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.
|
||||
|
||||
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
|
||||
makes no difference). The bttv driver prints a line to the kernel
|
||||
log, telling which card type is used. Like this one:
|
||||
|
@ -191,10 +191,10 @@ Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
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
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
|
@ -214,10 +214,10 @@ Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
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
|
||||
filesystem interface.
|
||||
Default: 2
|
||||
|
@ -413,7 +413,7 @@ Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 6:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = configuration or general messages
|
||||
4 = warnings
|
||||
5 = called functions
|
||||
|
@ -181,10 +181,10 @@ Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
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
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
@ -261,7 +261,7 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
|
||||
|
||||
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
|
||||
by Andrew Birkett <andy@nobugs.org>;
|
||||
- The initialization values of the ZC0301 controller connected to the PAS202BCB
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 39
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION = -rc2
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -386,8 +386,12 @@
|
||||
#define __NR_fanotify_init 368
|
||||
#define __NR_fanotify_mark 369
|
||||
#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__
|
||||
#ifndef __ASSEMBLY__
|
||||
|
@ -10,6 +10,7 @@ CFLAGS_REMOVE_early_printk.o = -pg
|
||||
CFLAGS_REMOVE_selfmod.o = -pg
|
||||
CFLAGS_REMOVE_heartbeat.o = -pg
|
||||
CFLAGS_REMOVE_ftrace.o = -pg
|
||||
CFLAGS_REMOVE_process.o = -pg
|
||||
endif
|
||||
|
||||
extra-y := head.o vmlinux.lds
|
||||
|
@ -51,6 +51,9 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||
: "r" (parent), "r" (return_hooker)
|
||||
);
|
||||
|
||||
flush_dcache_range((u32)parent, (u32)parent + 4);
|
||||
flush_icache_range((u32)parent, (u32)parent + 4);
|
||||
|
||||
if (unlikely(faulted)) {
|
||||
ftrace_graph_stop();
|
||||
WARN_ON(1);
|
||||
@ -95,6 +98,9 @@ static int ftrace_modify_code(unsigned long addr, unsigned int value)
|
||||
if (unlikely(faulted))
|
||||
return -EFAULT;
|
||||
|
||||
flush_dcache_range(addr, addr + 4);
|
||||
flush_icache_range(addr, addr + 4);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -195,8 +201,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
ret += ftrace_modify_code((unsigned long)&ftrace_caller,
|
||||
MICROBLAZE_NOP);
|
||||
|
||||
/* All changes are done - lets do caches consistent */
|
||||
flush_icache();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -210,7 +214,6 @@ int ftrace_enable_ftrace_graph_caller(void)
|
||||
|
||||
old_jump = *(unsigned int *)ip; /* save jump over instruction */
|
||||
ret = ftrace_modify_code(ip, MICROBLAZE_NOP);
|
||||
flush_icache();
|
||||
|
||||
pr_debug("%s: Replace instruction: 0x%x\n", __func__, old_jump);
|
||||
return ret;
|
||||
@ -222,7 +225,6 @@ int ftrace_disable_ftrace_graph_caller(void)
|
||||
unsigned long ip = (unsigned long)(&ftrace_call_graph);
|
||||
|
||||
ret = ftrace_modify_code(ip, old_jump);
|
||||
flush_icache();
|
||||
|
||||
pr_debug("%s\n", __func__);
|
||||
return ret;
|
||||
|
@ -158,11 +158,11 @@ void __init init_IRQ(void)
|
||||
for (i = 0; i < nr_irq; ++i) {
|
||||
if (intr_type & (0x00000001 << i)) {
|
||||
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);
|
||||
} else {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -375,3 +375,7 @@ ENTRY(sys_call_table)
|
||||
.long sys_fanotify_init
|
||||
.long sys_fanotify_mark
|
||||
.long sys_prlimit64 /* 370 */
|
||||
.long sys_name_to_handle_at
|
||||
.long sys_open_by_handle_at
|
||||
.long sys_clock_adjtime
|
||||
.long sys_syncfs
|
||||
|
@ -2,6 +2,12 @@
|
||||
# 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
|
||||
|
||||
ifeq ($(CONFIG_OPT_LIB_ASM),y)
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@ -553,7 +553,7 @@
|
||||
reg = <0 0xffe09000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
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>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <16 2>;
|
||||
@ -580,8 +580,8 @@
|
||||
#address-cells = <3>;
|
||||
reg = <0 0xffe0a000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
|
||||
ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
|
||||
clock-frequency = <33333333>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <16 2>;
|
||||
@ -590,8 +590,8 @@
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
ranges = <0x2000000 0x0 0xc0000000
|
||||
0x2000000 0x0 0xc0000000
|
||||
ranges = <0x2000000 0x0 0x80000000
|
||||
0x2000000 0x0 0x80000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@ -537,7 +537,7 @@
|
||||
reg = <0 0xffe09000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
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>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <25 2>;
|
||||
@ -564,8 +564,8 @@
|
||||
#address-cells = <3>;
|
||||
reg = <0 0xffe0a000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
|
||||
ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
|
||||
clock-frequency = <33333333>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <26 2>;
|
||||
@ -574,8 +574,8 @@
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
ranges = <0x2000000 0x0 0xc0000000
|
||||
0x2000000 0x0 0xc0000000
|
||||
ranges = <0x2000000 0x0 0x80000000
|
||||
0x2000000 0x0 0x80000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
|
@ -6,7 +6,7 @@
|
||||
* This dts file allows core0 to have memory, l2, i2c, spi, gpio, dma1, usb,
|
||||
* 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
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@ -342,7 +342,7 @@
|
||||
reg = <0 0xffe09000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
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>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <25 2>;
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
* 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
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@ -162,8 +162,8 @@
|
||||
#address-cells = <3>;
|
||||
reg = <0 0xffe0a000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
|
||||
ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
|
||||
clock-frequency = <33333333>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <26 2>;
|
||||
@ -172,8 +172,8 @@
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
ranges = <0x2000000 0x0 0xc0000000
|
||||
0x2000000 0x0 0xc0000000
|
||||
ranges = <0x2000000 0x0 0x80000000
|
||||
0x2000000 0x0 0x80000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
|
@ -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 */
|
||||
#ifdef CONFIG_PPC_STD_MMU_64
|
||||
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
|
||||
static void crash_kexec_wait_realmode(int cpu)
|
||||
{
|
||||
unsigned int msecs;
|
||||
@ -188,6 +188,8 @@ static void crash_kexec_wait_realmode(int cpu)
|
||||
}
|
||||
mb();
|
||||
}
|
||||
#else
|
||||
static inline void crash_kexec_wait_realmode(int cpu) {}
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -344,9 +346,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
||||
crash_save_cpu(regs, crashing_cpu);
|
||||
crash_kexec_prepare_cpus(crashing_cpu);
|
||||
cpu_set(crashing_cpu, cpus_in_crash);
|
||||
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
|
||||
crash_kexec_wait_realmode(crashing_cpu);
|
||||
#endif
|
||||
|
||||
machine_kexec_mask_interrupts();
|
||||
|
||||
|
@ -203,7 +203,7 @@ void __init free_unused_pacas(void)
|
||||
{
|
||||
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)
|
||||
return;
|
||||
|
@ -509,6 +509,9 @@ void __init smp_setup_cpu_maps(void)
|
||||
*/
|
||||
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();
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
@ -431,7 +431,7 @@ virt_page_table_tlb_miss_fault:
|
||||
* 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
|
||||
* 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
|
||||
* a stray kernel pointer or a userland attack trying to hit those
|
||||
|
@ -46,7 +46,7 @@ config PPC_OF_BOOT_TRAMPOLINE
|
||||
help
|
||||
Support from booting from Open Firmware or yaboot using an
|
||||
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.
|
||||
|
||||
In case of doubt, say Y
|
||||
|
@ -378,7 +378,7 @@ static int __init pSeries_init_panel(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(pSeries_init_panel);
|
||||
machine_arch_initcall(pseries, pSeries_init_panel);
|
||||
|
||||
static int pseries_set_dabr(unsigned long dabr)
|
||||
{
|
||||
|
@ -112,10 +112,10 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
|
||||
|
||||
/* Fixup atomic count: it exited inside IRQ handler. */
|
||||
task_thread_info(paca[lcpu].__current)->preempt_count = 0;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (get_cpu_current_state(lcpu) == CPU_STATE_INACTIVE)
|
||||
goto out;
|
||||
|
||||
#endif
|
||||
/*
|
||||
* If the RTAS start-cpu token does not exist then presume the
|
||||
* cpu is already spinning.
|
||||
@ -130,7 +130,9 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
out:
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -144,16 +146,15 @@ static void __devinit smp_xics_setup_cpu(int cpu)
|
||||
vpa_init(cpu);
|
||||
|
||||
cpumask_clear_cpu(cpu, of_spin_mask);
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
set_cpu_current_state(cpu, CPU_STATE_ONLINE);
|
||||
set_default_offline_state(cpu);
|
||||
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_XICS */
|
||||
|
||||
static void __devinit smp_pSeries_kick_cpu(int nr)
|
||||
{
|
||||
long rc;
|
||||
unsigned long hcpuid;
|
||||
BUG_ON(nr < 0 || nr >= NR_CPUS);
|
||||
|
||||
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
|
||||
*/
|
||||
paca[nr].cpu_start = 1;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
set_preferred_offline_state(nr, CPU_STATE_ONLINE);
|
||||
|
||||
if (get_cpu_current_state(nr) == CPU_STATE_INACTIVE) {
|
||||
long rc;
|
||||
unsigned long hcpuid;
|
||||
|
||||
hcpuid = get_hard_smp_processor_id(nr);
|
||||
rc = plpar_hcall_norets(H_PROD, hcpuid);
|
||||
if (rc != H_SUCCESS)
|
||||
printk(KERN_ERR "Error: Prod to wake up processor %d "
|
||||
"Ret= %ld\n", nr, rc);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static int smp_pSeries_cpu_bootable(unsigned int nr)
|
||||
|
@ -48,7 +48,7 @@ ASM_GENERIC_HEADERS += bitsperlong.h bug.h bugs.h
|
||||
ASM_GENERIC_HEADERS += cputime.h current.h
|
||||
ASM_GENERIC_HEADERS += device.h div64.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 += ioctl.h ioctls.h ipcbuf.h irq_regs.h
|
||||
ASM_GENERIC_HEADERS += kdebug.h kmap_types.h
|
||||
|
@ -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__ */
|
@ -23,16 +23,6 @@
|
||||
#define PKUNITY_SDRAM_BASE 0x00000000 /* 0x00000000 - 0x7FFFFFFF 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)
|
||||
* 0x80000000 - 0x8000000B 12B PCI Configuration regs
|
||||
|
@ -50,7 +50,6 @@ void puv3_pci_adjust_zones(unsigned long *size, unsigned long *holes);
|
||||
|
||||
/* kuser area */
|
||||
#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 */
|
||||
#define kuser_vecpage_to_vectors(x) ((x) - (KUSER_VECPAGE_BASE) \
|
||||
+ (VECTORS_BASE))
|
||||
|
@ -99,11 +99,6 @@ static struct resource puv3_unigfx_resources[] = {
|
||||
.end = io_v2p(PKUNITY_UNIGFX_BASE) + 0xfff,
|
||||
.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[] = {
|
||||
|
@ -88,11 +88,6 @@ static int puv3_rtc_setpie(struct device *dev, int enabled)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int puv3_rtc_setfreq(struct device *dev, int freq)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Time read/write */
|
||||
|
||||
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,
|
||||
.read_alarm = puv3_rtc_getalarm,
|
||||
.set_alarm = puv3_rtc_setalarm,
|
||||
.irq_set_freq = puv3_rtc_setfreq,
|
||||
.irq_set_state = puv3_rtc_setpie,
|
||||
.proc = puv3_rtc_proc,
|
||||
};
|
||||
|
||||
@ -294,8 +287,6 @@ static int puv3_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
puv3_rtc_enable(pdev, 1);
|
||||
|
||||
puv3_rtc_setfreq(&pdev->dev, 1);
|
||||
|
||||
/* register RTC and exit */
|
||||
|
||||
rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops,
|
||||
|
@ -63,12 +63,6 @@ static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
|
||||
* Standard memory resources
|
||||
*/
|
||||
static struct resource mem_res[] = {
|
||||
{
|
||||
.name = "Video RAM",
|
||||
.start = 0,
|
||||
.end = 0,
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
{
|
||||
.name = "Kernel text",
|
||||
.start = 0,
|
||||
@ -83,9 +77,8 @@ static struct resource mem_res[] = {
|
||||
}
|
||||
};
|
||||
|
||||
#define video_ram mem_res[0]
|
||||
#define kernel_code mem_res[1]
|
||||
#define kernel_data mem_res[2]
|
||||
#define kernel_code mem_res[0]
|
||||
#define kernel_data mem_res[1]
|
||||
|
||||
/*
|
||||
* 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)
|
||||
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;
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/unistd.h>
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
OUTPUT_ARCH(unicore32)
|
||||
ENTRY(stext)
|
||||
@ -29,7 +30,7 @@ SECTIONS
|
||||
HEAD_TEXT_SECTION
|
||||
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||
INIT_DATA_SECTION(16)
|
||||
PERCPU(PAGE_SIZE)
|
||||
PERCPU(L1_CACHE_BYTES, PAGE_SIZE)
|
||||
__init_end = .;
|
||||
|
||||
_stext = .;
|
||||
@ -45,10 +46,10 @@ SECTIONS
|
||||
|
||||
_sdata = .;
|
||||
RO_DATA_SECTION(PAGE_SIZE)
|
||||
RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE)
|
||||
RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
|
||||
_edata = .;
|
||||
|
||||
EXCEPTION_TABLE(32)
|
||||
EXCEPTION_TABLE(L1_CACHE_BYTES)
|
||||
NOTES
|
||||
|
||||
BSS_SECTION(0, 0, 0)
|
||||
|
@ -338,15 +338,6 @@ void __init uc32_mm_memblock_reserve(void)
|
||||
* and can only be in node 0.
|
||||
*/
|
||||
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)
|
||||
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
|
||||
* location (0xffff0000). If we aren't using high-vectors, also
|
||||
|
@ -2,7 +2,6 @@
|
||||
#define _ASM_X86_APIC_H
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pm.h>
|
||||
|
||||
#include <asm/alternative.h>
|
||||
|
@ -10,7 +10,6 @@
|
||||
|
||||
#include <linux/spinlock.h> /* And spinlocks */
|
||||
#include <asm/io.h> /* need byte IO */
|
||||
#include <linux/delay.h>
|
||||
|
||||
#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
|
||||
#define dma_outb outb_p
|
||||
|
@ -95,7 +95,6 @@ extern void setup_node_to_cpumask_map(void);
|
||||
#ifdef CONFIG_X86_32
|
||||
extern unsigned long node_start_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 SD_CACHE_NICE_TRIES 1
|
||||
|
@ -21,7 +21,7 @@ const struct pci_device_id amd_nb_misc_ids[] = {
|
||||
EXPORT_SYMBOL(amd_nb_misc_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) },
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
||||
u64 hw_nmi_get_sample_period(void)
|
||||
|
@ -93,10 +93,6 @@ static inline void numaq_register_node(int node, struct sys_cfg_data *scd)
|
||||
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]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/crash_dump.h>
|
||||
|
||||
#include <asm/uv/uv_mmrs.h>
|
||||
#include <asm/uv/uv_hub.h>
|
||||
@ -34,6 +36,7 @@
|
||||
#include <asm/ipi.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/x86_init.h>
|
||||
#include <asm/emergency-restart.h>
|
||||
|
||||
DEFINE_PER_CPU(int, x2apic_extra_bits);
|
||||
|
||||
@ -810,4 +813,11 @@ void __init uv_system_init(void)
|
||||
|
||||
/* register Legacy VGA I/O redirection handler */
|
||||
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;
|
||||
}
|
||||
|
@ -1626,7 +1626,7 @@ out:
|
||||
static unsigned int mce_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
poll_wait(file, &mce_wait, wait);
|
||||
if (rcu_dereference_check_mce(mcelog.next))
|
||||
if (rcu_access_index(mcelog.next))
|
||||
return POLLIN | POLLRDNORM;
|
||||
if (!mce_apei_read_done && apei_check_mce())
|
||||
return POLLIN | POLLRDNORM;
|
||||
|
@ -293,14 +293,24 @@ set_mtrr(unsigned int reg, unsigned long base, unsigned long size, mtrr_type typ
|
||||
|
||||
/*
|
||||
* 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
|
||||
* to replicate across all the APs.
|
||||
* If we're doing that @reg is set to something special...
|
||||
*
|
||||
* We use this same function to initialize the mtrrs during boot,
|
||||
* resume, runtime cpu online and on an explicit request to set a
|
||||
* 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)
|
||||
mtrr_if->set(reg, base, size, type);
|
||||
else if (!mtrr_aps_delayed_init)
|
||||
else
|
||||
mtrr_if->set_all();
|
||||
|
||||
/* Wait for the others */
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/apic.h>
|
||||
#include <asm/io_apic.h>
|
||||
|
@ -550,6 +550,7 @@ static void __exit microcode_exit(void)
|
||||
microcode_dev_exit();
|
||||
|
||||
unregister_hotcpu_notifier(&mc_cpu_notifier);
|
||||
unregister_syscore_ops(&mc_syscore_ops);
|
||||
|
||||
get_online_cpus();
|
||||
mutex_lock(µcode_mutex);
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/tboot.h>
|
||||
#include <linux/delay.h>
|
||||
#include <acpi/reboot.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/apic.h>
|
||||
|
@ -104,13 +104,9 @@ extern unsigned long highend_pfn, highstart_pfn;
|
||||
|
||||
#define LARGE_PAGE_BYTES (PTRS_PER_PTE * PAGE_SIZE)
|
||||
|
||||
unsigned long node_remap_size[MAX_NUMNODES];
|
||||
static void *node_remap_start_vaddr[MAX_NUMNODES];
|
||||
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)
|
||||
{
|
||||
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;
|
||||
memblock_x86_register_active_regions(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. */
|
||||
nodes_clear(node_online_map);
|
||||
@ -164,9 +159,8 @@ static void __init allocate_pgdat(int nid)
|
||||
{
|
||||
char buf[16];
|
||||
|
||||
if (node_has_online_mem(nid) && node_remap_start_vaddr[nid])
|
||||
NODE_DATA(nid) = (pg_data_t *)node_remap_start_vaddr[nid];
|
||||
else {
|
||||
NODE_DATA(nid) = alloc_remap(nid, ALIGN(sizeof(pg_data_t), PAGE_SIZE));
|
||||
if (!NODE_DATA(nid)) {
|
||||
unsigned long pgdat_phys;
|
||||
pgdat_phys = memblock_find_in_range(min_low_pfn<<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
|
||||
* 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.
|
||||
* Remap memory allocator
|
||||
*/
|
||||
static unsigned long node_remap_start_pfn[MAX_NUMNODES];
|
||||
static void *node_remap_end_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 *allocation = node_remap_alloc_vaddr[nid];
|
||||
|
||||
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;
|
||||
|
||||
node_remap_alloc_vaddr[nid] += size;
|
||||
@ -209,26 +216,6 @@ void *alloc_remap(int nid, unsigned long size)
|
||||
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
|
||||
/**
|
||||
* 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;
|
||||
|
||||
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_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);
|
||||
|
||||
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);
|
||||
pgd_t *pgd = pgd_base + pgd_index(vaddr);
|
||||
pud_t *pud = pud_offset(pgd, vaddr);
|
||||
@ -264,132 +252,102 @@ void resume_map_numa_kva(pgd_t *pgd_base)
|
||||
}
|
||||
#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, reserve_pages = 0;
|
||||
unsigned long size, pfn;
|
||||
u64 node_pa, remap_pa;
|
||||
void *remap_va;
|
||||
|
||||
for_each_online_node(nid) {
|
||||
u64 node_kva_target;
|
||||
u64 node_kva_final;
|
||||
/*
|
||||
* The acpi/srat node info can show hot-add memroy zones where
|
||||
* 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;
|
||||
|
||||
/*
|
||||
* The acpi/srat node info can show hot-add memroy zones
|
||||
* where 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)
|
||||
continue;
|
||||
if (!node_end_pfn[nid])
|
||||
continue;
|
||||
if (node_end_pfn[nid] > max_pfn)
|
||||
node_end_pfn[nid] = max_pfn;
|
||||
/* calculate the necessary space aligned to large page size */
|
||||
size = node_memmap_size_bytes(nid, node_start_pfn[nid],
|
||||
min(node_end_pfn[nid], max_pfn));
|
||||
size += ALIGN(sizeof(pg_data_t), PAGE_SIZE);
|
||||
size = ALIGN(size, LARGE_PAGE_BYTES);
|
||||
|
||||
/* ensure the remap includes space for the pgdat. */
|
||||
size = node_remap_size[nid] + sizeof(pg_data_t);
|
||||
|
||||
/* convert size to large (pmd size) pages, rounding up */
|
||||
size = (size + LARGE_PAGE_BYTES - 1) / LARGE_PAGE_BYTES;
|
||||
/* now the roundup is correct, convert to PAGE_SIZE pages */
|
||||
size = size * PTRS_PER_PTE;
|
||||
|
||||
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;
|
||||
/* allocate node memory and the lowmem remap area */
|
||||
node_pa = memblock_find_in_range(node_start_pfn[nid] << PAGE_SHIFT,
|
||||
(u64)node_end_pfn[nid] << PAGE_SHIFT,
|
||||
size, LARGE_PAGE_BYTES);
|
||||
if (node_pa == MEMBLOCK_ERROR) {
|
||||
pr_warning("remap_alloc: failed to allocate %lu bytes for node %d\n",
|
||||
size, nid);
|
||||
return;
|
||||
}
|
||||
printk(KERN_INFO "Reserving total of %lx pages for numa KVA remap\n",
|
||||
reserve_pages);
|
||||
return reserve_pages;
|
||||
}
|
||||
memblock_x86_reserve_range(node_pa, node_pa + size, "KVA RAM");
|
||||
|
||||
static void init_remap_allocator(int nid)
|
||||
{
|
||||
node_remap_start_vaddr[nid] = pfn_to_kaddr(
|
||||
kva_start_pfn + node_remap_offset[nid]);
|
||||
node_remap_end_vaddr[nid] = node_remap_start_vaddr[nid] +
|
||||
(node_remap_size[nid] * PAGE_SIZE);
|
||||
node_remap_alloc_vaddr[nid] = node_remap_start_vaddr[nid] +
|
||||
ALIGN(sizeof(pg_data_t), PAGE_SIZE);
|
||||
remap_pa = memblock_find_in_range(min_low_pfn << PAGE_SHIFT,
|
||||
max_low_pfn << PAGE_SHIFT,
|
||||
size, LARGE_PAGE_BYTES);
|
||||
if (remap_pa == MEMBLOCK_ERROR) {
|
||||
pr_warning("remap_alloc: failed to allocate %lu bytes remap area for node %d\n",
|
||||
size, nid);
|
||||
memblock_x86_free_range(node_pa, node_pa + 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,
|
||||
(ulong) node_remap_start_vaddr[nid],
|
||||
(ulong) node_remap_end_vaddr[nid]);
|
||||
/* perform actual remap */
|
||||
for (pfn = 0; pfn < size >> PAGE_SHIFT; pfn += PTRS_PER_PTE)
|
||||
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)
|
||||
{
|
||||
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();
|
||||
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
|
||||
highstart_pfn = highend_pfn = max_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",
|
||||
(ulong) pfn_to_kaddr(max_low_pfn));
|
||||
for_each_online_node(nid) {
|
||||
init_remap_allocator(nid);
|
||||
|
||||
for_each_online_node(nid)
|
||||
allocate_pgdat(nid);
|
||||
}
|
||||
remap_numa_kva();
|
||||
|
||||
printk(KERN_DEBUG "High memory starts at vaddr %08lx\n",
|
||||
(ulong) pfn_to_kaddr(highstart_pfn));
|
||||
|
@ -276,7 +276,6 @@ int __init get_memcfg_from_srat(void)
|
||||
unsigned long end = min(node_end_pfn[nid], max_pfn);
|
||||
|
||||
memory_present(nid, start, end);
|
||||
node_remap_size[nid] = node_memmap_size_bytes(nid, start, end);
|
||||
}
|
||||
return 1;
|
||||
out_fail:
|
||||
|
@ -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->kernel ? ARCH_PERFMON_EVENTSEL_OS : 0;
|
||||
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;
|
||||
val |= event & 0xFF;
|
||||
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, "kernel", &counter_config[i].kernel);
|
||||
oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user);
|
||||
oprofilefs_create_ulong(sb, dir, "extra", &counter_config[i].extra);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -22,6 +22,7 @@ struct op_counter_config {
|
||||
unsigned long kernel;
|
||||
unsigned long user;
|
||||
unsigned long unit_mask;
|
||||
unsigned long extra;
|
||||
};
|
||||
|
||||
extern struct op_counter_config counter_config[];
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/uv/uv.h>
|
||||
|
@ -2163,7 +2163,7 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes)
|
||||
* size, something has gone terribly wrong.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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 *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)
|
||||
|
@ -261,7 +261,7 @@ static bool blk_kick_flush(struct request_queue *q)
|
||||
q->flush_rq.end_io = flush_end_io;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -281,7 +281,7 @@ static void flush_data_end_io(struct request *rq, int error)
|
||||
* blk_insert_flush - insert a new FLUSH/FUA request
|
||||
* @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
|
||||
* right queue.
|
||||
*
|
||||
@ -312,7 +312,7 @@ void blk_insert_flush(struct request *rq)
|
||||
*/
|
||||
if ((policy & REQ_FSEQ_DATA) &&
|
||||
!(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) {
|
||||
list_add(&rq->queuelist, &q->queue_head);
|
||||
list_add_tail(&rq->queuelist, &q->queue_head);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,8 @@
|
||||
|
||||
static struct kmem_cache *integrity_cachep;
|
||||
|
||||
static const char *bi_unsupported_name = "unsupported";
|
||||
|
||||
/**
|
||||
* blk_rq_count_integrity_sg - Count number of integrity scatterlist elements
|
||||
* @q: request queue
|
||||
@ -358,6 +360,14 @@ static struct kobj_type integrity_ktype = {
|
||||
.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
|
||||
* @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->tag_size = template->tag_size;
|
||||
} else
|
||||
bi->name = "unsupported";
|
||||
bi->name = bi_unsupported_name;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ struct throtl_grp {
|
||||
unsigned long slice_end[2];
|
||||
|
||||
/* Some throttle limits got updated for the group */
|
||||
bool limits_changed;
|
||||
int limits_changed;
|
||||
};
|
||||
|
||||
struct throtl_data
|
||||
@ -102,7 +102,7 @@ struct throtl_data
|
||||
/* Work for dispatching throttled bios */
|
||||
struct delayed_work throtl_work;
|
||||
|
||||
bool limits_changed;
|
||||
int limits_changed;
|
||||
};
|
||||
|
||||
enum tg_state_flags {
|
||||
|
@ -610,7 +610,7 @@ void elv_requeue_request(struct request_queue *q, struct request *rq)
|
||||
|
||||
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)
|
||||
@ -655,12 +655,25 @@ void elv_quiesce_end(struct request_queue *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);
|
||||
|
||||
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) {
|
||||
case ELEVATOR_INSERT_REQUEUE:
|
||||
case ELEVATOR_INSERT_FRONT:
|
||||
@ -722,24 +735,6 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)
|
||||
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);
|
||||
|
||||
void elv_add_request(struct request_queue *q, struct request *rq, int where)
|
||||
|
@ -71,6 +71,9 @@ static struct usb_device_id btusb_table[] = {
|
||||
/* Apple MacBookAir3,1, MacBookAir3,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x821b) },
|
||||
|
||||
/* Apple MacBookPro8,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x821a) },
|
||||
|
||||
/* AVM BlueFRITZ! USB v2.0 */
|
||||
{ USB_DEVICE(0x057c, 0x3800) },
|
||||
|
||||
@ -690,7 +693,8 @@ static int btusb_send_frame(struct sk_buff *skb)
|
||||
break;
|
||||
|
||||
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;
|
||||
|
||||
urb = usb_alloc_urb(0, GFP_ATOMIC);
|
||||
|
@ -1147,13 +1147,14 @@ static struct platform_driver mpc85xx_mc_err_driver = {
|
||||
static void __init mpc85xx_mc_clear_rfxe(void *data)
|
||||
{
|
||||
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
|
||||
|
||||
static int __init mpc85xx_mc_init(void)
|
||||
{
|
||||
int res = 0;
|
||||
u32 pvr = 0;
|
||||
|
||||
printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, "
|
||||
"(C) 2006 Montavista Software\n");
|
||||
@ -1183,12 +1184,17 @@ static int __init mpc85xx_mc_init(void)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FSL_SOC_BOOKE
|
||||
/*
|
||||
* 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);
|
||||
pvr = mfspr(SPRN_PVR);
|
||||
|
||||
if ((PVR_VER(pvr) == PVR_VER_E500V1) ||
|
||||
(PVR_VER(pvr) == PVR_VER_E500V2)) {
|
||||
/*
|
||||
* 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
|
||||
|
||||
return 0;
|
||||
@ -1206,7 +1212,12 @@ static void __exit mpc85xx_mc_restore_hid1(void *data)
|
||||
static void __exit mpc85xx_mc_exit(void)
|
||||
{
|
||||
#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
|
||||
#ifdef CONFIG_PCI
|
||||
platform_driver_unregister(&mpc85xx_pci_err_driver);
|
||||
|
@ -1297,7 +1297,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
|
||||
/**
|
||||
* 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;
|
||||
int i;
|
||||
@ -1318,6 +1318,7 @@ static u8 *drm_find_cea_extension(struct edid *edid)
|
||||
|
||||
return edid_ext;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_find_cea_extension);
|
||||
|
||||
/**
|
||||
* drm_detect_hdmi_monitor - detect whether monitor is hdmi.
|
||||
|
@ -269,21 +269,6 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
|
||||
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)
|
||||
{
|
||||
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)
|
||||
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)) {
|
||||
struct edid *edid;
|
||||
bool is_digital = false;
|
||||
|
@ -39,7 +39,7 @@
|
||||
ret__ = -ETIMEDOUT; \
|
||||
break; \
|
||||
} \
|
||||
if (W && !in_dbg_master()) msleep(W); \
|
||||
if (W && !(in_atomic() || in_dbg_master())) msleep(W); \
|
||||
} \
|
||||
ret__; \
|
||||
})
|
||||
|
@ -259,7 +259,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||||
if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
|
||||
goto timeout;
|
||||
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
||||
return 0;
|
||||
goto clear_err;
|
||||
|
||||
val = I915_READ(GMBUS3 + reg_offset);
|
||||
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))
|
||||
goto timeout;
|
||||
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
||||
return 0;
|
||||
goto clear_err;
|
||||
|
||||
val = loop = 0;
|
||||
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))
|
||||
goto timeout;
|
||||
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:
|
||||
DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n",
|
||||
bus->reg0 & 0xff, bus->adapter.name);
|
||||
I915_WRITE(GMBUS0 + reg_offset, 0);
|
||||
|
||||
/* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
|
||||
bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff);
|
||||
if (!bus->force_bit)
|
||||
|
@ -473,19 +473,13 @@ static enum drm_connector_status
|
||||
intel_lvds_detect(struct drm_connector *connector, bool force)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
enum drm_connector_status status = connector_status_connected;
|
||||
enum drm_connector_status status;
|
||||
|
||||
status = intel_panel_detect(dev);
|
||||
if (status != connector_status_unknown)
|
||||
return status;
|
||||
|
||||
/* ACPI lid methods were generally unreliable in this generation, so
|
||||
* don't even bother.
|
||||
*/
|
||||
if (IS_GEN2(dev) || IS_GEN3(dev))
|
||||
return connector_status_connected;
|
||||
|
||||
return status;
|
||||
return connector_status_connected;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -835,25 +829,6 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev,
|
||||
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
|
||||
* @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);
|
||||
if (!intel_lvds) {
|
||||
return false;
|
||||
|
@ -97,7 +97,7 @@ nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
nvbo->bo.persistant_swap_storage = nvbo->gem->filp;
|
||||
nvbo->bo.persistent_swap_storage = nvbo->gem->filp;
|
||||
nvbo->gem->driver_private = nvbo;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1009,6 +1009,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
uint64_t fb_location;
|
||||
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
||||
u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
|
||||
u32 tmp;
|
||||
int r;
|
||||
|
||||
/* 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,
|
||||
(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) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
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;
|
||||
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
||||
u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
|
||||
u32 tmp;
|
||||
int r;
|
||||
|
||||
/* 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,
|
||||
(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) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
|
@ -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)
|
||||
{
|
||||
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 */
|
||||
radeon_irq_kms_pflip_irq_get(rdev, crtc);
|
||||
}
|
||||
|
@ -675,7 +675,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
||||
ATOM_ENCODER_CAP_RECORD *cap_record;
|
||||
u16 caps = 0;
|
||||
|
||||
while (record->ucRecordType > 0 &&
|
||||
while (record->ucRecordSize > 0 &&
|
||||
record->ucRecordType > 0 &&
|
||||
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||
switch (record->ucRecordType) {
|
||||
case ATOM_ENCODER_CAP_RECORD_TYPE:
|
||||
@ -720,7 +721,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
||||
break;
|
||||
}
|
||||
|
||||
while (record->ucRecordType > 0 &&
|
||||
while (record->ucRecordSize > 0 &&
|
||||
record->ucRecordType > 0 &&
|
||||
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||
switch (record->ucRecordType) {
|
||||
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_I2C_ID_CONFIG_ACCESS *i2c_config;
|
||||
|
||||
while (record->ucRecordType > 0
|
||||
&& record->
|
||||
ucRecordType <=
|
||||
ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||
while (record->ucRecordSize > 0 &&
|
||||
record->ucRecordType > 0 &&
|
||||
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||
switch (record->ucRecordType) {
|
||||
case ATOM_I2C_RECORD_TYPE:
|
||||
i2c_record =
|
||||
|
@ -2079,6 +2079,19 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&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;
|
||||
default:
|
||||
DRM_INFO("Connector table: %d (invalid)\n",
|
||||
|
@ -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)
|
||||
{
|
||||
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 */
|
||||
radeon_irq_kms_pflip_irq_get(rdev, crtc);
|
||||
}
|
||||
|
@ -1168,7 +1168,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
|
||||
uint32_t page_alignment,
|
||||
unsigned long buffer_start,
|
||||
bool interruptible,
|
||||
struct file *persistant_swap_storage,
|
||||
struct file *persistent_swap_storage,
|
||||
size_t acc_size,
|
||||
void (*destroy) (struct ttm_buffer_object *))
|
||||
{
|
||||
@ -1211,7 +1211,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
|
||||
bo->priv_flags = 0;
|
||||
bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);
|
||||
bo->seq_valid = false;
|
||||
bo->persistant_swap_storage = persistant_swap_storage;
|
||||
bo->persistent_swap_storage = persistent_swap_storage;
|
||||
bo->acc_size = acc_size;
|
||||
atomic_inc(&bo->glob->bo_count);
|
||||
|
||||
@ -1260,7 +1260,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
|
||||
uint32_t page_alignment,
|
||||
unsigned long buffer_start,
|
||||
bool interruptible,
|
||||
struct file *persistant_swap_storage,
|
||||
struct file *persistent_swap_storage,
|
||||
struct ttm_buffer_object **p_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,
|
||||
buffer_start, interruptible,
|
||||
persistant_swap_storage, acc_size, NULL);
|
||||
persistent_swap_storage, acc_size, NULL);
|
||||
if (likely(ret == 0))
|
||||
*p_bo = bo;
|
||||
|
||||
@ -1863,7 +1863,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
|
||||
if (bo->bdev->driver->swap_notify)
|
||||
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:
|
||||
|
||||
/**
|
||||
|
@ -332,7 +332,7 @@ void ttm_tt_destroy(struct ttm_tt *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)
|
||||
fput(ttm->swap_storage);
|
||||
|
||||
@ -503,7 +503,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
||||
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);
|
||||
ttm->swap_storage = NULL;
|
||||
ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED;
|
||||
@ -514,7 +514,7 @@ out_err:
|
||||
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 file *swap_storage;
|
||||
@ -540,7 +540,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!persistant_swap_storage) {
|
||||
if (!persistent_swap_storage) {
|
||||
swap_storage = shmem_file_setup("ttm swap",
|
||||
ttm->num_pages << PAGE_SHIFT,
|
||||
0);
|
||||
@ -549,7 +549,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
||||
return PTR_ERR(swap_storage);
|
||||
}
|
||||
} else
|
||||
swap_storage = persistant_swap_storage;
|
||||
swap_storage = persistent_swap_storage;
|
||||
|
||||
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->swap_storage = swap_storage;
|
||||
ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
|
||||
if (persistant_swap_storage)
|
||||
ttm->page_flags |= TTM_PAGE_FLAG_PERSISTANT_SWAP;
|
||||
if (persistent_swap_storage)
|
||||
ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP;
|
||||
|
||||
return 0;
|
||||
out_err:
|
||||
if (!persistant_swap_storage)
|
||||
if (!persistent_swap_storage)
|
||||
fput(swap_storage);
|
||||
|
||||
return ret;
|
||||
|
@ -154,4 +154,4 @@ module_exit(twl4030_madc_hwmon_exit);
|
||||
MODULE_DESCRIPTION("TWL4030 ADC Hwmon driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("J Keerthy");
|
||||
MODULE_ALIAS("twl4030_madc_hwmon");
|
||||
MODULE_ALIAS("platform:twl4030_madc_hwmon");
|
||||
|
@ -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.
|
||||
*/
|
||||
@ -550,28 +570,7 @@ plug_device:
|
||||
ide_unlock_host(host);
|
||||
plug_device_2:
|
||||
spin_lock_irq(q->queue_lock);
|
||||
|
||||
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);
|
||||
__ide_requeue_and_plug(q, rq);
|
||||
}
|
||||
|
||||
static int drive_is_ready(ide_drive_t *drive)
|
||||
|
@ -69,7 +69,7 @@ static irqreturn_t spear_kbd_interrupt(int irq, void *dev_id)
|
||||
u8 sts, val;
|
||||
|
||||
sts = readb(kbd->io_base + STATUS_REG);
|
||||
if (sts & DATA_AVAIL)
|
||||
if (!(sts & DATA_AVAIL))
|
||||
return IRQ_NONE;
|
||||
|
||||
if (kbd->last_key != KEY_RESERVED) {
|
||||
|
@ -302,10 +302,14 @@ static int uinput_validate_absbits(struct input_dev *dev)
|
||||
int retval = 0;
|
||||
|
||||
for (cnt = 0; cnt < ABS_CNT; cnt++) {
|
||||
int min, max;
|
||||
if (!test_bit(cnt, dev->absbit))
|
||||
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
|
||||
"%s: invalid abs[%02x] min:%d max:%d\n",
|
||||
UINPUT_NAME, cnt,
|
||||
|
@ -836,8 +836,8 @@ static const struct dmi_system_id __initconst toshiba_dmi_table[] = {
|
||||
},
|
||||
|
||||
},
|
||||
{ }
|
||||
#endif
|
||||
{ }
|
||||
};
|
||||
|
||||
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"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
#endif
|
||||
{ }
|
||||
};
|
||||
|
||||
void __init synaptics_module_init(void)
|
||||
|
@ -869,15 +869,15 @@ static int i8042_controller_selftest(void)
|
||||
do {
|
||||
|
||||
if (i8042_command(¶m, I8042_CMD_CTL_TEST)) {
|
||||
pr_err("i8042 controller self test timeout\n");
|
||||
pr_err("i8042 controller selftest timeout\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (param == I8042_RET_CTL_TEST)
|
||||
return 0;
|
||||
|
||||
pr_err("i8042 controller selftest failed. (%#x != %#x)\n",
|
||||
param, I8042_RET_CTL_TEST);
|
||||
dbg("i8042 controller selftest: %#x != %#x\n",
|
||||
param, I8042_RET_CTL_TEST);
|
||||
msleep(50);
|
||||
} while (i++ < 5);
|
||||
|
||||
@ -891,6 +891,7 @@ static int i8042_controller_selftest(void)
|
||||
pr_info("giving up on controller selftest, continuing anyway...\n");
|
||||
return 0;
|
||||
#else
|
||||
pr_err("i8042 controller selftest failed\n");
|
||||
return -EIO;
|
||||
#endif
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user