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:
Коммит
d5112a4f31
2
CREDITS
2
CREDITS
|
@ -3279,7 +3279,7 @@ S: Sevilla 41005
|
|||
S: Spain
|
||||
|
||||
N: Linus Torvalds
|
||||
E: torvalds@osdl.org
|
||||
E: torvalds@linux-foundation.org
|
||||
D: Original kernel hacker
|
||||
S: 12725 SW Millikan Way, Suite 400
|
||||
S: Beaverton, Oregon 97005
|
||||
|
|
|
@ -72,3 +72,7 @@ kernel patches.
|
|||
|
||||
If the new code is substantial, addition of subsystem-specific fault
|
||||
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
|
||||
Linux kernel. His e-mail address is <torvalds@osdl.org>. He gets
|
||||
a lot of e-mail, so typically you should do your best to -avoid- sending
|
||||
him e-mail.
|
||||
Linux kernel. His e-mail address is <torvalds@linux-foundation.org>.
|
||||
He gets a lot of e-mail, so typically you should do your best to -avoid-
|
||||
sending him e-mail.
|
||||
|
||||
Patches which are bug fixes, are "obvious" changes, or similarly
|
||||
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>
|
||||
|
||||
---------------------------
|
||||
|
||||
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
|
||||
=========
|
||||
|
||||
The Linux version of the 9p server is now maintained under the npfs project
|
||||
on sourceforge (http://sourceforge.net/projects/npfs).
|
||||
Our current recommendation is to use Inferno (http://www.vitanuova.com/inferno)
|
||||
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
|
||||
on sourceforge (http://sourceforge.net/projects/v9fs).
|
||||
|
@ -96,5 +110,5 @@ STATUS
|
|||
|
||||
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>
|
||||
Last update 2006-11-17
|
||||
Last update 2007-01-26
|
||||
|
||||
On the i386 platform, the Linux kernel uses a rather complicated boot
|
||||
convention. This has evolved partially due to historical aspects, as
|
||||
|
@ -186,6 +186,7 @@ filled out, however:
|
|||
7 GRuB
|
||||
8 U-BOOT
|
||||
9 Xen
|
||||
A Gujin
|
||||
|
||||
Please contact <hpa@zytor.com> if you need a bootloader ID
|
||||
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
|
||||
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.
|
||||
|
||||
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:
|
||||
|
||||
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
|
||||
|
||||
|
@ -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:
|
||||
|
||||
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:
|
||||
|
||||
|
@ -224,7 +229,23 @@ Dump-capture kernel config options (Arch Dependent, ppc64)
|
|||
|
||||
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
|
||||
|
@ -243,6 +264,10 @@ Boot into System Kernel
|
|||
|
||||
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
|
||||
============================
|
||||
|
||||
|
@ -261,7 +286,8 @@ For x86_64:
|
|||
For ppc64:
|
||||
- Use vmlinux
|
||||
For ia64:
|
||||
(To be filled)
|
||||
- Use vmlinux or vmlinuz.gz
|
||||
|
||||
|
||||
If you are using a uncompressed vmlinux image then use following command
|
||||
to load dump-capture kernel.
|
||||
|
@ -277,18 +303,19 @@ to load dump-capture kernel.
|
|||
--initrd=<initrd-for-dump-capture-kernel> \
|
||||
--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
|
||||
loading dump-capture kernel.
|
||||
|
||||
For i386 and x86_64:
|
||||
For i386, x86_64 and ia64:
|
||||
"init 1 irqpoll maxcpus=1"
|
||||
|
||||
For ppc64:
|
||||
"init 1 maxcpus=1 noirqdistrib"
|
||||
|
||||
For IA64
|
||||
(To be filled)
|
||||
|
||||
|
||||
Notes on loading the dump-capture kernel:
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Linux Magic System Request Key Hacks
|
||||
Documentation for sysrq.c version 1.15
|
||||
Last update: $Date: 2001/01/28 10:15:59 $
|
||||
Documentation for sysrq.c
|
||||
Last update: 2007-JAN-06
|
||||
|
||||
* 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
|
||||
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?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -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
|
||||
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
|
||||
|
||||
|
@ -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.
|
||||
|
||||
'd' - Shows all locks that are held.
|
||||
|
||||
'o' - Will shut your system off (if configured and supported).
|
||||
|
||||
'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.
|
||||
|
||||
'n' - Used to make RT tasks nice-able
|
||||
|
||||
'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
|
||||
will be printed to your console. ('0', for example would make
|
||||
it so that only emergency messages like PANICs or OOPSes would
|
||||
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.
|
||||
|
||||
'g' - Used by kgdb on ppc platforms.
|
||||
|
||||
'i' - Send a SIGKILL to all processes, except for init.
|
||||
|
||||
'l' - Send a SIGKILL to all processes, INCLUDING init. (Your system
|
||||
will be non-functional after this.)
|
||||
|
||||
'h' - Will display help ( actually any other key than those listed
|
||||
'h' - Will display help (actually any other key than those listed
|
||||
above will display help. but 'h' is easy to remember :-)
|
||||
|
||||
* Okay, so what can I use them for?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
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
|
||||
trojan program is running at console and which could grab your password
|
||||
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
|
||||
sa'K' (Secure Access Key) is useful when you want to be sure there is no
|
||||
trojan program running at console which could grab your password
|
||||
when you would try to login. It will kill all programs on given console,
|
||||
thus letting you make sure that the login prompt you see is actually
|
||||
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: c2 compliant system, and it should not be mistaken as :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.
|
||||
(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
|
||||
"OK" and "Done" message appear on the screen.
|
||||
|
||||
The loglevel'0'-'9' is useful when your console is being flooded with
|
||||
kernel messages you do not want to see. Setting '0' will prevent all but
|
||||
The loglevels '0'-'9' are useful when your console is being flooded with
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
* 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
|
||||
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
|
||||
register_sysrq_key(int key, struct sysrq_key_op *op_p) that is defined in
|
||||
sysrq.h, this will register the operation pointed to by 'op_p' at table
|
||||
key 'key', if that slot in the table is blank. At module unload time, you must
|
||||
call the macro unregister_sysrq_key(int key, struct sysrq_key_op *op_p), which
|
||||
After the sysrq_key_op is created, you can call the kernel function
|
||||
register_sysrq_key(int key, struct sysrq_key_op *op_p); this will
|
||||
register the operation pointed to by 'op_p' at table key 'key',
|
||||
if that slot in the table is blank. At module unload time, you must call
|
||||
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
|
||||
it is currently registered in that slot. This is in case the slot has been
|
||||
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
|
||||
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,
|
||||
and 4 functions are exported for interface to it: __sysrq_lock_table,
|
||||
__sysrq_unlock_table, __sysrq_get_key_op, and __sysrq_put_key_op. The
|
||||
functions __sysrq_swap_key_ops and __sysrq_swap_key_ops_nolock are defined
|
||||
in the header itself, and the REGISTER and UNREGISTER macros are built from
|
||||
these. More complex (and dangerous!) manipulations of the table are possible
|
||||
using these functions, but you must be careful to always lock the table before
|
||||
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 :)
|
||||
and 2 functions are exported for interface to it:
|
||||
register_sysrq_key and unregister_sysrq_key.
|
||||
Of course, never ever leave an invalid pointer in the table. I.e., when
|
||||
your module that called register_sysrq_key() exits, it must call
|
||||
unregister_sysrq_key() to clean up the sysrq key table entry that it used.
|
||||
Null pointers in the table are always safe. :)
|
||||
|
||||
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
|
||||
|
|
|
@ -21,7 +21,7 @@ difficult to maintain, add yourself with a patch if desired.
|
|||
Bill Ryder <bryder@sgi.com>
|
||||
Thomas Sailer <sailer@ife.ee.ethz.ch>
|
||||
Gregory P. Smith <greg@electricrain.com>
|
||||
Linus Torvalds <torvalds@osdl.org>
|
||||
Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Roman Weissgaerber <weissg@vienna.at>
|
||||
<Kazuki.Yasumatsu@fujixerox.co.jp>
|
||||
|
||||
|
|
48
MAINTAINERS
48
MAINTAINERS
|
@ -598,8 +598,6 @@ W: http://linux-atm.sourceforge.net
|
|||
S: Maintained
|
||||
|
||||
ATMEL MACB ETHERNET DRIVER
|
||||
P: Atmel AVR32 Support Team
|
||||
M: avr32@atmel.com
|
||||
P: Haavard Skinnemoen
|
||||
M: hskinnemoen@atmel.com
|
||||
S: Supported
|
||||
|
@ -620,8 +618,6 @@ T: git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git
|
|||
S: Maintained
|
||||
|
||||
AVR32 ARCHITECTURE
|
||||
P: Atmel AVR32 Support Team
|
||||
M: avr32@atmel.com
|
||||
P: Haavard Skinnemoen
|
||||
M: hskinnemoen@atmel.com
|
||||
W: http://www.atmel.com/products/AVR32/
|
||||
|
@ -630,8 +626,6 @@ W: http://avrfreaks.net/
|
|||
S: Supported
|
||||
|
||||
AVR32/AT32AP MACHINE SUPPORT
|
||||
P: Atmel AVR32 Support Team
|
||||
M: avr32@atmel.com
|
||||
P: Haavard Skinnemoen
|
||||
M: hskinnemoen@atmel.com
|
||||
S: Supported
|
||||
|
@ -1137,9 +1131,9 @@ T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
|
|||
S: Maintained
|
||||
|
||||
DSCC4 DRIVER
|
||||
P: François Romieu
|
||||
M: romieu@cogenit.fr
|
||||
M: romieu@ensta.fr
|
||||
P: Francois Romieu
|
||||
M: romieu@fr.zoreil.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
DVB SUBSYSTEM AND DRIVERS
|
||||
|
@ -1254,7 +1248,7 @@ S: Maintained
|
|||
|
||||
ETHERNET BRIDGE
|
||||
P: Stephen Hemminger
|
||||
M: shemminger@osdl.org
|
||||
M: shemminger@linux-foundation.org
|
||||
L: bridge@osdl.org
|
||||
W: http://bridge.sourceforge.net/
|
||||
S: Maintained
|
||||
|
@ -1598,12 +1592,11 @@ M: ipslinux@adaptec.com
|
|||
W: http://www.developer.ibm.com/welcome/netfinity/serveraid.html
|
||||
S: Supported
|
||||
|
||||
IDE DRIVER [GENERAL]
|
||||
IDE SUBSYSTEM
|
||||
P: Bartlomiej Zolnierkiewicz
|
||||
M: B.Zolnierkiewicz@elka.pw.edu.pl
|
||||
L: linux-kernel@vger.kernel.org
|
||||
M: bzolnier@gmail.com
|
||||
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
|
||||
|
||||
IDE/ATAPI CDROM DRIVER
|
||||
|
@ -1928,11 +1921,10 @@ S: Maintained
|
|||
|
||||
KERNEL NFSD
|
||||
P: Neil Brown
|
||||
M: neilb@cse.unsw.edu.au
|
||||
M: neilb@suse.de
|
||||
L: nfs@lists.sourceforge.net
|
||||
W: http://nfs.sourceforge.net/
|
||||
W: http://www.cse.unsw.edu.au/~neilb/patches/linux-devel/
|
||||
S: Maintained
|
||||
S: Supported
|
||||
|
||||
KERNEL VIRTUAL MACHINE (KVM)
|
||||
P: Avi Kivity
|
||||
|
@ -2277,7 +2269,7 @@ S: Maintained
|
|||
|
||||
NETEM NETWORK EMULATOR
|
||||
P: Stephen Hemminger
|
||||
M: shemminger@osdl.org
|
||||
M: shemminger@linux-foundation.org
|
||||
L: netem@osdl.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -2290,7 +2282,7 @@ P: Jozsef Kadlecsik
|
|||
P: Patrick McHardy
|
||||
M: kaber@trash.net
|
||||
L: netfilter-devel@lists.netfilter.org
|
||||
L: netfilter@lists.netfilter.org
|
||||
L: netfilter@lists.netfilter.org (subscribers-only)
|
||||
L: coreteam@netfilter.org
|
||||
W: http://www.netfilter.org/
|
||||
W: http://www.iptables.org/
|
||||
|
@ -2993,9 +2985,9 @@ SOFTWARE RAID (Multiple Disks) SUPPORT
|
|||
P: Ingo Molnar
|
||||
M: mingo@redhat.com
|
||||
P: Neil Brown
|
||||
M: neilb@cse.unsw.edu.au
|
||||
M: neilb@suse.de
|
||||
L: linux-raid@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Supported
|
||||
|
||||
SOFTWARE SUSPEND:
|
||||
P: Pavel Machek
|
||||
|
@ -3081,7 +3073,7 @@ S: Maintained
|
|||
|
||||
SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
|
||||
P: Stephen Hemminger
|
||||
M: shemminger@osdl.org
|
||||
M: shemminger@linux-foundation.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -3575,6 +3567,12 @@ M: khali@linux-fr.org
|
|||
L: i2c@lm-sensors.org
|
||||
S: Maintained
|
||||
|
||||
VIA VELOCITY NETWORK DRIVER
|
||||
P: Francois Romieu
|
||||
M: romieu@fr.zoreil.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
UCLINUX (AND M68KNOMMU)
|
||||
P: Greg Ungerer
|
||||
M: gerg@uclinux.org
|
||||
|
@ -3595,6 +3593,12 @@ M: ysato@users.sourceforge.jp
|
|||
W: http://uclinux-h8.sourceforge.jp/
|
||||
S: Supported
|
||||
|
||||
UFS FILESYSTEM
|
||||
P: Evgeniy Dushistov
|
||||
M: dushistov@mail.ru
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
USB DIAMOND RIO500 DRIVER
|
||||
P: Cesar Miquel
|
||||
M: miquel@df.uba.ar
|
||||
|
|
8
Makefile
8
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 20
|
||||
EXTRAVERSION =-rc5
|
||||
EXTRAVERSION =
|
||||
NAME = Homicidal Dwarf Hamster
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -1116,15 +1116,15 @@ help:
|
|||
@echo ' cscope - Generate cscope index'
|
||||
@echo ' kernelrelease - Output the release version string'
|
||||
@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 ' (default: $(INSTALL_HDR_PATH))'; \
|
||||
fi
|
||||
@echo ' (default: $(INSTALL_HDR_PATH))'
|
||||
@echo ''
|
||||
@echo 'Static analysers'
|
||||
@echo ' checkstack - Generate a list of stack hogs'
|
||||
@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'; \
|
||||
fi
|
||||
@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
|
||||
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
|
||||
them to me (torvalds@osdl.org), and possibly to any other relevant
|
||||
mailing-list or to the newsgroup.
|
||||
them to me (torvalds@linux-foundation.org), and possibly to any other
|
||||
relevant mailing-list or to the newsgroup.
|
||||
|
||||
- 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
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
* Power off function, if any
|
||||
*/
|
||||
void (*pm_power_off)(void) = machine_power_off;
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
void
|
||||
cpu_idle(void)
|
||||
|
|
|
@ -923,7 +923,6 @@ CONFIG_FORCED_INLINING=y
|
|||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
# CONFIG_DEBUG_ERRORS is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
|
|
|
@ -1079,7 +1079,6 @@ CONFIG_FORCED_INLINING=y
|
|||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
# CONFIG_DEBUG_ERRORS is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
|
|
|
@ -22,6 +22,10 @@
|
|||
#include <asm/thread_info.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_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.
|
||||
*/
|
||||
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]
|
||||
|
||||
#ifdef CONFIG_XIP_KERNEL
|
||||
|
|
|
@ -272,7 +272,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data)
|
|||
at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */
|
||||
|
||||
/* nWAIT is _not_ a default setting */
|
||||
at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */
|
||||
at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */
|
||||
|
||||
cf_data = *data;
|
||||
platform_device_register(&at91rm9200_cf_device);
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/arch/at91sam9260.h>
|
||||
#include <asm/arch/at91_pmc.h>
|
||||
#include <asm/arch/at91_rstc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "clock.h"
|
||||
|
@ -212,7 +213,7 @@ static struct at91_gpio_bank at91sam9260_gpio[] = {
|
|||
|
||||
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/arch/at91sam9261.h>
|
||||
#include <asm/arch/at91_pmc.h>
|
||||
#include <asm/arch/at91_rstc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "clock.h"
|
||||
|
@ -207,7 +208,7 @@ static struct at91_gpio_bank at91sam9261_gpio[] = {
|
|||
|
||||
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/hardware.h>
|
||||
#include <asm/arch/at91_pio.h>
|
||||
#include <asm/arch/at91_pmc.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
@ -224,17 +223,17 @@ static u32 backups[MAX_GPIO_BANKS];
|
|||
static int gpio_irq_set_wake(unsigned pin, unsigned state)
|
||||
{
|
||||
unsigned mask = pin_to_mask(pin);
|
||||
unsigned bank = (pin - PIN_BASE) / 32;
|
||||
|
||||
pin -= PIN_BASE;
|
||||
pin /= 32;
|
||||
|
||||
if (unlikely(pin >= MAX_GPIO_BANKS))
|
||||
if (unlikely(bank >= MAX_GPIO_BANKS))
|
||||
return -EINVAL;
|
||||
|
||||
if (state)
|
||||
wakeups[pin] |= mask;
|
||||
wakeups[bank] |= mask;
|
||||
else
|
||||
wakeups[pin] &= ~mask;
|
||||
wakeups[bank] &= ~mask;
|
||||
|
||||
set_irq_wake(gpio[bank].id, state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -246,29 +245,15 @@ void at91_gpio_suspend(void)
|
|||
for (i = 0; i < gpio_banks; i++) {
|
||||
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);
|
||||
at91_sys_write(pio + PIO_IDR, backups[i]);
|
||||
at91_sys_write(pio + PIO_IER, wakeups[i]);
|
||||
|
||||
if (!wakeups[i]) {
|
||||
disable_irq_wake(gpio[i].id);
|
||||
at91_sys_write(AT91_PMC_PCDR, 1 << gpio[i].id);
|
||||
} else {
|
||||
enable_irq_wake(gpio[i].id);
|
||||
if (!wakeups[i])
|
||||
clk_disable(gpio[i].clock);
|
||||
else {
|
||||
#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
|
||||
}
|
||||
}
|
||||
|
@ -281,9 +266,11 @@ void at91_gpio_resume(void)
|
|||
for (i = 0; i < gpio_banks; i++) {
|
||||
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_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;
|
||||
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;
|
||||
|
||||
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->cpuinfo.min_freq = 8000;
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
|
|||
case S3C2410_GPIO_SFN2:
|
||||
case S3C2410_GPIO_SFN3:
|
||||
if (pin < S3C2410_GPIO_BANKB) {
|
||||
function -= 1;
|
||||
function &= 1;
|
||||
function <<= S3C2410_GPIO_OFFSET(pin);
|
||||
} else {
|
||||
|
@ -83,15 +84,18 @@ EXPORT_SYMBOL(s3c2410_gpio_cfgpin);
|
|||
unsigned int s3c2410_gpio_getcfg(unsigned int pin)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long mask;
|
||||
unsigned long val = __raw_readl(base);
|
||||
|
||||
if (pin < S3C2410_GPIO_BANKB) {
|
||||
mask = 1 << S3C2410_GPIO_OFFSET(pin);
|
||||
val >>= S3C2410_GPIO_OFFSET(pin);
|
||||
val &= 1;
|
||||
val += 1;
|
||||
} 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);
|
||||
|
|
|
@ -451,15 +451,14 @@ static void s3c2410_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs)
|
|||
irqstate = s3c_irqwake_eintmask & (1L<<irqoffs);
|
||||
|
||||
pinstate = s3c2410_gpio_getcfg(pin);
|
||||
pinstate >>= S3C2410_GPIO_OFFSET(pin)*2;
|
||||
|
||||
if (!irqstate) {
|
||||
if (pinstate == 0x02)
|
||||
if (pinstate == S3C2410_GPIO_IRQ)
|
||||
DBG("Leaving IRQ %d (pin %d) enabled\n", irq, pin);
|
||||
} else {
|
||||
if (pinstate == 0x02) {
|
||||
if (pinstate == S3C2410_GPIO_IRQ) {
|
||||
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,
|
||||
struct s3c24xx_dma_map *map)
|
||||
{
|
||||
writel(chan->regs + S3C2412_DMA_DMAREQSEL,
|
||||
map->channels[0] | S3C2412_DMAREQSEL_HW);
|
||||
writel(map->channels[0] | S3C2412_DMAREQSEL_HW,
|
||||
chan->regs + S3C2412_DMA_DMAREQSEL);
|
||||
}
|
||||
|
||||
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));
|
||||
|
||||
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) {
|
||||
unsigned int pfn1, pfn2;
|
||||
struct page *page, *end;
|
||||
|
||||
pfn1 = mi->bank[i].start >> PAGE_SHIFT;
|
||||
pfn2 = (mi->bank[i].size + mi->bank[i].start) >> PAGE_SHIFT;
|
||||
pfn1 = __phys_to_pfn(mi->bank[i].start);
|
||||
pfn2 = __phys_to_pfn(mi->bank[i].size + mi->bank[i].start);
|
||||
|
||||
page = NODE_MEM_MAP(node) + pfn1;
|
||||
end = NODE_MEM_MAP(node) + pfn2;
|
||||
page = map + pfn1;
|
||||
end = map + pfn2;
|
||||
|
||||
do {
|
||||
total++;
|
||||
|
|
|
@ -300,7 +300,8 @@ __ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
|
|||
addr = (unsigned long)area->addr;
|
||||
|
||||
#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()) &&
|
||||
!((__pfn_to_phys(pfn) | size | addr) & ~SUPERSECTION_MASK)) {
|
||||
area->flags |= VM_ARM_SECTION_MAPPING;
|
||||
|
|
|
@ -708,7 +708,7 @@ __8032x_proc_info:
|
|||
.type __8033x_proc_info,#object
|
||||
__8033x_proc_info:
|
||||
.long 0x69054010
|
||||
.long 0xffffff30
|
||||
.long 0xfffffd30
|
||||
.long PMD_TYPE_SECT | \
|
||||
PMD_SECT_BUFFERABLE | \
|
||||
PMD_SECT_CACHEABLE | \
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
@ -1219,3 +1219,26 @@ zevio_1020 MACH_ZEVIO_1020 ZEVIO_1020 1207
|
|||
hitrack MACH_HITRACK HITRACK 1208
|
||||
syme1 MACH_SYME1 SYME1 1209
|
||||
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:
|
||||
enable_irq
|
||||
ldr r4, .LCvfp
|
||||
ldr r11, [r10, #TI_CPU] @ CPU number
|
||||
add r10, r10, #TI_VFPSTATE @ r10 = workspace
|
||||
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 flags;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
extern void vfp_save_state(void *location, u32 fpexc);
|
||||
#endif
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
@ r2 = faulted PC+4
|
||||
@ r9 = successful return
|
||||
@ r10 = vfp_state union
|
||||
@ r11 = CPU number
|
||||
@ lr = failure return
|
||||
|
||||
.globl vfp_support_entry
|
||||
|
@ -79,7 +80,7 @@ vfp_support_entry:
|
|||
DBGSTR1 "enable %x", r10
|
||||
ldr r3, last_VFP_context_address
|
||||
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
|
||||
cmp r4, r10
|
||||
beq check_for_exception @ we are returning to the same
|
||||
|
@ -91,7 +92,9 @@ vfp_support_entry:
|
|||
@ exceptions, so we can get at the
|
||||
@ rest of it
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
@ 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
|
||||
cmp r4, #0
|
||||
|
@ -105,10 +108,11 @@ vfp_support_entry:
|
|||
stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2
|
||||
@ and point r4 at the word at the
|
||||
@ start of the register dump
|
||||
#endif
|
||||
|
||||
no_old_VFP_process:
|
||||
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
|
||||
VFPFLDMIA r10 @ reload the working registers while
|
||||
@ FPEXC is in a safe state
|
||||
|
@ -162,6 +166,24 @@ process_exception:
|
|||
@ required. If not, the user code will
|
||||
@ 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:
|
||||
.word last_VFP_context
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ void vfp_testing_entry(void);
|
|||
void vfp_support_entry(void);
|
||||
|
||||
void (*vfp_vector)(void) = vfp_testing_entry;
|
||||
union vfp_state *last_VFP_context;
|
||||
union vfp_state *last_VFP_context[NR_CPUS];
|
||||
|
||||
/*
|
||||
* 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;
|
||||
union vfp_state *vfp;
|
||||
__u32 cpu = thread->cpu;
|
||||
|
||||
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
|
||||
* old state.
|
||||
*/
|
||||
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_ENABLE);
|
||||
fmxr(FPEXC, fpexc & ~FPEXC_ENABLE);
|
||||
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. */
|
||||
if (last_VFP_context == vfp)
|
||||
last_VFP_context = NULL;
|
||||
if (last_VFP_context[cpu] == vfp)
|
||||
last_VFP_context[cpu] = NULL;
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.19-rc2
|
||||
# Fri Oct 20 11:52:37 2006
|
||||
# Linux kernel version: 2.6.20-rc6
|
||||
# Fri Jan 26 13:12:59 2007
|
||||
#
|
||||
CONFIG_AVR32=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
|
@ -9,6 +9,8 @@ CONFIG_HARDIRQS_SW_RESEND=y
|
|||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=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_CALIBRATE_DELAY=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
@ -36,6 +38,7 @@ CONFIG_TASK_DELAY_ACCT=y
|
|||
# CONFIG_UTS_NS is not set
|
||||
CONFIG_AUDIT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
CONFIG_RELAY=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
|
@ -75,7 +78,9 @@ CONFIG_MODULE_UNLOAD=y
|
|||
# Block layer
|
||||
#
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -125,6 +130,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
|
|||
# CONFIG_OWNERSHIP_TRACE is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_CMDLINE=""
|
||||
|
@ -182,6 +188,7 @@ CONFIG_INET_TCP_DIAG=y
|
|||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
|
@ -260,6 +267,7 @@ CONFIG_MTD_CMDLINE_PARTS=y
|
|||
# User Modules And Translation Layers
|
||||
#
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLKDEVS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
|
@ -355,7 +363,6 @@ CONFIG_BLK_DEV_INITRD=y
|
|||
#
|
||||
# Misc devices
|
||||
#
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
|
||||
#
|
||||
|
@ -405,11 +412,14 @@ CONFIG_TUN=m
|
|||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_MACB=y
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
|
@ -505,10 +515,6 @@ CONFIG_UNIX98_PTYS=y
|
|||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
|
@ -620,6 +626,10 @@ CONFIG_UNIX98_PTYS=y
|
|||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# Virtualization
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
|
@ -683,7 +693,6 @@ CONFIG_CONFIGFS_FS=m
|
|||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
|
@ -762,6 +771,11 @@ CONFIG_NLS_ISO8859_1=m
|
|||
# CONFIG_NLS_KOI8_U is not set
|
||||
CONFIG_NLS_UTF8=m
|
||||
|
||||
#
|
||||
# Distributed Lock Manager
|
||||
#
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
|
@ -770,6 +784,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
|||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
|
@ -785,13 +801,10 @@ CONFIG_DETECT_SOFTLOCKUP=y
|
|||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_KPROBES is not set
|
||||
|
||||
|
@ -809,6 +822,7 @@ CONFIG_FORCED_INLINING=y
|
|||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_BITREVERSE=y
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
|
@ -817,3 +831,4 @@ CONFIG_AUDIT_GENERIC=y
|
|||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_PLIST=y
|
||||
CONFIG_IOMAP_COPY=y
|
||||
|
|
|
@ -29,6 +29,7 @@ EXPORT_SYMBOL(__avr32_asr64);
|
|||
*/
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
EXPORT_SYMBOL(clear_page);
|
||||
|
||||
/*
|
||||
* Userspace access stuff.
|
||||
|
|
|
@ -43,6 +43,8 @@ static int is_safe_abs_reloc(const char* sym_name)
|
|||
/* Match found */
|
||||
return 1;
|
||||
}
|
||||
if (strncmp(sym_name, "__crc_", 6) == 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,6 @@ enum {
|
|||
|
||||
|
||||
static int has_N44_O17_errata[NR_CPUS];
|
||||
static int has_N60_errata[NR_CPUS];
|
||||
static unsigned int stock_freq;
|
||||
static struct cpufreq_driver p4clockmod_driver;
|
||||
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:
|
||||
has_N44_O17_errata[policy->cpu] = 1;
|
||||
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 */
|
||||
|
@ -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++) {
|
||||
if ((i<2) && (has_N44_O17_errata[policy->cpu]))
|
||||
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
|
||||
p4clockmod_table[i].frequency = (stock_freq * i)/8;
|
||||
}
|
||||
|
|
|
@ -173,7 +173,7 @@ static void __cpuinit geode_configure(void)
|
|||
ccr4 = getCx86(CX86_CCR4);
|
||||
ccr4 |= 0x38; /* FPU fast, DTE cache, Mem bypass */
|
||||
|
||||
setCx86(CX86_CCR4, ccr4);
|
||||
setCx86(CX86_CCR3, ccr3);
|
||||
|
||||
set_cx86_memwb();
|
||||
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.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
efi.get_time = (efi_get_time_t *) efi.systab->runtime->get_time;
|
||||
efi.set_time = (efi_set_time_t *) efi.systab->runtime->set_time;
|
||||
efi.get_wakeup_time = (efi_get_wakeup_time_t *)
|
||||
efi.systab->runtime->get_wakeup_time;
|
||||
efi.set_wakeup_time = (efi_set_wakeup_time_t *)
|
||||
efi.systab->runtime->set_wakeup_time;
|
||||
efi.get_variable = (efi_get_variable_t *)
|
||||
efi.systab->runtime->get_variable;
|
||||
efi.get_next_variable = (efi_get_next_variable_t *)
|
||||
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;
|
||||
efi.get_time = virt_efi_get_time;
|
||||
efi.set_time = virt_efi_set_time;
|
||||
efi.get_wakeup_time = virt_efi_get_wakeup_time;
|
||||
efi.set_wakeup_time = virt_efi_set_wakeup_time;
|
||||
efi.get_variable = virt_efi_get_variable;
|
||||
efi.get_next_variable = virt_efi_get_next_variable;
|
||||
efi.set_variable = virt_efi_set_variable;
|
||||
efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
|
||||
efi.reset_system = virt_efi_reset_system;
|
||||
}
|
||||
|
||||
void __init
|
||||
|
|
|
@ -302,12 +302,16 @@ sysenter_past_esp:
|
|||
pushl $(__USER_CS)
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
/*CFI_REL_OFFSET cs, 0*/
|
||||
#ifndef CONFIG_COMPAT_VDSO
|
||||
/*
|
||||
* Push current_thread_info()->sysenter_return to the stack.
|
||||
* A tiny bit of offset fixup is necessary - 4*4 means the 4 words
|
||||
* pushed above; +8 corresponds to copy_thread's esp0 setting.
|
||||
*/
|
||||
pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
|
||||
#else
|
||||
pushl $SYSENTER_RETURN
|
||||
#endif
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
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 current_vector = FIRST_DEVICE_VECTOR, offset = 0;
|
||||
int vector;
|
||||
static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
|
||||
int vector, offset, i;
|
||||
|
||||
BUG_ON((unsigned)irq >= NR_IRQ_VECTORS);
|
||||
|
||||
if (irq_vector[irq] > 0)
|
||||
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;
|
||||
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;
|
||||
|
||||
return vector;
|
||||
|
|
|
@ -310,13 +310,7 @@ static int __init setup_nmi_watchdog(char *str)
|
|||
|
||||
if ((nmi >= NMI_INVALID) || (nmi < NMI_NONE))
|
||||
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;
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -566,4 +566,11 @@ struct paravirt_ops paravirt_ops = {
|
|||
.irq_enable_sysexit = native_irq_enable_sysexit,
|
||||
.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
|
||||
__set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
|
||||
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
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_SEP)) {
|
||||
|
@ -100,6 +95,7 @@ int __init sysenter_setup(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_COMPAT_VDSO
|
||||
static struct page *syscall_nopage(struct vm_area_struct *vma,
|
||||
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;
|
||||
/* MAYWRITE to allow gdb to COW and set breakpoints */
|
||||
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_page_prot = protection_map[vma->vm_flags & 7];
|
||||
vma->vm_ops = &syscall_vm_ops;
|
||||
|
@ -187,3 +190,4 @@ int in_gate_area_no_task(unsigned long addr)
|
|||
{
|
||||
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
|
||||
* 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
|
||||
* 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)
|
||||
{
|
||||
if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM)
|
||||
return;
|
||||
|
||||
iosapic_unregister_intr(gsi);
|
||||
}
|
||||
|
||||
|
|
|
@ -122,6 +122,9 @@ static void migrate_irqs(void)
|
|||
for (irq=0; irq < NR_IRQS; irq++) {
|
||||
desc = irq_desc + irq;
|
||||
|
||||
if (desc->status == IRQ_DISABLED)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* No handling for now.
|
||||
* TBD: Implement a disable function so we can now
|
||||
|
|
|
@ -1568,6 +1568,20 @@ config MIPS_MT_FPAFF
|
|||
depends on MIPS_MT
|
||||
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
|
||||
bool "Load VPE program into memory hidden from linux"
|
||||
depends on MIPS_VPE_LOADER
|
||||
|
|
|
@ -623,7 +623,7 @@ LDFLAGS += -m $(ld-emul)
|
|||
|
||||
ifdef CONFIG_MIPS
|
||||
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/$$/'/")
|
||||
ifdef CONFIG_64BIT
|
||||
CHECKFLAGS += -m64
|
||||
|
|
|
@ -122,7 +122,7 @@ unsigned long __init prom_free_prom_memory(void)
|
|||
addr += PAGE_SIZE;
|
||||
}
|
||||
|
||||
printk("Freeing unused PROM memory: %ldk freed\n",
|
||||
printk("Freeing unused PROM memory: %ldkb freed\n",
|
||||
(end - PAGE_SIZE) >> 10);
|
||||
|
||||
return end - PAGE_SIZE;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/processor.h>
|
||||
|
@ -270,9 +271,12 @@ void smtc_configure_tlb(void)
|
|||
* of their initialization in smtc_cpu_setup().
|
||||
*/
|
||||
|
||||
tlbsiz = tlbsiz & 0x3f; /* MIPS32 limits TLB indices to 64 */
|
||||
cpu_data[0].tlbsize = tlbsiz;
|
||||
/* MIPS32 limits TLB indices to 64 */
|
||||
if (tlbsiz > 64)
|
||||
tlbsiz = 64;
|
||||
cpu_data[0].tlbsize = current_cpu_data.tlbsize = tlbsiz;
|
||||
smtc_status |= SMTC_TLB_SHARED;
|
||||
local_flush_tlb_all();
|
||||
|
||||
printk("TLB of %d entry pairs shared by %d VPEs\n",
|
||||
tlbsiz, vpes);
|
||||
|
@ -1017,6 +1021,35 @@ void setup_cross_vpe_interrupts(void)
|
|||
* 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)
|
||||
{
|
||||
#ifdef SMTC_IDLE_HOOK_DEBUG
|
||||
|
@ -1113,29 +1146,14 @@ void smtc_idle_loop_hook(void)
|
|||
if (pdb_msg != &id_ho_db_msg[0])
|
||||
printk("CPU%d: %s", smp_processor_id(), id_ho_db_msg);
|
||||
#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);
|
||||
smtc_cpu_stats[smp_processor_id()].selfipis++;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Replay any accumulated deferred IPIs. If "Instant Replay"
|
||||
* 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)
|
||||
|
|
|
@ -139,13 +139,16 @@ struct tc {
|
|||
struct list_head list;
|
||||
};
|
||||
|
||||
struct vpecontrol_ {
|
||||
struct {
|
||||
/* Virtual processing elements */
|
||||
struct list_head vpe_list;
|
||||
|
||||
/* Thread contexts */
|
||||
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 __attribute_used__ void dump_vpe(struct vpe * v); */
|
||||
|
@ -1388,8 +1391,6 @@ static int __init vpe_module_init(void)
|
|||
|
||||
/* dump_mtregs(); */
|
||||
|
||||
INIT_LIST_HEAD(&vpecontrol.vpe_list);
|
||||
INIT_LIST_HEAD(&vpecontrol.tc_list);
|
||||
|
||||
val = read_c0_mvpconf0();
|
||||
for (i = 0; i < ((val & MVPCONF0_PTC) + 1); i++) {
|
||||
|
|
|
@ -19,5 +19,6 @@
|
|||
# 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
|
||||
|
|
|
@ -57,7 +57,7 @@ void __init plat_mem_setup(void)
|
|||
board_time_init = sim_time_init;
|
||||
prom_printf("Linux started...\n");
|
||||
|
||||
#ifdef CONFIG_MT_SMP
|
||||
#ifdef CONFIG_MIPS_MT_SMP
|
||||
sanitize_tlb_entries();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -501,7 +501,8 @@ void free_initmem(void)
|
|||
|
||||
freed = prom_free_prom_memory();
|
||||
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",
|
||||
__pa_symbol(&__init_begin),
|
||||
|
|
|
@ -28,7 +28,7 @@ struct callvectors* debug_vectors;
|
|||
extern unsigned long marvell_base;
|
||||
extern unsigned long bus_clock;
|
||||
|
||||
#ifdef CONFIG_GALILLEO_GT64240_ETH
|
||||
#ifdef CONFIG_GALILEO_GT64240_ETH
|
||||
extern unsigned char prom_mac_addr_base[6];
|
||||
#endif
|
||||
|
||||
|
@ -61,7 +61,7 @@ void __init prom_init(void)
|
|||
mips_machgroup = MACH_GROUP_MOMENCO;
|
||||
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 */
|
||||
memcpy(prom_mac_addr_base, (void*)0xfc807cf2, 6);
|
||||
#endif
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
|
||||
#include "ocelot_pld.h"
|
||||
|
||||
#ifdef CONFIG_GALILLEO_GT64240_ETH
|
||||
#ifdef CONFIG_GALILEO_GT64240_ETH
|
||||
extern unsigned char prom_mac_addr_base[6];
|
||||
#endif
|
||||
|
||||
|
@ -185,7 +185,7 @@ void __init plat_mem_setup(void)
|
|||
/* do handoff reconfiguration */
|
||||
PMON_v2_setup();
|
||||
|
||||
#ifdef CONFIG_GALILLEO_GT64240_ETH
|
||||
#ifdef CONFIG_GALILEO_GT64240_ETH
|
||||
/* get the mac addr */
|
||||
memcpy(prom_mac_addr_base, (void*)0xfc807cf2, 6);
|
||||
#endif
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* 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
|
||||
* 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) {
|
||||
unsigned int source_irq = irq;
|
||||
desc = irq_desc + source_irq;
|
||||
desc->chip->ack(source_irq);
|
||||
if (desc->chip->mask_ack)
|
||||
desc->chip->mask_ack(source_irq);
|
||||
else {
|
||||
desc->chip->mask(source_irq);
|
||||
desc->chip->ack(source_irq);
|
||||
}
|
||||
irq = cascade->get_irq(irq);
|
||||
if (irq < 0)
|
||||
atomic_inc(&irq_err_count);
|
||||
else
|
||||
irq_dispatch(irq);
|
||||
desc->chip->end(source_irq);
|
||||
if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
|
||||
desc->chip->unmask(source_irq);
|
||||
} else
|
||||
do_IRQ(irq);
|
||||
}
|
||||
|
|
|
@ -492,6 +492,7 @@ config PPC_MAPLE
|
|||
select PPC_NATIVE
|
||||
select PPC_RTAS
|
||||
select MMIO_NVRAM
|
||||
select ATA_NONSTANDARD if ATA
|
||||
default n
|
||||
help
|
||||
This option enables support for the Maple 970FX Evaluation Board.
|
||||
|
@ -533,12 +534,15 @@ config PPC_IBM_CELL_BLADE
|
|||
select UDBG_RTAS_CONSOLE
|
||||
|
||||
config PPC_PS3
|
||||
bool "Sony PS3"
|
||||
bool "Sony PS3 (incomplete)"
|
||||
depends on PPC_MULTIPLATFORM && PPC64
|
||||
select PPC_CELL
|
||||
help
|
||||
This option enables support for the Sony PS3 game console
|
||||
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
|
||||
bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
|
||||
|
@ -1202,7 +1206,7 @@ source "arch/powerpc/oprofile/Kconfig"
|
|||
|
||||
config KPROBES
|
||||
bool "Kprobes (EXPERIMENTAL)"
|
||||
depends on PPC64 && KALLSYMS && EXPERIMENTAL && MODULES
|
||||
depends on !BOOKE && !4xx && KALLSYMS && EXPERIMENTAL && MODULES
|
||||
help
|
||||
Kprobes allows you to trap at almost any kernel address and
|
||||
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) {
|
||||
printk("Attempt to register kprobe at an unaligned address\n");
|
||||
ret = -EINVAL;
|
||||
} else if (IS_MTMSRD(insn) || IS_RFID(insn)) {
|
||||
printk("Cannot register a kprobe on rfid or mtmsrd\n");
|
||||
} else if (IS_MTMSRD(insn) || IS_RFID(insn) || IS_RFI(insn)) {
|
||||
printk("Cannot register a kprobe on rfi/rfid or mtmsr[d]\n");
|
||||
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));
|
||||
|
||||
/* setup return addr to the jprobe handler routine */
|
||||
#ifdef CONFIG_PPC64
|
||||
regs->nip = (unsigned long)(((func_descr_t *)jp->entry)->entry);
|
||||
regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
|
||||
#else
|
||||
regs->nip = (unsigned long)jp->entry;
|
||||
#endif
|
||||
|
||||
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) {
|
||||
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;
|
||||
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;
|
||||
unsigned long fpscr;
|
||||
|
||||
flush_fp_to_thread(current);
|
||||
|
||||
fpscr = current->thread.fpscr.val;
|
||||
int ret = 0;
|
||||
|
||||
/* Invalid operation */
|
||||
if ((fpscr & FPSCR_VE) && (fpscr & FPSCR_VX))
|
||||
code = FPE_FLTINV;
|
||||
ret = FPE_FLTINV;
|
||||
|
||||
/* Overflow */
|
||||
else if ((fpscr & FPSCR_OE) && (fpscr & FPSCR_OX))
|
||||
code = FPE_FLTOVF;
|
||||
ret = FPE_FLTOVF;
|
||||
|
||||
/* Underflow */
|
||||
else if ((fpscr & FPSCR_UE) && (fpscr & FPSCR_UX))
|
||||
code = FPE_FLTUND;
|
||||
ret = FPE_FLTUND;
|
||||
|
||||
/* Divide by zero */
|
||||
else if ((fpscr & FPSCR_ZE) && (fpscr & FPSCR_ZX))
|
||||
code = FPE_FLTDIV;
|
||||
ret = FPE_FLTDIV;
|
||||
|
||||
/* Inexact result */
|
||||
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);
|
||||
}
|
||||
|
@ -739,20 +745,7 @@ void __kprobes program_check_exception(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
|
||||
* has no FPU, in that case no reason flags will be set */
|
||||
#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 */
|
||||
* has no FPU, in that case the reason flags will be 0 */
|
||||
|
||||
if (reason & REASON_FP) {
|
||||
/* IEEE FP exception */
|
||||
|
@ -778,6 +771,31 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
|||
|
||||
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. */
|
||||
if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
|
||||
switch (emulate_instruction(regs)) {
|
||||
|
@ -891,18 +909,39 @@ void SoftwareEmulation(struct pt_regs *regs)
|
|||
|
||||
#ifdef CONFIG_MATH_EMULATION
|
||||
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
|
||||
errcode = Soft_emulate_8xx(regs);
|
||||
#endif
|
||||
if (errcode) {
|
||||
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
|
||||
switch (errcode) {
|
||||
case 0:
|
||||
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 */
|
||||
|
||||
|
|
|
@ -284,6 +284,13 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
|
|||
* pages though
|
||||
*/
|
||||
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_page_prot = protection_map[vma->vm_flags & 0x7];
|
||||
vma->vm_ops = &vdso_vmops;
|
||||
|
|
|
@ -16,11 +16,11 @@ obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \
|
|||
strcase.o
|
||||
obj-$(CONFIG_QUICC_ENGINE) += rheap.o
|
||||
obj-$(CONFIG_XMON) += sstep.o
|
||||
obj-$(CONFIG_KPROBES) += sstep.o
|
||||
obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o
|
||||
|
||||
ifeq ($(CONFIG_PPC64),y)
|
||||
obj-$(CONFIG_SMP) += locks.o
|
||||
obj-$(CONFIG_DEBUG_KERNEL) += sstep.o
|
||||
endif
|
||||
|
||||
# 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...
|
||||
*/
|
||||
void (*pm_power_off)(void) = machine_power_off;
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
extern void smp4m_boot_cpus(void);
|
||||
extern void smp4d_boot_cpus(void);
|
||||
extern void __init smp4m_boot_cpus(void);
|
||||
extern void __init smp4d_boot_cpus(void);
|
||||
int i, cpuid, extra;
|
||||
|
||||
printk("Entering SMP Mode...\n");
|
||||
|
@ -375,8 +375,8 @@ void __init smp_prepare_boot_cpu(void)
|
|||
|
||||
int __cpuinit __cpu_up(unsigned int cpu)
|
||||
{
|
||||
extern int smp4m_boot_one_cpu(int);
|
||||
extern int smp4d_boot_one_cpu(int);
|
||||
extern int __cpuinit smp4m_boot_one_cpu(int);
|
||||
extern int __cpuinit smp4d_boot_one_cpu(int);
|
||||
int ret=0;
|
||||
|
||||
switch(sparc_cpu_model) {
|
||||
|
|
|
@ -164,7 +164,7 @@ void __init smp4d_boot_cpus(void)
|
|||
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;
|
||||
unsigned long *entry = &sun4d_cpu_startup;
|
||||
|
|
|
@ -142,9 +142,9 @@ sun4v_dtlb_prot:
|
|||
rdpr %tl, %g1
|
||||
cmp %g1, 1
|
||||
bgu,pn %xcc, winfix_trampoline
|
||||
nop
|
||||
ba,pt %xcc, sparc64_realfault_common
|
||||
mov FAULT_CODE_DTLB | FAULT_CODE_WRITE, %g4
|
||||
ba,pt %xcc, sparc64_realfault_common
|
||||
nop
|
||||
|
||||
/* Called from trap table:
|
||||
* %g4: vaddr
|
||||
|
|
|
@ -19,31 +19,31 @@ config SEMAPHORE_SLEEPERS
|
|||
choice
|
||||
prompt "Host memory split"
|
||||
default HOST_VMSPLIT_3G
|
||||
---help---
|
||||
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
|
||||
not recompile your own kernel but use the default distro's one, you can
|
||||
safely accept the "Default split" option.
|
||||
help
|
||||
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
|
||||
not recompile your own kernel but use the default distro's one, you can
|
||||
safely accept the "Default split" option.
|
||||
|
||||
It can be enabled on recent (>=2.6.16-rc2) vanilla kernels via
|
||||
CONFIG_VM_SPLIT_*, or on previous kernels with special patches (-ck
|
||||
patchset by Con Kolivas, or other ones) - option names match closely the
|
||||
host CONFIG_VM_SPLIT_* ones.
|
||||
It can be enabled on recent (>=2.6.16-rc2) vanilla kernels via
|
||||
CONFIG_VM_SPLIT_*, or on previous kernels with special patches (-ck
|
||||
patchset by Con Kolivas, or other ones) - option names match closely the
|
||||
host CONFIG_VM_SPLIT_* ones.
|
||||
|
||||
A lower setting (where 1G/3G is lowest and 3G/1G is higher) will
|
||||
tolerate even more "normal" host kernels, but an higher setting will be
|
||||
stricter.
|
||||
A lower setting (where 1G/3G is lowest and 3G/1G is higher) will
|
||||
tolerate even more "normal" host kernels, but an higher setting will be
|
||||
stricter.
|
||||
|
||||
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
|
||||
bool "Default split (3G/1G user/kernel host split)"
|
||||
config HOST_VMSPLIT_3G_OPT
|
||||
bool "3G/1G user/kernel host split (for full 1G low memory)"
|
||||
config HOST_VMSPLIT_2G
|
||||
bool "2G/2G user/kernel host split"
|
||||
config HOST_VMSPLIT_1G
|
||||
bool "1G/3G user/kernel host split"
|
||||
config HOST_VMSPLIT_3G
|
||||
bool "Default split (3G/1G user/kernel host split)"
|
||||
config HOST_VMSPLIT_3G_OPT
|
||||
bool "3G/1G user/kernel host split (for full 1G low memory)"
|
||||
config HOST_VMSPLIT_2G
|
||||
bool "2G/2G user/kernel host split"
|
||||
config HOST_VMSPLIT_1G
|
||||
bool "1G/3G user/kernel host split"
|
||||
endchoice
|
||||
|
||||
config TOP_ADDR
|
||||
|
@ -67,13 +67,13 @@ config 3_LEVEL_PGTABLES
|
|||
|
||||
config STUB_CODE
|
||||
hex
|
||||
default 0xbfffe000 if !HOST_2G_2G
|
||||
default 0x7fffe000 if HOST_2G_2G
|
||||
default 0xbfffe000 if !HOST_VMSPLIT_2G
|
||||
default 0x7fffe000 if HOST_VMSPLIT_2G
|
||||
|
||||
config STUB_DATA
|
||||
hex
|
||||
default 0xbffff000 if !HOST_2G_2G
|
||||
default 0x7ffff000 if HOST_2G_2G
|
||||
default 0xbffff000 if !HOST_VMSPLIT_2G
|
||||
default 0x7ffff000 if HOST_VMSPLIT_2G
|
||||
|
||||
config STUB_START
|
||||
hex
|
||||
|
|
|
@ -219,7 +219,8 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig,
|
|||
unsigned long save_sp = PT_REGS_SP(regs);
|
||||
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;
|
||||
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
||||
return 1;
|
||||
|
|
|
@ -191,8 +191,9 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
|
|||
struct task_struct *me = current;
|
||||
|
||||
frame = (struct rt_sigframe __user *)
|
||||
round_down(stack_top - sizeof(struct rt_sigframe), 16) - 8;
|
||||
frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128);
|
||||
round_down(stack_top - sizeof(struct rt_sigframe), 16);
|
||||
/* 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)))
|
||||
goto out;
|
||||
|
|
|
@ -64,55 +64,6 @@ typedef unsigned int elf_greg_t;
|
|||
#define ELF_NGREG (sizeof (struct user_regs_struct32) / sizeof(elf_greg_t))
|
||||
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
|
||||
{
|
||||
int si_signo; /* signal number */
|
||||
|
|
|
@ -59,6 +59,13 @@ int syscall32_setup_pages(struct linux_binprm *bprm, int exstack)
|
|||
vma->vm_end = VSYSCALL32_END;
|
||||
/* MAYWRITE to allow gdb to COW and set breakpoints */
|
||||
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_page_prot = protection_map[vma->vm_flags & 7];
|
||||
vma->vm_ops = &syscall32_vm_ops;
|
||||
|
@ -75,6 +82,14 @@ int syscall32_setup_pages(struct linux_binprm *bprm, int exstack)
|
|||
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)
|
||||
{
|
||||
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))
|
||||
return 0;
|
||||
|
||||
if ((nmi == NMI_LOCAL_APIC) && (nmi_known_cpu() == 0))
|
||||
return 0; /* no lapic support */
|
||||
nmi_watchdog = nmi;
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -590,6 +590,12 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
|
|||
*/
|
||||
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) {
|
||||
list_add(&rq->queuelist, &q->queue_head);
|
||||
break;
|
||||
|
@ -604,11 +610,6 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
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,
|
||||
struct gendisk *bd_disk, struct sg_io_hdr *hdr)
|
||||
{
|
||||
unsigned long start_time;
|
||||
unsigned long start_time, timeout;
|
||||
int writing = 0, ret = 0;
|
||||
struct request *rq;
|
||||
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->timeout = jiffies_to_msecs(hdr->timeout);
|
||||
timeout = msecs_to_jiffies(hdr->timeout);
|
||||
rq->timeout = (timeout < INT_MAX) ? timeout : INT_MAX;
|
||||
if (!rq->timeout)
|
||||
rq->timeout = q->sg_timeout;
|
||||
if (!rq->timeout)
|
||||
|
|
|
@ -322,10 +322,6 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
|
|||
if (result)
|
||||
return result;
|
||||
|
||||
result = acpi_processor_get_platform_limit(pr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
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_device *device = NULL;
|
||||
|
||||
|
||||
printk("video device notify\n");
|
||||
if (!video_device)
|
||||
return;
|
||||
|
||||
|
|
|
@ -19,6 +19,10 @@ config ATA
|
|||
|
||||
if ATA
|
||||
|
||||
config ATA_NONSTANDARD
|
||||
bool
|
||||
default n
|
||||
|
||||
config SATA_AHCI
|
||||
tristate "AHCI SATA support"
|
||||
depends on PCI
|
||||
|
|
|
@ -75,6 +75,7 @@ enum {
|
|||
AHCI_CMD_CLR_BUSY = (1 << 10),
|
||||
|
||||
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 */
|
||||
|
||||
board_ahci = 0,
|
||||
|
@ -202,6 +203,10 @@ struct ahci_port_priv {
|
|||
dma_addr_t cmd_tbl_dma;
|
||||
void *rx_fis;
|
||||
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);
|
||||
|
@ -361,7 +366,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(INTEL, 0x27c1), board_ahci }, /* ICH7 */
|
||||
{ PCI_VDEVICE(INTEL, 0x27c5), board_ahci }, /* ICH7M */
|
||||
{ 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, 0x2682), 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;
|
||||
|
||||
if (!(cap & HOST_CAP_SSS))
|
||||
return;
|
||||
|
||||
/* put device into listen mode, first set PxSCTL.DET to 0 */
|
||||
scontrol = readl(port_mmio + PORT_SCR_CTL);
|
||||
scontrol &= ~0xf;
|
||||
writel(scontrol, port_mmio + PORT_SCR_CTL);
|
||||
|
||||
/* then set PxCMD.SUD to 0 */
|
||||
cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK;
|
||||
|
||||
if (cap & HOST_CAP_SSC) {
|
||||
/* 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 &= ~0xf;
|
||||
writel(scontrol, port_mmio + PORT_SCR_CTL);
|
||||
|
||||
/* then set PxCMD.SUD to 0 */
|
||||
cmd &= ~PORT_CMD_SPIN_UP;
|
||||
writel(cmd, port_mmio + PORT_CMD);
|
||||
}
|
||||
cmd &= ~PORT_CMD_SPIN_UP;
|
||||
writel(cmd, port_mmio + PORT_CMD);
|
||||
}
|
||||
|
||||
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 */
|
||||
ata_tf_init(ap->device, &tf);
|
||||
tf.command = 0xff;
|
||||
tf.command = 0x80;
|
||||
ata_tf_to_fis(&tf, d2h_fis, 0);
|
||||
|
||||
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 *port_mmio = ahci_port_base(mmio, ap->port_no);
|
||||
struct ata_eh_info *ehi = &ap->eh_info;
|
||||
struct ahci_port_priv *pp = ap->private_data;
|
||||
u32 status, qc_active;
|
||||
int rc;
|
||||
int rc, known_irq = 0;
|
||||
|
||||
status = readl(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 */
|
||||
|
||||
/* some devices send D2H reg with I bit set during NCQ command phase */
|
||||
if (ap->sactive && (status & PORT_IRQ_D2H_REG_FIS))
|
||||
/* if !NCQ, ignore. No modern ATA device has broken HSM
|
||||
* implementation for non-NCQ commands.
|
||||
*/
|
||||
if (!ap->sactive)
|
||||
return;
|
||||
|
||||
/* ignore interim PIO setup fis interrupts */
|
||||
if (ata_tag_valid(ap->active_tag) && (status & PORT_IRQ_PIOS_FIS))
|
||||
return;
|
||||
if (status & PORT_IRQ_D2H_REG_FIS) {
|
||||
if (!pp->ncq_saw_d2h)
|
||||
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 "
|
||||
"(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);
|
||||
}
|
||||
|
||||
|
@ -1257,7 +1282,7 @@ static void ahci_thaw(struct ata_port *ap)
|
|||
/* clear IRQ */
|
||||
tmp = readl(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 */
|
||||
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
|
||||
* @ap: interface to set up
|
||||
* @unused: returned device on error
|
||||
*
|
||||
* 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
|
||||
|
@ -71,7 +72,7 @@ static void generic_error_handler(struct ata_port *ap)
|
|||
* 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 i;
|
||||
|
@ -82,7 +83,7 @@ static void generic_set_mode(struct ata_port *ap)
|
|||
|
||||
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
||||
struct ata_device *dev = &ap->device[i];
|
||||
if (ata_dev_enabled(dev)) {
|
||||
if (ata_dev_ready(dev)) {
|
||||
/* We don't really care */
|
||||
dev->pio_mode = XFER_PIO_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 = {
|
||||
|
|
|
@ -1037,7 +1037,7 @@ static unsigned int ata_id_xfermask(const u16 *id)
|
|||
* the PIO timing number for the maximum. Turn it into
|
||||
* 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 */
|
||||
pio_mask = (2 << mode) - 1;
|
||||
else
|
||||
|
@ -1250,6 +1250,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
|
|||
|
||||
ata_sg_init(qc, sg, n_elem);
|
||||
qc->nsect = buflen / ATA_SECT_SIZE;
|
||||
qc->nbytes = buflen;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
/* has private set_mode? */
|
||||
if (ap->ops->set_mode) {
|
||||
/* FIXME: make ->set_mode handle no device case and
|
||||
* 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;
|
||||
}
|
||||
if (ap->ops->set_mode)
|
||||
return ap->ops->set_mode(ap, r_failed_dev);
|
||||
|
||||
/* step 1: calculate xfer_mask */
|
||||
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;
|
||||
|
||||
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;
|
||||
u8 scsi_cmd[MAX_COMMAND_SIZE];
|
||||
u8 args[7];
|
||||
struct scsi_sense_hdr sshdr;
|
||||
u8 args[7], *sensebuf = NULL;
|
||||
int cmd_result;
|
||||
|
||||
if (arg == NULL)
|
||||
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)))
|
||||
return -EFAULT;
|
||||
|
||||
sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
|
||||
if (!sensebuf)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(scsi_cmd, 0, sizeof(scsi_cmd));
|
||||
scsi_cmd[0] = ATA_16;
|
||||
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[6] = args[2];
|
||||
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
|
||||
from scsi_ioctl_send_command() for default case... */
|
||||
if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr,
|
||||
(10*HZ), 5))
|
||||
rc = -EIO;
|
||||
cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
|
||||
sensebuf, (10*HZ), 5, 0);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
|
@ -372,7 +411,7 @@ struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
|
|||
if (cmd->use_sg) {
|
||||
qc->__sg = (struct scatterlist *) cmd->request_buffer;
|
||||
qc->n_elem = cmd->use_sg;
|
||||
} else {
|
||||
} else if (cmd->request_bufflen) {
|
||||
qc->__sg = &qc->sgent;
|
||||
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 */
|
||||
} else {
|
||||
tf->nsect = 0; /* time period value (0 implies now) */
|
||||
tf->command = ATA_CMD_STANDBY;
|
||||
/* Consider: ATA STANDBY IMMEDIATE command */
|
||||
}
|
||||
} else
|
||||
/* Issue ATA STANDBY IMMEDIATE command */
|
||||
tf->command = ATA_CMD_STANDBYNOW1;
|
||||
|
||||
/*
|
||||
* Standby and Idle condition timers could be implemented but that
|
||||
* would require libata to implement the Power condition mode page
|
||||
|
|
|
@ -827,7 +827,8 @@ void ata_bmdma_error_handler(struct ata_port *ap)
|
|||
*/
|
||||
void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
|
||||
{
|
||||
ata_bmdma_stop(qc);
|
||||
if (qc->ap->ioaddr.bmdma_addr)
|
||||
ata_bmdma_stop(qc);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
|
@ -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;
|
||||
bmdma = pci_resource_start(pdev, 4);
|
||||
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->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);
|
||||
if (bmdma) {
|
||||
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->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;
|
||||
|
||||
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].altstatus_addr =
|
||||
probe_ent->port[0].ctl_addr = ATA_PRIMARY_CTL;
|
||||
if (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;
|
||||
}
|
||||
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 (probe_ent->irq)
|
||||
probe_ent->irq2 = ATA_SECONDARY_IRQ;
|
||||
probe_ent->irq2 = ATA_SECONDARY_IRQ(pdev);
|
||||
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].altstatus_addr =
|
||||
probe_ent->port[1].ctl_addr = ATA_SECONDARY_CTL;
|
||||
if (bmdma) {
|
||||
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;
|
||||
}
|
||||
ata_std_ports(&probe_ent->port[1]);
|
||||
|
|
|
@ -36,15 +36,22 @@ enum {
|
|||
static int atiixp_pre_reset(struct ata_port *ap)
|
||||
{
|
||||
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, 0x08, 0x00 }
|
||||
};
|
||||
u8 udma;
|
||||
|
||||
if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no]))
|
||||
return -ENOENT;
|
||||
|
||||
ap->cbl = ATA_CBL_PATA80;
|
||||
/* 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;
|
||||
else
|
||||
ap->cbl = ATA_CBL_PATA40;
|
||||
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 const u8 udma_data[] = {
|
||||
0x31, 0x21, 0x11, 0x25, 0x15, 0x05
|
||||
0x30, 0x20, 0x10, 0x20, 0x10, 0x00
|
||||
};
|
||||
static const u8 mwdma_data[] = {
|
||||
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, pciU, ®U);
|
||||
|
||||
regD &= ~(0x20 << shift);
|
||||
regU &= ~(0x35 << shift);
|
||||
/* DMA bits off */
|
||||
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;
|
||||
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 |= 0x20 << adev->devno;
|
||||
|
@ -239,8 +248,8 @@ static void cmd648_bmdma_stop(struct ata_queued_cmd *qc)
|
|||
struct ata_port *ap = qc->ap;
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
u8 dma_intr;
|
||||
int dma_reg = ap->port_no ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0;
|
||||
int dma_mask = ap->port_no ? ARTTIM2 : CFR;
|
||||
int dma_mask = ap->port_no ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0;
|
||||
int dma_reg = ap->port_no ? ARTTIM2 : CFR;
|
||||
|
||||
ata_bmdma_stop(qc);
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <linux/libata.h>
|
||||
|
||||
#define DRV_NAME "pata_hpt3x2n"
|
||||
#define DRV_VERSION "0.3"
|
||||
#define DRV_VERSION "0.3.2"
|
||||
|
||||
enum {
|
||||
HPT_PCI_FAST = (1 << 31),
|
||||
|
@ -297,11 +297,11 @@ static int hpt3x2n_pair_idle(struct ata_port *ap)
|
|||
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;
|
||||
/* See if we should use the DPLL */
|
||||
if (reading == 0)
|
||||
if (writing)
|
||||
return USE_DPLL; /* Needed for write */
|
||||
if (flags & PCI66)
|
||||
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
|
||||
* @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.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
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 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>
|
||||
|
||||
#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;
|
||||
|
||||
|
@ -38,6 +38,7 @@ static void ixp4xx_set_mode(struct ata_port *ap)
|
|||
dev->flags |= ATA_DFLAG_PIO;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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 */
|
||||
/* PATA controller is fn 1, AHCI is fn 0 */
|
||||
if (id->driver_data != 368 && PCI_FUNC(pdev->devfn) != 1)
|
||||
return -ENODEV;
|
||||
|
||||
/* 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 */
|
||||
if (PCI_FUNC(pdev->devfn) != 1)
|
||||
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, ®);
|
||||
reg |= (1 << 24); /* IDE1 to PATA IDE secondary */
|
||||
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
|
||||
* @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.
|
||||
*
|
||||
|
@ -105,7 +106,7 @@ static int pio_mask = 0x1F; /* PIO range for autospeed devices */
|
|||
* 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;
|
||||
|
||||
|
@ -118,6 +119,7 @@ static void legacy_set_mode(struct ata_port *ap)
|
|||
dev->flags |= ATA_DFLAG_PIO;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
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
|
||||
* 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;
|
||||
|
||||
|
@ -44,6 +44,7 @@ static void pata_platform_set_mode(struct ata_port *ap)
|
|||
dev->flags |= ATA_DFLAG_PIO;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
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
|
||||
* @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
|
||||
* would prefer to be BIOS generic but for the fact our hardware is
|
||||
* 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;
|
||||
|
||||
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
||||
struct ata_device *dev = &ap->device[i];
|
||||
if (ata_dev_enabled(dev)) {
|
||||
if (ata_dev_ready(dev)) {
|
||||
/* We don't really care */
|
||||
dev->pio_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;
|
||||
}
|
||||
}
|
||||
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 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 addr = sil680_seldev(ap, adev, 0x04);
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
* VIA VT8233c - UDMA100
|
||||
* VIA VT8235 - UDMA133
|
||||
* VIA VT8237 - UDMA133
|
||||
* VIA VT8237S - UDMA133
|
||||
* VIA VT8251 - UDMA133
|
||||
*
|
||||
* Most registers remain compatible across chips. Others start reserved
|
||||
|
@ -61,7 +62,7 @@
|
|||
#include <linux/libata.h>
|
||||
|
||||
#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
|
||||
|
@ -95,6 +96,7 @@ static const struct via_isa_bridge {
|
|||
u8 rev_max;
|
||||
u16 flags;
|
||||
} 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 },
|
||||
{ "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},
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||
int handled;
|
||||
|
||||
/* freeze if hotplugged */
|
||||
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 */
|
||||
handled = ata_host_intr(ap, qc);
|
||||
if (unlikely(!handled)) {
|
||||
/* spurious, clear it */
|
||||
ata_check_status(ap);
|
||||
}
|
||||
|
||||
return 1;
|
||||
return ata_host_intr(ap, qc);
|
||||
}
|
||||
|
||||
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) {
|
||||
u8 irq_stat = readb(host->mmio_base + NV_INT_STATUS_CK804)
|
||||
>> (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);
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -128,7 +128,8 @@ static const struct ata_port_operations uli_ops = {
|
|||
|
||||
static struct ata_port_info uli_port_info = {
|
||||
.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 */
|
||||
.udma_mask = 0x7f, /* udma0-6 */
|
||||
.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 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_noop_freeze(struct ata_port *ap);
|
||||
static void vt6420_error_handler(struct ata_port *ap);
|
||||
|
||||
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,
|
||||
.data_xfer = ata_pio_data_xfer,
|
||||
|
||||
.freeze = ata_bmdma_freeze,
|
||||
.freeze = svia_noop_freeze,
|
||||
.thaw = ata_bmdma_thaw,
|
||||
.error_handler = vt6420_error_handler,
|
||||
.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));
|
||||
}
|
||||
|
||||
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
|
||||
* @ap: target ATA port
|
||||
|
|
|
@ -1845,7 +1845,7 @@ static u16 __devinit read_bia (const hrz_dev * dev, u16 addr)
|
|||
|
||||
/********** initialise a card **********/
|
||||
|
||||
static int __init hrz_init (hrz_dev * dev) {
|
||||
static int __devinit hrz_init (hrz_dev * dev) {
|
||||
int onefivefive;
|
||||
|
||||
u16 chan;
|
||||
|
|
|
@ -101,6 +101,11 @@ static int amd_create_gatt_pages(int nr_tables)
|
|||
for (i = 0; i < nr_tables; i++) {
|
||||
entry = kzalloc(sizeof(struct amd_page_map), GFP_KERNEL);
|
||||
if (entry == NULL) {
|
||||
while (i > 0) {
|
||||
kfree(tables[i-1]);
|
||||
i--;
|
||||
}
|
||||
kfree(tables);
|
||||
retval = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче