Merge branch 'for_paulus' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc into for-2.6.21
This commit is contained in:
commit
d5112a4f31
392 changed files with 3176 additions and 2573 deletions
2
CREDITS
2
CREDITS
|
@ -3279,7 +3279,7 @@ S: Sevilla 41005
|
||||||
S: Spain
|
S: Spain
|
||||||
|
|
||||||
N: Linus Torvalds
|
N: Linus Torvalds
|
||||||
E: torvalds@osdl.org
|
E: torvalds@linux-foundation.org
|
||||||
D: Original kernel hacker
|
D: Original kernel hacker
|
||||||
S: 12725 SW Millikan Way, Suite 400
|
S: 12725 SW Millikan Way, Suite 400
|
||||||
S: Beaverton, Oregon 97005
|
S: Beaverton, Oregon 97005
|
||||||
|
|
|
@ -72,3 +72,7 @@ kernel patches.
|
||||||
|
|
||||||
If the new code is substantial, addition of subsystem-specific fault
|
If the new code is substantial, addition of subsystem-specific fault
|
||||||
injection might be appropriate.
|
injection might be appropriate.
|
||||||
|
|
||||||
|
22: Newly-added code has been compiled with `gcc -W'. This will generate
|
||||||
|
lots of noise, but is good for finding bugs like "warning: comparison
|
||||||
|
between signed and unsigned".
|
||||||
|
|
|
@ -134,9 +134,9 @@ Do not send more than 15 patches at once to the vger mailing lists!!!
|
||||||
|
|
||||||
|
|
||||||
Linus Torvalds is the final arbiter of all changes accepted into the
|
Linus Torvalds is the final arbiter of all changes accepted into the
|
||||||
Linux kernel. His e-mail address is <torvalds@osdl.org>. He gets
|
Linux kernel. His e-mail address is <torvalds@linux-foundation.org>.
|
||||||
a lot of e-mail, so typically you should do your best to -avoid- sending
|
He gets a lot of e-mail, so typically you should do your best to -avoid-
|
||||||
him e-mail.
|
sending him e-mail.
|
||||||
|
|
||||||
Patches which are bug fixes, are "obvious" changes, or similarly
|
Patches which are bug fixes, are "obvious" changes, or similarly
|
||||||
require little discussion should be sent or CC'd to Linus. Patches
|
require little discussion should be sent or CC'd to Linus. Patches
|
||||||
|
|
|
@ -318,3 +318,10 @@ Why: /proc/acpi/button has been replaced by events to the input layer
|
||||||
Who: Len Brown <len.brown@intel.com>
|
Who: Len Brown <len.brown@intel.com>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
What: JFFS (version 1)
|
||||||
|
When: 2.6.21
|
||||||
|
Why: Unmaintained for years, superceded by JFFS2 for years.
|
||||||
|
Who: Jeff Garzik <jeff@garzik.org>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
|
@ -73,8 +73,22 @@ OPTIONS
|
||||||
RESOURCES
|
RESOURCES
|
||||||
=========
|
=========
|
||||||
|
|
||||||
The Linux version of the 9p server is now maintained under the npfs project
|
Our current recommendation is to use Inferno (http://www.vitanuova.com/inferno)
|
||||||
on sourceforge (http://sourceforge.net/projects/npfs).
|
as the 9p server. You can start a 9p server under Inferno by issuing the
|
||||||
|
following command:
|
||||||
|
; styxlisten -A tcp!*!564 export '#U*'
|
||||||
|
|
||||||
|
The -A specifies an unauthenticated export. The 564 is the port # (you may
|
||||||
|
have to choose a higher port number if running as a normal user). The '#U*'
|
||||||
|
specifies exporting the root of the Linux name space. You may specify a
|
||||||
|
subset of the namespace by extending the path: '#U*'/tmp would just export
|
||||||
|
/tmp. For more information, see the Inferno manual pages covering styxlisten
|
||||||
|
and export.
|
||||||
|
|
||||||
|
A Linux version of the 9p server is now maintained under the npfs project
|
||||||
|
on sourceforge (http://sourceforge.net/projects/npfs). There is also a
|
||||||
|
more stable single-threaded version of the server (named spfs) available from
|
||||||
|
the same CVS repository.
|
||||||
|
|
||||||
There are user and developer mailing lists available through the v9fs project
|
There are user and developer mailing lists available through the v9fs project
|
||||||
on sourceforge (http://sourceforge.net/projects/v9fs).
|
on sourceforge (http://sourceforge.net/projects/v9fs).
|
||||||
|
@ -96,5 +110,5 @@ STATUS
|
||||||
|
|
||||||
The 2.6 kernel support is working on PPC and x86.
|
The 2.6 kernel support is working on PPC and x86.
|
||||||
|
|
||||||
PLEASE USE THE SOURCEFORGE BUG-TRACKER TO REPORT PROBLEMS.
|
PLEASE USE THE KERNEL BUGZILLA TO REPORT PROBLEMS. (http://bugzilla.kernel.org)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
H. Peter Anvin <hpa@zytor.com>
|
H. Peter Anvin <hpa@zytor.com>
|
||||||
Last update 2006-11-17
|
Last update 2007-01-26
|
||||||
|
|
||||||
On the i386 platform, the Linux kernel uses a rather complicated boot
|
On the i386 platform, the Linux kernel uses a rather complicated boot
|
||||||
convention. This has evolved partially due to historical aspects, as
|
convention. This has evolved partially due to historical aspects, as
|
||||||
|
@ -186,6 +186,7 @@ filled out, however:
|
||||||
7 GRuB
|
7 GRuB
|
||||||
8 U-BOOT
|
8 U-BOOT
|
||||||
9 Xen
|
9 Xen
|
||||||
|
A Gujin
|
||||||
|
|
||||||
Please contact <hpa@zytor.com> if you need a bootloader ID
|
Please contact <hpa@zytor.com> if you need a bootloader ID
|
||||||
value assigned.
|
value assigned.
|
||||||
|
|
|
@ -17,7 +17,7 @@ You can use common Linux commands, such as cp and scp, to copy the
|
||||||
memory image to a dump file on the local disk, or across the network to
|
memory image to a dump file on the local disk, or across the network to
|
||||||
a remote system.
|
a remote system.
|
||||||
|
|
||||||
Kdump and kexec are currently supported on the x86, x86_64, ppc64 and IA64
|
Kdump and kexec are currently supported on the x86, x86_64, ppc64 and ia64
|
||||||
architectures.
|
architectures.
|
||||||
|
|
||||||
When the system kernel boots, it reserves a small section of memory for
|
When the system kernel boots, it reserves a small section of memory for
|
||||||
|
@ -61,7 +61,12 @@ Install kexec-tools
|
||||||
|
|
||||||
2) Download the kexec-tools user-space package from the following URL:
|
2) Download the kexec-tools user-space package from the following URL:
|
||||||
|
|
||||||
http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/kexec-tools-testing-20061214.tar.gz
|
http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/kexec-tools-testing.tar.gz
|
||||||
|
|
||||||
|
This is a symlink to the latest version, which at the time of writing is
|
||||||
|
20061214, the only release of kexec-tools-testing so far. As other versions
|
||||||
|
are made released, the older onese will remain available at
|
||||||
|
http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/
|
||||||
|
|
||||||
Note: Latest kexec-tools-testing git tree is available at
|
Note: Latest kexec-tools-testing git tree is available at
|
||||||
|
|
||||||
|
@ -71,11 +76,11 @@ http://www.kernel.org/git/?p=linux/kernel/git/horms/kexec-tools-testing.git;a=su
|
||||||
|
|
||||||
3) Unpack the tarball with the tar command, as follows:
|
3) Unpack the tarball with the tar command, as follows:
|
||||||
|
|
||||||
tar xvpzf kexec-tools-testing-20061214.tar.gz
|
tar xvpzf kexec-tools-testing.tar.gz
|
||||||
|
|
||||||
4) Change to the kexec-tools-1.101 directory, as follows:
|
4) Change to the kexec-tools directory, as follows:
|
||||||
|
|
||||||
cd kexec-tools-testing-20061214
|
cd kexec-tools-testing-VERSION
|
||||||
|
|
||||||
5) Configure the package, as follows:
|
5) Configure the package, as follows:
|
||||||
|
|
||||||
|
@ -224,7 +229,23 @@ Dump-capture kernel config options (Arch Dependent, ppc64)
|
||||||
|
|
||||||
Dump-capture kernel config options (Arch Dependent, ia64)
|
Dump-capture kernel config options (Arch Dependent, ia64)
|
||||||
----------------------------------------------------------
|
----------------------------------------------------------
|
||||||
(To be filled)
|
|
||||||
|
- No specific options are required to create a dump-capture kernel
|
||||||
|
for ia64, other than those specified in the arch idependent section
|
||||||
|
above. This means that it is possible to use the system kernel
|
||||||
|
as a dump-capture kernel if desired.
|
||||||
|
|
||||||
|
The crashkernel region can be automatically placed by the system
|
||||||
|
kernel at run time. This is done by specifying the base address as 0,
|
||||||
|
or omitting it all together.
|
||||||
|
|
||||||
|
crashkernel=256M@0
|
||||||
|
or
|
||||||
|
crashkernel=256M
|
||||||
|
|
||||||
|
If the start address is specified, note that the start address of the
|
||||||
|
kernel will be aligned to 64Mb, so if the start address is not then
|
||||||
|
any space below the alignment point will be wasted.
|
||||||
|
|
||||||
|
|
||||||
Boot into System Kernel
|
Boot into System Kernel
|
||||||
|
@ -243,6 +264,10 @@ Boot into System Kernel
|
||||||
|
|
||||||
On ppc64, use "crashkernel=128M@32M".
|
On ppc64, use "crashkernel=128M@32M".
|
||||||
|
|
||||||
|
On ia64, 256M@256M is a generous value that typically works.
|
||||||
|
The region may be automatically placed on ia64, see the
|
||||||
|
dump-capture kernel config option notes above.
|
||||||
|
|
||||||
Load the Dump-capture Kernel
|
Load the Dump-capture Kernel
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
@ -261,7 +286,8 @@ For x86_64:
|
||||||
For ppc64:
|
For ppc64:
|
||||||
- Use vmlinux
|
- Use vmlinux
|
||||||
For ia64:
|
For ia64:
|
||||||
(To be filled)
|
- Use vmlinux or vmlinuz.gz
|
||||||
|
|
||||||
|
|
||||||
If you are using a uncompressed vmlinux image then use following command
|
If you are using a uncompressed vmlinux image then use following command
|
||||||
to load dump-capture kernel.
|
to load dump-capture kernel.
|
||||||
|
@ -277,18 +303,19 @@ to load dump-capture kernel.
|
||||||
--initrd=<initrd-for-dump-capture-kernel> \
|
--initrd=<initrd-for-dump-capture-kernel> \
|
||||||
--append="root=<root-dev> <arch-specific-options>"
|
--append="root=<root-dev> <arch-specific-options>"
|
||||||
|
|
||||||
|
Please note, that --args-linux does not need to be specified for ia64.
|
||||||
|
It is planned to make this a no-op on that architecture, but for now
|
||||||
|
it should be omitted
|
||||||
|
|
||||||
Following are the arch specific command line options to be used while
|
Following are the arch specific command line options to be used while
|
||||||
loading dump-capture kernel.
|
loading dump-capture kernel.
|
||||||
|
|
||||||
For i386 and x86_64:
|
For i386, x86_64 and ia64:
|
||||||
"init 1 irqpoll maxcpus=1"
|
"init 1 irqpoll maxcpus=1"
|
||||||
|
|
||||||
For ppc64:
|
For ppc64:
|
||||||
"init 1 maxcpus=1 noirqdistrib"
|
"init 1 maxcpus=1 noirqdistrib"
|
||||||
|
|
||||||
For IA64
|
|
||||||
(To be filled)
|
|
||||||
|
|
||||||
|
|
||||||
Notes on loading the dump-capture kernel:
|
Notes on loading the dump-capture kernel:
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
Linux Magic System Request Key Hacks
|
Linux Magic System Request Key Hacks
|
||||||
Documentation for sysrq.c version 1.15
|
Documentation for sysrq.c
|
||||||
Last update: $Date: 2001/01/28 10:15:59 $
|
Last update: 2007-JAN-06
|
||||||
|
|
||||||
* What is the magic SysRq key?
|
* What is the magic SysRq key?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -35,7 +35,7 @@ You can set the value in the file by the following command:
|
||||||
|
|
||||||
Note that the value of /proc/sys/kernel/sysrq influences only the invocation
|
Note that the value of /proc/sys/kernel/sysrq influences only the invocation
|
||||||
via a keyboard. Invocation of any operation via /proc/sysrq-trigger is always
|
via a keyboard. Invocation of any operation via /proc/sysrq-trigger is always
|
||||||
allowed.
|
allowed (by a user with admin privileges).
|
||||||
|
|
||||||
* How do I use the magic SysRq key?
|
* How do I use the magic SysRq key?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -58,7 +58,7 @@ On PowerPC - Press 'ALT - Print Screen (or F13) - <command key>,
|
||||||
On other - If you know of the key combos for other architectures, please
|
On other - If you know of the key combos for other architectures, please
|
||||||
let me know so I can add them to this section.
|
let me know so I can add them to this section.
|
||||||
|
|
||||||
On all - write a character to /proc/sysrq-trigger. eg:
|
On all - write a character to /proc/sysrq-trigger. e.g.:
|
||||||
|
|
||||||
echo t > /proc/sysrq-trigger
|
echo t > /proc/sysrq-trigger
|
||||||
|
|
||||||
|
@ -74,6 +74,8 @@ On all - write a character to /proc/sysrq-trigger. eg:
|
||||||
|
|
||||||
'c' - Will perform a kexec reboot in order to take a crashdump.
|
'c' - Will perform a kexec reboot in order to take a crashdump.
|
||||||
|
|
||||||
|
'd' - Shows all locks that are held.
|
||||||
|
|
||||||
'o' - Will shut your system off (if configured and supported).
|
'o' - Will shut your system off (if configured and supported).
|
||||||
|
|
||||||
's' - Will attempt to sync all mounted filesystems.
|
's' - Will attempt to sync all mounted filesystems.
|
||||||
|
@ -87,38 +89,43 @@ On all - write a character to /proc/sysrq-trigger. eg:
|
||||||
|
|
||||||
'm' - Will dump current memory info to your console.
|
'm' - Will dump current memory info to your console.
|
||||||
|
|
||||||
|
'n' - Used to make RT tasks nice-able
|
||||||
|
|
||||||
'v' - Dumps Voyager SMP processor info to your console.
|
'v' - Dumps Voyager SMP processor info to your console.
|
||||||
|
|
||||||
|
'w' - Dumps tasks that are in uninterruptable (blocked) state.
|
||||||
|
|
||||||
|
'x' - Used by xmon interface on ppc/powerpc platforms.
|
||||||
|
|
||||||
'0'-'9' - Sets the console log level, controlling which kernel messages
|
'0'-'9' - Sets the console log level, controlling which kernel messages
|
||||||
will be printed to your console. ('0', for example would make
|
will be printed to your console. ('0', for example would make
|
||||||
it so that only emergency messages like PANICs or OOPSes would
|
it so that only emergency messages like PANICs or OOPSes would
|
||||||
make it to your console.)
|
make it to your console.)
|
||||||
|
|
||||||
'f' - Will call oom_kill to kill a memory hog process
|
'f' - Will call oom_kill to kill a memory hog process.
|
||||||
|
|
||||||
'e' - Send a SIGTERM to all processes, except for init.
|
'e' - Send a SIGTERM to all processes, except for init.
|
||||||
|
|
||||||
|
'g' - Used by kgdb on ppc platforms.
|
||||||
|
|
||||||
'i' - Send a SIGKILL to all processes, except for init.
|
'i' - Send a SIGKILL to all processes, except for init.
|
||||||
|
|
||||||
'l' - Send a SIGKILL to all processes, INCLUDING init. (Your system
|
'h' - Will display help (actually any other key than those listed
|
||||||
will be non-functional after this.)
|
|
||||||
|
|
||||||
'h' - Will display help ( actually any other key than those listed
|
|
||||||
above will display help. but 'h' is easy to remember :-)
|
above will display help. but 'h' is easy to remember :-)
|
||||||
|
|
||||||
* Okay, so what can I use them for?
|
* Okay, so what can I use them for?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
Well, un'R'aw is very handy when your X server or a svgalib program crashes.
|
Well, un'R'aw is very handy when your X server or a svgalib program crashes.
|
||||||
|
|
||||||
sa'K' (Secure Access Key) is useful when you want to be sure there are no
|
sa'K' (Secure Access Key) is useful when you want to be sure there is no
|
||||||
trojan program is running at console and which could grab your password
|
trojan program running at console which could grab your password
|
||||||
when you would try to login. It will kill all programs on given console
|
when you would try to login. It will kill all programs on given console,
|
||||||
and thus letting you make sure that the login prompt you see is actually
|
thus letting you make sure that the login prompt you see is actually
|
||||||
the one from init, not some trojan program.
|
the one from init, not some trojan program.
|
||||||
IMPORTANT: In its true form it is not a true SAK like the one in a :IMPORTANT
|
IMPORTANT: In its true form it is not a true SAK like the one in a :IMPORTANT
|
||||||
IMPORTANT: c2 compliant system, and it should not be mistaken as :IMPORTANT
|
IMPORTANT: c2 compliant system, and it should not be mistaken as :IMPORTANT
|
||||||
IMPORTANT: such. :IMPORTANT
|
IMPORTANT: such. :IMPORTANT
|
||||||
It seems other find it useful as (System Attention Key) which is
|
It seems others find it useful as (System Attention Key) which is
|
||||||
useful when you want to exit a program that will not let you switch consoles.
|
useful when you want to exit a program that will not let you switch consoles.
|
||||||
(For example, X or a svgalib program.)
|
(For example, X or a svgalib program.)
|
||||||
|
|
||||||
|
@ -139,8 +146,8 @@ OK or Done message...)
|
||||||
Again, the unmount (remount read-only) hasn't taken place until you see the
|
Again, the unmount (remount read-only) hasn't taken place until you see the
|
||||||
"OK" and "Done" message appear on the screen.
|
"OK" and "Done" message appear on the screen.
|
||||||
|
|
||||||
The loglevel'0'-'9' is useful when your console is being flooded with
|
The loglevels '0'-'9' are useful when your console is being flooded with
|
||||||
kernel messages you do not want to see. Setting '0' will prevent all but
|
kernel messages you do not want to see. Selecting '0' will prevent all but
|
||||||
the most urgent kernel messages from reaching your console. (They will
|
the most urgent kernel messages from reaching your console. (They will
|
||||||
still be logged if syslogd/klogd are alive, though.)
|
still be logged if syslogd/klogd are alive, though.)
|
||||||
|
|
||||||
|
@ -152,7 +159,7 @@ processes.
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
That happens to me, also. I've found that tapping shift, alt, and control
|
That happens to me, also. I've found that tapping shift, alt, and control
|
||||||
on both sides of the keyboard, and hitting an invalid sysrq sequence again
|
on both sides of the keyboard, and hitting an invalid sysrq sequence again
|
||||||
will fix the problem. (ie, something like alt-sysrq-z). Switching to another
|
will fix the problem. (i.e., something like alt-sysrq-z). Switching to another
|
||||||
virtual console (ALT+Fn) and then back again should also help.
|
virtual console (ALT+Fn) and then back again should also help.
|
||||||
|
|
||||||
* I hit SysRq, but nothing seems to happen, what's wrong?
|
* I hit SysRq, but nothing seems to happen, what's wrong?
|
||||||
|
@ -174,11 +181,11 @@ handler function you will use, B) a help_msg string, that will print when SysRQ
|
||||||
prints help, and C) an action_msg string, that will print right before your
|
prints help, and C) an action_msg string, that will print right before your
|
||||||
handler is called. Your handler must conform to the prototype in 'sysrq.h'.
|
handler is called. Your handler must conform to the prototype in 'sysrq.h'.
|
||||||
|
|
||||||
After the sysrq_key_op is created, you can call the macro
|
After the sysrq_key_op is created, you can call the kernel function
|
||||||
register_sysrq_key(int key, struct sysrq_key_op *op_p) that is defined in
|
register_sysrq_key(int key, struct sysrq_key_op *op_p); this will
|
||||||
sysrq.h, this will register the operation pointed to by 'op_p' at table
|
register the operation pointed to by 'op_p' at table key 'key',
|
||||||
key 'key', if that slot in the table is blank. At module unload time, you must
|
if that slot in the table is blank. At module unload time, you must call
|
||||||
call the macro unregister_sysrq_key(int key, struct sysrq_key_op *op_p), which
|
the function unregister_sysrq_key(int key, struct sysrq_key_op *op_p), which
|
||||||
will remove the key op pointed to by 'op_p' from the key 'key', if and only if
|
will remove the key op pointed to by 'op_p' from the key 'key', if and only if
|
||||||
it is currently registered in that slot. This is in case the slot has been
|
it is currently registered in that slot. This is in case the slot has been
|
||||||
overwritten since you registered it.
|
overwritten since you registered it.
|
||||||
|
@ -186,15 +193,12 @@ overwritten since you registered it.
|
||||||
The Magic SysRQ system works by registering key operations against a key op
|
The Magic SysRQ system works by registering key operations against a key op
|
||||||
lookup table, which is defined in 'drivers/char/sysrq.c'. This key table has
|
lookup table, which is defined in 'drivers/char/sysrq.c'. This key table has
|
||||||
a number of operations registered into it at compile time, but is mutable,
|
a number of operations registered into it at compile time, but is mutable,
|
||||||
and 4 functions are exported for interface to it: __sysrq_lock_table,
|
and 2 functions are exported for interface to it:
|
||||||
__sysrq_unlock_table, __sysrq_get_key_op, and __sysrq_put_key_op. The
|
register_sysrq_key and unregister_sysrq_key.
|
||||||
functions __sysrq_swap_key_ops and __sysrq_swap_key_ops_nolock are defined
|
Of course, never ever leave an invalid pointer in the table. I.e., when
|
||||||
in the header itself, and the REGISTER and UNREGISTER macros are built from
|
your module that called register_sysrq_key() exits, it must call
|
||||||
these. More complex (and dangerous!) manipulations of the table are possible
|
unregister_sysrq_key() to clean up the sysrq key table entry that it used.
|
||||||
using these functions, but you must be careful to always lock the table before
|
Null pointers in the table are always safe. :)
|
||||||
you read or write from it, and to unlock it again when you are done. (And of
|
|
||||||
course, to never ever leave an invalid pointer in the table). Null pointers in
|
|
||||||
the table are always safe :)
|
|
||||||
|
|
||||||
If for some reason you feel the need to call the handle_sysrq function from
|
If for some reason you feel the need to call the handle_sysrq function from
|
||||||
within a function called by handle_sysrq, you must be aware that you are in
|
within a function called by handle_sysrq, you must be aware that you are in
|
||||||
|
|
|
@ -21,7 +21,7 @@ difficult to maintain, add yourself with a patch if desired.
|
||||||
Bill Ryder <bryder@sgi.com>
|
Bill Ryder <bryder@sgi.com>
|
||||||
Thomas Sailer <sailer@ife.ee.ethz.ch>
|
Thomas Sailer <sailer@ife.ee.ethz.ch>
|
||||||
Gregory P. Smith <greg@electricrain.com>
|
Gregory P. Smith <greg@electricrain.com>
|
||||||
Linus Torvalds <torvalds@osdl.org>
|
Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
Roman Weissgaerber <weissg@vienna.at>
|
Roman Weissgaerber <weissg@vienna.at>
|
||||||
<Kazuki.Yasumatsu@fujixerox.co.jp>
|
<Kazuki.Yasumatsu@fujixerox.co.jp>
|
||||||
|
|
||||||
|
|
48
MAINTAINERS
48
MAINTAINERS
|
@ -598,8 +598,6 @@ W: http://linux-atm.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ATMEL MACB ETHERNET DRIVER
|
ATMEL MACB ETHERNET DRIVER
|
||||||
P: Atmel AVR32 Support Team
|
|
||||||
M: avr32@atmel.com
|
|
||||||
P: Haavard Skinnemoen
|
P: Haavard Skinnemoen
|
||||||
M: hskinnemoen@atmel.com
|
M: hskinnemoen@atmel.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -620,8 +618,6 @@ T: git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
AVR32 ARCHITECTURE
|
AVR32 ARCHITECTURE
|
||||||
P: Atmel AVR32 Support Team
|
|
||||||
M: avr32@atmel.com
|
|
||||||
P: Haavard Skinnemoen
|
P: Haavard Skinnemoen
|
||||||
M: hskinnemoen@atmel.com
|
M: hskinnemoen@atmel.com
|
||||||
W: http://www.atmel.com/products/AVR32/
|
W: http://www.atmel.com/products/AVR32/
|
||||||
|
@ -630,8 +626,6 @@ W: http://avrfreaks.net/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
AVR32/AT32AP MACHINE SUPPORT
|
AVR32/AT32AP MACHINE SUPPORT
|
||||||
P: Atmel AVR32 Support Team
|
|
||||||
M: avr32@atmel.com
|
|
||||||
P: Haavard Skinnemoen
|
P: Haavard Skinnemoen
|
||||||
M: hskinnemoen@atmel.com
|
M: hskinnemoen@atmel.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -1137,9 +1131,9 @@ T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
DSCC4 DRIVER
|
DSCC4 DRIVER
|
||||||
P: François Romieu
|
P: Francois Romieu
|
||||||
M: romieu@cogenit.fr
|
M: romieu@fr.zoreil.com
|
||||||
M: romieu@ensta.fr
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
DVB SUBSYSTEM AND DRIVERS
|
DVB SUBSYSTEM AND DRIVERS
|
||||||
|
@ -1254,7 +1248,7 @@ S: Maintained
|
||||||
|
|
||||||
ETHERNET BRIDGE
|
ETHERNET BRIDGE
|
||||||
P: Stephen Hemminger
|
P: Stephen Hemminger
|
||||||
M: shemminger@osdl.org
|
M: shemminger@linux-foundation.org
|
||||||
L: bridge@osdl.org
|
L: bridge@osdl.org
|
||||||
W: http://bridge.sourceforge.net/
|
W: http://bridge.sourceforge.net/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -1598,12 +1592,11 @@ M: ipslinux@adaptec.com
|
||||||
W: http://www.developer.ibm.com/welcome/netfinity/serveraid.html
|
W: http://www.developer.ibm.com/welcome/netfinity/serveraid.html
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
IDE DRIVER [GENERAL]
|
IDE SUBSYSTEM
|
||||||
P: Bartlomiej Zolnierkiewicz
|
P: Bartlomiej Zolnierkiewicz
|
||||||
M: B.Zolnierkiewicz@elka.pw.edu.pl
|
M: bzolnier@gmail.com
|
||||||
L: linux-kernel@vger.kernel.org
|
|
||||||
L: linux-ide@vger.kernel.org
|
L: linux-ide@vger.kernel.org
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git
|
T: quilt kernel.org/pub/linux/kernel/people/bart/pata-2.6/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
IDE/ATAPI CDROM DRIVER
|
IDE/ATAPI CDROM DRIVER
|
||||||
|
@ -1928,11 +1921,10 @@ S: Maintained
|
||||||
|
|
||||||
KERNEL NFSD
|
KERNEL NFSD
|
||||||
P: Neil Brown
|
P: Neil Brown
|
||||||
M: neilb@cse.unsw.edu.au
|
M: neilb@suse.de
|
||||||
L: nfs@lists.sourceforge.net
|
L: nfs@lists.sourceforge.net
|
||||||
W: http://nfs.sourceforge.net/
|
W: http://nfs.sourceforge.net/
|
||||||
W: http://www.cse.unsw.edu.au/~neilb/patches/linux-devel/
|
S: Supported
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE (KVM)
|
KERNEL VIRTUAL MACHINE (KVM)
|
||||||
P: Avi Kivity
|
P: Avi Kivity
|
||||||
|
@ -2277,7 +2269,7 @@ S: Maintained
|
||||||
|
|
||||||
NETEM NETWORK EMULATOR
|
NETEM NETWORK EMULATOR
|
||||||
P: Stephen Hemminger
|
P: Stephen Hemminger
|
||||||
M: shemminger@osdl.org
|
M: shemminger@linux-foundation.org
|
||||||
L: netem@osdl.org
|
L: netem@osdl.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -2290,7 +2282,7 @@ P: Jozsef Kadlecsik
|
||||||
P: Patrick McHardy
|
P: Patrick McHardy
|
||||||
M: kaber@trash.net
|
M: kaber@trash.net
|
||||||
L: netfilter-devel@lists.netfilter.org
|
L: netfilter-devel@lists.netfilter.org
|
||||||
L: netfilter@lists.netfilter.org
|
L: netfilter@lists.netfilter.org (subscribers-only)
|
||||||
L: coreteam@netfilter.org
|
L: coreteam@netfilter.org
|
||||||
W: http://www.netfilter.org/
|
W: http://www.netfilter.org/
|
||||||
W: http://www.iptables.org/
|
W: http://www.iptables.org/
|
||||||
|
@ -2993,9 +2985,9 @@ SOFTWARE RAID (Multiple Disks) SUPPORT
|
||||||
P: Ingo Molnar
|
P: Ingo Molnar
|
||||||
M: mingo@redhat.com
|
M: mingo@redhat.com
|
||||||
P: Neil Brown
|
P: Neil Brown
|
||||||
M: neilb@cse.unsw.edu.au
|
M: neilb@suse.de
|
||||||
L: linux-raid@vger.kernel.org
|
L: linux-raid@vger.kernel.org
|
||||||
S: Maintained
|
S: Supported
|
||||||
|
|
||||||
SOFTWARE SUSPEND:
|
SOFTWARE SUSPEND:
|
||||||
P: Pavel Machek
|
P: Pavel Machek
|
||||||
|
@ -3081,7 +3073,7 @@ S: Maintained
|
||||||
|
|
||||||
SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
|
SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
|
||||||
P: Stephen Hemminger
|
P: Stephen Hemminger
|
||||||
M: shemminger@osdl.org
|
M: shemminger@linux-foundation.org
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -3575,6 +3567,12 @@ M: khali@linux-fr.org
|
||||||
L: i2c@lm-sensors.org
|
L: i2c@lm-sensors.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
VIA VELOCITY NETWORK DRIVER
|
||||||
|
P: Francois Romieu
|
||||||
|
M: romieu@fr.zoreil.com
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
UCLINUX (AND M68KNOMMU)
|
UCLINUX (AND M68KNOMMU)
|
||||||
P: Greg Ungerer
|
P: Greg Ungerer
|
||||||
M: gerg@uclinux.org
|
M: gerg@uclinux.org
|
||||||
|
@ -3595,6 +3593,12 @@ M: ysato@users.sourceforge.jp
|
||||||
W: http://uclinux-h8.sourceforge.jp/
|
W: http://uclinux-h8.sourceforge.jp/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
UFS FILESYSTEM
|
||||||
|
P: Evgeniy Dushistov
|
||||||
|
M: dushistov@mail.ru
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
USB DIAMOND RIO500 DRIVER
|
USB DIAMOND RIO500 DRIVER
|
||||||
P: Cesar Miquel
|
P: Cesar Miquel
|
||||||
M: miquel@df.uba.ar
|
M: miquel@df.uba.ar
|
||||||
|
|
8
Makefile
8
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 20
|
SUBLEVEL = 20
|
||||||
EXTRAVERSION =-rc5
|
EXTRAVERSION =
|
||||||
NAME = Homicidal Dwarf Hamster
|
NAME = Homicidal Dwarf Hamster
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -1116,15 +1116,15 @@ help:
|
||||||
@echo ' cscope - Generate cscope index'
|
@echo ' cscope - Generate cscope index'
|
||||||
@echo ' kernelrelease - Output the release version string'
|
@echo ' kernelrelease - Output the release version string'
|
||||||
@echo ' kernelversion - Output the version stored in Makefile'
|
@echo ' kernelversion - Output the version stored in Makefile'
|
||||||
@if [ -r include/asm-$(ARCH)/Kbuild ]; then \
|
@if [ -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
|
||||||
echo ' headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
|
echo ' headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
|
||||||
|
echo ' (default: $(INSTALL_HDR_PATH))'; \
|
||||||
fi
|
fi
|
||||||
@echo ' (default: $(INSTALL_HDR_PATH))'
|
|
||||||
@echo ''
|
@echo ''
|
||||||
@echo 'Static analysers'
|
@echo 'Static analysers'
|
||||||
@echo ' checkstack - Generate a list of stack hogs'
|
@echo ' checkstack - Generate a list of stack hogs'
|
||||||
@echo ' namespacecheck - Name space analysis on compiled kernel'
|
@echo ' namespacecheck - Name space analysis on compiled kernel'
|
||||||
@if [ -r include/asm-$(ARCH)/Kbuild ]; then \
|
@if [ -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
|
||||||
echo ' headers_check - Sanity check on exported headers'; \
|
echo ' headers_check - Sanity check on exported headers'; \
|
||||||
fi
|
fi
|
||||||
@echo ''
|
@echo ''
|
||||||
|
|
4
README
4
README
|
@ -278,8 +278,8 @@ IF SOMETHING GOES WRONG:
|
||||||
the file MAINTAINERS to see if there is a particular person associated
|
the file MAINTAINERS to see if there is a particular person associated
|
||||||
with the part of the kernel that you are having trouble with. If there
|
with the part of the kernel that you are having trouble with. If there
|
||||||
isn't anyone listed there, then the second best thing is to mail
|
isn't anyone listed there, then the second best thing is to mail
|
||||||
them to me (torvalds@osdl.org), and possibly to any other relevant
|
them to me (torvalds@linux-foundation.org), and possibly to any other
|
||||||
mailing-list or to the newsgroup.
|
relevant mailing-list or to the newsgroup.
|
||||||
|
|
||||||
- In all bug-reports, *please* tell what kernel you are talking about,
|
- In all bug-reports, *please* tell what kernel you are talking about,
|
||||||
how to duplicate the problem, and what your setup is (use your common
|
how to duplicate the problem, and what your setup is (use your common
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
* Power off function, if any
|
* Power off function, if any
|
||||||
*/
|
*/
|
||||||
void (*pm_power_off)(void) = machine_power_off;
|
void (*pm_power_off)(void) = machine_power_off;
|
||||||
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
void
|
void
|
||||||
cpu_idle(void)
|
cpu_idle(void)
|
||||||
|
|
|
@ -923,7 +923,6 @@ CONFIG_FORCED_INLINING=y
|
||||||
# CONFIG_HEADERS_CHECK is not set
|
# CONFIG_HEADERS_CHECK is not set
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
CONFIG_DEBUG_USER=y
|
CONFIG_DEBUG_USER=y
|
||||||
# CONFIG_DEBUG_WAITQ is not set
|
|
||||||
# CONFIG_DEBUG_ERRORS is not set
|
# CONFIG_DEBUG_ERRORS is not set
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_DEBUG_LL=y
|
||||||
# CONFIG_DEBUG_ICEDCC is not set
|
# CONFIG_DEBUG_ICEDCC is not set
|
||||||
|
|
|
@ -1079,7 +1079,6 @@ CONFIG_FORCED_INLINING=y
|
||||||
# CONFIG_HEADERS_CHECK is not set
|
# CONFIG_HEADERS_CHECK is not set
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
CONFIG_DEBUG_USER=y
|
CONFIG_DEBUG_USER=y
|
||||||
# CONFIG_DEBUG_WAITQ is not set
|
|
||||||
# CONFIG_DEBUG_ERRORS is not set
|
# CONFIG_DEBUG_ERRORS is not set
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_DEBUG_LL=y
|
||||||
# CONFIG_DEBUG_ICEDCC is not set
|
# CONFIG_DEBUG_ICEDCC is not set
|
||||||
|
|
|
@ -22,6 +22,10 @@
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
|
#if (PHYS_OFFSET & 0x001fffff)
|
||||||
|
#error "PHYS_OFFSET must be at an even 2MiB boundary!"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET)
|
#define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET)
|
||||||
#define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)
|
#define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)
|
||||||
|
|
||||||
|
@ -251,7 +255,8 @@ __create_page_tables:
|
||||||
* Then map first 1MB of ram in case it contains our boot params.
|
* Then map first 1MB of ram in case it contains our boot params.
|
||||||
*/
|
*/
|
||||||
add r0, r4, #PAGE_OFFSET >> 18
|
add r0, r4, #PAGE_OFFSET >> 18
|
||||||
orr r6, r7, #PHYS_OFFSET
|
orr r6, r7, #(PHYS_OFFSET & 0xff000000)
|
||||||
|
orr r6, r6, #(PHYS_OFFSET & 0x00e00000)
|
||||||
str r6, [r0]
|
str r6, [r0]
|
||||||
|
|
||||||
#ifdef CONFIG_XIP_KERNEL
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/arch/at91sam9260.h>
|
#include <asm/arch/at91sam9260.h>
|
||||||
#include <asm/arch/at91_pmc.h>
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/at91_rstc.h>
|
||||||
|
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
@ -212,7 +213,7 @@ static struct at91_gpio_bank at91sam9260_gpio[] = {
|
||||||
|
|
||||||
static void at91sam9260_reset(void)
|
static void at91sam9260_reset(void)
|
||||||
{
|
{
|
||||||
#warning "Implement CPU reset"
|
at91_sys_write(AT91_RSTC_CR, (0xA5 << 24) | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/arch/at91sam9261.h>
|
#include <asm/arch/at91sam9261.h>
|
||||||
#include <asm/arch/at91_pmc.h>
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/at91_rstc.h>
|
||||||
|
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
@ -207,7 +208,7 @@ static struct at91_gpio_bank at91sam9261_gpio[] = {
|
||||||
|
|
||||||
static void at91sam9261_reset(void)
|
static void at91sam9261_reset(void)
|
||||||
{
|
{
|
||||||
#warning "Implement CPU reset"
|
at91_sys_write(AT91_RSTC_CR, (0xA5 << 24) | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
#include <asm/arch/at91_pio.h>
|
#include <asm/arch/at91_pio.h>
|
||||||
#include <asm/arch/at91_pmc.h>
|
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
|
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
|
@ -224,17 +223,17 @@ static u32 backups[MAX_GPIO_BANKS];
|
||||||
static int gpio_irq_set_wake(unsigned pin, unsigned state)
|
static int gpio_irq_set_wake(unsigned pin, unsigned state)
|
||||||
{
|
{
|
||||||
unsigned mask = pin_to_mask(pin);
|
unsigned mask = pin_to_mask(pin);
|
||||||
|
unsigned bank = (pin - PIN_BASE) / 32;
|
||||||
|
|
||||||
pin -= PIN_BASE;
|
if (unlikely(bank >= MAX_GPIO_BANKS))
|
||||||
pin /= 32;
|
|
||||||
|
|
||||||
if (unlikely(pin >= MAX_GPIO_BANKS))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (state)
|
if (state)
|
||||||
wakeups[pin] |= mask;
|
wakeups[bank] |= mask;
|
||||||
else
|
else
|
||||||
wakeups[pin] &= ~mask;
|
wakeups[bank] &= ~mask;
|
||||||
|
|
||||||
|
set_irq_wake(gpio[bank].id, state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -246,29 +245,15 @@ void at91_gpio_suspend(void)
|
||||||
for (i = 0; i < gpio_banks; i++) {
|
for (i = 0; i < gpio_banks; i++) {
|
||||||
u32 pio = gpio[i].offset;
|
u32 pio = gpio[i].offset;
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: drivers should have disabled GPIO interrupts that
|
|
||||||
* aren't supposed to be wakeup sources.
|
|
||||||
* But that is not much good on ARM..... disable_irq() does
|
|
||||||
* not update the hardware immediately, so the hardware mask
|
|
||||||
* (IMR) has the wrong value (not current, too much is
|
|
||||||
* permitted).
|
|
||||||
*
|
|
||||||
* Our workaround is to disable all non-wakeup IRQs ...
|
|
||||||
* which is exactly what correct drivers asked for in the
|
|
||||||
* first place!
|
|
||||||
*/
|
|
||||||
backups[i] = at91_sys_read(pio + PIO_IMR);
|
backups[i] = at91_sys_read(pio + PIO_IMR);
|
||||||
at91_sys_write(pio + PIO_IDR, backups[i]);
|
at91_sys_write(pio + PIO_IDR, backups[i]);
|
||||||
at91_sys_write(pio + PIO_IER, wakeups[i]);
|
at91_sys_write(pio + PIO_IER, wakeups[i]);
|
||||||
|
|
||||||
if (!wakeups[i]) {
|
if (!wakeups[i])
|
||||||
disable_irq_wake(gpio[i].id);
|
clk_disable(gpio[i].clock);
|
||||||
at91_sys_write(AT91_PMC_PCDR, 1 << gpio[i].id);
|
else {
|
||||||
} else {
|
|
||||||
enable_irq_wake(gpio[i].id);
|
|
||||||
#ifdef CONFIG_PM_DEBUG
|
#ifdef CONFIG_PM_DEBUG
|
||||||
printk(KERN_DEBUG "GPIO-%c may wake for %08x\n", "ABCD"[i], wakeups[i]);
|
printk(KERN_DEBUG "GPIO-%c may wake for %08x\n", 'A'+i, wakeups[i]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,9 +266,11 @@ void at91_gpio_resume(void)
|
||||||
for (i = 0; i < gpio_banks; i++) {
|
for (i = 0; i < gpio_banks; i++) {
|
||||||
u32 pio = gpio[i].offset;
|
u32 pio = gpio[i].offset;
|
||||||
|
|
||||||
|
if (!wakeups[i])
|
||||||
|
clk_enable(gpio[i].clock);
|
||||||
|
|
||||||
at91_sys_write(pio + PIO_IDR, wakeups[i]);
|
at91_sys_write(pio + PIO_IDR, wakeups[i]);
|
||||||
at91_sys_write(pio + PIO_IER, backups[i]);
|
at91_sys_write(pio + PIO_IER, backups[i]);
|
||||||
at91_sys_write(AT91_PMC_PCER, 1 << gpio[i].id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,6 +184,17 @@ static int imx_set_target(struct cpufreq_policy *policy,
|
||||||
long sysclk;
|
long sysclk;
|
||||||
unsigned int bclk_div = 1;
|
unsigned int bclk_div = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some governors do not respects CPU and policy lower limits
|
||||||
|
* which leads to bad things (division by zero etc), ensure
|
||||||
|
* that such things do not happen.
|
||||||
|
*/
|
||||||
|
if(target_freq < policy->cpuinfo.min_freq)
|
||||||
|
target_freq = policy->cpuinfo.min_freq;
|
||||||
|
|
||||||
|
if(target_freq < policy->min)
|
||||||
|
target_freq = policy->min;
|
||||||
|
|
||||||
freq = target_freq * 1000;
|
freq = target_freq * 1000;
|
||||||
|
|
||||||
pr_debug(KERN_DEBUG "imx: requested frequency %ld Hz, mpctl0 at boot 0x%08x\n",
|
pr_debug(KERN_DEBUG "imx: requested frequency %ld Hz, mpctl0 at boot 0x%08x\n",
|
||||||
|
@ -258,7 +269,8 @@ static int __init imx_cpufreq_driver_init(struct cpufreq_policy *policy)
|
||||||
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||||
policy->cpuinfo.min_freq = 8000;
|
policy->cpuinfo.min_freq = 8000;
|
||||||
policy->cpuinfo.max_freq = 200000;
|
policy->cpuinfo.max_freq = 200000;
|
||||||
policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
|
/* Manual states, that PLL stabilizes in two CLK32 periods */
|
||||||
|
policy->cpuinfo.transition_latency = 4 * 1000000000LL / CLK32;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
|
||||||
case S3C2410_GPIO_SFN2:
|
case S3C2410_GPIO_SFN2:
|
||||||
case S3C2410_GPIO_SFN3:
|
case S3C2410_GPIO_SFN3:
|
||||||
if (pin < S3C2410_GPIO_BANKB) {
|
if (pin < S3C2410_GPIO_BANKB) {
|
||||||
|
function -= 1;
|
||||||
function &= 1;
|
function &= 1;
|
||||||
function <<= S3C2410_GPIO_OFFSET(pin);
|
function <<= S3C2410_GPIO_OFFSET(pin);
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,15 +84,18 @@ EXPORT_SYMBOL(s3c2410_gpio_cfgpin);
|
||||||
unsigned int s3c2410_gpio_getcfg(unsigned int pin)
|
unsigned int s3c2410_gpio_getcfg(unsigned int pin)
|
||||||
{
|
{
|
||||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||||
unsigned long mask;
|
unsigned long val = __raw_readl(base);
|
||||||
|
|
||||||
if (pin < S3C2410_GPIO_BANKB) {
|
if (pin < S3C2410_GPIO_BANKB) {
|
||||||
mask = 1 << S3C2410_GPIO_OFFSET(pin);
|
val >>= S3C2410_GPIO_OFFSET(pin);
|
||||||
|
val &= 1;
|
||||||
|
val += 1;
|
||||||
} else {
|
} else {
|
||||||
mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;
|
val >>= S3C2410_GPIO_OFFSET(pin)*2;
|
||||||
|
val &= 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
return __raw_readl(base) & mask;
|
return val | S3C2410_GPIO_INPUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(s3c2410_gpio_getcfg);
|
EXPORT_SYMBOL(s3c2410_gpio_getcfg);
|
||||||
|
|
|
@ -451,15 +451,14 @@ static void s3c2410_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs)
|
||||||
irqstate = s3c_irqwake_eintmask & (1L<<irqoffs);
|
irqstate = s3c_irqwake_eintmask & (1L<<irqoffs);
|
||||||
|
|
||||||
pinstate = s3c2410_gpio_getcfg(pin);
|
pinstate = s3c2410_gpio_getcfg(pin);
|
||||||
pinstate >>= S3C2410_GPIO_OFFSET(pin)*2;
|
|
||||||
|
|
||||||
if (!irqstate) {
|
if (!irqstate) {
|
||||||
if (pinstate == 0x02)
|
if (pinstate == S3C2410_GPIO_IRQ)
|
||||||
DBG("Leaving IRQ %d (pin %d) enabled\n", irq, pin);
|
DBG("Leaving IRQ %d (pin %d) enabled\n", irq, pin);
|
||||||
} else {
|
} else {
|
||||||
if (pinstate == 0x02) {
|
if (pinstate == S3C2410_GPIO_IRQ) {
|
||||||
DBG("Disabling IRQ %d (pin %d)\n", irq, pin);
|
DBG("Disabling IRQ %d (pin %d)\n", irq, pin);
|
||||||
s3c2410_gpio_cfgpin(pin, 0x00);
|
s3c2410_gpio_cfgpin(pin, S3C2410_GPIO_INPUT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,8 +133,8 @@ static struct s3c24xx_dma_map __initdata s3c2412_dma_mappings[] = {
|
||||||
static void s3c2412_dma_select(struct s3c2410_dma_chan *chan,
|
static void s3c2412_dma_select(struct s3c2410_dma_chan *chan,
|
||||||
struct s3c24xx_dma_map *map)
|
struct s3c24xx_dma_map *map)
|
||||||
{
|
{
|
||||||
writel(chan->regs + S3C2412_DMA_DMAREQSEL,
|
writel(map->channels[0] | S3C2412_DMAREQSEL_HW,
|
||||||
map->channels[0] | S3C2412_DMAREQSEL_HW);
|
chan->regs + S3C2412_DMA_DMAREQSEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = {
|
static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = {
|
||||||
|
|
|
@ -52,15 +52,18 @@ void show_mem(void)
|
||||||
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||||
|
|
||||||
for_each_online_node(node) {
|
for_each_online_node(node) {
|
||||||
|
pg_data_t *n = NODE_DATA(node);
|
||||||
|
struct page *map = n->node_mem_map - n->node_start_pfn;
|
||||||
|
|
||||||
for_each_nodebank (i,mi,node) {
|
for_each_nodebank (i,mi,node) {
|
||||||
unsigned int pfn1, pfn2;
|
unsigned int pfn1, pfn2;
|
||||||
struct page *page, *end;
|
struct page *page, *end;
|
||||||
|
|
||||||
pfn1 = mi->bank[i].start >> PAGE_SHIFT;
|
pfn1 = __phys_to_pfn(mi->bank[i].start);
|
||||||
pfn2 = (mi->bank[i].size + mi->bank[i].start) >> PAGE_SHIFT;
|
pfn2 = __phys_to_pfn(mi->bank[i].size + mi->bank[i].start);
|
||||||
|
|
||||||
page = NODE_MEM_MAP(node) + pfn1;
|
page = map + pfn1;
|
||||||
end = NODE_MEM_MAP(node) + pfn2;
|
end = map + pfn2;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
total++;
|
total++;
|
||||||
|
|
|
@ -300,7 +300,8 @@ __ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
|
||||||
addr = (unsigned long)area->addr;
|
addr = (unsigned long)area->addr;
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
if ((((cpu_architecture() >= CPU_ARCH_ARMv6) && (get_cr() & CR_XP)) ||
|
if (DOMAIN_IO == 0 &&
|
||||||
|
(((cpu_architecture() >= CPU_ARCH_ARMv6) && (get_cr() & CR_XP)) ||
|
||||||
cpu_is_xsc3()) &&
|
cpu_is_xsc3()) &&
|
||||||
!((__pfn_to_phys(pfn) | size | addr) & ~SUPERSECTION_MASK)) {
|
!((__pfn_to_phys(pfn) | size | addr) & ~SUPERSECTION_MASK)) {
|
||||||
area->flags |= VM_ARM_SECTION_MAPPING;
|
area->flags |= VM_ARM_SECTION_MAPPING;
|
||||||
|
|
|
@ -708,7 +708,7 @@ __8032x_proc_info:
|
||||||
.type __8033x_proc_info,#object
|
.type __8033x_proc_info,#object
|
||||||
__8033x_proc_info:
|
__8033x_proc_info:
|
||||||
.long 0x69054010
|
.long 0x69054010
|
||||||
.long 0xffffff30
|
.long 0xfffffd30
|
||||||
.long PMD_TYPE_SECT | \
|
.long PMD_TYPE_SECT | \
|
||||||
PMD_SECT_BUFFERABLE | \
|
PMD_SECT_BUFFERABLE | \
|
||||||
PMD_SECT_CACHEABLE | \
|
PMD_SECT_CACHEABLE | \
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#
|
#
|
||||||
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
||||||
#
|
#
|
||||||
# Last update: Thu Dec 7 17:19:20 2006
|
# Last update: Tue Jan 16 16:52:56 2007
|
||||||
#
|
#
|
||||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||||
#
|
#
|
||||||
|
@ -1219,3 +1219,26 @@ zevio_1020 MACH_ZEVIO_1020 ZEVIO_1020 1207
|
||||||
hitrack MACH_HITRACK HITRACK 1208
|
hitrack MACH_HITRACK HITRACK 1208
|
||||||
syme1 MACH_SYME1 SYME1 1209
|
syme1 MACH_SYME1 SYME1 1209
|
||||||
syhl1 MACH_SYHL1 SYHL1 1210
|
syhl1 MACH_SYHL1 SYHL1 1210
|
||||||
|
empca400 MACH_EMPCA400 EMPCA400 1211
|
||||||
|
em7210 MACH_EM7210 EM7210 1212
|
||||||
|
htchermes MACH_HTCHERMES HTCHERMES 1213
|
||||||
|
eti_c1 MACH_ETI_C1 ETI_C1 1214
|
||||||
|
mach_dep2410 MACH_MACH_DEP2410 MACH_DEP2410 1215
|
||||||
|
ac100 MACH_AC100 AC100 1216
|
||||||
|
sneetch MACH_SNEETCH SNEETCH 1217
|
||||||
|
studentmate MACH_STUDENTMATE STUDENTMATE 1218
|
||||||
|
zir2410 MACH_ZIR2410 ZIR2410 1219
|
||||||
|
zir2413 MACH_ZIR2413 ZIR2413 1220
|
||||||
|
dlonip3 MACH_DLONIP3 DLONIP3 1221
|
||||||
|
instream MACH_INSTREAM INSTREAM 1222
|
||||||
|
ambarella MACH_AMBARELLA AMBARELLA 1223
|
||||||
|
nevis MACH_NEVIS NEVIS 1224
|
||||||
|
htc_trinity MACH_HTC_TRINITY HTC_TRINITY 1225
|
||||||
|
ql202b MACH_QL202B QL202B 1226
|
||||||
|
vpac270 MACH_VPAC270 VPAC270 1227
|
||||||
|
rd129 MACH_RD129 RD129 1228
|
||||||
|
htcwizard MACH_HTCWIZARD HTCWIZARD 1229
|
||||||
|
xscale_treo680 MACH_XSCALE_TREO680 XSCALE_TREO680 1230
|
||||||
|
tecon_tmezon MACH_TECON_TMEZON TECON_TMEZON 1231
|
||||||
|
zylonite MACH_ZYLONITE ZYLONITE 1233
|
||||||
|
gene1270 MACH_GENE1270 GENE1270 1234
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
do_vfp:
|
do_vfp:
|
||||||
enable_irq
|
enable_irq
|
||||||
ldr r4, .LCvfp
|
ldr r4, .LCvfp
|
||||||
|
ldr r11, [r10, #TI_CPU] @ CPU number
|
||||||
add r10, r10, #TI_VFPSTATE @ r10 = workspace
|
add r10, r10, #TI_VFPSTATE @ r10 = workspace
|
||||||
ldr pc, [r4] @ call VFP entry point
|
ldr pc, [r4] @ call VFP entry point
|
||||||
|
|
||||||
|
|
|
@ -370,3 +370,7 @@ struct op {
|
||||||
u32 (* const fn)(int dd, int dn, int dm, u32 fpscr);
|
u32 (* const fn)(int dd, int dn, int dm, u32 fpscr);
|
||||||
u32 flags;
|
u32 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
extern void vfp_save_state(void *location, u32 fpexc);
|
||||||
|
#endif
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
@ r2 = faulted PC+4
|
@ r2 = faulted PC+4
|
||||||
@ r9 = successful return
|
@ r9 = successful return
|
||||||
@ r10 = vfp_state union
|
@ r10 = vfp_state union
|
||||||
|
@ r11 = CPU number
|
||||||
@ lr = failure return
|
@ lr = failure return
|
||||||
|
|
||||||
.globl vfp_support_entry
|
.globl vfp_support_entry
|
||||||
|
@ -79,7 +80,7 @@ vfp_support_entry:
|
||||||
DBGSTR1 "enable %x", r10
|
DBGSTR1 "enable %x", r10
|
||||||
ldr r3, last_VFP_context_address
|
ldr r3, last_VFP_context_address
|
||||||
orr r1, r1, #FPEXC_ENABLE @ user FPEXC has the enable bit set
|
orr r1, r1, #FPEXC_ENABLE @ user FPEXC has the enable bit set
|
||||||
ldr r4, [r3] @ last_VFP_context pointer
|
ldr r4, [r3, r11, lsl #2] @ last_VFP_context pointer
|
||||||
bic r5, r1, #FPEXC_EXCEPTION @ make sure exceptions are disabled
|
bic r5, r1, #FPEXC_EXCEPTION @ make sure exceptions are disabled
|
||||||
cmp r4, r10
|
cmp r4, r10
|
||||||
beq check_for_exception @ we are returning to the same
|
beq check_for_exception @ we are returning to the same
|
||||||
|
@ -91,7 +92,9 @@ vfp_support_entry:
|
||||||
@ exceptions, so we can get at the
|
@ exceptions, so we can get at the
|
||||||
@ rest of it
|
@ rest of it
|
||||||
|
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
@ Save out the current registers to the old thread state
|
@ Save out the current registers to the old thread state
|
||||||
|
@ No need for SMP since this is not done lazily
|
||||||
|
|
||||||
DBGSTR1 "save old state %p", r4
|
DBGSTR1 "save old state %p", r4
|
||||||
cmp r4, #0
|
cmp r4, #0
|
||||||
|
@ -105,10 +108,11 @@ vfp_support_entry:
|
||||||
stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2
|
stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2
|
||||||
@ and point r4 at the word at the
|
@ and point r4 at the word at the
|
||||||
@ start of the register dump
|
@ start of the register dump
|
||||||
|
#endif
|
||||||
|
|
||||||
no_old_VFP_process:
|
no_old_VFP_process:
|
||||||
DBGSTR1 "load state %p", r10
|
DBGSTR1 "load state %p", r10
|
||||||
str r10, [r3] @ update the last_VFP_context pointer
|
str r10, [r3, r11, lsl #2] @ update the last_VFP_context pointer
|
||||||
@ Load the saved state back into the VFP
|
@ Load the saved state back into the VFP
|
||||||
VFPFLDMIA r10 @ reload the working registers while
|
VFPFLDMIA r10 @ reload the working registers while
|
||||||
@ FPEXC is in a safe state
|
@ FPEXC is in a safe state
|
||||||
|
@ -162,6 +166,24 @@ process_exception:
|
||||||
@ required. If not, the user code will
|
@ required. If not, the user code will
|
||||||
@ retry the faulted instruction
|
@ retry the faulted instruction
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
.globl vfp_save_state
|
||||||
|
.type vfp_save_state, %function
|
||||||
|
vfp_save_state:
|
||||||
|
@ Save the current VFP state
|
||||||
|
@ r0 - save location
|
||||||
|
@ r1 - FPEXC
|
||||||
|
DBGSTR1 "save VFP state %p", r0
|
||||||
|
VFPFMRX r2, FPSCR @ current status
|
||||||
|
VFPFMRX r3, FPINST @ FPINST (always there, rev0 onwards)
|
||||||
|
tst r1, #FPEXC_FPV2 @ is there an FPINST2 to read?
|
||||||
|
VFPFMRX r12, FPINST2, NE @ FPINST2 if needed - avoids reading
|
||||||
|
@ nonexistant reg on rev0
|
||||||
|
VFPFSTMIA r0 @ save the working registers
|
||||||
|
stmia r0, {r1, r2, r3, r12} @ save FPEXC, FPSCR, FPINST, FPINST2
|
||||||
|
mov pc, lr
|
||||||
|
#endif
|
||||||
|
|
||||||
last_VFP_context_address:
|
last_VFP_context_address:
|
||||||
.word last_VFP_context
|
.word last_VFP_context
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ void vfp_testing_entry(void);
|
||||||
void vfp_support_entry(void);
|
void vfp_support_entry(void);
|
||||||
|
|
||||||
void (*vfp_vector)(void) = vfp_testing_entry;
|
void (*vfp_vector)(void) = vfp_testing_entry;
|
||||||
union vfp_state *last_VFP_context;
|
union vfp_state *last_VFP_context[NR_CPUS];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dual-use variable.
|
* Dual-use variable.
|
||||||
|
@ -41,13 +41,35 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
|
||||||
{
|
{
|
||||||
struct thread_info *thread = v;
|
struct thread_info *thread = v;
|
||||||
union vfp_state *vfp;
|
union vfp_state *vfp;
|
||||||
|
__u32 cpu = thread->cpu;
|
||||||
|
|
||||||
if (likely(cmd == THREAD_NOTIFY_SWITCH)) {
|
if (likely(cmd == THREAD_NOTIFY_SWITCH)) {
|
||||||
|
u32 fpexc = fmrx(FPEXC);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
/*
|
||||||
|
* On SMP, if VFP is enabled, save the old state in
|
||||||
|
* case the thread migrates to a different CPU. The
|
||||||
|
* restoring is done lazily.
|
||||||
|
*/
|
||||||
|
if ((fpexc & FPEXC_ENABLE) && last_VFP_context[cpu]) {
|
||||||
|
vfp_save_state(last_VFP_context[cpu], fpexc);
|
||||||
|
last_VFP_context[cpu]->hard.cpu = cpu;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Thread migration, just force the reloading of the
|
||||||
|
* state on the new CPU in case the VFP registers
|
||||||
|
* contain stale data.
|
||||||
|
*/
|
||||||
|
if (thread->vfpstate.hard.cpu != cpu)
|
||||||
|
last_VFP_context[cpu] = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Always disable VFP so we can lazily save/restore the
|
* Always disable VFP so we can lazily save/restore the
|
||||||
* old state.
|
* old state.
|
||||||
*/
|
*/
|
||||||
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_ENABLE);
|
fmxr(FPEXC, fpexc & ~FPEXC_ENABLE);
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,8 +90,8 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* flush and release case: Per-thread VFP cleanup. */
|
/* flush and release case: Per-thread VFP cleanup. */
|
||||||
if (last_VFP_context == vfp)
|
if (last_VFP_context[cpu] == vfp)
|
||||||
last_VFP_context = NULL;
|
last_VFP_context[cpu] = NULL;
|
||||||
|
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.19-rc2
|
# Linux kernel version: 2.6.20-rc6
|
||||||
# Fri Oct 20 11:52:37 2006
|
# Fri Jan 26 13:12:59 2007
|
||||||
#
|
#
|
||||||
CONFIG_AVR32=y
|
CONFIG_AVR32=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
|
@ -9,6 +9,8 @@ CONFIG_HARDIRQS_SW_RESEND=y
|
||||||
CONFIG_GENERIC_IRQ_PROBE=y
|
CONFIG_GENERIC_IRQ_PROBE=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
CONFIG_GENERIC_TIME=y
|
CONFIG_GENERIC_TIME=y
|
||||||
|
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||||
|
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||||
CONFIG_GENERIC_HWEIGHT=y
|
CONFIG_GENERIC_HWEIGHT=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||||
|
@ -36,6 +38,7 @@ CONFIG_TASK_DELAY_ACCT=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
CONFIG_AUDIT=y
|
CONFIG_AUDIT=y
|
||||||
# CONFIG_IKCONFIG is not set
|
# CONFIG_IKCONFIG is not set
|
||||||
|
CONFIG_SYSFS_DEPRECATED=y
|
||||||
CONFIG_RELAY=y
|
CONFIG_RELAY=y
|
||||||
CONFIG_INITRAMFS_SOURCE=""
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
|
@ -75,7 +78,9 @@ CONFIG_MODULE_UNLOAD=y
|
||||||
# Block layer
|
# Block layer
|
||||||
#
|
#
|
||||||
CONFIG_BLOCK=y
|
CONFIG_BLOCK=y
|
||||||
|
# CONFIG_LBD is not set
|
||||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||||
|
# CONFIG_LSF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IO Schedulers
|
# IO Schedulers
|
||||||
|
@ -125,6 +130,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||||
# CONFIG_OWNERSHIP_TRACE is not set
|
# CONFIG_OWNERSHIP_TRACE is not set
|
||||||
# CONFIG_HZ_100 is not set
|
# CONFIG_HZ_100 is not set
|
||||||
CONFIG_HZ_250=y
|
CONFIG_HZ_250=y
|
||||||
|
# CONFIG_HZ_300 is not set
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=250
|
CONFIG_HZ=250
|
||||||
CONFIG_CMDLINE=""
|
CONFIG_CMDLINE=""
|
||||||
|
@ -182,6 +188,7 @@ CONFIG_INET_TCP_DIAG=y
|
||||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||||
CONFIG_TCP_CONG_CUBIC=y
|
CONFIG_TCP_CONG_CUBIC=y
|
||||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||||
|
# CONFIG_TCP_MD5SIG is not set
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||||
# CONFIG_INET6_TUNNEL is not set
|
# CONFIG_INET6_TUNNEL is not set
|
||||||
|
@ -260,6 +267,7 @@ CONFIG_MTD_CMDLINE_PARTS=y
|
||||||
# User Modules And Translation Layers
|
# User Modules And Translation Layers
|
||||||
#
|
#
|
||||||
CONFIG_MTD_CHAR=y
|
CONFIG_MTD_CHAR=y
|
||||||
|
CONFIG_MTD_BLKDEVS=y
|
||||||
CONFIG_MTD_BLOCK=y
|
CONFIG_MTD_BLOCK=y
|
||||||
# CONFIG_FTL is not set
|
# CONFIG_FTL is not set
|
||||||
# CONFIG_NFTL is not set
|
# CONFIG_NFTL is not set
|
||||||
|
@ -355,7 +363,6 @@ CONFIG_BLK_DEV_INITRD=y
|
||||||
#
|
#
|
||||||
# Misc devices
|
# Misc devices
|
||||||
#
|
#
|
||||||
# CONFIG_SGI_IOC4 is not set
|
|
||||||
# CONFIG_TIFM_CORE is not set
|
# CONFIG_TIFM_CORE is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -405,11 +412,14 @@ CONFIG_TUN=m
|
||||||
#
|
#
|
||||||
# PHY device support
|
# PHY device support
|
||||||
#
|
#
|
||||||
|
# CONFIG_PHYLIB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10 or 100Mbit)
|
# Ethernet (10 or 100Mbit)
|
||||||
#
|
#
|
||||||
# CONFIG_NET_ETHERNET is not set
|
CONFIG_NET_ETHERNET=y
|
||||||
|
CONFIG_MII=y
|
||||||
|
CONFIG_MACB=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (1000 Mbit)
|
# Ethernet (1000 Mbit)
|
||||||
|
@ -505,10 +515,6 @@ CONFIG_UNIX98_PTYS=y
|
||||||
# CONFIG_GEN_RTC is not set
|
# CONFIG_GEN_RTC is not set
|
||||||
# CONFIG_DTLK is not set
|
# CONFIG_DTLK is not set
|
||||||
# CONFIG_R3964 is not set
|
# CONFIG_R3964 is not set
|
||||||
|
|
||||||
#
|
|
||||||
# Ftape, the floppy tape device driver
|
|
||||||
#
|
|
||||||
# CONFIG_RAW_DRIVER is not set
|
# CONFIG_RAW_DRIVER is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -620,6 +626,10 @@ CONFIG_UNIX98_PTYS=y
|
||||||
# DMA Devices
|
# DMA Devices
|
||||||
#
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Virtualization
|
||||||
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
#
|
#
|
||||||
|
@ -683,7 +693,6 @@ CONFIG_CONFIGFS_FS=m
|
||||||
# CONFIG_BEFS_FS is not set
|
# CONFIG_BEFS_FS is not set
|
||||||
# CONFIG_BFS_FS is not set
|
# CONFIG_BFS_FS is not set
|
||||||
# CONFIG_EFS_FS is not set
|
# CONFIG_EFS_FS is not set
|
||||||
# CONFIG_JFFS_FS is not set
|
|
||||||
CONFIG_JFFS2_FS=y
|
CONFIG_JFFS2_FS=y
|
||||||
CONFIG_JFFS2_FS_DEBUG=0
|
CONFIG_JFFS2_FS_DEBUG=0
|
||||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||||
|
@ -762,6 +771,11 @@ CONFIG_NLS_ISO8859_1=m
|
||||||
# CONFIG_NLS_KOI8_U is not set
|
# CONFIG_NLS_KOI8_U is not set
|
||||||
CONFIG_NLS_UTF8=m
|
CONFIG_NLS_UTF8=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Distributed Lock Manager
|
||||||
|
#
|
||||||
|
# CONFIG_DLM is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kernel hacking
|
# Kernel hacking
|
||||||
#
|
#
|
||||||
|
@ -770,6 +784,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||||
CONFIG_ENABLE_MUST_CHECK=y
|
CONFIG_ENABLE_MUST_CHECK=y
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
# CONFIG_UNUSED_SYMBOLS is not set
|
# CONFIG_UNUSED_SYMBOLS is not set
|
||||||
|
CONFIG_DEBUG_FS=y
|
||||||
|
# CONFIG_HEADERS_CHECK is not set
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_DETECT_SOFTLOCKUP=y
|
CONFIG_DETECT_SOFTLOCKUP=y
|
||||||
|
@ -785,13 +801,10 @@ CONFIG_DETECT_SOFTLOCKUP=y
|
||||||
# CONFIG_DEBUG_KOBJECT is not set
|
# CONFIG_DEBUG_KOBJECT is not set
|
||||||
CONFIG_DEBUG_BUGVERBOSE=y
|
CONFIG_DEBUG_BUGVERBOSE=y
|
||||||
# CONFIG_DEBUG_INFO is not set
|
# CONFIG_DEBUG_INFO is not set
|
||||||
CONFIG_DEBUG_FS=y
|
|
||||||
# CONFIG_DEBUG_VM is not set
|
# CONFIG_DEBUG_VM is not set
|
||||||
# CONFIG_DEBUG_LIST is not set
|
# CONFIG_DEBUG_LIST is not set
|
||||||
CONFIG_FRAME_POINTER=y
|
CONFIG_FRAME_POINTER=y
|
||||||
# CONFIG_UNWIND_INFO is not set
|
|
||||||
CONFIG_FORCED_INLINING=y
|
CONFIG_FORCED_INLINING=y
|
||||||
# CONFIG_HEADERS_CHECK is not set
|
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
# CONFIG_KPROBES is not set
|
# CONFIG_KPROBES is not set
|
||||||
|
|
||||||
|
@ -809,6 +822,7 @@ CONFIG_FORCED_INLINING=y
|
||||||
#
|
#
|
||||||
# Library routines
|
# Library routines
|
||||||
#
|
#
|
||||||
|
CONFIG_BITREVERSE=y
|
||||||
CONFIG_CRC_CCITT=m
|
CONFIG_CRC_CCITT=m
|
||||||
# CONFIG_CRC16 is not set
|
# CONFIG_CRC16 is not set
|
||||||
CONFIG_CRC32=y
|
CONFIG_CRC32=y
|
||||||
|
@ -817,3 +831,4 @@ CONFIG_AUDIT_GENERIC=y
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
CONFIG_PLIST=y
|
CONFIG_PLIST=y
|
||||||
|
CONFIG_IOMAP_COPY=y
|
||||||
|
|
|
@ -29,6 +29,7 @@ EXPORT_SYMBOL(__avr32_asr64);
|
||||||
*/
|
*/
|
||||||
EXPORT_SYMBOL(memset);
|
EXPORT_SYMBOL(memset);
|
||||||
EXPORT_SYMBOL(memcpy);
|
EXPORT_SYMBOL(memcpy);
|
||||||
|
EXPORT_SYMBOL(clear_page);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Userspace access stuff.
|
* Userspace access stuff.
|
||||||
|
|
|
@ -43,6 +43,8 @@ static int is_safe_abs_reloc(const char* sym_name)
|
||||||
/* Match found */
|
/* Match found */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (strncmp(sym_name, "__crc_", 6) == 0)
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,6 @@ enum {
|
||||||
|
|
||||||
|
|
||||||
static int has_N44_O17_errata[NR_CPUS];
|
static int has_N44_O17_errata[NR_CPUS];
|
||||||
static int has_N60_errata[NR_CPUS];
|
|
||||||
static unsigned int stock_freq;
|
static unsigned int stock_freq;
|
||||||
static struct cpufreq_driver p4clockmod_driver;
|
static struct cpufreq_driver p4clockmod_driver;
|
||||||
static unsigned int cpufreq_p4_get(unsigned int cpu);
|
static unsigned int cpufreq_p4_get(unsigned int cpu);
|
||||||
|
@ -224,12 +223,6 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
|
||||||
case 0x0f12:
|
case 0x0f12:
|
||||||
has_N44_O17_errata[policy->cpu] = 1;
|
has_N44_O17_errata[policy->cpu] = 1;
|
||||||
dprintk("has errata -- disabling low frequencies\n");
|
dprintk("has errata -- disabling low frequencies\n");
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x0f29:
|
|
||||||
has_N60_errata[policy->cpu] = 1;
|
|
||||||
dprintk("has errata -- disabling frequencies lower than 2ghz\n");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get max frequency */
|
/* get max frequency */
|
||||||
|
@ -241,8 +234,6 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
|
||||||
for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
||||||
if ((i<2) && (has_N44_O17_errata[policy->cpu]))
|
if ((i<2) && (has_N44_O17_errata[policy->cpu]))
|
||||||
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||||
else if (has_N60_errata[policy->cpu] && ((stock_freq * i)/8) < 2000000)
|
|
||||||
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
|
||||||
else
|
else
|
||||||
p4clockmod_table[i].frequency = (stock_freq * i)/8;
|
p4clockmod_table[i].frequency = (stock_freq * i)/8;
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,7 +173,7 @@ static void __cpuinit geode_configure(void)
|
||||||
ccr4 = getCx86(CX86_CCR4);
|
ccr4 = getCx86(CX86_CCR4);
|
||||||
ccr4 |= 0x38; /* FPU fast, DTE cache, Mem bypass */
|
ccr4 |= 0x38; /* FPU fast, DTE cache, Mem bypass */
|
||||||
|
|
||||||
setCx86(CX86_CCR4, ccr4);
|
setCx86(CX86_CCR3, ccr3);
|
||||||
|
|
||||||
set_cx86_memwb();
|
set_cx86_memwb();
|
||||||
set_cx86_reorder();
|
set_cx86_reorder();
|
||||||
|
|
|
@ -472,6 +472,70 @@ static inline void __init check_range_for_systab(efi_memory_desc_t *md)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wrap all the virtual calls in a way that forces the parameters on the stack.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define efi_call_virt(f, args...) \
|
||||||
|
((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args)
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
|
||||||
|
{
|
||||||
|
return efi_call_virt(get_time, tm, tc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_set_time (efi_time_t *tm)
|
||||||
|
{
|
||||||
|
return efi_call_virt(set_time, tm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_get_wakeup_time (efi_bool_t *enabled,
|
||||||
|
efi_bool_t *pending,
|
||||||
|
efi_time_t *tm)
|
||||||
|
{
|
||||||
|
return efi_call_virt(get_wakeup_time, enabled, pending, tm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_set_wakeup_time (efi_bool_t enabled,
|
||||||
|
efi_time_t *tm)
|
||||||
|
{
|
||||||
|
return efi_call_virt(set_wakeup_time, enabled, tm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_get_variable (efi_char16_t *name,
|
||||||
|
efi_guid_t *vendor, u32 *attr,
|
||||||
|
unsigned long *data_size, void *data)
|
||||||
|
{
|
||||||
|
return efi_call_virt(get_variable, name, vendor, attr, data_size, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_get_next_variable (unsigned long *name_size,
|
||||||
|
efi_char16_t *name,
|
||||||
|
efi_guid_t *vendor)
|
||||||
|
{
|
||||||
|
return efi_call_virt(get_next_variable, name_size, name, vendor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_set_variable (efi_char16_t *name,
|
||||||
|
efi_guid_t *vendor,
|
||||||
|
unsigned long attr,
|
||||||
|
unsigned long data_size, void *data)
|
||||||
|
{
|
||||||
|
return efi_call_virt(set_variable, name, vendor, attr, data_size, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static efi_status_t virt_efi_get_next_high_mono_count (u32 *count)
|
||||||
|
{
|
||||||
|
return efi_call_virt(get_next_high_mono_count, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_efi_reset_system (int reset_type, efi_status_t status,
|
||||||
|
unsigned long data_size,
|
||||||
|
efi_char16_t *data)
|
||||||
|
{
|
||||||
|
efi_call_virt(reset_system, reset_type, status, data_size, data);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function will switch the EFI runtime services to virtual mode.
|
* This function will switch the EFI runtime services to virtual mode.
|
||||||
* Essentially, look through the EFI memmap and map every region that
|
* Essentially, look through the EFI memmap and map every region that
|
||||||
|
@ -525,22 +589,15 @@ void __init efi_enter_virtual_mode(void)
|
||||||
* pointers in the runtime service table to the new virtual addresses.
|
* pointers in the runtime service table to the new virtual addresses.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
efi.get_time = (efi_get_time_t *) efi.systab->runtime->get_time;
|
efi.get_time = virt_efi_get_time;
|
||||||
efi.set_time = (efi_set_time_t *) efi.systab->runtime->set_time;
|
efi.set_time = virt_efi_set_time;
|
||||||
efi.get_wakeup_time = (efi_get_wakeup_time_t *)
|
efi.get_wakeup_time = virt_efi_get_wakeup_time;
|
||||||
efi.systab->runtime->get_wakeup_time;
|
efi.set_wakeup_time = virt_efi_set_wakeup_time;
|
||||||
efi.set_wakeup_time = (efi_set_wakeup_time_t *)
|
efi.get_variable = virt_efi_get_variable;
|
||||||
efi.systab->runtime->set_wakeup_time;
|
efi.get_next_variable = virt_efi_get_next_variable;
|
||||||
efi.get_variable = (efi_get_variable_t *)
|
efi.set_variable = virt_efi_set_variable;
|
||||||
efi.systab->runtime->get_variable;
|
efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
|
||||||
efi.get_next_variable = (efi_get_next_variable_t *)
|
efi.reset_system = virt_efi_reset_system;
|
||||||
efi.systab->runtime->get_next_variable;
|
|
||||||
efi.set_variable = (efi_set_variable_t *)
|
|
||||||
efi.systab->runtime->set_variable;
|
|
||||||
efi.get_next_high_mono_count = (efi_get_next_high_mono_count_t *)
|
|
||||||
efi.systab->runtime->get_next_high_mono_count;
|
|
||||||
efi.reset_system = (efi_reset_system_t *)
|
|
||||||
efi.systab->runtime->reset_system;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init
|
void __init
|
||||||
|
|
|
@ -302,12 +302,16 @@ sysenter_past_esp:
|
||||||
pushl $(__USER_CS)
|
pushl $(__USER_CS)
|
||||||
CFI_ADJUST_CFA_OFFSET 4
|
CFI_ADJUST_CFA_OFFSET 4
|
||||||
/*CFI_REL_OFFSET cs, 0*/
|
/*CFI_REL_OFFSET cs, 0*/
|
||||||
|
#ifndef CONFIG_COMPAT_VDSO
|
||||||
/*
|
/*
|
||||||
* Push current_thread_info()->sysenter_return to the stack.
|
* Push current_thread_info()->sysenter_return to the stack.
|
||||||
* A tiny bit of offset fixup is necessary - 4*4 means the 4 words
|
* A tiny bit of offset fixup is necessary - 4*4 means the 4 words
|
||||||
* pushed above; +8 corresponds to copy_thread's esp0 setting.
|
* pushed above; +8 corresponds to copy_thread's esp0 setting.
|
||||||
*/
|
*/
|
||||||
pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
|
pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
|
||||||
|
#else
|
||||||
|
pushl $SYSENTER_RETURN
|
||||||
|
#endif
|
||||||
CFI_ADJUST_CFA_OFFSET 4
|
CFI_ADJUST_CFA_OFFSET 4
|
||||||
CFI_REL_OFFSET eip, 0
|
CFI_REL_OFFSET eip, 0
|
||||||
|
|
||||||
|
|
|
@ -1227,26 +1227,32 @@ static u8 irq_vector[NR_IRQ_VECTORS] __read_mostly = { FIRST_DEVICE_VECTOR , 0 }
|
||||||
|
|
||||||
static int __assign_irq_vector(int irq)
|
static int __assign_irq_vector(int irq)
|
||||||
{
|
{
|
||||||
static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
|
static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
|
||||||
int vector;
|
int vector, offset, i;
|
||||||
|
|
||||||
BUG_ON((unsigned)irq >= NR_IRQ_VECTORS);
|
BUG_ON((unsigned)irq >= NR_IRQ_VECTORS);
|
||||||
|
|
||||||
if (irq_vector[irq] > 0)
|
if (irq_vector[irq] > 0)
|
||||||
return irq_vector[irq];
|
return irq_vector[irq];
|
||||||
|
|
||||||
current_vector += 8;
|
|
||||||
if (current_vector == SYSCALL_VECTOR)
|
|
||||||
current_vector += 8;
|
|
||||||
|
|
||||||
if (current_vector >= FIRST_SYSTEM_VECTOR) {
|
|
||||||
offset++;
|
|
||||||
if (!(offset % 8))
|
|
||||||
return -ENOSPC;
|
|
||||||
current_vector = FIRST_DEVICE_VECTOR + offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector = current_vector;
|
vector = current_vector;
|
||||||
|
offset = current_offset;
|
||||||
|
next:
|
||||||
|
vector += 8;
|
||||||
|
if (vector >= FIRST_SYSTEM_VECTOR) {
|
||||||
|
offset = (offset + 1) % 8;
|
||||||
|
vector = FIRST_DEVICE_VECTOR + offset;
|
||||||
|
}
|
||||||
|
if (vector == current_vector)
|
||||||
|
return -ENOSPC;
|
||||||
|
if (vector == SYSCALL_VECTOR)
|
||||||
|
goto next;
|
||||||
|
for (i = 0; i < NR_IRQ_VECTORS; i++)
|
||||||
|
if (irq_vector[i] == vector)
|
||||||
|
goto next;
|
||||||
|
|
||||||
|
current_vector = vector;
|
||||||
|
current_offset = offset;
|
||||||
irq_vector[irq] = vector;
|
irq_vector[irq] = vector;
|
||||||
|
|
||||||
return vector;
|
return vector;
|
||||||
|
|
|
@ -310,13 +310,7 @@ static int __init setup_nmi_watchdog(char *str)
|
||||||
|
|
||||||
if ((nmi >= NMI_INVALID) || (nmi < NMI_NONE))
|
if ((nmi >= NMI_INVALID) || (nmi < NMI_NONE))
|
||||||
return 0;
|
return 0;
|
||||||
/*
|
|
||||||
* If any other x86 CPU has a local APIC, then
|
|
||||||
* please test the NMI stuff there and send me the
|
|
||||||
* missing bits. Right now Intel P6/P4 and AMD K7 only.
|
|
||||||
*/
|
|
||||||
if ((nmi == NMI_LOCAL_APIC) && (nmi_known_cpu() == 0))
|
|
||||||
return 0; /* no lapic support */
|
|
||||||
nmi_watchdog = nmi;
|
nmi_watchdog = nmi;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -566,4 +566,11 @@ struct paravirt_ops paravirt_ops = {
|
||||||
.irq_enable_sysexit = native_irq_enable_sysexit,
|
.irq_enable_sysexit = native_irq_enable_sysexit,
|
||||||
.iret = native_iret,
|
.iret = native_iret,
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL(paravirt_ops);
|
|
||||||
|
/*
|
||||||
|
* NOTE: CONFIG_PARAVIRT is experimental and the paravirt_ops
|
||||||
|
* semantics are subject to change. Hence we only do this
|
||||||
|
* internal-only export of this, until it gets sorted out and
|
||||||
|
* all lowlevel CPU ops used by modules are separately exported.
|
||||||
|
*/
|
||||||
|
EXPORT_SYMBOL_GPL(paravirt_ops);
|
||||||
|
|
|
@ -79,11 +79,6 @@ int __init sysenter_setup(void)
|
||||||
#ifdef CONFIG_COMPAT_VDSO
|
#ifdef CONFIG_COMPAT_VDSO
|
||||||
__set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
|
__set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
|
||||||
printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO));
|
printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO));
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* In the non-compat case the ELF coredumping code needs the fixmap:
|
|
||||||
*/
|
|
||||||
__set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_KERNEL_RO);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!boot_cpu_has(X86_FEATURE_SEP)) {
|
if (!boot_cpu_has(X86_FEATURE_SEP)) {
|
||||||
|
@ -100,6 +95,7 @@ int __init sysenter_setup(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_COMPAT_VDSO
|
||||||
static struct page *syscall_nopage(struct vm_area_struct *vma,
|
static struct page *syscall_nopage(struct vm_area_struct *vma,
|
||||||
unsigned long adr, int *type)
|
unsigned long adr, int *type)
|
||||||
{
|
{
|
||||||
|
@ -146,6 +142,13 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
|
||||||
vma->vm_end = addr + PAGE_SIZE;
|
vma->vm_end = addr + PAGE_SIZE;
|
||||||
/* MAYWRITE to allow gdb to COW and set breakpoints */
|
/* MAYWRITE to allow gdb to COW and set breakpoints */
|
||||||
vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
|
vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
|
||||||
|
/*
|
||||||
|
* Make sure the vDSO gets into every core dump.
|
||||||
|
* Dumping its contents makes post-mortem fully interpretable later
|
||||||
|
* without matching up the same kernel and hardware config to see
|
||||||
|
* what PC values meant.
|
||||||
|
*/
|
||||||
|
vma->vm_flags |= VM_ALWAYSDUMP;
|
||||||
vma->vm_flags |= mm->def_flags;
|
vma->vm_flags |= mm->def_flags;
|
||||||
vma->vm_page_prot = protection_map[vma->vm_flags & 7];
|
vma->vm_page_prot = protection_map[vma->vm_flags & 7];
|
||||||
vma->vm_ops = &syscall_vm_ops;
|
vma->vm_ops = &syscall_vm_ops;
|
||||||
|
@ -187,3 +190,4 @@ int in_gate_area_no_task(unsigned long addr)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -102,7 +102,7 @@ void __init time_init_hook(void)
|
||||||
* along the MCA bus. Use this to hook into that chain if you will need
|
* along the MCA bus. Use this to hook into that chain if you will need
|
||||||
* it.
|
* it.
|
||||||
**/
|
**/
|
||||||
void __init mca_nmi_hook(void)
|
void mca_nmi_hook(void)
|
||||||
{
|
{
|
||||||
/* If I recall correctly, there's a whole bunch of other things that
|
/* If I recall correctly, there's a whole bunch of other things that
|
||||||
* we can do to check for NMI problems, but that's all I know about
|
* we can do to check for NMI problems, but that's all I know about
|
||||||
|
|
|
@ -609,6 +609,9 @@ EXPORT_SYMBOL(acpi_register_gsi);
|
||||||
|
|
||||||
void acpi_unregister_gsi(u32 gsi)
|
void acpi_unregister_gsi(u32 gsi)
|
||||||
{
|
{
|
||||||
|
if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM)
|
||||||
|
return;
|
||||||
|
|
||||||
iosapic_unregister_intr(gsi);
|
iosapic_unregister_intr(gsi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,9 @@ static void migrate_irqs(void)
|
||||||
for (irq=0; irq < NR_IRQS; irq++) {
|
for (irq=0; irq < NR_IRQS; irq++) {
|
||||||
desc = irq_desc + irq;
|
desc = irq_desc + irq;
|
||||||
|
|
||||||
|
if (desc->status == IRQ_DISABLED)
|
||||||
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No handling for now.
|
* No handling for now.
|
||||||
* TBD: Implement a disable function so we can now
|
* TBD: Implement a disable function so we can now
|
||||||
|
|
|
@ -1568,6 +1568,20 @@ config MIPS_MT_FPAFF
|
||||||
depends on MIPS_MT
|
depends on MIPS_MT
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config MIPS_MT_SMTC_INSTANT_REPLAY
|
||||||
|
bool "Low-latency Dispatch of Deferred SMTC IPIs"
|
||||||
|
depends on MIPS_MT_SMTC
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
SMTC pseudo-interrupts between TCs are deferred and queued
|
||||||
|
if the target TC is interrupt-inhibited (IXMT). In the first
|
||||||
|
SMTC prototypes, these queued IPIs were serviced on return
|
||||||
|
to user mode, or on entry into the kernel idle loop. The
|
||||||
|
INSTANT_REPLAY option dispatches them as part of local_irq_restore()
|
||||||
|
processing, which adds runtime overhead (hence the option to turn
|
||||||
|
it off), but ensures that IPIs are handled promptly even under
|
||||||
|
heavy I/O interrupt load.
|
||||||
|
|
||||||
config MIPS_VPE_LOADER_TOM
|
config MIPS_VPE_LOADER_TOM
|
||||||
bool "Load VPE program into memory hidden from linux"
|
bool "Load VPE program into memory hidden from linux"
|
||||||
depends on MIPS_VPE_LOADER
|
depends on MIPS_VPE_LOADER
|
||||||
|
|
|
@ -623,7 +623,7 @@ LDFLAGS += -m $(ld-emul)
|
||||||
|
|
||||||
ifdef CONFIG_MIPS
|
ifdef CONFIG_MIPS
|
||||||
CHECKFLAGS += $(shell $(CC) $(CFLAGS) -dM -E -xc /dev/null | \
|
CHECKFLAGS += $(shell $(CC) $(CFLAGS) -dM -E -xc /dev/null | \
|
||||||
egrep -vw '__GNUC_(MAJOR|MINOR|PATCHLEVEL)__' | \
|
egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \
|
||||||
sed -e 's/^\#define /-D/' -e "s/ /='/" -e "s/$$/'/")
|
sed -e 's/^\#define /-D/' -e "s/ /='/" -e "s/$$/'/")
|
||||||
ifdef CONFIG_64BIT
|
ifdef CONFIG_64BIT
|
||||||
CHECKFLAGS += -m64
|
CHECKFLAGS += -m64
|
||||||
|
|
|
@ -122,7 +122,7 @@ unsigned long __init prom_free_prom_memory(void)
|
||||||
addr += PAGE_SIZE;
|
addr += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
printk("Freeing unused PROM memory: %ldk freed\n",
|
printk("Freeing unused PROM memory: %ldkb freed\n",
|
||||||
(end - PAGE_SIZE) >> 10);
|
(end - PAGE_SIZE) >> 10);
|
||||||
|
|
||||||
return end - PAGE_SIZE;
|
return end - PAGE_SIZE;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@ -270,9 +271,12 @@ void smtc_configure_tlb(void)
|
||||||
* of their initialization in smtc_cpu_setup().
|
* of their initialization in smtc_cpu_setup().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tlbsiz = tlbsiz & 0x3f; /* MIPS32 limits TLB indices to 64 */
|
/* MIPS32 limits TLB indices to 64 */
|
||||||
cpu_data[0].tlbsize = tlbsiz;
|
if (tlbsiz > 64)
|
||||||
|
tlbsiz = 64;
|
||||||
|
cpu_data[0].tlbsize = current_cpu_data.tlbsize = tlbsiz;
|
||||||
smtc_status |= SMTC_TLB_SHARED;
|
smtc_status |= SMTC_TLB_SHARED;
|
||||||
|
local_flush_tlb_all();
|
||||||
|
|
||||||
printk("TLB of %d entry pairs shared by %d VPEs\n",
|
printk("TLB of %d entry pairs shared by %d VPEs\n",
|
||||||
tlbsiz, vpes);
|
tlbsiz, vpes);
|
||||||
|
@ -1017,6 +1021,35 @@ void setup_cross_vpe_interrupts(void)
|
||||||
* SMTC-specific hacks invoked from elsewhere in the kernel.
|
* SMTC-specific hacks invoked from elsewhere in the kernel.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
void smtc_ipi_replay(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* To the extent that we've ever turned interrupts off,
|
||||||
|
* we may have accumulated deferred IPIs. This is subtle.
|
||||||
|
* If we use the smtc_ipi_qdepth() macro, we'll get an
|
||||||
|
* exact number - but we'll also disable interrupts
|
||||||
|
* and create a window of failure where a new IPI gets
|
||||||
|
* queued after we test the depth but before we re-enable
|
||||||
|
* interrupts. So long as IXMT never gets set, however,
|
||||||
|
* we should be OK: If we pick up something and dispatch
|
||||||
|
* it here, that's great. If we see nothing, but concurrent
|
||||||
|
* with this operation, another TC sends us an IPI, IXMT
|
||||||
|
* is clear, and we'll handle it as a real pseudo-interrupt
|
||||||
|
* and not a pseudo-pseudo interrupt.
|
||||||
|
*/
|
||||||
|
if (IPIQ[smp_processor_id()].depth > 0) {
|
||||||
|
struct smtc_ipi *pipi;
|
||||||
|
extern void self_ipi(struct smtc_ipi *);
|
||||||
|
|
||||||
|
while ((pipi = smtc_ipi_dq(&IPIQ[smp_processor_id()]))) {
|
||||||
|
self_ipi(pipi);
|
||||||
|
smtc_cpu_stats[smp_processor_id()].selfipis++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(smtc_ipi_replay);
|
||||||
|
|
||||||
void smtc_idle_loop_hook(void)
|
void smtc_idle_loop_hook(void)
|
||||||
{
|
{
|
||||||
#ifdef SMTC_IDLE_HOOK_DEBUG
|
#ifdef SMTC_IDLE_HOOK_DEBUG
|
||||||
|
@ -1113,29 +1146,14 @@ void smtc_idle_loop_hook(void)
|
||||||
if (pdb_msg != &id_ho_db_msg[0])
|
if (pdb_msg != &id_ho_db_msg[0])
|
||||||
printk("CPU%d: %s", smp_processor_id(), id_ho_db_msg);
|
printk("CPU%d: %s", smp_processor_id(), id_ho_db_msg);
|
||||||
#endif /* SMTC_IDLE_HOOK_DEBUG */
|
#endif /* SMTC_IDLE_HOOK_DEBUG */
|
||||||
/*
|
|
||||||
* To the extent that we've ever turned interrupts off,
|
|
||||||
* we may have accumulated deferred IPIs. This is subtle.
|
|
||||||
* If we use the smtc_ipi_qdepth() macro, we'll get an
|
|
||||||
* exact number - but we'll also disable interrupts
|
|
||||||
* and create a window of failure where a new IPI gets
|
|
||||||
* queued after we test the depth but before we re-enable
|
|
||||||
* interrupts. So long as IXMT never gets set, however,
|
|
||||||
* we should be OK: If we pick up something and dispatch
|
|
||||||
* it here, that's great. If we see nothing, but concurrent
|
|
||||||
* with this operation, another TC sends us an IPI, IXMT
|
|
||||||
* is clear, and we'll handle it as a real pseudo-interrupt
|
|
||||||
* and not a pseudo-pseudo interrupt.
|
|
||||||
*/
|
|
||||||
if (IPIQ[smp_processor_id()].depth > 0) {
|
|
||||||
struct smtc_ipi *pipi;
|
|
||||||
extern void self_ipi(struct smtc_ipi *);
|
|
||||||
|
|
||||||
if ((pipi = smtc_ipi_dq(&IPIQ[smp_processor_id()])) != NULL) {
|
/*
|
||||||
self_ipi(pipi);
|
* Replay any accumulated deferred IPIs. If "Instant Replay"
|
||||||
smtc_cpu_stats[smp_processor_id()].selfipis++;
|
* is in use, there should never be any.
|
||||||
}
|
*/
|
||||||
}
|
#ifndef CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY
|
||||||
|
smtc_ipi_replay();
|
||||||
|
#endif /* CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY */
|
||||||
}
|
}
|
||||||
|
|
||||||
void smtc_soft_dump(void)
|
void smtc_soft_dump(void)
|
||||||
|
|
|
@ -139,13 +139,16 @@ struct tc {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vpecontrol_ {
|
struct {
|
||||||
/* Virtual processing elements */
|
/* Virtual processing elements */
|
||||||
struct list_head vpe_list;
|
struct list_head vpe_list;
|
||||||
|
|
||||||
/* Thread contexts */
|
/* Thread contexts */
|
||||||
struct list_head tc_list;
|
struct list_head tc_list;
|
||||||
} vpecontrol;
|
} vpecontrol = {
|
||||||
|
.vpe_list = LIST_HEAD_INIT(vpecontrol.vpe_list),
|
||||||
|
.tc_list = LIST_HEAD_INIT(vpecontrol.tc_list)
|
||||||
|
};
|
||||||
|
|
||||||
static void release_progmem(void *ptr);
|
static void release_progmem(void *ptr);
|
||||||
/* static __attribute_used__ void dump_vpe(struct vpe * v); */
|
/* static __attribute_used__ void dump_vpe(struct vpe * v); */
|
||||||
|
@ -1388,8 +1391,6 @@ static int __init vpe_module_init(void)
|
||||||
|
|
||||||
/* dump_mtregs(); */
|
/* dump_mtregs(); */
|
||||||
|
|
||||||
INIT_LIST_HEAD(&vpecontrol.vpe_list);
|
|
||||||
INIT_LIST_HEAD(&vpecontrol.tc_list);
|
|
||||||
|
|
||||||
val = read_c0_mvpconf0();
|
val = read_c0_mvpconf0();
|
||||||
for (i = 0; i < ((val & MVPCONF0_PTC) + 1); i++) {
|
for (i = 0; i < ((val & MVPCONF0_PTC) + 1); i++) {
|
||||||
|
|
|
@ -19,5 +19,6 @@
|
||||||
# under Linux.
|
# under Linux.
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y := malta_int.o malta_mtd.o malta_setup.o
|
obj-y := malta_int.o malta_setup.o
|
||||||
|
obj-$(CONFIG_MTD) += malta_mtd.o
|
||||||
obj-$(CONFIG_SMP) += malta_smp.o
|
obj-$(CONFIG_SMP) += malta_smp.o
|
||||||
|
|
|
@ -57,7 +57,7 @@ void __init plat_mem_setup(void)
|
||||||
board_time_init = sim_time_init;
|
board_time_init = sim_time_init;
|
||||||
prom_printf("Linux started...\n");
|
prom_printf("Linux started...\n");
|
||||||
|
|
||||||
#ifdef CONFIG_MT_SMP
|
#ifdef CONFIG_MIPS_MT_SMP
|
||||||
sanitize_tlb_entries();
|
sanitize_tlb_entries();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -501,7 +501,8 @@ void free_initmem(void)
|
||||||
|
|
||||||
freed = prom_free_prom_memory();
|
freed = prom_free_prom_memory();
|
||||||
if (freed)
|
if (freed)
|
||||||
printk(KERN_INFO "Freeing firmware memory: %ldk freed\n",freed);
|
printk(KERN_INFO "Freeing firmware memory: %ldkb freed\n",
|
||||||
|
freed >> 10);
|
||||||
|
|
||||||
free_init_pages("unused kernel memory",
|
free_init_pages("unused kernel memory",
|
||||||
__pa_symbol(&__init_begin),
|
__pa_symbol(&__init_begin),
|
||||||
|
|
|
@ -28,7 +28,7 @@ struct callvectors* debug_vectors;
|
||||||
extern unsigned long marvell_base;
|
extern unsigned long marvell_base;
|
||||||
extern unsigned long bus_clock;
|
extern unsigned long bus_clock;
|
||||||
|
|
||||||
#ifdef CONFIG_GALILLEO_GT64240_ETH
|
#ifdef CONFIG_GALILEO_GT64240_ETH
|
||||||
extern unsigned char prom_mac_addr_base[6];
|
extern unsigned char prom_mac_addr_base[6];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ void __init prom_init(void)
|
||||||
mips_machgroup = MACH_GROUP_MOMENCO;
|
mips_machgroup = MACH_GROUP_MOMENCO;
|
||||||
mips_machtype = MACH_MOMENCO_OCELOT_G;
|
mips_machtype = MACH_MOMENCO_OCELOT_G;
|
||||||
|
|
||||||
#ifdef CONFIG_GALILLEO_GT64240_ETH
|
#ifdef CONFIG_GALILEO_GT64240_ETH
|
||||||
/* get the base MAC address for on-board ethernet ports */
|
/* get the base MAC address for on-board ethernet ports */
|
||||||
memcpy(prom_mac_addr_base, (void*)0xfc807cf2, 6);
|
memcpy(prom_mac_addr_base, (void*)0xfc807cf2, 6);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#include "ocelot_pld.h"
|
#include "ocelot_pld.h"
|
||||||
|
|
||||||
#ifdef CONFIG_GALILLEO_GT64240_ETH
|
#ifdef CONFIG_GALILEO_GT64240_ETH
|
||||||
extern unsigned char prom_mac_addr_base[6];
|
extern unsigned char prom_mac_addr_base[6];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ void __init plat_mem_setup(void)
|
||||||
/* do handoff reconfiguration */
|
/* do handoff reconfiguration */
|
||||||
PMON_v2_setup();
|
PMON_v2_setup();
|
||||||
|
|
||||||
#ifdef CONFIG_GALILLEO_GT64240_ETH
|
#ifdef CONFIG_GALILEO_GT64240_ETH
|
||||||
/* get the mac addr */
|
/* get the mac addr */
|
||||||
memcpy(prom_mac_addr_base, (void*)0xfc807cf2, 6);
|
memcpy(prom_mac_addr_base, (void*)0xfc807cf2, 6);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Interrupt handing routines for NEC VR4100 series.
|
* Interrupt handing routines for NEC VR4100 series.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
|
* Copyright (C) 2005-2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -73,13 +73,19 @@ static void irq_dispatch(unsigned int irq)
|
||||||
if (cascade->get_irq != NULL) {
|
if (cascade->get_irq != NULL) {
|
||||||
unsigned int source_irq = irq;
|
unsigned int source_irq = irq;
|
||||||
desc = irq_desc + source_irq;
|
desc = irq_desc + source_irq;
|
||||||
|
if (desc->chip->mask_ack)
|
||||||
|
desc->chip->mask_ack(source_irq);
|
||||||
|
else {
|
||||||
|
desc->chip->mask(source_irq);
|
||||||
desc->chip->ack(source_irq);
|
desc->chip->ack(source_irq);
|
||||||
|
}
|
||||||
irq = cascade->get_irq(irq);
|
irq = cascade->get_irq(irq);
|
||||||
if (irq < 0)
|
if (irq < 0)
|
||||||
atomic_inc(&irq_err_count);
|
atomic_inc(&irq_err_count);
|
||||||
else
|
else
|
||||||
irq_dispatch(irq);
|
irq_dispatch(irq);
|
||||||
desc->chip->end(source_irq);
|
if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
|
||||||
|
desc->chip->unmask(source_irq);
|
||||||
} else
|
} else
|
||||||
do_IRQ(irq);
|
do_IRQ(irq);
|
||||||
}
|
}
|
||||||
|
|
|
@ -492,6 +492,7 @@ config PPC_MAPLE
|
||||||
select PPC_NATIVE
|
select PPC_NATIVE
|
||||||
select PPC_RTAS
|
select PPC_RTAS
|
||||||
select MMIO_NVRAM
|
select MMIO_NVRAM
|
||||||
|
select ATA_NONSTANDARD if ATA
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
This option enables support for the Maple 970FX Evaluation Board.
|
This option enables support for the Maple 970FX Evaluation Board.
|
||||||
|
@ -533,12 +534,15 @@ config PPC_IBM_CELL_BLADE
|
||||||
select UDBG_RTAS_CONSOLE
|
select UDBG_RTAS_CONSOLE
|
||||||
|
|
||||||
config PPC_PS3
|
config PPC_PS3
|
||||||
bool "Sony PS3"
|
bool "Sony PS3 (incomplete)"
|
||||||
depends on PPC_MULTIPLATFORM && PPC64
|
depends on PPC_MULTIPLATFORM && PPC64
|
||||||
select PPC_CELL
|
select PPC_CELL
|
||||||
help
|
help
|
||||||
This option enables support for the Sony PS3 game console
|
This option enables support for the Sony PS3 game console
|
||||||
and other platforms using the PS3 hypervisor.
|
and other platforms using the PS3 hypervisor.
|
||||||
|
Support for this platform is not yet complete, so
|
||||||
|
enabling this will not result in a bootable kernel on a
|
||||||
|
PS3 system.
|
||||||
|
|
||||||
config PPC_CELLEB
|
config PPC_CELLEB
|
||||||
bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
|
bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
|
||||||
|
@ -1202,7 +1206,7 @@ source "arch/powerpc/oprofile/Kconfig"
|
||||||
|
|
||||||
config KPROBES
|
config KPROBES
|
||||||
bool "Kprobes (EXPERIMENTAL)"
|
bool "Kprobes (EXPERIMENTAL)"
|
||||||
depends on PPC64 && KALLSYMS && EXPERIMENTAL && MODULES
|
depends on !BOOKE && !4xx && KALLSYMS && EXPERIMENTAL && MODULES
|
||||||
help
|
help
|
||||||
Kprobes allows you to trap at almost any kernel address and
|
Kprobes allows you to trap at almost any kernel address and
|
||||||
execute a callback function. register_kprobe() establishes
|
execute a callback function. register_kprobe() establishes
|
||||||
|
|
|
@ -46,8 +46,8 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
||||||
if ((unsigned long)p->addr & 0x03) {
|
if ((unsigned long)p->addr & 0x03) {
|
||||||
printk("Attempt to register kprobe at an unaligned address\n");
|
printk("Attempt to register kprobe at an unaligned address\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
} else if (IS_MTMSRD(insn) || IS_RFID(insn)) {
|
} else if (IS_MTMSRD(insn) || IS_RFID(insn) || IS_RFI(insn)) {
|
||||||
printk("Cannot register a kprobe on rfid or mtmsrd\n");
|
printk("Cannot register a kprobe on rfi/rfid or mtmsr[d]\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,8 +483,12 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs));
|
memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs));
|
||||||
|
|
||||||
/* setup return addr to the jprobe handler routine */
|
/* setup return addr to the jprobe handler routine */
|
||||||
|
#ifdef CONFIG_PPC64
|
||||||
regs->nip = (unsigned long)(((func_descr_t *)jp->entry)->entry);
|
regs->nip = (unsigned long)(((func_descr_t *)jp->entry)->entry);
|
||||||
regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
|
regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
|
||||||
|
#else
|
||||||
|
regs->nip = (unsigned long)jp->entry;
|
||||||
|
#endif
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1429,7 +1429,7 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus,
|
||||||
|
|
||||||
for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) {
|
for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) {
|
||||||
bus = pci_bus_b(ln);
|
bus = pci_bus_b(ln);
|
||||||
if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate))
|
if (in_bus >= bus->number && in_bus <= bus->subordinate)
|
||||||
break;
|
break;
|
||||||
bus = NULL;
|
bus = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -535,34 +535,40 @@ static void emulate_single_step(struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_fpe(struct pt_regs *regs)
|
static inline int __parse_fpscr(unsigned long fpscr)
|
||||||
{
|
{
|
||||||
int code = 0;
|
int ret = 0;
|
||||||
unsigned long fpscr;
|
|
||||||
|
|
||||||
flush_fp_to_thread(current);
|
|
||||||
|
|
||||||
fpscr = current->thread.fpscr.val;
|
|
||||||
|
|
||||||
/* Invalid operation */
|
/* Invalid operation */
|
||||||
if ((fpscr & FPSCR_VE) && (fpscr & FPSCR_VX))
|
if ((fpscr & FPSCR_VE) && (fpscr & FPSCR_VX))
|
||||||
code = FPE_FLTINV;
|
ret = FPE_FLTINV;
|
||||||
|
|
||||||
/* Overflow */
|
/* Overflow */
|
||||||
else if ((fpscr & FPSCR_OE) && (fpscr & FPSCR_OX))
|
else if ((fpscr & FPSCR_OE) && (fpscr & FPSCR_OX))
|
||||||
code = FPE_FLTOVF;
|
ret = FPE_FLTOVF;
|
||||||
|
|
||||||
/* Underflow */
|
/* Underflow */
|
||||||
else if ((fpscr & FPSCR_UE) && (fpscr & FPSCR_UX))
|
else if ((fpscr & FPSCR_UE) && (fpscr & FPSCR_UX))
|
||||||
code = FPE_FLTUND;
|
ret = FPE_FLTUND;
|
||||||
|
|
||||||
/* Divide by zero */
|
/* Divide by zero */
|
||||||
else if ((fpscr & FPSCR_ZE) && (fpscr & FPSCR_ZX))
|
else if ((fpscr & FPSCR_ZE) && (fpscr & FPSCR_ZX))
|
||||||
code = FPE_FLTDIV;
|
ret = FPE_FLTDIV;
|
||||||
|
|
||||||
/* Inexact result */
|
/* Inexact result */
|
||||||
else if ((fpscr & FPSCR_XE) && (fpscr & FPSCR_XX))
|
else if ((fpscr & FPSCR_XE) && (fpscr & FPSCR_XX))
|
||||||
code = FPE_FLTRES;
|
ret = FPE_FLTRES;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void parse_fpe(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
int code = 0;
|
||||||
|
|
||||||
|
flush_fp_to_thread(current);
|
||||||
|
|
||||||
|
code = __parse_fpscr(current->thread.fpscr.val);
|
||||||
|
|
||||||
_exception(SIGFPE, regs, code, regs->nip);
|
_exception(SIGFPE, regs, code, regs->nip);
|
||||||
}
|
}
|
||||||
|
@ -739,20 +745,7 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
||||||
extern int do_mathemu(struct pt_regs *regs);
|
extern int do_mathemu(struct pt_regs *regs);
|
||||||
|
|
||||||
/* We can now get here via a FP Unavailable exception if the core
|
/* We can now get here via a FP Unavailable exception if the core
|
||||||
* has no FPU, in that case no reason flags will be set */
|
* has no FPU, in that case the reason flags will be 0 */
|
||||||
#ifdef CONFIG_MATH_EMULATION
|
|
||||||
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
|
|
||||||
* but there seems to be a hardware bug on the 405GP (RevD)
|
|
||||||
* that means ESR is sometimes set incorrectly - either to
|
|
||||||
* ESR_DST (!?) or 0. In the process of chasing this with the
|
|
||||||
* hardware people - not sure if it can happen on any illegal
|
|
||||||
* instruction or only on FP instructions, whether there is a
|
|
||||||
* pattern to occurences etc. -dgibson 31/Mar/2003 */
|
|
||||||
if (!(reason & REASON_TRAP) && do_mathemu(regs) == 0) {
|
|
||||||
emulate_single_step(regs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_MATH_EMULATION */
|
|
||||||
|
|
||||||
if (reason & REASON_FP) {
|
if (reason & REASON_FP) {
|
||||||
/* IEEE FP exception */
|
/* IEEE FP exception */
|
||||||
|
@ -778,6 +771,31 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
||||||
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
|
#ifdef CONFIG_MATH_EMULATION
|
||||||
|
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
|
||||||
|
* but there seems to be a hardware bug on the 405GP (RevD)
|
||||||
|
* that means ESR is sometimes set incorrectly - either to
|
||||||
|
* ESR_DST (!?) or 0. In the process of chasing this with the
|
||||||
|
* hardware people - not sure if it can happen on any illegal
|
||||||
|
* instruction or only on FP instructions, whether there is a
|
||||||
|
* pattern to occurences etc. -dgibson 31/Mar/2003 */
|
||||||
|
switch (do_mathemu(regs)) {
|
||||||
|
case 0:
|
||||||
|
emulate_single_step(regs);
|
||||||
|
return;
|
||||||
|
case 1: {
|
||||||
|
int code = 0;
|
||||||
|
code = __parse_fpscr(current->thread.fpscr.val);
|
||||||
|
_exception(SIGFPE, regs, code, regs->nip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case -EFAULT:
|
||||||
|
_exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* fall through on any other errors */
|
||||||
|
#endif /* CONFIG_MATH_EMULATION */
|
||||||
|
|
||||||
/* Try to emulate it if we should. */
|
/* Try to emulate it if we should. */
|
||||||
if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
|
if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
|
||||||
switch (emulate_instruction(regs)) {
|
switch (emulate_instruction(regs)) {
|
||||||
|
@ -891,18 +909,39 @@ void SoftwareEmulation(struct pt_regs *regs)
|
||||||
|
|
||||||
#ifdef CONFIG_MATH_EMULATION
|
#ifdef CONFIG_MATH_EMULATION
|
||||||
errcode = do_mathemu(regs);
|
errcode = do_mathemu(regs);
|
||||||
|
|
||||||
|
switch (errcode) {
|
||||||
|
case 0:
|
||||||
|
emulate_single_step(regs);
|
||||||
|
return;
|
||||||
|
case 1: {
|
||||||
|
int code = 0;
|
||||||
|
code = __parse_fpscr(current->thread.fpscr.val);
|
||||||
|
_exception(SIGFPE, regs, code, regs->nip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case -EFAULT:
|
||||||
|
_exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
errcode = Soft_emulate_8xx(regs);
|
errcode = Soft_emulate_8xx(regs);
|
||||||
#endif
|
switch (errcode) {
|
||||||
if (errcode) {
|
case 0:
|
||||||
if (errcode > 0)
|
|
||||||
_exception(SIGFPE, regs, 0, 0);
|
|
||||||
else if (errcode == -EFAULT)
|
|
||||||
_exception(SIGSEGV, regs, 0, 0);
|
|
||||||
else
|
|
||||||
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
|
||||||
} else
|
|
||||||
emulate_single_step(regs);
|
emulate_single_step(regs);
|
||||||
|
return;
|
||||||
|
case 1:
|
||||||
|
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
||||||
|
return;
|
||||||
|
case -EFAULT:
|
||||||
|
_exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_8xx */
|
#endif /* CONFIG_8xx */
|
||||||
|
|
||||||
|
|
|
@ -284,6 +284,13 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
|
||||||
* pages though
|
* pages though
|
||||||
*/
|
*/
|
||||||
vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC;
|
vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC;
|
||||||
|
/*
|
||||||
|
* Make sure the vDSO gets into every core dump.
|
||||||
|
* Dumping its contents makes post-mortem fully interpretable later
|
||||||
|
* without matching up the same kernel and hardware config to see
|
||||||
|
* what PC values meant.
|
||||||
|
*/
|
||||||
|
vma->vm_flags |= VM_ALWAYSDUMP;
|
||||||
vma->vm_flags |= mm->def_flags;
|
vma->vm_flags |= mm->def_flags;
|
||||||
vma->vm_page_prot = protection_map[vma->vm_flags & 0x7];
|
vma->vm_page_prot = protection_map[vma->vm_flags & 0x7];
|
||||||
vma->vm_ops = &vdso_vmops;
|
vma->vm_ops = &vdso_vmops;
|
||||||
|
|
|
@ -16,11 +16,11 @@ obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \
|
||||||
strcase.o
|
strcase.o
|
||||||
obj-$(CONFIG_QUICC_ENGINE) += rheap.o
|
obj-$(CONFIG_QUICC_ENGINE) += rheap.o
|
||||||
obj-$(CONFIG_XMON) += sstep.o
|
obj-$(CONFIG_XMON) += sstep.o
|
||||||
|
obj-$(CONFIG_KPROBES) += sstep.o
|
||||||
obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o
|
obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_PPC64),y)
|
ifeq ($(CONFIG_PPC64),y)
|
||||||
obj-$(CONFIG_SMP) += locks.o
|
obj-$(CONFIG_SMP) += locks.o
|
||||||
obj-$(CONFIG_DEBUG_KERNEL) += sstep.o
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Temporary hack until we have migrated to asm-powerpc
|
# Temporary hack until we have migrated to asm-powerpc
|
||||||
|
|
|
@ -54,6 +54,7 @@ void (*pm_idle)(void);
|
||||||
* handler when auxio is not present-- unused for now...
|
* handler when auxio is not present-- unused for now...
|
||||||
*/
|
*/
|
||||||
void (*pm_power_off)(void) = machine_power_off;
|
void (*pm_power_off)(void) = machine_power_off;
|
||||||
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sysctl - toggle power-off restriction for serial console
|
* sysctl - toggle power-off restriction for serial console
|
||||||
|
|
|
@ -292,8 +292,8 @@ int setup_profiling_timer(unsigned int multiplier)
|
||||||
|
|
||||||
void __init smp_prepare_cpus(unsigned int max_cpus)
|
void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||||
{
|
{
|
||||||
extern void smp4m_boot_cpus(void);
|
extern void __init smp4m_boot_cpus(void);
|
||||||
extern void smp4d_boot_cpus(void);
|
extern void __init smp4d_boot_cpus(void);
|
||||||
int i, cpuid, extra;
|
int i, cpuid, extra;
|
||||||
|
|
||||||
printk("Entering SMP Mode...\n");
|
printk("Entering SMP Mode...\n");
|
||||||
|
@ -375,8 +375,8 @@ void __init smp_prepare_boot_cpu(void)
|
||||||
|
|
||||||
int __cpuinit __cpu_up(unsigned int cpu)
|
int __cpuinit __cpu_up(unsigned int cpu)
|
||||||
{
|
{
|
||||||
extern int smp4m_boot_one_cpu(int);
|
extern int __cpuinit smp4m_boot_one_cpu(int);
|
||||||
extern int smp4d_boot_one_cpu(int);
|
extern int __cpuinit smp4d_boot_one_cpu(int);
|
||||||
int ret=0;
|
int ret=0;
|
||||||
|
|
||||||
switch(sparc_cpu_model) {
|
switch(sparc_cpu_model) {
|
||||||
|
|
|
@ -164,7 +164,7 @@ void __init smp4d_boot_cpus(void)
|
||||||
local_flush_cache_all();
|
local_flush_cache_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
int smp4d_boot_one_cpu(int i)
|
int __cpuinit smp4d_boot_one_cpu(int i)
|
||||||
{
|
{
|
||||||
extern unsigned long sun4d_cpu_startup;
|
extern unsigned long sun4d_cpu_startup;
|
||||||
unsigned long *entry = &sun4d_cpu_startup;
|
unsigned long *entry = &sun4d_cpu_startup;
|
||||||
|
|
|
@ -142,9 +142,9 @@ sun4v_dtlb_prot:
|
||||||
rdpr %tl, %g1
|
rdpr %tl, %g1
|
||||||
cmp %g1, 1
|
cmp %g1, 1
|
||||||
bgu,pn %xcc, winfix_trampoline
|
bgu,pn %xcc, winfix_trampoline
|
||||||
nop
|
|
||||||
ba,pt %xcc, sparc64_realfault_common
|
|
||||||
mov FAULT_CODE_DTLB | FAULT_CODE_WRITE, %g4
|
mov FAULT_CODE_DTLB | FAULT_CODE_WRITE, %g4
|
||||||
|
ba,pt %xcc, sparc64_realfault_common
|
||||||
|
nop
|
||||||
|
|
||||||
/* Called from trap table:
|
/* Called from trap table:
|
||||||
* %g4: vaddr
|
* %g4: vaddr
|
||||||
|
|
|
@ -19,7 +19,7 @@ config SEMAPHORE_SLEEPERS
|
||||||
choice
|
choice
|
||||||
prompt "Host memory split"
|
prompt "Host memory split"
|
||||||
default HOST_VMSPLIT_3G
|
default HOST_VMSPLIT_3G
|
||||||
---help---
|
help
|
||||||
This is needed when the host kernel on which you run has a non-default
|
This is needed when the host kernel on which you run has a non-default
|
||||||
(like 2G/2G) memory split, instead of the customary 3G/1G. If you did
|
(like 2G/2G) memory split, instead of the customary 3G/1G. If you did
|
||||||
not recompile your own kernel but use the default distro's one, you can
|
not recompile your own kernel but use the default distro's one, you can
|
||||||
|
@ -36,13 +36,13 @@ choice
|
||||||
|
|
||||||
So, if you do not know what to do here, say 'Default split'.
|
So, if you do not know what to do here, say 'Default split'.
|
||||||
|
|
||||||
config HOST_VMSPLIT_3G
|
config HOST_VMSPLIT_3G
|
||||||
bool "Default split (3G/1G user/kernel host split)"
|
bool "Default split (3G/1G user/kernel host split)"
|
||||||
config HOST_VMSPLIT_3G_OPT
|
config HOST_VMSPLIT_3G_OPT
|
||||||
bool "3G/1G user/kernel host split (for full 1G low memory)"
|
bool "3G/1G user/kernel host split (for full 1G low memory)"
|
||||||
config HOST_VMSPLIT_2G
|
config HOST_VMSPLIT_2G
|
||||||
bool "2G/2G user/kernel host split"
|
bool "2G/2G user/kernel host split"
|
||||||
config HOST_VMSPLIT_1G
|
config HOST_VMSPLIT_1G
|
||||||
bool "1G/3G user/kernel host split"
|
bool "1G/3G user/kernel host split"
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
@ -67,13 +67,13 @@ config 3_LEVEL_PGTABLES
|
||||||
|
|
||||||
config STUB_CODE
|
config STUB_CODE
|
||||||
hex
|
hex
|
||||||
default 0xbfffe000 if !HOST_2G_2G
|
default 0xbfffe000 if !HOST_VMSPLIT_2G
|
||||||
default 0x7fffe000 if HOST_2G_2G
|
default 0x7fffe000 if HOST_VMSPLIT_2G
|
||||||
|
|
||||||
config STUB_DATA
|
config STUB_DATA
|
||||||
hex
|
hex
|
||||||
default 0xbffff000 if !HOST_2G_2G
|
default 0xbffff000 if !HOST_VMSPLIT_2G
|
||||||
default 0x7ffff000 if HOST_2G_2G
|
default 0x7ffff000 if HOST_VMSPLIT_2G
|
||||||
|
|
||||||
config STUB_START
|
config STUB_START
|
||||||
hex
|
hex
|
||||||
|
|
|
@ -219,7 +219,8 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig,
|
||||||
unsigned long save_sp = PT_REGS_SP(regs);
|
unsigned long save_sp = PT_REGS_SP(regs);
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
stack_top &= -8UL;
|
/* This is the same calculation as i386 - ((sp + 4) & 15) == 0 */
|
||||||
|
stack_top = ((stack_top + 4) & -16UL) - 4;
|
||||||
frame = (struct sigframe __user *) stack_top - 1;
|
frame = (struct sigframe __user *) stack_top - 1;
|
||||||
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -191,8 +191,9 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
|
||||||
struct task_struct *me = current;
|
struct task_struct *me = current;
|
||||||
|
|
||||||
frame = (struct rt_sigframe __user *)
|
frame = (struct rt_sigframe __user *)
|
||||||
round_down(stack_top - sizeof(struct rt_sigframe), 16) - 8;
|
round_down(stack_top - sizeof(struct rt_sigframe), 16);
|
||||||
frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128);
|
/* Subtract 128 for a red zone and 8 for proper alignment */
|
||||||
|
frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128 - 8);
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate)))
|
if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate)))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -64,55 +64,6 @@ typedef unsigned int elf_greg_t;
|
||||||
#define ELF_NGREG (sizeof (struct user_regs_struct32) / sizeof(elf_greg_t))
|
#define ELF_NGREG (sizeof (struct user_regs_struct32) / sizeof(elf_greg_t))
|
||||||
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
||||||
|
|
||||||
/*
|
|
||||||
* These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out
|
|
||||||
* extra segments containing the vsyscall DSO contents. Dumping its
|
|
||||||
* contents makes post-mortem fully interpretable later without matching up
|
|
||||||
* the same kernel and hardware config to see what PC values meant.
|
|
||||||
* Dumping its extra ELF program headers includes all the other information
|
|
||||||
* a debugger needs to easily find how the vsyscall DSO was being used.
|
|
||||||
*/
|
|
||||||
#define ELF_CORE_EXTRA_PHDRS (find_vma(current->mm, VSYSCALL32_BASE) ? \
|
|
||||||
(VSYSCALL32_EHDR->e_phnum) : 0)
|
|
||||||
#define ELF_CORE_WRITE_EXTRA_PHDRS \
|
|
||||||
do { \
|
|
||||||
if (find_vma(current->mm, VSYSCALL32_BASE)) { \
|
|
||||||
const struct elf32_phdr *const vsyscall_phdrs = \
|
|
||||||
(const struct elf32_phdr *) (VSYSCALL32_BASE \
|
|
||||||
+ VSYSCALL32_EHDR->e_phoff);\
|
|
||||||
int i; \
|
|
||||||
Elf32_Off ofs = 0; \
|
|
||||||
for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \
|
|
||||||
struct elf32_phdr phdr = vsyscall_phdrs[i]; \
|
|
||||||
if (phdr.p_type == PT_LOAD) { \
|
|
||||||
BUG_ON(ofs != 0); \
|
|
||||||
ofs = phdr.p_offset = offset; \
|
|
||||||
phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); \
|
|
||||||
phdr.p_filesz = phdr.p_memsz; \
|
|
||||||
offset += phdr.p_filesz; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
phdr.p_offset += ofs; \
|
|
||||||
phdr.p_paddr = 0; /* match other core phdrs */ \
|
|
||||||
DUMP_WRITE(&phdr, sizeof(phdr)); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#define ELF_CORE_WRITE_EXTRA_DATA \
|
|
||||||
do { \
|
|
||||||
if (find_vma(current->mm, VSYSCALL32_BASE)) { \
|
|
||||||
const struct elf32_phdr *const vsyscall_phdrs = \
|
|
||||||
(const struct elf32_phdr *) (VSYSCALL32_BASE \
|
|
||||||
+ VSYSCALL32_EHDR->e_phoff); \
|
|
||||||
int i; \
|
|
||||||
for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \
|
|
||||||
if (vsyscall_phdrs[i].p_type == PT_LOAD) \
|
|
||||||
DUMP_WRITE((void *) (u64) vsyscall_phdrs[i].p_vaddr,\
|
|
||||||
PAGE_ALIGN(vsyscall_phdrs[i].p_memsz)); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
struct elf_siginfo
|
struct elf_siginfo
|
||||||
{
|
{
|
||||||
int si_signo; /* signal number */
|
int si_signo; /* signal number */
|
||||||
|
|
|
@ -59,6 +59,13 @@ int syscall32_setup_pages(struct linux_binprm *bprm, int exstack)
|
||||||
vma->vm_end = VSYSCALL32_END;
|
vma->vm_end = VSYSCALL32_END;
|
||||||
/* MAYWRITE to allow gdb to COW and set breakpoints */
|
/* MAYWRITE to allow gdb to COW and set breakpoints */
|
||||||
vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
|
vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
|
||||||
|
/*
|
||||||
|
* Make sure the vDSO gets into every core dump.
|
||||||
|
* Dumping its contents makes post-mortem fully interpretable later
|
||||||
|
* without matching up the same kernel and hardware config to see
|
||||||
|
* what PC values meant.
|
||||||
|
*/
|
||||||
|
vma->vm_flags |= VM_ALWAYSDUMP;
|
||||||
vma->vm_flags |= mm->def_flags;
|
vma->vm_flags |= mm->def_flags;
|
||||||
vma->vm_page_prot = protection_map[vma->vm_flags & 7];
|
vma->vm_page_prot = protection_map[vma->vm_flags & 7];
|
||||||
vma->vm_ops = &syscall32_vm_ops;
|
vma->vm_ops = &syscall32_vm_ops;
|
||||||
|
@ -75,6 +82,14 @@ int syscall32_setup_pages(struct linux_binprm *bprm, int exstack)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *arch_vma_name(struct vm_area_struct *vma)
|
||||||
|
{
|
||||||
|
if (vma->vm_start == VSYSCALL32_BASE &&
|
||||||
|
vma->vm_mm && vma->vm_mm->task_size == IA32_PAGE_OFFSET)
|
||||||
|
return "[vdso]";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static int __init init_syscall32(void)
|
static int __init init_syscall32(void)
|
||||||
{
|
{
|
||||||
syscall32_page = (void *)get_zeroed_page(GFP_KERNEL);
|
syscall32_page = (void *)get_zeroed_page(GFP_KERNEL);
|
||||||
|
|
|
@ -302,8 +302,6 @@ int __init setup_nmi_watchdog(char *str)
|
||||||
if ((nmi >= NMI_INVALID) || (nmi < NMI_NONE))
|
if ((nmi >= NMI_INVALID) || (nmi < NMI_NONE))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((nmi == NMI_LOCAL_APIC) && (nmi_known_cpu() == 0))
|
|
||||||
return 0; /* no lapic support */
|
|
||||||
nmi_watchdog = nmi;
|
nmi_watchdog = nmi;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -590,6 +590,12 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
|
||||||
*/
|
*/
|
||||||
rq->cmd_flags |= REQ_SOFTBARRIER;
|
rq->cmd_flags |= REQ_SOFTBARRIER;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Most requeues happen because of a busy condition,
|
||||||
|
* don't force unplug of the queue for that case.
|
||||||
|
*/
|
||||||
|
unplug_it = 0;
|
||||||
|
|
||||||
if (q->ordseq == 0) {
|
if (q->ordseq == 0) {
|
||||||
list_add(&rq->queuelist, &q->queue_head);
|
list_add(&rq->queuelist, &q->queue_head);
|
||||||
break;
|
break;
|
||||||
|
@ -604,11 +610,6 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
|
||||||
}
|
}
|
||||||
|
|
||||||
list_add_tail(&rq->queuelist, pos);
|
list_add_tail(&rq->queuelist, pos);
|
||||||
/*
|
|
||||||
* most requeues happen because of a busy condition, don't
|
|
||||||
* force unplug of the queue for that case.
|
|
||||||
*/
|
|
||||||
unplug_it = 0;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -223,7 +223,7 @@ static int verify_command(struct file *file, unsigned char *cmd)
|
||||||
static int sg_io(struct file *file, request_queue_t *q,
|
static int sg_io(struct file *file, request_queue_t *q,
|
||||||
struct gendisk *bd_disk, struct sg_io_hdr *hdr)
|
struct gendisk *bd_disk, struct sg_io_hdr *hdr)
|
||||||
{
|
{
|
||||||
unsigned long start_time;
|
unsigned long start_time, timeout;
|
||||||
int writing = 0, ret = 0;
|
int writing = 0, ret = 0;
|
||||||
struct request *rq;
|
struct request *rq;
|
||||||
char sense[SCSI_SENSE_BUFFERSIZE];
|
char sense[SCSI_SENSE_BUFFERSIZE];
|
||||||
|
@ -271,7 +271,8 @@ static int sg_io(struct file *file, request_queue_t *q,
|
||||||
|
|
||||||
rq->cmd_type = REQ_TYPE_BLOCK_PC;
|
rq->cmd_type = REQ_TYPE_BLOCK_PC;
|
||||||
|
|
||||||
rq->timeout = jiffies_to_msecs(hdr->timeout);
|
timeout = msecs_to_jiffies(hdr->timeout);
|
||||||
|
rq->timeout = (timeout < INT_MAX) ? timeout : INT_MAX;
|
||||||
if (!rq->timeout)
|
if (!rq->timeout)
|
||||||
rq->timeout = q->sg_timeout;
|
rq->timeout = q->sg_timeout;
|
||||||
if (!rq->timeout)
|
if (!rq->timeout)
|
||||||
|
|
|
@ -322,10 +322,6 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
result = acpi_processor_get_platform_limit(pr);
|
|
||||||
if (result)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1677,8 +1677,6 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
|
||||||
struct acpi_video_device *video_device = data;
|
struct acpi_video_device *video_device = data;
|
||||||
struct acpi_device *device = NULL;
|
struct acpi_device *device = NULL;
|
||||||
|
|
||||||
|
|
||||||
printk("video device notify\n");
|
|
||||||
if (!video_device)
|
if (!video_device)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,10 @@ config ATA
|
||||||
|
|
||||||
if ATA
|
if ATA
|
||||||
|
|
||||||
|
config ATA_NONSTANDARD
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
config SATA_AHCI
|
config SATA_AHCI
|
||||||
tristate "AHCI SATA support"
|
tristate "AHCI SATA support"
|
||||||
depends on PCI
|
depends on PCI
|
||||||
|
|
|
@ -75,6 +75,7 @@ enum {
|
||||||
AHCI_CMD_CLR_BUSY = (1 << 10),
|
AHCI_CMD_CLR_BUSY = (1 << 10),
|
||||||
|
|
||||||
RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */
|
RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */
|
||||||
|
RX_FIS_SDB = 0x58, /* offset of SDB FIS data */
|
||||||
RX_FIS_UNK = 0x60, /* offset of Unknown FIS data */
|
RX_FIS_UNK = 0x60, /* offset of Unknown FIS data */
|
||||||
|
|
||||||
board_ahci = 0,
|
board_ahci = 0,
|
||||||
|
@ -202,6 +203,10 @@ struct ahci_port_priv {
|
||||||
dma_addr_t cmd_tbl_dma;
|
dma_addr_t cmd_tbl_dma;
|
||||||
void *rx_fis;
|
void *rx_fis;
|
||||||
dma_addr_t rx_fis_dma;
|
dma_addr_t rx_fis_dma;
|
||||||
|
/* for NCQ spurious interrupt analysis */
|
||||||
|
int ncq_saw_spurious_sdb_cnt;
|
||||||
|
unsigned int ncq_saw_d2h:1;
|
||||||
|
unsigned int ncq_saw_dmas:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg);
|
static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg);
|
||||||
|
@ -361,7 +366,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||||
{ PCI_VDEVICE(INTEL, 0x27c1), board_ahci }, /* ICH7 */
|
{ PCI_VDEVICE(INTEL, 0x27c1), board_ahci }, /* ICH7 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x27c5), board_ahci }, /* ICH7M */
|
{ PCI_VDEVICE(INTEL, 0x27c5), board_ahci }, /* ICH7M */
|
||||||
{ PCI_VDEVICE(INTEL, 0x27c3), board_ahci }, /* ICH7R */
|
{ PCI_VDEVICE(INTEL, 0x27c3), board_ahci }, /* ICH7R */
|
||||||
{ PCI_VDEVICE(AL, 0x5288), board_ahci }, /* ULi M5288 */
|
{ PCI_VDEVICE(AL, 0x5288), board_ahci_ign_iferr }, /* ULi M5288 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x2681), board_ahci }, /* ESB2 */
|
{ PCI_VDEVICE(INTEL, 0x2681), board_ahci }, /* ESB2 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x2682), board_ahci }, /* ESB2 */
|
{ PCI_VDEVICE(INTEL, 0x2682), board_ahci }, /* ESB2 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x2683), board_ahci }, /* ESB2 */
|
{ PCI_VDEVICE(INTEL, 0x2683), board_ahci }, /* ESB2 */
|
||||||
|
@ -586,35 +591,18 @@ static void ahci_power_down(void __iomem *port_mmio, u32 cap)
|
||||||
{
|
{
|
||||||
u32 cmd, scontrol;
|
u32 cmd, scontrol;
|
||||||
|
|
||||||
cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK;
|
if (!(cap & HOST_CAP_SSS))
|
||||||
|
return;
|
||||||
|
|
||||||
if (cap & HOST_CAP_SSC) {
|
/* put device into listen mode, first set PxSCTL.DET to 0 */
|
||||||
/* enable transitions to slumber mode */
|
|
||||||
scontrol = readl(port_mmio + PORT_SCR_CTL);
|
|
||||||
if ((scontrol & 0x0f00) > 0x100) {
|
|
||||||
scontrol &= ~0xf00;
|
|
||||||
writel(scontrol, port_mmio + PORT_SCR_CTL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* put device into slumber mode */
|
|
||||||
writel(cmd | PORT_CMD_ICC_SLUMBER, port_mmio + PORT_CMD);
|
|
||||||
|
|
||||||
/* wait for the transition to complete */
|
|
||||||
ata_wait_register(port_mmio + PORT_CMD, PORT_CMD_ICC_SLUMBER,
|
|
||||||
PORT_CMD_ICC_SLUMBER, 1, 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* put device into listen mode */
|
|
||||||
if (cap & HOST_CAP_SSS) {
|
|
||||||
/* first set PxSCTL.DET to 0 */
|
|
||||||
scontrol = readl(port_mmio + PORT_SCR_CTL);
|
scontrol = readl(port_mmio + PORT_SCR_CTL);
|
||||||
scontrol &= ~0xf;
|
scontrol &= ~0xf;
|
||||||
writel(scontrol, port_mmio + PORT_SCR_CTL);
|
writel(scontrol, port_mmio + PORT_SCR_CTL);
|
||||||
|
|
||||||
/* then set PxCMD.SUD to 0 */
|
/* then set PxCMD.SUD to 0 */
|
||||||
|
cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK;
|
||||||
cmd &= ~PORT_CMD_SPIN_UP;
|
cmd &= ~PORT_CMD_SPIN_UP;
|
||||||
writel(cmd, port_mmio + PORT_CMD);
|
writel(cmd, port_mmio + PORT_CMD);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ahci_init_port(void __iomem *port_mmio, u32 cap,
|
static void ahci_init_port(void __iomem *port_mmio, u32 cap,
|
||||||
|
@ -915,7 +903,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class)
|
||||||
|
|
||||||
/* clear D2H reception area to properly wait for D2H FIS */
|
/* clear D2H reception area to properly wait for D2H FIS */
|
||||||
ata_tf_init(ap->device, &tf);
|
ata_tf_init(ap->device, &tf);
|
||||||
tf.command = 0xff;
|
tf.command = 0x80;
|
||||||
ata_tf_to_fis(&tf, d2h_fis, 0);
|
ata_tf_to_fis(&tf, d2h_fis, 0);
|
||||||
|
|
||||||
rc = sata_std_hardreset(ap, class);
|
rc = sata_std_hardreset(ap, class);
|
||||||
|
@ -1126,8 +1114,9 @@ static void ahci_host_intr(struct ata_port *ap)
|
||||||
void __iomem *mmio = ap->host->mmio_base;
|
void __iomem *mmio = ap->host->mmio_base;
|
||||||
void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
|
void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
|
||||||
struct ata_eh_info *ehi = &ap->eh_info;
|
struct ata_eh_info *ehi = &ap->eh_info;
|
||||||
|
struct ahci_port_priv *pp = ap->private_data;
|
||||||
u32 status, qc_active;
|
u32 status, qc_active;
|
||||||
int rc;
|
int rc, known_irq = 0;
|
||||||
|
|
||||||
status = readl(port_mmio + PORT_IRQ_STAT);
|
status = readl(port_mmio + PORT_IRQ_STAT);
|
||||||
writel(status, port_mmio + PORT_IRQ_STAT);
|
writel(status, port_mmio + PORT_IRQ_STAT);
|
||||||
|
@ -1154,17 +1143,53 @@ static void ahci_host_intr(struct ata_port *ap)
|
||||||
|
|
||||||
/* hmmm... a spurious interupt */
|
/* hmmm... a spurious interupt */
|
||||||
|
|
||||||
/* some devices send D2H reg with I bit set during NCQ command phase */
|
/* if !NCQ, ignore. No modern ATA device has broken HSM
|
||||||
if (ap->sactive && (status & PORT_IRQ_D2H_REG_FIS))
|
* implementation for non-NCQ commands.
|
||||||
|
*/
|
||||||
|
if (!ap->sactive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* ignore interim PIO setup fis interrupts */
|
if (status & PORT_IRQ_D2H_REG_FIS) {
|
||||||
if (ata_tag_valid(ap->active_tag) && (status & PORT_IRQ_PIOS_FIS))
|
if (!pp->ncq_saw_d2h)
|
||||||
return;
|
ata_port_printk(ap, KERN_INFO,
|
||||||
|
"D2H reg with I during NCQ, "
|
||||||
|
"this message won't be printed again\n");
|
||||||
|
pp->ncq_saw_d2h = 1;
|
||||||
|
known_irq = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (ata_ratelimit())
|
if (status & PORT_IRQ_DMAS_FIS) {
|
||||||
|
if (!pp->ncq_saw_dmas)
|
||||||
|
ata_port_printk(ap, KERN_INFO,
|
||||||
|
"DMAS FIS during NCQ, "
|
||||||
|
"this message won't be printed again\n");
|
||||||
|
pp->ncq_saw_dmas = 1;
|
||||||
|
known_irq = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status & PORT_IRQ_SDB_FIS &&
|
||||||
|
pp->ncq_saw_spurious_sdb_cnt < 10) {
|
||||||
|
/* SDB FIS containing spurious completions might be
|
||||||
|
* dangerous, we need to know more about them. Print
|
||||||
|
* more of it.
|
||||||
|
*/
|
||||||
|
const u32 *f = pp->rx_fis + RX_FIS_SDB;
|
||||||
|
|
||||||
|
ata_port_printk(ap, KERN_INFO, "Spurious SDB FIS during NCQ "
|
||||||
|
"issue=0x%x SAct=0x%x FIS=%08x:%08x%s\n",
|
||||||
|
readl(port_mmio + PORT_CMD_ISSUE),
|
||||||
|
readl(port_mmio + PORT_SCR_ACT),
|
||||||
|
le32_to_cpu(f[0]), le32_to_cpu(f[1]),
|
||||||
|
pp->ncq_saw_spurious_sdb_cnt < 10 ?
|
||||||
|
"" : ", shutting up");
|
||||||
|
|
||||||
|
pp->ncq_saw_spurious_sdb_cnt++;
|
||||||
|
known_irq = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!known_irq)
|
||||||
ata_port_printk(ap, KERN_INFO, "spurious interrupt "
|
ata_port_printk(ap, KERN_INFO, "spurious interrupt "
|
||||||
"(irq_stat 0x%x active_tag %d sactive 0x%x)\n",
|
"(irq_stat 0x%x active_tag 0x%x sactive 0x%x)\n",
|
||||||
status, ap->active_tag, ap->sactive);
|
status, ap->active_tag, ap->sactive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1257,7 +1282,7 @@ static void ahci_thaw(struct ata_port *ap)
|
||||||
/* clear IRQ */
|
/* clear IRQ */
|
||||||
tmp = readl(port_mmio + PORT_IRQ_STAT);
|
tmp = readl(port_mmio + PORT_IRQ_STAT);
|
||||||
writel(tmp, port_mmio + PORT_IRQ_STAT);
|
writel(tmp, port_mmio + PORT_IRQ_STAT);
|
||||||
writel(1 << ap->id, mmio + HOST_IRQ_STAT);
|
writel(1 << ap->port_no, mmio + HOST_IRQ_STAT);
|
||||||
|
|
||||||
/* turn IRQ back on */
|
/* turn IRQ back on */
|
||||||
writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK);
|
writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK);
|
||||||
|
|
|
@ -64,6 +64,7 @@ static void generic_error_handler(struct ata_port *ap)
|
||||||
/**
|
/**
|
||||||
* generic_set_mode - mode setting
|
* generic_set_mode - mode setting
|
||||||
* @ap: interface to set up
|
* @ap: interface to set up
|
||||||
|
* @unused: returned device on error
|
||||||
*
|
*
|
||||||
* Use a non standard set_mode function. We don't want to be tuned.
|
* Use a non standard set_mode function. We don't want to be tuned.
|
||||||
* The BIOS configured everything. Our job is not to fiddle. We
|
* The BIOS configured everything. Our job is not to fiddle. We
|
||||||
|
@ -71,7 +72,7 @@ static void generic_error_handler(struct ata_port *ap)
|
||||||
* and respect them.
|
* and respect them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void generic_set_mode(struct ata_port *ap)
|
static int generic_set_mode(struct ata_port *ap, struct ata_device **unused)
|
||||||
{
|
{
|
||||||
int dma_enabled = 0;
|
int dma_enabled = 0;
|
||||||
int i;
|
int i;
|
||||||
|
@ -82,7 +83,7 @@ static void generic_set_mode(struct ata_port *ap)
|
||||||
|
|
||||||
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
||||||
struct ata_device *dev = &ap->device[i];
|
struct ata_device *dev = &ap->device[i];
|
||||||
if (ata_dev_enabled(dev)) {
|
if (ata_dev_ready(dev)) {
|
||||||
/* We don't really care */
|
/* We don't really care */
|
||||||
dev->pio_mode = XFER_PIO_0;
|
dev->pio_mode = XFER_PIO_0;
|
||||||
dev->dma_mode = XFER_MW_DMA_0;
|
dev->dma_mode = XFER_MW_DMA_0;
|
||||||
|
@ -99,6 +100,7 @@ static void generic_set_mode(struct ata_port *ap)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct scsi_host_template generic_sht = {
|
static struct scsi_host_template generic_sht = {
|
||||||
|
|
|
@ -1037,7 +1037,7 @@ static unsigned int ata_id_xfermask(const u16 *id)
|
||||||
* the PIO timing number for the maximum. Turn it into
|
* the PIO timing number for the maximum. Turn it into
|
||||||
* a mask.
|
* a mask.
|
||||||
*/
|
*/
|
||||||
u8 mode = id[ATA_ID_OLD_PIO_MODES] & 0xFF;
|
u8 mode = (id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF;
|
||||||
if (mode < 5) /* Valid PIO range */
|
if (mode < 5) /* Valid PIO range */
|
||||||
pio_mask = (2 << mode) - 1;
|
pio_mask = (2 << mode) - 1;
|
||||||
else
|
else
|
||||||
|
@ -1250,6 +1250,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
|
||||||
|
|
||||||
ata_sg_init(qc, sg, n_elem);
|
ata_sg_init(qc, sg, n_elem);
|
||||||
qc->nsect = buflen / ATA_SECT_SIZE;
|
qc->nsect = buflen / ATA_SECT_SIZE;
|
||||||
|
qc->nbytes = buflen;
|
||||||
}
|
}
|
||||||
|
|
||||||
qc->private_data = &wait;
|
qc->private_data = &wait;
|
||||||
|
@ -2431,18 +2432,8 @@ int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
|
||||||
int i, rc = 0, used_dma = 0, found = 0;
|
int i, rc = 0, used_dma = 0, found = 0;
|
||||||
|
|
||||||
/* has private set_mode? */
|
/* has private set_mode? */
|
||||||
if (ap->ops->set_mode) {
|
if (ap->ops->set_mode)
|
||||||
/* FIXME: make ->set_mode handle no device case and
|
return ap->ops->set_mode(ap, r_failed_dev);
|
||||||
* return error code and failing device on failure.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
|
||||||
if (ata_dev_ready(&ap->device[i])) {
|
|
||||||
ap->ops->set_mode(ap);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* step 1: calculate xfer_mask */
|
/* step 1: calculate xfer_mask */
|
||||||
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
||||||
|
|
|
@ -1796,7 +1796,7 @@ static int ata_eh_suspend(struct ata_port *ap, struct ata_device **r_failed_dev)
|
||||||
*r_failed_dev = dev;
|
*r_failed_dev = dev;
|
||||||
|
|
||||||
DPRINTK("EXIT\n");
|
DPRINTK("EXIT\n");
|
||||||
return 0;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -273,8 +273,8 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
u8 scsi_cmd[MAX_COMMAND_SIZE];
|
u8 scsi_cmd[MAX_COMMAND_SIZE];
|
||||||
u8 args[7];
|
u8 args[7], *sensebuf = NULL;
|
||||||
struct scsi_sense_hdr sshdr;
|
int cmd_result;
|
||||||
|
|
||||||
if (arg == NULL)
|
if (arg == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -282,10 +282,14 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||||
if (copy_from_user(args, arg, sizeof(args)))
|
if (copy_from_user(args, arg, sizeof(args)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
|
||||||
|
if (!sensebuf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
memset(scsi_cmd, 0, sizeof(scsi_cmd));
|
memset(scsi_cmd, 0, sizeof(scsi_cmd));
|
||||||
scsi_cmd[0] = ATA_16;
|
scsi_cmd[0] = ATA_16;
|
||||||
scsi_cmd[1] = (3 << 1); /* Non-data */
|
scsi_cmd[1] = (3 << 1); /* Non-data */
|
||||||
/* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
|
scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */
|
||||||
scsi_cmd[4] = args[1];
|
scsi_cmd[4] = args[1];
|
||||||
scsi_cmd[6] = args[2];
|
scsi_cmd[6] = args[2];
|
||||||
scsi_cmd[8] = args[3];
|
scsi_cmd[8] = args[3];
|
||||||
|
@ -295,11 +299,46 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||||
|
|
||||||
/* Good values for timeout and retries? Values below
|
/* Good values for timeout and retries? Values below
|
||||||
from scsi_ioctl_send_command() for default case... */
|
from scsi_ioctl_send_command() for default case... */
|
||||||
if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr,
|
cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
|
||||||
(10*HZ), 5))
|
sensebuf, (10*HZ), 5, 0);
|
||||||
rc = -EIO;
|
|
||||||
|
|
||||||
/* Need code to retrieve data from check condition? */
|
if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
|
||||||
|
u8 *desc = sensebuf + 8;
|
||||||
|
cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
|
||||||
|
|
||||||
|
/* If we set cc then ATA pass-through will cause a
|
||||||
|
* check condition even if no error. Filter that. */
|
||||||
|
if (cmd_result & SAM_STAT_CHECK_CONDITION) {
|
||||||
|
struct scsi_sense_hdr sshdr;
|
||||||
|
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
||||||
|
&sshdr);
|
||||||
|
if (sshdr.sense_key==0 &&
|
||||||
|
sshdr.asc==0 && sshdr.ascq==0)
|
||||||
|
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send userspace ATA registers */
|
||||||
|
if (sensebuf[0] == 0x72 && /* format is "descriptor" */
|
||||||
|
desc[0] == 0x09) {/* code is "ATA Descriptor" */
|
||||||
|
args[0] = desc[13]; /* status */
|
||||||
|
args[1] = desc[3]; /* error */
|
||||||
|
args[2] = desc[5]; /* sector count (0:7) */
|
||||||
|
args[3] = desc[7]; /* lbal */
|
||||||
|
args[4] = desc[9]; /* lbam */
|
||||||
|
args[5] = desc[11]; /* lbah */
|
||||||
|
args[6] = desc[12]; /* select */
|
||||||
|
if (copy_to_user(arg, args, sizeof(args)))
|
||||||
|
rc = -EFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd_result) {
|
||||||
|
rc = -EIO;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
kfree(sensebuf);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,7 +411,7 @@ struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
|
||||||
if (cmd->use_sg) {
|
if (cmd->use_sg) {
|
||||||
qc->__sg = (struct scatterlist *) cmd->request_buffer;
|
qc->__sg = (struct scatterlist *) cmd->request_buffer;
|
||||||
qc->n_elem = cmd->use_sg;
|
qc->n_elem = cmd->use_sg;
|
||||||
} else {
|
} else if (cmd->request_bufflen) {
|
||||||
qc->__sg = &qc->sgent;
|
qc->__sg = &qc->sgent;
|
||||||
qc->n_elem = 1;
|
qc->n_elem = 1;
|
||||||
}
|
}
|
||||||
|
@ -983,11 +1022,10 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
|
||||||
}
|
}
|
||||||
|
|
||||||
tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
|
tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
|
||||||
} else {
|
} else
|
||||||
tf->nsect = 0; /* time period value (0 implies now) */
|
/* Issue ATA STANDBY IMMEDIATE command */
|
||||||
tf->command = ATA_CMD_STANDBY;
|
tf->command = ATA_CMD_STANDBYNOW1;
|
||||||
/* Consider: ATA STANDBY IMMEDIATE command */
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Standby and Idle condition timers could be implemented but that
|
* Standby and Idle condition timers could be implemented but that
|
||||||
* would require libata to implement the Power condition mode page
|
* would require libata to implement the Power condition mode page
|
||||||
|
|
|
@ -827,6 +827,7 @@ void ata_bmdma_error_handler(struct ata_port *ap)
|
||||||
*/
|
*/
|
||||||
void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
|
void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
|
if (qc->ap->ioaddr.bmdma_addr)
|
||||||
ata_bmdma_stop(qc);
|
ata_bmdma_stop(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -870,7 +871,8 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
|
||||||
pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
|
pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
|
||||||
bmdma = pci_resource_start(pdev, 4);
|
bmdma = pci_resource_start(pdev, 4);
|
||||||
if (bmdma) {
|
if (bmdma) {
|
||||||
if (inb(bmdma + 2) & 0x80)
|
if ((!(port[p]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
|
||||||
|
(inb(bmdma + 2) & 0x80))
|
||||||
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
||||||
probe_ent->port[p].bmdma_addr = bmdma;
|
probe_ent->port[p].bmdma_addr = bmdma;
|
||||||
}
|
}
|
||||||
|
@ -886,7 +888,8 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
|
||||||
bmdma = pci_resource_start(pdev, 4);
|
bmdma = pci_resource_start(pdev, 4);
|
||||||
if (bmdma) {
|
if (bmdma) {
|
||||||
bmdma += 8;
|
bmdma += 8;
|
||||||
if(inb(bmdma + 2) & 0x80)
|
if ((!(port[p]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
|
||||||
|
(inb(bmdma + 2) & 0x80))
|
||||||
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
||||||
probe_ent->port[p].bmdma_addr = bmdma;
|
probe_ent->port[p].bmdma_addr = bmdma;
|
||||||
}
|
}
|
||||||
|
@ -914,13 +917,14 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
|
||||||
probe_ent->irq_flags = IRQF_SHARED;
|
probe_ent->irq_flags = IRQF_SHARED;
|
||||||
|
|
||||||
if (port_mask & ATA_PORT_PRIMARY) {
|
if (port_mask & ATA_PORT_PRIMARY) {
|
||||||
probe_ent->irq = ATA_PRIMARY_IRQ;
|
probe_ent->irq = ATA_PRIMARY_IRQ(pdev);
|
||||||
probe_ent->port[0].cmd_addr = ATA_PRIMARY_CMD;
|
probe_ent->port[0].cmd_addr = ATA_PRIMARY_CMD;
|
||||||
probe_ent->port[0].altstatus_addr =
|
probe_ent->port[0].altstatus_addr =
|
||||||
probe_ent->port[0].ctl_addr = ATA_PRIMARY_CTL;
|
probe_ent->port[0].ctl_addr = ATA_PRIMARY_CTL;
|
||||||
if (bmdma) {
|
if (bmdma) {
|
||||||
probe_ent->port[0].bmdma_addr = bmdma;
|
probe_ent->port[0].bmdma_addr = bmdma;
|
||||||
if (inb(bmdma + 2) & 0x80)
|
if ((!(port[0]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
|
||||||
|
(inb(bmdma + 2) & 0x80))
|
||||||
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
||||||
}
|
}
|
||||||
ata_std_ports(&probe_ent->port[0]);
|
ata_std_ports(&probe_ent->port[0]);
|
||||||
|
@ -929,15 +933,16 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
|
||||||
|
|
||||||
if (port_mask & ATA_PORT_SECONDARY) {
|
if (port_mask & ATA_PORT_SECONDARY) {
|
||||||
if (probe_ent->irq)
|
if (probe_ent->irq)
|
||||||
probe_ent->irq2 = ATA_SECONDARY_IRQ;
|
probe_ent->irq2 = ATA_SECONDARY_IRQ(pdev);
|
||||||
else
|
else
|
||||||
probe_ent->irq = ATA_SECONDARY_IRQ;
|
probe_ent->irq = ATA_SECONDARY_IRQ(pdev);
|
||||||
probe_ent->port[1].cmd_addr = ATA_SECONDARY_CMD;
|
probe_ent->port[1].cmd_addr = ATA_SECONDARY_CMD;
|
||||||
probe_ent->port[1].altstatus_addr =
|
probe_ent->port[1].altstatus_addr =
|
||||||
probe_ent->port[1].ctl_addr = ATA_SECONDARY_CTL;
|
probe_ent->port[1].ctl_addr = ATA_SECONDARY_CTL;
|
||||||
if (bmdma) {
|
if (bmdma) {
|
||||||
probe_ent->port[1].bmdma_addr = bmdma + 8;
|
probe_ent->port[1].bmdma_addr = bmdma + 8;
|
||||||
if (inb(bmdma + 10) & 0x80)
|
if ((!(port[1]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
|
||||||
|
(inb(bmdma + 10) & 0x80))
|
||||||
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
|
||||||
}
|
}
|
||||||
ata_std_ports(&probe_ent->port[1]);
|
ata_std_ports(&probe_ent->port[1]);
|
||||||
|
|
|
@ -36,15 +36,22 @@ enum {
|
||||||
static int atiixp_pre_reset(struct ata_port *ap)
|
static int atiixp_pre_reset(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
static struct pci_bits atiixp_enable_bits[] = {
|
static const struct pci_bits atiixp_enable_bits[] = {
|
||||||
{ 0x48, 1, 0x01, 0x00 },
|
{ 0x48, 1, 0x01, 0x00 },
|
||||||
{ 0x48, 1, 0x08, 0x00 }
|
{ 0x48, 1, 0x08, 0x00 }
|
||||||
};
|
};
|
||||||
|
u8 udma;
|
||||||
|
|
||||||
if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no]))
|
if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no]))
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
|
/* Hack from drivers/ide/pci. Really we want to know how to do the
|
||||||
|
raw detection not play follow the bios mode guess */
|
||||||
|
pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ap->port_no, &udma);
|
||||||
|
if ((udma & 0x07) >= 0x04 || (udma & 0x70) >= 0x40)
|
||||||
ap->cbl = ATA_CBL_PATA80;
|
ap->cbl = ATA_CBL_PATA80;
|
||||||
|
else
|
||||||
|
ap->cbl = ATA_CBL_PATA40;
|
||||||
return ata_std_prereset(ap);
|
return ata_std_prereset(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -197,7 +197,7 @@ static void cmd64x_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||||
static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
static const u8 udma_data[] = {
|
static const u8 udma_data[] = {
|
||||||
0x31, 0x21, 0x11, 0x25, 0x15, 0x05
|
0x30, 0x20, 0x10, 0x20, 0x10, 0x00
|
||||||
};
|
};
|
||||||
static const u8 mwdma_data[] = {
|
static const u8 mwdma_data[] = {
|
||||||
0x30, 0x20, 0x10
|
0x30, 0x20, 0x10
|
||||||
|
@ -213,12 +213,21 @@ static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||||
pci_read_config_byte(pdev, pciD, ®D);
|
pci_read_config_byte(pdev, pciD, ®D);
|
||||||
pci_read_config_byte(pdev, pciU, ®U);
|
pci_read_config_byte(pdev, pciU, ®U);
|
||||||
|
|
||||||
regD &= ~(0x20 << shift);
|
/* DMA bits off */
|
||||||
regU &= ~(0x35 << shift);
|
regD &= ~(0x20 << adev->devno);
|
||||||
|
/* DMA control bits */
|
||||||
|
regU &= ~(0x30 << shift);
|
||||||
|
/* DMA timing bits */
|
||||||
|
regU &= ~(0x05 << adev->devno);
|
||||||
|
|
||||||
if (adev->dma_mode >= XFER_UDMA_0)
|
if (adev->dma_mode >= XFER_UDMA_0) {
|
||||||
|
/* Merge thge timing value */
|
||||||
regU |= udma_data[adev->dma_mode - XFER_UDMA_0] << shift;
|
regU |= udma_data[adev->dma_mode - XFER_UDMA_0] << shift;
|
||||||
else
|
/* Merge the control bits */
|
||||||
|
regU |= 1 << adev->devno; /* UDMA on */
|
||||||
|
if (adev->dma_mode > 2) /* 15nS timing */
|
||||||
|
regU |= 4 << adev->devno;
|
||||||
|
} else
|
||||||
regD |= mwdma_data[adev->dma_mode - XFER_MW_DMA_0] << shift;
|
regD |= mwdma_data[adev->dma_mode - XFER_MW_DMA_0] << shift;
|
||||||
|
|
||||||
regD |= 0x20 << adev->devno;
|
regD |= 0x20 << adev->devno;
|
||||||
|
@ -239,8 +248,8 @@ static void cmd648_bmdma_stop(struct ata_queued_cmd *qc)
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
u8 dma_intr;
|
u8 dma_intr;
|
||||||
int dma_reg = ap->port_no ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0;
|
int dma_mask = ap->port_no ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0;
|
||||||
int dma_mask = ap->port_no ? ARTTIM2 : CFR;
|
int dma_reg = ap->port_no ? ARTTIM2 : CFR;
|
||||||
|
|
||||||
ata_bmdma_stop(qc);
|
ata_bmdma_stop(qc);
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#include <linux/libata.h>
|
#include <linux/libata.h>
|
||||||
|
|
||||||
#define DRV_NAME "pata_hpt3x2n"
|
#define DRV_NAME "pata_hpt3x2n"
|
||||||
#define DRV_VERSION "0.3"
|
#define DRV_VERSION "0.3.2"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
HPT_PCI_FAST = (1 << 31),
|
HPT_PCI_FAST = (1 << 31),
|
||||||
|
@ -297,11 +297,11 @@ static int hpt3x2n_pair_idle(struct ata_port *ap)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hpt3x2n_use_dpll(struct ata_port *ap, int reading)
|
static int hpt3x2n_use_dpll(struct ata_port *ap, int writing)
|
||||||
{
|
{
|
||||||
long flags = (long)ap->host->private_data;
|
long flags = (long)ap->host->private_data;
|
||||||
/* See if we should use the DPLL */
|
/* See if we should use the DPLL */
|
||||||
if (reading == 0)
|
if (writing)
|
||||||
return USE_DPLL; /* Needed for write */
|
return USE_DPLL; /* Needed for write */
|
||||||
if (flags & PCI66)
|
if (flags & PCI66)
|
||||||
return USE_DPLL; /* Needed at 66Mhz */
|
return USE_DPLL; /* Needed at 66Mhz */
|
||||||
|
|
|
@ -476,6 +476,7 @@ static unsigned int it821x_passthru_qc_issue_prot(struct ata_queued_cmd *qc)
|
||||||
/**
|
/**
|
||||||
* it821x_smart_set_mode - mode setting
|
* it821x_smart_set_mode - mode setting
|
||||||
* @ap: interface to set up
|
* @ap: interface to set up
|
||||||
|
* @unused: device that failed (error only)
|
||||||
*
|
*
|
||||||
* Use a non standard set_mode function. We don't want to be tuned.
|
* Use a non standard set_mode function. We don't want to be tuned.
|
||||||
* The BIOS configured everything. Our job is not to fiddle. We
|
* The BIOS configured everything. Our job is not to fiddle. We
|
||||||
|
@ -483,7 +484,7 @@ static unsigned int it821x_passthru_qc_issue_prot(struct ata_queued_cmd *qc)
|
||||||
* and respect them.
|
* and respect them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void it821x_smart_set_mode(struct ata_port *ap)
|
static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused)
|
||||||
{
|
{
|
||||||
int dma_enabled = 0;
|
int dma_enabled = 0;
|
||||||
int i;
|
int i;
|
||||||
|
@ -512,6 +513,7 @@ static void it821x_smart_set_mode(struct ata_port *ap)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,9 +23,9 @@
|
||||||
#include <scsi/scsi_host.h>
|
#include <scsi/scsi_host.h>
|
||||||
|
|
||||||
#define DRV_NAME "pata_ixp4xx_cf"
|
#define DRV_NAME "pata_ixp4xx_cf"
|
||||||
#define DRV_VERSION "0.1.1"
|
#define DRV_VERSION "0.1.1ac1"
|
||||||
|
|
||||||
static void ixp4xx_set_mode(struct ata_port *ap)
|
static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ static void ixp4xx_set_mode(struct ata_port *ap)
|
||||||
dev->flags |= ATA_DFLAG_PIO;
|
dev->flags |= ATA_DFLAG_PIO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ixp4xx_phy_reset(struct ata_port *ap)
|
static void ixp4xx_phy_reset(struct ata_port *ap)
|
||||||
|
|
|
@ -204,20 +204,12 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
|
||||||
|
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
if (id->driver_data != 368) {
|
|
||||||
/* Put the controller into AHCI mode in case the AHCI driver
|
|
||||||
has not yet been loaded. This can be done with either
|
|
||||||
function present */
|
|
||||||
|
|
||||||
/* FIXME: We may want a way to override this in future */
|
|
||||||
pci_write_config_byte(pdev, 0x41, 0xa1);
|
|
||||||
|
|
||||||
/* PATA controller is fn 1, AHCI is fn 0 */
|
/* PATA controller is fn 1, AHCI is fn 0 */
|
||||||
if (PCI_FUNC(pdev->devfn) != 1)
|
if (id->driver_data != 368 && PCI_FUNC(pdev->devfn) != 1)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
|
||||||
if ( id->driver_data == 365 || id->driver_data == 366) {
|
|
||||||
/* The 365/66 have two PATA channels, redirect the second */
|
/* The 365/66 have two PATA channels, redirect the second */
|
||||||
|
if (id->driver_data == 365 || id->driver_data == 366) {
|
||||||
pci_read_config_dword(pdev, 0x80, ®);
|
pci_read_config_dword(pdev, 0x80, ®);
|
||||||
reg |= (1 << 24); /* IDE1 to PATA IDE secondary */
|
reg |= (1 << 24); /* IDE1 to PATA IDE secondary */
|
||||||
pci_write_config_dword(pdev, 0x80, reg);
|
pci_write_config_dword(pdev, 0x80, reg);
|
||||||
|
|
|
@ -96,6 +96,7 @@ static int pio_mask = 0x1F; /* PIO range for autospeed devices */
|
||||||
/**
|
/**
|
||||||
* legacy_set_mode - mode setting
|
* legacy_set_mode - mode setting
|
||||||
* @ap: IDE interface
|
* @ap: IDE interface
|
||||||
|
* @unused: Device that failed when error is returned
|
||||||
*
|
*
|
||||||
* Use a non standard set_mode function. We don't want to be tuned.
|
* Use a non standard set_mode function. We don't want to be tuned.
|
||||||
*
|
*
|
||||||
|
@ -105,7 +106,7 @@ static int pio_mask = 0x1F; /* PIO range for autospeed devices */
|
||||||
* expand on this as per hdparm in the base kernel.
|
* expand on this as per hdparm in the base kernel.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void legacy_set_mode(struct ata_port *ap)
|
static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -118,6 +119,7 @@ static void legacy_set_mode(struct ata_port *ap)
|
||||||
dev->flags |= ATA_DFLAG_PIO;
|
dev->flags |= ATA_DFLAG_PIO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct scsi_host_template legacy_sht = {
|
static struct scsi_host_template legacy_sht = {
|
||||||
|
|
|
@ -30,7 +30,7 @@ static int pio_mask = 1;
|
||||||
* Provide our own set_mode() as we don't want to change anything that has
|
* Provide our own set_mode() as we don't want to change anything that has
|
||||||
* already been configured..
|
* already been configured..
|
||||||
*/
|
*/
|
||||||
static void pata_platform_set_mode(struct ata_port *ap)
|
static int pata_platform_set_mode(struct ata_port *ap, struct ata_device **unused)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ static void pata_platform_set_mode(struct ata_port *ap)
|
||||||
dev->flags |= ATA_DFLAG_PIO;
|
dev->flags |= ATA_DFLAG_PIO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pata_platform_host_stop(struct ata_host *host)
|
static void pata_platform_host_stop(struct ata_host *host)
|
||||||
|
|
|
@ -52,19 +52,20 @@ static void rz1000_error_handler(struct ata_port *ap)
|
||||||
/**
|
/**
|
||||||
* rz1000_set_mode - mode setting function
|
* rz1000_set_mode - mode setting function
|
||||||
* @ap: ATA interface
|
* @ap: ATA interface
|
||||||
|
* @unused: returned device on set_mode failure
|
||||||
*
|
*
|
||||||
* Use a non standard set_mode function. We don't want to be tuned. We
|
* Use a non standard set_mode function. We don't want to be tuned. We
|
||||||
* would prefer to be BIOS generic but for the fact our hardware is
|
* would prefer to be BIOS generic but for the fact our hardware is
|
||||||
* whacked out.
|
* whacked out.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void rz1000_set_mode(struct ata_port *ap)
|
static int rz1000_set_mode(struct ata_port *ap, struct ata_device **unused)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
||||||
struct ata_device *dev = &ap->device[i];
|
struct ata_device *dev = &ap->device[i];
|
||||||
if (ata_dev_enabled(dev)) {
|
if (ata_dev_ready(dev)) {
|
||||||
/* We don't really care */
|
/* We don't really care */
|
||||||
dev->pio_mode = XFER_PIO_0;
|
dev->pio_mode = XFER_PIO_0;
|
||||||
dev->xfer_mode = XFER_PIO_0;
|
dev->xfer_mode = XFER_PIO_0;
|
||||||
|
@ -72,6 +73,7 @@ static void rz1000_set_mode(struct ata_port *ap)
|
||||||
dev->flags |= ATA_DFLAG_PIO;
|
dev->flags |= ATA_DFLAG_PIO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -135,7 +135,7 @@ static void sil680_error_handler(struct ata_port *ap)
|
||||||
static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 };
|
static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 };
|
||||||
static u16 speed_t[5] = { 0x328A, 0x1281, 0x1281, 0x10C3, 0x10C1 };
|
static u16 speed_t[5] = { 0x328A, 0x2283, 0x1281, 0x10C3, 0x10C1 };
|
||||||
|
|
||||||
unsigned long tfaddr = sil680_selreg(ap, 0x02);
|
unsigned long tfaddr = sil680_selreg(ap, 0x02);
|
||||||
unsigned long addr = sil680_seldev(ap, adev, 0x04);
|
unsigned long addr = sil680_seldev(ap, adev, 0x04);
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
* VIA VT8233c - UDMA100
|
* VIA VT8233c - UDMA100
|
||||||
* VIA VT8235 - UDMA133
|
* VIA VT8235 - UDMA133
|
||||||
* VIA VT8237 - UDMA133
|
* VIA VT8237 - UDMA133
|
||||||
|
* VIA VT8237S - UDMA133
|
||||||
* VIA VT8251 - UDMA133
|
* VIA VT8251 - UDMA133
|
||||||
*
|
*
|
||||||
* Most registers remain compatible across chips. Others start reserved
|
* Most registers remain compatible across chips. Others start reserved
|
||||||
|
@ -61,7 +62,7 @@
|
||||||
#include <linux/libata.h>
|
#include <linux/libata.h>
|
||||||
|
|
||||||
#define DRV_NAME "pata_via"
|
#define DRV_NAME "pata_via"
|
||||||
#define DRV_VERSION "0.2.0"
|
#define DRV_VERSION "0.2.1"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following comes directly from Vojtech Pavlik's ide/pci/via82cxxx
|
* The following comes directly from Vojtech Pavlik's ide/pci/via82cxxx
|
||||||
|
@ -95,6 +96,7 @@ static const struct via_isa_bridge {
|
||||||
u8 rev_max;
|
u8 rev_max;
|
||||||
u16 flags;
|
u16 flags;
|
||||||
} via_isa_bridges[] = {
|
} via_isa_bridges[] = {
|
||||||
|
{ "vt8237s", PCI_DEVICE_ID_VIA_8237S, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
{ "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
{ "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
{ "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
{ "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
{ "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES},
|
{ "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES},
|
||||||
|
|
|
@ -700,7 +700,6 @@ static void nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
|
||||||
static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
|
static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
|
||||||
{
|
{
|
||||||
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);
|
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||||
int handled;
|
|
||||||
|
|
||||||
/* freeze if hotplugged */
|
/* freeze if hotplugged */
|
||||||
if (unlikely(irq_stat & (NV_INT_ADDED | NV_INT_REMOVED))) {
|
if (unlikely(irq_stat & (NV_INT_ADDED | NV_INT_REMOVED))) {
|
||||||
|
@ -719,13 +718,7 @@ static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle interrupt */
|
/* handle interrupt */
|
||||||
handled = ata_host_intr(ap, qc);
|
return ata_host_intr(ap, qc);
|
||||||
if (unlikely(!handled)) {
|
|
||||||
/* spurious, clear it */
|
|
||||||
ata_check_status(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
|
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
|
||||||
|
@ -752,6 +745,11 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
|
||||||
if (pp->flags & NV_ADMA_PORT_REGISTER_MODE) {
|
if (pp->flags & NV_ADMA_PORT_REGISTER_MODE) {
|
||||||
u8 irq_stat = readb(host->mmio_base + NV_INT_STATUS_CK804)
|
u8 irq_stat = readb(host->mmio_base + NV_INT_STATUS_CK804)
|
||||||
>> (NV_INT_PORT_SHIFT * i);
|
>> (NV_INT_PORT_SHIFT * i);
|
||||||
|
if(ata_tag_valid(ap->active_tag))
|
||||||
|
/** NV_INT_DEV indication seems unreliable at times
|
||||||
|
at least in ADMA mode. Force it on always when a
|
||||||
|
command is active, to prevent losing interrupts. */
|
||||||
|
irq_stat |= NV_INT_DEV;
|
||||||
handled += nv_host_intr(ap, irq_stat);
|
handled += nv_host_intr(ap, irq_stat);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,8 @@ static const struct ata_port_operations uli_ops = {
|
||||||
|
|
||||||
static struct ata_port_info uli_port_info = {
|
static struct ata_port_info uli_port_info = {
|
||||||
.sht = &uli_sht,
|
.sht = &uli_sht,
|
||||||
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
||||||
|
ATA_FLAG_IGN_SIMPLEX,
|
||||||
.pio_mask = 0x1f, /* pio0-4 */
|
.pio_mask = 0x1f, /* pio0-4 */
|
||||||
.udma_mask = 0x7f, /* udma0-6 */
|
.udma_mask = 0x7f, /* udma0-6 */
|
||||||
.port_ops = &uli_ops,
|
.port_ops = &uli_ops,
|
||||||
|
|
|
@ -74,6 +74,7 @@ enum {
|
||||||
static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
|
static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
|
||||||
static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
|
static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
|
||||||
|
static void svia_noop_freeze(struct ata_port *ap);
|
||||||
static void vt6420_error_handler(struct ata_port *ap);
|
static void vt6420_error_handler(struct ata_port *ap);
|
||||||
|
|
||||||
static const struct pci_device_id svia_pci_tbl[] = {
|
static const struct pci_device_id svia_pci_tbl[] = {
|
||||||
|
@ -128,7 +129,7 @@ static const struct ata_port_operations vt6420_sata_ops = {
|
||||||
.qc_issue = ata_qc_issue_prot,
|
.qc_issue = ata_qc_issue_prot,
|
||||||
.data_xfer = ata_pio_data_xfer,
|
.data_xfer = ata_pio_data_xfer,
|
||||||
|
|
||||||
.freeze = ata_bmdma_freeze,
|
.freeze = svia_noop_freeze,
|
||||||
.thaw = ata_bmdma_thaw,
|
.thaw = ata_bmdma_thaw,
|
||||||
.error_handler = vt6420_error_handler,
|
.error_handler = vt6420_error_handler,
|
||||||
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
||||||
|
@ -204,6 +205,15 @@ static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
|
||||||
outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
|
outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void svia_noop_freeze(struct ata_port *ap)
|
||||||
|
{
|
||||||
|
/* Some VIA controllers choke if ATA_NIEN is manipulated in
|
||||||
|
* certain way. Leave it alone and just clear pending IRQ.
|
||||||
|
*/
|
||||||
|
ata_chk_status(ap);
|
||||||
|
ata_bmdma_irq_clear(ap);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vt6420_prereset - prereset for vt6420
|
* vt6420_prereset - prereset for vt6420
|
||||||
* @ap: target ATA port
|
* @ap: target ATA port
|
||||||
|
|
|
@ -1845,7 +1845,7 @@ static u16 __devinit read_bia (const hrz_dev * dev, u16 addr)
|
||||||
|
|
||||||
/********** initialise a card **********/
|
/********** initialise a card **********/
|
||||||
|
|
||||||
static int __init hrz_init (hrz_dev * dev) {
|
static int __devinit hrz_init (hrz_dev * dev) {
|
||||||
int onefivefive;
|
int onefivefive;
|
||||||
|
|
||||||
u16 chan;
|
u16 chan;
|
||||||
|
|
|
@ -101,6 +101,11 @@ static int amd_create_gatt_pages(int nr_tables)
|
||||||
for (i = 0; i < nr_tables; i++) {
|
for (i = 0; i < nr_tables; i++) {
|
||||||
entry = kzalloc(sizeof(struct amd_page_map), GFP_KERNEL);
|
entry = kzalloc(sizeof(struct amd_page_map), GFP_KERNEL);
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
|
while (i > 0) {
|
||||||
|
kfree(tables[i-1]);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
kfree(tables);
|
||||||
retval = -ENOMEM;
|
retval = -ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -655,7 +655,7 @@ static struct pci_device_id agp_amd64_pci_table[] = {
|
||||||
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
.class_mask = ~0,
|
.class_mask = ~0,
|
||||||
.vendor = PCI_VENDOR_ID_VIA,
|
.vendor = PCI_VENDOR_ID_VIA,
|
||||||
.device = PCI_DEVICE_ID_VIA_K8M890CE,
|
.device = PCI_DEVICE_ID_VIA_VT3336,
|
||||||
.subvendor = PCI_ANY_ID,
|
.subvendor = PCI_ANY_ID,
|
||||||
.subdevice = PCI_ANY_ID,
|
.subdevice = PCI_ANY_ID,
|
||||||
},
|
},
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue