Merge branch 'master'
Conflicts: drivers/scsi/libata-scsi.c include/linux/libata.h
This commit is contained in:
commit
10a5fd5e6b
6
CREDITS
6
CREDITS
|
@ -3382,7 +3382,7 @@ S: Germany
|
|||
|
||||
N: Geert Uytterhoeven
|
||||
E: geert@linux-m68k.org
|
||||
W: http://home.tvd.be/cr26864/
|
||||
W: http://users.telenet.be/geertu/
|
||||
P: 1024/862678A6 C51D 361C 0BD1 4C90 B275 C553 6EEA 11BA 8626 78A6
|
||||
D: m68k/Amiga and PPC/CHRP Longtrail coordinator
|
||||
D: Frame buffer device and XF68_FBDev maintainer
|
||||
|
@ -3392,8 +3392,8 @@ D: Amiga Buddha and Catweasel chipset IDE
|
|||
D: Atari Falcon chipset IDE
|
||||
D: Amiga Gayle chipset IDE
|
||||
D: mipsel NEC DDB Vrc-5074
|
||||
S: Emiel Vlieberghlaan 2A/21
|
||||
S: B-3010 Kessel-Lo
|
||||
S: Haterbeekstraat 55B
|
||||
S: B-3200 Aarschot
|
||||
S: Belgium
|
||||
|
||||
N: Chris Vance
|
||||
|
|
|
@ -194,7 +194,7 @@ document for how to handle this case.
|
|||
Finally, if your device can only drive the low 24-bits of
|
||||
address during PCI bus mastering you might do something like:
|
||||
|
||||
if (pci_set_dma_mask(pdev, 0x00ffffff)) {
|
||||
if (pci_set_dma_mask(pdev, DMA_24BIT_MASK)) {
|
||||
printk(KERN_WARNING
|
||||
"mydev: 24-bit DMA addressing not available.\n");
|
||||
goto ignore_this_device;
|
||||
|
@ -212,7 +212,7 @@ functions (for example a sound card provides playback and record
|
|||
functions) and the various different functions have _different_
|
||||
DMA addressing limitations, you may wish to probe each mask and
|
||||
only provide the functionality which the machine can handle. It
|
||||
is important that the last call to pci_set_dma_mask() be for the
|
||||
is important that the last call to pci_set_dma_mask() be for the
|
||||
most specific mask.
|
||||
|
||||
Here is pseudo-code showing how this might be done:
|
||||
|
|
|
@ -705,7 +705,7 @@ and other resources, etc.
|
|||
|
||||
<sect1><title>ata_scsi_error()</title>
|
||||
<para>
|
||||
ata_scsi_error() is the current hostt->eh_strategy_handler()
|
||||
ata_scsi_error() is the current transportt->eh_strategy_handler()
|
||||
for libata. As discussed above, this will be entered in two
|
||||
cases - timeout and ATAPI error completion. This function
|
||||
calls low level libata driver's eng_timeout() callback, the
|
||||
|
|
|
@ -71,14 +71,6 @@ Who: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: remove EXPORT_SYMBOL(panic_timeout)
|
||||
When: April 2006
|
||||
Files: kernel/panic.c
|
||||
Why: No modular usage in the kernel.
|
||||
Who: Adrian Bunk <bunk@stusta.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: remove EXPORT_SYMBOL(insert_resource)
|
||||
When: April 2006
|
||||
Files: kernel/resource.c
|
||||
|
|
|
@ -694,7 +694,7 @@ struct file_operations
|
|||
----------------------
|
||||
|
||||
This describes how the VFS can manipulate an open file. As of kernel
|
||||
2.6.13, the following members are defined:
|
||||
2.6.17, the following members are defined:
|
||||
|
||||
struct file_operations {
|
||||
loff_t (*llseek) (struct file *, loff_t, int);
|
||||
|
@ -723,6 +723,10 @@ struct file_operations {
|
|||
int (*check_flags)(int);
|
||||
int (*dir_notify)(struct file *filp, unsigned long arg);
|
||||
int (*flock) (struct file *, int, struct file_lock *);
|
||||
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned
|
||||
int);
|
||||
ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned
|
||||
int);
|
||||
};
|
||||
|
||||
Again, all methods are called without any locks being held, unless
|
||||
|
@ -790,6 +794,12 @@ otherwise noted.
|
|||
|
||||
flock: called by the flock(2) system call
|
||||
|
||||
splice_write: called by the VFS to splice data from a pipe to a file. This
|
||||
method is used by the splice(2) system call
|
||||
|
||||
splice_read: called by the VFS to splice data from file to a pipe. This
|
||||
method is used by the splice(2) system call
|
||||
|
||||
Note that the file operations are implemented by the specific
|
||||
filesystem in which the inode resides. When opening a device node
|
||||
(character or block special) most filesystems will call special
|
||||
|
|
|
@ -0,0 +1,286 @@
|
|||
GigaSet 307x Device Driver
|
||||
==========================
|
||||
|
||||
1. Requirements
|
||||
------------
|
||||
1.1. Hardware
|
||||
--------
|
||||
This release supports the connection of the Gigaset 307x/417x family of
|
||||
ISDN DECT bases via Gigaset M101 Data, Gigaset M105 Data or direct USB
|
||||
connection. The following devices are reported to be compatible:
|
||||
307x/417x:
|
||||
Gigaset SX255isdn
|
||||
Gigaset SX353isdn
|
||||
Sinus 45 [AB] isdn (Deutsche Telekom)
|
||||
Sinus 721X/XA
|
||||
Vox Chicago 390 ISDN (KPN Telecom)
|
||||
M101:
|
||||
Sinus 45 Data 1 (Telekom)
|
||||
M105:
|
||||
Gigaset USB Adapter DECT
|
||||
Sinus 45 Data 2 (Telekom)
|
||||
Sinus 721 data
|
||||
Chicago 390 USB (KPN)
|
||||
See also http://www.erbze.info/sinus_gigaset.htm and
|
||||
http://gigaset307x.sourceforge.net/
|
||||
|
||||
We had also reports from users of Gigaset M105 who could use the drivers
|
||||
with SX 100 and CX 100 ISDN bases (only in unimodem mode, see section 2.4.)
|
||||
If you have another device that works with our driver, please let us know.
|
||||
For example, Gigaset SX205isdn/Sinus 721 X SE and Gigaset SX303isdn bases
|
||||
are just versions without answering machine of models known to work, so
|
||||
they should work just as well; but so far we are lacking positive reports
|
||||
on these.
|
||||
|
||||
Chances of getting an USB device to work are good if the output of
|
||||
lsusb
|
||||
at the command line contains one of the following:
|
||||
ID 0681:0001
|
||||
ID 0681:0002
|
||||
ID 0681:0009
|
||||
ID 0681:0021
|
||||
ID 0681:0022
|
||||
|
||||
1.2. Software
|
||||
--------
|
||||
The driver works with ISDN4linux and so can be used with any software
|
||||
which is able to use ISDN4linux for ISDN connections (voice or data).
|
||||
CAPI4Linux support is planned but not yet available.
|
||||
|
||||
There are some user space tools available at
|
||||
http://sourceforge.net/projects/gigaset307x/
|
||||
which provide access to additional device specific functions like SMS,
|
||||
phonebook or call journal.
|
||||
|
||||
|
||||
2. How to use the driver
|
||||
---------------------
|
||||
2.1. Modules
|
||||
-------
|
||||
To get the device working, you have to load the proper kernel module. You
|
||||
can do this using
|
||||
modprobe modulename
|
||||
where modulename is usb_gigaset (M105) or bas_gigaset (direct USB
|
||||
connection to the base).
|
||||
|
||||
2.2. Device nodes for user space programs
|
||||
------------------------------------
|
||||
The device can be accessed from user space (eg. by the user space tools
|
||||
mentioned in 1.2.) through the device nodes:
|
||||
|
||||
- /dev/ttyGU0 for M105 (USB data boxes)
|
||||
- /dev/ttyGB0 for the base driver (direct USB connection)
|
||||
|
||||
You can also select a "default device" which is used by the frontends when
|
||||
no device node is given as parameter, by creating a symlink /dev/ttyG to
|
||||
one of them, eg.:
|
||||
|
||||
ln -s /dev/ttyGB0 /dev/ttyG
|
||||
|
||||
2.3. ISDN4linux
|
||||
----------
|
||||
This is the "normal" mode of operation. After loading the module you can
|
||||
set up the ISDN system just as you'd do with any ISDN card.
|
||||
Your distribution should provide some configuration utility.
|
||||
If not, you can use some HOWTOs like
|
||||
http://www.linuxhaven.de/dlhp/HOWTO/DE-ISDN-HOWTO-5.html
|
||||
If this doesn't work, because you have some recent device like SX100 where
|
||||
debug output (see section 3.2.) shows something like this when dialing
|
||||
CMD Received: ERROR
|
||||
Available Params: 0
|
||||
Connection State: 0, Response: -1
|
||||
gigaset_process_response: resp_code -1 in ConState 0 !
|
||||
Timeout occurred
|
||||
you might need to use unimodem mode:
|
||||
|
||||
2.4. Unimodem mode
|
||||
-------------
|
||||
This is needed for some devices [e.g. SX100] as they have problems with
|
||||
the "normal" commands.
|
||||
|
||||
If you have installed the command line tool gigacontr, you can enter
|
||||
unimodem mode using
|
||||
gigacontr --mode unimodem
|
||||
You can switch back using
|
||||
gigacontr --mode isdn
|
||||
|
||||
You can also load the driver using e.g.
|
||||
modprobe usb_gigaset startmode=0
|
||||
to prevent the driver from starting in "isdn4linux mode".
|
||||
|
||||
In this mode the device works like a modem connected to a serial port
|
||||
(the /dev/ttyGU0, ... mentioned above) which understands the commands
|
||||
ATZ init, reset
|
||||
=> OK or ERROR
|
||||
ATD
|
||||
ATDT dial
|
||||
=> OK, CONNECT,
|
||||
BUSY,
|
||||
NO DIAL TONE,
|
||||
NO CARRIER,
|
||||
NO ANSWER
|
||||
<pause>+++<pause> change to command mode when connected
|
||||
ATH hangup
|
||||
|
||||
You can use some configuration tool of your distribution to configure this
|
||||
"modem" or configure pppd/wvdial manually. There are some example ppp
|
||||
configuration files and chat scripts in the gigaset-VERSION/ppp directory.
|
||||
Please note that the USB drivers are not able to change the state of the
|
||||
control lines (the M105 driver can be configured to use some undocumented
|
||||
control requests, if you really need the control lines, though). This means
|
||||
you must use "Stupid Mode" if you are using wvdial or you should use the
|
||||
nocrtscts option of pppd.
|
||||
You must also assure that the ppp_async module is loaded with the parameter
|
||||
flag_time=0. You can do this e.g. by adding a line like
|
||||
|
||||
options ppp_async flag_time=0
|
||||
|
||||
to /etc/modprobe.conf. If your distribution has some local module
|
||||
configuration file like /etc/modprobe.conf.local,
|
||||
using that should be preferred.
|
||||
|
||||
2.5. Call-ID (CID) mode
|
||||
------------------
|
||||
Call-IDs are numbers used to tag commands to, and responses from, the
|
||||
Gigaset base in order to support the simultaneous handling of multiple
|
||||
ISDN calls. Their use can be enabled ("CID mode") or disabled ("Unimodem
|
||||
mode"). Without Call-IDs (in Unimodem mode), only a very limited set of
|
||||
functions is available. It allows outgoing data connections only, but
|
||||
does not signal incoming calls or other base events.
|
||||
|
||||
DECT cordless data devices (M10x) permanently occupy the cordless
|
||||
connection to the base while Call-IDs are activated. As the Gigaset
|
||||
bases only support one DECT data connection at a time, this prevents
|
||||
other DECT cordless data devices from accessing the base.
|
||||
|
||||
During active operation, the driver switches to the necessary mode
|
||||
automatically. However, for the reasons above, the mode chosen when
|
||||
the device is not in use (idle) can be selected by the user.
|
||||
- If you want to receive incoming calls, you can use the default
|
||||
settings (CID mode).
|
||||
- If you have several DECT data devices (M10x) which you want to use
|
||||
in turn, select Unimodem mode by passing the parameter "cidmode=0" to
|
||||
the driver ("modprobe usb_gigaset cidmode=0" or modprobe.conf).
|
||||
|
||||
If you want both of these at once, you are out of luck.
|
||||
|
||||
You can also use /sys/module/<name>/parameters/cidmode for changing
|
||||
the CID mode setting (<name> is usb_gigaset or bas_gigaset).
|
||||
|
||||
|
||||
3. Troubleshooting
|
||||
---------------
|
||||
3.1. Solutions to frequently reported problems
|
||||
-----------------------------------------
|
||||
Problem:
|
||||
You have a slow provider and isdn4linux gives up dialing too early.
|
||||
Solution:
|
||||
Load the isdn module using the dialtimeout option. You can do this e.g.
|
||||
by adding a line like
|
||||
|
||||
options isdn dialtimeout=15
|
||||
|
||||
to /etc/modprobe.conf. If your distribution has some local module
|
||||
configuration file like /etc/modprobe.conf.local,
|
||||
using that should be preferred.
|
||||
|
||||
Problem:
|
||||
Your isdn script aborts with a message about isdnlog.
|
||||
Solution:
|
||||
Try deactivating (or commenting out) isdnlog. This driver does not
|
||||
support it.
|
||||
|
||||
Problem:
|
||||
You have two or more DECT data adapters (M101/M105) and only the
|
||||
first one you turn on works.
|
||||
Solution:
|
||||
Select Unimodem mode for all DECT data adapters. (see section 2.4.)
|
||||
|
||||
3.2. Telling the driver to provide more information
|
||||
----------------------------------------------
|
||||
Building the driver with the "Gigaset debugging" kernel configuration
|
||||
option (CONFIG_GIGASET_DEBUG) gives it the ability to produce additional
|
||||
information useful for debugging.
|
||||
|
||||
You can control the amount of debugging information the driver produces by
|
||||
writing an appropriate value to /sys/module/gigaset/parameters/debug, e.g.
|
||||
echo 0 > /sys/module/gigaset/parameters/debug
|
||||
switches off debugging output completely,
|
||||
echo 0x10a020 > /sys/module/gigaset/parameters/debug
|
||||
enables the standard set of debugging output messages. These values are
|
||||
bit patterns where every bit controls a certain type of debugging output.
|
||||
See the constants DEBUG_* in the source file gigaset.h for details.
|
||||
|
||||
The initial value can be set using the debug parameter when loading the
|
||||
module "gigaset", e.g. by adding a line
|
||||
options gigaset debug=0
|
||||
to /etc/modprobe.conf, ...
|
||||
|
||||
Generated debugging information can be found
|
||||
- as output of the command
|
||||
dmesg
|
||||
- in system log files written by your syslog daemon, usually
|
||||
in /var/log/, e.g. /var/log/messages.
|
||||
|
||||
3.3. Reporting problems and bugs
|
||||
---------------------------
|
||||
If you can't solve problems with the driver on your own, feel free to
|
||||
use one of the forums, bug trackers, or mailing lists on
|
||||
http://sourceforge.net/projects/gigaset307x
|
||||
or write an electronic mail to the maintainers.
|
||||
|
||||
Try to provide as much information as possible, such as
|
||||
- distribution
|
||||
- kernel version (uname -r)
|
||||
- gcc version (gcc --version)
|
||||
- hardware architecture (uname -m, ...)
|
||||
- type and firmware version of your device (base and wireless module,
|
||||
if any)
|
||||
- output of "lsusb -v" (if using an USB device)
|
||||
- error messages
|
||||
- relevant system log messages (it would help if you activate debug
|
||||
output as described in 3.2.)
|
||||
|
||||
For help with general configuration problems not specific to our driver,
|
||||
such as isdn4linux and network configuration issues, please refer to the
|
||||
appropriate forums and newsgroups.
|
||||
|
||||
3.4. Reporting problem solutions
|
||||
---------------------------
|
||||
If you solved a problem with our drivers, wrote startup scripts for your
|
||||
distribution, ... feel free to contact us (using one of the places
|
||||
mentioned in 3.3.). We'd like to add scripts, hints, documentation
|
||||
to the driver and/or the project web page.
|
||||
|
||||
|
||||
4. Links, other software
|
||||
---------------------
|
||||
- Sourceforge project developing this driver and associated tools
|
||||
http://sourceforge.net/projects/gigaset307x
|
||||
- Yahoo! Group on the Siemens Gigaset family of devices
|
||||
http://de.groups.yahoo.com/group/Siemens-Gigaset
|
||||
- Siemens Gigaset/T-Sinus compatibility table
|
||||
http://www.erbze.info/sinus_gigaset.htm
|
||||
|
||||
|
||||
5. Credits
|
||||
-------
|
||||
Thanks to
|
||||
|
||||
Karsten Keil
|
||||
for his help with isdn4linux
|
||||
Deti Fliegl
|
||||
for his base driver code
|
||||
Dennis Dietrich
|
||||
for his kernel 2.6 patches
|
||||
Andreas Rummel
|
||||
for his work and logs to get unimodem mode working
|
||||
Andreas Degert
|
||||
for his logs and patches to get cx 100 working
|
||||
Dietrich Feist
|
||||
for his generous donation of one M105 and two M101 cordless adapters
|
||||
Christoph Schweers
|
||||
for his generous donation of a M34 device
|
||||
|
||||
and all the other people who sent logs and other information.
|
||||
|
|
@ -44,7 +44,7 @@ What is covered within this file is mainly information to authors
|
|||
of modules. The author of an external modules should supply
|
||||
a makefile that hides most of the complexity so one only has to type
|
||||
'make' to build the module. A complete example will be present in
|
||||
chapter ¤. Creating a kbuild file for an external module".
|
||||
chapter 4, "Creating a kbuild file for an external module".
|
||||
|
||||
|
||||
=== 2. How to build external modules
|
||||
|
|
|
@ -919,11 +919,11 @@ int main(int argc, char **argv)
|
|||
int settle_time = 60;
|
||||
|
||||
/* Parse the simple command-line */
|
||||
if (ac == 2)
|
||||
disk = av[1];
|
||||
else if (ac == 4) {
|
||||
settle_time = atoi(av[2]);
|
||||
disk = av[3];
|
||||
if (argc == 2)
|
||||
disk = argv[1];
|
||||
else if (argc == 4) {
|
||||
settle_time = atoi(argv[2]);
|
||||
disk = argv[3];
|
||||
} else
|
||||
usage();
|
||||
|
||||
|
|
|
@ -610,6 +610,7 @@ loads. Consider the following sequence of events:
|
|||
|
||||
CPU 1 CPU 2
|
||||
======================= =======================
|
||||
{ B = 7; X = 9; Y = 8; C = &Y }
|
||||
STORE A = 1
|
||||
STORE B = 2
|
||||
<write barrier>
|
||||
|
@ -651,7 +652,20 @@ In the above example, CPU 2 perceives that B is 7, despite the load of *C
|
|||
(which would be B) coming after the the LOAD of C.
|
||||
|
||||
If, however, a data dependency barrier were to be placed between the load of C
|
||||
and the load of *C (ie: B) on CPU 2, then the following will occur:
|
||||
and the load of *C (ie: B) on CPU 2:
|
||||
|
||||
CPU 1 CPU 2
|
||||
======================= =======================
|
||||
{ B = 7; X = 9; Y = 8; C = &Y }
|
||||
STORE A = 1
|
||||
STORE B = 2
|
||||
<write barrier>
|
||||
STORE C = &B LOAD X
|
||||
STORE D = 4 LOAD C (gets &B)
|
||||
<data dependency barrier>
|
||||
LOAD *C (reads B)
|
||||
|
||||
then the following will occur:
|
||||
|
||||
+-------+ : : : :
|
||||
| | +------+ +-------+
|
||||
|
@ -829,8 +843,8 @@ There are some more advanced barrier functions:
|
|||
(*) smp_mb__after_atomic_inc();
|
||||
|
||||
These are for use with atomic add, subtract, increment and decrement
|
||||
functions, especially when used for reference counting. These functions
|
||||
do not imply memory barriers.
|
||||
functions that don't return a value, especially when used for reference
|
||||
counting. These functions do not imply memory barriers.
|
||||
|
||||
As an example, consider a piece of code that marks an object as being dead
|
||||
and then decrements the object's reference count:
|
||||
|
@ -1263,15 +1277,17 @@ else.
|
|||
ATOMIC OPERATIONS
|
||||
-----------------
|
||||
|
||||
Though they are technically interprocessor interaction considerations, atomic
|
||||
operations are noted specially as they do _not_ generally imply memory
|
||||
barriers. The possible offenders include:
|
||||
Whilst they are technically interprocessor interaction considerations, atomic
|
||||
operations are noted specially as some of them imply full memory barriers and
|
||||
some don't, but they're very heavily relied on as a group throughout the
|
||||
kernel.
|
||||
|
||||
Any atomic operation that modifies some state in memory and returns information
|
||||
about the state (old or new) implies an SMP-conditional general memory barrier
|
||||
(smp_mb()) on each side of the actual operation. These include:
|
||||
|
||||
xchg();
|
||||
cmpxchg();
|
||||
test_and_set_bit();
|
||||
test_and_clear_bit();
|
||||
test_and_change_bit();
|
||||
atomic_cmpxchg();
|
||||
atomic_inc_return();
|
||||
atomic_dec_return();
|
||||
|
@ -1282,21 +1298,31 @@ barriers. The possible offenders include:
|
|||
atomic_sub_and_test();
|
||||
atomic_add_negative();
|
||||
atomic_add_unless();
|
||||
test_and_set_bit();
|
||||
test_and_clear_bit();
|
||||
test_and_change_bit();
|
||||
|
||||
These may be used for such things as implementing LOCK operations or controlling
|
||||
the lifetime of objects by decreasing their reference counts. In such cases
|
||||
they need preceding memory barriers.
|
||||
These are used for such things as implementing LOCK-class and UNLOCK-class
|
||||
operations and adjusting reference counters towards object destruction, and as
|
||||
such the implicit memory barrier effects are necessary.
|
||||
|
||||
The following may also be possible offenders as they may be used as UNLOCK
|
||||
operations.
|
||||
|
||||
The following operation are potential problems as they do _not_ imply memory
|
||||
barriers, but might be used for implementing such things as UNLOCK-class
|
||||
operations:
|
||||
|
||||
atomic_set();
|
||||
set_bit();
|
||||
clear_bit();
|
||||
change_bit();
|
||||
atomic_set();
|
||||
|
||||
With these the appropriate explicit memory barrier should be used if necessary
|
||||
(smp_mb__before_clear_bit() for instance).
|
||||
|
||||
|
||||
The following are a little tricky:
|
||||
The following also do _not_ imply memory barriers, and so may require explicit
|
||||
memory barriers under some circumstances (smp_mb__before_atomic_dec() for
|
||||
instance)):
|
||||
|
||||
atomic_add();
|
||||
atomic_sub();
|
||||
|
@ -1317,10 +1343,12 @@ specific order.
|
|||
|
||||
|
||||
Basically, each usage case has to be carefully considered as to whether memory
|
||||
barriers are needed or not. The simplest rule is probably: if the atomic
|
||||
operation is protected by a lock, then it does not require a barrier unless
|
||||
there's another operation within the critical section with respect to which an
|
||||
ordering must be maintained.
|
||||
barriers are needed or not.
|
||||
|
||||
[!] Note that special memory barrier primitives are available for these
|
||||
situations because on some CPUs the atomic instructions used imply full memory
|
||||
barriers, and so barrier instructions are superfluous in conjunction with them,
|
||||
and in such cases the special barrier primitives will be no-ops.
|
||||
|
||||
See Documentation/atomic_ops.txt for more information.
|
||||
|
||||
|
|
|
@ -138,19 +138,29 @@ Reading MTRRs from a C program using ioctl()'s:
|
|||
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <errno.h>
|
||||
#define MTRR_NEED_STRINGS
|
||||
#include <asm/mtrr.h>
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define ERRSTRING strerror (errno)
|
||||
|
||||
static char *mtrr_strings[MTRR_NUM_TYPES] =
|
||||
{
|
||||
"uncachable", /* 0 */
|
||||
"write-combining", /* 1 */
|
||||
"?", /* 2 */
|
||||
"?", /* 3 */
|
||||
"write-through", /* 4 */
|
||||
"write-protect", /* 5 */
|
||||
"write-back", /* 6 */
|
||||
};
|
||||
|
||||
int main ()
|
||||
{
|
||||
|
@ -232,13 +242,22 @@ Creating MTRRs from a C programme using ioctl()'s:
|
|||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <errno.h>
|
||||
#define MTRR_NEED_STRINGS
|
||||
#include <asm/mtrr.h>
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define ERRSTRING strerror (errno)
|
||||
|
||||
static char *mtrr_strings[MTRR_NUM_TYPES] =
|
||||
{
|
||||
"uncachable", /* 0 */
|
||||
"write-combining", /* 1 */
|
||||
"?", /* 2 */
|
||||
"?", /* 3 */
|
||||
"write-through", /* 4 */
|
||||
"write-protect", /* 5 */
|
||||
"write-back", /* 6 */
|
||||
};
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
|
|
|
@ -19,9 +19,9 @@ TABLE OF CONTENTS
|
|||
[2-1-1] Overview
|
||||
[2-1-2] Flow of scmds through EH
|
||||
[2-1-3] Flow of control
|
||||
[2-2] EH through hostt->eh_strategy_handler()
|
||||
[2-2-1] Pre hostt->eh_strategy_handler() SCSI midlayer conditions
|
||||
[2-2-2] Post hostt->eh_strategy_handler() SCSI midlayer conditions
|
||||
[2-2] EH through transportt->eh_strategy_handler()
|
||||
[2-2-1] Pre transportt->eh_strategy_handler() SCSI midlayer conditions
|
||||
[2-2-2] Post transportt->eh_strategy_handler() SCSI midlayer conditions
|
||||
[2-2-3] Things to consider
|
||||
|
||||
|
||||
|
@ -413,9 +413,9 @@ scmd->allowed.
|
|||
layer of failure of the scmds.
|
||||
|
||||
|
||||
[2-2] EH through hostt->eh_strategy_handler()
|
||||
[2-2] EH through transportt->eh_strategy_handler()
|
||||
|
||||
hostt->eh_strategy_handler() is invoked in the place of
|
||||
transportt->eh_strategy_handler() is invoked in the place of
|
||||
scsi_unjam_host() and it is responsible for whole recovery process.
|
||||
On completion, the handler should have made lower layers forget about
|
||||
all failed scmds and either ready for new commands or offline. Also,
|
||||
|
@ -424,7 +424,7 @@ SCSI midlayer. IOW, of the steps described in [2-1-2], all steps
|
|||
except for #1 must be implemented by eh_strategy_handler().
|
||||
|
||||
|
||||
[2-2-1] Pre hostt->eh_strategy_handler() SCSI midlayer conditions
|
||||
[2-2-1] Pre transportt->eh_strategy_handler() SCSI midlayer conditions
|
||||
|
||||
The following conditions are true on entry to the handler.
|
||||
|
||||
|
@ -437,7 +437,7 @@ except for #1 must be implemented by eh_strategy_handler().
|
|||
- shost->host_failed == shost->host_busy
|
||||
|
||||
|
||||
[2-2-2] Post hostt->eh_strategy_handler() SCSI midlayer conditions
|
||||
[2-2-2] Post transportt->eh_strategy_handler() SCSI midlayer conditions
|
||||
|
||||
The following conditions must be true on exit from the handler.
|
||||
|
||||
|
|
|
@ -804,7 +804,6 @@ Summary:
|
|||
eh_bus_reset_handler - issue SCSI bus reset
|
||||
eh_device_reset_handler - issue SCSI device reset
|
||||
eh_host_reset_handler - reset host (host bus adapter)
|
||||
eh_strategy_handler - driver supplied alternate to scsi_unjam_host()
|
||||
info - supply information about given host
|
||||
ioctl - driver can respond to ioctls
|
||||
proc_info - supports /proc/scsi/{driver_name}/{host_no}
|
||||
|
@ -969,24 +968,6 @@ Details:
|
|||
int eh_host_reset_handler(struct scsi_cmnd * scp)
|
||||
|
||||
|
||||
/**
|
||||
* eh_strategy_handler - driver supplied alternate to scsi_unjam_host()
|
||||
* @shp: host on which error has occurred
|
||||
*
|
||||
* Returns TRUE if host unjammed, else FALSE.
|
||||
*
|
||||
* Locks: none
|
||||
*
|
||||
* Calling context: kernel thread
|
||||
*
|
||||
* Notes: Invoked from scsi_eh thread. LLD supplied alternate to
|
||||
* scsi_unjam_host() found in scsi_error.c
|
||||
*
|
||||
* Optionally defined in: LLD
|
||||
**/
|
||||
int eh_strategy_handler(struct Scsi_Host * shp)
|
||||
|
||||
|
||||
/**
|
||||
* info - supply information about given host: driver name plus data
|
||||
* to distinguish given host
|
||||
|
|
|
@ -1123,8 +1123,8 @@
|
|||
if ((err = pci_enable_device(pci)) < 0)
|
||||
return err;
|
||||
/* check PCI availability (28bit DMA) */
|
||||
if (pci_set_dma_mask(pci, 0x0fffffff) < 0 ||
|
||||
pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) {
|
||||
if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
|
||||
pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
|
||||
printk(KERN_ERR "error to set 28bit mask DMA\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
@ -1216,7 +1216,7 @@
|
|||
The allocation of PCI resources is done in the
|
||||
<function>probe()</function> function, and usually an extra
|
||||
<function>xxx_create()</function> function is written for this
|
||||
purpose.
|
||||
purpose.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
@ -1225,7 +1225,7 @@
|
|||
allocating resources. Also, you need to set the proper PCI DMA
|
||||
mask to limit the accessed i/o range. In some cases, you might
|
||||
need to call <function>pci_set_master()</function> function,
|
||||
too.
|
||||
too.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
@ -1236,8 +1236,8 @@
|
|||
<![CDATA[
|
||||
if ((err = pci_enable_device(pci)) < 0)
|
||||
return err;
|
||||
if (pci_set_dma_mask(pci, 0x0fffffff) < 0 ||
|
||||
pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) {
|
||||
if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
|
||||
pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
|
||||
printk(KERN_ERR "error to set 28bit mask DMA\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
@ -1256,13 +1256,13 @@
|
|||
functions. Unlike ALSA ver.0.5.x., there are no helpers for
|
||||
that. And these resources must be released in the destructor
|
||||
function (see below). Also, on ALSA 0.9.x, you don't need to
|
||||
allocate (pseudo-)DMA for PCI like ALSA 0.5.x.
|
||||
allocate (pseudo-)DMA for PCI like ALSA 0.5.x.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Now assume that this PCI device has an I/O port with 8 bytes
|
||||
and an interrupt. Then struct <structname>mychip</structname> will have the
|
||||
following fields:
|
||||
following fields:
|
||||
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
|
|
|
@ -27,7 +27,7 @@ number of free hugetlb pages at any time. It also displays information about
|
|||
the configured hugepage size - this is needed for generating the proper
|
||||
alignment and size of the arguments to the above system calls.
|
||||
|
||||
The output of "cat /proc/meminfo" will have output like:
|
||||
The output of "cat /proc/meminfo" will have lines like:
|
||||
|
||||
.....
|
||||
HugePages_Total: xxx
|
||||
|
@ -42,11 +42,11 @@ pages in the kernel. Super user can dynamically request more (or free some
|
|||
pre-configured) hugepages.
|
||||
The allocation (or deallocation) of hugetlb pages is possible only if there are
|
||||
enough physically contiguous free pages in system (freeing of hugepages is
|
||||
possible only if there are enough hugetlb pages free that can be transfered
|
||||
possible only if there are enough hugetlb pages free that can be transferred
|
||||
back to regular memory pool).
|
||||
|
||||
Pages that are used as hugetlb pages are reserved inside the kernel and can
|
||||
not be used for other purposes.
|
||||
Pages that are used as hugetlb pages are reserved inside the kernel and cannot
|
||||
be used for other purposes.
|
||||
|
||||
Once the kernel with Hugetlb page support is built and running, a user can
|
||||
use either the mmap system call or shared memory system calls to start using
|
||||
|
@ -60,7 +60,7 @@ Use the following command to dynamically allocate/deallocate hugepages:
|
|||
This command will try to configure 20 hugepages in the system. The success
|
||||
or failure of allocation depends on the amount of physically contiguous
|
||||
memory that is preset in system at this time. System administrators may want
|
||||
to put this command in one of the local rc init file. This will enable the
|
||||
to put this command in one of the local rc init files. This will enable the
|
||||
kernel to request huge pages early in the boot process (when the possibility
|
||||
of getting physical contiguous pages is still very high).
|
||||
|
||||
|
@ -78,8 +78,8 @@ the uid and gid of the current process are taken. The mode option sets the
|
|||
mode of root of file system to value & 0777. This value is given in octal.
|
||||
By default the value 0755 is picked. The size option sets the maximum value of
|
||||
memory (huge pages) allowed for that filesystem (/mnt/huge). The size is
|
||||
rounded down to HPAGE_SIZE. The option nr_inode sets the maximum number of
|
||||
inodes that /mnt/huge can use. If the size or nr_inode options are not
|
||||
rounded down to HPAGE_SIZE. The option nr_inodes sets the maximum number of
|
||||
inodes that /mnt/huge can use. If the size or nr_inodes options are not
|
||||
provided on command line then no limits are set. For size and nr_inodes
|
||||
options, you can use [G|g]/[M|m]/[K|k] to represent giga/mega/kilo. For
|
||||
example, size=2K has the same meaning as size=2048. An example is given at
|
||||
|
@ -88,7 +88,7 @@ the end of this document.
|
|||
read and write system calls are not supported on files that reside on hugetlb
|
||||
file systems.
|
||||
|
||||
A regular chown, chgrp and chmod commands (with right permissions) could be
|
||||
Regular chown, chgrp, and chmod commands (with right permissions) could be
|
||||
used to change the file attributes on hugetlbfs.
|
||||
|
||||
Also, it is important to note that no such mount command is required if the
|
||||
|
@ -96,8 +96,8 @@ applications are going to use only shmat/shmget system calls. Users who
|
|||
wish to use hugetlb page via shared memory segment should be a member of
|
||||
a supplementary group and system admin needs to configure that gid into
|
||||
/proc/sys/vm/hugetlb_shm_group. It is possible for same or different
|
||||
applications to use any combination of mmaps and shm* calls. Though the
|
||||
mount of filesystem will be required for using mmaps.
|
||||
applications to use any combination of mmaps and shm* calls, though the
|
||||
mount of filesystem will be required for using mmap calls.
|
||||
|
||||
*******************************************************************
|
||||
|
||||
|
|
|
@ -151,6 +151,11 @@ NUMA
|
|||
|
||||
numa=fake=X Fake X nodes and ignore NUMA setup of the actual machine.
|
||||
|
||||
numa=hotadd=percent
|
||||
Only allow hotadd memory to preallocate page structures upto
|
||||
percent of already available memory.
|
||||
numa=hotadd=0 will disable hotadd memory.
|
||||
|
||||
ACPI
|
||||
|
||||
acpi=off Don't enable ACPI
|
||||
|
|
2
Kbuild
2
Kbuild
|
@ -18,7 +18,7 @@ define sed-y
|
|||
"/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"
|
||||
endef
|
||||
# Override default regexp for specific architectures
|
||||
sed-$(CONFIG_MIPS) := "/^@@@/s///p"
|
||||
sed-$(CONFIG_MIPS) := "/^@@@/{s/^@@@//; s/ \#.*\$$//; p;}"
|
||||
|
||||
quiet_cmd_offsets = GEN $@
|
||||
define cmd_offsets
|
||||
|
|
|
@ -1556,9 +1556,7 @@ S: Maintained
|
|||
|
||||
KEXEC
|
||||
P: Eric Biederman
|
||||
P: Randy Dunlap
|
||||
M: ebiederm@xmission.com
|
||||
M: rdunlap@xenotime.net
|
||||
W: http://www.xmission.com/~ebiederm/files/kexec/
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: fastboot@osdl.org
|
||||
|
|
56
Makefile
56
Makefile
|
@ -1112,7 +1112,6 @@ modules_install: _emodinst_ _emodinst_post
|
|||
install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
|
||||
PHONY += _emodinst_
|
||||
_emodinst_:
|
||||
$(Q)rm -rf $(MODLIB)/$(install-dir)
|
||||
$(Q)mkdir -p $(MODLIB)/$(install-dir)
|
||||
$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst
|
||||
|
||||
|
@ -1275,40 +1274,43 @@ kernelversion:
|
|||
|
||||
# Single targets
|
||||
# ---------------------------------------------------------------------------
|
||||
# The directory part is taken from first prerequisite, so this
|
||||
# works even with external modules
|
||||
%.s: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||
%.i: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||
%.o: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||
%.lst: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||
%.s: %.S prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||
%.o: %.S prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||
# Single targets are compatible with:
|
||||
# - build whith mixed source and output
|
||||
# - build with separate output dir 'make O=...'
|
||||
# - external modules
|
||||
#
|
||||
# target-dir => where to store outputfile
|
||||
# build-dir => directory in kernel source tree to use
|
||||
|
||||
# For external modules we shall include any directory of the target,
|
||||
# but usual case there is no directory part.
|
||||
# make M=`pwd` module.o => $(dir $@)=./
|
||||
# make M=`pwd` foo/module.o => $(dir $@)=foo/
|
||||
# make M=`pwd` / => $(dir $@)=/
|
||||
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
target-dir = $(@D)
|
||||
build-dir = $(patsubst %/,%,$(dir $@))
|
||||
target-dir = $(dir $@)
|
||||
else
|
||||
zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@)))
|
||||
target-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))
|
||||
build-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))
|
||||
target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
|
||||
endif
|
||||
|
||||
/ %/: scripts prepare FORCE
|
||||
%.s: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
%.i: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
%.o: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
%.lst: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
%.s: %.S prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
%.o: %.S prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
|
||||
# Modules
|
||||
/ %/: prepare scripts FORCE
|
||||
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
|
||||
$(build)=$(target-dir)
|
||||
%.ko: scripts FORCE
|
||||
$(build)=$(build-dir)
|
||||
%.ko: prepare scripts FORCE
|
||||
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
|
||||
$(build)=$(target-dir) $(@:.ko=.o)
|
||||
$(build)=$(build-dir) $(@:.ko=.o)
|
||||
$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
|
||||
|
||||
# FIXME Should go into a make.lib or something
|
||||
|
|
|
@ -549,6 +549,11 @@ config NUMA
|
|||
Access). This option is for configuring high-end multiprocessor
|
||||
server machines. If in doubt, say N.
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "7"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
# LARGE_VMALLOC is racy, if you *really* need it then fix it first
|
||||
config ALPHA_LARGE_VMALLOC
|
||||
bool
|
||||
|
|
|
@ -76,7 +76,6 @@ EXPORT_SYMBOL(strncpy);
|
|||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strncat);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(memcmp);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/config.h> /* CONFIG_ALPHA_LCA etc */
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
|
@ -471,6 +472,22 @@ page_is_ram(unsigned long pfn)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
register_cpus(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
register_cpu(p, i, NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(register_cpus);
|
||||
|
||||
void __init
|
||||
setup_arch(char **cmdline_p)
|
||||
{
|
||||
|
|
|
@ -439,7 +439,7 @@ setup_smp(void)
|
|||
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
||||
smp_num_probed++;
|
||||
/* Assume here that "whami" == index */
|
||||
cpu_set(i, cpu_possible_map);
|
||||
cpu_set(i, cpu_present_mask);
|
||||
cpu->pal_revision = boot_cpu_palrev;
|
||||
}
|
||||
|
||||
|
@ -450,9 +450,8 @@ setup_smp(void)
|
|||
}
|
||||
} else {
|
||||
smp_num_probed = 1;
|
||||
cpu_set(boot_cpuid, cpu_possible_map);
|
||||
cpu_set(boot_cpuid, cpu_present_mask);
|
||||
}
|
||||
cpu_present_mask = cpumask_of_cpu(boot_cpuid);
|
||||
|
||||
printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
|
||||
smp_num_probed, cpu_possible_map.bits[0]);
|
||||
|
@ -488,9 +487,8 @@ void __devinit
|
|||
smp_prepare_boot_cpu(void)
|
||||
{
|
||||
/*
|
||||
* Mark the boot cpu (current cpu) as both present and online
|
||||
* Mark the boot cpu (current cpu) as online
|
||||
*/
|
||||
cpu_set(smp_processor_id(), cpu_present_mask);
|
||||
cpu_set(smp_processor_id(), cpu_online_map);
|
||||
}
|
||||
|
||||
|
|
|
@ -512,6 +512,12 @@ config ARCH_DISCONTIGMEM_ENABLE
|
|||
or have huge holes in the physical address space for other reasons.
|
||||
See <file:Documentation/vm/numa> for more.
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "4" if ARCH_LH7A40X
|
||||
default "2"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
config LEDS
|
||||
|
|
|
@ -18,6 +18,7 @@ SECTIONS
|
|||
_start = .;
|
||||
*(.start)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.fixup)
|
||||
*(.gnu.warning)
|
||||
*(.rodata)
|
||||
|
|
|
@ -101,7 +101,6 @@ EXPORT_SYMBOL(__raw_writesl);
|
|||
|
||||
/* string / mem functions */
|
||||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
|
|
|
@ -322,6 +322,12 @@ static void __init setup_processor(void)
|
|||
sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
|
||||
sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
|
||||
elf_hwcap = list->elf_hwcap;
|
||||
#ifndef CONFIG_ARM_THUMB
|
||||
elf_hwcap &= ~HWCAP_THUMB;
|
||||
#endif
|
||||
#ifndef CONFIG_VFP
|
||||
elf_hwcap &= ~HWCAP_VFP;
|
||||
#endif
|
||||
|
||||
cpu_proc_init();
|
||||
}
|
||||
|
|
|
@ -25,10 +25,6 @@
|
|||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
|
||||
extern void omap_nop_release(struct device *dev);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE)
|
||||
|
||||
static u64 irda_dmamask = 0xffffffff;
|
||||
|
@ -37,7 +33,6 @@ static struct platform_device omap1610ir_device = {
|
|||
.name = "omap1610-ir",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
.dma_mask = &irda_dmamask,
|
||||
},
|
||||
};
|
||||
|
@ -84,9 +79,6 @@ static struct resource rtc_resources[] = {
|
|||
static struct platform_device omap_rtc_device = {
|
||||
.name = "omap_rtc",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(rtc_resources),
|
||||
.resource = rtc_resources,
|
||||
};
|
||||
|
@ -124,9 +116,6 @@ static struct resource sti_resources[] = {
|
|||
static struct platform_device sti_device = {
|
||||
.name = "sti",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sti_resources),
|
||||
.resource = sti_resources,
|
||||
};
|
||||
|
|
|
@ -25,10 +25,6 @@
|
|||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
|
||||
extern void omap_nop_release(struct device *dev);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
|
||||
|
||||
#define OMAP2_I2C_BASE2 0x48072000
|
||||
|
@ -49,9 +45,6 @@ static struct resource i2c_resources2[] = {
|
|||
static struct platform_device omap_i2c_device2 = {
|
||||
.name = "i2c_omap",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(i2c_resources2),
|
||||
.resource = i2c_resources2,
|
||||
};
|
||||
|
@ -100,9 +93,6 @@ static struct resource sti_resources[] = {
|
|||
static struct platform_device sti_device = {
|
||||
.name = "sti",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sti_resources),
|
||||
.resource = sti_resources,
|
||||
};
|
||||
|
|
|
@ -367,6 +367,8 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent)
|
|||
source = S3C2410_MISCCR_CLK0_UPLL;
|
||||
else if (parent == &clk_f)
|
||||
source = S3C2410_MISCCR_CLK0_FCLK;
|
||||
else if (parent == &clk_h)
|
||||
source = S3C2410_MISCCR_CLK0_HCLK;
|
||||
else if (parent == &clk_p)
|
||||
source = S3C2410_MISCCR_CLK0_PCLK;
|
||||
else if (clk == &s3c24xx_clkout0 && parent == &s3c24xx_dclk0)
|
||||
|
@ -376,6 +378,8 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent)
|
|||
else
|
||||
return -EINVAL;
|
||||
|
||||
clk->parent = parent;
|
||||
|
||||
if (clk == &s3c24xx_dclk0)
|
||||
mask = S3C2410_MISCCR_CLK0_MASK;
|
||||
else {
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
#include <asm/arch/nand.h>
|
||||
|
||||
#include "common-smdk.h"
|
||||
#include "devs.h"
|
||||
#include "pm.h"
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include <linux/config.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/page.h>
|
||||
#include "proc-macros.S"
|
||||
|
||||
|
@ -46,6 +46,11 @@
|
|||
*/
|
||||
#define CACHE_DLIMIT (CACHE_DSIZE * 4)
|
||||
|
||||
.data
|
||||
flush_base:
|
||||
.long FLUSH_BASE
|
||||
.text
|
||||
|
||||
/*
|
||||
* flush_user_cache_all()
|
||||
*
|
||||
|
@ -63,11 +68,21 @@ ENTRY(v4wb_flush_kern_cache_all)
|
|||
mov ip, #0
|
||||
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
__flush_whole_cache:
|
||||
mov r0, #FLUSH_BASE
|
||||
add r1, r0, #CACHE_DSIZE
|
||||
1: ldr r2, [r0], #32
|
||||
cmp r0, r1
|
||||
ldr r3, =flush_base
|
||||
ldr r1, [r3, #0]
|
||||
eor r1, r1, #CACHE_DSIZE
|
||||
str r1, [r3, #0]
|
||||
add r2, r1, #CACHE_DSIZE
|
||||
1: ldr r3, [r1], #32
|
||||
cmp r1, r2
|
||||
blo 1b
|
||||
#ifdef FLUSH_BASE_MINICACHE
|
||||
add r2, r2, #FLUSH_BASE_MINICACHE - FLUSH_BASE
|
||||
sub r1, r2, #512 @ only 512 bytes
|
||||
1: ldr r3, [r1], #32
|
||||
cmp r1, r2
|
||||
blo 1b
|
||||
#endif
|
||||
mcr p15, 0, ip, c7, c10, 4 @ drain write buffer
|
||||
mov pc, lr
|
||||
|
||||
|
@ -82,6 +97,7 @@ __flush_whole_cache:
|
|||
* - flags - vma_area_struct flags describing address space
|
||||
*/
|
||||
ENTRY(v4wb_flush_user_cache_range)
|
||||
mov ip, #0
|
||||
sub r3, r1, r0 @ calculate total size
|
||||
tst r2, #VM_EXEC @ executable region?
|
||||
mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/sizes.h>
|
||||
#include <asm/tlb.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -455,14 +456,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
|
|||
#ifdef FLUSH_BASE
|
||||
map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS);
|
||||
map.virtual = FLUSH_BASE;
|
||||
map.length = PGDIR_SIZE;
|
||||
map.length = SZ_1M;
|
||||
map.type = MT_CACHECLEAN;
|
||||
create_mapping(&map);
|
||||
#endif
|
||||
#ifdef FLUSH_BASE_MINICACHE
|
||||
map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + PGDIR_SIZE);
|
||||
map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + SZ_1M);
|
||||
map.virtual = FLUSH_BASE_MINICACHE;
|
||||
map.length = PGDIR_SIZE;
|
||||
map.length = SZ_1M;
|
||||
map.type = MT_MINICLEAN;
|
||||
create_mapping(&map);
|
||||
#endif
|
||||
|
|
|
@ -26,22 +26,7 @@
|
|||
* the cache line size of the I and D cache
|
||||
*/
|
||||
#define DCACHELINESIZE 32
|
||||
#define FLUSH_OFFSET 32768
|
||||
|
||||
.macro flush_110_dcache rd, ra, re
|
||||
ldr \rd, =flush_base
|
||||
ldr \ra, [\rd]
|
||||
eor \ra, \ra, #FLUSH_OFFSET
|
||||
str \ra, [\rd]
|
||||
add \re, \ra, #16384 @ only necessary for 16k
|
||||
1001: ldr \rd, [\ra], #DCACHELINESIZE
|
||||
teq \re, \ra
|
||||
bne 1001b
|
||||
.endm
|
||||
|
||||
.data
|
||||
flush_base:
|
||||
.long FLUSH_BASE
|
||||
.text
|
||||
|
||||
/*
|
||||
|
@ -145,13 +130,11 @@ ENTRY(cpu_sa110_dcache_clean_area)
|
|||
*/
|
||||
.align 5
|
||||
ENTRY(cpu_sa110_switch_mm)
|
||||
flush_110_dcache r3, ip, r1
|
||||
mov r1, #0
|
||||
mcr p15, 0, r1, c7, c5, 0 @ invalidate I cache
|
||||
mcr p15, 0, r1, c7, c10, 4 @ drain WB
|
||||
str lr, [sp, #-4]!
|
||||
bl v4wb_flush_kern_cache_all @ clears IP
|
||||
mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
|
||||
mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs
|
||||
mov pc, lr
|
||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
|
||||
ldr pc, [sp], #4
|
||||
|
||||
/*
|
||||
* cpu_sa110_set_pte(ptep, pte)
|
||||
|
|
|
@ -30,30 +30,6 @@
|
|||
* the cache line size of the I and D cache
|
||||
*/
|
||||
#define DCACHELINESIZE 32
|
||||
#define FLUSH_OFFSET 32768
|
||||
|
||||
.macro flush_1100_dcache rd, ra, re
|
||||
ldr \rd, =flush_base
|
||||
ldr \ra, [\rd]
|
||||
eor \ra, \ra, #FLUSH_OFFSET
|
||||
str \ra, [\rd]
|
||||
add \re, \ra, #8192 @ only necessary for 8k
|
||||
1001: ldr \rd, [\ra], #DCACHELINESIZE
|
||||
teq \re, \ra
|
||||
bne 1001b
|
||||
#ifdef FLUSH_BASE_MINICACHE
|
||||
add \ra, \ra, #FLUSH_BASE_MINICACHE - FLUSH_BASE
|
||||
add \re, \ra, #512 @ only 512 bytes
|
||||
1002: ldr \rd, [\ra], #DCACHELINESIZE
|
||||
teq \re, \ra
|
||||
bne 1002b
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.data
|
||||
flush_base:
|
||||
.long FLUSH_BASE
|
||||
.text
|
||||
|
||||
__INIT
|
||||
|
||||
|
@ -79,9 +55,8 @@ ENTRY(cpu_sa1100_proc_fin)
|
|||
stmfd sp!, {lr}
|
||||
mov ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
|
||||
msr cpsr_c, ip
|
||||
flush_1100_dcache r0, r1, r2 @ clean caches
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c15, c2, 2 @ Disable clock switching
|
||||
bl v4wb_flush_kern_cache_all
|
||||
mcr p15, 0, ip, c15, c2, 2 @ Disable clock switching
|
||||
mrc p15, 0, r0, c1, c0, 0 @ ctrl register
|
||||
bic r0, r0, #0x1000 @ ...i............
|
||||
bic r0, r0, #0x000e @ ............wca.
|
||||
|
@ -167,14 +142,12 @@ ENTRY(cpu_sa1100_dcache_clean_area)
|
|||
*/
|
||||
.align 5
|
||||
ENTRY(cpu_sa1100_switch_mm)
|
||||
flush_1100_dcache r3, ip, r1
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
str lr, [sp, #-4]!
|
||||
bl v4wb_flush_kern_cache_all @ clears IP
|
||||
mcr p15, 0, ip, c9, c0, 0 @ invalidate RB
|
||||
mcr p15, 0, ip, c7, c10, 4 @ drain WB
|
||||
mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
|
||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
|
||||
mov pc, lr
|
||||
ldr pc, [sp], #4
|
||||
|
||||
/*
|
||||
* cpu_sa1100_set_pte(ptep, pte)
|
||||
|
|
|
@ -58,7 +58,7 @@ struct clk * clk_get(struct device *dev, const char *id)
|
|||
if (p->id == idno &&
|
||||
strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -69,6 +69,7 @@ struct clk * clk_get(struct device *dev, const char *id)
|
|||
}
|
||||
}
|
||||
|
||||
found:
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return clk;
|
||||
|
|
|
@ -26,14 +26,6 @@
|
|||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/menelaus.h>
|
||||
|
||||
|
||||
void omap_nop_release(struct device *dev)
|
||||
{
|
||||
/* Nothing */
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
|
||||
|
||||
#define OMAP1_I2C_BASE 0xfffb3800
|
||||
|
@ -59,9 +51,6 @@ static struct resource i2c_resources1[] = {
|
|||
static struct platform_device omap_i2c_device1 = {
|
||||
.name = "i2c_omap",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(i2c_resources1),
|
||||
.resource = i2c_resources1,
|
||||
};
|
||||
|
@ -187,7 +176,6 @@ static struct platform_device mmc_omap_device1 = {
|
|||
.name = "mmci-omap",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
.dma_mask = &mmc1_dmamask,
|
||||
.platform_data = &mmc1_conf,
|
||||
},
|
||||
|
@ -217,7 +205,6 @@ static struct platform_device mmc_omap_device2 = {
|
|||
.name = "mmci-omap",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
.dma_mask = &mmc2_dmamask,
|
||||
.platform_data = &mmc2_conf,
|
||||
},
|
||||
|
@ -321,9 +308,6 @@ static struct resource uwire_resources[] = {
|
|||
static struct platform_device omap_uwire_device = {
|
||||
.name = "omap_uwire",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(uwire_resources),
|
||||
.resource = uwire_resources,
|
||||
};
|
||||
|
@ -365,9 +349,6 @@ static struct resource wdt_resources[] = {
|
|||
static struct platform_device omap_wdt_device = {
|
||||
.name = "omap_wdt",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(wdt_resources),
|
||||
.resource = wdt_resources,
|
||||
};
|
||||
|
@ -401,9 +382,6 @@ static struct resource rng_resources[] = {
|
|||
static struct platform_device omap_rng_device = {
|
||||
.name = "omap_rng",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.release = omap_nop_release,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(rng_resources),
|
||||
.resource = rng_resources,
|
||||
};
|
||||
|
|
|
@ -588,6 +588,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr)
|
|||
struct vfp_double vdm;
|
||||
u32 d, exceptions = 0;
|
||||
int rmode = fpscr & FPSCR_RMODE_MASK;
|
||||
int tm;
|
||||
|
||||
vfp_double_unpack(&vdm, vfp_get_double(dm));
|
||||
vfp_double_dump("VDM", &vdm);
|
||||
|
@ -595,10 +596,14 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr)
|
|||
/*
|
||||
* Do we have denormalised number?
|
||||
*/
|
||||
if (vfp_double_type(&vdm) & VFP_DENORMAL)
|
||||
tm = vfp_double_type(&vdm);
|
||||
if (tm & VFP_DENORMAL)
|
||||
exceptions |= FPSCR_IDC;
|
||||
|
||||
if (vdm.exponent >= 1023 + 32) {
|
||||
if (tm & VFP_NAN) {
|
||||
d = 0;
|
||||
exceptions |= FPSCR_IOC;
|
||||
} else if (vdm.exponent >= 1023 + 32) {
|
||||
d = 0x7fffffff;
|
||||
if (vdm.sign)
|
||||
d = ~d;
|
||||
|
@ -1122,9 +1127,9 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
|
|||
{
|
||||
u32 op = inst & FOP_MASK;
|
||||
u32 exceptions = 0;
|
||||
unsigned int dd = vfp_get_sd(inst);
|
||||
unsigned int dn = vfp_get_sn(inst);
|
||||
unsigned int dm = vfp_get_sm(inst);
|
||||
unsigned int dd = vfp_get_dd(inst);
|
||||
unsigned int dn = vfp_get_dn(inst);
|
||||
unsigned int dm = vfp_get_dm(inst);
|
||||
unsigned int vecitr, veclen, vecstride;
|
||||
u32 (*fop)(int, int, s32, u32);
|
||||
|
||||
|
@ -1141,7 +1146,7 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
|
|||
pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
|
||||
(veclen >> FPSCR_LENGTH_BIT) + 1);
|
||||
|
||||
fop = (op == FOP_EXT) ? fop_extfns[dn] : fop_fns[FOP_TO_IDX(op)];
|
||||
fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)];
|
||||
if (!fop)
|
||||
goto invalid;
|
||||
|
||||
|
@ -1149,17 +1154,13 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
|
|||
u32 except;
|
||||
|
||||
if (op == FOP_EXT)
|
||||
pr_debug("VFP: itr%d (d%u.%u) = op[%u] (d%u.%u)\n",
|
||||
pr_debug("VFP: itr%d (d%u) = op[%u] (d%u)\n",
|
||||
vecitr >> FPSCR_LENGTH_BIT,
|
||||
dd >> 1, dd & 1, dn,
|
||||
dm >> 1, dm & 1);
|
||||
dd, dn, dm);
|
||||
else
|
||||
pr_debug("VFP: itr%d (d%u.%u) = (d%u.%u) op[%u] (d%u.%u)\n",
|
||||
pr_debug("VFP: itr%d (d%u) = (d%u) op[%u] (d%u)\n",
|
||||
vecitr >> FPSCR_LENGTH_BIT,
|
||||
dd >> 1, dd & 1,
|
||||
dn >> 1, dn & 1,
|
||||
FOP_TO_IDX(op),
|
||||
dm >> 1, dm & 1);
|
||||
dd, dn, FOP_TO_IDX(op), dm);
|
||||
|
||||
except = fop(dd, dn, dm, fpscr);
|
||||
pr_debug("VFP: itr%d: exceptions=%08x\n",
|
||||
|
|
|
@ -189,11 +189,10 @@ vfp_put_float:
|
|||
|
||||
.globl vfp_get_double
|
||||
vfp_get_double:
|
||||
mov r0, r0, lsr #1
|
||||
add pc, pc, r0, lsl #3
|
||||
mov r0, r0
|
||||
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
|
||||
mrrc p10, 1, r0, r1, c\dr @ fmrrd r0, r1, d\dr
|
||||
mrrc p11, 1, r0, r1, c\dr @ fmrrd r0, r1, d\dr
|
||||
mov pc, lr
|
||||
.endr
|
||||
|
||||
|
@ -204,10 +203,9 @@ vfp_get_double:
|
|||
|
||||
.globl vfp_put_double
|
||||
vfp_put_double:
|
||||
mov r0, r0, lsr #1
|
||||
add pc, pc, r0, lsl #3
|
||||
mov r0, r0
|
||||
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
|
||||
mcrr p10, 1, r1, r2, c\dr @ fmrrd r1, r2, d\dr
|
||||
mcrr p11, 1, r1, r2, c\dr @ fmdrr r1, r2, d\dr
|
||||
mov pc, lr
|
||||
.endr
|
||||
|
|
|
@ -632,6 +632,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr)
|
|||
struct vfp_single vsm;
|
||||
u32 d, exceptions = 0;
|
||||
int rmode = fpscr & FPSCR_RMODE_MASK;
|
||||
int tm;
|
||||
|
||||
vfp_single_unpack(&vsm, m);
|
||||
vfp_single_dump("VSM", &vsm);
|
||||
|
@ -639,10 +640,14 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr)
|
|||
/*
|
||||
* Do we have a denormalised number?
|
||||
*/
|
||||
tm = vfp_single_type(&vsm);
|
||||
if (vfp_single_type(&vsm) & VFP_DENORMAL)
|
||||
exceptions |= FPSCR_IDC;
|
||||
|
||||
if (vsm.exponent >= 127 + 32) {
|
||||
if (tm & VFP_NAN) {
|
||||
d = 0;
|
||||
exceptions |= FPSCR_IOC;
|
||||
} else if (vsm.exponent >= 127 + 32) {
|
||||
/*
|
||||
* m >= 2^31-2^7: invalid
|
||||
*/
|
||||
|
@ -1188,7 +1193,7 @@ u32 vfp_single_cpdo(u32 inst, u32 fpscr)
|
|||
pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
|
||||
(veclen >> FPSCR_LENGTH_BIT) + 1);
|
||||
|
||||
fop = (op == FOP_EXT) ? fop_extfns[sn] : fop_fns[FOP_TO_IDX(op)];
|
||||
fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)];
|
||||
if (!fop)
|
||||
goto invalid;
|
||||
|
||||
|
|
|
@ -152,7 +152,6 @@ EXPORT_SYMBOL(strncmp);
|
|||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(memset);
|
||||
|
|
|
@ -39,7 +39,6 @@ EXPORT_SYMBOL(loops_per_usec);
|
|||
/* String functions */
|
||||
EXPORT_SYMBOL(memcmp);
|
||||
EXPORT_SYMBOL(memmove);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strcpy);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
|
|
|
@ -1170,12 +1170,6 @@ __syscall_badsys:
|
|||
# syscall vector table
|
||||
#
|
||||
###############################################################################
|
||||
#ifdef CONFIG_MMU
|
||||
#define __MMU(X) X
|
||||
#else
|
||||
#define __MMU(X) sys_ni_syscall
|
||||
#endif
|
||||
|
||||
.section .rodata
|
||||
ALIGN
|
||||
.globl sys_call_table
|
||||
|
@ -1305,7 +1299,7 @@ sys_call_table:
|
|||
.long sys_newuname
|
||||
.long sys_ni_syscall /* old "cacheflush" */
|
||||
.long sys_adjtimex
|
||||
.long __MMU(sys_mprotect) /* 125 */
|
||||
.long sys_mprotect /* 125 */
|
||||
.long sys_sigprocmask
|
||||
.long sys_ni_syscall /* old "create_module" */
|
||||
.long sys_init_module
|
||||
|
@ -1324,16 +1318,16 @@ sys_call_table:
|
|||
.long sys_getdents
|
||||
.long sys_select
|
||||
.long sys_flock
|
||||
.long __MMU(sys_msync)
|
||||
.long sys_msync
|
||||
.long sys_readv /* 145 */
|
||||
.long sys_writev
|
||||
.long sys_getsid
|
||||
.long sys_fdatasync
|
||||
.long sys_sysctl
|
||||
.long __MMU(sys_mlock) /* 150 */
|
||||
.long __MMU(sys_munlock)
|
||||
.long __MMU(sys_mlockall)
|
||||
.long __MMU(sys_munlockall)
|
||||
.long sys_mlock /* 150 */
|
||||
.long sys_munlock
|
||||
.long sys_mlockall
|
||||
.long sys_munlockall
|
||||
.long sys_sched_setparam
|
||||
.long sys_sched_getparam /* 155 */
|
||||
.long sys_sched_setscheduler
|
||||
|
@ -1343,7 +1337,7 @@ sys_call_table:
|
|||
.long sys_sched_get_priority_min /* 160 */
|
||||
.long sys_sched_rr_get_interval
|
||||
.long sys_nanosleep
|
||||
.long __MMU(sys_mremap)
|
||||
.long sys_mremap
|
||||
.long sys_setresuid16
|
||||
.long sys_getresuid16 /* 165 */
|
||||
.long sys_ni_syscall /* for vm86 */
|
||||
|
@ -1398,8 +1392,8 @@ sys_call_table:
|
|||
.long sys_setfsuid /* 215 */
|
||||
.long sys_setfsgid
|
||||
.long sys_pivot_root
|
||||
.long __MMU(sys_mincore)
|
||||
.long __MMU(sys_madvise)
|
||||
.long sys_mincore
|
||||
.long sys_madvise
|
||||
.long sys_getdents64 /* 220 */
|
||||
.long sys_fcntl64
|
||||
.long sys_ni_syscall /* reserved for TUX */
|
||||
|
@ -1437,7 +1431,7 @@ sys_call_table:
|
|||
.long sys_epoll_create
|
||||
.long sys_epoll_ctl /* 255 */
|
||||
.long sys_epoll_wait
|
||||
.long __MMU(sys_remap_file_pages)
|
||||
.long sys_remap_file_pages
|
||||
.long sys_set_tid_address
|
||||
.long sys_timer_create
|
||||
.long sys_timer_settime /* 260 */
|
||||
|
|
|
@ -27,7 +27,6 @@ EXPORT_SYMBOL(__ioremap);
|
|||
EXPORT_SYMBOL(iounmap);
|
||||
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
|
|
|
@ -25,7 +25,6 @@ extern char h8300_debug_device[];
|
|||
/* platform dependent support */
|
||||
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
|
|
|
@ -53,6 +53,35 @@ source "init/Kconfig"
|
|||
|
||||
menu "Processor type and features"
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support"
|
||||
---help---
|
||||
This enables support for systems with more than one CPU. If you have
|
||||
a system with only one CPU, like most personal computers, say N. If
|
||||
you have a system with more than one CPU, say Y.
|
||||
|
||||
If you say N here, the kernel will run on single and multiprocessor
|
||||
machines, but will use only one CPU of a multiprocessor machine. If
|
||||
you say Y here, the kernel will run on many, but not all,
|
||||
singleprocessor machines. On a singleprocessor machine, the kernel
|
||||
will run faster if you say N here.
|
||||
|
||||
Note that if you say Y here and choose architecture "586" or
|
||||
"Pentium" under "Processor family", the kernel will not work on 486
|
||||
architectures. Similarly, multiprocessor kernels for the "PPro"
|
||||
architecture may not work on all Pentium based boards.
|
||||
|
||||
People using multiprocessor machines who say Y here should also say
|
||||
Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
|
||||
Management" code will be disabled if you say Y here.
|
||||
|
||||
See also the <file:Documentation/smp.txt>,
|
||||
<file:Documentation/i386/IO-APIC.txt>,
|
||||
<file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
choice
|
||||
prompt "Subarchitecture Type"
|
||||
default X86_PC
|
||||
|
@ -178,35 +207,6 @@ config HPET_EMULATE_RTC
|
|||
depends on HPET_TIMER && RTC=y
|
||||
default y
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support"
|
||||
---help---
|
||||
This enables support for systems with more than one CPU. If you have
|
||||
a system with only one CPU, like most personal computers, say N. If
|
||||
you have a system with more than one CPU, say Y.
|
||||
|
||||
If you say N here, the kernel will run on single and multiprocessor
|
||||
machines, but will use only one CPU of a multiprocessor machine. If
|
||||
you say Y here, the kernel will run on many, but not all,
|
||||
singleprocessor machines. On a singleprocessor machine, the kernel
|
||||
will run faster if you say N here.
|
||||
|
||||
Note that if you say Y here and choose architecture "586" or
|
||||
"Pentium" under "Processor family", the kernel will not work on 486
|
||||
architectures. Similarly, multiprocessor kernels for the "PPro"
|
||||
architecture may not work on all Pentium based boards.
|
||||
|
||||
People using multiprocessor machines who say Y here should also say
|
||||
Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
|
||||
Management" code will be disabled if you say Y here.
|
||||
|
||||
See also the <file:Documentation/smp.txt>,
|
||||
<file:Documentation/i386/IO-APIC.txt>,
|
||||
<file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
config NR_CPUS
|
||||
int "Maximum number of CPUs (2-255)"
|
||||
range 2 255
|
||||
|
@ -522,6 +522,12 @@ config NUMA
|
|||
comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI"
|
||||
depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI)
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "4" if X86_NUMAQ
|
||||
default "3"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
config HAVE_ARCH_BOOTMEM_NODE
|
||||
bool
|
||||
depends on NUMA
|
||||
|
@ -757,15 +763,6 @@ config HOTPLUG_CPU
|
|||
|
||||
Say N.
|
||||
|
||||
config DOUBLEFAULT
|
||||
default y
|
||||
bool "Enable doublefault exception handler" if EMBEDDED
|
||||
help
|
||||
This option allows trapping of rare doublefault exceptions that
|
||||
would otherwise cause a system to silently reboot. Disabling this
|
||||
option saves about 4k and might cause you much additional grey
|
||||
hair.
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
|
|
|
@ -311,5 +311,5 @@ config X86_OOSTORE
|
|||
|
||||
config X86_TSC
|
||||
bool
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1) && !X86_NUMAQ
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ
|
||||
default y
|
||||
|
|
|
@ -97,6 +97,7 @@
|
|||
#define PARAM_VESAPM_OFF 0x30
|
||||
#define PARAM_LFB_PAGES 0x32
|
||||
#define PARAM_VESA_ATTRIB 0x34
|
||||
#define PARAM_CAPABILITIES 0x36
|
||||
|
||||
/* Define DO_STORE according to CONFIG_VIDEO_RETAIN */
|
||||
#ifdef CONFIG_VIDEO_RETAIN
|
||||
|
@ -233,6 +234,10 @@ mopar_gr:
|
|||
movw 18(%di), %ax
|
||||
movl %eax, %fs:(PARAM_LFB_SIZE)
|
||||
|
||||
# store mode capabilities
|
||||
movl 10(%di), %eax
|
||||
movl %eax, %fs:(PARAM_CAPABILITIES)
|
||||
|
||||
# switching the DAC to 8-bit is for <= 8 bpp only
|
||||
movw %fs:(PARAM_LFB_DEPTH), %ax
|
||||
cmpw $8, %ax
|
||||
|
|
|
@ -168,7 +168,7 @@ int __init acpi_parse_mcfg(unsigned long phys_addr, unsigned long size)
|
|||
unsigned long i;
|
||||
int config_size;
|
||||
|
||||
if (!phys_addr || !size)
|
||||
if (!phys_addr || !size || !cpu_has_apic)
|
||||
return -EINVAL;
|
||||
|
||||
mcfg = (struct acpi_table_mcfg *)__acpi_map_table(phys_addr, size);
|
||||
|
@ -215,7 +215,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
|
|||
{
|
||||
struct acpi_table_madt *madt = NULL;
|
||||
|
||||
if (!phys_addr || !size)
|
||||
if (!phys_addr || !size || !cpu_has_apic)
|
||||
return -EINVAL;
|
||||
|
||||
madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size);
|
||||
|
@ -693,6 +693,9 @@ static int __init acpi_parse_madt_lapic_entries(void)
|
|||
{
|
||||
int count;
|
||||
|
||||
if (!cpu_has_apic)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* Note that the LAPIC address is obtained from the MADT (32-bit value)
|
||||
* and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value).
|
||||
|
@ -751,6 +754,9 @@ static int __init acpi_parse_madt_ioapic_entries(void)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!cpu_has_apic)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* if "noapic" boot option, don't look for IO-APICs
|
||||
*/
|
||||
|
|
|
@ -62,6 +62,18 @@ int apic_verbosity;
|
|||
|
||||
static void apic_pm_activate(void);
|
||||
|
||||
int modern_apic(void)
|
||||
{
|
||||
unsigned int lvr, version;
|
||||
/* AMD systems use old APIC versions, so check the CPU */
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
|
||||
boot_cpu_data.x86 >= 0xf)
|
||||
return 1;
|
||||
lvr = apic_read(APIC_LVR);
|
||||
version = GET_APIC_VERSION(lvr);
|
||||
return version >= 0x14;
|
||||
}
|
||||
|
||||
/*
|
||||
* 'what should we do if we get a hw irq event on an illegal vector'.
|
||||
* each architecture has to answer this themselves.
|
||||
|
@ -119,10 +131,7 @@ void enable_NMI_through_LVT0 (void * dummy)
|
|||
|
||||
int get_physical_broadcast(void)
|
||||
{
|
||||
unsigned int lvr, version;
|
||||
lvr = apic_read(APIC_LVR);
|
||||
version = GET_APIC_VERSION(lvr);
|
||||
if (!APIC_INTEGRATED(version) || version >= 0x14)
|
||||
if (modern_apic())
|
||||
return 0xff;
|
||||
else
|
||||
return 0xf;
|
||||
|
@ -349,9 +358,9 @@ int __init verify_local_APIC(void)
|
|||
|
||||
void __init sync_Arb_IDs(void)
|
||||
{
|
||||
/* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1 */
|
||||
unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR));
|
||||
if (ver >= 0x14) /* P4 or higher */
|
||||
/* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1
|
||||
And not needed on AMD */
|
||||
if (modern_apic())
|
||||
return;
|
||||
/*
|
||||
* Wait for idle.
|
||||
|
|
|
@ -212,8 +212,6 @@ static void __init init_amd(struct cpuinfo_x86 *c)
|
|||
|
||||
if (cpuid_eax(0x80000000) >= 0x80000008) {
|
||||
c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
|
||||
if (c->x86_max_cores & (c->x86_max_cores - 1))
|
||||
c->x86_max_cores = 1;
|
||||
}
|
||||
|
||||
if (cpuid_eax(0x80000000) >= 0x80000007) {
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
#define PFX "powernow-k8: "
|
||||
#define BFX PFX "BIOS error: "
|
||||
#define VERSION "version 1.60.1"
|
||||
#define VERSION "version 1.60.2"
|
||||
#include "powernow-k8.h"
|
||||
|
||||
/* serialize freq changes */
|
||||
|
@ -55,7 +55,7 @@ static DEFINE_MUTEX(fidvid_mutex);
|
|||
static struct powernow_k8_data *powernow_data[NR_CPUS];
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
static cpumask_t cpu_core_map[1] = { CPU_MASK_ALL };
|
||||
static cpumask_t cpu_core_map[1];
|
||||
#endif
|
||||
|
||||
/* Return a frequency in MHz, given an input fid */
|
||||
|
@ -910,6 +910,9 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
|
|||
unsigned int newstate;
|
||||
int ret = -EIO;
|
||||
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
/* only run on specific CPU from here on */
|
||||
oldmask = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
|
||||
|
@ -969,6 +972,9 @@ static int powernowk8_verify(struct cpufreq_policy *pol)
|
|||
{
|
||||
struct powernow_k8_data *data = powernow_data[pol->cpu];
|
||||
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
return cpufreq_frequency_table_verify(pol, data->powernow_table);
|
||||
}
|
||||
|
||||
|
@ -977,7 +983,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||
{
|
||||
struct powernow_k8_data *data;
|
||||
cpumask_t oldmask = CPU_MASK_ALL;
|
||||
int rc, i;
|
||||
int rc;
|
||||
|
||||
if (!cpu_online(pol->cpu))
|
||||
return -ENODEV;
|
||||
|
@ -1063,8 +1069,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||
printk("cpu_init done, current fid 0x%x, vid 0x%x\n",
|
||||
data->currfid, data->currvid);
|
||||
|
||||
for_each_cpu_mask(i, cpu_core_map[pol->cpu])
|
||||
powernow_data[i] = data;
|
||||
powernow_data[pol->cpu] = data;
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1101,6 +1106,9 @@ static unsigned int powernowk8_get (unsigned int cpu)
|
|||
|
||||
data = powernow_data[first_cpu(cpu_core_map[cpu])];
|
||||
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -19,7 +19,6 @@ EXPORT_SYMBOL(__put_user_2);
|
|||
EXPORT_SYMBOL(__put_user_4);
|
||||
EXPORT_SYMBOL(__put_user_8);
|
||||
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
|
|
@ -38,12 +38,6 @@
|
|||
int smp_found_config;
|
||||
unsigned int __initdata maxcpus = NR_CPUS;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#define CPU_HOTPLUG_ENABLED (1)
|
||||
#else
|
||||
#define CPU_HOTPLUG_ENABLED (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Various Linux-internal data structures created from the
|
||||
* MP-table.
|
||||
|
@ -110,21 +104,6 @@ static int __init mpf_checksum(unsigned char *mp, int len)
|
|||
static int mpc_record;
|
||||
static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
|
||||
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
static int MP_valid_apicid(int apicid, int version)
|
||||
{
|
||||
return hweight_long(apicid & 0xf) == 1 && (apicid >> 4) != 0xf;
|
||||
}
|
||||
#else
|
||||
static int MP_valid_apicid(int apicid, int version)
|
||||
{
|
||||
if (version >= 0x14)
|
||||
return apicid < 0xff;
|
||||
else
|
||||
return apicid < 0xf;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __devinit MP_processor_info (struct mpc_config_processor *m)
|
||||
{
|
||||
int ver, apicid;
|
||||
|
@ -190,12 +169,6 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m)
|
|||
|
||||
ver = m->mpc_apicver;
|
||||
|
||||
if (!MP_valid_apicid(apicid, ver)) {
|
||||
printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n",
|
||||
m->mpc_apicid, MAX_APICS);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate version
|
||||
*/
|
||||
|
@ -225,7 +198,14 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m)
|
|||
cpu_set(num_processors, cpu_possible_map);
|
||||
num_processors++;
|
||||
|
||||
if (CPU_HOTPLUG_ENABLED || (num_processors > 8)) {
|
||||
/*
|
||||
* Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y
|
||||
* but we need to work other dependencies like SMP_SUSPEND etc
|
||||
* before this can be done without some confusion.
|
||||
* if (CPU_HOTPLUG_ENABLED || num_processors > 8)
|
||||
* - Ashok Raj <ashok.raj@intel.com>
|
||||
*/
|
||||
if (num_processors > 8) {
|
||||
switch (boot_cpu_data.x86_vendor) {
|
||||
case X86_VENDOR_INTEL:
|
||||
if (!APIC_XAPIC(ver)) {
|
||||
|
@ -249,6 +229,13 @@ static void __init MP_bus_info (struct mpc_config_bus *m)
|
|||
|
||||
mpc_oem_bus_info(m, str, translation_table[mpc_record]);
|
||||
|
||||
if (m->mpc_busid >= MAX_MP_BUSSES) {
|
||||
printk(KERN_WARNING "MP table busid value (%d) for bustype %s "
|
||||
" is too large, max. supported is %d\n",
|
||||
m->mpc_busid, str, MAX_MP_BUSSES - 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
|
||||
mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
|
||||
} else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) {
|
||||
|
|
|
@ -51,7 +51,5 @@ void mach_reboot_fixups(void)
|
|||
|
||||
cur->reboot_fixup(dev);
|
||||
}
|
||||
|
||||
printk(KERN_WARNING "No reboot fixup found for your hardware\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -963,6 +963,36 @@ efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function checks if the entire range <start,end> is mapped with type.
|
||||
*
|
||||
* Note: this function only works correct if the e820 table is sorted and
|
||||
* not-overlapping, which is the case
|
||||
*/
|
||||
int __init
|
||||
e820_all_mapped(unsigned long start, unsigned long end, unsigned type)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < e820.nr_map; i++) {
|
||||
struct e820entry *ei = &e820.map[i];
|
||||
if (type && ei->type != type)
|
||||
continue;
|
||||
/* is the region (part) in overlap with the current region ?*/
|
||||
if (ei->addr >= end || ei->addr + ei->size <= start)
|
||||
continue;
|
||||
/* if the region is at the beginning of <start,end> we move
|
||||
* start to the end of the region since it's ok until there
|
||||
*/
|
||||
if (ei->addr <= start)
|
||||
start = ei->addr + ei->size;
|
||||
/* if start is now at or beyond end, we're done, full
|
||||
* coverage */
|
||||
if (start >= end)
|
||||
return 1; /* we're done */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the highest page frame number we have available
|
||||
*/
|
||||
|
@ -1317,8 +1347,8 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat
|
|||
/*
|
||||
* Request address space for all standard resources
|
||||
*
|
||||
* This is called just before pcibios_assign_resources(), which is also
|
||||
* an fs_initcall, but is linked in later (in arch/i386/pci/i386.c).
|
||||
* This is called just before pcibios_init(), which is also a
|
||||
* subsys_initcall, but is linked in later (in arch/i386/pci/common.c).
|
||||
*/
|
||||
static int __init request_standard_resources(void)
|
||||
{
|
||||
|
@ -1339,7 +1369,7 @@ static int __init request_standard_resources(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
fs_initcall(request_standard_resources);
|
||||
subsys_initcall(request_standard_resources);
|
||||
|
||||
static void __init register_memory(void)
|
||||
{
|
||||
|
|
|
@ -365,6 +365,9 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|||
|
||||
if (++die.lock_owner_depth < 3) {
|
||||
int nl = 0;
|
||||
unsigned long esp;
|
||||
unsigned short ss;
|
||||
|
||||
handle_BUG(regs);
|
||||
printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
|
||||
#ifdef CONFIG_PREEMPT
|
||||
|
@ -387,8 +390,19 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|||
printk("\n");
|
||||
if (notify_die(DIE_OOPS, str, regs, err,
|
||||
current->thread.trap_no, SIGSEGV) !=
|
||||
NOTIFY_STOP)
|
||||
NOTIFY_STOP) {
|
||||
show_registers(regs);
|
||||
/* Executive summary in case the oops scrolled away */
|
||||
esp = (unsigned long) (®s->esp);
|
||||
savesegment(ss, ss);
|
||||
if (user_mode(regs)) {
|
||||
esp = regs->esp;
|
||||
ss = regs->xss & 0xffff;
|
||||
}
|
||||
printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip);
|
||||
print_symbol("%s", regs->eip);
|
||||
printk(" SS:ESP %04x:%08lx\n", ss, esp);
|
||||
}
|
||||
else
|
||||
regs = NULL;
|
||||
} else
|
||||
|
|
|
@ -106,9 +106,15 @@ voyager_module_t *voyager_cat_list;
|
|||
|
||||
/* the I/O port assignments for the VIC and QIC */
|
||||
static struct resource vic_res = {
|
||||
"Voyager Interrupt Controller", 0xFC00, 0xFC6F };
|
||||
.name = "Voyager Interrupt Controller",
|
||||
.start = 0xFC00,
|
||||
.end = 0xFC6F
|
||||
};
|
||||
static struct resource qic_res = {
|
||||
"Quad Interrupt Controller", 0xFC70, 0xFCFF };
|
||||
.name = "Quad Interrupt Controller",
|
||||
.start = 0xFC70,
|
||||
.end = 0xFCFF
|
||||
};
|
||||
|
||||
/* This function is used to pack a data bit stream inside a message.
|
||||
* It writes num_bits of the data buffer in msg starting at start_bit.
|
||||
|
|
|
@ -651,6 +651,7 @@ void __init mem_init(void)
|
|||
* Specifically, in the case of x86, we will always add
|
||||
* memory to the highmem for now.
|
||||
*/
|
||||
#ifdef CONFIG_HOTPLUG_MEMORY
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
int add_memory(u64 start, u64 size)
|
||||
{
|
||||
|
@ -667,6 +668,7 @@ int remove_memory(u64 start, u64 size)
|
|||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
kmem_cache_t *pgd_cache;
|
||||
kmem_cache_t *pmd_cache;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/dmi.h>
|
||||
#include "pci.h"
|
||||
|
||||
/*
|
||||
|
@ -18,8 +19,10 @@ int pci_conf1_read(unsigned int seg, unsigned int bus,
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!value || (bus > 255) || (devfn > 255) || (reg > 255))
|
||||
if ((bus > 255) || (devfn > 255) || (reg > 255)) {
|
||||
*value = -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&pci_config_lock, flags);
|
||||
|
||||
|
@ -91,8 +94,10 @@ static int pci_conf2_read(unsigned int seg, unsigned int bus,
|
|||
unsigned long flags;
|
||||
int dev, fn;
|
||||
|
||||
if (!value || (bus > 255) || (devfn > 255) || (reg > 255))
|
||||
if ((bus > 255) || (devfn > 255) || (reg > 255)) {
|
||||
*value = -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev = PCI_SLOT(devfn);
|
||||
fn = PCI_FUNC(devfn);
|
||||
|
@ -188,6 +193,10 @@ static int __init pci_sanity_check(struct pci_raw_ops *o)
|
|||
|
||||
if (pci_probe & PCI_NO_CHECKS)
|
||||
return 1;
|
||||
/* Assume Type 1 works for newer systems.
|
||||
This handles machines that don't have anything on PCI Bus 0. */
|
||||
if (dmi_get_year(DMI_BIOS_DATE) >= 2001)
|
||||
return 1;
|
||||
|
||||
for (devfn = 0; devfn < 0x100; devfn++) {
|
||||
if (o->read(0, 0, devfn, PCI_CLASS_DEVICE, 2, &x))
|
||||
|
|
|
@ -12,14 +12,20 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <asm/e820.h>
|
||||
#include "pci.h"
|
||||
|
||||
#define MMCONFIG_APER_SIZE (256*1024*1024)
|
||||
|
||||
/* Assume systems with more busses have correct MCFG */
|
||||
#define MAX_CHECK_BUS 16
|
||||
|
||||
#define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG))
|
||||
|
||||
/* The base address of the last MMCONFIG device accessed */
|
||||
static u32 mmcfg_last_accessed_device;
|
||||
|
||||
static DECLARE_BITMAP(fallback_slots, 32);
|
||||
static DECLARE_BITMAP(fallback_slots, MAX_CHECK_BUS*32);
|
||||
|
||||
/*
|
||||
* Functions for accessing PCI configuration space with MMCONFIG accesses
|
||||
|
@ -29,8 +35,8 @@ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
|
|||
int cfg_num = -1;
|
||||
struct acpi_table_mcfg_config *cfg;
|
||||
|
||||
if (seg == 0 && bus == 0 &&
|
||||
test_bit(PCI_SLOT(devfn), fallback_slots))
|
||||
if (seg == 0 && bus < MAX_CHECK_BUS &&
|
||||
test_bit(PCI_SLOT(devfn) + 32*bus, fallback_slots))
|
||||
return 0;
|
||||
|
||||
while (1) {
|
||||
|
@ -74,8 +80,10 @@ static int pci_mmcfg_read(unsigned int seg, unsigned int bus,
|
|||
unsigned long flags;
|
||||
u32 base;
|
||||
|
||||
if (!value || (bus > 255) || (devfn > 255) || (reg > 4095))
|
||||
if ((bus > 255) || (devfn > 255) || (reg > 4095)) {
|
||||
*value = -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
base = get_base_addr(seg, bus, devfn);
|
||||
if (!base)
|
||||
|
@ -146,29 +154,34 @@ static struct pci_raw_ops pci_mmcfg = {
|
|||
Normally this can be expressed in the MCFG by not listing them
|
||||
and assigning suitable _SEGs, but this isn't implemented in some BIOS.
|
||||
Instead try to discover all devices on bus 0 that are unreachable using MM
|
||||
and fallback for them.
|
||||
We only do this for bus 0/seg 0 */
|
||||
and fallback for them. */
|
||||
static __init void unreachable_devices(void)
|
||||
{
|
||||
int i;
|
||||
int i, k;
|
||||
unsigned long flags;
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
u32 val1;
|
||||
u32 addr;
|
||||
for (k = 0; k < MAX_CHECK_BUS; k++) {
|
||||
for (i = 0; i < 32; i++) {
|
||||
u32 val1;
|
||||
u32 addr;
|
||||
|
||||
pci_conf1_read(0, 0, PCI_DEVFN(i, 0), 0, 4, &val1);
|
||||
if (val1 == 0xffffffff)
|
||||
continue;
|
||||
pci_conf1_read(0, k, PCI_DEVFN(i, 0), 0, 4, &val1);
|
||||
if (val1 == 0xffffffff)
|
||||
continue;
|
||||
|
||||
/* Locking probably not needed, but safer */
|
||||
spin_lock_irqsave(&pci_config_lock, flags);
|
||||
addr = get_base_addr(0, 0, PCI_DEVFN(i, 0));
|
||||
if (addr != 0)
|
||||
pci_exp_set_dev_base(addr, 0, PCI_DEVFN(i, 0));
|
||||
if (addr == 0 || readl((u32 __iomem *)mmcfg_virt_addr) != val1)
|
||||
set_bit(i, fallback_slots);
|
||||
spin_unlock_irqrestore(&pci_config_lock, flags);
|
||||
/* Locking probably not needed, but safer */
|
||||
spin_lock_irqsave(&pci_config_lock, flags);
|
||||
addr = get_base_addr(0, k, PCI_DEVFN(i, 0));
|
||||
if (addr != 0)
|
||||
pci_exp_set_dev_base(addr, k, PCI_DEVFN(i, 0));
|
||||
if (addr == 0 ||
|
||||
readl((u32 __iomem *)mmcfg_virt_addr) != val1) {
|
||||
set_bit(i, fallback_slots);
|
||||
printk(KERN_NOTICE
|
||||
"PCI: No mmconfig possible on %x:%x\n", k, i);
|
||||
}
|
||||
spin_unlock_irqrestore(&pci_config_lock, flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -183,6 +196,14 @@ void __init pci_mmcfg_init(void)
|
|||
(pci_mmcfg_config[0].base_address == 0))
|
||||
return;
|
||||
|
||||
if (!e820_all_mapped(pci_mmcfg_config[0].base_address,
|
||||
pci_mmcfg_config[0].base_address + MMCONFIG_APER_SIZE,
|
||||
E820_RESERVED)) {
|
||||
printk(KERN_ERR "PCI: BIOS Bug: MCFG area is not E820-reserved\n");
|
||||
printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "PCI: Using MMCONFIG\n");
|
||||
raw_pci_ops = &pci_mmcfg;
|
||||
pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
|
||||
|
|
|
@ -260,15 +260,6 @@ config NR_CPUS
|
|||
than 64 will cause the use of a CPU mask array, causing a small
|
||||
performance hit.
|
||||
|
||||
config IA64_NR_NODES
|
||||
int "Maximum number of NODEs (256-1024)" if (IA64_SGI_SN2 || IA64_GENERIC)
|
||||
range 256 1024
|
||||
depends on IA64_SGI_SN2 || IA64_GENERIC
|
||||
default "256"
|
||||
help
|
||||
This option specifies the maximum number of nodes in your SSI system.
|
||||
If in doubt, use the default.
|
||||
|
||||
config HOTPLUG_CPU
|
||||
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
||||
depends on SMP && EXPERIMENTAL
|
||||
|
@ -352,6 +343,16 @@ config NUMA
|
|||
Access). This option is for configuring high-end multiprocessor
|
||||
server systems. If in doubt, say N.
|
||||
|
||||
config NODES_SHIFT
|
||||
int "Max num nodes shift(3-10)"
|
||||
range 3 10
|
||||
default "8"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
help
|
||||
This option specifies the maximum number of nodes in your SSI system.
|
||||
MAX_NUMNODES will be 2^(This value).
|
||||
If in doubt, use the default.
|
||||
|
||||
# VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent.
|
||||
# VIRTUAL_MEM_MAP has been retained for historical reasons.
|
||||
config VIRTUAL_MEM_MAP
|
||||
|
|
|
@ -1,105 +1,104 @@
|
|||
/*
|
||||
* arch/ia64/kernel/acpi-ext.c
|
||||
* (c) Copyright 2003, 2006 Hewlett-Packard Development Company, L.P.
|
||||
* Alex Williamson <alex.williamson@hp.com>
|
||||
* Bjorn Helgaas <bjorn.helgaas@hp.com>
|
||||
*
|
||||
* Copyright (C) 2003 Hewlett-Packard
|
||||
* Copyright (C) Alex Williamson
|
||||
* Copyright (C) Bjorn Helgaas
|
||||
*
|
||||
* Vendor specific extensions to ACPI.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/efi.h>
|
||||
|
||||
#include <asm/acpi-ext.h>
|
||||
|
||||
struct acpi_vendor_descriptor {
|
||||
u8 guid_id;
|
||||
efi_guid_t guid;
|
||||
/*
|
||||
* Device CSRs that do not appear in PCI config space should be described
|
||||
* via ACPI. This would normally be done with Address Space Descriptors
|
||||
* marked as "consumer-only," but old versions of Windows and Linux ignore
|
||||
* the producer/consumer flag, so HP invented a vendor-defined resource to
|
||||
* describe the location and size of CSR space.
|
||||
*/
|
||||
|
||||
struct acpi_vendor_uuid hp_ccsr_uuid = {
|
||||
.subtype = 2,
|
||||
.data = { 0xf9, 0xad, 0xe9, 0x69, 0x4f, 0x92, 0x5f, 0xab, 0xf6, 0x4a,
|
||||
0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad },
|
||||
};
|
||||
|
||||
struct acpi_vendor_info {
|
||||
struct acpi_vendor_descriptor *descriptor;
|
||||
u8 *data;
|
||||
u32 length;
|
||||
};
|
||||
|
||||
acpi_status
|
||||
acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
|
||||
{
|
||||
struct acpi_vendor_info *info = (struct acpi_vendor_info *)context;
|
||||
struct acpi_resource_vendor *vendor;
|
||||
struct acpi_vendor_descriptor *descriptor;
|
||||
u32 byte_length;
|
||||
|
||||
if (resource->type != ACPI_RESOURCE_TYPE_VENDOR)
|
||||
return AE_OK;
|
||||
|
||||
vendor = (struct acpi_resource_vendor *)&resource->data;
|
||||
descriptor = (struct acpi_vendor_descriptor *)vendor->byte_data;
|
||||
if (vendor->byte_length <= sizeof(*info->descriptor) ||
|
||||
descriptor->guid_id != info->descriptor->guid_id ||
|
||||
efi_guidcmp(descriptor->guid, info->descriptor->guid))
|
||||
return AE_OK;
|
||||
|
||||
byte_length = vendor->byte_length - sizeof(struct acpi_vendor_descriptor);
|
||||
info->data = acpi_os_allocate(byte_length);
|
||||
if (!info->data)
|
||||
return AE_NO_MEMORY;
|
||||
|
||||
memcpy(info->data,
|
||||
vendor->byte_data + sizeof(struct acpi_vendor_descriptor),
|
||||
byte_length);
|
||||
info->length = byte_length;
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
acpi_status
|
||||
acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id,
|
||||
u8 ** data, u32 * byte_length)
|
||||
{
|
||||
struct acpi_vendor_info info;
|
||||
|
||||
info.descriptor = id;
|
||||
info.data = NULL;
|
||||
|
||||
acpi_walk_resources(obj, METHOD_NAME__CRS, acpi_vendor_resource_match,
|
||||
&info);
|
||||
if (!info.data)
|
||||
return AE_NOT_FOUND;
|
||||
|
||||
*data = info.data;
|
||||
*byte_length = info.length;
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
struct acpi_vendor_descriptor hp_ccsr_descriptor = {
|
||||
.guid_id = 2,
|
||||
.guid =
|
||||
EFI_GUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2, 0x01,
|
||||
0x37, 0x0e, 0xad)
|
||||
};
|
||||
|
||||
acpi_status hp_acpi_csr_space(acpi_handle obj, u64 * csr_base, u64 * csr_length)
|
||||
static acpi_status hp_ccsr_locate(acpi_handle obj, u64 *base, u64 *length)
|
||||
{
|
||||
acpi_status status;
|
||||
u8 *data;
|
||||
u32 length;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct acpi_resource *resource;
|
||||
struct acpi_resource_vendor_typed *vendor;
|
||||
|
||||
status =
|
||||
acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data, &length);
|
||||
status = acpi_get_vendor_resource(obj, METHOD_NAME__CRS, &hp_ccsr_uuid,
|
||||
&buffer);
|
||||
|
||||
if (ACPI_FAILURE(status) || length != 16)
|
||||
resource = buffer.pointer;
|
||||
vendor = &resource->data.vendor_typed;
|
||||
|
||||
if (ACPI_FAILURE(status) || vendor->byte_length < 16) {
|
||||
status = AE_NOT_FOUND;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
memcpy(base, vendor->byte_data, sizeof(*base));
|
||||
memcpy(length, vendor->byte_data + 8, sizeof(*length));
|
||||
|
||||
exit:
|
||||
acpi_os_free(buffer.pointer);
|
||||
return status;
|
||||
}
|
||||
|
||||
struct csr_space {
|
||||
u64 base;
|
||||
u64 length;
|
||||
};
|
||||
|
||||
static acpi_status find_csr_space(struct acpi_resource *resource, void *data)
|
||||
{
|
||||
struct csr_space *space = data;
|
||||
struct acpi_resource_address64 addr;
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_resource_to_address64(resource, &addr);
|
||||
if (ACPI_SUCCESS(status) &&
|
||||
addr.resource_type == ACPI_MEMORY_RANGE &&
|
||||
addr.address_length &&
|
||||
addr.producer_consumer == ACPI_CONSUMER) {
|
||||
space->base = addr.minimum;
|
||||
space->length = addr.address_length;
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
return AE_OK; /* keep looking */
|
||||
}
|
||||
|
||||
static acpi_status hp_crs_locate(acpi_handle obj, u64 *base, u64 *length)
|
||||
{
|
||||
struct csr_space space = { 0, 0 };
|
||||
|
||||
acpi_walk_resources(obj, METHOD_NAME__CRS, find_csr_space, &space);
|
||||
if (!space.length)
|
||||
return AE_NOT_FOUND;
|
||||
|
||||
memcpy(csr_base, data, sizeof(*csr_base));
|
||||
memcpy(csr_length, data + 8, sizeof(*csr_length));
|
||||
acpi_os_free(data);
|
||||
|
||||
*base = space.base;
|
||||
*length = space.length;
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
acpi_status hp_acpi_csr_space(acpi_handle obj, u64 *csr_base, u64 *csr_length)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = hp_ccsr_locate(obj, csr_base, csr_length);
|
||||
if (ACPI_SUCCESS(status))
|
||||
return status;
|
||||
|
||||
return hp_crs_locate(obj, csr_base, csr_length);
|
||||
}
|
||||
EXPORT_SYMBOL(hp_acpi_csr_space);
|
||||
|
|
|
@ -1606,5 +1606,8 @@ sys_call_table:
|
|||
data8 sys_ni_syscall // 1295 reserved for ppoll
|
||||
data8 sys_unshare
|
||||
data8 sys_splice
|
||||
data8 sys_set_robust_list
|
||||
data8 sys_get_robust_list
|
||||
data8 sys_sync_file_range // 1300
|
||||
|
||||
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
||||
|
|
|
@ -581,10 +581,12 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs)
|
|||
{
|
||||
unsigned long flags;
|
||||
int cpu = smp_processor_id();
|
||||
struct ia64_mca_notify_die nd =
|
||||
{ .sos = NULL, .monarch_cpu = &monarch_cpu };
|
||||
|
||||
/* Mask all interrupts */
|
||||
local_irq_save(flags);
|
||||
if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
|
||||
|
@ -594,7 +596,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs)
|
|||
*/
|
||||
ia64_sal_mc_rendez();
|
||||
|
||||
if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
|
||||
|
@ -602,7 +604,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs)
|
|||
while (monarch_cpu != -1)
|
||||
cpu_relax(); /* spin until monarch leaves */
|
||||
|
||||
if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
|
||||
|
@ -1023,6 +1025,8 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
&sos->proc_state_param;
|
||||
int recover, cpu = smp_processor_id();
|
||||
task_t *previous_current;
|
||||
struct ia64_mca_notify_die nd =
|
||||
{ .sos = sos, .monarch_cpu = &monarch_cpu };
|
||||
|
||||
oops_in_progress = 1; /* FIXME: make printk NMI/MCA/INIT safe */
|
||||
console_loglevel = 15; /* make sure printks make it to console */
|
||||
|
@ -1031,7 +1035,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
|
||||
previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA");
|
||||
monarch_cpu = cpu;
|
||||
if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
ia64_wait_for_slaves(cpu);
|
||||
|
@ -1043,7 +1047,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
* spinning in SAL does not work.
|
||||
*/
|
||||
ia64_mca_wakeup_all();
|
||||
if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
|
||||
|
@ -1064,7 +1068,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
ia64_sal_clear_state_info(SAL_INFO_TYPE_MCA);
|
||||
sos->os_status = IA64_MCA_CORRECTED;
|
||||
}
|
||||
if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, 0, 0, recover)
|
||||
if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
|
||||
|
@ -1351,10 +1355,14 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
static atomic_t monarchs;
|
||||
task_t *previous_current;
|
||||
int cpu = smp_processor_id();
|
||||
struct ia64_mca_notify_die nd =
|
||||
{ .sos = sos, .monarch_cpu = &monarch_cpu };
|
||||
|
||||
oops_in_progress = 1; /* FIXME: make printk NMI/MCA/INIT safe */
|
||||
console_loglevel = 15; /* make sure printks make it to console */
|
||||
|
||||
(void) notify_die(DIE_INIT_ENTER, "INIT", regs, (long)&nd, 0, 0);
|
||||
|
||||
printk(KERN_INFO "Entered OS INIT handler. PSP=%lx cpu=%d monarch=%ld\n",
|
||||
sos->proc_state_param, cpu, sos->monarch);
|
||||
salinfo_log_wakeup(SAL_INFO_TYPE_INIT, NULL, 0, 0);
|
||||
|
@ -1390,15 +1398,15 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_INIT;
|
||||
while (monarch_cpu == -1)
|
||||
cpu_relax(); /* spin until monarch enters */
|
||||
if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
while (monarch_cpu != -1)
|
||||
cpu_relax(); /* spin until monarch leaves */
|
||||
if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
printk("Slave on cpu %d returning to normal service.\n", cpu);
|
||||
|
@ -1409,7 +1417,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
}
|
||||
|
||||
monarch_cpu = cpu;
|
||||
if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
|
||||
|
@ -1426,10 +1434,10 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
|
|||
* to default_monarch_init_process() above and just print all the
|
||||
* tasks.
|
||||
*/
|
||||
if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, 0, 0, 0)
|
||||
if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, (long)&nd, 0, 0)
|
||||
== NOTIFY_STOP)
|
||||
ia64_mca_spin(__FUNCTION__);
|
||||
printk("\nINIT dump complete. Monarch on cpu %d returning to normal service.\n", cpu);
|
||||
|
@ -1631,6 +1639,7 @@ ia64_mca_init(void)
|
|||
printk(KERN_INFO "Increasing MCA rendezvous timeout from "
|
||||
"%ld to %ld milliseconds\n", timeout, isrv.v0);
|
||||
timeout = isrv.v0;
|
||||
(void) notify_die(DIE_MCA_NEW_TIMEOUT, "MCA", NULL, timeout, 0, 0);
|
||||
continue;
|
||||
}
|
||||
printk(KERN_ERR "Failed to register rendezvous interrupt "
|
||||
|
|
|
@ -827,7 +827,7 @@ ia64_state_restore:
|
|||
ld8 r9=[temp2],16 // sal_gp
|
||||
;;
|
||||
ld8 r22=[temp1],16 // pal_min_state, virtual
|
||||
ld8 r21=[temp2],16 // prev_IA64_KR_CURRENT
|
||||
ld8 r13=[temp2],16 // prev_IA64_KR_CURRENT
|
||||
;;
|
||||
ld8 r16=[temp1],16 // prev_IA64_KR_CURRENT_STACK
|
||||
ld8 r20=[temp2],16 // prev_task
|
||||
|
@ -848,7 +848,7 @@ ia64_state_restore:
|
|||
mov cr.iim=temp3
|
||||
mov cr.iha=temp4
|
||||
dep r22=0,r22,62,1 // pal_min_state, physical, uncached
|
||||
mov IA64_KR(CURRENT)=r21
|
||||
mov IA64_KR(CURRENT)=r13
|
||||
ld8 r8=[temp1] // os_status
|
||||
ld8 r10=[temp2] // context
|
||||
|
||||
|
@ -856,7 +856,7 @@ ia64_state_restore:
|
|||
* avoid any dependencies on the algorithm in ia64_switch_to(), just
|
||||
* purge any existing CURRENT_STACK mapping and insert the new one.
|
||||
*
|
||||
* r16 contains prev_IA64_KR_CURRENT_STACK, r21 contains
|
||||
* r16 contains prev_IA64_KR_CURRENT_STACK, r13 contains
|
||||
* prev_IA64_KR_CURRENT, these values may have been changed by the C
|
||||
* code. Do not use r8, r9, r10, r22, they contain values ready for
|
||||
* the return to SAL.
|
||||
|
@ -873,7 +873,7 @@ ia64_state_restore:
|
|||
;;
|
||||
srlz.d
|
||||
|
||||
extr.u r19=r21,61,3 // r21 = prev_IA64_KR_CURRENT
|
||||
extr.u r19=r13,61,3 // r13 = prev_IA64_KR_CURRENT
|
||||
shl r20=r16,IA64_GRANULE_SHIFT // r16 = prev_IA64_KR_CURRENT_STACK
|
||||
movl r21=PAGE_KERNEL // page properties
|
||||
;;
|
||||
|
@ -883,7 +883,7 @@ ia64_state_restore:
|
|||
(p6) br.spnt 1f // the dreaded cpu 0 idle task in region 5:(
|
||||
;;
|
||||
mov cr.itir=r18
|
||||
mov cr.ifa=r21
|
||||
mov cr.ifa=r13
|
||||
mov r20=IA64_TR_CURRENT_STACK
|
||||
;;
|
||||
itr.d dtr[r20]=r21
|
||||
|
|
|
@ -947,7 +947,7 @@ void
|
|||
percpu_modcopy (void *pcpudst, const void *src, unsigned long size)
|
||||
{
|
||||
unsigned int i;
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
memcpy(pcpudst + __per_cpu_offset[i], src, size);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,6 +60,9 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
|
|||
struct siginfo si;
|
||||
unsigned long mask;
|
||||
|
||||
/* mmap_sem is performance critical.... */
|
||||
prefetchw(&mm->mmap_sem);
|
||||
|
||||
/*
|
||||
* If we're in an interrupt or have no user context, we must not take the fault..
|
||||
*/
|
||||
|
|
|
@ -1831,7 +1831,7 @@ xpc_initiate_allocate(partid_t partid, int ch_number, u32 flags, void **payload)
|
|||
{
|
||||
struct xpc_partition *part = &xpc_partitions[partid];
|
||||
enum xpc_retval ret = xpcUnknownReason;
|
||||
struct xpc_msg *msg;
|
||||
struct xpc_msg *msg = NULL;
|
||||
|
||||
|
||||
DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS);
|
||||
|
|
|
@ -285,6 +285,11 @@ config NUMA
|
|||
depends on SMP && BROKEN
|
||||
default n
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "1"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
# turning this on wastes a bunch of space.
|
||||
# Summit needs it only when NUMA is on
|
||||
config BOOT_IOREMAP
|
||||
|
|
|
@ -23,9 +23,6 @@ EXPORT_SYMBOL(boot_cpu_data);
|
|||
EXPORT_SYMBOL(dump_fpu);
|
||||
EXPORT_SYMBOL(__ioremap);
|
||||
EXPORT_SYMBOL(iounmap);
|
||||
EXPORT_SYMBOL(enable_irq);
|
||||
EXPORT_SYMBOL(disable_irq);
|
||||
EXPORT_SYMBOL(disable_irq_nosync);
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
EXPORT_SYMBOL(__down);
|
||||
EXPORT_SYMBOL(__down_interruptible);
|
||||
|
@ -38,13 +35,6 @@ EXPORT_SYMBOL(__udelay);
|
|||
EXPORT_SYMBOL(__delay);
|
||||
EXPORT_SYMBOL(__const_udelay);
|
||||
|
||||
EXPORT_SYMBOL(__get_user_1);
|
||||
EXPORT_SYMBOL(__get_user_2);
|
||||
EXPORT_SYMBOL(__get_user_4);
|
||||
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
|
||||
EXPORT_SYMBOL(strncpy_from_user);
|
||||
EXPORT_SYMBOL(__strncpy_from_user);
|
||||
EXPORT_SYMBOL(clear_user);
|
||||
|
@ -59,11 +49,8 @@ extern void *dcache_dummy;
|
|||
EXPORT_SYMBOL(dcache_dummy);
|
||||
#endif
|
||||
EXPORT_SYMBOL(cpu_data);
|
||||
EXPORT_SYMBOL(cpu_online_map);
|
||||
EXPORT_SYMBOL(cpu_callout_map);
|
||||
|
||||
/* Global SMP stuff */
|
||||
EXPORT_SYMBOL(synchronize_irq);
|
||||
EXPORT_SYMBOL(smp_call_function);
|
||||
|
||||
/* TLB flushing */
|
||||
|
@ -83,27 +70,11 @@ EXPORT_SYMBOL(__lshrdi3);
|
|||
EXPORT_SYMBOL(__muldi3);
|
||||
|
||||
/* memory and string operations */
|
||||
EXPORT_SYMBOL(memchr);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
/* EXPORT_SYMBOL(memcpy_fromio); // not implement yet */
|
||||
/* EXPORT_SYMBOL(memcpy_toio); // not implement yet */
|
||||
EXPORT_SYMBOL(memset);
|
||||
/* EXPORT_SYMBOL(memset_io); // not implement yet */
|
||||
EXPORT_SYMBOL(memmove);
|
||||
EXPORT_SYMBOL(memcmp);
|
||||
EXPORT_SYMBOL(memscan);
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
EXPORT_SYMBOL(clear_page);
|
||||
|
||||
EXPORT_SYMBOL(strcat);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strcmp);
|
||||
EXPORT_SYMBOL(strcpy);
|
||||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strncat);
|
||||
EXPORT_SYMBOL(strncmp);
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strncpy);
|
||||
|
||||
EXPORT_SYMBOL(_inb);
|
||||
EXPORT_SYMBOL(_inw);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/sched.h>
|
||||
|
@ -219,8 +220,6 @@ static unsigned long __init setup_memory(void)
|
|||
extern unsigned long setup_memory(void);
|
||||
#endif /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
#define M32R_PCC_PCATCR 0x00ef7014 /* will move to m32r.h */
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
|
||||
|
@ -269,15 +268,14 @@ void __init setup_arch(char **cmdline_p)
|
|||
paging_init();
|
||||
}
|
||||
|
||||
static struct cpu cpu[NR_CPUS];
|
||||
static struct cpu cpu_devices[NR_CPUS];
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int cpu_id;
|
||||
int i;
|
||||
|
||||
for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++)
|
||||
if (cpu_possible(cpu_id))
|
||||
register_cpu(&cpu[cpu_id], cpu_id, NULL);
|
||||
for_each_present_cpu(i)
|
||||
register_cpu(&cpu_devices[i], i, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -39,8 +39,10 @@
|
|||
* Martin J. Bligh : Added support for multi-quad systems
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/irq.h>
|
||||
|
@ -72,11 +74,15 @@ physid_mask_t phys_cpu_present_map;
|
|||
|
||||
/* Bitmask of currently online CPUs */
|
||||
cpumask_t cpu_online_map;
|
||||
EXPORT_SYMBOL(cpu_online_map);
|
||||
|
||||
cpumask_t cpu_bootout_map;
|
||||
cpumask_t cpu_bootin_map;
|
||||
cpumask_t cpu_callout_map;
|
||||
static cpumask_t cpu_callin_map;
|
||||
cpumask_t cpu_callout_map;
|
||||
EXPORT_SYMBOL(cpu_callout_map);
|
||||
cpumask_t cpu_possible_map = CPU_MASK_ALL;
|
||||
EXPORT_SYMBOL(cpu_possible_map);
|
||||
|
||||
/* Per CPU bogomips and other parameters */
|
||||
struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned;
|
||||
|
@ -110,7 +116,6 @@ static unsigned int calibration_result;
|
|||
|
||||
void smp_prepare_boot_cpu(void);
|
||||
void smp_prepare_cpus(unsigned int);
|
||||
static void smp_tune_scheduling(void);
|
||||
static void init_ipi_lock(void);
|
||||
static void do_boot_cpu(int);
|
||||
int __cpu_up(unsigned int);
|
||||
|
@ -177,6 +182,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
}
|
||||
for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++)
|
||||
physid_set(phys_id, phys_cpu_present_map);
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
cpu_present_map = cpu_possible_map;
|
||||
#endif
|
||||
|
||||
show_mp_info(nr_cpu);
|
||||
|
||||
|
@ -186,7 +194,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
* Setup boot CPU information
|
||||
*/
|
||||
smp_store_cpu_info(0); /* Final full version of the data */
|
||||
smp_tune_scheduling();
|
||||
|
||||
/*
|
||||
* If SMP should be disabled, then really disable it!
|
||||
|
@ -230,11 +237,6 @@ smp_done:
|
|||
Dprintk("Boot done.\n");
|
||||
}
|
||||
|
||||
static void __init smp_tune_scheduling(void)
|
||||
{
|
||||
/* Nothing to do. */
|
||||
}
|
||||
|
||||
/*
|
||||
* init_ipi_lock : Initialize IPI locks.
|
||||
*/
|
||||
|
@ -629,4 +631,3 @@ static void __init unmap_cpu_to_physid(int cpu_id, int phys_id)
|
|||
physid_2_cpu[phys_id] = -1;
|
||||
cpu_2_physid[cpu_id] = -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,6 @@
|
|||
# Makefile for M32R-specific library files..
|
||||
#
|
||||
|
||||
lib-y := checksum.o ashxdi3.o memset.o memcpy.o getuser.o \
|
||||
putuser.o delay.o strlen.o usercopy.o csum_partial_copy.o
|
||||
lib-y := checksum.o ashxdi3.o memset.o memcpy.o \
|
||||
delay.o strlen.o usercopy.o csum_partial_copy.o
|
||||
|
||||
|
|
|
@ -1,88 +0,0 @@
|
|||
/*
|
||||
* __get_user functions.
|
||||
*
|
||||
* (C) Copyright 2001 Hirokazu Takata
|
||||
*
|
||||
* These functions have a non-standard call interface
|
||||
* to make them more efficient, especially as they
|
||||
* return an error value in addition to the "real"
|
||||
* return value.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
/*
|
||||
* __get_user_X
|
||||
*
|
||||
* Inputs: r0 contains the address
|
||||
*
|
||||
* Outputs: r0 is error code (0 or -EFAULT)
|
||||
* r1 contains zero-extended value
|
||||
*
|
||||
* These functions should not modify any other registers,
|
||||
* as they get called from within inline assembly.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_ISA_DUAL_ISSUE
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __get_user_1
|
||||
__get_user_1:
|
||||
1: ldub r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_2
|
||||
__get_user_2:
|
||||
2: lduh r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_4
|
||||
__get_user_4:
|
||||
3: ld r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_get_user:
|
||||
ldi r1, #0 || ldi r0, #-14
|
||||
jmp r14
|
||||
|
||||
#else /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __get_user_1
|
||||
__get_user_1:
|
||||
1: ldub r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_2
|
||||
__get_user_2:
|
||||
2: lduh r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_4
|
||||
__get_user_4:
|
||||
3: ld r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_get_user:
|
||||
ldi r1, #0
|
||||
ldi r0, #-14
|
||||
jmp r14
|
||||
|
||||
#endif /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.section __ex_table,"a"
|
||||
.long 1b,bad_get_user
|
||||
.long 2b,bad_get_user
|
||||
.long 3b,bad_get_user
|
||||
.previous
|
||||
|
||||
.end
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
* __put_user functions.
|
||||
*
|
||||
* (C) Copyright 1998 Linus Torvalds
|
||||
* (C) Copyright 2001 Hirokazu Takata
|
||||
*
|
||||
* These functions have a non-standard call interface
|
||||
* to make them more efficient.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
/*
|
||||
* __put_user_X
|
||||
*
|
||||
* Inputs: r0 contains the address
|
||||
* r1 contains the value
|
||||
*
|
||||
* Outputs: r0 is error code (0 or -EFAULT)
|
||||
* r1 is corrupted (will contain "current_task").
|
||||
*
|
||||
* These functions should not modify any other registers,
|
||||
* as they get called from within inline assembly.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_ISA_DUAL_ISSUE
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __put_user_1
|
||||
__put_user_1:
|
||||
1: stb r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_2
|
||||
__put_user_2:
|
||||
2: sth r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_4
|
||||
__put_user_4:
|
||||
3: st r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_put_user:
|
||||
ldi r0, #-14 || jmp r14
|
||||
|
||||
#else /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __put_user_1
|
||||
__put_user_1:
|
||||
1: stb r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_2
|
||||
__put_user_2:
|
||||
2: sth r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_4
|
||||
__put_user_4:
|
||||
3: st r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_put_user:
|
||||
ldi r0, #-14
|
||||
jmp r14
|
||||
|
||||
#endif /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.section __ex_table,"a"
|
||||
.long 1b,bad_put_user
|
||||
.long 2b,bad_put_user
|
||||
.long 3b,bad_put_user
|
||||
.previous
|
|
@ -57,7 +57,6 @@ EXPORT_SYMBOL(dump_thread);
|
|||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(enable_irq);
|
||||
EXPORT_SYMBOL(disable_irq);
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
|
|
|
@ -26,7 +26,6 @@ EXPORT_SYMBOL(__ioremap);
|
|||
EXPORT_SYMBOL(iounmap);
|
||||
EXPORT_SYMBOL(dump_fpu);
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
|
|
|
@ -1590,6 +1590,11 @@ config ARCH_FLATMEM_ENABLE
|
|||
def_bool y
|
||||
depends on !NUMA
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "6"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
config SMP
|
||||
|
|
|
@ -39,7 +39,6 @@ EXPORT_SYMBOL(strchr);
|
|||
EXPORT_SYMBOL(strncmp);
|
||||
#endif
|
||||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strncat);
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
|
|
|
@ -177,6 +177,11 @@ config ARCH_DISCONTIGMEM_DEFAULT
|
|||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "3"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
source "kernel/Kconfig.preempt"
|
||||
source "kernel/Kconfig.hz"
|
||||
source "mm/Kconfig"
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include <linux/string.h>
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
|
||||
#include <asm/atomic.h>
|
||||
EXPORT_SYMBOL(__xchg8);
|
||||
|
|
|
@ -649,6 +649,11 @@ config NUMA
|
|||
depends on PPC64
|
||||
default y if SMP && PPC_PSERIES
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "4"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
config ARCH_SELECT_MEMORY_MODEL
|
||||
def_bool y
|
||||
depends on PPC64
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
CFLAGS_kbd.o := -Idrivers/char
|
||||
CFLAGS_vreset.o := -I$(srctree)/arch/ppc/boot/include
|
||||
CFLAGS_vreset.o := -Iarch/ppc/boot/include
|
||||
|
||||
zlib := infblock.c infcodes.c inffast.c inflate.c inftrees.c infutil.c
|
||||
|
||||
|
|
|
@ -67,7 +67,6 @@ cflags-$(CONFIG_WARN_STACK) += -mwarn-framesize=$(CONFIG_WARN_STACK_SIZE)
|
|||
endif
|
||||
|
||||
CFLAGS += -mbackchain -msoft-float $(cflags-y)
|
||||
CFLAGS += $(call cc-option,-finline-limit=10000)
|
||||
CFLAGS += -pipe -fno-strength-reduce -Wno-sign-compare
|
||||
AFLAGS += $(aflags-y)
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-rc2
|
||||
# Wed Feb 8 10:44:39 2006
|
||||
# Linux kernel version: 2.6.17-rc1
|
||||
# Mon Apr 3 14:34:15 2006
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_S390=y
|
||||
|
||||
|
@ -30,8 +31,8 @@ CONFIG_AUDIT=y
|
|||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
|
@ -45,10 +46,6 @@ CONFIG_BASE_FULL=y
|
|||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
@ -60,7 +57,6 @@ CONFIG_BASE_SMALL=0
|
|||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
@ -69,7 +65,7 @@ CONFIG_STOP_MACHINE=y
|
|||
#
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -91,17 +87,20 @@ CONFIG_DEFAULT_IOSCHED="deadline"
|
|||
#
|
||||
# Processor type and features
|
||||
#
|
||||
# CONFIG_64BIT is not set
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=32
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_MATHEMU=y
|
||||
CONFIG_DEFAULT_MIGRATION_COST=1000000
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
CONFIG_BINFMT_ELF32=y
|
||||
|
||||
#
|
||||
# Code generation options
|
||||
#
|
||||
CONFIG_MARCH_G5=y
|
||||
# CONFIG_MARCH_Z900 is not set
|
||||
# CONFIG_MARCH_G5 is not set
|
||||
CONFIG_MARCH_Z900=y
|
||||
# CONFIG_MARCH_Z990 is not set
|
||||
CONFIG_PACK_STACK=y
|
||||
# CONFIG_SMALL_STACK is not set
|
||||
|
@ -143,7 +142,7 @@ CONFIG_VIRT_CPU_ACCOUNTING=y
|
|||
# CONFIG_APPLDATA_BASE is not set
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_NO_IDLE_HZ_INIT=y
|
||||
# CONFIG_KEXEC is not set
|
||||
CONFIG_KEXEC=y
|
||||
|
||||
#
|
||||
# Networking
|
||||
|
@ -173,6 +172,7 @@ CONFIG_IP_FIB_HASH=y
|
|||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
|
@ -180,9 +180,11 @@ CONFIG_INET_TCP_DIAG=y
|
|||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_IPV6_ROUTER_PREF is not set
|
||||
# CONFIG_INET6_AH is not set
|
||||
# CONFIG_INET6_ESP is not set
|
||||
# CONFIG_INET6_IPCOMP is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_IPV6_TUNNEL is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
@ -275,6 +277,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
|
|||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
|
@ -340,8 +347,7 @@ CONFIG_DASD_PROFILE=y
|
|||
CONFIG_DASD_ECKD=y
|
||||
CONFIG_DASD_FBA=y
|
||||
CONFIG_DASD_DIAG=y
|
||||
CONFIG_DASD_EER=m
|
||||
# CONFIG_DASD_CMB is not set
|
||||
CONFIG_DASD_EER=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
|
@ -354,6 +360,7 @@ CONFIG_MD_RAID0=m
|
|||
CONFIG_MD_RAID1=m
|
||||
# CONFIG_MD_RAID10 is not set
|
||||
CONFIG_MD_RAID5=m
|
||||
# CONFIG_MD_RAID5_RESHAPE is not set
|
||||
# CONFIG_MD_RAID6 is not set
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
# CONFIG_MD_FAULTY is not set
|
||||
|
@ -404,6 +411,7 @@ CONFIG_S390_TAPE_BLOCK=y
|
|||
# S/390 tape hardware support
|
||||
#
|
||||
CONFIG_S390_TAPE_34XX=m
|
||||
# CONFIG_S390_TAPE_3590 is not set
|
||||
# CONFIG_VMLOGRDR is not set
|
||||
# CONFIG_VMCP is not set
|
||||
# CONFIG_MONREADER is not set
|
||||
|
@ -529,7 +537,6 @@ CONFIG_SYSFS=y
|
|||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
@ -619,14 +626,15 @@ CONFIG_LOG_BUF_SHIFT=17
|
|||
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
|
||||
|
|
|
@ -527,6 +527,11 @@ config CPU_HAS_SR_RB
|
|||
See <file:Documentation/sh/register-banks.txt> for further
|
||||
information on SR.RB and register banking in the kernel in general.
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "1"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Boot options"
|
||||
|
|
|
@ -37,7 +37,6 @@ EXPORT_SYMBOL(disable_irq_nosync);
|
|||
EXPORT_SYMBOL(irq_desc);
|
||||
EXPORT_SYMBOL(no_irq_type);
|
||||
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
|
|
|
@ -41,7 +41,6 @@ EXPORT_SYMBOL(kernel_thread);
|
|||
/* Networking helper routines. */
|
||||
EXPORT_SYMBOL(csum_partial_copy);
|
||||
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
|
||||
#ifdef CONFIG_VT
|
||||
|
|
|
@ -244,7 +244,7 @@ int setup_profiling_timer(unsigned int multiplier)
|
|||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&prof_setup_lock, flags);
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
load_profile_irq(i, lvl14_resolution / multiplier);
|
||||
prof_multiplier(i) = multiplier;
|
||||
}
|
||||
|
|
|
@ -263,7 +263,6 @@ EXPORT_SYMBOL(strcmp);
|
|||
EXPORT_SYMBOL(strncmp);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(page_kernel);
|
||||
|
||||
|
|
|
@ -5,4 +5,4 @@
|
|||
obj-y := math.o
|
||||
|
||||
EXTRA_AFLAGS := -ansi
|
||||
EXTRA_CFLAGS = -I. -I$(TOPDIR)/include/math-emu -w
|
||||
EXTRA_CFLAGS = -I. -Iinclude/math-emu -w
|
||||
|
|
|
@ -194,6 +194,9 @@ endchoice
|
|||
|
||||
endmenu
|
||||
|
||||
config ARCH_SELECT_MEMORY_MODEL
|
||||
def_bool y
|
||||
|
||||
config ARCH_SPARSEMEM_ENABLE
|
||||
def_bool y
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16
|
||||
# Fri Mar 31 01:40:57 2006
|
||||
# Sun Apr 2 19:31:04 2006
|
||||
#
|
||||
CONFIG_SPARC=y
|
||||
CONFIG_SPARC64=y
|
||||
|
@ -838,7 +838,6 @@ CONFIG_FB_TILEBLITTING=y
|
|||
# CONFIG_FB_NVIDIA is not set
|
||||
# CONFIG_FB_RIVA is not set
|
||||
# CONFIG_FB_MATROX is not set
|
||||
# CONFIG_FB_RADEON_OLD is not set
|
||||
CONFIG_FB_RADEON=y
|
||||
CONFIG_FB_RADEON_I2C=y
|
||||
# CONFIG_FB_RADEON_DEBUG is not set
|
||||
|
@ -924,6 +923,7 @@ CONFIG_SND_MTPAV=m
|
|||
# PCI devices
|
||||
#
|
||||
# CONFIG_SND_AD1889 is not set
|
||||
# CONFIG_SND_ALS300 is not set
|
||||
CONFIG_SND_ALI5451=m
|
||||
# CONFIG_SND_ATIIXP is not set
|
||||
# CONFIG_SND_ATIIXP_MODEM is not set
|
||||
|
@ -955,6 +955,7 @@ CONFIG_SND_ALI5451=m
|
|||
# CONFIG_SND_MIXART is not set
|
||||
# CONFIG_SND_NM256 is not set
|
||||
# CONFIG_SND_PCXHR is not set
|
||||
# CONFIG_SND_RIPTIDE is not set
|
||||
# CONFIG_SND_RME32 is not set
|
||||
# CONFIG_SND_RME96 is not set
|
||||
# CONFIG_SND_RME9652 is not set
|
||||
|
@ -1108,6 +1109,11 @@ CONFIG_USB_HIDDEV=y
|
|||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
|
|
|
@ -1092,7 +1092,7 @@ void sun4v_pci_init(int node, char *model_name)
|
|||
}
|
||||
}
|
||||
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
unsigned long page = get_zeroed_page(GFP_ATOMIC);
|
||||
|
||||
if (!page)
|
||||
|
|
|
@ -244,6 +244,13 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
|
|||
}
|
||||
|
||||
switch(request) {
|
||||
case PTRACE_PEEKUSR:
|
||||
if (addr != 0)
|
||||
pt_error_return(regs, EIO);
|
||||
else
|
||||
pt_succ_return(regs, 0);
|
||||
goto out_tsk;
|
||||
|
||||
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
||||
case PTRACE_PEEKDATA: {
|
||||
unsigned long tmp64;
|
||||
|
@ -602,6 +609,22 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
|
|||
|
||||
/* PTRACE_DUMPCORE unsupported... */
|
||||
|
||||
case PTRACE_GETEVENTMSG: {
|
||||
int err;
|
||||
|
||||
if (test_thread_flag(TIF_32BIT))
|
||||
err = put_user(child->ptrace_message,
|
||||
(unsigned int __user *) data);
|
||||
else
|
||||
err = put_user(child->ptrace_message,
|
||||
(unsigned long __user *) data);
|
||||
if (err)
|
||||
pt_error_return(regs, -err);
|
||||
else
|
||||
pt_succ_return(regs, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
int err = ptrace_request(child, request, addr, data);
|
||||
if (err)
|
||||
|
|
|
@ -535,7 +535,7 @@ static int __init topology_init(void)
|
|||
while (!cpu_find_by_instance(ncpus_probed, NULL, NULL))
|
||||
ncpus_probed++;
|
||||
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
if (p) {
|
||||
register_cpu(p, i, NULL);
|
||||
|
|
|
@ -745,12 +745,21 @@ struct call_data_struct {
|
|||
int wait;
|
||||
};
|
||||
|
||||
static DEFINE_SPINLOCK(call_lock);
|
||||
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(call_lock);
|
||||
static struct call_data_struct *call_data;
|
||||
|
||||
extern unsigned long xcall_call_function;
|
||||
|
||||
/*
|
||||
/**
|
||||
* smp_call_function(): Run a function on all other CPUs.
|
||||
* @func: The function to run. This must be fast and non-blocking.
|
||||
* @info: An arbitrary pointer to pass to the function.
|
||||
* @nonatomic: currently unused.
|
||||
* @wait: If true, wait (atomically) until function has completed on other CPUs.
|
||||
*
|
||||
* Returns 0 on success, else a negative status code. Does not return until
|
||||
* remote CPUs are nearly ready to execute <<func>> or are or have executed.
|
||||
*
|
||||
* You must not call this function with disabled interrupts or from a
|
||||
* hardware interrupt handler or from a bottom half handler.
|
||||
*/
|
||||
|
@ -759,7 +768,6 @@ static int smp_call_function_mask(void (*func)(void *info), void *info,
|
|||
{
|
||||
struct call_data_struct data;
|
||||
int cpus;
|
||||
long timeout;
|
||||
|
||||
/* Can deadlock when called with interrupts disabled */
|
||||
WARN_ON(irqs_disabled());
|
||||
|
@ -777,31 +785,18 @@ static int smp_call_function_mask(void (*func)(void *info), void *info,
|
|||
goto out_unlock;
|
||||
|
||||
call_data = &data;
|
||||
mb();
|
||||
|
||||
smp_cross_call_masked(&xcall_call_function, 0, 0, 0, mask);
|
||||
|
||||
/*
|
||||
* Wait for other cpus to complete function or at
|
||||
* least snap the call data.
|
||||
*/
|
||||
timeout = 1000000;
|
||||
while (atomic_read(&data.finished) != cpus) {
|
||||
if (--timeout <= 0)
|
||||
goto out_timeout;
|
||||
barrier();
|
||||
udelay(1);
|
||||
}
|
||||
/* Wait for response */
|
||||
while (atomic_read(&data.finished) != cpus)
|
||||
cpu_relax();
|
||||
|
||||
out_unlock:
|
||||
spin_unlock(&call_lock);
|
||||
|
||||
return 0;
|
||||
|
||||
out_timeout:
|
||||
spin_unlock(&call_lock);
|
||||
printk("XCALL: Remote cpus not responding, ncpus=%d finished=%d\n",
|
||||
cpus, atomic_read(&data.finished));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smp_call_function(void (*func)(void *info), void *info,
|
||||
|
@ -1285,7 +1280,7 @@ int setup_profiling_timer(unsigned int multiplier)
|
|||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&prof_setup_lock, flags);
|
||||
for_each_cpu(i)
|
||||
for_each_possible_cpu(i)
|
||||
prof_multiplier(i) = multiplier;
|
||||
current_tick_offset = (timer_tick_offset / multiplier);
|
||||
spin_unlock_irqrestore(&prof_setup_lock, flags);
|
||||
|
@ -1313,12 +1308,12 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
}
|
||||
}
|
||||
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
if (tlb_type == hypervisor) {
|
||||
int j;
|
||||
|
||||
/* XXX get this mapping from machine description */
|
||||
for_each_cpu(j) {
|
||||
for_each_possible_cpu(j) {
|
||||
if ((j >> 2) == (i >> 2))
|
||||
cpu_set(j, cpu_sibling_map[i]);
|
||||
}
|
||||
|
|
|
@ -276,7 +276,6 @@ EXPORT_SYMBOL(__prom_getsibling);
|
|||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(__strlen_user);
|
||||
EXPORT_SYMBOL(__strnlen_user);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
|
||||
#ifdef CONFIG_SOLARIS_EMUL_MODULE
|
||||
EXPORT_SYMBOL(linux_sparc_syscall);
|
||||
|
|
|
@ -1130,9 +1130,9 @@ static void cheetah_log_errors(struct pt_regs *regs, struct cheetah_err_info *in
|
|||
(recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
|
||||
afsr, afar,
|
||||
(afsr & CHAFSR_TL1) ? 1 : 0);
|
||||
printk("%s" "ERROR(%d): TPC[%016lx] TNPC[%016lx] TSTATE[%016lx]\n",
|
||||
printk("%s" "ERROR(%d): TPC[%lx] TNPC[%lx] O7[%lx] TSTATE[%lx]\n",
|
||||
(recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
|
||||
regs->tpc, regs->tnpc, regs->tstate);
|
||||
regs->tpc, regs->tnpc, regs->u_regs[UREG_I7], regs->tstate);
|
||||
printk("%s" "ERROR(%d): M_SYND(%lx), E_SYND(%lx)%s%s\n",
|
||||
(recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
|
||||
(afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT,
|
||||
|
|
|
@ -159,6 +159,7 @@ archclean:
|
|||
$(SYMLINK_HEADERS):
|
||||
@echo ' SYMLINK $@'
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)mkdir -p $(objtree)/include/asm-um
|
||||
$(Q)ln -fsn $(srctree)/include/asm-um/$(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $@
|
||||
else
|
||||
$(Q)cd $(TOPDIR)/$(dir $@) ; \
|
||||
|
@ -168,7 +169,7 @@ endif
|
|||
include/asm-um/arch:
|
||||
@echo ' SYMLINK $@'
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)mkdir -p include/asm-um
|
||||
$(Q)mkdir -p $(objtree)/include/asm-um
|
||||
$(Q)ln -fsn $(srctree)/include/asm-$(SUBARCH) include/asm-um/arch
|
||||
else
|
||||
$(Q)cd $(TOPDIR)/include/asm-um && ln -sf ../asm-$(SUBARCH) arch
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue