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.
|
- directory with laptop related info and laptop driver documentation.
|
||||||
ldm.txt
|
ldm.txt
|
||||||
- a brief description of LDM (Windows Dynamic Disks).
|
- a brief description of LDM (Windows Dynamic Disks).
|
||||||
leds-class.txt
|
leds/
|
||||||
- documents LED handling under Linux.
|
- directory with info about LED handling under Linux.
|
||||||
local_ops.txt
|
local_ops.txt
|
||||||
- semantics and behavior of local atomic operations.
|
- semantics and behavior of local atomic operations.
|
||||||
lockdep-design.txt
|
lockdep-design.txt
|
||||||
|
@ -40,7 +40,7 @@ What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-
|
|||||||
Date: March 2010
|
Date: March 2010
|
||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile holds informations like button
|
press of a button. A profile holds information like button
|
||||||
mappings, sensitivity, the colors of the 5 leds and light
|
mappings, sensitivity, the colors of the 5 leds and light
|
||||||
effects.
|
effects.
|
||||||
When read, these files return the respective profile. The
|
When read, these files return the respective profile. The
|
||||||
|
@ -33,7 +33,7 @@ Date: August 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_buttons holds informations about button layout.
|
profile_buttons holds information about button layout.
|
||||||
When written, this file lets one write the respective profile
|
When written, this file lets one write the respective profile
|
||||||
buttons back to the mouse. The data has to be 77 bytes long.
|
buttons back to the mouse. The data has to be 77 bytes long.
|
||||||
The mouse will reject invalid data.
|
The mouse will reject invalid data.
|
||||||
@ -47,7 +47,7 @@ Date: August 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_buttons holds informations about button layout.
|
profile_buttons holds information about button layout.
|
||||||
When read, these files return the respective profile buttons.
|
When read, these files return the respective profile buttons.
|
||||||
The returned data is 77 bytes in size.
|
The returned data is 77 bytes in size.
|
||||||
This file is readonly.
|
This file is readonly.
|
||||||
@ -58,7 +58,7 @@ Date: October 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_settings holds informations like resolution, sensitivity
|
profile_settings holds information like resolution, sensitivity
|
||||||
and light effects.
|
and light effects.
|
||||||
When written, this file lets one write the respective profile
|
When written, this file lets one write the respective profile
|
||||||
settings back to the mouse. The data has to be 43 bytes long.
|
settings back to the mouse. The data has to be 43 bytes long.
|
||||||
@ -73,7 +73,7 @@ Date: August 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_settings holds informations like resolution, sensitivity
|
profile_settings holds information like resolution, sensitivity
|
||||||
and light effects.
|
and light effects.
|
||||||
When read, these files return the respective profile settings.
|
When read, these files return the respective profile settings.
|
||||||
The returned data is 43 bytes in size.
|
The returned data is 43 bytes in size.
|
||||||
|
@ -52,7 +52,7 @@ Date: January 2011
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_buttons holds informations about button layout.
|
profile_buttons holds information about button layout.
|
||||||
When written, this file lets one write the respective profile
|
When written, this file lets one write the respective profile
|
||||||
buttons back to the mouse. The data has to be 23 bytes long.
|
buttons back to the mouse. The data has to be 23 bytes long.
|
||||||
The mouse will reject invalid data.
|
The mouse will reject invalid data.
|
||||||
@ -66,7 +66,7 @@ Date: January 2011
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_buttons holds informations about button layout.
|
profile_buttons holds information about button layout.
|
||||||
When read, these files return the respective profile buttons.
|
When read, these files return the respective profile buttons.
|
||||||
The returned data is 23 bytes in size.
|
The returned data is 23 bytes in size.
|
||||||
This file is readonly.
|
This file is readonly.
|
||||||
@ -77,7 +77,7 @@ Date: January 2011
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_settings holds informations like resolution, sensitivity
|
profile_settings holds information like resolution, sensitivity
|
||||||
and light effects.
|
and light effects.
|
||||||
When written, this file lets one write the respective profile
|
When written, this file lets one write the respective profile
|
||||||
settings back to the mouse. The data has to be 16 bytes long.
|
settings back to the mouse. The data has to be 16 bytes long.
|
||||||
@ -92,7 +92,7 @@ Date: January 2011
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_settings holds informations like resolution, sensitivity
|
profile_settings holds information like resolution, sensitivity
|
||||||
and light effects.
|
and light effects.
|
||||||
When read, these files return the respective profile settings.
|
When read, these files return the respective profile settings.
|
||||||
The returned data is 16 bytes in size.
|
The returned data is 16 bytes in size.
|
||||||
|
@ -39,7 +39,7 @@ Date: August 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_settings holds informations like resolution, sensitivity
|
profile_settings holds information like resolution, sensitivity
|
||||||
and light effects.
|
and light effects.
|
||||||
When written, this file lets one write the respective profile
|
When written, this file lets one write the respective profile
|
||||||
settings back to the mouse. The data has to be 13 bytes long.
|
settings back to the mouse. The data has to be 13 bytes long.
|
||||||
@ -54,7 +54,7 @@ Date: August 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_settings holds informations like resolution, sensitivity
|
profile_settings holds information like resolution, sensitivity
|
||||||
and light effects.
|
and light effects.
|
||||||
When read, these files return the respective profile settings.
|
When read, these files return the respective profile settings.
|
||||||
The returned data is 13 bytes in size.
|
The returned data is 13 bytes in size.
|
||||||
@ -66,7 +66,7 @@ Date: August 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_buttons holds informations about button layout.
|
profile_buttons holds information about button layout.
|
||||||
When written, this file lets one write the respective profile
|
When written, this file lets one write the respective profile
|
||||||
buttons back to the mouse. The data has to be 19 bytes long.
|
buttons back to the mouse. The data has to be 19 bytes long.
|
||||||
The mouse will reject invalid data.
|
The mouse will reject invalid data.
|
||||||
@ -80,7 +80,7 @@ Date: August 2010
|
|||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
Description: The mouse can store 5 profiles which can be switched by the
|
Description: The mouse can store 5 profiles which can be switched by the
|
||||||
press of a button. A profile is split in settings and buttons.
|
press of a button. A profile is split in settings and buttons.
|
||||||
profile_buttons holds informations about button layout.
|
profile_buttons holds information about button layout.
|
||||||
When read, these files return the respective profile buttons.
|
When read, these files return the respective profile buttons.
|
||||||
The returned data is 19 bytes in size.
|
The returned data is 19 bytes in size.
|
||||||
This file is readonly.
|
This file is readonly.
|
||||||
|
@ -27,7 +27,7 @@ KernelVersion: 2.6.20
|
|||||||
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
||||||
Description:
|
Description:
|
||||||
Some models like the W1N have a LED display that can be
|
Some models like the W1N have a LED display that can be
|
||||||
used to display several informations.
|
used to display several items of information.
|
||||||
To control the LED display, use the following :
|
To control the LED display, use the following :
|
||||||
echo 0x0T000DDD > /sys/devices/platform/asus_laptop/
|
echo 0x0T000DDD > /sys/devices/platform/asus_laptop/
|
||||||
where T control the 3 letters display, and DDD the 3 digits display.
|
where T control the 3 letters display, and DDD the 3 digits display.
|
||||||
|
@ -110,22 +110,22 @@ university server with various users - students, professors, system
|
|||||||
tasks etc. The resource planning for this server could be along the
|
tasks etc. The resource planning for this server could be along the
|
||||||
following lines:
|
following lines:
|
||||||
|
|
||||||
CPU : Top cpuset
|
CPU : "Top cpuset"
|
||||||
/ \
|
/ \
|
||||||
CPUSet1 CPUSet2
|
CPUSet1 CPUSet2
|
||||||
| |
|
| |
|
||||||
(Profs) (Students)
|
(Professors) (Students)
|
||||||
|
|
||||||
In addition (system tasks) are attached to topcpuset (so
|
In addition (system tasks) are attached to topcpuset (so
|
||||||
that they can run anywhere) with a limit of 20%
|
that they can run anywhere) with a limit of 20%
|
||||||
|
|
||||||
Memory : Professors (50%), students (30%), system (20%)
|
Memory : Professors (50%), Students (30%), system (20%)
|
||||||
|
|
||||||
Disk : Prof (50%), students (30%), system (20%)
|
Disk : Professors (50%), Students (30%), system (20%)
|
||||||
|
|
||||||
Network : WWW browsing (20%), Network File System (60%), others (20%)
|
Network : WWW browsing (20%), Network File System (60%), others (20%)
|
||||||
/ \
|
/ \
|
||||||
Prof (15%) students (5%)
|
Professors (15%) students (5%)
|
||||||
|
|
||||||
Browsers like Firefox/Lynx go into the WWW network class, while (k)nfsd go
|
Browsers like Firefox/Lynx go into the WWW network class, while (k)nfsd go
|
||||||
into NFS network class.
|
into NFS network class.
|
||||||
|
@ -138,7 +138,7 @@ and properties to be present. This will be described in detail in
|
|||||||
section III, but, for example, the kernel does not require you to
|
section III, but, for example, the kernel does not require you to
|
||||||
create a node for every PCI device in the system. It is a requirement
|
create a node for every PCI device in the system. It is a requirement
|
||||||
to have a node for PCI host bridges in order to provide interrupt
|
to have a node for PCI host bridges in order to provide interrupt
|
||||||
routing informations and memory/IO ranges, among others. It is also
|
routing information and memory/IO ranges, among others. It is also
|
||||||
recommended to define nodes for on chip devices and other buses that
|
recommended to define nodes for on chip devices and other buses that
|
||||||
don't specifically fit in an existing OF specification. This creates a
|
don't specifically fit in an existing OF specification. This creates a
|
||||||
great flexibility in the way the kernel can then probe those and match
|
great flexibility in the way the kernel can then probe those and match
|
||||||
@ -385,7 +385,7 @@ struct boot_param_header {
|
|||||||
among others, by kexec. If you are on an SMP system, this value
|
among others, by kexec. If you are on an SMP system, this value
|
||||||
should match the content of the "reg" property of the CPU node in
|
should match the content of the "reg" property of the CPU node in
|
||||||
the device-tree corresponding to the CPU calling the kernel entry
|
the device-tree corresponding to the CPU calling the kernel entry
|
||||||
point (see further chapters for more informations on the required
|
point (see further chapters for more information on the required
|
||||||
device-tree contents)
|
device-tree contents)
|
||||||
|
|
||||||
- size_dt_strings
|
- size_dt_strings
|
||||||
@ -553,7 +553,7 @@ looks like in practice.
|
|||||||
|
|
||||||
This tree is almost a minimal tree. It pretty much contains the
|
This tree is almost a minimal tree. It pretty much contains the
|
||||||
minimal set of required nodes and properties to boot a linux kernel;
|
minimal set of required nodes and properties to boot a linux kernel;
|
||||||
that is, some basic model informations at the root, the CPUs, and the
|
that is, some basic model information at the root, the CPUs, and the
|
||||||
physical memory layout. It also includes misc information passed
|
physical memory layout. It also includes misc information passed
|
||||||
through /chosen, like in this example, the platform type (mandatory)
|
through /chosen, like in this example, the platform type (mandatory)
|
||||||
and the kernel command line arguments (optional).
|
and the kernel command line arguments (optional).
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
The DVB subsystem currently registers to the sysfs subsystem using the
|
The DVB subsystem currently registers to the sysfs subsystem using the
|
||||||
"class_simple" interface.
|
"class_simple" interface.
|
||||||
|
|
||||||
This means that only the basic informations like module loading parameters
|
This means that only the basic information like module loading parameters
|
||||||
are presented through sysfs. Other things that might be interesting are
|
are presented through sysfs. Other things that might be interesting are
|
||||||
currently *not* available.
|
currently *not* available.
|
||||||
|
|
||||||
|
@ -311,7 +311,7 @@ Total Correctable Errors count attribute file:
|
|||||||
'ce_noinfo_count'
|
'ce_noinfo_count'
|
||||||
|
|
||||||
This attribute file displays the number of CEs that
|
This attribute file displays the number of CEs that
|
||||||
have occurred wherewith no informations as to which DIMM slot
|
have occurred wherewith no information as to which DIMM slot
|
||||||
is having errors. Memory is handicapped, but operational,
|
is having errors. Memory is handicapped, but operational,
|
||||||
yet no information is available to indicate which slot
|
yet no information is available to indicate which slot
|
||||||
the failing memory is in. This count field should be also
|
the failing memory is in. This count field should be also
|
||||||
|
@ -1832,15 +1832,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||||||
perfmon on Intel CPUs instead of the
|
perfmon on Intel CPUs instead of the
|
||||||
CPU specific event set.
|
CPU specific event set.
|
||||||
|
|
||||||
oops=panic Always panic on oopses. Default is to just kill the process,
|
oops=panic Always panic on oopses. Default is to just kill the
|
||||||
but there is a small probability of deadlocking the machine.
|
process, but there is a small probability of
|
||||||
|
deadlocking the machine.
|
||||||
This will also cause panics on machine check exceptions.
|
This will also cause panics on machine check exceptions.
|
||||||
Useful together with panic=30 to trigger a reboot.
|
Useful together with panic=30 to trigger a reboot.
|
||||||
|
|
||||||
OSS [HW,OSS]
|
OSS [HW,OSS]
|
||||||
See Documentation/sound/oss/oss-parameters.txt
|
See Documentation/sound/oss/oss-parameters.txt
|
||||||
|
|
||||||
panic= [KNL] Kernel behaviour on panic
|
panic= [KNL] Kernel behaviour on panic: delay <timeout>
|
||||||
|
seconds before rebooting
|
||||||
Format: <timeout>
|
Format: <timeout>
|
||||||
|
|
||||||
parkbd.port= [HW] Parallel port number the keyboard adapter is
|
parkbd.port= [HW] Parallel port number the keyboard adapter is
|
||||||
@ -2343,6 +2345,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||||||
|
|
||||||
softlockup_panic=
|
softlockup_panic=
|
||||||
[KNL] Should the soft-lockup detector generate panics.
|
[KNL] Should the soft-lockup detector generate panics.
|
||||||
|
Format: <integer>
|
||||||
|
|
||||||
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
||||||
See Documentation/sonypi.txt
|
See Documentation/sonypi.txt
|
||||||
@ -2475,8 +2478,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||||||
topology= [S390]
|
topology= [S390]
|
||||||
Format: {off | on}
|
Format: {off | on}
|
||||||
Specify if the kernel should make use of the cpu
|
Specify if the kernel should make use of the cpu
|
||||||
topology informations if the hardware supports these.
|
topology information if the hardware supports this.
|
||||||
The scheduler will make use of these informations and
|
The scheduler will make use of this information and
|
||||||
e.g. base its process migration decisions on it.
|
e.g. base its process migration decisions on it.
|
||||||
Default is on.
|
Default is on.
|
||||||
|
|
||||||
@ -2529,8 +2532,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||||||
reported either.
|
reported either.
|
||||||
|
|
||||||
unknown_nmi_panic
|
unknown_nmi_panic
|
||||||
[X86]
|
[X86] Cause panic on unknown NMI.
|
||||||
Set unknown_nmi_panic=1 early on boot.
|
|
||||||
|
|
||||||
usbcore.autosuspend=
|
usbcore.autosuspend=
|
||||||
[USB] The autosuspend time delay (in seconds) used
|
[USB] The autosuspend time delay (in seconds) used
|
||||||
|
@ -11,6 +11,7 @@ with the difference that the orphan objects are not freed but only
|
|||||||
reported via /sys/kernel/debug/kmemleak. A similar method is used by the
|
reported via /sys/kernel/debug/kmemleak. A similar method is used by the
|
||||||
Valgrind tool (memcheck --leak-check) to detect the memory leaks in
|
Valgrind tool (memcheck --leak-check) to detect the memory leaks in
|
||||||
user-space applications.
|
user-space applications.
|
||||||
|
Kmemleak is supported on x86, arm, powerpc, sparc, sh, microblaze and tile.
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
@ -178,5 +179,4 @@ block doesn't need to be freed (some cases in the init_call functions),
|
|||||||
the pointer is calculated by other methods than the usual container_of
|
the pointer is calculated by other methods than the usual container_of
|
||||||
macro or the pointer is stored in a location not scanned by kmemleak.
|
macro or the pointer is stored in a location not scanned by kmemleak.
|
||||||
|
|
||||||
Page allocations and ioremap are not tracked. Only the ARM and x86
|
Page allocations and ioremap are not tracked.
|
||||||
architectures are currently supported.
|
|
||||||
|
@ -61,7 +61,7 @@ Usage
|
|||||||
Hotkeys are also reported as input keys (like keyboards) you can check
|
Hotkeys are also reported as input keys (like keyboards) you can check
|
||||||
which key are supported using "xev" under X11.
|
which key are supported using "xev" under X11.
|
||||||
|
|
||||||
You can get informations on the version of your DSDT table by reading the
|
You can get information on the version of your DSDT table by reading the
|
||||||
/sys/devices/platform/asus-laptop/infos entry. If you have a question or a
|
/sys/devices/platform/asus-laptop/infos entry. If you have a question or a
|
||||||
bug report to do, please include the output of this entry.
|
bug report to do, please include the output of this entry.
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ LED display
|
|||||||
-----------
|
-----------
|
||||||
|
|
||||||
Some models like the W1N have a LED display that can be used to display
|
Some models like the W1N have a LED display that can be used to display
|
||||||
several informations.
|
several items of information.
|
||||||
|
|
||||||
LED display works for the following models:
|
LED display works for the following models:
|
||||||
W1000N
|
W1000N
|
||||||
|
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
|
particular LED (ACPI?). The addition of triggers provided by the LED driver
|
||||||
should cover this option and be possible to add without breaking the
|
should cover this option and be possible to add without breaking the
|
||||||
current interface.
|
current interface.
|
||||||
|
|
@ -72,7 +72,7 @@ folder:
|
|||||||
# fragmentation gw_sel_class vis_mode
|
# fragmentation gw_sel_class vis_mode
|
||||||
|
|
||||||
|
|
||||||
There is a special folder for debugging informations:
|
There is a special folder for debugging information:
|
||||||
|
|
||||||
# ls /sys/kernel/debug/batman_adv/bat0/
|
# ls /sys/kernel/debug/batman_adv/bat0/
|
||||||
# gateways socket transtable_global vis_data
|
# gateways socket transtable_global vis_data
|
||||||
|
@ -2273,7 +2273,7 @@ IP forwarding is on.
|
|||||||
There is a lot of useful info in here best found by going in & having a look around,
|
There is a lot of useful info in here best found by going in & having a look around,
|
||||||
so I'll take you through some entries I consider important.
|
so I'll take you through some entries I consider important.
|
||||||
|
|
||||||
All the processes running on the machine have there own entry defined by
|
All the processes running on the machine have their own entry defined by
|
||||||
/proc/<pid>
|
/proc/<pid>
|
||||||
So lets have a look at the init process
|
So lets have a look at the init process
|
||||||
cd /proc/1
|
cd /proc/1
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
Each CPU has a "base" scheduling domain (struct sched_domain). These are
|
Each CPU has a "base" scheduling domain (struct sched_domain). The domain
|
||||||
accessed via cpu_sched_domain(i) and this_sched_domain() macros. The domain
|
|
||||||
hierarchy is built from these base domains via the ->parent pointer. ->parent
|
hierarchy is built from these base domains via the ->parent pointer. ->parent
|
||||||
MUST be NULL terminated, and domain structures should be per-CPU as they
|
MUST be NULL terminated, and domain structures should be per-CPU as they are
|
||||||
are locklessly updated.
|
locklessly updated.
|
||||||
|
|
||||||
Each scheduling domain spans a number of CPUs (stored in the ->span field).
|
Each scheduling domain spans a number of CPUs (stored in the ->span field).
|
||||||
A domain's span MUST be a superset of it child's span (this restriction could
|
A domain's span MUST be a superset of it child's span (this restriction could
|
||||||
@ -26,11 +25,26 @@ is treated as one entity. The load of a group is defined as the sum of the
|
|||||||
load of each of its member CPUs, and only when the load of a group becomes
|
load of each of its member CPUs, and only when the load of a group becomes
|
||||||
out of balance are tasks moved between groups.
|
out of balance are tasks moved between groups.
|
||||||
|
|
||||||
In kernel/sched.c, rebalance_tick is run periodically on each CPU. This
|
In kernel/sched.c, trigger_load_balance() is run periodically on each CPU
|
||||||
function takes its CPU's base sched domain and checks to see if has reached
|
through scheduler_tick(). It raises a softirq after the next regularly scheduled
|
||||||
its rebalance interval. If so, then it will run load_balance on that domain.
|
rebalancing event for the current runqueue has arrived. The actual load
|
||||||
rebalance_tick then checks the parent sched_domain (if it exists), and the
|
balancing workhorse, run_rebalance_domains()->rebalance_domains(), is then run
|
||||||
parent of the parent and so forth.
|
in softirq context (SCHED_SOFTIRQ).
|
||||||
|
|
||||||
|
The latter function takes two arguments: the current CPU and whether it was idle
|
||||||
|
at the time the scheduler_tick() happened and iterates over all sched domains
|
||||||
|
our CPU is on, starting from its base domain and going up the ->parent chain.
|
||||||
|
While doing that, it checks to see if the current domain has exhausted its
|
||||||
|
rebalance interval. If so, it runs load_balance() on that domain. It then checks
|
||||||
|
the parent sched_domain (if it exists), and the parent of the parent and so
|
||||||
|
forth.
|
||||||
|
|
||||||
|
Initially, load_balance() finds the busiest group in the current sched domain.
|
||||||
|
If it succeeds, it looks for the busiest runqueue of all the CPUs' runqueues in
|
||||||
|
that group. If it manages to find such a runqueue, it locks both our initial
|
||||||
|
CPU's runqueue and the newly found busiest one and starts moving tasks from it
|
||||||
|
to our runqueue. The exact number of tasks amounts to an imbalance previously
|
||||||
|
computed while iterating over this sched domain's groups.
|
||||||
|
|
||||||
*** Implementing sched domains ***
|
*** Implementing sched domains ***
|
||||||
The "base" domain will "span" the first level of the hierarchy. In the case
|
The "base" domain will "span" the first level of the hierarchy. In the case
|
||||||
|
@ -285,7 +285,7 @@ from the driver.
|
|||||||
|
|
||||||
7. Profiling information
|
7. Profiling information
|
||||||
|
|
||||||
This driver does not provide profiling informations as did its predecessors.
|
This driver does not provide profiling information as did its predecessors.
|
||||||
This feature was not this useful and added complexity to the code.
|
This feature was not this useful and added complexity to the code.
|
||||||
As the driver code got more complex, I have decided to remove everything
|
As the driver code got more complex, I have decided to remove everything
|
||||||
that didn't seem actually useful.
|
that didn't seem actually useful.
|
||||||
|
@ -2229,7 +2229,7 @@ Proc interfaces (/proc/asound)
|
|||||||
|
|
||||||
/proc/asound/card#/pcm#[cp]/oss
|
/proc/asound/card#/pcm#[cp]/oss
|
||||||
-------------------------------
|
-------------------------------
|
||||||
String "erase" - erase all additional informations about OSS applications
|
String "erase" - erase all additional information about OSS applications
|
||||||
String "<app_name> <fragments> <fragment_size> [<options>]"
|
String "<app_name> <fragments> <fragment_size> [<options>]"
|
||||||
|
|
||||||
<app_name> - name of application with (higher priority) or without path
|
<app_name> - name of application with (higher priority) or without path
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
Driver
|
Driver
|
||||||
------
|
------
|
||||||
|
|
||||||
Informations about Audio Excel DSP 16 driver can be found in the source
|
Information about Audio Excel DSP 16 driver can be found in the source
|
||||||
file aedsp16.c
|
file aedsp16.c
|
||||||
Please, read the head of the source before using it. It contain useful
|
Please, read the head of the source before using it. It contain useful
|
||||||
informations.
|
information.
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
-------------
|
-------------
|
||||||
@ -68,7 +68,7 @@ Sound cards supported
|
|||||||
This driver supports the SC-6000 and SC-6600 based Gallant's sound card.
|
This driver supports the SC-6000 and SC-6600 based Gallant's sound card.
|
||||||
It don't support the Audio Excel DSP 16 III (try the SC-6600 code).
|
It don't support the Audio Excel DSP 16 III (try the SC-6600 code).
|
||||||
I'm working on the III version of the card: if someone have useful
|
I'm working on the III version of the card: if someone have useful
|
||||||
informations about it, please let me know.
|
information about it, please let me know.
|
||||||
For all the non-supported audio cards, you have to boot MS-DOS (or WIN95)
|
For all the non-supported audio cards, you have to boot MS-DOS (or WIN95)
|
||||||
activating the audio card with the MS-DOS device driver, then you have to
|
activating the audio card with the MS-DOS device driver, then you have to
|
||||||
<ctrl>-<alt>-<del> and boot Linux.
|
<ctrl>-<alt>-<del> and boot Linux.
|
||||||
|
@ -5,7 +5,7 @@ FIRST OF ALL
|
|||||||
============
|
============
|
||||||
|
|
||||||
This code references YAMAHA's sample codes and data sheets.
|
This code references YAMAHA's sample codes and data sheets.
|
||||||
I respect and thank for all people they made open the informations
|
I respect and thank for all people they made open the information
|
||||||
about YMF7xx cards.
|
about YMF7xx cards.
|
||||||
|
|
||||||
And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s
|
And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
Note: "modinfo <module>" prints various informations about a kernel
|
Note: "modinfo <module>" prints various information about a kernel
|
||||||
module, among them a complete and up-to-date list of insmod options.
|
module, among them a complete and up-to-date list of insmod options.
|
||||||
This list tends to be outdated because it is updated manually ...
|
This list tends to be outdated because it is updated manually ...
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ completely by the bt8xx chip, which is common on all boards. But
|
|||||||
sound is handled in slightly different ways on each board.
|
sound is handled in slightly different ways on each board.
|
||||||
|
|
||||||
To handle the grabber boards correctly, there is a array tvcards[] in
|
To handle the grabber boards correctly, there is a array tvcards[] in
|
||||||
bttv-cards.c, which holds the informations required for each board.
|
bttv-cards.c, which holds the information required for each board.
|
||||||
Sound will work only, if the correct entry is used (for video it often
|
Sound will work only, if the correct entry is used (for video it often
|
||||||
makes no difference). The bttv driver prints a line to the kernel
|
makes no difference). The bttv driver prints a line to the kernel
|
||||||
log, telling which card type is used. Like this one:
|
log, telling which card type is used. Like this one:
|
||||||
|
@ -191,10 +191,10 @@ Syntax: <n>
|
|||||||
Description: Debugging information level, from 0 to 3:
|
Description: Debugging information level, from 0 to 3:
|
||||||
0 = none (use carefully)
|
0 = none (use carefully)
|
||||||
1 = critical errors
|
1 = critical errors
|
||||||
2 = significant informations
|
2 = significant information
|
||||||
3 = more verbose messages
|
3 = more verbose messages
|
||||||
Level 3 is useful for testing only, when only one device
|
Level 3 is useful for testing only, when only one device
|
||||||
is used at the same time. It also shows some more informations
|
is used at the same time. It also shows some more information
|
||||||
about the hardware being detected. This module parameter can be
|
about the hardware being detected. This module parameter can be
|
||||||
changed at runtime thanks to the /sys filesystem interface.
|
changed at runtime thanks to the /sys filesystem interface.
|
||||||
Default: 2
|
Default: 2
|
||||||
|
@ -214,10 +214,10 @@ Syntax: <n>
|
|||||||
Description: Debugging information level, from 0 to 3:
|
Description: Debugging information level, from 0 to 3:
|
||||||
0 = none (use carefully)
|
0 = none (use carefully)
|
||||||
1 = critical errors
|
1 = critical errors
|
||||||
2 = significant informations
|
2 = significant information
|
||||||
3 = more verbose messages
|
3 = more verbose messages
|
||||||
Level 3 is useful for testing only. It also shows some more
|
Level 3 is useful for testing only. It also shows some more
|
||||||
informations about the hardware being detected.
|
information about the hardware being detected.
|
||||||
This parameter can be changed at runtime thanks to the /sys
|
This parameter can be changed at runtime thanks to the /sys
|
||||||
filesystem interface.
|
filesystem interface.
|
||||||
Default: 2
|
Default: 2
|
||||||
|
@ -413,7 +413,7 @@ Syntax: <n>
|
|||||||
Description: Debugging information level, from 0 to 6:
|
Description: Debugging information level, from 0 to 6:
|
||||||
0 = none (use carefully)
|
0 = none (use carefully)
|
||||||
1 = critical errors
|
1 = critical errors
|
||||||
2 = significant informations
|
2 = significant information
|
||||||
3 = configuration or general messages
|
3 = configuration or general messages
|
||||||
4 = warnings
|
4 = warnings
|
||||||
5 = called functions
|
5 = called functions
|
||||||
|
@ -181,10 +181,10 @@ Syntax: <n>
|
|||||||
Description: Debugging information level, from 0 to 3:
|
Description: Debugging information level, from 0 to 3:
|
||||||
0 = none (use carefully)
|
0 = none (use carefully)
|
||||||
1 = critical errors
|
1 = critical errors
|
||||||
2 = significant informations
|
2 = significant information
|
||||||
3 = more verbose messages
|
3 = more verbose messages
|
||||||
Level 3 is useful for testing only, when only one device
|
Level 3 is useful for testing only, when only one device
|
||||||
is used at the same time. It also shows some more informations
|
is used at the same time. It also shows some information
|
||||||
about the hardware being detected. This module parameter can be
|
about the hardware being detected. This module parameter can be
|
||||||
changed at runtime thanks to the /sys filesystem interface.
|
changed at runtime thanks to the /sys filesystem interface.
|
||||||
Default: 2
|
Default: 2
|
||||||
@ -261,7 +261,7 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
|
|||||||
|
|
||||||
11. Credits
|
11. Credits
|
||||||
===========
|
===========
|
||||||
- Informations about the chip internals needed to enable the I2C protocol have
|
- Information about the chip internals needed to enable the I2C protocol have
|
||||||
been taken from the documentation of the ZC030x Video4Linux1 driver written
|
been taken from the documentation of the ZC030x Video4Linux1 driver written
|
||||||
by Andrew Birkett <andy@nobugs.org>;
|
by Andrew Birkett <andy@nobugs.org>;
|
||||||
- The initialization values of the ZC0301 controller connected to the PAS202BCB
|
- The initialization values of the ZC0301 controller connected to the PAS202BCB
|
||||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 39
|
SUBLEVEL = 39
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc2
|
||||||
NAME = Flesh-Eating Bats with Fangs
|
NAME = Flesh-Eating Bats with Fangs
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -386,8 +386,12 @@
|
|||||||
#define __NR_fanotify_init 368
|
#define __NR_fanotify_init 368
|
||||||
#define __NR_fanotify_mark 369
|
#define __NR_fanotify_mark 369
|
||||||
#define __NR_prlimit64 370
|
#define __NR_prlimit64 370
|
||||||
|
#define __NR_name_to_handle_at 371
|
||||||
|
#define __NR_open_by_handle_at 372
|
||||||
|
#define __NR_clock_adjtime 373
|
||||||
|
#define __NR_syncfs 374
|
||||||
|
|
||||||
#define __NR_syscalls 371
|
#define __NR_syscalls 375
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
@ -10,6 +10,7 @@ CFLAGS_REMOVE_early_printk.o = -pg
|
|||||||
CFLAGS_REMOVE_selfmod.o = -pg
|
CFLAGS_REMOVE_selfmod.o = -pg
|
||||||
CFLAGS_REMOVE_heartbeat.o = -pg
|
CFLAGS_REMOVE_heartbeat.o = -pg
|
||||||
CFLAGS_REMOVE_ftrace.o = -pg
|
CFLAGS_REMOVE_ftrace.o = -pg
|
||||||
|
CFLAGS_REMOVE_process.o = -pg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
extra-y := head.o vmlinux.lds
|
extra-y := head.o vmlinux.lds
|
||||||
|
@ -51,6 +51,9 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
|||||||
: "r" (parent), "r" (return_hooker)
|
: "r" (parent), "r" (return_hooker)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
flush_dcache_range((u32)parent, (u32)parent + 4);
|
||||||
|
flush_icache_range((u32)parent, (u32)parent + 4);
|
||||||
|
|
||||||
if (unlikely(faulted)) {
|
if (unlikely(faulted)) {
|
||||||
ftrace_graph_stop();
|
ftrace_graph_stop();
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
@ -95,6 +98,9 @@ static int ftrace_modify_code(unsigned long addr, unsigned int value)
|
|||||||
if (unlikely(faulted))
|
if (unlikely(faulted))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
flush_dcache_range(addr, addr + 4);
|
||||||
|
flush_icache_range(addr, addr + 4);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,8 +201,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
|||||||
ret += ftrace_modify_code((unsigned long)&ftrace_caller,
|
ret += ftrace_modify_code((unsigned long)&ftrace_caller,
|
||||||
MICROBLAZE_NOP);
|
MICROBLAZE_NOP);
|
||||||
|
|
||||||
/* All changes are done - lets do caches consistent */
|
|
||||||
flush_icache();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +214,6 @@ int ftrace_enable_ftrace_graph_caller(void)
|
|||||||
|
|
||||||
old_jump = *(unsigned int *)ip; /* save jump over instruction */
|
old_jump = *(unsigned int *)ip; /* save jump over instruction */
|
||||||
ret = ftrace_modify_code(ip, MICROBLAZE_NOP);
|
ret = ftrace_modify_code(ip, MICROBLAZE_NOP);
|
||||||
flush_icache();
|
|
||||||
|
|
||||||
pr_debug("%s: Replace instruction: 0x%x\n", __func__, old_jump);
|
pr_debug("%s: Replace instruction: 0x%x\n", __func__, old_jump);
|
||||||
return ret;
|
return ret;
|
||||||
@ -222,7 +225,6 @@ int ftrace_disable_ftrace_graph_caller(void)
|
|||||||
unsigned long ip = (unsigned long)(&ftrace_call_graph);
|
unsigned long ip = (unsigned long)(&ftrace_call_graph);
|
||||||
|
|
||||||
ret = ftrace_modify_code(ip, old_jump);
|
ret = ftrace_modify_code(ip, old_jump);
|
||||||
flush_icache();
|
|
||||||
|
|
||||||
pr_debug("%s\n", __func__);
|
pr_debug("%s\n", __func__);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -158,11 +158,11 @@ void __init init_IRQ(void)
|
|||||||
for (i = 0; i < nr_irq; ++i) {
|
for (i = 0; i < nr_irq; ++i) {
|
||||||
if (intr_type & (0x00000001 << i)) {
|
if (intr_type & (0x00000001 << i)) {
|
||||||
irq_set_chip_and_handler_name(i, &intc_dev,
|
irq_set_chip_and_handler_name(i, &intc_dev,
|
||||||
handle_edge_irq, intc_dev.name);
|
handle_edge_irq, "edge");
|
||||||
irq_clear_status_flags(i, IRQ_LEVEL);
|
irq_clear_status_flags(i, IRQ_LEVEL);
|
||||||
} else {
|
} else {
|
||||||
irq_set_chip_and_handler_name(i, &intc_dev,
|
irq_set_chip_and_handler_name(i, &intc_dev,
|
||||||
handle_level_irq, intc_dev.name);
|
handle_level_irq, "level");
|
||||||
irq_set_status_flags(i, IRQ_LEVEL);
|
irq_set_status_flags(i, IRQ_LEVEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -375,3 +375,7 @@ ENTRY(sys_call_table)
|
|||||||
.long sys_fanotify_init
|
.long sys_fanotify_init
|
||||||
.long sys_fanotify_mark
|
.long sys_fanotify_mark
|
||||||
.long sys_prlimit64 /* 370 */
|
.long sys_prlimit64 /* 370 */
|
||||||
|
.long sys_name_to_handle_at
|
||||||
|
.long sys_open_by_handle_at
|
||||||
|
.long sys_clock_adjtime
|
||||||
|
.long sys_syncfs
|
||||||
|
@ -2,6 +2,12 @@
|
|||||||
# Makefile
|
# Makefile
|
||||||
#
|
#
|
||||||
|
|
||||||
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
|
CFLAGS_REMOVE_ashldi3.o = -pg
|
||||||
|
CFLAGS_REMOVE_ashrdi3.o = -pg
|
||||||
|
CFLAGS_REMOVE_lshrdi3.o = -pg
|
||||||
|
endif
|
||||||
|
|
||||||
lib-y := memset.o
|
lib-y := memset.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_OPT_LIB_ASM),y)
|
ifeq ($(CONFIG_OPT_LIB_ASM),y)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* P1020 RDB Device Tree Source
|
* P1020 RDB Device Tree Source
|
||||||
*
|
*
|
||||||
* Copyright 2009 Freescale Semiconductor Inc.
|
* Copyright 2009-2011 Freescale Semiconductor Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
@ -553,7 +553,7 @@
|
|||||||
reg = <0 0xffe09000 0 0x1000>;
|
reg = <0 0xffe09000 0 0x1000>;
|
||||||
bus-range = <0 255>;
|
bus-range = <0 255>;
|
||||||
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
|
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
|
||||||
0x1000000 0x0 0x00000000 0 0xffc30000 0x0 0x10000>;
|
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <16 2>;
|
interrupts = <16 2>;
|
||||||
@ -580,8 +580,8 @@
|
|||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
reg = <0 0xffe0a000 0 0x1000>;
|
reg = <0 0xffe0a000 0 0x1000>;
|
||||||
bus-range = <0 255>;
|
bus-range = <0 255>;
|
||||||
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
|
ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
|
||||||
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
|
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <16 2>;
|
interrupts = <16 2>;
|
||||||
@ -590,8 +590,8 @@
|
|||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
ranges = <0x2000000 0x0 0xc0000000
|
ranges = <0x2000000 0x0 0x80000000
|
||||||
0x2000000 0x0 0xc0000000
|
0x2000000 0x0 0x80000000
|
||||||
0x0 0x20000000
|
0x0 0x20000000
|
||||||
|
|
||||||
0x1000000 0x0 0x0
|
0x1000000 0x0 0x0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* P2020 RDB Device Tree Source
|
* P2020 RDB Device Tree Source
|
||||||
*
|
*
|
||||||
* Copyright 2009 Freescale Semiconductor Inc.
|
* Copyright 2009-2011 Freescale Semiconductor Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
@ -537,7 +537,7 @@
|
|||||||
reg = <0 0xffe09000 0 0x1000>;
|
reg = <0 0xffe09000 0 0x1000>;
|
||||||
bus-range = <0 255>;
|
bus-range = <0 255>;
|
||||||
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
|
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
|
||||||
0x1000000 0x0 0x00000000 0 0xffc30000 0x0 0x10000>;
|
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <25 2>;
|
interrupts = <25 2>;
|
||||||
@ -564,8 +564,8 @@
|
|||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
reg = <0 0xffe0a000 0 0x1000>;
|
reg = <0 0xffe0a000 0 0x1000>;
|
||||||
bus-range = <0 255>;
|
bus-range = <0 255>;
|
||||||
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
|
ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
|
||||||
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
|
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <26 2>;
|
interrupts = <26 2>;
|
||||||
@ -574,8 +574,8 @@
|
|||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
ranges = <0x2000000 0x0 0xc0000000
|
ranges = <0x2000000 0x0 0x80000000
|
||||||
0x2000000 0x0 0xc0000000
|
0x2000000 0x0 0x80000000
|
||||||
0x0 0x20000000
|
0x0 0x20000000
|
||||||
|
|
||||||
0x1000000 0x0 0x0
|
0x1000000 0x0 0x0
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* This dts file allows core0 to have memory, l2, i2c, spi, gpio, dma1, usb,
|
* This dts file allows core0 to have memory, l2, i2c, spi, gpio, dma1, usb,
|
||||||
* eth1, eth2, sdhc, crypto, global-util, pci0.
|
* eth1, eth2, sdhc, crypto, global-util, pci0.
|
||||||
*
|
*
|
||||||
* Copyright 2009 Freescale Semiconductor Inc.
|
* Copyright 2009-2011 Freescale Semiconductor Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
@ -342,7 +342,7 @@
|
|||||||
reg = <0 0xffe09000 0 0x1000>;
|
reg = <0 0xffe09000 0 0x1000>;
|
||||||
bus-range = <0 255>;
|
bus-range = <0 255>;
|
||||||
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
|
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
|
||||||
0x1000000 0x0 0x00000000 0 0xffc30000 0x0 0x10000>;
|
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <25 2>;
|
interrupts = <25 2>;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* Please note to add "-b 1" for core1's dts compiling.
|
* Please note to add "-b 1" for core1's dts compiling.
|
||||||
*
|
*
|
||||||
* Copyright 2009 Freescale Semiconductor Inc.
|
* Copyright 2009-2011 Freescale Semiconductor Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
@ -162,8 +162,8 @@
|
|||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
reg = <0 0xffe0a000 0 0x1000>;
|
reg = <0 0xffe0a000 0 0x1000>;
|
||||||
bus-range = <0 255>;
|
bus-range = <0 255>;
|
||||||
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
|
ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
|
||||||
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
|
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <26 2>;
|
interrupts = <26 2>;
|
||||||
@ -172,8 +172,8 @@
|
|||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
ranges = <0x2000000 0x0 0xc0000000
|
ranges = <0x2000000 0x0 0x80000000
|
||||||
0x2000000 0x0 0xc0000000
|
0x2000000 0x0 0x80000000
|
||||||
0x0 0x20000000
|
0x0 0x20000000
|
||||||
|
|
||||||
0x1000000 0x0 0x0
|
0x1000000 0x0 0x0
|
||||||
|
@ -163,7 +163,7 @@ static void crash_kexec_prepare_cpus(int cpu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* wait for all the CPUs to hit real mode but timeout if they don't come in */
|
/* wait for all the CPUs to hit real mode but timeout if they don't come in */
|
||||||
#ifdef CONFIG_PPC_STD_MMU_64
|
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
|
||||||
static void crash_kexec_wait_realmode(int cpu)
|
static void crash_kexec_wait_realmode(int cpu)
|
||||||
{
|
{
|
||||||
unsigned int msecs;
|
unsigned int msecs;
|
||||||
@ -188,6 +188,8 @@ static void crash_kexec_wait_realmode(int cpu)
|
|||||||
}
|
}
|
||||||
mb();
|
mb();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static inline void crash_kexec_wait_realmode(int cpu) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -344,9 +346,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
|||||||
crash_save_cpu(regs, crashing_cpu);
|
crash_save_cpu(regs, crashing_cpu);
|
||||||
crash_kexec_prepare_cpus(crashing_cpu);
|
crash_kexec_prepare_cpus(crashing_cpu);
|
||||||
cpu_set(crashing_cpu, cpus_in_crash);
|
cpu_set(crashing_cpu, cpus_in_crash);
|
||||||
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
|
|
||||||
crash_kexec_wait_realmode(crashing_cpu);
|
crash_kexec_wait_realmode(crashing_cpu);
|
||||||
#endif
|
|
||||||
|
|
||||||
machine_kexec_mask_interrupts();
|
machine_kexec_mask_interrupts();
|
||||||
|
|
||||||
|
@ -203,7 +203,7 @@ void __init free_unused_pacas(void)
|
|||||||
{
|
{
|
||||||
int new_size;
|
int new_size;
|
||||||
|
|
||||||
new_size = PAGE_ALIGN(sizeof(struct paca_struct) * num_possible_cpus());
|
new_size = PAGE_ALIGN(sizeof(struct paca_struct) * nr_cpu_ids);
|
||||||
|
|
||||||
if (new_size >= paca_size)
|
if (new_size >= paca_size)
|
||||||
return;
|
return;
|
||||||
|
@ -509,6 +509,9 @@ void __init smp_setup_cpu_maps(void)
|
|||||||
*/
|
*/
|
||||||
cpu_init_thread_core_maps(nthreads);
|
cpu_init_thread_core_maps(nthreads);
|
||||||
|
|
||||||
|
/* Now that possible cpus are set, set nr_cpu_ids for later use */
|
||||||
|
nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
|
||||||
|
|
||||||
free_unused_pacas();
|
free_unused_pacas();
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
@ -431,7 +431,7 @@ virt_page_table_tlb_miss_fault:
|
|||||||
* The thing is, we know that in normal circumstances, this is
|
* The thing is, we know that in normal circumstances, this is
|
||||||
* always called as a second level tlb miss for SW load or as a first
|
* always called as a second level tlb miss for SW load or as a first
|
||||||
* level TLB miss for HW load, so we should be able to peek at the
|
* level TLB miss for HW load, so we should be able to peek at the
|
||||||
* relevant informations in the first exception frame in the PACA.
|
* relevant information in the first exception frame in the PACA.
|
||||||
*
|
*
|
||||||
* However, we do need to double check that, because we may just hit
|
* However, we do need to double check that, because we may just hit
|
||||||
* a stray kernel pointer or a userland attack trying to hit those
|
* a stray kernel pointer or a userland attack trying to hit those
|
||||||
|
@ -46,7 +46,7 @@ config PPC_OF_BOOT_TRAMPOLINE
|
|||||||
help
|
help
|
||||||
Support from booting from Open Firmware or yaboot using an
|
Support from booting from Open Firmware or yaboot using an
|
||||||
Open Firmware client interface. This enables the kernel to
|
Open Firmware client interface. This enables the kernel to
|
||||||
communicate with open firmware to retrieve system informations
|
communicate with open firmware to retrieve system information
|
||||||
such as the device tree.
|
such as the device tree.
|
||||||
|
|
||||||
In case of doubt, say Y
|
In case of doubt, say Y
|
||||||
|
@ -378,7 +378,7 @@ static int __init pSeries_init_panel(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
arch_initcall(pSeries_init_panel);
|
machine_arch_initcall(pseries, pSeries_init_panel);
|
||||||
|
|
||||||
static int pseries_set_dabr(unsigned long dabr)
|
static int pseries_set_dabr(unsigned long dabr)
|
||||||
{
|
{
|
||||||
|
@ -112,10 +112,10 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
|
|||||||
|
|
||||||
/* Fixup atomic count: it exited inside IRQ handler. */
|
/* Fixup atomic count: it exited inside IRQ handler. */
|
||||||
task_thread_info(paca[lcpu].__current)->preempt_count = 0;
|
task_thread_info(paca[lcpu].__current)->preempt_count = 0;
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
if (get_cpu_current_state(lcpu) == CPU_STATE_INACTIVE)
|
if (get_cpu_current_state(lcpu) == CPU_STATE_INACTIVE)
|
||||||
goto out;
|
goto out;
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* If the RTAS start-cpu token does not exist then presume the
|
* If the RTAS start-cpu token does not exist then presume the
|
||||||
* cpu is already spinning.
|
* cpu is already spinning.
|
||||||
@ -130,7 +130,9 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
out:
|
out:
|
||||||
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,16 +146,15 @@ static void __devinit smp_xics_setup_cpu(int cpu)
|
|||||||
vpa_init(cpu);
|
vpa_init(cpu);
|
||||||
|
|
||||||
cpumask_clear_cpu(cpu, of_spin_mask);
|
cpumask_clear_cpu(cpu, of_spin_mask);
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
set_cpu_current_state(cpu, CPU_STATE_ONLINE);
|
set_cpu_current_state(cpu, CPU_STATE_ONLINE);
|
||||||
set_default_offline_state(cpu);
|
set_default_offline_state(cpu);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_XICS */
|
#endif /* CONFIG_XICS */
|
||||||
|
|
||||||
static void __devinit smp_pSeries_kick_cpu(int nr)
|
static void __devinit smp_pSeries_kick_cpu(int nr)
|
||||||
{
|
{
|
||||||
long rc;
|
|
||||||
unsigned long hcpuid;
|
|
||||||
BUG_ON(nr < 0 || nr >= NR_CPUS);
|
BUG_ON(nr < 0 || nr >= NR_CPUS);
|
||||||
|
|
||||||
if (!smp_startup_cpu(nr))
|
if (!smp_startup_cpu(nr))
|
||||||
@ -165,16 +166,20 @@ static void __devinit smp_pSeries_kick_cpu(int nr)
|
|||||||
* the processor will continue on to secondary_start
|
* the processor will continue on to secondary_start
|
||||||
*/
|
*/
|
||||||
paca[nr].cpu_start = 1;
|
paca[nr].cpu_start = 1;
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
set_preferred_offline_state(nr, CPU_STATE_ONLINE);
|
set_preferred_offline_state(nr, CPU_STATE_ONLINE);
|
||||||
|
|
||||||
if (get_cpu_current_state(nr) == CPU_STATE_INACTIVE) {
|
if (get_cpu_current_state(nr) == CPU_STATE_INACTIVE) {
|
||||||
|
long rc;
|
||||||
|
unsigned long hcpuid;
|
||||||
|
|
||||||
hcpuid = get_hard_smp_processor_id(nr);
|
hcpuid = get_hard_smp_processor_id(nr);
|
||||||
rc = plpar_hcall_norets(H_PROD, hcpuid);
|
rc = plpar_hcall_norets(H_PROD, hcpuid);
|
||||||
if (rc != H_SUCCESS)
|
if (rc != H_SUCCESS)
|
||||||
printk(KERN_ERR "Error: Prod to wake up processor %d "
|
printk(KERN_ERR "Error: Prod to wake up processor %d "
|
||||||
"Ret= %ld\n", nr, rc);
|
"Ret= %ld\n", nr, rc);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smp_pSeries_cpu_bootable(unsigned int nr)
|
static int smp_pSeries_cpu_bootable(unsigned int nr)
|
||||||
|
@ -48,7 +48,7 @@ ASM_GENERIC_HEADERS += bitsperlong.h bug.h bugs.h
|
|||||||
ASM_GENERIC_HEADERS += cputime.h current.h
|
ASM_GENERIC_HEADERS += cputime.h current.h
|
||||||
ASM_GENERIC_HEADERS += device.h div64.h
|
ASM_GENERIC_HEADERS += device.h div64.h
|
||||||
ASM_GENERIC_HEADERS += emergency-restart.h errno.h
|
ASM_GENERIC_HEADERS += emergency-restart.h errno.h
|
||||||
ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h
|
ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h futex.h
|
||||||
ASM_GENERIC_HEADERS += hardirq.h hw_irq.h
|
ASM_GENERIC_HEADERS += hardirq.h hw_irq.h
|
||||||
ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h
|
ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h
|
||||||
ASM_GENERIC_HEADERS += kdebug.h kmap_types.h
|
ASM_GENERIC_HEADERS += kdebug.h kmap_types.h
|
||||||
|
@ -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_SDRAM_BASE 0x00000000 /* 0x00000000 - 0x7FFFFFFF 2GB */
|
||||||
#define PKUNITY_MMIO_BASE 0x80000000 /* 0x80000000 - 0xFFFFFFFF 2GB */
|
#define PKUNITY_MMIO_BASE 0x80000000 /* 0x80000000 - 0xFFFFFFFF 2GB */
|
||||||
|
|
||||||
/*
|
|
||||||
* PKUNITY Memory Map Addresses: 0x0D000000 - 0x0EFFFFFF (32MB)
|
|
||||||
* 0x0D000000 - 0x0DFFFFFF 16MB: for UVC
|
|
||||||
* 0x0E000000 - 0x0EFFFFFF 16MB: for UNIGFX
|
|
||||||
*/
|
|
||||||
#define PKUNITY_UVC_MMAP_BASE 0x0D000000
|
|
||||||
#define PKUNITY_UVC_MMAP_SIZE 0x01000000 /* 16MB */
|
|
||||||
#define PKUNITY_UNIGFX_MMAP_BASE 0x0E000000
|
|
||||||
#define PKUNITY_UNIGFX_MMAP_SIZE 0x01000000 /* 16MB */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PKUNITY System Bus Addresses (PCI): 0x80000000 - 0xBFFFFFFF (1GB)
|
* PKUNITY System Bus Addresses (PCI): 0x80000000 - 0xBFFFFFFF (1GB)
|
||||||
* 0x80000000 - 0x8000000B 12B PCI Configuration regs
|
* 0x80000000 - 0x8000000B 12B PCI Configuration regs
|
||||||
|
@ -50,7 +50,6 @@ void puv3_pci_adjust_zones(unsigned long *size, unsigned long *holes);
|
|||||||
|
|
||||||
/* kuser area */
|
/* kuser area */
|
||||||
#define KUSER_VECPAGE_BASE (KUSER_BASE + UL(0x3fff0000))
|
#define KUSER_VECPAGE_BASE (KUSER_BASE + UL(0x3fff0000))
|
||||||
#define KUSER_UNIGFX_BASE (PAGE_OFFSET + PKUNITY_UNIGFX_MMAP_BASE)
|
|
||||||
/* kuser_vecpage (0xbfff0000) is ro, and vectors page (0xffff0000) is rw */
|
/* kuser_vecpage (0xbfff0000) is ro, and vectors page (0xffff0000) is rw */
|
||||||
#define kuser_vecpage_to_vectors(x) ((x) - (KUSER_VECPAGE_BASE) \
|
#define kuser_vecpage_to_vectors(x) ((x) - (KUSER_VECPAGE_BASE) \
|
||||||
+ (VECTORS_BASE))
|
+ (VECTORS_BASE))
|
||||||
|
@ -99,11 +99,6 @@ static struct resource puv3_unigfx_resources[] = {
|
|||||||
.end = io_v2p(PKUNITY_UNIGFX_BASE) + 0xfff,
|
.end = io_v2p(PKUNITY_UNIGFX_BASE) + 0xfff,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[1] = {
|
|
||||||
.start = PKUNITY_UNIGFX_MMAP_BASE,
|
|
||||||
.end = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource puv3_rtc_resources[] = {
|
static struct resource puv3_rtc_resources[] = {
|
||||||
|
@ -88,11 +88,6 @@ static int puv3_rtc_setpie(struct device *dev, int enabled)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int puv3_rtc_setfreq(struct device *dev, int freq)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Time read/write */
|
/* Time read/write */
|
||||||
|
|
||||||
static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
|
static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
|
||||||
@ -214,8 +209,6 @@ static const struct rtc_class_ops puv3_rtcops = {
|
|||||||
.set_time = puv3_rtc_settime,
|
.set_time = puv3_rtc_settime,
|
||||||
.read_alarm = puv3_rtc_getalarm,
|
.read_alarm = puv3_rtc_getalarm,
|
||||||
.set_alarm = puv3_rtc_setalarm,
|
.set_alarm = puv3_rtc_setalarm,
|
||||||
.irq_set_freq = puv3_rtc_setfreq,
|
|
||||||
.irq_set_state = puv3_rtc_setpie,
|
|
||||||
.proc = puv3_rtc_proc,
|
.proc = puv3_rtc_proc,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -294,8 +287,6 @@ static int puv3_rtc_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
puv3_rtc_enable(pdev, 1);
|
puv3_rtc_enable(pdev, 1);
|
||||||
|
|
||||||
puv3_rtc_setfreq(&pdev->dev, 1);
|
|
||||||
|
|
||||||
/* register RTC and exit */
|
/* register RTC and exit */
|
||||||
|
|
||||||
rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops,
|
rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops,
|
||||||
|
@ -63,12 +63,6 @@ static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
|
|||||||
* Standard memory resources
|
* Standard memory resources
|
||||||
*/
|
*/
|
||||||
static struct resource mem_res[] = {
|
static struct resource mem_res[] = {
|
||||||
{
|
|
||||||
.name = "Video RAM",
|
|
||||||
.start = 0,
|
|
||||||
.end = 0,
|
|
||||||
.flags = IORESOURCE_MEM
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.name = "Kernel text",
|
.name = "Kernel text",
|
||||||
.start = 0,
|
.start = 0,
|
||||||
@ -83,9 +77,8 @@ static struct resource mem_res[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#define video_ram mem_res[0]
|
#define kernel_code mem_res[0]
|
||||||
#define kernel_code mem_res[1]
|
#define kernel_data mem_res[1]
|
||||||
#define kernel_data mem_res[2]
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These functions re-use the assembly code in head.S, which
|
* These functions re-use the assembly code in head.S, which
|
||||||
@ -224,10 +217,6 @@ request_standard_resources(struct meminfo *mi)
|
|||||||
kernel_data.end <= res->end)
|
kernel_data.end <= res->end)
|
||||||
request_resource(res, &kernel_data);
|
request_resource(res, &kernel_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
video_ram.start = PKUNITY_UNIGFX_MMAP_BASE;
|
|
||||||
video_ram.end = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE;
|
|
||||||
request_resource(&iomem_resource, &video_ram);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void (*init_machine)(void) __initdata;
|
static void (*init_machine)(void) __initdata;
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/uaccess.h>
|
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
|
||||||
OUTPUT_ARCH(unicore32)
|
OUTPUT_ARCH(unicore32)
|
||||||
ENTRY(stext)
|
ENTRY(stext)
|
||||||
@ -29,7 +30,7 @@ SECTIONS
|
|||||||
HEAD_TEXT_SECTION
|
HEAD_TEXT_SECTION
|
||||||
INIT_TEXT_SECTION(PAGE_SIZE)
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||||
INIT_DATA_SECTION(16)
|
INIT_DATA_SECTION(16)
|
||||||
PERCPU(PAGE_SIZE)
|
PERCPU(L1_CACHE_BYTES, PAGE_SIZE)
|
||||||
__init_end = .;
|
__init_end = .;
|
||||||
|
|
||||||
_stext = .;
|
_stext = .;
|
||||||
@ -45,10 +46,10 @@ SECTIONS
|
|||||||
|
|
||||||
_sdata = .;
|
_sdata = .;
|
||||||
RO_DATA_SECTION(PAGE_SIZE)
|
RO_DATA_SECTION(PAGE_SIZE)
|
||||||
RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE)
|
RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
|
||||||
_edata = .;
|
_edata = .;
|
||||||
|
|
||||||
EXCEPTION_TABLE(32)
|
EXCEPTION_TABLE(L1_CACHE_BYTES)
|
||||||
NOTES
|
NOTES
|
||||||
|
|
||||||
BSS_SECTION(0, 0, 0)
|
BSS_SECTION(0, 0, 0)
|
||||||
|
@ -338,15 +338,6 @@ void __init uc32_mm_memblock_reserve(void)
|
|||||||
* and can only be in node 0.
|
* and can only be in node 0.
|
||||||
*/
|
*/
|
||||||
memblock_reserve(__pa(swapper_pg_dir), PTRS_PER_PGD * sizeof(pgd_t));
|
memblock_reserve(__pa(swapper_pg_dir), PTRS_PER_PGD * sizeof(pgd_t));
|
||||||
|
|
||||||
#ifdef CONFIG_PUV3_UNIGFX
|
|
||||||
/*
|
|
||||||
* These should likewise go elsewhere. They pre-reserve the
|
|
||||||
* screen/video memory region at the 48M~64M of main system memory.
|
|
||||||
*/
|
|
||||||
memblock_reserve(PKUNITY_UNIGFX_MMAP_BASE, PKUNITY_UNIGFX_MMAP_SIZE);
|
|
||||||
memblock_reserve(PKUNITY_UVC_MMAP_BASE, PKUNITY_UVC_MMAP_SIZE);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -370,17 +361,6 @@ static void __init devicemaps_init(void)
|
|||||||
for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
|
for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
|
||||||
pmd_clear(pmd_off_k(addr));
|
pmd_clear(pmd_off_k(addr));
|
||||||
|
|
||||||
/*
|
|
||||||
* Create a mapping for UniGFX VRAM
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_PUV3_UNIGFX
|
|
||||||
map.pfn = __phys_to_pfn(PKUNITY_UNIGFX_MMAP_BASE);
|
|
||||||
map.virtual = KUSER_UNIGFX_BASE;
|
|
||||||
map.length = PKUNITY_UNIGFX_MMAP_SIZE;
|
|
||||||
map.type = MT_KUSER;
|
|
||||||
create_mapping(&map);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a mapping for the machine vectors at the high-vectors
|
* Create a mapping for the machine vectors at the high-vectors
|
||||||
* location (0xffff0000). If we aren't using high-vectors, also
|
* location (0xffff0000). If we aren't using high-vectors, also
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#define _ASM_X86_APIC_H
|
#define _ASM_X86_APIC_H
|
||||||
|
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
|
|
||||||
#include <asm/alternative.h>
|
#include <asm/alternative.h>
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
#include <linux/spinlock.h> /* And spinlocks */
|
#include <linux/spinlock.h> /* And spinlocks */
|
||||||
#include <asm/io.h> /* need byte IO */
|
#include <asm/io.h> /* need byte IO */
|
||||||
#include <linux/delay.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
|
#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
|
||||||
#define dma_outb outb_p
|
#define dma_outb outb_p
|
||||||
|
@ -95,7 +95,6 @@ extern void setup_node_to_cpumask_map(void);
|
|||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
extern unsigned long node_start_pfn[];
|
extern unsigned long node_start_pfn[];
|
||||||
extern unsigned long node_end_pfn[];
|
extern unsigned long node_end_pfn[];
|
||||||
extern unsigned long node_remap_size[];
|
|
||||||
#define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid])
|
#define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid])
|
||||||
|
|
||||||
# define SD_CACHE_NICE_TRIES 1
|
# define SD_CACHE_NICE_TRIES 1
|
||||||
|
@ -21,7 +21,7 @@ const struct pci_device_id amd_nb_misc_ids[] = {
|
|||||||
EXPORT_SYMBOL(amd_nb_misc_ids);
|
EXPORT_SYMBOL(amd_nb_misc_ids);
|
||||||
|
|
||||||
static struct pci_device_id amd_nb_link_ids[] = {
|
static struct pci_device_id amd_nb_link_ids[] = {
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_LINK) },
|
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
#include <linux/nmi.h>
|
#include <linux/nmi.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
||||||
u64 hw_nmi_get_sample_period(void)
|
u64 hw_nmi_get_sample_period(void)
|
||||||
|
@ -93,10 +93,6 @@ static inline void numaq_register_node(int node, struct sys_cfg_data *scd)
|
|||||||
node_end_pfn[node]);
|
node_end_pfn[node]);
|
||||||
|
|
||||||
memory_present(node, node_start_pfn[node], node_end_pfn[node]);
|
memory_present(node, node_start_pfn[node], node_end_pfn[node]);
|
||||||
|
|
||||||
node_remap_size[node] = node_memmap_size_bytes(node,
|
|
||||||
node_start_pfn[node],
|
|
||||||
node_end_pfn[node]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/crash_dump.h>
|
||||||
|
|
||||||
#include <asm/uv/uv_mmrs.h>
|
#include <asm/uv/uv_mmrs.h>
|
||||||
#include <asm/uv/uv_hub.h>
|
#include <asm/uv/uv_hub.h>
|
||||||
@ -34,6 +36,7 @@
|
|||||||
#include <asm/ipi.h>
|
#include <asm/ipi.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/x86_init.h>
|
#include <asm/x86_init.h>
|
||||||
|
#include <asm/emergency-restart.h>
|
||||||
|
|
||||||
DEFINE_PER_CPU(int, x2apic_extra_bits);
|
DEFINE_PER_CPU(int, x2apic_extra_bits);
|
||||||
|
|
||||||
@ -810,4 +813,11 @@ void __init uv_system_init(void)
|
|||||||
|
|
||||||
/* register Legacy VGA I/O redirection handler */
|
/* register Legacy VGA I/O redirection handler */
|
||||||
pci_register_set_vga_state(uv_set_vga_state);
|
pci_register_set_vga_state(uv_set_vga_state);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For a kdump kernel the reset must be BOOT_ACPI, not BOOT_EFI, as
|
||||||
|
* EFI is not enabled in the kdump kernel.
|
||||||
|
*/
|
||||||
|
if (is_kdump_kernel())
|
||||||
|
reboot_type = BOOT_ACPI;
|
||||||
}
|
}
|
||||||
|
@ -1626,7 +1626,7 @@ out:
|
|||||||
static unsigned int mce_poll(struct file *file, poll_table *wait)
|
static unsigned int mce_poll(struct file *file, poll_table *wait)
|
||||||
{
|
{
|
||||||
poll_wait(file, &mce_wait, wait);
|
poll_wait(file, &mce_wait, wait);
|
||||||
if (rcu_dereference_check_mce(mcelog.next))
|
if (rcu_access_index(mcelog.next))
|
||||||
return POLLIN | POLLRDNORM;
|
return POLLIN | POLLRDNORM;
|
||||||
if (!mce_apei_read_done && apei_check_mce())
|
if (!mce_apei_read_done && apei_check_mce())
|
||||||
return POLLIN | POLLRDNORM;
|
return POLLIN | POLLRDNORM;
|
||||||
|
@ -293,14 +293,24 @@ set_mtrr(unsigned int reg, unsigned long base, unsigned long size, mtrr_type typ
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* HACK!
|
* HACK!
|
||||||
* We use this same function to initialize the mtrrs on boot.
|
*
|
||||||
* The state of the boot cpu's mtrrs has been saved, and we want
|
* We use this same function to initialize the mtrrs during boot,
|
||||||
* to replicate across all the APs.
|
* resume, runtime cpu online and on an explicit request to set a
|
||||||
* If we're doing that @reg is set to something special...
|
* specific MTRR.
|
||||||
|
*
|
||||||
|
* During boot or suspend, the state of the boot cpu's mtrrs has been
|
||||||
|
* saved, and we want to replicate that across all the cpus that come
|
||||||
|
* online (either at the end of boot or resume or during a runtime cpu
|
||||||
|
* online). If we're doing that, @reg is set to something special and on
|
||||||
|
* this cpu we still do mtrr_if->set_all(). During boot/resume, this
|
||||||
|
* is unnecessary if at this point we are still on the cpu that started
|
||||||
|
* the boot/resume sequence. But there is no guarantee that we are still
|
||||||
|
* on the same cpu. So we do mtrr_if->set_all() on this cpu aswell to be
|
||||||
|
* sure that we are in sync with everyone else.
|
||||||
*/
|
*/
|
||||||
if (reg != ~0U)
|
if (reg != ~0U)
|
||||||
mtrr_if->set(reg, base, size, type);
|
mtrr_if->set(reg, base, size, type);
|
||||||
else if (!mtrr_aps_delayed_init)
|
else
|
||||||
mtrr_if->set_all();
|
mtrr_if->set_all();
|
||||||
|
|
||||||
/* Wait for the others */
|
/* Wait for the others */
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
#include <asm/io_apic.h>
|
#include <asm/io_apic.h>
|
||||||
|
@ -550,6 +550,7 @@ static void __exit microcode_exit(void)
|
|||||||
microcode_dev_exit();
|
microcode_dev_exit();
|
||||||
|
|
||||||
unregister_hotcpu_notifier(&mc_cpu_notifier);
|
unregister_hotcpu_notifier(&mc_cpu_notifier);
|
||||||
|
unregister_syscore_ops(&mc_syscore_ops);
|
||||||
|
|
||||||
get_online_cpus();
|
get_online_cpus();
|
||||||
mutex_lock(µcode_mutex);
|
mutex_lock(µcode_mutex);
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <linux/dmi.h>
|
#include <linux/dmi.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/tboot.h>
|
#include <linux/tboot.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
#include <acpi/reboot.h>
|
#include <acpi/reboot.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
|
@ -104,13 +104,9 @@ extern unsigned long highend_pfn, highstart_pfn;
|
|||||||
|
|
||||||
#define LARGE_PAGE_BYTES (PTRS_PER_PTE * PAGE_SIZE)
|
#define LARGE_PAGE_BYTES (PTRS_PER_PTE * PAGE_SIZE)
|
||||||
|
|
||||||
unsigned long node_remap_size[MAX_NUMNODES];
|
|
||||||
static void *node_remap_start_vaddr[MAX_NUMNODES];
|
static void *node_remap_start_vaddr[MAX_NUMNODES];
|
||||||
void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags);
|
void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags);
|
||||||
|
|
||||||
static unsigned long kva_start_pfn;
|
|
||||||
static unsigned long kva_pages;
|
|
||||||
|
|
||||||
int __cpuinit numa_cpu_node(int cpu)
|
int __cpuinit numa_cpu_node(int cpu)
|
||||||
{
|
{
|
||||||
return apic->x86_32_numa_cpu_node(cpu);
|
return apic->x86_32_numa_cpu_node(cpu);
|
||||||
@ -129,7 +125,6 @@ int __init get_memcfg_numa_flat(void)
|
|||||||
node_end_pfn[0] = max_pfn;
|
node_end_pfn[0] = max_pfn;
|
||||||
memblock_x86_register_active_regions(0, 0, max_pfn);
|
memblock_x86_register_active_regions(0, 0, max_pfn);
|
||||||
memory_present(0, 0, max_pfn);
|
memory_present(0, 0, max_pfn);
|
||||||
node_remap_size[0] = node_memmap_size_bytes(0, 0, max_pfn);
|
|
||||||
|
|
||||||
/* Indicate there is one node available. */
|
/* Indicate there is one node available. */
|
||||||
nodes_clear(node_online_map);
|
nodes_clear(node_online_map);
|
||||||
@ -164,9 +159,8 @@ static void __init allocate_pgdat(int nid)
|
|||||||
{
|
{
|
||||||
char buf[16];
|
char buf[16];
|
||||||
|
|
||||||
if (node_has_online_mem(nid) && node_remap_start_vaddr[nid])
|
NODE_DATA(nid) = alloc_remap(nid, ALIGN(sizeof(pg_data_t), PAGE_SIZE));
|
||||||
NODE_DATA(nid) = (pg_data_t *)node_remap_start_vaddr[nid];
|
if (!NODE_DATA(nid)) {
|
||||||
else {
|
|
||||||
unsigned long pgdat_phys;
|
unsigned long pgdat_phys;
|
||||||
pgdat_phys = memblock_find_in_range(min_low_pfn<<PAGE_SHIFT,
|
pgdat_phys = memblock_find_in_range(min_low_pfn<<PAGE_SHIFT,
|
||||||
max_pfn_mapped<<PAGE_SHIFT,
|
max_pfn_mapped<<PAGE_SHIFT,
|
||||||
@ -182,25 +176,38 @@ static void __init allocate_pgdat(int nid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In the DISCONTIGMEM and SPARSEMEM memory model, a portion of the kernel
|
* Remap memory allocator
|
||||||
* virtual address space (KVA) is reserved and portions of nodes are mapped
|
|
||||||
* using it. This is to allow node-local memory to be allocated for
|
|
||||||
* structures that would normally require ZONE_NORMAL. The memory is
|
|
||||||
* allocated with alloc_remap() and callers should be prepared to allocate
|
|
||||||
* from the bootmem allocator instead.
|
|
||||||
*/
|
*/
|
||||||
static unsigned long node_remap_start_pfn[MAX_NUMNODES];
|
static unsigned long node_remap_start_pfn[MAX_NUMNODES];
|
||||||
static void *node_remap_end_vaddr[MAX_NUMNODES];
|
static void *node_remap_end_vaddr[MAX_NUMNODES];
|
||||||
static void *node_remap_alloc_vaddr[MAX_NUMNODES];
|
static void *node_remap_alloc_vaddr[MAX_NUMNODES];
|
||||||
static unsigned long node_remap_offset[MAX_NUMNODES];
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* alloc_remap - Allocate remapped memory
|
||||||
|
* @nid: NUMA node to allocate memory from
|
||||||
|
* @size: The size of allocation
|
||||||
|
*
|
||||||
|
* Allocate @size bytes from the remap area of NUMA node @nid. The
|
||||||
|
* size of the remap area is predetermined by init_alloc_remap() and
|
||||||
|
* only the callers considered there should call this function. For
|
||||||
|
* more info, please read the comment on top of init_alloc_remap().
|
||||||
|
*
|
||||||
|
* The caller must be ready to handle allocation failure from this
|
||||||
|
* function and fall back to regular memory allocator in such cases.
|
||||||
|
*
|
||||||
|
* CONTEXT:
|
||||||
|
* Single CPU early boot context.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* Pointer to the allocated memory on success, %NULL on failure.
|
||||||
|
*/
|
||||||
void *alloc_remap(int nid, unsigned long size)
|
void *alloc_remap(int nid, unsigned long size)
|
||||||
{
|
{
|
||||||
void *allocation = node_remap_alloc_vaddr[nid];
|
void *allocation = node_remap_alloc_vaddr[nid];
|
||||||
|
|
||||||
size = ALIGN(size, L1_CACHE_BYTES);
|
size = ALIGN(size, L1_CACHE_BYTES);
|
||||||
|
|
||||||
if (!allocation || (allocation + size) >= node_remap_end_vaddr[nid])
|
if (!allocation || (allocation + size) > node_remap_end_vaddr[nid])
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
node_remap_alloc_vaddr[nid] += size;
|
node_remap_alloc_vaddr[nid] += size;
|
||||||
@ -209,26 +216,6 @@ void *alloc_remap(int nid, unsigned long size)
|
|||||||
return allocation;
|
return allocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init remap_numa_kva(void)
|
|
||||||
{
|
|
||||||
void *vaddr;
|
|
||||||
unsigned long pfn;
|
|
||||||
int node;
|
|
||||||
|
|
||||||
for_each_online_node(node) {
|
|
||||||
printk(KERN_DEBUG "remap_numa_kva: node %d\n", node);
|
|
||||||
for (pfn=0; pfn < node_remap_size[node]; pfn += PTRS_PER_PTE) {
|
|
||||||
vaddr = node_remap_start_vaddr[node]+(pfn<<PAGE_SHIFT);
|
|
||||||
printk(KERN_DEBUG "remap_numa_kva: %08lx to pfn %08lx\n",
|
|
||||||
(unsigned long)vaddr,
|
|
||||||
node_remap_start_pfn[node] + pfn);
|
|
||||||
set_pmd_pfn((ulong) vaddr,
|
|
||||||
node_remap_start_pfn[node] + pfn,
|
|
||||||
PAGE_KERNEL_LARGE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_HIBERNATION
|
#ifdef CONFIG_HIBERNATION
|
||||||
/**
|
/**
|
||||||
* resume_map_numa_kva - add KVA mapping to the temporary page tables created
|
* resume_map_numa_kva - add KVA mapping to the temporary page tables created
|
||||||
@ -240,15 +227,16 @@ void resume_map_numa_kva(pgd_t *pgd_base)
|
|||||||
int node;
|
int node;
|
||||||
|
|
||||||
for_each_online_node(node) {
|
for_each_online_node(node) {
|
||||||
unsigned long start_va, start_pfn, size, pfn;
|
unsigned long start_va, start_pfn, nr_pages, pfn;
|
||||||
|
|
||||||
start_va = (unsigned long)node_remap_start_vaddr[node];
|
start_va = (unsigned long)node_remap_start_vaddr[node];
|
||||||
start_pfn = node_remap_start_pfn[node];
|
start_pfn = node_remap_start_pfn[node];
|
||||||
size = node_remap_size[node];
|
nr_pages = (node_remap_end_vaddr[node] -
|
||||||
|
node_remap_start_vaddr[node]) >> PAGE_SHIFT;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: node %d\n", __func__, node);
|
printk(KERN_DEBUG "%s: node %d\n", __func__, node);
|
||||||
|
|
||||||
for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) {
|
for (pfn = 0; pfn < nr_pages; pfn += PTRS_PER_PTE) {
|
||||||
unsigned long vaddr = start_va + (pfn << PAGE_SHIFT);
|
unsigned long vaddr = start_va + (pfn << PAGE_SHIFT);
|
||||||
pgd_t *pgd = pgd_base + pgd_index(vaddr);
|
pgd_t *pgd = pgd_base + pgd_index(vaddr);
|
||||||
pud_t *pud = pud_offset(pgd, vaddr);
|
pud_t *pud = pud_offset(pgd, vaddr);
|
||||||
@ -264,132 +252,102 @@ void resume_map_numa_kva(pgd_t *pgd_base)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static __init unsigned long calculate_numa_remap_pages(void)
|
/**
|
||||||
|
* init_alloc_remap - Initialize remap allocator for a NUMA node
|
||||||
|
* @nid: NUMA node to initizlie remap allocator for
|
||||||
|
*
|
||||||
|
* NUMA nodes may end up without any lowmem. As allocating pgdat and
|
||||||
|
* memmap on a different node with lowmem is inefficient, a special
|
||||||
|
* remap allocator is implemented which can be used by alloc_remap().
|
||||||
|
*
|
||||||
|
* For each node, the amount of memory which will be necessary for
|
||||||
|
* pgdat and memmap is calculated and two memory areas of the size are
|
||||||
|
* allocated - one in the node and the other in lowmem; then, the area
|
||||||
|
* in the node is remapped to the lowmem area.
|
||||||
|
*
|
||||||
|
* As pgdat and memmap must be allocated in lowmem anyway, this
|
||||||
|
* doesn't waste lowmem address space; however, the actual lowmem
|
||||||
|
* which gets remapped over is wasted. The amount shouldn't be
|
||||||
|
* problematic on machines this feature will be used.
|
||||||
|
*
|
||||||
|
* Initialization failure isn't fatal. alloc_remap() is used
|
||||||
|
* opportunistically and the callers will fall back to other memory
|
||||||
|
* allocation mechanisms on failure.
|
||||||
|
*/
|
||||||
|
static __init void init_alloc_remap(int nid)
|
||||||
{
|
{
|
||||||
int nid;
|
unsigned long size, pfn;
|
||||||
unsigned long size, reserve_pages = 0;
|
u64 node_pa, remap_pa;
|
||||||
|
void *remap_va;
|
||||||
|
|
||||||
for_each_online_node(nid) {
|
/*
|
||||||
u64 node_kva_target;
|
* The acpi/srat node info can show hot-add memroy zones where
|
||||||
u64 node_kva_final;
|
* memory could be added but not currently present.
|
||||||
|
*/
|
||||||
|
printk(KERN_DEBUG "node %d pfn: [%lx - %lx]\n",
|
||||||
|
nid, node_start_pfn[nid], node_end_pfn[nid]);
|
||||||
|
if (node_start_pfn[nid] > max_pfn)
|
||||||
|
return;
|
||||||
|
if (!node_end_pfn[nid])
|
||||||
|
return;
|
||||||
|
if (node_end_pfn[nid] > max_pfn)
|
||||||
|
node_end_pfn[nid] = max_pfn;
|
||||||
|
|
||||||
/*
|
/* calculate the necessary space aligned to large page size */
|
||||||
* The acpi/srat node info can show hot-add memroy zones
|
size = node_memmap_size_bytes(nid, node_start_pfn[nid],
|
||||||
* where memory could be added but not currently present.
|
min(node_end_pfn[nid], max_pfn));
|
||||||
*/
|
size += ALIGN(sizeof(pg_data_t), PAGE_SIZE);
|
||||||
printk(KERN_DEBUG "node %d pfn: [%lx - %lx]\n",
|
size = ALIGN(size, LARGE_PAGE_BYTES);
|
||||||
nid, node_start_pfn[nid], node_end_pfn[nid]);
|
|
||||||
if (node_start_pfn[nid] > max_pfn)
|
|
||||||
continue;
|
|
||||||
if (!node_end_pfn[nid])
|
|
||||||
continue;
|
|
||||||
if (node_end_pfn[nid] > max_pfn)
|
|
||||||
node_end_pfn[nid] = max_pfn;
|
|
||||||
|
|
||||||
/* ensure the remap includes space for the pgdat. */
|
/* allocate node memory and the lowmem remap area */
|
||||||
size = node_remap_size[nid] + sizeof(pg_data_t);
|
node_pa = memblock_find_in_range(node_start_pfn[nid] << PAGE_SHIFT,
|
||||||
|
(u64)node_end_pfn[nid] << PAGE_SHIFT,
|
||||||
/* convert size to large (pmd size) pages, rounding up */
|
size, LARGE_PAGE_BYTES);
|
||||||
size = (size + LARGE_PAGE_BYTES - 1) / LARGE_PAGE_BYTES;
|
if (node_pa == MEMBLOCK_ERROR) {
|
||||||
/* now the roundup is correct, convert to PAGE_SIZE pages */
|
pr_warning("remap_alloc: failed to allocate %lu bytes for node %d\n",
|
||||||
size = size * PTRS_PER_PTE;
|
size, nid);
|
||||||
|
return;
|
||||||
node_kva_target = round_down(node_end_pfn[nid] - size,
|
|
||||||
PTRS_PER_PTE);
|
|
||||||
node_kva_target <<= PAGE_SHIFT;
|
|
||||||
do {
|
|
||||||
node_kva_final = memblock_find_in_range(node_kva_target,
|
|
||||||
((u64)node_end_pfn[nid])<<PAGE_SHIFT,
|
|
||||||
((u64)size)<<PAGE_SHIFT,
|
|
||||||
LARGE_PAGE_BYTES);
|
|
||||||
node_kva_target -= LARGE_PAGE_BYTES;
|
|
||||||
} while (node_kva_final == MEMBLOCK_ERROR &&
|
|
||||||
(node_kva_target>>PAGE_SHIFT) > (node_start_pfn[nid]));
|
|
||||||
|
|
||||||
if (node_kva_final == MEMBLOCK_ERROR)
|
|
||||||
panic("Can not get kva ram\n");
|
|
||||||
|
|
||||||
node_remap_size[nid] = size;
|
|
||||||
node_remap_offset[nid] = reserve_pages;
|
|
||||||
reserve_pages += size;
|
|
||||||
printk(KERN_DEBUG "Reserving %ld pages of KVA for lmem_map of"
|
|
||||||
" node %d at %llx\n",
|
|
||||||
size, nid, node_kva_final>>PAGE_SHIFT);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* prevent kva address below max_low_pfn want it on system
|
|
||||||
* with less memory later.
|
|
||||||
* layout will be: KVA address , KVA RAM
|
|
||||||
*
|
|
||||||
* we are supposed to only record the one less then max_low_pfn
|
|
||||||
* but we could have some hole in high memory, and it will only
|
|
||||||
* check page_is_ram(pfn) && !page_is_reserved_early(pfn) to decide
|
|
||||||
* to use it as free.
|
|
||||||
* So memblock_x86_reserve_range here, hope we don't run out of that array
|
|
||||||
*/
|
|
||||||
memblock_x86_reserve_range(node_kva_final,
|
|
||||||
node_kva_final+(((u64)size)<<PAGE_SHIFT),
|
|
||||||
"KVA RAM");
|
|
||||||
|
|
||||||
node_remap_start_pfn[nid] = node_kva_final>>PAGE_SHIFT;
|
|
||||||
}
|
}
|
||||||
printk(KERN_INFO "Reserving total of %lx pages for numa KVA remap\n",
|
memblock_x86_reserve_range(node_pa, node_pa + size, "KVA RAM");
|
||||||
reserve_pages);
|
|
||||||
return reserve_pages;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void init_remap_allocator(int nid)
|
remap_pa = memblock_find_in_range(min_low_pfn << PAGE_SHIFT,
|
||||||
{
|
max_low_pfn << PAGE_SHIFT,
|
||||||
node_remap_start_vaddr[nid] = pfn_to_kaddr(
|
size, LARGE_PAGE_BYTES);
|
||||||
kva_start_pfn + node_remap_offset[nid]);
|
if (remap_pa == MEMBLOCK_ERROR) {
|
||||||
node_remap_end_vaddr[nid] = node_remap_start_vaddr[nid] +
|
pr_warning("remap_alloc: failed to allocate %lu bytes remap area for node %d\n",
|
||||||
(node_remap_size[nid] * PAGE_SIZE);
|
size, nid);
|
||||||
node_remap_alloc_vaddr[nid] = node_remap_start_vaddr[nid] +
|
memblock_x86_free_range(node_pa, node_pa + size);
|
||||||
ALIGN(sizeof(pg_data_t), PAGE_SIZE);
|
return;
|
||||||
|
}
|
||||||
|
memblock_x86_reserve_range(remap_pa, remap_pa + size, "KVA PG");
|
||||||
|
remap_va = phys_to_virt(remap_pa);
|
||||||
|
|
||||||
printk(KERN_DEBUG "node %d will remap to vaddr %08lx - %08lx\n", nid,
|
/* perform actual remap */
|
||||||
(ulong) node_remap_start_vaddr[nid],
|
for (pfn = 0; pfn < size >> PAGE_SHIFT; pfn += PTRS_PER_PTE)
|
||||||
(ulong) node_remap_end_vaddr[nid]);
|
set_pmd_pfn((unsigned long)remap_va + (pfn << PAGE_SHIFT),
|
||||||
|
(node_pa >> PAGE_SHIFT) + pfn,
|
||||||
|
PAGE_KERNEL_LARGE);
|
||||||
|
|
||||||
|
/* initialize remap allocator parameters */
|
||||||
|
node_remap_start_pfn[nid] = node_pa >> PAGE_SHIFT;
|
||||||
|
node_remap_start_vaddr[nid] = remap_va;
|
||||||
|
node_remap_end_vaddr[nid] = remap_va + size;
|
||||||
|
node_remap_alloc_vaddr[nid] = remap_va;
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "remap_alloc: node %d [%08llx-%08llx) -> [%p-%p)\n",
|
||||||
|
nid, node_pa, node_pa + size, remap_va, remap_va + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init initmem_init(void)
|
void __init initmem_init(void)
|
||||||
{
|
{
|
||||||
int nid;
|
int nid;
|
||||||
long kva_target_pfn;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When mapping a NUMA machine we allocate the node_mem_map arrays
|
|
||||||
* from node local memory. They are then mapped directly into KVA
|
|
||||||
* between zone normal and vmalloc space. Calculate the size of
|
|
||||||
* this space and use it to adjust the boundary between ZONE_NORMAL
|
|
||||||
* and ZONE_HIGHMEM.
|
|
||||||
*/
|
|
||||||
|
|
||||||
get_memcfg_numa();
|
get_memcfg_numa();
|
||||||
numa_init_array();
|
numa_init_array();
|
||||||
|
|
||||||
kva_pages = roundup(calculate_numa_remap_pages(), PTRS_PER_PTE);
|
for_each_online_node(nid)
|
||||||
|
init_alloc_remap(nid);
|
||||||
|
|
||||||
kva_target_pfn = round_down(max_low_pfn - kva_pages, PTRS_PER_PTE);
|
|
||||||
do {
|
|
||||||
kva_start_pfn = memblock_find_in_range(kva_target_pfn<<PAGE_SHIFT,
|
|
||||||
max_low_pfn<<PAGE_SHIFT,
|
|
||||||
kva_pages<<PAGE_SHIFT,
|
|
||||||
PTRS_PER_PTE<<PAGE_SHIFT) >> PAGE_SHIFT;
|
|
||||||
kva_target_pfn -= PTRS_PER_PTE;
|
|
||||||
} while (kva_start_pfn == MEMBLOCK_ERROR && kva_target_pfn > min_low_pfn);
|
|
||||||
|
|
||||||
if (kva_start_pfn == MEMBLOCK_ERROR)
|
|
||||||
panic("Can not get kva space\n");
|
|
||||||
|
|
||||||
printk(KERN_INFO "kva_start_pfn ~ %lx max_low_pfn ~ %lx\n",
|
|
||||||
kva_start_pfn, max_low_pfn);
|
|
||||||
printk(KERN_INFO "max_pfn = %lx\n", max_pfn);
|
|
||||||
|
|
||||||
/* avoid clash with initrd */
|
|
||||||
memblock_x86_reserve_range(kva_start_pfn<<PAGE_SHIFT,
|
|
||||||
(kva_start_pfn + kva_pages)<<PAGE_SHIFT,
|
|
||||||
"KVA PG");
|
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_HIGHMEM
|
||||||
highstart_pfn = highend_pfn = max_pfn;
|
highstart_pfn = highend_pfn = max_pfn;
|
||||||
if (max_pfn > max_low_pfn)
|
if (max_pfn > max_low_pfn)
|
||||||
@ -409,12 +367,8 @@ void __init initmem_init(void)
|
|||||||
|
|
||||||
printk(KERN_DEBUG "Low memory ends at vaddr %08lx\n",
|
printk(KERN_DEBUG "Low memory ends at vaddr %08lx\n",
|
||||||
(ulong) pfn_to_kaddr(max_low_pfn));
|
(ulong) pfn_to_kaddr(max_low_pfn));
|
||||||
for_each_online_node(nid) {
|
for_each_online_node(nid)
|
||||||
init_remap_allocator(nid);
|
|
||||||
|
|
||||||
allocate_pgdat(nid);
|
allocate_pgdat(nid);
|
||||||
}
|
|
||||||
remap_numa_kva();
|
|
||||||
|
|
||||||
printk(KERN_DEBUG "High memory starts at vaddr %08lx\n",
|
printk(KERN_DEBUG "High memory starts at vaddr %08lx\n",
|
||||||
(ulong) pfn_to_kaddr(highstart_pfn));
|
(ulong) pfn_to_kaddr(highstart_pfn));
|
||||||
|
@ -276,7 +276,6 @@ int __init get_memcfg_from_srat(void)
|
|||||||
unsigned long end = min(node_end_pfn[nid], max_pfn);
|
unsigned long end = min(node_end_pfn[nid], max_pfn);
|
||||||
|
|
||||||
memory_present(nid, start, end);
|
memory_present(nid, start, end);
|
||||||
node_remap_size[nid] = node_memmap_size_bytes(nid, start, end);
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
out_fail:
|
out_fail:
|
||||||
|
@ -49,6 +49,10 @@ u64 op_x86_get_ctrl(struct op_x86_model_spec const *model,
|
|||||||
val |= counter_config->user ? ARCH_PERFMON_EVENTSEL_USR : 0;
|
val |= counter_config->user ? ARCH_PERFMON_EVENTSEL_USR : 0;
|
||||||
val |= counter_config->kernel ? ARCH_PERFMON_EVENTSEL_OS : 0;
|
val |= counter_config->kernel ? ARCH_PERFMON_EVENTSEL_OS : 0;
|
||||||
val |= (counter_config->unit_mask & 0xFF) << 8;
|
val |= (counter_config->unit_mask & 0xFF) << 8;
|
||||||
|
counter_config->extra &= (ARCH_PERFMON_EVENTSEL_INV |
|
||||||
|
ARCH_PERFMON_EVENTSEL_EDGE |
|
||||||
|
ARCH_PERFMON_EVENTSEL_CMASK);
|
||||||
|
val |= counter_config->extra;
|
||||||
event &= model->event_mask ? model->event_mask : 0xFF;
|
event &= model->event_mask ? model->event_mask : 0xFF;
|
||||||
val |= event & 0xFF;
|
val |= event & 0xFF;
|
||||||
val |= (event & 0x0F00) << 24;
|
val |= (event & 0x0F00) << 24;
|
||||||
@ -440,6 +444,7 @@ static int nmi_create_files(struct super_block *sb, struct dentry *root)
|
|||||||
oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask);
|
oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask);
|
||||||
oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel);
|
oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel);
|
||||||
oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user);
|
oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user);
|
||||||
|
oprofilefs_create_ulong(sb, dir, "extra", &counter_config[i].extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -22,6 +22,7 @@ struct op_counter_config {
|
|||||||
unsigned long kernel;
|
unsigned long kernel;
|
||||||
unsigned long user;
|
unsigned long user;
|
||||||
unsigned long unit_mask;
|
unsigned long unit_mask;
|
||||||
|
unsigned long extra;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct op_counter_config counter_config[];
|
extern struct op_counter_config counter_config[];
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/uv/uv.h>
|
#include <asm/uv/uv.h>
|
||||||
|
@ -2163,7 +2163,7 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes)
|
|||||||
* size, something has gone terribly wrong.
|
* size, something has gone terribly wrong.
|
||||||
*/
|
*/
|
||||||
if (blk_rq_bytes(req) < blk_rq_cur_bytes(req)) {
|
if (blk_rq_bytes(req) < blk_rq_cur_bytes(req)) {
|
||||||
printk(KERN_ERR "blk: request botched\n");
|
blk_dump_rq_flags(req, "request botched");
|
||||||
req->__data_len = blk_rq_cur_bytes(req);
|
req->__data_len = blk_rq_cur_bytes(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2665,7 +2665,7 @@ static int plug_rq_cmp(void *priv, struct list_head *a, struct list_head *b)
|
|||||||
struct request *rqa = container_of(a, struct request, queuelist);
|
struct request *rqa = container_of(a, struct request, queuelist);
|
||||||
struct request *rqb = container_of(b, struct request, queuelist);
|
struct request *rqb = container_of(b, struct request, queuelist);
|
||||||
|
|
||||||
return !(rqa->q == rqb->q);
|
return !(rqa->q <= rqb->q);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void flush_plug_list(struct blk_plug *plug)
|
static void flush_plug_list(struct blk_plug *plug)
|
||||||
|
@ -261,7 +261,7 @@ static bool blk_kick_flush(struct request_queue *q)
|
|||||||
q->flush_rq.end_io = flush_end_io;
|
q->flush_rq.end_io = flush_end_io;
|
||||||
|
|
||||||
q->flush_pending_idx ^= 1;
|
q->flush_pending_idx ^= 1;
|
||||||
elv_insert(q, &q->flush_rq, ELEVATOR_INSERT_REQUEUE);
|
list_add_tail(&q->flush_rq.queuelist, &q->queue_head);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ static void flush_data_end_io(struct request *rq, int error)
|
|||||||
* blk_insert_flush - insert a new FLUSH/FUA request
|
* blk_insert_flush - insert a new FLUSH/FUA request
|
||||||
* @rq: request to insert
|
* @rq: request to insert
|
||||||
*
|
*
|
||||||
* To be called from elv_insert() for %ELEVATOR_INSERT_FLUSH insertions.
|
* To be called from __elv_add_request() for %ELEVATOR_INSERT_FLUSH insertions.
|
||||||
* @rq is being submitted. Analyze what needs to be done and put it on the
|
* @rq is being submitted. Analyze what needs to be done and put it on the
|
||||||
* right queue.
|
* right queue.
|
||||||
*
|
*
|
||||||
@ -312,7 +312,7 @@ void blk_insert_flush(struct request *rq)
|
|||||||
*/
|
*/
|
||||||
if ((policy & REQ_FSEQ_DATA) &&
|
if ((policy & REQ_FSEQ_DATA) &&
|
||||||
!(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) {
|
!(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) {
|
||||||
list_add(&rq->queuelist, &q->queue_head);
|
list_add_tail(&rq->queuelist, &q->queue_head);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
|
|
||||||
static struct kmem_cache *integrity_cachep;
|
static struct kmem_cache *integrity_cachep;
|
||||||
|
|
||||||
|
static const char *bi_unsupported_name = "unsupported";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* blk_rq_count_integrity_sg - Count number of integrity scatterlist elements
|
* blk_rq_count_integrity_sg - Count number of integrity scatterlist elements
|
||||||
* @q: request queue
|
* @q: request queue
|
||||||
@ -358,6 +360,14 @@ static struct kobj_type integrity_ktype = {
|
|||||||
.release = blk_integrity_release,
|
.release = blk_integrity_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool blk_integrity_is_initialized(struct gendisk *disk)
|
||||||
|
{
|
||||||
|
struct blk_integrity *bi = blk_get_integrity(disk);
|
||||||
|
|
||||||
|
return (bi && bi->name && strcmp(bi->name, bi_unsupported_name) != 0);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(blk_integrity_is_initialized);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* blk_integrity_register - Register a gendisk as being integrity-capable
|
* blk_integrity_register - Register a gendisk as being integrity-capable
|
||||||
* @disk: struct gendisk pointer to make integrity-aware
|
* @disk: struct gendisk pointer to make integrity-aware
|
||||||
@ -407,7 +417,7 @@ int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template)
|
|||||||
bi->get_tag_fn = template->get_tag_fn;
|
bi->get_tag_fn = template->get_tag_fn;
|
||||||
bi->tag_size = template->tag_size;
|
bi->tag_size = template->tag_size;
|
||||||
} else
|
} else
|
||||||
bi->name = "unsupported";
|
bi->name = bi_unsupported_name;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ struct throtl_grp {
|
|||||||
unsigned long slice_end[2];
|
unsigned long slice_end[2];
|
||||||
|
|
||||||
/* Some throttle limits got updated for the group */
|
/* Some throttle limits got updated for the group */
|
||||||
bool limits_changed;
|
int limits_changed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct throtl_data
|
struct throtl_data
|
||||||
@ -102,7 +102,7 @@ struct throtl_data
|
|||||||
/* Work for dispatching throttled bios */
|
/* Work for dispatching throttled bios */
|
||||||
struct delayed_work throtl_work;
|
struct delayed_work throtl_work;
|
||||||
|
|
||||||
bool limits_changed;
|
int limits_changed;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum tg_state_flags {
|
enum tg_state_flags {
|
||||||
|
@ -610,7 +610,7 @@ void elv_requeue_request(struct request_queue *q, struct request *rq)
|
|||||||
|
|
||||||
rq->cmd_flags &= ~REQ_STARTED;
|
rq->cmd_flags &= ~REQ_STARTED;
|
||||||
|
|
||||||
elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE);
|
__elv_add_request(q, rq, ELEVATOR_INSERT_REQUEUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void elv_drain_elevator(struct request_queue *q)
|
void elv_drain_elevator(struct request_queue *q)
|
||||||
@ -655,12 +655,25 @@ void elv_quiesce_end(struct request_queue *q)
|
|||||||
queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
|
queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
void elv_insert(struct request_queue *q, struct request *rq, int where)
|
void __elv_add_request(struct request_queue *q, struct request *rq, int where)
|
||||||
{
|
{
|
||||||
trace_block_rq_insert(q, rq);
|
trace_block_rq_insert(q, rq);
|
||||||
|
|
||||||
rq->q = q;
|
rq->q = q;
|
||||||
|
|
||||||
|
BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
|
||||||
|
|
||||||
|
if (rq->cmd_flags & REQ_SOFTBARRIER) {
|
||||||
|
/* barriers are scheduling boundary, update end_sector */
|
||||||
|
if (rq->cmd_type == REQ_TYPE_FS ||
|
||||||
|
(rq->cmd_flags & REQ_DISCARD)) {
|
||||||
|
q->end_sector = rq_end_sector(rq);
|
||||||
|
q->boundary_rq = rq;
|
||||||
|
}
|
||||||
|
} else if (!(rq->cmd_flags & REQ_ELVPRIV) &&
|
||||||
|
where == ELEVATOR_INSERT_SORT)
|
||||||
|
where = ELEVATOR_INSERT_BACK;
|
||||||
|
|
||||||
switch (where) {
|
switch (where) {
|
||||||
case ELEVATOR_INSERT_REQUEUE:
|
case ELEVATOR_INSERT_REQUEUE:
|
||||||
case ELEVATOR_INSERT_FRONT:
|
case ELEVATOR_INSERT_FRONT:
|
||||||
@ -722,24 +735,6 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)
|
|||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __elv_add_request(struct request_queue *q, struct request *rq, int where)
|
|
||||||
{
|
|
||||||
BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
|
|
||||||
|
|
||||||
if (rq->cmd_flags & REQ_SOFTBARRIER) {
|
|
||||||
/* barriers are scheduling boundary, update end_sector */
|
|
||||||
if (rq->cmd_type == REQ_TYPE_FS ||
|
|
||||||
(rq->cmd_flags & REQ_DISCARD)) {
|
|
||||||
q->end_sector = rq_end_sector(rq);
|
|
||||||
q->boundary_rq = rq;
|
|
||||||
}
|
|
||||||
} else if (!(rq->cmd_flags & REQ_ELVPRIV) &&
|
|
||||||
where == ELEVATOR_INSERT_SORT)
|
|
||||||
where = ELEVATOR_INSERT_BACK;
|
|
||||||
|
|
||||||
elv_insert(q, rq, where);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(__elv_add_request);
|
EXPORT_SYMBOL(__elv_add_request);
|
||||||
|
|
||||||
void elv_add_request(struct request_queue *q, struct request *rq, int where)
|
void elv_add_request(struct request_queue *q, struct request *rq, int where)
|
||||||
|
@ -71,6 +71,9 @@ static struct usb_device_id btusb_table[] = {
|
|||||||
/* Apple MacBookAir3,1, MacBookAir3,2 */
|
/* Apple MacBookAir3,1, MacBookAir3,2 */
|
||||||
{ USB_DEVICE(0x05ac, 0x821b) },
|
{ USB_DEVICE(0x05ac, 0x821b) },
|
||||||
|
|
||||||
|
/* Apple MacBookPro8,2 */
|
||||||
|
{ USB_DEVICE(0x05ac, 0x821a) },
|
||||||
|
|
||||||
/* AVM BlueFRITZ! USB v2.0 */
|
/* AVM BlueFRITZ! USB v2.0 */
|
||||||
{ USB_DEVICE(0x057c, 0x3800) },
|
{ USB_DEVICE(0x057c, 0x3800) },
|
||||||
|
|
||||||
@ -690,7 +693,8 @@ static int btusb_send_frame(struct sk_buff *skb)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HCI_ACLDATA_PKT:
|
case HCI_ACLDATA_PKT:
|
||||||
if (!data->bulk_tx_ep || hdev->conn_hash.acl_num < 1)
|
if (!data->bulk_tx_ep || (hdev->conn_hash.acl_num < 1 &&
|
||||||
|
hdev->conn_hash.le_num < 1))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
urb = usb_alloc_urb(0, GFP_ATOMIC);
|
urb = usb_alloc_urb(0, GFP_ATOMIC);
|
||||||
|
@ -1147,13 +1147,14 @@ static struct platform_driver mpc85xx_mc_err_driver = {
|
|||||||
static void __init mpc85xx_mc_clear_rfxe(void *data)
|
static void __init mpc85xx_mc_clear_rfxe(void *data)
|
||||||
{
|
{
|
||||||
orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1);
|
orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1);
|
||||||
mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~0x20000));
|
mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~HID1_RFXE));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int __init mpc85xx_mc_init(void)
|
static int __init mpc85xx_mc_init(void)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
u32 pvr = 0;
|
||||||
|
|
||||||
printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, "
|
printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, "
|
||||||
"(C) 2006 Montavista Software\n");
|
"(C) 2006 Montavista Software\n");
|
||||||
@ -1183,12 +1184,17 @@ static int __init mpc85xx_mc_init(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_FSL_SOC_BOOKE
|
#ifdef CONFIG_FSL_SOC_BOOKE
|
||||||
/*
|
pvr = mfspr(SPRN_PVR);
|
||||||
* need to clear HID1[RFXE] to disable machine check int
|
|
||||||
* so we can catch it
|
if ((PVR_VER(pvr) == PVR_VER_E500V1) ||
|
||||||
*/
|
(PVR_VER(pvr) == PVR_VER_E500V2)) {
|
||||||
if (edac_op_state == EDAC_OPSTATE_INT)
|
/*
|
||||||
on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0);
|
* need to clear HID1[RFXE] to disable machine check int
|
||||||
|
* so we can catch it
|
||||||
|
*/
|
||||||
|
if (edac_op_state == EDAC_OPSTATE_INT)
|
||||||
|
on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1206,7 +1212,12 @@ static void __exit mpc85xx_mc_restore_hid1(void *data)
|
|||||||
static void __exit mpc85xx_mc_exit(void)
|
static void __exit mpc85xx_mc_exit(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_FSL_SOC_BOOKE
|
#ifdef CONFIG_FSL_SOC_BOOKE
|
||||||
on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0);
|
u32 pvr = mfspr(SPRN_PVR);
|
||||||
|
|
||||||
|
if ((PVR_VER(pvr) == PVR_VER_E500V1) ||
|
||||||
|
(PVR_VER(pvr) == PVR_VER_E500V2)) {
|
||||||
|
on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
platform_driver_unregister(&mpc85xx_pci_err_driver);
|
platform_driver_unregister(&mpc85xx_pci_err_driver);
|
||||||
|
@ -1297,7 +1297,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
|
|||||||
/**
|
/**
|
||||||
* Search EDID for CEA extension block.
|
* Search EDID for CEA extension block.
|
||||||
*/
|
*/
|
||||||
static u8 *drm_find_cea_extension(struct edid *edid)
|
u8 *drm_find_cea_extension(struct edid *edid)
|
||||||
{
|
{
|
||||||
u8 *edid_ext = NULL;
|
u8 *edid_ext = NULL;
|
||||||
int i;
|
int i;
|
||||||
@ -1318,6 +1318,7 @@ static u8 *drm_find_cea_extension(struct edid *edid)
|
|||||||
|
|
||||||
return edid_ext;
|
return edid_ext;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(drm_find_cea_extension);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_detect_hdmi_monitor - detect whether monitor is hdmi.
|
* drm_detect_hdmi_monitor - detect whether monitor is hdmi.
|
||||||
|
@ -269,21 +269,6 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool intel_crt_ddc_probe(struct drm_i915_private *dev_priv, int ddc_bus)
|
|
||||||
{
|
|
||||||
u8 buf;
|
|
||||||
struct i2c_msg msgs[] = {
|
|
||||||
{
|
|
||||||
.addr = 0xA0,
|
|
||||||
.flags = 0,
|
|
||||||
.len = 1,
|
|
||||||
.buf = &buf,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
/* DDC monitor detect: Does it ACK a write to 0xA0? */
|
|
||||||
return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 1) == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool intel_crt_detect_ddc(struct drm_connector *connector)
|
static bool intel_crt_detect_ddc(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct intel_crt *crt = intel_attached_crt(connector);
|
struct intel_crt *crt = intel_attached_crt(connector);
|
||||||
@ -293,11 +278,6 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
|
|||||||
if (crt->base.type != INTEL_OUTPUT_ANALOG)
|
if (crt->base.type != INTEL_OUTPUT_ANALOG)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (intel_crt_ddc_probe(dev_priv, dev_priv->crt_ddc_pin)) {
|
|
||||||
DRM_DEBUG_KMS("CRT detected via DDC:0xa0\n");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) {
|
if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) {
|
||||||
struct edid *edid;
|
struct edid *edid;
|
||||||
bool is_digital = false;
|
bool is_digital = false;
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
ret__ = -ETIMEDOUT; \
|
ret__ = -ETIMEDOUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (W && !in_dbg_master()) msleep(W); \
|
if (W && !(in_atomic() || in_dbg_master())) msleep(W); \
|
||||||
} \
|
} \
|
||||||
ret__; \
|
ret__; \
|
||||||
})
|
})
|
||||||
|
@ -259,7 +259,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|||||||
if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
|
if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
|
||||||
goto timeout;
|
goto timeout;
|
||||||
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
||||||
return 0;
|
goto clear_err;
|
||||||
|
|
||||||
val = I915_READ(GMBUS3 + reg_offset);
|
val = I915_READ(GMBUS3 + reg_offset);
|
||||||
do {
|
do {
|
||||||
@ -287,7 +287,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|||||||
if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
|
if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
|
||||||
goto timeout;
|
goto timeout;
|
||||||
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
||||||
return 0;
|
goto clear_err;
|
||||||
|
|
||||||
val = loop = 0;
|
val = loop = 0;
|
||||||
do {
|
do {
|
||||||
@ -302,14 +302,31 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|||||||
if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50))
|
if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50))
|
||||||
goto timeout;
|
goto timeout;
|
||||||
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
|
||||||
return 0;
|
goto clear_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
return num;
|
goto done;
|
||||||
|
|
||||||
|
clear_err:
|
||||||
|
/* Toggle the Software Clear Interrupt bit. This has the effect
|
||||||
|
* of resetting the GMBUS controller and so clearing the
|
||||||
|
* BUS_ERROR raised by the slave's NAK.
|
||||||
|
*/
|
||||||
|
I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT);
|
||||||
|
I915_WRITE(GMBUS1 + reg_offset, 0);
|
||||||
|
|
||||||
|
done:
|
||||||
|
/* Mark the GMBUS interface as disabled. We will re-enable it at the
|
||||||
|
* start of the next xfer, till then let it sleep.
|
||||||
|
*/
|
||||||
|
I915_WRITE(GMBUS0 + reg_offset, 0);
|
||||||
|
return i;
|
||||||
|
|
||||||
timeout:
|
timeout:
|
||||||
DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n",
|
DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n",
|
||||||
bus->reg0 & 0xff, bus->adapter.name);
|
bus->reg0 & 0xff, bus->adapter.name);
|
||||||
|
I915_WRITE(GMBUS0 + reg_offset, 0);
|
||||||
|
|
||||||
/* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
|
/* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
|
||||||
bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff);
|
bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff);
|
||||||
if (!bus->force_bit)
|
if (!bus->force_bit)
|
||||||
|
@ -473,19 +473,13 @@ static enum drm_connector_status
|
|||||||
intel_lvds_detect(struct drm_connector *connector, bool force)
|
intel_lvds_detect(struct drm_connector *connector, bool force)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = connector->dev;
|
struct drm_device *dev = connector->dev;
|
||||||
enum drm_connector_status status = connector_status_connected;
|
enum drm_connector_status status;
|
||||||
|
|
||||||
status = intel_panel_detect(dev);
|
status = intel_panel_detect(dev);
|
||||||
if (status != connector_status_unknown)
|
if (status != connector_status_unknown)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
/* ACPI lid methods were generally unreliable in this generation, so
|
return connector_status_connected;
|
||||||
* don't even bother.
|
|
||||||
*/
|
|
||||||
if (IS_GEN2(dev) || IS_GEN3(dev))
|
|
||||||
return connector_status_connected;
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -835,25 +829,6 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool intel_lvds_ddc_probe(struct drm_device *dev, u8 pin)
|
|
||||||
{
|
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
||||||
u8 buf = 0;
|
|
||||||
struct i2c_msg msgs[] = {
|
|
||||||
{
|
|
||||||
.addr = 0xA0,
|
|
||||||
.flags = 0,
|
|
||||||
.len = 1,
|
|
||||||
.buf = &buf,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
struct i2c_adapter *i2c = &dev_priv->gmbus[pin].adapter;
|
|
||||||
/* XXX this only appears to work when using GMBUS */
|
|
||||||
if (intel_gmbus_is_forced_bit(i2c))
|
|
||||||
return true;
|
|
||||||
return i2c_transfer(i2c, msgs, 1) == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* intel_lvds_init - setup LVDS connectors on this device
|
* intel_lvds_init - setup LVDS connectors on this device
|
||||||
* @dev: drm device
|
* @dev: drm device
|
||||||
@ -894,11 +869,6 @@ bool intel_lvds_init(struct drm_device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!intel_lvds_ddc_probe(dev, pin)) {
|
|
||||||
DRM_DEBUG_KMS("LVDS did not respond to DDC probe\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL);
|
intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL);
|
||||||
if (!intel_lvds) {
|
if (!intel_lvds) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -97,7 +97,7 @@ nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
nvbo->bo.persistant_swap_storage = nvbo->gem->filp;
|
nvbo->bo.persistent_swap_storage = nvbo->gem->filp;
|
||||||
nvbo->gem->driver_private = nvbo;
|
nvbo->gem->driver_private = nvbo;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1009,6 +1009,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
|||||||
uint64_t fb_location;
|
uint64_t fb_location;
|
||||||
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
||||||
u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
|
u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
|
||||||
|
u32 tmp;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* no fb bound */
|
/* no fb bound */
|
||||||
@ -1137,6 +1138,15 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
|||||||
WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
|
WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
|
||||||
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
|
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
|
||||||
|
|
||||||
|
/* pageflip setup */
|
||||||
|
/* make sure flip is at vb rather than hb */
|
||||||
|
tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
|
||||||
|
tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
|
||||||
|
WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
|
||||||
|
|
||||||
|
/* set pageflip to happen anywhere in vblank interval */
|
||||||
|
WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
|
||||||
|
|
||||||
if (!atomic && fb && fb != crtc->fb) {
|
if (!atomic && fb && fb != crtc->fb) {
|
||||||
radeon_fb = to_radeon_framebuffer(fb);
|
radeon_fb = to_radeon_framebuffer(fb);
|
||||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||||
@ -1167,6 +1177,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
|||||||
uint64_t fb_location;
|
uint64_t fb_location;
|
||||||
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
|
||||||
u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
|
u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
|
||||||
|
u32 tmp;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* no fb bound */
|
/* no fb bound */
|
||||||
@ -1294,6 +1305,15 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
|||||||
WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
|
WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
|
||||||
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
|
(crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
|
||||||
|
|
||||||
|
/* pageflip setup */
|
||||||
|
/* make sure flip is at vb rather than hb */
|
||||||
|
tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
|
||||||
|
tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
|
||||||
|
WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
|
||||||
|
|
||||||
|
/* set pageflip to happen anywhere in vblank interval */
|
||||||
|
WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
|
||||||
|
|
||||||
if (!atomic && fb && fb != crtc->fb) {
|
if (!atomic && fb && fb != crtc->fb) {
|
||||||
radeon_fb = to_radeon_framebuffer(fb);
|
radeon_fb = to_radeon_framebuffer(fb);
|
||||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||||
|
@ -43,17 +43,6 @@ static void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
|
|||||||
|
|
||||||
void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)
|
void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)
|
||||||
{
|
{
|
||||||
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
|
|
||||||
u32 tmp;
|
|
||||||
|
|
||||||
/* make sure flip is at vb rather than hb */
|
|
||||||
tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
|
|
||||||
tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
|
|
||||||
WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
|
|
||||||
|
|
||||||
/* set pageflip to happen anywhere in vblank interval */
|
|
||||||
WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
|
|
||||||
|
|
||||||
/* enable the pflip int */
|
/* enable the pflip int */
|
||||||
radeon_irq_kms_pflip_irq_get(rdev, crtc);
|
radeon_irq_kms_pflip_irq_get(rdev, crtc);
|
||||||
}
|
}
|
||||||
|
@ -675,7 +675,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||||||
ATOM_ENCODER_CAP_RECORD *cap_record;
|
ATOM_ENCODER_CAP_RECORD *cap_record;
|
||||||
u16 caps = 0;
|
u16 caps = 0;
|
||||||
|
|
||||||
while (record->ucRecordType > 0 &&
|
while (record->ucRecordSize > 0 &&
|
||||||
|
record->ucRecordType > 0 &&
|
||||||
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||||
switch (record->ucRecordType) {
|
switch (record->ucRecordType) {
|
||||||
case ATOM_ENCODER_CAP_RECORD_TYPE:
|
case ATOM_ENCODER_CAP_RECORD_TYPE:
|
||||||
@ -720,7 +721,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (record->ucRecordType > 0 &&
|
while (record->ucRecordSize > 0 &&
|
||||||
|
record->ucRecordType > 0 &&
|
||||||
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||||
switch (record->ucRecordType) {
|
switch (record->ucRecordType) {
|
||||||
case ATOM_I2C_RECORD_TYPE:
|
case ATOM_I2C_RECORD_TYPE:
|
||||||
@ -782,10 +784,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||||||
ATOM_HPD_INT_RECORD *hpd_record;
|
ATOM_HPD_INT_RECORD *hpd_record;
|
||||||
ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
|
ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
|
||||||
|
|
||||||
while (record->ucRecordType > 0
|
while (record->ucRecordSize > 0 &&
|
||||||
&& record->
|
record->ucRecordType > 0 &&
|
||||||
ucRecordType <=
|
record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||||
ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
|
||||||
switch (record->ucRecordType) {
|
switch (record->ucRecordType) {
|
||||||
case ATOM_I2C_RECORD_TYPE:
|
case ATOM_I2C_RECORD_TYPE:
|
||||||
i2c_record =
|
i2c_record =
|
||||||
|
@ -2079,6 +2079,19 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||||
&hpd);
|
&hpd);
|
||||||
|
/* TV - TV DAC */
|
||||||
|
ddc_i2c.valid = false;
|
||||||
|
hpd.hpd = RADEON_HPD_NONE;
|
||||||
|
radeon_add_legacy_encoder(dev,
|
||||||
|
radeon_get_encoder_enum(dev,
|
||||||
|
ATOM_DEVICE_TV1_SUPPORT,
|
||||||
|
2),
|
||||||
|
ATOM_DEVICE_TV1_SUPPORT);
|
||||||
|
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
|
||||||
|
DRM_MODE_CONNECTOR_SVIDEO,
|
||||||
|
&ddc_i2c,
|
||||||
|
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||||
|
&hpd);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_INFO("Connector table: %d (invalid)\n",
|
DRM_INFO("Connector table: %d (invalid)\n",
|
||||||
|
@ -48,17 +48,6 @@ int rs600_mc_wait_for_idle(struct radeon_device *rdev);
|
|||||||
|
|
||||||
void rs600_pre_page_flip(struct radeon_device *rdev, int crtc)
|
void rs600_pre_page_flip(struct radeon_device *rdev, int crtc)
|
||||||
{
|
{
|
||||||
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
|
|
||||||
u32 tmp;
|
|
||||||
|
|
||||||
/* make sure flip is at vb rather than hb */
|
|
||||||
tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
|
|
||||||
tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
|
|
||||||
WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
|
|
||||||
|
|
||||||
/* set pageflip to happen anywhere in vblank interval */
|
|
||||||
WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
|
|
||||||
|
|
||||||
/* enable the pflip int */
|
/* enable the pflip int */
|
||||||
radeon_irq_kms_pflip_irq_get(rdev, crtc);
|
radeon_irq_kms_pflip_irq_get(rdev, crtc);
|
||||||
}
|
}
|
||||||
|
@ -1168,7 +1168,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
|
|||||||
uint32_t page_alignment,
|
uint32_t page_alignment,
|
||||||
unsigned long buffer_start,
|
unsigned long buffer_start,
|
||||||
bool interruptible,
|
bool interruptible,
|
||||||
struct file *persistant_swap_storage,
|
struct file *persistent_swap_storage,
|
||||||
size_t acc_size,
|
size_t acc_size,
|
||||||
void (*destroy) (struct ttm_buffer_object *))
|
void (*destroy) (struct ttm_buffer_object *))
|
||||||
{
|
{
|
||||||
@ -1211,7 +1211,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
|
|||||||
bo->priv_flags = 0;
|
bo->priv_flags = 0;
|
||||||
bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);
|
bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);
|
||||||
bo->seq_valid = false;
|
bo->seq_valid = false;
|
||||||
bo->persistant_swap_storage = persistant_swap_storage;
|
bo->persistent_swap_storage = persistent_swap_storage;
|
||||||
bo->acc_size = acc_size;
|
bo->acc_size = acc_size;
|
||||||
atomic_inc(&bo->glob->bo_count);
|
atomic_inc(&bo->glob->bo_count);
|
||||||
|
|
||||||
@ -1260,7 +1260,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
|
|||||||
uint32_t page_alignment,
|
uint32_t page_alignment,
|
||||||
unsigned long buffer_start,
|
unsigned long buffer_start,
|
||||||
bool interruptible,
|
bool interruptible,
|
||||||
struct file *persistant_swap_storage,
|
struct file *persistent_swap_storage,
|
||||||
struct ttm_buffer_object **p_bo)
|
struct ttm_buffer_object **p_bo)
|
||||||
{
|
{
|
||||||
struct ttm_buffer_object *bo;
|
struct ttm_buffer_object *bo;
|
||||||
@ -1282,7 +1282,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
|
|||||||
|
|
||||||
ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
|
ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
|
||||||
buffer_start, interruptible,
|
buffer_start, interruptible,
|
||||||
persistant_swap_storage, acc_size, NULL);
|
persistent_swap_storage, acc_size, NULL);
|
||||||
if (likely(ret == 0))
|
if (likely(ret == 0))
|
||||||
*p_bo = bo;
|
*p_bo = bo;
|
||||||
|
|
||||||
@ -1863,7 +1863,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
|
|||||||
if (bo->bdev->driver->swap_notify)
|
if (bo->bdev->driver->swap_notify)
|
||||||
bo->bdev->driver->swap_notify(bo);
|
bo->bdev->driver->swap_notify(bo);
|
||||||
|
|
||||||
ret = ttm_tt_swapout(bo->ttm, bo->persistant_swap_storage);
|
ret = ttm_tt_swapout(bo->ttm, bo->persistent_swap_storage);
|
||||||
out:
|
out:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -332,7 +332,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
|
|||||||
ttm_tt_free_page_directory(ttm);
|
ttm_tt_free_page_directory(ttm);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP) &&
|
if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) &&
|
||||||
ttm->swap_storage)
|
ttm->swap_storage)
|
||||||
fput(ttm->swap_storage);
|
fput(ttm->swap_storage);
|
||||||
|
|
||||||
@ -503,7 +503,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
|||||||
page_cache_release(from_page);
|
page_cache_release(from_page);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP))
|
if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP))
|
||||||
fput(swap_storage);
|
fput(swap_storage);
|
||||||
ttm->swap_storage = NULL;
|
ttm->swap_storage = NULL;
|
||||||
ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED;
|
ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED;
|
||||||
@ -514,7 +514,7 @@ out_err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
|
||||||
{
|
{
|
||||||
struct address_space *swap_space;
|
struct address_space *swap_space;
|
||||||
struct file *swap_storage;
|
struct file *swap_storage;
|
||||||
@ -540,7 +540,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!persistant_swap_storage) {
|
if (!persistent_swap_storage) {
|
||||||
swap_storage = shmem_file_setup("ttm swap",
|
swap_storage = shmem_file_setup("ttm swap",
|
||||||
ttm->num_pages << PAGE_SHIFT,
|
ttm->num_pages << PAGE_SHIFT,
|
||||||
0);
|
0);
|
||||||
@ -549,7 +549,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
|||||||
return PTR_ERR(swap_storage);
|
return PTR_ERR(swap_storage);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
swap_storage = persistant_swap_storage;
|
swap_storage = persistent_swap_storage;
|
||||||
|
|
||||||
swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
|
swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
|
||||||
|
|
||||||
@ -577,12 +577,12 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
|||||||
ttm_tt_free_alloced_pages(ttm);
|
ttm_tt_free_alloced_pages(ttm);
|
||||||
ttm->swap_storage = swap_storage;
|
ttm->swap_storage = swap_storage;
|
||||||
ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
|
ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
|
||||||
if (persistant_swap_storage)
|
if (persistent_swap_storage)
|
||||||
ttm->page_flags |= TTM_PAGE_FLAG_PERSISTANT_SWAP;
|
ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out_err:
|
out_err:
|
||||||
if (!persistant_swap_storage)
|
if (!persistent_swap_storage)
|
||||||
fput(swap_storage);
|
fput(swap_storage);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -154,4 +154,4 @@ module_exit(twl4030_madc_hwmon_exit);
|
|||||||
MODULE_DESCRIPTION("TWL4030 ADC Hwmon driver");
|
MODULE_DESCRIPTION("TWL4030 ADC Hwmon driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("J Keerthy");
|
MODULE_AUTHOR("J Keerthy");
|
||||||
MODULE_ALIAS("twl4030_madc_hwmon");
|
MODULE_ALIAS("platform:twl4030_madc_hwmon");
|
||||||
|
@ -430,6 +430,26 @@ static inline void ide_unlock_host(struct ide_host *host)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __ide_requeue_and_plug(struct request_queue *q, struct request *rq)
|
||||||
|
{
|
||||||
|
if (rq)
|
||||||
|
blk_requeue_request(q, rq);
|
||||||
|
if (rq || blk_peek_request(q)) {
|
||||||
|
/* Use 3ms as that was the old plug delay */
|
||||||
|
blk_delay_queue(q, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq)
|
||||||
|
{
|
||||||
|
struct request_queue *q = drive->queue;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(q->queue_lock, flags);
|
||||||
|
__ide_requeue_and_plug(q, rq);
|
||||||
|
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Issue a new request to a device.
|
* Issue a new request to a device.
|
||||||
*/
|
*/
|
||||||
@ -550,28 +570,7 @@ plug_device:
|
|||||||
ide_unlock_host(host);
|
ide_unlock_host(host);
|
||||||
plug_device_2:
|
plug_device_2:
|
||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
|
__ide_requeue_and_plug(q, rq);
|
||||||
if (rq) {
|
|
||||||
blk_requeue_request(q, rq);
|
|
||||||
blk_delay_queue(q, queue_run_ms);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq)
|
|
||||||
{
|
|
||||||
struct request_queue *q = drive->queue;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(q->queue_lock, flags);
|
|
||||||
|
|
||||||
if (rq)
|
|
||||||
blk_requeue_request(q, rq);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
|
||||||
|
|
||||||
/* Use 3ms as that was the old plug delay */
|
|
||||||
if (rq)
|
|
||||||
blk_delay_queue(q, 3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drive_is_ready(ide_drive_t *drive)
|
static int drive_is_ready(ide_drive_t *drive)
|
||||||
|
@ -69,7 +69,7 @@ static irqreturn_t spear_kbd_interrupt(int irq, void *dev_id)
|
|||||||
u8 sts, val;
|
u8 sts, val;
|
||||||
|
|
||||||
sts = readb(kbd->io_base + STATUS_REG);
|
sts = readb(kbd->io_base + STATUS_REG);
|
||||||
if (sts & DATA_AVAIL)
|
if (!(sts & DATA_AVAIL))
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
|
||||||
if (kbd->last_key != KEY_RESERVED) {
|
if (kbd->last_key != KEY_RESERVED) {
|
||||||
|
@ -302,10 +302,14 @@ static int uinput_validate_absbits(struct input_dev *dev)
|
|||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
for (cnt = 0; cnt < ABS_CNT; cnt++) {
|
for (cnt = 0; cnt < ABS_CNT; cnt++) {
|
||||||
|
int min, max;
|
||||||
if (!test_bit(cnt, dev->absbit))
|
if (!test_bit(cnt, dev->absbit))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (input_abs_get_max(dev, cnt) <= input_abs_get_min(dev, cnt)) {
|
min = input_abs_get_min(dev, cnt);
|
||||||
|
max = input_abs_get_max(dev, cnt);
|
||||||
|
|
||||||
|
if ((min != 0 || max != 0) && max <= min) {
|
||||||
printk(KERN_DEBUG
|
printk(KERN_DEBUG
|
||||||
"%s: invalid abs[%02x] min:%d max:%d\n",
|
"%s: invalid abs[%02x] min:%d max:%d\n",
|
||||||
UINPUT_NAME, cnt,
|
UINPUT_NAME, cnt,
|
||||||
|
@ -836,8 +836,8 @@ static const struct dmi_system_id __initconst toshiba_dmi_table[] = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
{ }
|
|
||||||
#endif
|
#endif
|
||||||
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool broken_olpc_ec;
|
static bool broken_olpc_ec;
|
||||||
@ -851,8 +851,8 @@ static const struct dmi_system_id __initconst olpc_dmi_table[] = {
|
|||||||
DMI_MATCH(DMI_PRODUCT_NAME, "XO"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "XO"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ }
|
|
||||||
#endif
|
#endif
|
||||||
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init synaptics_module_init(void)
|
void __init synaptics_module_init(void)
|
||||||
|
@ -869,15 +869,15 @@ static int i8042_controller_selftest(void)
|
|||||||
do {
|
do {
|
||||||
|
|
||||||
if (i8042_command(¶m, I8042_CMD_CTL_TEST)) {
|
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;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param == I8042_RET_CTL_TEST)
|
if (param == I8042_RET_CTL_TEST)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pr_err("i8042 controller selftest failed. (%#x != %#x)\n",
|
dbg("i8042 controller selftest: %#x != %#x\n",
|
||||||
param, I8042_RET_CTL_TEST);
|
param, I8042_RET_CTL_TEST);
|
||||||
msleep(50);
|
msleep(50);
|
||||||
} while (i++ < 5);
|
} while (i++ < 5);
|
||||||
|
|
||||||
@ -891,6 +891,7 @@ static int i8042_controller_selftest(void)
|
|||||||
pr_info("giving up on controller selftest, continuing anyway...\n");
|
pr_info("giving up on controller selftest, continuing anyway...\n");
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
|
pr_err("i8042 controller selftest failed\n");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user