Merge branch 'master'

This commit is contained in:
Steven Whitehouse 2006-04-21 12:52:36 -04:00
commit a748422ee4
1121 changed files with 22788 additions and 56322 deletions

View File

@ -3382,7 +3382,7 @@ S: Germany
N: Geert Uytterhoeven N: Geert Uytterhoeven
E: geert@linux-m68k.org 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 P: 1024/862678A6 C51D 361C 0BD1 4C90 B275 C553 6EEA 11BA 8626 78A6
D: m68k/Amiga and PPC/CHRP Longtrail coordinator D: m68k/Amiga and PPC/CHRP Longtrail coordinator
D: Frame buffer device and XF68_FBDev maintainer 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: Atari Falcon chipset IDE
D: Amiga Gayle chipset IDE D: Amiga Gayle chipset IDE
D: mipsel NEC DDB Vrc-5074 D: mipsel NEC DDB Vrc-5074
S: Emiel Vlieberghlaan 2A/21 S: Haterbeekstraat 55B
S: B-3010 Kessel-Lo S: B-3200 Aarschot
S: Belgium S: Belgium
N: Chris Vance N: Chris Vance

View File

@ -33,7 +33,9 @@ pci_alloc_consistent(struct pci_dev *dev, size_t size,
Consistent memory is memory for which a write by either the device or Consistent memory is memory for which a write by either the device or
the processor can immediately be read by the processor or device the processor can immediately be read by the processor or device
without having to worry about caching effects. without having to worry about caching effects. (You may however need
to make sure to flush the processor's write buffers before telling
devices to read that memory.)
This routine allocates a region of <size> bytes of consistent memory. This routine allocates a region of <size> bytes of consistent memory.
it also returns a <dma_handle> which may be cast to an unsigned it also returns a <dma_handle> which may be cast to an unsigned
@ -304,12 +306,12 @@ dma address with dma_mapping_error(). A non zero return value means the mapping
could not be created and the driver should take appropriate action (eg could not be created and the driver should take appropriate action (eg
reduce current DMA mapping usage or delay and try again later). reduce current DMA mapping usage or delay and try again later).
int int
dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, dma_map_sg(struct device *dev, struct scatterlist *sg,
enum dma_data_direction direction) int nents, enum dma_data_direction direction)
int int
pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
int nents, int direction) int nents, int direction)
Maps a scatter gather list from the block layer. Maps a scatter gather list from the block layer.
@ -327,12 +329,33 @@ critical that the driver do something, in the case of a block driver
aborting the request or even oopsing is better than doing nothing and aborting the request or even oopsing is better than doing nothing and
corrupting the filesystem. corrupting the filesystem.
void With scatterlists, you use the resulting mapping like this:
dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
enum dma_data_direction direction) int i, count = dma_map_sg(dev, sglist, nents, direction);
void struct scatterlist *sg;
pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
int nents, int direction) for (i = 0, sg = sglist; i < count; i++, sg++) {
hw_address[i] = sg_dma_address(sg);
hw_len[i] = sg_dma_len(sg);
}
where nents is the number of entries in the sglist.
The implementation is free to merge several consecutive sglist entries
into one (e.g. with an IOMMU, or if several pages just happen to be
physically contiguous) and returns the actual number of sg entries it
mapped them to. On failure 0, is returned.
Then you should loop count times (note: this can be less than nents times)
and use sg_dma_address() and sg_dma_len() macros where you previously
accessed sg->address and sg->length as shown above.
void
dma_unmap_sg(struct device *dev, struct scatterlist *sg,
int nhwentries, enum dma_data_direction direction)
void
pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
int nents, int direction)
unmap the previously mapped scatter/gather list. All the parameters unmap the previously mapped scatter/gather list. All the parameters
must be the same as those and passed in to the scatter/gather mapping must be the same as those and passed in to the scatter/gather mapping

View File

@ -58,11 +58,15 @@ translating each of those pages back to a kernel address using
something like __va(). [ EDIT: Update this when we integrate something like __va(). [ EDIT: Update this when we integrate
Gerd Knorr's generic code which does this. ] Gerd Knorr's generic code which does this. ]
This rule also means that you may not use kernel image addresses This rule also means that you may use neither kernel image addresses
(ie. items in the kernel's data/text/bss segment, or your driver's) (items in data/text/bss segments), nor module image addresses, nor
nor may you use kernel stack addresses for DMA. Both of these items stack addresses for DMA. These could all be mapped somewhere entirely
might be mapped somewhere entirely different than the rest of physical different than the rest of physical memory. Even if those classes of
memory. memory could physically work with DMA, you'd need to ensure the I/O
buffers were cacheline-aligned. Without that, you'd see cacheline
sharing problems (data corruption) on CPUs with DMA-incoherent caches.
(The CPU could write to one word, DMA would write to a different one
in the same cache line, and one of them could be overwritten.)
Also, this means that you cannot take the return of a kmap() Also, this means that you cannot take the return of a kmap()
call and DMA to/from that. This is similar to vmalloc(). call and DMA to/from that. This is similar to vmalloc().
@ -194,7 +198,7 @@ document for how to handle this case.
Finally, if your device can only drive the low 24-bits of Finally, if your device can only drive the low 24-bits of
address during PCI bus mastering you might do something like: 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 printk(KERN_WARNING
"mydev: 24-bit DMA addressing not available.\n"); "mydev: 24-bit DMA addressing not available.\n");
goto ignore_this_device; goto ignore_this_device;
@ -212,7 +216,7 @@ functions (for example a sound card provides playback and record
functions) and the various different functions have _different_ functions) and the various different functions have _different_
DMA addressing limitations, you may wish to probe each mask and DMA addressing limitations, you may wish to probe each mask and
only provide the functionality which the machine can handle. It 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. most specific mask.
Here is pseudo-code showing how this might be done: Here is pseudo-code showing how this might be done:
@ -284,6 +288,11 @@ There are two types of DMA mappings:
in order to get correct behavior on all platforms. in order to get correct behavior on all platforms.
Also, on some platforms your driver may need to flush CPU write
buffers in much the same way as it needs to flush write buffers
found in PCI bridges (such as by reading a register's value
after writing it).
- Streaming DMA mappings which are usually mapped for one DMA transfer, - Streaming DMA mappings which are usually mapped for one DMA transfer,
unmapped right after it (unless you use pci_dma_sync_* below) and for which unmapped right after it (unless you use pci_dma_sync_* below) and for which
hardware can optimize for sequential accesses. hardware can optimize for sequential accesses.
@ -303,6 +312,9 @@ There are two types of DMA mappings:
Neither type of DMA mapping has alignment restrictions that come Neither type of DMA mapping has alignment restrictions that come
from PCI, although some devices may have such restrictions. from PCI, although some devices may have such restrictions.
Also, systems with caches that aren't DMA-coherent will work better
when the underlying buffers don't share cache lines with other data.
Using Consistent DMA mappings. Using Consistent DMA mappings.

View File

@ -705,7 +705,7 @@ and other resources, etc.
<sect1><title>ata_scsi_error()</title> <sect1><title>ata_scsi_error()</title>
<para> <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 for libata. As discussed above, this will be entered in two
cases - timeout and ATAPI error completion. This function cases - timeout and ATAPI error completion. This function
calls low level libata driver's eng_timeout() callback, the calls low level libata driver's eng_timeout() callback, the

View File

@ -0,0 +1,22 @@
As of the Linux 2.6.10 kernel, it is now possible to change the
IO scheduler for a given block device on the fly (thus making it possible,
for instance, to set the CFQ scheduler for the system default, but
set a specific device to use the anticipatory or noop schedulers - which
can improve that device's throughput).
To set a specific scheduler, simply do this:
echo SCHEDNAME > /sys/block/DEV/queue/scheduler
where SCHEDNAME is the name of a defined IO scheduler, and DEV is the
device name (hda, hdb, sga, or whatever you happen to have).
The list of defined schedulers can be found by simply doing
a "cat /sys/block/DEV/queue/scheduler" - the list of valid names
will be displayed, with the currently selected scheduler in brackets:
# cat /sys/block/hda/queue/scheduler
noop anticipatory deadline [cfq]
# echo anticipatory > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [anticipatory] deadline cfq

View File

@ -53,4 +53,4 @@ the CPUFreq Mailing list:
* http://lists.linux.org.uk/mailman/listinfo/cpufreq * http://lists.linux.org.uk/mailman/listinfo/cpufreq
Clock and voltage scaling for the SA-1100: Clock and voltage scaling for the SA-1100:
* http://www.lart.tudelft.nl/projects/scaling * http://www.lartmaker.nl/projects/scaling

View File

@ -25,8 +25,9 @@ Who: Adrian Bunk <bunk@stusta.de>
--------------------------- ---------------------------
What: drivers depending on OBSOLETE_OSS_DRIVER What: drivers that were depending on OBSOLETE_OSS_DRIVER
When: January 2006 (config options already removed)
When: before 2.6.19
Why: OSS drivers with ALSA replacements Why: OSS drivers with ALSA replacements
Who: Adrian Bunk <bunk@stusta.de> Who: Adrian Bunk <bunk@stusta.de>
@ -71,14 +72,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) What: remove EXPORT_SYMBOL(insert_resource)
When: April 2006 When: April 2006
Files: kernel/resource.c Files: kernel/resource.c

View File

@ -694,7 +694,7 @@ struct file_operations
---------------------- ----------------------
This describes how the VFS can manipulate an open file. As of kernel 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 { struct file_operations {
loff_t (*llseek) (struct file *, loff_t, int); loff_t (*llseek) (struct file *, loff_t, int);
@ -723,6 +723,10 @@ struct file_operations {
int (*check_flags)(int); int (*check_flags)(int);
int (*dir_notify)(struct file *filp, unsigned long arg); int (*dir_notify)(struct file *filp, unsigned long arg);
int (*flock) (struct file *, int, struct file_lock *); 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 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 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 Note that the file operations are implemented by the specific
filesystem in which the inode resides. When opening a device node filesystem in which the inode resides. When opening a device node
(character or block special) most filesystems will call special (character or block special) most filesystems will call special

View File

@ -12,18 +12,22 @@ meant as a replacement for the older, individual drivers:
teletext adapters) teletext adapters)
It currently supports the following devices: It currently supports the following devices:
* Philips adapter * (type=0) Philips adapter
* home brew teletext adapter * (type=1) home brew teletext adapter
* Velleman K8000 adapter * (type=2) Velleman K8000 adapter
* ELV adapter * (type=3) ELV adapter
* Analog Devices evaluation boards (ADM1025, ADM1030, ADM1031, ADM1032) * (type=4) Analog Devices ADM1032 evaluation board
* Barco LPT->DVI (K5800236) adapter * (type=5) Analog Devices evaluation boards: ADM1025, ADM1030, ADM1031
* (type=6) Barco LPT->DVI (K5800236) adapter
These devices use different pinout configurations, so you have to tell These devices use different pinout configurations, so you have to tell
the driver what you have, using the type module parameter. There is no the driver what you have, using the type module parameter. There is no
way to autodetect the devices. Support for different pinout configurations way to autodetect the devices. Support for different pinout configurations
can be easily added when needed. can be easily added when needed.
Earlier kernels defaulted to type=0 (Philips). But now, if the type
parameter is missing, the driver will simply fail to initialize.
Building your own adapter Building your own adapter
------------------------- -------------------------

View File

@ -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.

View File

@ -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 of modules. The author of an external modules should supply
a makefile that hides most of the complexity so one only has to type 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 '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 === 2. How to build external modules

View File

@ -919,11 +919,11 @@ int main(int argc, char **argv)
int settle_time = 60; int settle_time = 60;
/* Parse the simple command-line */ /* Parse the simple command-line */
if (ac == 2) if (argc == 2)
disk = av[1]; disk = argv[1];
else if (ac == 4) { else if (argc == 4) {
settle_time = atoi(av[2]); settle_time = atoi(argv[2]);
disk = av[3]; disk = argv[3];
} else } else
usage(); usage();

View File

@ -610,6 +610,7 @@ loads. Consider the following sequence of events:
CPU 1 CPU 2 CPU 1 CPU 2
======================= ======================= ======================= =======================
{ B = 7; X = 9; Y = 8; C = &Y }
STORE A = 1 STORE A = 1
STORE B = 2 STORE B = 2
<write barrier> <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. (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 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(); (*) smp_mb__after_atomic_inc();
These are for use with atomic add, subtract, increment and decrement These are for use with atomic add, subtract, increment and decrement
functions, especially when used for reference counting. These functions functions that don't return a value, especially when used for reference
do not imply memory barriers. counting. These functions do not imply memory barriers.
As an example, consider a piece of code that marks an object as being dead As an example, consider a piece of code that marks an object as being dead
and then decrements the object's reference count: and then decrements the object's reference count:
@ -1263,15 +1277,17 @@ else.
ATOMIC OPERATIONS ATOMIC OPERATIONS
----------------- -----------------
Though they are technically interprocessor interaction considerations, atomic Whilst they are technically interprocessor interaction considerations, atomic
operations are noted specially as they do _not_ generally imply memory operations are noted specially as some of them imply full memory barriers and
barriers. The possible offenders include: 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(); xchg();
cmpxchg(); cmpxchg();
test_and_set_bit();
test_and_clear_bit();
test_and_change_bit();
atomic_cmpxchg(); atomic_cmpxchg();
atomic_inc_return(); atomic_inc_return();
atomic_dec_return(); atomic_dec_return();
@ -1282,21 +1298,31 @@ barriers. The possible offenders include:
atomic_sub_and_test(); atomic_sub_and_test();
atomic_add_negative(); atomic_add_negative();
atomic_add_unless(); 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 These are used for such things as implementing LOCK-class and UNLOCK-class
the lifetime of objects by decreasing their reference counts. In such cases operations and adjusting reference counters towards object destruction, and as
they need preceding memory barriers. 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(); set_bit();
clear_bit(); clear_bit();
change_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_add();
atomic_sub(); atomic_sub();
@ -1317,10 +1343,12 @@ specific order.
Basically, each usage case has to be carefully considered as to whether memory 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 barriers are needed or not.
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 [!] Note that special memory barrier primitives are available for these
ordering must be maintained. 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. See Documentation/atomic_ops.txt for more information.

View File

@ -138,19 +138,29 @@ Reading MTRRs from a C program using ioctl()'s:
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <errno.h> #include <errno.h>
#define MTRR_NEED_STRINGS
#include <asm/mtrr.h> #include <asm/mtrr.h>
#define TRUE 1 #define TRUE 1
#define FALSE 0 #define FALSE 0
#define ERRSTRING strerror (errno) #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 main ()
{ {
@ -232,13 +242,22 @@ Creating MTRRs from a C programme using ioctl()'s:
#include <fcntl.h> #include <fcntl.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <errno.h> #include <errno.h>
#define MTRR_NEED_STRINGS
#include <asm/mtrr.h> #include <asm/mtrr.h>
#define TRUE 1 #define TRUE 1
#define FALSE 0 #define FALSE 0
#define ERRSTRING strerror (errno) #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) int main (int argc, char **argv)
{ {

View File

@ -0,0 +1,166 @@
The sync patches work is based on initial patches from
Krisztian <hidden@balabit.hu> and others and additional patches
from Jamal <hadi@cyberus.ca>.
The end goal for syncing is to be able to insert attributes + generate
events so that the an SA can be safely moved from one machine to another
for HA purposes.
The idea is to synchronize the SA so that the takeover machine can do
the processing of the SA as accurate as possible if it has access to it.
We already have the ability to generate SA add/del/upd events.
These patches add ability to sync and have accurate lifetime byte (to
ensure proper decay of SAs) and replay counters to avoid replay attacks
with as minimal loss at failover time.
This way a backup stays as closely uptodate as an active member.
Because the above items change for every packet the SA receives,
it is possible for a lot of the events to be generated.
For this reason, we also add a nagle-like algorithm to restrict
the events. i.e we are going to set thresholds to say "let me
know if the replay sequence threshold is reached or 10 secs have passed"
These thresholds are set system-wide via sysctls or can be updated
per SA.
The identified items that need to be synchronized are:
- the lifetime byte counter
note that: lifetime time limit is not important if you assume the failover
machine is known ahead of time since the decay of the time countdown
is not driven by packet arrival.
- the replay sequence for both inbound and outbound
1) Message Structure
----------------------
nlmsghdr:aevent_id:optional-TLVs.
The netlink message types are:
XFRM_MSG_NEWAE and XFRM_MSG_GETAE.
A XFRM_MSG_GETAE does not have TLVs.
A XFRM_MSG_NEWAE will have at least two TLVs (as is
discussed further below).
aevent_id structure looks like:
struct xfrm_aevent_id {
struct xfrm_usersa_id sa_id;
__u32 flags;
};
xfrm_usersa_id in this message layout identifies the SA.
flags are used to indicate different things. The possible
flags are:
XFRM_AE_RTHR=1, /* replay threshold*/
XFRM_AE_RVAL=2, /* replay value */
XFRM_AE_LVAL=4, /* lifetime value */
XFRM_AE_ETHR=8, /* expiry timer threshold */
XFRM_AE_CR=16, /* Event cause is replay update */
XFRM_AE_CE=32, /* Event cause is timer expiry */
XFRM_AE_CU=64, /* Event cause is policy update */
How these flags are used is dependent on the direction of the
message (kernel<->user) as well the cause (config, query or event).
This is described below in the different messages.
The pid will be set appropriately in netlink to recognize direction
(0 to the kernel and pid = processid that created the event
when going from kernel to user space)
A program needs to subscribe to multicast group XFRMNLGRP_AEVENTS
to get notified of these events.
2) TLVS reflect the different parameters:
-----------------------------------------
a) byte value (XFRMA_LTIME_VAL)
This TLV carries the running/current counter for byte lifetime since
last event.
b)replay value (XFRMA_REPLAY_VAL)
This TLV carries the running/current counter for replay sequence since
last event.
c)replay threshold (XFRMA_REPLAY_THRESH)
This TLV carries the threshold being used by the kernel to trigger events
when the replay sequence is exceeded.
d) expiry timer (XFRMA_ETIMER_THRESH)
This is a timer value in milliseconds which is used as the nagle
value to rate limit the events.
3) Default configurations for the parameters:
----------------------------------------------
By default these events should be turned off unless there is
at least one listener registered to listen to the multicast
group XFRMNLGRP_AEVENTS.
Programs installing SAs will need to specify the two thresholds, however,
in order to not change existing applications such as racoon
we also provide default threshold values for these different parameters
in case they are not specified.
the two sysctls/proc entries are:
a) /proc/sys/net/core/sysctl_xfrm_aevent_etime
used to provide default values for the XFRMA_ETIMER_THRESH in incremental
units of time of 100ms. The default is 10 (1 second)
b) /proc/sys/net/core/sysctl_xfrm_aevent_rseqth
used to provide default values for XFRMA_REPLAY_THRESH parameter
in incremental packet count. The default is two packets.
4) Message types
----------------
a) XFRM_MSG_GETAE issued by user-->kernel.
XFRM_MSG_GETAE does not carry any TLVs.
The response is a XFRM_MSG_NEWAE which is formatted based on what
XFRM_MSG_GETAE queried for.
The response will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs.
*if XFRM_AE_RTHR flag is set, then XFRMA_REPLAY_THRESH is also retrieved
*if XFRM_AE_ETHR flag is set, then XFRMA_ETIMER_THRESH is also retrieved
b) XFRM_MSG_NEWAE is issued by either user space to configure
or kernel to announce events or respond to a XFRM_MSG_GETAE.
i) user --> kernel to configure a specific SA.
any of the values or threshold parameters can be updated by passing the
appropriate TLV.
A response is issued back to the sender in user space to indicate success
or failure.
In the case of success, additionally an event with
XFRM_MSG_NEWAE is also issued to any listeners as described in iii).
ii) kernel->user direction as a response to XFRM_MSG_GETAE
The response will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs.
The threshold TLVs will be included if explicitly requested in
the XFRM_MSG_GETAE message.
iii) kernel->user to report as event if someone sets any values or
thresholds for an SA using XFRM_MSG_NEWAE (as described in #i above).
In such a case XFRM_AE_CU flag is set to inform the user that
the change happened as a result of an update.
The message will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs.
iv) kernel->user to report event when replay threshold or a timeout
is exceeded.
In such a case either XFRM_AE_CR (replay exceeded) or XFRM_AE_CE (timeout
happened) is set to inform the user what happened.
Note the two flags are mutually exclusive.
The message will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs.
Exceptions to threshold settings
--------------------------------
If you have an SA that is getting hit by traffic in bursts such that
there is a period where the timer threshold expires with no packets
seen, then an odd behavior is seen as follows:
The first packet arrival after a timer expiry will trigger a timeout
aevent; i.e we dont wait for a timeout period or a packet threshold
to be reached. This is done for simplicity and efficiency reasons.
-JHS

View File

@ -19,9 +19,9 @@ TABLE OF CONTENTS
[2-1-1] Overview [2-1-1] Overview
[2-1-2] Flow of scmds through EH [2-1-2] Flow of scmds through EH
[2-1-3] Flow of control [2-1-3] Flow of control
[2-2] EH through hostt->eh_strategy_handler() [2-2] EH through transportt->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
[2-2-2] Post hostt->eh_strategy_handler() SCSI midlayer conditions [2-2-2] Post transportt->eh_strategy_handler() SCSI midlayer conditions
[2-2-3] Things to consider [2-2-3] Things to consider
@ -413,9 +413,9 @@ scmd->allowed.
layer of failure of the scmds. 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. scsi_unjam_host() and it is responsible for whole recovery process.
On completion, the handler should have made lower layers forget about On completion, the handler should have made lower layers forget about
all failed scmds and either ready for new commands or offline. Also, 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(). 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. 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 - 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. The following conditions must be true on exit from the handler.

View File

@ -804,7 +804,6 @@ Summary:
eh_bus_reset_handler - issue SCSI bus reset eh_bus_reset_handler - issue SCSI bus reset
eh_device_reset_handler - issue SCSI device reset eh_device_reset_handler - issue SCSI device reset
eh_host_reset_handler - reset host (host bus adapter) 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 info - supply information about given host
ioctl - driver can respond to ioctls ioctl - driver can respond to ioctls
proc_info - supports /proc/scsi/{driver_name}/{host_no} proc_info - supports /proc/scsi/{driver_name}/{host_no}
@ -969,24 +968,6 @@ Details:
int eh_host_reset_handler(struct scsi_cmnd * scp) 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 * info - supply information about given host: driver name plus data
* to distinguish given host * to distinguish given host

View File

@ -3,14 +3,11 @@
-------------------- --------------------
$Id: driver,v 1.10 2002/07/22 15:27:30 rmk Exp $
This document is meant as a brief overview of some aspects of the new serial This document is meant as a brief overview of some aspects of the new serial
driver. It is not complete, any questions you have should be directed to driver. It is not complete, any questions you have should be directed to
<rmk@arm.linux.org.uk> <rmk@arm.linux.org.uk>
The reference implementation is contained within serial_amba.c. The reference implementation is contained within amba_pl011.c.
@ -31,6 +28,11 @@ The serial core provides a few helper functions. This includes identifing
the correct port structure (via uart_get_console) and decoding command line the correct port structure (via uart_get_console) and decoding command line
arguments (uart_parse_options). arguments (uart_parse_options).
There is also a helper function (uart_write_console) which performs a
character by character write, translating newlines to CRLF sequences.
Driver writers are recommended to use this function rather than implementing
their own version.
Locking Locking
------- -------
@ -86,6 +88,7 @@ hardware.
- TIOCM_DTR DTR signal. - TIOCM_DTR DTR signal.
- TIOCM_OUT1 OUT1 signal. - TIOCM_OUT1 OUT1 signal.
- TIOCM_OUT2 OUT2 signal. - TIOCM_OUT2 OUT2 signal.
- TIOCM_LOOP Set the port into loopback mode.
If the appropriate bit is set, the signal should be driven If the appropriate bit is set, the signal should be driven
active. If the bit is clear, the signal should be driven active. If the bit is clear, the signal should be driven
inactive. inactive.
@ -141,6 +144,10 @@ hardware.
enable_ms(port) enable_ms(port)
Enable the modem status interrupts. Enable the modem status interrupts.
This method may be called multiple times. Modem status
interrupts should be disabled when the shutdown method is
called.
Locking: port->lock taken. Locking: port->lock taken.
Interrupts: locally disabled. Interrupts: locally disabled.
This call must not sleep This call must not sleep
@ -160,6 +167,8 @@ hardware.
state. Enable the port for reception. It should not activate state. Enable the port for reception. It should not activate
RTS nor DTR; this will be done via a separate call to set_mctrl. RTS nor DTR; this will be done via a separate call to set_mctrl.
This method will only be called when the port is initially opened.
Locking: port_sem taken. Locking: port_sem taken.
Interrupts: globally disabled. Interrupts: globally disabled.
@ -169,6 +178,11 @@ hardware.
RTS nor DTR; this will have already been done via a separate RTS nor DTR; this will have already been done via a separate
call to set_mctrl. call to set_mctrl.
Drivers must not access port->info once this call has completed.
This method will only be called when there are no more users of
this port.
Locking: port_sem taken. Locking: port_sem taken.
Interrupts: caller dependent. Interrupts: caller dependent.

View File

@ -1123,8 +1123,8 @@
if ((err = pci_enable_device(pci)) < 0) if ((err = pci_enable_device(pci)) < 0)
return err; return err;
/* check PCI availability (28bit DMA) */ /* check PCI availability (28bit DMA) */
if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
printk(KERN_ERR "error to set 28bit mask DMA\n"); printk(KERN_ERR "error to set 28bit mask DMA\n");
pci_disable_device(pci); pci_disable_device(pci);
return -ENXIO; return -ENXIO;
@ -1216,7 +1216,7 @@
The allocation of PCI resources is done in the The allocation of PCI resources is done in the
<function>probe()</function> function, and usually an extra <function>probe()</function> function, and usually an extra
<function>xxx_create()</function> function is written for this <function>xxx_create()</function> function is written for this
purpose. purpose.
</para> </para>
<para> <para>
@ -1225,7 +1225,7 @@
allocating resources. Also, you need to set the proper PCI DMA allocating resources. Also, you need to set the proper PCI DMA
mask to limit the accessed i/o range. In some cases, you might mask to limit the accessed i/o range. In some cases, you might
need to call <function>pci_set_master()</function> function, need to call <function>pci_set_master()</function> function,
too. too.
</para> </para>
<para> <para>
@ -1236,8 +1236,8 @@
<![CDATA[ <![CDATA[
if ((err = pci_enable_device(pci)) < 0) if ((err = pci_enable_device(pci)) < 0)
return err; return err;
if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
printk(KERN_ERR "error to set 28bit mask DMA\n"); printk(KERN_ERR "error to set 28bit mask DMA\n");
pci_disable_device(pci); pci_disable_device(pci);
return -ENXIO; return -ENXIO;
@ -1256,13 +1256,13 @@
functions. Unlike ALSA ver.0.5.x., there are no helpers for functions. Unlike ALSA ver.0.5.x., there are no helpers for
that. And these resources must be released in the destructor that. And these resources must be released in the destructor
function (see below). Also, on ALSA 0.9.x, you don't need to 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>
<para> <para>
Now assume that this PCI device has an I/O port with 8 bytes 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 and an interrupt. Then struct <structname>mychip</structname> will have the
following fields: following fields:
<informalexample> <informalexample>
<programlisting> <programlisting>

View File

@ -27,12 +27,21 @@ number of free hugetlb pages at any time. It also displays information about
the configured hugepage size - this is needed for generating the proper the configured hugepage size - this is needed for generating the proper
alignment and size of the arguments to the above system calls. 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 HugePages_Total: xxx
HugePages_Free: yyy HugePages_Free: yyy
Hugepagesize: zzz KB HugePages_Rsvd: www
Hugepagesize: zzz kB
where:
HugePages_Total is the size of the pool of hugepages.
HugePages_Free is the number of hugepages in the pool that are not yet
allocated.
HugePages_Rsvd is short for "reserved," and is the number of hugepages
for which a commitment to allocate from the pool has been made, but no
allocation has yet been made. It's vaguely analogous to overcommit.
/proc/filesystems should also show a filesystem of type "hugetlbfs" configured /proc/filesystems should also show a filesystem of type "hugetlbfs" configured
in the kernel. in the kernel.
@ -42,11 +51,11 @@ pages in the kernel. Super user can dynamically request more (or free some
pre-configured) hugepages. pre-configured) hugepages.
The allocation (or deallocation) of hugetlb pages is possible only if there are The allocation (or deallocation) of hugetlb pages is possible only if there are
enough physically contiguous free pages in system (freeing of hugepages is 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). back to regular memory pool).
Pages that are used as hugetlb pages are reserved inside the kernel and can Pages that are used as hugetlb pages are reserved inside the kernel and cannot
not be used for other purposes. be used for other purposes.
Once the kernel with Hugetlb page support is built and running, a user can 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 use either the mmap system call or shared memory system calls to start using
@ -60,7 +69,7 @@ Use the following command to dynamically allocate/deallocate hugepages:
This command will try to configure 20 hugepages in the system. The success This command will try to configure 20 hugepages in the system. The success
or failure of allocation depends on the amount of physically contiguous or failure of allocation depends on the amount of physically contiguous
memory that is preset in system at this time. System administrators may want 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 kernel to request huge pages early in the boot process (when the possibility
of getting physical contiguous pages is still very high). of getting physical contiguous pages is still very high).
@ -78,8 +87,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. 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 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 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 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_inode options are not 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 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 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 example, size=2K has the same meaning as size=2048. An example is given at
@ -88,7 +97,7 @@ the end of this document.
read and write system calls are not supported on files that reside on hugetlb read and write system calls are not supported on files that reside on hugetlb
file systems. 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. used to change the file attributes on hugetlbfs.
Also, it is important to note that no such mount command is required if the Also, it is important to note that no such mount command is required if the
@ -96,8 +105,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 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 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 /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 applications to use any combination of mmaps and shm* calls, though the
mount of filesystem will be required for using mmaps. mount of filesystem will be required for using mmap calls.
******************************************************************* *******************************************************************

View File

@ -151,6 +151,11 @@ NUMA
numa=fake=X Fake X nodes and ignore NUMA setup of the actual machine. 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
acpi=off Don't enable ACPI acpi=off Don't enable ACPI

2
Kbuild
View File

@ -18,7 +18,7 @@ define sed-y
"/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}" "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"
endef endef
# Override default regexp for specific architectures # Override default regexp for specific architectures
sed-$(CONFIG_MIPS) := "/^@@@/s///p" sed-$(CONFIG_MIPS) := "/^@@@/{s/^@@@//; s/ \#.*\$$//; p;}"
quiet_cmd_offsets = GEN $@ quiet_cmd_offsets = GEN $@
define cmd_offsets define cmd_offsets

View File

@ -411,6 +411,7 @@ AX.25 NETWORK LAYER
P: Ralf Baechle P: Ralf Baechle
M: ralf@linux-mips.org M: ralf@linux-mips.org
L: linux-hams@vger.kernel.org L: linux-hams@vger.kernel.org
W: http://www.linux-ax25.org/
S: Maintained S: Maintained
BAYCOM/HDLCDRV DRIVERS FOR AX.25 BAYCOM/HDLCDRV DRIVERS FOR AX.25
@ -1457,6 +1458,13 @@ M: support@pathscale.com
L: openib-general@openib.org L: openib-general@openib.org
S: Supported S: Supported
IPMI SUBSYSTEM
P: Corey Minyard
M: minyard@acm.org
L: openipmi-developer@lists.sourceforge.net
W: http://openipmi.sourceforge.net/
S: Supported
IPX NETWORK LAYER IPX NETWORK LAYER
P: Arnaldo Carvalho de Melo P: Arnaldo Carvalho de Melo
M: acme@conectiva.com.br M: acme@conectiva.com.br
@ -1556,9 +1564,7 @@ S: Maintained
KEXEC KEXEC
P: Eric Biederman P: Eric Biederman
P: Randy Dunlap
M: ebiederm@xmission.com M: ebiederm@xmission.com
M: rdunlap@xenotime.net
W: http://www.xmission.com/~ebiederm/files/kexec/ W: http://www.xmission.com/~ebiederm/files/kexec/
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
L: fastboot@osdl.org L: fastboot@osdl.org
@ -1871,6 +1877,7 @@ NETROM NETWORK LAYER
P: Ralf Baechle P: Ralf Baechle
M: ralf@linux-mips.org M: ralf@linux-mips.org
L: linux-hams@vger.kernel.org L: linux-hams@vger.kernel.org
W: http://www.linux-ax25.org/
S: Maintained S: Maintained
NETWORK BLOCK DEVICE NETWORK BLOCK DEVICE
@ -2262,6 +2269,7 @@ ROSE NETWORK LAYER
P: Ralf Baechle P: Ralf Baechle
M: ralf@linux-mips.org M: ralf@linux-mips.org
L: linux-hams@vger.kernel.org L: linux-hams@vger.kernel.org
W: http://www.linux-ax25.org/
S: Maintained S: Maintained
RISCOM8 DRIVER RISCOM8 DRIVER
@ -3060,13 +3068,6 @@ M: khali@linux-fr.org
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
S: Odd Fixes S: Odd Fixes
WAN ROUTER & SANGOMA WANPIPE DRIVERS & API (X.25, FRAME RELAY, PPP, CISCO HDLC)
P: Nenad Corbic
M: ncorbic@sangoma.com
M: dm@sangoma.com
W: http://www.sangoma.com
S: Supported
WATCHDOG DEVICE DRIVERS WATCHDOG DEVICE DRIVERS
P: Wim Van Sebroeck P: Wim Van Sebroeck
M: wim@iguana.be M: wim@iguana.be

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 17 SUBLEVEL = 17
EXTRAVERSION =-rc1 EXTRAVERSION =-rc2
NAME=Sliding Snow Leopard NAME=Sliding Snow Leopard
# *DOCUMENTATION* # *DOCUMENTATION*
@ -1112,7 +1112,6 @@ modules_install: _emodinst_ _emodinst_post
install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra) install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
PHONY += _emodinst_ PHONY += _emodinst_
_emodinst_: _emodinst_:
$(Q)rm -rf $(MODLIB)/$(install-dir)
$(Q)mkdir -p $(MODLIB)/$(install-dir) $(Q)mkdir -p $(MODLIB)/$(install-dir)
$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst
@ -1275,40 +1274,43 @@ kernelversion:
# Single targets # Single targets
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# The directory part is taken from first prerequisite, so this # Single targets are compatible with:
# works even with external modules # - build whith mixed source and output
%.s: %.c prepare scripts FORCE # - build with separate output dir 'make O=...'
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) # - external modules
%.i: %.c prepare scripts FORCE #
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) # target-dir => where to store outputfile
%.o: %.c prepare scripts FORCE # build-dir => directory in kernel source tree to use
$(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 $@)
# 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),) ifeq ($(KBUILD_EXTMOD),)
target-dir = $(@D) build-dir = $(patsubst %/,%,$(dir $@))
target-dir = $(dir $@)
else else
zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@))) 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 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) \ $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(target-dir) $(build)=$(build-dir)
%.ko: scripts FORCE %.ko: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ $(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 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
# FIXME Should go into a make.lib or something # FIXME Should go into a make.lib or something

23
README
View File

@ -165,10 +165,31 @@ CONFIGURING the kernel:
"make xconfig" X windows (Qt) based configuration tool. "make xconfig" X windows (Qt) based configuration tool.
"make gconfig" X windows (Gtk) based configuration tool. "make gconfig" X windows (Gtk) based configuration tool.
"make oldconfig" Default all questions based on the contents of "make oldconfig" Default all questions based on the contents of
your existing ./.config file. your existing ./.config file and asking about
new config symbols.
"make silentoldconfig" "make silentoldconfig"
Like above, but avoids cluttering the screen Like above, but avoids cluttering the screen
with questions already answered. with questions already answered.
"make defconfig" Create a ./.config file by using the default
symbol values from arch/$ARCH/defconfig.
"make allyesconfig"
Create a ./.config file by setting symbol
values to 'y' as much as possible.
"make allmodconfig"
Create a ./.config file by setting symbol
values to 'm' as much as possible.
"make allnoconfig" Create a ./.config file by setting symbol
values to 'n' as much as possible.
"make randconfig" Create a ./.config file by setting symbol
values to random values.
The allyesconfig/allmodconfig/allnoconfig/randconfig variants can
also use the environment variable KCONFIG_ALLCONFIG to specify a
filename that contains config options that the user requires to be
set to a specific value. If KCONFIG_ALLCONFIG=filename is not used,
"make *config" checks for a file named "all{yes/mod/no/random}.config"
for symbol values that are to be forced. If this file is not found,
it checks for a file named "all.config" to contain forced values.
NOTES on "make config": NOTES on "make config":
- having unnecessary drivers will make the kernel bigger, and can - having unnecessary drivers will make the kernel bigger, and can

View File

@ -549,6 +549,11 @@ config NUMA
Access). This option is for configuring high-end multiprocessor Access). This option is for configuring high-end multiprocessor
server machines. If in doubt, say N. 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 # LARGE_VMALLOC is racy, if you *really* need it then fix it first
config ALPHA_LARGE_VMALLOC config ALPHA_LARGE_VMALLOC
bool bool

View File

@ -76,7 +76,6 @@ EXPORT_SYMBOL(strncpy);
EXPORT_SYMBOL(strnlen); EXPORT_SYMBOL(strnlen);
EXPORT_SYMBOL(strncat); EXPORT_SYMBOL(strncat);
EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);
EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(memcmp); EXPORT_SYMBOL(memcmp);

View File

@ -24,6 +24,7 @@
#include <linux/config.h> /* CONFIG_ALPHA_LCA etc */ #include <linux/config.h> /* CONFIG_ALPHA_LCA etc */
#include <linux/mc146818rtc.h> #include <linux/mc146818rtc.h>
#include <linux/console.h> #include <linux/console.h>
#include <linux/cpu.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/string.h> #include <linux/string.h>
@ -471,6 +472,22 @@ page_is_ram(unsigned long pfn)
return 0; 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 void __init
setup_arch(char **cmdline_p) setup_arch(char **cmdline_p)
{ {

View File

@ -439,7 +439,7 @@ setup_smp(void)
if ((cpu->flags & 0x1cc) == 0x1cc) { if ((cpu->flags & 0x1cc) == 0x1cc) {
smp_num_probed++; smp_num_probed++;
/* Assume here that "whami" == index */ /* Assume here that "whami" == index */
cpu_set(i, cpu_possible_map); cpu_set(i, cpu_present_mask);
cpu->pal_revision = boot_cpu_palrev; cpu->pal_revision = boot_cpu_palrev;
} }
@ -450,9 +450,8 @@ setup_smp(void)
} }
} else { } else {
smp_num_probed = 1; 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", printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
smp_num_probed, cpu_possible_map.bits[0]); smp_num_probed, cpu_possible_map.bits[0]);
@ -488,9 +487,8 @@ void __devinit
smp_prepare_boot_cpu(void) 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); cpu_set(smp_processor_id(), cpu_online_map);
} }

View File

@ -512,6 +512,12 @@ config ARCH_DISCONTIGMEM_ENABLE
or have huge holes in the physical address space for other reasons. or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more. 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" source "mm/Kconfig"
config LEDS config LEDS

View File

@ -18,6 +18,7 @@ SECTIONS
_start = .; _start = .;
*(.start) *(.start)
*(.text) *(.text)
*(.text.*)
*(.fixup) *(.fixup)
*(.gnu.warning) *(.gnu.warning)
*(.rodata) *(.rodata)

View File

@ -18,6 +18,18 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/hardware/scoop.h> #include <asm/hardware/scoop.h>
/* PCMCIA to Scoop linkage
There is no easy way to link multiple scoop devices into one
single entity for the pxa2xx_pcmcia device so this structure
is used which is setup by the platform code.
This file is never modular so this symbol is always
accessile to the board support files.
*/
struct scoop_pcmcia_config *platform_scoop_config;
EXPORT_SYMBOL(platform_scoop_config);
#define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr))) #define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr)))
struct scoop_dev { struct scoop_dev {

View File

@ -1,12 +1,14 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.16 # Linux kernel version: 2.6.17-rc2
# Mon Mar 20 14:54:51 2006 # Wed Apr 19 21:21:01 2006
# #
CONFIG_ARM=y CONFIG_ARM=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_VECTORS_BASE=0xffff0000
# #
# Code maturity level options # Code maturity level options
@ -28,6 +30,7 @@ CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
# CONFIG_RELAY is not set
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
@ -43,10 +46,6 @@ CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_SHMEM=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_SLAB=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
@ -59,7 +58,6 @@ CONFIG_OBSOLETE_INTERMODULE=y
CONFIG_MODULES=y CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y CONFIG_KMOD=y
@ -67,6 +65,7 @@ CONFIG_KMOD=y
# #
# Block layer # Block layer
# #
# CONFIG_BLK_DEV_IO_TRACE is not set
# #
# IO Schedulers # IO Schedulers
@ -94,6 +93,7 @@ CONFIG_ARCH_EP93XX=y
# CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IOP3XX is not set
# CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP4XX is not set
# CONFIG_ARCH_IXP2000 is not set # CONFIG_ARCH_IXP2000 is not set
# CONFIG_ARCH_IXP23XX is not set
# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_PXA is not set # CONFIG_ARCH_PXA is not set
# CONFIG_ARCH_RPC is not set # CONFIG_ARCH_RPC is not set
@ -112,7 +112,6 @@ CONFIG_ARCH_EP93XX=y
# #
# Cirrus EP93xx Implementation Options # Cirrus EP93xx Implementation Options
# #
CONFIG_CRUNCH=y
# #
# EP93xx Platforms # EP93xx Platforms
@ -232,12 +231,15 @@ CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set # CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set # CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set # CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not set
# CONFIG_INET_TUNNEL is not set # CONFIG_INET_TUNNEL is not set
CONFIG_INET_DIAG=y CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set # CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y CONFIG_TCP_CONG_BIC=y
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_INET6_XFRM_TUNNEL is not set
# CONFIG_INET6_TUNNEL is not set
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
# #
@ -346,7 +348,6 @@ CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_OTP is not set # CONFIG_MTD_OTP is not set
CONFIG_MTD_CFI_INTELEXT=y CONFIG_MTD_CFI_INTELEXT=y
CONFIG_MTD_CFI_AMDSTD=y CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_CFI_AMDSTD_RETRY=0
CONFIG_MTD_CFI_STAA=y CONFIG_MTD_CFI_STAA=y
CONFIG_MTD_CFI_UTIL=y CONFIG_MTD_CFI_UTIL=y
# CONFIG_MTD_RAM is not set # CONFIG_MTD_RAM is not set
@ -371,7 +372,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1
# CONFIG_MTD_SLRAM is not set # CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set # CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
# CONFIG_MTD_BLOCK2MTD is not set # CONFIG_MTD_BLOCK2MTD is not set
# #
@ -412,7 +412,7 @@ CONFIG_MTD_NAND_IDS=y
# CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_UB is not set # CONFIG_BLK_DEV_UB is not set
# CONFIG_BLK_DEV_RAM is not set # CONFIG_BLK_DEV_RAM is not set
CONFIG_BLK_DEV_RAM_COUNT=16 # CONFIG_BLK_DEV_INITRD is not set
# CONFIG_CDROM_PKTCDVD is not set # CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set # CONFIG_ATA_OVER_ETH is not set
@ -576,13 +576,13 @@ CONFIG_WATCHDOG=y
# Watchdog Device Drivers # Watchdog Device Drivers
# #
# CONFIG_SOFT_WATCHDOG is not set # CONFIG_SOFT_WATCHDOG is not set
CONFIG_EP93XX_WATCHDOG=y
# #
# USB-based Watchdog Cards # USB-based Watchdog Cards
# #
# CONFIG_USBPCWATCHDOG is not set # CONFIG_USBPCWATCHDOG is not set
# CONFIG_NVRAM is not set # CONFIG_NVRAM is not set
# CONFIG_RTC is not set
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
@ -626,9 +626,7 @@ CONFIG_I2C_ALGOBIT=y
# CONFIG_SENSORS_PCF8574 is not set # CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCA9539 is not set # CONFIG_SENSORS_PCA9539 is not set
# CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set
# CONFIG_SENSORS_MAX6875 is not set # CONFIG_SENSORS_MAX6875 is not set
# CONFIG_RTC_X1205_I2C is not set
CONFIG_I2C_DEBUG_CORE=y CONFIG_I2C_DEBUG_CORE=y
CONFIG_I2C_DEBUG_ALGO=y CONFIG_I2C_DEBUG_ALGO=y
CONFIG_I2C_DEBUG_BUS=y CONFIG_I2C_DEBUG_BUS=y
@ -690,7 +688,16 @@ CONFIG_HWMON=y
# #
# #
# Multimedia Capabilities Port drivers # LED devices
#
# CONFIG_NEW_LEDS is not set
#
# LED drivers
#
#
# LED Triggers
# #
# #
@ -702,6 +709,7 @@ CONFIG_HWMON=y
# Digital Video Broadcasting Devices # Digital Video Broadcasting Devices
# #
# CONFIG_DVB is not set # CONFIG_DVB is not set
# CONFIG_USB_DABUSB is not set
# #
# Graphics support # Graphics support
@ -718,6 +726,7 @@ CONFIG_HWMON=y
# #
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
# CONFIG_USB_ARCH_HAS_OHCI is not set # CONFIG_USB_ARCH_HAS_OHCI is not set
# CONFIG_USB_ARCH_HAS_EHCI is not set
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_DEBUG=y CONFIG_USB_DEBUG=y
@ -775,15 +784,6 @@ CONFIG_USB_STORAGE=y
# CONFIG_USB_MDC800 is not set # CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set # CONFIG_USB_MICROTEK is not set
#
# USB Multimedia devices
#
# CONFIG_USB_DABUSB is not set
#
# Video4Linux support is needed for USB Multimedia device support
#
# #
# USB Network Adapters # USB Network Adapters
# #
@ -813,6 +813,7 @@ CONFIG_USB_SERIAL_CONSOLE=y
# CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_CYPRESS_M8 is not set
# CONFIG_USB_SERIAL_EMPEG is not set # CONFIG_USB_SERIAL_EMPEG is not set
# CONFIG_USB_SERIAL_FTDI_SIO is not set # CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_SERIAL_FUNSOFT is not set
# CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IPAQ is not set
# CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_IR is not set
@ -825,6 +826,7 @@ CONFIG_USB_SERIAL_CONSOLE=y
# CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KLSI is not set
# CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_NAVMAN is not set
CONFIG_USB_SERIAL_PL2303=y CONFIG_USB_SERIAL_PL2303=y
# CONFIG_USB_SERIAL_HP4X is not set # CONFIG_USB_SERIAL_HP4X is not set
# CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SAFE is not set
@ -864,6 +866,32 @@ CONFIG_USB_SERIAL_PL2303=y
# #
# CONFIG_MMC is not set # CONFIG_MMC is not set
#
# Real Time Clock
#
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
#
# RTC drivers
#
# CONFIG_RTC_DRV_X1205 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_PCF8563 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
CONFIG_RTC_DRV_M48T86=y
CONFIG_RTC_DRV_EP93XX=y
# CONFIG_RTC_DRV_TEST is not set
# #
# File systems # File systems
# #
@ -912,7 +940,6 @@ CONFIG_SYSFS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# CONFIG_CONFIGFS_FS is not set # CONFIG_CONFIGFS_FS is not set
# #
@ -1044,6 +1071,7 @@ CONFIG_LOG_BUF_SHIFT=14
CONFIG_DETECT_SOFTLOCKUP=y CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
CONFIG_DEBUG_SLAB=y CONFIG_DEBUG_SLAB=y
# CONFIG_DEBUG_SLAB_LEAK is not set
CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_SPINLOCK=y
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
@ -1053,6 +1081,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
# CONFIG_UNWIND_INFO is not set
CONFIG_FORCED_INLINING=y CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
CONFIG_DEBUG_USER=y CONFIG_DEBUG_USER=y

View File

@ -1,18 +1,19 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.16-rc2 # Linux kernel version: 2.6.17-rc2
# Wed Feb 8 04:49:11 2006 # Wed Apr 19 21:12:49 2006
# #
CONFIG_ARM=y CONFIG_ARM=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_VECTORS_BASE=0xffff0000
# #
# Code maturity level options # Code maturity level options
# #
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_INIT_ENV_ARG_LIMIT=32
@ -29,6 +30,7 @@ CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
# CONFIG_IKCONFIG is not set # CONFIG_IKCONFIG is not set
# CONFIG_RELAY is not set
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
@ -44,10 +46,6 @@ CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_SHMEM=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_SLAB=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
@ -60,7 +58,6 @@ CONFIG_OBSOLETE_INTERMODULE=y
CONFIG_MODULES=y CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y CONFIG_KMOD=y
@ -68,6 +65,7 @@ CONFIG_KMOD=y
# #
# Block layer # Block layer
# #
# CONFIG_BLK_DEV_IO_TRACE is not set
# #
# IO Schedulers # IO Schedulers
@ -89,11 +87,13 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_EP93XX is not set
# CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IOP3XX is not set
# CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP4XX is not set
CONFIG_ARCH_IXP2000=y CONFIG_ARCH_IXP2000=y
# CONFIG_ARCH_IXP23XX is not set
# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_PXA is not set # CONFIG_ARCH_PXA is not set
# CONFIG_ARCH_RPC is not set # CONFIG_ARCH_RPC is not set
@ -123,6 +123,7 @@ CONFIG_ARCH_IXDP2800=y
CONFIG_ARCH_IXDP2X00=y CONFIG_ARCH_IXDP2X00=y
CONFIG_ARCH_IXDP2401=y CONFIG_ARCH_IXDP2401=y
CONFIG_ARCH_IXDP2801=y CONFIG_ARCH_IXDP2801=y
CONFIG_MACH_IXDP28X5=y
CONFIG_ARCH_IXDP2X01=y CONFIG_ARCH_IXDP2X01=y
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set # CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
@ -147,7 +148,6 @@ CONFIG_XSCALE_PMU=y
# Bus support # Bus support
# #
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_PCI_LEGACY_PROC=y
# CONFIG_PCI_DEBUG is not set # CONFIG_PCI_DEBUG is not set
# #
@ -160,6 +160,7 @@ CONFIG_PCI_LEGACY_PROC=y
# #
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
# CONFIG_NO_IDLE_HZ is not set # CONFIG_NO_IDLE_HZ is not set
CONFIG_HZ=100
# CONFIG_AEABI is not set # CONFIG_AEABI is not set
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
@ -213,6 +214,7 @@ CONFIG_NET=y
# #
# Networking options # Networking options
# #
# CONFIG_NETDEBUG is not set
CONFIG_PACKET=y CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y CONFIG_UNIX=y
@ -232,12 +234,15 @@ CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set # CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set # CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set # CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not set
# CONFIG_INET_TUNNEL is not set # CONFIG_INET_TUNNEL is not set
CONFIG_INET_DIAG=y CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set # CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y CONFIG_TCP_CONG_BIC=y
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_INET6_XFRM_TUNNEL is not set
# CONFIG_INET6_TUNNEL is not set
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
# #
@ -347,7 +352,6 @@ CONFIG_MTD_CFI_UTIL=y
# CONFIG_MTD_ROM is not set # CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set # CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_OBSOLETE_CHIPS is not set # CONFIG_MTD_OBSOLETE_CHIPS is not set
# CONFIG_MTD_XIP is not set
# #
# Mapping drivers for chip access # Mapping drivers for chip access
@ -366,7 +370,6 @@ CONFIG_MTD_IXP2000=y
# CONFIG_MTD_SLRAM is not set # CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set # CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
# CONFIG_MTD_BLOCK2MTD is not set # CONFIG_MTD_BLOCK2MTD is not set
# #
@ -614,8 +617,9 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# #
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_NR_UARTS=3 CONFIG_SERIAL_8250_NR_UARTS=3
CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=3
# CONFIG_SERIAL_8250_EXTENDED is not set # CONFIG_SERIAL_8250_EXTENDED is not set
# #
@ -623,6 +627,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# #
CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTY_COUNT=256
@ -650,7 +655,6 @@ CONFIG_IXP2000_WATCHDOG=y
# CONFIG_PCIPCWATCHDOG is not set # CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set # CONFIG_WDTPCI is not set
# CONFIG_NVRAM is not set # CONFIG_NVRAM is not set
# CONFIG_RTC is not set
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set # CONFIG_APPLICOM is not set
@ -696,7 +700,6 @@ CONFIG_I2C_IXP2000=y
# CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_PARPORT_LIGHT is not set
# CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_PROSAVAGE is not set
# CONFIG_I2C_SAVAGE4 is not set # CONFIG_I2C_SAVAGE4 is not set
# CONFIG_SCx200_ACB is not set
# CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS5595 is not set
# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS630 is not set
# CONFIG_I2C_SIS96X is not set # CONFIG_I2C_SIS96X is not set
@ -715,9 +718,7 @@ CONFIG_SENSORS_EEPROM=y
# CONFIG_SENSORS_PCF8574 is not set # CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCA9539 is not set # CONFIG_SENSORS_PCA9539 is not set
# CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set
# CONFIG_SENSORS_MAX6875 is not set # CONFIG_SENSORS_MAX6875 is not set
# CONFIG_RTC_X1205_I2C is not set
# CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_BUS is not set
@ -729,6 +730,11 @@ CONFIG_SENSORS_EEPROM=y
# CONFIG_SPI is not set # CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set # CONFIG_SPI_MASTER is not set
#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set
# #
# Hardware Monitoring support # Hardware Monitoring support
# #
@ -742,6 +748,7 @@ CONFIG_HWMON=y
# CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_ATXP1 is not set
# CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_DS1621 is not set
# CONFIG_SENSORS_F71805F is not set
# CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCHER is not set
# CONFIG_SENSORS_FSCPOS is not set # CONFIG_SENSORS_FSCPOS is not set
# CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL518SM is not set
@ -776,7 +783,16 @@ CONFIG_HWMON=y
# #
# #
# Multimedia Capabilities Port drivers # LED devices
#
# CONFIG_NEW_LEDS is not set
#
# LED drivers
#
#
# LED Triggers
# #
# #
@ -804,6 +820,7 @@ CONFIG_HWMON=y
# #
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
# CONFIG_USB is not set # CONFIG_USB is not set
# #
@ -820,6 +837,12 @@ CONFIG_USB_ARCH_HAS_OHCI=y
# #
# CONFIG_MMC is not set # CONFIG_MMC is not set
#
# Real Time Clock
#
CONFIG_RTC_LIB=y
# CONFIG_RTC_CLASS is not set
# #
# File systems # File systems
# #
@ -870,7 +893,6 @@ CONFIG_SYSFS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# CONFIG_CONFIGFS_FS is not set # CONFIG_CONFIGFS_FS is not set
# #
@ -972,6 +994,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
# CONFIG_UNWIND_INFO is not set
CONFIG_FORCED_INLINING=y CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
CONFIG_DEBUG_USER=y CONFIG_DEBUG_USER=y

View File

@ -1,12 +1,14 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.16 # Linux kernel version: 2.6.17-rc2
# Tue Mar 21 03:27:20 2006 # Wed Apr 19 21:13:50 2006
# #
CONFIG_ARM=y CONFIG_ARM=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_VECTORS_BASE=0xffff0000
# #
# Code maturity level options # Code maturity level options
@ -28,6 +30,7 @@ CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
# CONFIG_IKCONFIG is not set # CONFIG_IKCONFIG is not set
# CONFIG_RELAY is not set
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
@ -43,10 +46,6 @@ CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_SHMEM=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_SLAB=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
@ -59,7 +58,6 @@ CONFIG_OBSOLETE_INTERMODULE=y
CONFIG_MODULES=y CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y CONFIG_KMOD=y
@ -67,6 +65,7 @@ CONFIG_KMOD=y
# #
# Block layer # Block layer
# #
# CONFIG_BLK_DEV_IO_TRACE is not set
# #
# IO Schedulers # IO Schedulers
@ -143,7 +142,6 @@ CONFIG_CPU_BIG_ENDIAN=y
# Bus support # Bus support
# #
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_PCI_LEGACY_PROC=y
# CONFIG_PCI_DEBUG is not set # CONFIG_PCI_DEBUG is not set
# #
@ -230,12 +228,15 @@ CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set # CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set # CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set # CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not set
# CONFIG_INET_TUNNEL is not set # CONFIG_INET_TUNNEL is not set
CONFIG_INET_DIAG=y CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set # CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y CONFIG_TCP_CONG_BIC=y
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_INET6_XFRM_TUNNEL is not set
# CONFIG_INET6_TUNNEL is not set
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
# #
@ -365,7 +366,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1
# CONFIG_MTD_SLRAM is not set # CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set # CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
# CONFIG_MTD_BLOCK2MTD is not set # CONFIG_MTD_BLOCK2MTD is not set
# #
@ -527,7 +527,6 @@ CONFIG_BLK_DEV_SD=y
# CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_SYM53C8XX_2 is not set
# CONFIG_SCSI_IPR is not set # CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_QLOGIC_FC is not set
# CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLOGIC_1280 is not set
# CONFIG_SCSI_QLA_FC is not set # CONFIG_SCSI_QLA_FC is not set
# CONFIG_SCSI_LPFC is not set # CONFIG_SCSI_LPFC is not set
@ -735,6 +734,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# #
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set # CONFIG_SERIAL_8250_EXTENDED is not set
@ -776,7 +776,6 @@ CONFIG_WATCHDOG=y
# #
# CONFIG_USBPCWATCHDOG is not set # CONFIG_USBPCWATCHDOG is not set
# CONFIG_NVRAM is not set # CONFIG_NVRAM is not set
# CONFIG_RTC is not set
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set # CONFIG_APPLICOM is not set
@ -821,7 +820,6 @@ CONFIG_I2C_ALGOBIT=y
# CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_PARPORT_LIGHT is not set
# CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_PROSAVAGE is not set
# CONFIG_I2C_SAVAGE4 is not set # CONFIG_I2C_SAVAGE4 is not set
# CONFIG_SCx200_ACB is not set
# CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS5595 is not set
# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS630 is not set
# CONFIG_I2C_SIS96X is not set # CONFIG_I2C_SIS96X is not set
@ -840,9 +838,7 @@ CONFIG_SENSORS_EEPROM=y
# CONFIG_SENSORS_PCF8574 is not set # CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCA9539 is not set # CONFIG_SENSORS_PCA9539 is not set
# CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set
# CONFIG_SENSORS_MAX6875 is not set # CONFIG_SENSORS_MAX6875 is not set
# CONFIG_RTC_X1205_I2C is not set
# CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_BUS is not set
@ -907,7 +903,16 @@ CONFIG_HWMON=y
# #
# #
# Multimedia Capabilities Port drivers # LED devices
#
# CONFIG_NEW_LEDS is not set
#
# LED drivers
#
#
# LED Triggers
# #
# #
@ -919,6 +924,7 @@ CONFIG_HWMON=y
# Digital Video Broadcasting Devices # Digital Video Broadcasting Devices
# #
# CONFIG_DVB is not set # CONFIG_DVB is not set
# CONFIG_USB_DABUSB is not set
# #
# Graphics support # Graphics support
@ -935,6 +941,7 @@ CONFIG_HWMON=y
# #
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB=y CONFIG_USB=y
# CONFIG_USB_DEBUG is not set # CONFIG_USB_DEBUG is not set
@ -1000,9 +1007,7 @@ CONFIG_USB_STORAGE=y
# CONFIG_USB_ACECAD is not set # CONFIG_USB_ACECAD is not set
# CONFIG_USB_KBTAB is not set # CONFIG_USB_KBTAB is not set
# CONFIG_USB_POWERMATE is not set # CONFIG_USB_POWERMATE is not set
# CONFIG_USB_MTOUCH is not set # CONFIG_USB_TOUCHSCREEN is not set
# CONFIG_USB_ITMTOUCH is not set
# CONFIG_USB_EGALAX is not set
# CONFIG_USB_YEALINK is not set # CONFIG_USB_YEALINK is not set
# CONFIG_USB_XPAD is not set # CONFIG_USB_XPAD is not set
# CONFIG_USB_ATI_REMOTE is not set # CONFIG_USB_ATI_REMOTE is not set
@ -1016,15 +1021,6 @@ CONFIG_USB_STORAGE=y
# CONFIG_USB_MDC800 is not set # CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set # CONFIG_USB_MICROTEK is not set
#
# USB Multimedia devices
#
# CONFIG_USB_DABUSB is not set
#
# Video4Linux support is needed for USB Multimedia device support
#
# #
# USB Network Adapters # USB Network Adapters
# #
@ -1075,6 +1071,12 @@ CONFIG_USB_MON=y
# #
# CONFIG_MMC is not set # CONFIG_MMC is not set
#
# Real Time Clock
#
CONFIG_RTC_LIB=y
# CONFIG_RTC_CLASS is not set
# #
# File systems # File systems
# #
@ -1127,7 +1129,6 @@ CONFIG_SYSFS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# CONFIG_CONFIGFS_FS is not set # CONFIG_CONFIGFS_FS is not set
# #
@ -1268,6 +1269,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
# CONFIG_UNWIND_INFO is not set
CONFIG_FORCED_INLINING=y CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
CONFIG_DEBUG_USER=y CONFIG_DEBUG_USER=y

View File

@ -101,7 +101,6 @@ EXPORT_SYMBOL(__raw_writesl);
/* string / mem functions */ /* string / mem functions */
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(memset); EXPORT_SYMBOL(memset);
EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memcpy);

View File

@ -322,6 +322,12 @@ static void __init setup_processor(void)
sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS); sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS); sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
elf_hwcap = list->elf_hwcap; 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(); cpu_proc_init();
} }
@ -401,7 +407,7 @@ static void __init early_initrd(char **p)
} }
__early_param("initrd=", early_initrd); __early_param("initrd=", early_initrd);
static void __init add_memory(unsigned long start, unsigned long size) static void __init arm_add_memory(unsigned long start, unsigned long size)
{ {
/* /*
* Ensure that start/size are aligned to a page boundary. * Ensure that start/size are aligned to a page boundary.
@ -439,7 +445,7 @@ static void __init early_mem(char **p)
if (**p == '@') if (**p == '@')
start = memparse(*p + 1, p); start = memparse(*p + 1, p);
add_memory(start, size); arm_add_memory(start, size);
} }
__early_param("mem=", early_mem); __early_param("mem=", early_mem);
@ -581,7 +587,7 @@ static int __init parse_tag_mem32(const struct tag *tag)
tag->u.mem.start, tag->u.mem.size / 1024); tag->u.mem.start, tag->u.mem.size / 1024);
return -EINVAL; return -EINVAL;
} }
add_memory(tag->u.mem.start, tag->u.mem.size); arm_add_memory(tag->u.mem.start, tag->u.mem.size);
return 0; return 0;
} }
@ -801,7 +807,7 @@ static int __init topology_init(void)
{ {
int cpu; int cpu;
for_each_cpu(cpu) for_each_possible_cpu(cpu)
register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu, NULL); register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu, NULL);
return 0; return 0;

View File

@ -194,13 +194,23 @@ void __init at91_add_device_eth(struct at91_eth_data *data) {}
#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) #if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)
static struct at91_cf_data cf_data; static struct at91_cf_data cf_data;
static struct resource at91_cf_resources[] = {
[0] = {
.start = AT91_CF_BASE,
/* ties up CS4, CS5, and CS6 */
.end = AT91_CF_BASE + (0x30000000 - 1),
.flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
},
};
static struct platform_device at91rm9200_cf_device = { static struct platform_device at91rm9200_cf_device = {
.name = "at91_cf", .name = "at91_cf",
.id = -1, .id = -1,
.dev = { .dev = {
.platform_data = &cf_data, .platform_data = &cf_data,
}, },
.num_resources = 0, .resource = at91_cf_resources,
.num_resources = ARRAY_SIZE(at91_cf_resources),
}; };
void __init at91_add_device_cf(struct at91_cf_data *data) void __init at91_add_device_cf(struct at91_cf_data *data)

View File

@ -91,7 +91,7 @@ static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type);
/* /*
* IRQ -> GPIO mapping table * IRQ -> GPIO mapping table
*/ */
static char irq2gpio[32] = { static signed char irq2gpio[32] = {
-1, -1, -1, -1, -1, -1, 0, 1, -1, -1, -1, -1, -1, -1, 0, 1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 2, 3, 4, 5, 6, -1, -1, -1, 2, 3, 4, 5, 6,

View File

@ -25,10 +25,6 @@
#include <asm/arch/mux.h> #include <asm/arch/mux.h>
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
extern void omap_nop_release(struct device *dev);
/*-------------------------------------------------------------------------*/
#if defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE) #if defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE)
static u64 irda_dmamask = 0xffffffff; static u64 irda_dmamask = 0xffffffff;
@ -37,7 +33,6 @@ static struct platform_device omap1610ir_device = {
.name = "omap1610-ir", .name = "omap1610-ir",
.id = -1, .id = -1,
.dev = { .dev = {
.release = omap_nop_release,
.dma_mask = &irda_dmamask, .dma_mask = &irda_dmamask,
}, },
}; };
@ -84,9 +79,6 @@ static struct resource rtc_resources[] = {
static struct platform_device omap_rtc_device = { static struct platform_device omap_rtc_device = {
.name = "omap_rtc", .name = "omap_rtc",
.id = -1, .id = -1,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(rtc_resources), .num_resources = ARRAY_SIZE(rtc_resources),
.resource = rtc_resources, .resource = rtc_resources,
}; };
@ -124,9 +116,6 @@ static struct resource sti_resources[] = {
static struct platform_device sti_device = { static struct platform_device sti_device = {
.name = "sti", .name = "sti",
.id = -1, .id = -1,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(sti_resources), .num_resources = ARRAY_SIZE(sti_resources),
.resource = sti_resources, .resource = sti_resources,
}; };

View File

@ -25,10 +25,6 @@
#include <asm/arch/mux.h> #include <asm/arch/mux.h>
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
extern void omap_nop_release(struct device *dev);
/*-------------------------------------------------------------------------*/
#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
#define OMAP2_I2C_BASE2 0x48072000 #define OMAP2_I2C_BASE2 0x48072000
@ -49,9 +45,6 @@ static struct resource i2c_resources2[] = {
static struct platform_device omap_i2c_device2 = { static struct platform_device omap_i2c_device2 = {
.name = "i2c_omap", .name = "i2c_omap",
.id = 2, .id = 2,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(i2c_resources2), .num_resources = ARRAY_SIZE(i2c_resources2),
.resource = i2c_resources2, .resource = i2c_resources2,
}; };
@ -100,9 +93,6 @@ static struct resource sti_resources[] = {
static struct platform_device sti_device = { static struct platform_device sti_device = {
.name = "sti", .name = "sti",
.id = -1, .id = -1,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(sti_resources), .num_resources = ARRAY_SIZE(sti_resources),
.resource = sti_resources, .resource = sti_resources,
}; };

View File

@ -196,12 +196,9 @@ static int __init corgi_ssp_probe(struct platform_device *dev)
int ret; int ret;
/* Chip Select - Disable All */ /* Chip Select - Disable All */
GPDR(ssp_machinfo->cs_lcdcon) |= GPIO_bit(ssp_machinfo->cs_lcdcon); /* output */ pxa_gpio_mode(ssp_machinfo->cs_lcdcon | GPIO_OUT | GPIO_DFLT_HIGH);
GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); /* High - Disable LCD Control/Timing Gen */ pxa_gpio_mode(ssp_machinfo->cs_max1111 | GPIO_OUT | GPIO_DFLT_HIGH);
GPDR(ssp_machinfo->cs_max1111) |= GPIO_bit(ssp_machinfo->cs_max1111); /* output */ pxa_gpio_mode(ssp_machinfo->cs_ads7846 | GPIO_OUT | GPIO_DFLT_HIGH);
GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); /* High - Disable MAX1111*/
GPDR(ssp_machinfo->cs_ads7846) |= GPIO_bit(ssp_machinfo->cs_ads7846); /* output */
GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); /* High - Disable ADS7846*/
ret = ssp_init(&corgi_ssp_dev, ssp_machinfo->port, 0); ret = ssp_init(&corgi_ssp_dev, ssp_machinfo->port, 0);

View File

@ -367,6 +367,8 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent)
source = S3C2410_MISCCR_CLK0_UPLL; source = S3C2410_MISCCR_CLK0_UPLL;
else if (parent == &clk_f) else if (parent == &clk_f)
source = S3C2410_MISCCR_CLK0_FCLK; source = S3C2410_MISCCR_CLK0_FCLK;
else if (parent == &clk_h)
source = S3C2410_MISCCR_CLK0_HCLK;
else if (parent == &clk_p) else if (parent == &clk_p)
source = S3C2410_MISCCR_CLK0_PCLK; source = S3C2410_MISCCR_CLK0_PCLK;
else if (clk == &s3c24xx_clkout0 && parent == &s3c24xx_dclk0) else if (clk == &s3c24xx_clkout0 && parent == &s3c24xx_dclk0)
@ -376,6 +378,8 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent)
else else
return -EINVAL; return -EINVAL;
clk->parent = parent;
if (clk == &s3c24xx_dclk0) if (clk == &s3c24xx_dclk0)
mask = S3C2410_MISCCR_CLK0_MASK; mask = S3C2410_MISCCR_CLK0_MASK;
else { else {

View File

@ -37,6 +37,7 @@
#include <asm/arch/nand.h> #include <asm/arch/nand.h>
#include "common-smdk.h"
#include "devs.h" #include "devs.h"
#include "pm.h" #include "pm.h"
@ -49,7 +50,7 @@ static struct mtd_partition smdk_default_nand_part[] = {
.offset = 0, .offset = 0,
}, },
[1] = { [1] = {
.name = "S3C2410 flash parition 1", .name = "S3C2410 flash partition 1",
.offset = 0, .offset = 0,
.size = SZ_2M, .size = SZ_2M,
}, },

View File

@ -139,7 +139,7 @@ static int s3c2440_clk_add(struct sys_device *sysdev)
clkdivn = __raw_readl(S3C2410_CLKDIVN); clkdivn = __raw_readl(S3C2410_CLKDIVN);
clkdivn |= S3C2440_CLKDIVN_UCLK; clkdivn |= S3C2440_CLKDIVN_UCLK;
__raw_writel(camdivn, S3C2410_CLKDIVN); __raw_writel(clkdivn, S3C2410_CLKDIVN);
mutex_unlock(&clocks_mutex); mutex_unlock(&clocks_mutex);
} }

View File

@ -10,7 +10,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/memory.h>
#include <asm/page.h> #include <asm/page.h>
#include "proc-macros.S" #include "proc-macros.S"
@ -46,6 +46,11 @@
*/ */
#define CACHE_DLIMIT (CACHE_DSIZE * 4) #define CACHE_DLIMIT (CACHE_DSIZE * 4)
.data
flush_base:
.long FLUSH_BASE
.text
/* /*
* flush_user_cache_all() * flush_user_cache_all()
* *
@ -63,11 +68,21 @@ ENTRY(v4wb_flush_kern_cache_all)
mov ip, #0 mov ip, #0
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
__flush_whole_cache: __flush_whole_cache:
mov r0, #FLUSH_BASE ldr r3, =flush_base
add r1, r0, #CACHE_DSIZE ldr r1, [r3, #0]
1: ldr r2, [r0], #32 eor r1, r1, #CACHE_DSIZE
cmp r0, r1 str r1, [r3, #0]
add r2, r1, #CACHE_DSIZE
1: ldr r3, [r1], #32
cmp r1, r2
blo 1b 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 mcr p15, 0, ip, c7, c10, 4 @ drain write buffer
mov pc, lr mov pc, lr
@ -82,6 +97,7 @@ __flush_whole_cache:
* - flags - vma_area_struct flags describing address space * - flags - vma_area_struct flags describing address space
*/ */
ENTRY(v4wb_flush_user_cache_range) ENTRY(v4wb_flush_user_cache_range)
mov ip, #0
sub r3, r1, r0 @ calculate total size sub r3, r1, r0 @ calculate total size
tst r2, #VM_EXEC @ executable region? tst r2, #VM_EXEC @ executable region?
mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache

View File

@ -20,6 +20,7 @@
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/sizes.h>
#include <asm/tlb.h> #include <asm/tlb.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
@ -455,14 +456,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
#ifdef FLUSH_BASE #ifdef FLUSH_BASE
map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS); map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS);
map.virtual = FLUSH_BASE; map.virtual = FLUSH_BASE;
map.length = PGDIR_SIZE; map.length = SZ_1M;
map.type = MT_CACHECLEAN; map.type = MT_CACHECLEAN;
create_mapping(&map); create_mapping(&map);
#endif #endif
#ifdef FLUSH_BASE_MINICACHE #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.virtual = FLUSH_BASE_MINICACHE;
map.length = PGDIR_SIZE; map.length = SZ_1M;
map.type = MT_MINICLEAN; map.type = MT_MINICLEAN;
create_mapping(&map); create_mapping(&map);
#endif #endif

View File

@ -26,22 +26,7 @@
* the cache line size of the I and D cache * the cache line size of the I and D cache
*/ */
#define DCACHELINESIZE 32 #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 .text
/* /*
@ -145,13 +130,11 @@ ENTRY(cpu_sa110_dcache_clean_area)
*/ */
.align 5 .align 5
ENTRY(cpu_sa110_switch_mm) ENTRY(cpu_sa110_switch_mm)
flush_110_dcache r3, ip, r1 str lr, [sp, #-4]!
mov r1, #0 bl v4wb_flush_kern_cache_all @ clears IP
mcr p15, 0, r1, c7, c5, 0 @ invalidate I cache
mcr p15, 0, r1, c7, c10, 4 @ drain WB
mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
mov pc, lr ldr pc, [sp], #4
/* /*
* cpu_sa110_set_pte(ptep, pte) * cpu_sa110_set_pte(ptep, pte)

View File

@ -30,30 +30,6 @@
* the cache line size of the I and D cache * the cache line size of the I and D cache
*/ */
#define DCACHELINESIZE 32 #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 __INIT
@ -79,9 +55,8 @@ ENTRY(cpu_sa1100_proc_fin)
stmfd sp!, {lr} stmfd sp!, {lr}
mov ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE mov ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
msr cpsr_c, ip msr cpsr_c, ip
flush_1100_dcache r0, r1, r2 @ clean caches bl v4wb_flush_kern_cache_all
mov r0, #0 mcr p15, 0, ip, c15, c2, 2 @ Disable clock switching
mcr p15, 0, r0, c15, c2, 2 @ Disable clock switching
mrc p15, 0, r0, c1, c0, 0 @ ctrl register mrc p15, 0, r0, c1, c0, 0 @ ctrl register
bic r0, r0, #0x1000 @ ...i............ bic r0, r0, #0x1000 @ ...i............
bic r0, r0, #0x000e @ ............wca. bic r0, r0, #0x000e @ ............wca.
@ -167,14 +142,12 @@ ENTRY(cpu_sa1100_dcache_clean_area)
*/ */
.align 5 .align 5
ENTRY(cpu_sa1100_switch_mm) ENTRY(cpu_sa1100_switch_mm)
flush_1100_dcache r3, ip, r1 str lr, [sp, #-4]!
mov ip, #0 bl v4wb_flush_kern_cache_all @ clears IP
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
mcr p15, 0, ip, c9, c0, 0 @ invalidate RB 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, r0, c2, c0, 0 @ load page table pointer
mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
mov pc, lr ldr pc, [sp], #4
/* /*
* cpu_sa1100_set_pte(ptep, pte) * cpu_sa1100_set_pte(ptep, pte)

View File

@ -58,7 +58,7 @@ struct clk * clk_get(struct device *dev, const char *id)
if (p->id == idno && if (p->id == idno &&
strcmp(id, p->name) == 0 && try_module_get(p->owner)) { strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
clk = p; clk = p;
break; goto found;
} }
} }
@ -69,6 +69,7 @@ struct clk * clk_get(struct device *dev, const char *id)
} }
} }
found:
mutex_unlock(&clocks_mutex); mutex_unlock(&clocks_mutex);
return clk; return clk;

View File

@ -26,14 +26,6 @@
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
#include <asm/arch/menelaus.h> #include <asm/arch/menelaus.h>
void omap_nop_release(struct device *dev)
{
/* Nothing */
}
/*-------------------------------------------------------------------------*/
#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
#define OMAP1_I2C_BASE 0xfffb3800 #define OMAP1_I2C_BASE 0xfffb3800
@ -59,9 +51,6 @@ static struct resource i2c_resources1[] = {
static struct platform_device omap_i2c_device1 = { static struct platform_device omap_i2c_device1 = {
.name = "i2c_omap", .name = "i2c_omap",
.id = 1, .id = 1,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(i2c_resources1), .num_resources = ARRAY_SIZE(i2c_resources1),
.resource = i2c_resources1, .resource = i2c_resources1,
}; };
@ -187,7 +176,6 @@ static struct platform_device mmc_omap_device1 = {
.name = "mmci-omap", .name = "mmci-omap",
.id = 1, .id = 1,
.dev = { .dev = {
.release = omap_nop_release,
.dma_mask = &mmc1_dmamask, .dma_mask = &mmc1_dmamask,
.platform_data = &mmc1_conf, .platform_data = &mmc1_conf,
}, },
@ -217,7 +205,6 @@ static struct platform_device mmc_omap_device2 = {
.name = "mmci-omap", .name = "mmci-omap",
.id = 2, .id = 2,
.dev = { .dev = {
.release = omap_nop_release,
.dma_mask = &mmc2_dmamask, .dma_mask = &mmc2_dmamask,
.platform_data = &mmc2_conf, .platform_data = &mmc2_conf,
}, },
@ -321,9 +308,6 @@ static struct resource uwire_resources[] = {
static struct platform_device omap_uwire_device = { static struct platform_device omap_uwire_device = {
.name = "omap_uwire", .name = "omap_uwire",
.id = -1, .id = -1,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(uwire_resources), .num_resources = ARRAY_SIZE(uwire_resources),
.resource = uwire_resources, .resource = uwire_resources,
}; };
@ -365,9 +349,6 @@ static struct resource wdt_resources[] = {
static struct platform_device omap_wdt_device = { static struct platform_device omap_wdt_device = {
.name = "omap_wdt", .name = "omap_wdt",
.id = -1, .id = -1,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(wdt_resources), .num_resources = ARRAY_SIZE(wdt_resources),
.resource = wdt_resources, .resource = wdt_resources,
}; };
@ -401,9 +382,6 @@ static struct resource rng_resources[] = {
static struct platform_device omap_rng_device = { static struct platform_device omap_rng_device = {
.name = "omap_rng", .name = "omap_rng",
.id = -1, .id = -1,
.dev = {
.release = omap_nop_release,
},
.num_resources = ARRAY_SIZE(rng_resources), .num_resources = ARRAY_SIZE(rng_resources),
.resource = rng_resources, .resource = rng_resources,
}; };

View File

@ -588,6 +588,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr)
struct vfp_double vdm; struct vfp_double vdm;
u32 d, exceptions = 0; u32 d, exceptions = 0;
int rmode = fpscr & FPSCR_RMODE_MASK; int rmode = fpscr & FPSCR_RMODE_MASK;
int tm;
vfp_double_unpack(&vdm, vfp_get_double(dm)); vfp_double_unpack(&vdm, vfp_get_double(dm));
vfp_double_dump("VDM", &vdm); 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? * Do we have denormalised number?
*/ */
if (vfp_double_type(&vdm) & VFP_DENORMAL) tm = vfp_double_type(&vdm);
if (tm & VFP_DENORMAL)
exceptions |= FPSCR_IDC; 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; d = 0x7fffffff;
if (vdm.sign) if (vdm.sign)
d = ~d; d = ~d;
@ -1122,9 +1127,9 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
{ {
u32 op = inst & FOP_MASK; u32 op = inst & FOP_MASK;
u32 exceptions = 0; u32 exceptions = 0;
unsigned int dd = vfp_get_sd(inst); unsigned int dd = vfp_get_dd(inst);
unsigned int dn = vfp_get_sn(inst); unsigned int dn = vfp_get_dn(inst);
unsigned int dm = vfp_get_sm(inst); unsigned int dm = vfp_get_dm(inst);
unsigned int vecitr, veclen, vecstride; unsigned int vecitr, veclen, vecstride;
u32 (*fop)(int, int, s32, u32); 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, pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
(veclen >> FPSCR_LENGTH_BIT) + 1); (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) if (!fop)
goto invalid; goto invalid;
@ -1149,17 +1154,13 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
u32 except; u32 except;
if (op == FOP_EXT) 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, vecitr >> FPSCR_LENGTH_BIT,
dd >> 1, dd & 1, dn, dd, dn, dm);
dm >> 1, dm & 1);
else 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, vecitr >> FPSCR_LENGTH_BIT,
dd >> 1, dd & 1, dd, dn, FOP_TO_IDX(op), dm);
dn >> 1, dn & 1,
FOP_TO_IDX(op),
dm >> 1, dm & 1);
except = fop(dd, dn, dm, fpscr); except = fop(dd, dn, dm, fpscr);
pr_debug("VFP: itr%d: exceptions=%08x\n", pr_debug("VFP: itr%d: exceptions=%08x\n",

View File

@ -189,11 +189,10 @@ vfp_put_float:
.globl vfp_get_double .globl vfp_get_double
vfp_get_double: vfp_get_double:
mov r0, r0, lsr #1
add pc, pc, r0, lsl #3 add pc, pc, r0, lsl #3
mov r0, r0 mov r0, r0
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .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 mov pc, lr
.endr .endr
@ -204,10 +203,9 @@ vfp_get_double:
.globl vfp_put_double .globl vfp_put_double
vfp_put_double: vfp_put_double:
mov r0, r0, lsr #1
add pc, pc, r0, lsl #3 add pc, pc, r0, lsl #3
mov r0, r0 mov r0, r0
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .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 mov pc, lr
.endr .endr

View File

@ -632,6 +632,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr)
struct vfp_single vsm; struct vfp_single vsm;
u32 d, exceptions = 0; u32 d, exceptions = 0;
int rmode = fpscr & FPSCR_RMODE_MASK; int rmode = fpscr & FPSCR_RMODE_MASK;
int tm;
vfp_single_unpack(&vsm, m); vfp_single_unpack(&vsm, m);
vfp_single_dump("VSM", &vsm); 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? * Do we have a denormalised number?
*/ */
tm = vfp_single_type(&vsm);
if (vfp_single_type(&vsm) & VFP_DENORMAL) if (vfp_single_type(&vsm) & VFP_DENORMAL)
exceptions |= FPSCR_IDC; 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 * 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, pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
(veclen >> FPSCR_LENGTH_BIT) + 1); (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) if (!fop)
goto invalid; goto invalid;

View File

@ -152,7 +152,6 @@ EXPORT_SYMBOL(strncmp);
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);
EXPORT_SYMBOL(strlen); EXPORT_SYMBOL(strlen);
EXPORT_SYMBOL(strnlen); EXPORT_SYMBOL(strnlen);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(memset); EXPORT_SYMBOL(memset);

View File

@ -39,7 +39,6 @@ EXPORT_SYMBOL(loops_per_usec);
/* String functions */ /* String functions */
EXPORT_SYMBOL(memcmp); EXPORT_SYMBOL(memcmp);
EXPORT_SYMBOL(memmove); EXPORT_SYMBOL(memmove);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strcpy); EXPORT_SYMBOL(strcpy);
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);

View File

@ -1170,12 +1170,6 @@ __syscall_badsys:
# syscall vector table # syscall vector table
# #
############################################################################### ###############################################################################
#ifdef CONFIG_MMU
#define __MMU(X) X
#else
#define __MMU(X) sys_ni_syscall
#endif
.section .rodata .section .rodata
ALIGN ALIGN
.globl sys_call_table .globl sys_call_table
@ -1305,7 +1299,7 @@ sys_call_table:
.long sys_newuname .long sys_newuname
.long sys_ni_syscall /* old "cacheflush" */ .long sys_ni_syscall /* old "cacheflush" */
.long sys_adjtimex .long sys_adjtimex
.long __MMU(sys_mprotect) /* 125 */ .long sys_mprotect /* 125 */
.long sys_sigprocmask .long sys_sigprocmask
.long sys_ni_syscall /* old "create_module" */ .long sys_ni_syscall /* old "create_module" */
.long sys_init_module .long sys_init_module
@ -1324,16 +1318,16 @@ sys_call_table:
.long sys_getdents .long sys_getdents
.long sys_select .long sys_select
.long sys_flock .long sys_flock
.long __MMU(sys_msync) .long sys_msync
.long sys_readv /* 145 */ .long sys_readv /* 145 */
.long sys_writev .long sys_writev
.long sys_getsid .long sys_getsid
.long sys_fdatasync .long sys_fdatasync
.long sys_sysctl .long sys_sysctl
.long __MMU(sys_mlock) /* 150 */ .long sys_mlock /* 150 */
.long __MMU(sys_munlock) .long sys_munlock
.long __MMU(sys_mlockall) .long sys_mlockall
.long __MMU(sys_munlockall) .long sys_munlockall
.long sys_sched_setparam .long sys_sched_setparam
.long sys_sched_getparam /* 155 */ .long sys_sched_getparam /* 155 */
.long sys_sched_setscheduler .long sys_sched_setscheduler
@ -1343,7 +1337,7 @@ sys_call_table:
.long sys_sched_get_priority_min /* 160 */ .long sys_sched_get_priority_min /* 160 */
.long sys_sched_rr_get_interval .long sys_sched_rr_get_interval
.long sys_nanosleep .long sys_nanosleep
.long __MMU(sys_mremap) .long sys_mremap
.long sys_setresuid16 .long sys_setresuid16
.long sys_getresuid16 /* 165 */ .long sys_getresuid16 /* 165 */
.long sys_ni_syscall /* for vm86 */ .long sys_ni_syscall /* for vm86 */
@ -1398,8 +1392,8 @@ sys_call_table:
.long sys_setfsuid /* 215 */ .long sys_setfsuid /* 215 */
.long sys_setfsgid .long sys_setfsgid
.long sys_pivot_root .long sys_pivot_root
.long __MMU(sys_mincore) .long sys_mincore
.long __MMU(sys_madvise) .long sys_madvise
.long sys_getdents64 /* 220 */ .long sys_getdents64 /* 220 */
.long sys_fcntl64 .long sys_fcntl64
.long sys_ni_syscall /* reserved for TUX */ .long sys_ni_syscall /* reserved for TUX */
@ -1437,7 +1431,7 @@ sys_call_table:
.long sys_epoll_create .long sys_epoll_create
.long sys_epoll_ctl /* 255 */ .long sys_epoll_ctl /* 255 */
.long sys_epoll_wait .long sys_epoll_wait
.long __MMU(sys_remap_file_pages) .long sys_remap_file_pages
.long sys_set_tid_address .long sys_set_tid_address
.long sys_timer_create .long sys_timer_create
.long sys_timer_settime /* 260 */ .long sys_timer_settime /* 260 */

View File

@ -27,7 +27,6 @@ EXPORT_SYMBOL(__ioremap);
EXPORT_SYMBOL(iounmap); EXPORT_SYMBOL(iounmap);
EXPORT_SYMBOL(strnlen); EXPORT_SYMBOL(strnlen);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);

View File

@ -25,7 +25,6 @@ extern char h8300_debug_device[];
/* platform dependent support */ /* platform dependent support */
EXPORT_SYMBOL(strnlen); EXPORT_SYMBOL(strnlen);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);

View File

@ -53,6 +53,35 @@ source "init/Kconfig"
menu "Processor type and features" 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 choice
prompt "Subarchitecture Type" prompt "Subarchitecture Type"
default X86_PC default X86_PC
@ -178,35 +207,6 @@ config HPET_EMULATE_RTC
depends on HPET_TIMER && RTC=y depends on HPET_TIMER && RTC=y
default 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 config NR_CPUS
int "Maximum number of CPUs (2-255)" int "Maximum number of CPUs (2-255)"
range 2 255 range 2 255
@ -522,6 +522,12 @@ config NUMA
comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI"
depends on X86_SUMMIT && (!HIGHMEM64G || !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 config HAVE_ARCH_BOOTMEM_NODE
bool bool
depends on NUMA depends on NUMA
@ -757,15 +763,6 @@ config HOTPLUG_CPU
Say N. 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 endmenu

View File

@ -311,5 +311,5 @@ config X86_OOSTORE
config X86_TSC config X86_TSC
bool 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 default y

View File

@ -81,4 +81,13 @@ config X86_MPPARSE
depends on X86_LOCAL_APIC && !X86_VISWS depends on X86_LOCAL_APIC && !X86_VISWS
default y default y
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 endmenu

View File

@ -97,6 +97,7 @@
#define PARAM_VESAPM_OFF 0x30 #define PARAM_VESAPM_OFF 0x30
#define PARAM_LFB_PAGES 0x32 #define PARAM_LFB_PAGES 0x32
#define PARAM_VESA_ATTRIB 0x34 #define PARAM_VESA_ATTRIB 0x34
#define PARAM_CAPABILITIES 0x36
/* Define DO_STORE according to CONFIG_VIDEO_RETAIN */ /* Define DO_STORE according to CONFIG_VIDEO_RETAIN */
#ifdef CONFIG_VIDEO_RETAIN #ifdef CONFIG_VIDEO_RETAIN
@ -233,6 +234,10 @@ mopar_gr:
movw 18(%di), %ax movw 18(%di), %ax
movl %eax, %fs:(PARAM_LFB_SIZE) 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 # switching the DAC to 8-bit is for <= 8 bpp only
movw %fs:(PARAM_LFB_DEPTH), %ax movw %fs:(PARAM_LFB_DEPTH), %ax
cmpw $8, %ax cmpw $8, %ax

View File

@ -6,7 +6,7 @@ extra-y := head.o init_task.o vmlinux.lds
obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ pci-dma.o i386_ksyms.o i387.o bootflag.o \
quirks.o i8237.o topology.o alternative.o quirks.o i8237.o topology.o alternative.o
obj-y += cpu/ obj-y += cpu/

View File

@ -215,7 +215,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
{ {
struct acpi_table_madt *madt = NULL; struct acpi_table_madt *madt = NULL;
if (!phys_addr || !size) if (!phys_addr || !size || !cpu_has_apic)
return -EINVAL; return -EINVAL;
madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size); 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; int count;
if (!cpu_has_apic)
return -ENODEV;
/* /*
* Note that the LAPIC address is obtained from the MADT (32-bit value) * 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). * 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; return -ENODEV;
} }
if (!cpu_has_apic)
return -ENODEV;
/* /*
* if "noapic" boot option, don't look for IO-APICs * if "noapic" boot option, don't look for IO-APICs
*/ */
@ -1096,6 +1102,9 @@ int __init acpi_boot_table_init(void)
dmi_check_system(acpi_dmi_table); dmi_check_system(acpi_dmi_table);
#endif #endif
if (!cpu_has_apic)
return -ENODEV;
/* /*
* If acpi_disabled, bail out * If acpi_disabled, bail out
* One exception: acpi=ht continues far enough to enumerate LAPICs * One exception: acpi=ht continues far enough to enumerate LAPICs

View File

@ -62,6 +62,18 @@ int apic_verbosity;
static void apic_pm_activate(void); 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'. * 'what should we do if we get a hw irq event on an illegal vector'.
* each architecture has to answer this themselves. * each architecture has to answer this themselves.
@ -119,10 +131,7 @@ void enable_NMI_through_LVT0 (void * dummy)
int get_physical_broadcast(void) int get_physical_broadcast(void)
{ {
unsigned int lvr, version; if (modern_apic())
lvr = apic_read(APIC_LVR);
version = GET_APIC_VERSION(lvr);
if (!APIC_INTEGRATED(version) || version >= 0x14)
return 0xff; return 0xff;
else else
return 0xf; return 0xf;
@ -349,9 +358,9 @@ int __init verify_local_APIC(void)
void __init sync_Arb_IDs(void) void __init sync_Arb_IDs(void)
{ {
/* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1 */ /* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1
unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); And not needed on AMD */
if (ver >= 0x14) /* P4 or higher */ if (modern_apic())
return; return;
/* /*
* Wait for idle. * Wait for idle.

View File

@ -1079,7 +1079,7 @@ static int apm_console_blank(int blank)
break; break;
} }
if (error == APM_NOT_ENGAGED && state != APM_STATE_READY) { if (error == APM_NOT_ENGAGED) {
static int tried; static int tried;
int eng_error; int eng_error;
if (tried++ == 0) { if (tried++ == 0) {

View File

@ -207,13 +207,13 @@ static void __init init_amd(struct cpuinfo_x86 *c)
set_bit(X86_FEATURE_K7, c->x86_capability); set_bit(X86_FEATURE_K7, c->x86_capability);
break; break;
} }
if (c->x86 >= 6)
set_bit(X86_FEATURE_FXSAVE_LEAK, c->x86_capability);
display_cacheinfo(c); display_cacheinfo(c);
if (cpuid_eax(0x80000000) >= 0x80000008) { if (cpuid_eax(0x80000000) >= 0x80000008) {
c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1; 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) { if (cpuid_eax(0x80000000) >= 0x80000007) {

View File

@ -46,7 +46,7 @@
#define PFX "powernow-k8: " #define PFX "powernow-k8: "
#define BFX PFX "BIOS error: " #define BFX PFX "BIOS error: "
#define VERSION "version 1.60.1" #define VERSION "version 1.60.2"
#include "powernow-k8.h" #include "powernow-k8.h"
/* serialize freq changes */ /* serialize freq changes */
@ -55,7 +55,7 @@ static DEFINE_MUTEX(fidvid_mutex);
static struct powernow_k8_data *powernow_data[NR_CPUS]; static struct powernow_k8_data *powernow_data[NR_CPUS];
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
static cpumask_t cpu_core_map[1] = { CPU_MASK_ALL }; static cpumask_t cpu_core_map[1];
#endif #endif
/* Return a frequency in MHz, given an input fid */ /* Return a frequency in MHz, given an input fid */
@ -905,11 +905,17 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
{ {
cpumask_t oldmask = CPU_MASK_ALL; cpumask_t oldmask = CPU_MASK_ALL;
struct powernow_k8_data *data = powernow_data[pol->cpu]; struct powernow_k8_data *data = powernow_data[pol->cpu];
u32 checkfid = data->currfid; u32 checkfid;
u32 checkvid = data->currvid; u32 checkvid;
unsigned int newstate; unsigned int newstate;
int ret = -EIO; int ret = -EIO;
if (!data)
return -EINVAL;
checkfid = data->currfid;
checkvid = data->currvid;
/* only run on specific CPU from here on */ /* only run on specific CPU from here on */
oldmask = current->cpus_allowed; oldmask = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(pol->cpu)); set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
@ -969,6 +975,9 @@ static int powernowk8_verify(struct cpufreq_policy *pol)
{ {
struct powernow_k8_data *data = powernow_data[pol->cpu]; struct powernow_k8_data *data = powernow_data[pol->cpu];
if (!data)
return -EINVAL;
return cpufreq_frequency_table_verify(pol, data->powernow_table); return cpufreq_frequency_table_verify(pol, data->powernow_table);
} }
@ -977,7 +986,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
{ {
struct powernow_k8_data *data; struct powernow_k8_data *data;
cpumask_t oldmask = CPU_MASK_ALL; cpumask_t oldmask = CPU_MASK_ALL;
int rc, i; int rc;
if (!cpu_online(pol->cpu)) if (!cpu_online(pol->cpu))
return -ENODEV; return -ENODEV;
@ -1063,8 +1072,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
printk("cpu_init done, current fid 0x%x, vid 0x%x\n", printk("cpu_init done, current fid 0x%x, vid 0x%x\n",
data->currfid, data->currvid); data->currfid, data->currvid);
for_each_cpu_mask(i, cpu_core_map[pol->cpu]) powernow_data[pol->cpu] = data;
powernow_data[i] = data;
return 0; return 0;

View File

@ -168,7 +168,7 @@ static int cpuid_class_device_create(int i)
return err; return err;
} }
static int __devinit cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) static int cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
{ {
unsigned int cpu = (unsigned long)hcpu; unsigned int cpu = (unsigned long)hcpu;

View File

@ -19,7 +19,6 @@ EXPORT_SYMBOL(__put_user_2);
EXPORT_SYMBOL(__put_user_4); EXPORT_SYMBOL(__put_user_4);
EXPORT_SYMBOL(__put_user_8); EXPORT_SYMBOL(__put_user_8);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strstr);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP

View File

@ -43,7 +43,7 @@ DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
/* insert a jmp code */ /* insert a jmp code */
static inline void set_jmp_op(void *from, void *to) static __always_inline void set_jmp_op(void *from, void *to)
{ {
struct __arch_jmp_op { struct __arch_jmp_op {
char op; char op;
@ -57,7 +57,7 @@ static inline void set_jmp_op(void *from, void *to)
/* /*
* returns non-zero if opcodes can be boosted. * returns non-zero if opcodes can be boosted.
*/ */
static inline int can_boost(kprobe_opcode_t opcode) static __always_inline int can_boost(kprobe_opcode_t opcode)
{ {
switch (opcode & 0xf0 ) { switch (opcode & 0xf0 ) {
case 0x70: case 0x70:
@ -88,7 +88,7 @@ static inline int can_boost(kprobe_opcode_t opcode)
/* /*
* returns non-zero if opcode modifies the interrupt flag. * returns non-zero if opcode modifies the interrupt flag.
*/ */
static inline int is_IF_modifier(kprobe_opcode_t opcode) static int __kprobes is_IF_modifier(kprobe_opcode_t opcode)
{ {
switch (opcode) { switch (opcode) {
case 0xfa: /* cli */ case 0xfa: /* cli */
@ -138,7 +138,7 @@ void __kprobes arch_remove_kprobe(struct kprobe *p)
mutex_unlock(&kprobe_mutex); mutex_unlock(&kprobe_mutex);
} }
static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
{ {
kcb->prev_kprobe.kp = kprobe_running(); kcb->prev_kprobe.kp = kprobe_running();
kcb->prev_kprobe.status = kcb->kprobe_status; kcb->prev_kprobe.status = kcb->kprobe_status;
@ -146,7 +146,7 @@ static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb)
kcb->prev_kprobe.saved_eflags = kcb->kprobe_saved_eflags; kcb->prev_kprobe.saved_eflags = kcb->kprobe_saved_eflags;
} }
static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb) static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb)
{ {
__get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp; __get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp;
kcb->kprobe_status = kcb->prev_kprobe.status; kcb->kprobe_status = kcb->prev_kprobe.status;
@ -154,7 +154,7 @@ static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb)
kcb->kprobe_saved_eflags = kcb->prev_kprobe.saved_eflags; kcb->kprobe_saved_eflags = kcb->prev_kprobe.saved_eflags;
} }
static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs, static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
struct kprobe_ctlblk *kcb) struct kprobe_ctlblk *kcb)
{ {
__get_cpu_var(current_kprobe) = p; __get_cpu_var(current_kprobe) = p;
@ -164,7 +164,7 @@ static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
kcb->kprobe_saved_eflags &= ~IF_MASK; kcb->kprobe_saved_eflags &= ~IF_MASK;
} }
static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs) static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
{ {
regs->eflags |= TF_MASK; regs->eflags |= TF_MASK;
regs->eflags &= ~IF_MASK; regs->eflags &= ~IF_MASK;
@ -507,7 +507,7 @@ no_change:
* Interrupts are disabled on entry as trap1 is an interrupt gate and they * Interrupts are disabled on entry as trap1 is an interrupt gate and they
* remain disabled thoroughout this function. * remain disabled thoroughout this function.
*/ */
static inline int post_kprobe_handler(struct pt_regs *regs) static int __kprobes post_kprobe_handler(struct pt_regs *regs)
{ {
struct kprobe *cur = kprobe_running(); struct kprobe *cur = kprobe_running();
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
@ -543,7 +543,7 @@ out:
return 1; return 1;
} }
static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr) static int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
{ {
struct kprobe *cur = kprobe_running(); struct kprobe *cur = kprobe_running();
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();

View File

@ -38,12 +38,6 @@
int smp_found_config; int smp_found_config;
unsigned int __initdata maxcpus = NR_CPUS; 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 * Various Linux-internal data structures created from the
* MP-table. * MP-table.
@ -110,21 +104,6 @@ static int __init mpf_checksum(unsigned char *mp, int len)
static int mpc_record; static int mpc_record;
static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata; 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) static void __devinit MP_processor_info (struct mpc_config_processor *m)
{ {
int ver, apicid; int ver, apicid;
@ -190,12 +169,6 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m)
ver = m->mpc_apicver; 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 * Validate version
*/ */
@ -225,7 +198,14 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m)
cpu_set(num_processors, cpu_possible_map); cpu_set(num_processors, cpu_possible_map);
num_processors++; 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) { switch (boot_cpu_data.x86_vendor) {
case X86_VENDOR_INTEL: case X86_VENDOR_INTEL:
if (!APIC_XAPIC(ver)) { 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]); 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) { if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA; mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
} else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) { } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) {

View File

@ -251,7 +251,7 @@ static int msr_class_device_create(int i)
return err; return err;
} }
static int __devinit msr_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) static int msr_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
{ {
unsigned int cpu = (unsigned long)hcpu; unsigned int cpu = (unsigned long)hcpu;

View File

@ -51,7 +51,5 @@ void mach_reboot_fixups(void)
cur->reboot_fixup(dev); cur->reboot_fixup(dev);
} }
printk(KERN_WARNING "No reboot fixup found for your hardware\n");
} }

View File

@ -963,6 +963,36 @@ efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
return 0; 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 * 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 * Request address space for all standard resources
* *
* This is called just before pcibios_assign_resources(), which is also * This is called just before pcibios_init(), which is also a
* an fs_initcall, but is linked in later (in arch/i386/pci/i386.c). * subsys_initcall, but is linked in later (in arch/i386/pci/common.c).
*/ */
static int __init request_standard_resources(void) static int __init request_standard_resources(void)
{ {
@ -1339,7 +1369,7 @@ static int __init request_standard_resources(void)
return 0; return 0;
} }
fs_initcall(request_standard_resources); subsys_initcall(request_standard_resources);
static void __init register_memory(void) static void __init register_memory(void)
{ {

View File

@ -314,3 +314,4 @@ ENTRY(sys_call_table)
.long sys_get_robust_list .long sys_get_robust_list
.long sys_splice .long sys_splice
.long sys_sync_file_range .long sys_sync_file_range
.long sys_tee /* 315 */

View File

@ -365,6 +365,9 @@ void die(const char * str, struct pt_regs * regs, long err)
if (++die.lock_owner_depth < 3) { if (++die.lock_owner_depth < 3) {
int nl = 0; int nl = 0;
unsigned long esp;
unsigned short ss;
handle_BUG(regs); handle_BUG(regs);
printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
#ifdef CONFIG_PREEMPT #ifdef CONFIG_PREEMPT
@ -387,8 +390,19 @@ void die(const char * str, struct pt_regs * regs, long err)
printk("\n"); printk("\n");
if (notify_die(DIE_OOPS, str, regs, err, if (notify_die(DIE_OOPS, str, regs, err,
current->thread.trap_no, SIGSEGV) != current->thread.trap_no, SIGSEGV) !=
NOTIFY_STOP) NOTIFY_STOP) {
show_registers(regs); show_registers(regs);
/* Executive summary in case the oops scrolled away */
esp = (unsigned long) (&regs->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 else
regs = NULL; regs = NULL;
} else } else

View File

@ -106,15 +106,20 @@ voyager_module_t *voyager_cat_list;
/* the I/O port assignments for the VIC and QIC */ /* the I/O port assignments for the VIC and QIC */
static struct resource vic_res = { static struct resource vic_res = {
"Voyager Interrupt Controller", 0xFC00, 0xFC6F }; .name = "Voyager Interrupt Controller",
.start = 0xFC00,
.end = 0xFC6F
};
static struct resource qic_res = { 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. /* 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. * It writes num_bits of the data buffer in msg starting at start_bit.
* Note: This function assumes that any unused bit in the data stream * Note: This function assumes that any unused bit in the data stream
* is set to zero so that the ors will work correctly */ * is set to zero so that the ors will work correctly */
#define BITS_PER_BYTE 8
static void static void
cat_pack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) cat_pack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits)
{ {

View File

@ -651,6 +651,7 @@ void __init mem_init(void)
* Specifically, in the case of x86, we will always add * Specifically, in the case of x86, we will always add
* memory to the highmem for now. * memory to the highmem for now.
*/ */
#ifdef CONFIG_HOTPLUG_MEMORY
#ifndef CONFIG_NEED_MULTIPLE_NODES #ifndef CONFIG_NEED_MULTIPLE_NODES
int add_memory(u64 start, u64 size) int add_memory(u64 start, u64 size)
{ {
@ -667,6 +668,7 @@ int remove_memory(u64 start, u64 size)
return -EINVAL; return -EINVAL;
} }
#endif #endif
#endif
kmem_cache_t *pgd_cache; kmem_cache_t *pgd_cache;
kmem_cache_t *pmd_cache; kmem_cache_t *pmd_cache;

View File

@ -4,6 +4,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/dmi.h>
#include "pci.h" #include "pci.h"
/* /*
@ -18,8 +19,10 @@ int pci_conf1_read(unsigned int seg, unsigned int bus,
{ {
unsigned long flags; unsigned long flags;
if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) if ((bus > 255) || (devfn > 255) || (reg > 255)) {
*value = -1;
return -EINVAL; return -EINVAL;
}
spin_lock_irqsave(&pci_config_lock, flags); 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; unsigned long flags;
int dev, fn; int dev, fn;
if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) if ((bus > 255) || (devfn > 255) || (reg > 255)) {
*value = -1;
return -EINVAL; return -EINVAL;
}
dev = PCI_SLOT(devfn); dev = PCI_SLOT(devfn);
fn = PCI_FUNC(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) if (pci_probe & PCI_NO_CHECKS)
return 1; 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++) { for (devfn = 0; devfn < 0x100; devfn++) {
if (o->read(0, 0, devfn, PCI_CLASS_DEVICE, 2, &x)) if (o->read(0, 0, devfn, PCI_CLASS_DEVICE, 2, &x))

View File

@ -588,7 +588,10 @@ static __init int via_router_probe(struct irq_router *r,
case PCI_DEVICE_ID_VIA_82C596: case PCI_DEVICE_ID_VIA_82C596:
case PCI_DEVICE_ID_VIA_82C686: case PCI_DEVICE_ID_VIA_82C686:
case PCI_DEVICE_ID_VIA_8231: case PCI_DEVICE_ID_VIA_8231:
case PCI_DEVICE_ID_VIA_8233A:
case PCI_DEVICE_ID_VIA_8235: case PCI_DEVICE_ID_VIA_8235:
case PCI_DEVICE_ID_VIA_8237:
case PCI_DEVICE_ID_VIA_8237_SATA:
/* FIXME: add new ones for 8233/5 */ /* FIXME: add new ones for 8233/5 */
r->name = "VIA"; r->name = "VIA";
r->get = pirq_via_get; r->get = pirq_via_get;

View File

@ -12,14 +12,20 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <asm/e820.h>
#include "pci.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)) #define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG))
/* The base address of the last MMCONFIG device accessed */ /* The base address of the last MMCONFIG device accessed */
static u32 mmcfg_last_accessed_device; 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 * 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; int cfg_num = -1;
struct acpi_table_mcfg_config *cfg; struct acpi_table_mcfg_config *cfg;
if (seg == 0 && bus == 0 && if (seg == 0 && bus < MAX_CHECK_BUS &&
test_bit(PCI_SLOT(devfn), fallback_slots)) test_bit(PCI_SLOT(devfn) + 32*bus, fallback_slots))
return 0; return 0;
while (1) { while (1) {
@ -74,8 +80,10 @@ static int pci_mmcfg_read(unsigned int seg, unsigned int bus,
unsigned long flags; unsigned long flags;
u32 base; u32 base;
if (!value || (bus > 255) || (devfn > 255) || (reg > 4095)) if ((bus > 255) || (devfn > 255) || (reg > 4095)) {
*value = -1;
return -EINVAL; return -EINVAL;
}
base = get_base_addr(seg, bus, devfn); base = get_base_addr(seg, bus, devfn);
if (!base) 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 Normally this can be expressed in the MCFG by not listing them
and assigning suitable _SEGs, but this isn't implemented in some BIOS. 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 Instead try to discover all devices on bus 0 that are unreachable using MM
and fallback for them. and fallback for them. */
We only do this for bus 0/seg 0 */
static __init void unreachable_devices(void) static __init void unreachable_devices(void)
{ {
int i; int i, k;
unsigned long flags; unsigned long flags;
for (i = 0; i < 32; i++) { for (k = 0; k < MAX_CHECK_BUS; k++) {
u32 val1; for (i = 0; i < 32; i++) {
u32 addr; u32 val1;
u32 addr;
pci_conf1_read(0, 0, PCI_DEVFN(i, 0), 0, 4, &val1); pci_conf1_read(0, k, PCI_DEVFN(i, 0), 0, 4, &val1);
if (val1 == 0xffffffff) if (val1 == 0xffffffff)
continue; continue;
/* Locking probably not needed, but safer */ /* Locking probably not needed, but safer */
spin_lock_irqsave(&pci_config_lock, flags); spin_lock_irqsave(&pci_config_lock, flags);
addr = get_base_addr(0, 0, PCI_DEVFN(i, 0)); addr = get_base_addr(0, k, PCI_DEVFN(i, 0));
if (addr != 0) if (addr != 0)
pci_exp_set_dev_base(addr, 0, PCI_DEVFN(i, 0)); pci_exp_set_dev_base(addr, k, PCI_DEVFN(i, 0));
if (addr == 0 || readl((u32 __iomem *)mmcfg_virt_addr) != val1) if (addr == 0 ||
set_bit(i, fallback_slots); readl((u32 __iomem *)mmcfg_virt_addr) != val1) {
spin_unlock_irqrestore(&pci_config_lock, flags); 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)) (pci_mmcfg_config[0].base_address == 0))
return; 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"); printk(KERN_INFO "PCI: Using MMCONFIG\n");
raw_pci_ops = &pci_mmcfg; raw_pci_ops = &pci_mmcfg;
pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;

View File

@ -260,15 +260,6 @@ config NR_CPUS
than 64 will cause the use of a CPU mask array, causing a small than 64 will cause the use of a CPU mask array, causing a small
performance hit. 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 config HOTPLUG_CPU
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
depends on SMP && EXPERIMENTAL depends on SMP && EXPERIMENTAL
@ -352,6 +343,16 @@ config NUMA
Access). This option is for configuring high-end multiprocessor Access). This option is for configuring high-end multiprocessor
server systems. If in doubt, say N. 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 and FLAT_NODE_MEM_MAP are functionally equivalent.
# VIRTUAL_MEM_MAP has been retained for historical reasons. # VIRTUAL_MEM_MAP has been retained for historical reasons.
config VIRTUAL_MEM_MAP config VIRTUAL_MEM_MAP

View File

@ -7,7 +7,7 @@ extra-y := head.o init_task.o vmlinux.lds
obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \
irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \
salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \ salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \
unwind.o mca.o mca_asm.o topology.o dmi_scan.o unwind.o mca.o mca_asm.o topology.o
obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o
obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o
@ -30,7 +30,6 @@ obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o
obj-$(CONFIG_KPROBES) += kprobes.o jprobes.o obj-$(CONFIG_KPROBES) += kprobes.o jprobes.o
obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR) += uncached.o obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR) += uncached.o
mca_recovery-y += mca_drv.o mca_drv_asm.o mca_recovery-y += mca_drv.o mca_drv_asm.o
dmi_scan-y += ../../i386/kernel/dmi_scan.o
# The gate DSO image is built using a special linker script. # The gate DSO image is built using a special linker script.
targets += gate.so gate-syms.o targets += gate.so gate-syms.o

View File

@ -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 * This program is free software; you can redistribute it and/or modify
* Copyright (C) Alex Williamson * it under the terms of the GNU General Public License version 2 as
* Copyright (C) Bjorn Helgaas * published by the Free Software Foundation.
*
* Vendor specific extensions to ACPI.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/efi.h>
#include <asm/acpi-ext.h> #include <asm/acpi-ext.h>
struct acpi_vendor_descriptor { /*
u8 guid_id; * Device CSRs that do not appear in PCI config space should be described
efi_guid_t guid; * 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 { static acpi_status hp_ccsr_locate(acpi_handle obj, u64 *base, u64 *length)
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)
{ {
acpi_status status; acpi_status status;
u8 *data; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
u32 length; struct acpi_resource *resource;
struct acpi_resource_vendor_typed *vendor;
status = status = acpi_get_vendor_resource(obj, METHOD_NAME__CRS, &hp_ccsr_uuid,
acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data, &length); &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; return AE_NOT_FOUND;
memcpy(csr_base, data, sizeof(*csr_base)); *base = space.base;
memcpy(csr_length, data + 8, sizeof(*csr_length)); *length = space.length;
acpi_os_free(data);
return AE_OK; 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); EXPORT_SYMBOL(hp_acpi_csr_space);

View File

@ -1606,5 +1606,9 @@ sys_call_table:
data8 sys_ni_syscall // 1295 reserved for ppoll data8 sys_ni_syscall // 1295 reserved for ppoll
data8 sys_unshare data8 sys_unshare
data8 sys_splice data8 sys_splice
data8 sys_set_robust_list
data8 sys_get_robust_list
data8 sys_sync_file_range // 1300
data8 sys_tee
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls

View File

@ -251,7 +251,7 @@ static void __kprobes prepare_break_inst(uint template, uint slot,
update_kprobe_inst_flag(template, slot, major_opcode, kprobe_inst, p); update_kprobe_inst_flag(template, slot, major_opcode, kprobe_inst, p);
} }
static inline void get_kprobe_inst(bundle_t *bundle, uint slot, static void __kprobes get_kprobe_inst(bundle_t *bundle, uint slot,
unsigned long *kprobe_inst, uint *major_opcode) unsigned long *kprobe_inst, uint *major_opcode)
{ {
unsigned long kprobe_inst_p0, kprobe_inst_p1; unsigned long kprobe_inst_p0, kprobe_inst_p1;
@ -278,7 +278,7 @@ static inline void get_kprobe_inst(bundle_t *bundle, uint slot,
} }
/* Returns non-zero if the addr is in the Interrupt Vector Table */ /* Returns non-zero if the addr is in the Interrupt Vector Table */
static inline int in_ivt_functions(unsigned long addr) static int __kprobes in_ivt_functions(unsigned long addr)
{ {
return (addr >= (unsigned long)__start_ivt_text return (addr >= (unsigned long)__start_ivt_text
&& addr < (unsigned long)__end_ivt_text); && addr < (unsigned long)__end_ivt_text);
@ -308,19 +308,19 @@ static int __kprobes valid_kprobe_addr(int template, int slot,
return 0; return 0;
} }
static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
{ {
kcb->prev_kprobe.kp = kprobe_running(); kcb->prev_kprobe.kp = kprobe_running();
kcb->prev_kprobe.status = kcb->kprobe_status; kcb->prev_kprobe.status = kcb->kprobe_status;
} }
static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb) static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb)
{ {
__get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp; __get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp;
kcb->kprobe_status = kcb->prev_kprobe.status; kcb->kprobe_status = kcb->prev_kprobe.status;
} }
static inline void set_current_kprobe(struct kprobe *p, static void __kprobes set_current_kprobe(struct kprobe *p,
struct kprobe_ctlblk *kcb) struct kprobe_ctlblk *kcb)
{ {
__get_cpu_var(current_kprobe) = p; __get_cpu_var(current_kprobe) = p;

View File

@ -581,10 +581,12 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs)
{ {
unsigned long flags; unsigned long flags;
int cpu = smp_processor_id(); int cpu = smp_processor_id();
struct ia64_mca_notify_die nd =
{ .sos = NULL, .monarch_cpu = &monarch_cpu };
/* Mask all interrupts */ /* Mask all interrupts */
local_irq_save(flags); 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); 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(); 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); 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) while (monarch_cpu != -1)
cpu_relax(); /* spin until monarch leaves */ 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); ia64_mca_spin(__FUNCTION__);
@ -961,7 +963,7 @@ no_mod:
*/ */
static void static void
ia64_wait_for_slaves(int monarch) ia64_wait_for_slaves(int monarch, const char *type)
{ {
int c, wait = 0, missing = 0; int c, wait = 0, missing = 0;
for_each_online_cpu(c) { for_each_online_cpu(c) {
@ -987,7 +989,7 @@ ia64_wait_for_slaves(int monarch)
} }
if (!missing) if (!missing)
goto all_in; goto all_in;
printk(KERN_INFO "OS MCA slave did not rendezvous on cpu"); printk(KERN_INFO "OS %s slave did not rendezvous on cpu", type);
for_each_online_cpu(c) { for_each_online_cpu(c) {
if (c == monarch) if (c == monarch)
continue; continue;
@ -998,7 +1000,7 @@ ia64_wait_for_slaves(int monarch)
return; return;
all_in: all_in:
printk(KERN_INFO "All OS MCA slaves have reached rendezvous\n"); printk(KERN_INFO "All OS %s slaves have reached rendezvous\n", type);
return; return;
} }
@ -1023,6 +1025,8 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
&sos->proc_state_param; &sos->proc_state_param;
int recover, cpu = smp_processor_id(); int recover, cpu = smp_processor_id();
task_t *previous_current; 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 */ oops_in_progress = 1; /* FIXME: make printk NMI/MCA/INIT safe */
console_loglevel = 15; /* make sure printks make it to console */ console_loglevel = 15; /* make sure printks make it to console */
@ -1031,10 +1035,10 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA"); previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA");
monarch_cpu = cpu; 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); ia64_mca_spin(__FUNCTION__);
ia64_wait_for_slaves(cpu); ia64_wait_for_slaves(cpu, "MCA");
/* Wakeup all the processors which are spinning in the rendezvous loop. /* Wakeup all the processors which are spinning in the rendezvous loop.
* They will leave SAL, then spin in the OS with interrupts disabled * They will leave SAL, then spin in the OS with interrupts disabled
@ -1043,7 +1047,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
* spinning in SAL does not work. * spinning in SAL does not work.
*/ */
ia64_mca_wakeup_all(); 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); 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); ia64_sal_clear_state_info(SAL_INFO_TYPE_MCA);
sos->os_status = IA64_MCA_CORRECTED; 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); ia64_mca_spin(__FUNCTION__);
@ -1351,10 +1355,14 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
static atomic_t monarchs; static atomic_t monarchs;
task_t *previous_current; task_t *previous_current;
int cpu = smp_processor_id(); 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 */ oops_in_progress = 1; /* FIXME: make printk NMI/MCA/INIT safe */
console_loglevel = 15; /* make sure printks make it to console */ 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", printk(KERN_INFO "Entered OS INIT handler. PSP=%lx cpu=%d monarch=%ld\n",
sos->proc_state_param, cpu, sos->monarch); sos->proc_state_param, cpu, sos->monarch);
salinfo_log_wakeup(SAL_INFO_TYPE_INIT, NULL, 0, 0); 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; ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_INIT;
while (monarch_cpu == -1) while (monarch_cpu == -1)
cpu_relax(); /* spin until monarch enters */ 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); ia64_mca_spin(__FUNCTION__);
while (monarch_cpu != -1) while (monarch_cpu != -1)
cpu_relax(); /* spin until monarch leaves */ 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); ia64_mca_spin(__FUNCTION__);
printk("Slave on cpu %d returning to normal service.\n", cpu); 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; 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); ia64_mca_spin(__FUNCTION__);
@ -1421,15 +1429,15 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
*/ */
printk("Delaying for 5 seconds...\n"); printk("Delaying for 5 seconds...\n");
udelay(5*1000000); udelay(5*1000000);
ia64_wait_for_slaves(cpu); ia64_wait_for_slaves(cpu, "INIT");
/* If nobody intercepts DIE_INIT_MONARCH_PROCESS then we drop through /* If nobody intercepts DIE_INIT_MONARCH_PROCESS then we drop through
* to default_monarch_init_process() above and just print all the * to default_monarch_init_process() above and just print all the
* tasks. * 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); 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) == NOTIFY_STOP)
ia64_mca_spin(__FUNCTION__); ia64_mca_spin(__FUNCTION__);
printk("\nINIT dump complete. Monarch on cpu %d returning to normal service.\n", cpu); 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 " printk(KERN_INFO "Increasing MCA rendezvous timeout from "
"%ld to %ld milliseconds\n", timeout, isrv.v0); "%ld to %ld milliseconds\n", timeout, isrv.v0);
timeout = isrv.v0; timeout = isrv.v0;
(void) notify_die(DIE_MCA_NEW_TIMEOUT, "MCA", NULL, timeout, 0, 0);
continue; continue;
} }
printk(KERN_ERR "Failed to register rendezvous interrupt " printk(KERN_ERR "Failed to register rendezvous interrupt "

View File

@ -827,7 +827,7 @@ ia64_state_restore:
ld8 r9=[temp2],16 // sal_gp ld8 r9=[temp2],16 // sal_gp
;; ;;
ld8 r22=[temp1],16 // pal_min_state, virtual 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 r16=[temp1],16 // prev_IA64_KR_CURRENT_STACK
ld8 r20=[temp2],16 // prev_task ld8 r20=[temp2],16 // prev_task
@ -848,7 +848,7 @@ ia64_state_restore:
mov cr.iim=temp3 mov cr.iim=temp3
mov cr.iha=temp4 mov cr.iha=temp4
dep r22=0,r22,62,1 // pal_min_state, physical, uncached 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 r8=[temp1] // os_status
ld8 r10=[temp2] // context ld8 r10=[temp2] // context
@ -856,7 +856,7 @@ ia64_state_restore:
* avoid any dependencies on the algorithm in ia64_switch_to(), just * avoid any dependencies on the algorithm in ia64_switch_to(), just
* purge any existing CURRENT_STACK mapping and insert the new one. * 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 * 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 * code. Do not use r8, r9, r10, r22, they contain values ready for
* the return to SAL. * the return to SAL.
@ -873,7 +873,7 @@ ia64_state_restore:
;; ;;
srlz.d 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 shl r20=r16,IA64_GRANULE_SHIFT // r16 = prev_IA64_KR_CURRENT_STACK
movl r21=PAGE_KERNEL // page properties 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:( (p6) br.spnt 1f // the dreaded cpu 0 idle task in region 5:(
;; ;;
mov cr.itir=r18 mov cr.itir=r18
mov cr.ifa=r21 mov cr.ifa=r13
mov r20=IA64_TR_CURRENT_STACK mov r20=IA64_TR_CURRENT_STACK
;; ;;
itr.d dtr[r20]=r21 itr.d dtr[r20]=r21

View File

@ -947,7 +947,7 @@ void
percpu_modcopy (void *pcpudst, const void *src, unsigned long size) percpu_modcopy (void *pcpudst, const void *src, unsigned long size)
{ {
unsigned int i; unsigned int i;
for_each_cpu(i) { for_each_possible_cpu(i) {
memcpy(pcpudst + __per_cpu_offset[i], src, size); memcpy(pcpudst + __per_cpu_offset[i], src, size);
} }
} }

View File

@ -519,6 +519,68 @@ void __cpuinit *per_cpu_init(void)
} }
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#ifdef CONFIG_VIRTUAL_MEM_MAP
static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
{
unsigned long end_address, hole_next_pfn;
unsigned long stop_address;
end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];
end_address = PAGE_ALIGN(end_address);
stop_address = (unsigned long) &vmem_map[
pgdat->node_start_pfn + pgdat->node_spanned_pages];
do {
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
pgd = pgd_offset_k(end_address);
if (pgd_none(*pgd)) {
end_address += PGDIR_SIZE;
continue;
}
pud = pud_offset(pgd, end_address);
if (pud_none(*pud)) {
end_address += PUD_SIZE;
continue;
}
pmd = pmd_offset(pud, end_address);
if (pmd_none(*pmd)) {
end_address += PMD_SIZE;
continue;
}
pte = pte_offset_kernel(pmd, end_address);
retry_pte:
if (pte_none(*pte)) {
end_address += PAGE_SIZE;
pte++;
if ((end_address < stop_address) &&
(end_address != ALIGN(end_address, 1UL << PMD_SHIFT)))
goto retry_pte;
continue;
}
/* Found next valid vmem_map page */
break;
} while (end_address < stop_address);
end_address = min(end_address, stop_address);
end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1;
hole_next_pfn = end_address / sizeof(struct page);
return hole_next_pfn - pgdat->node_start_pfn;
}
#else
static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
{
return i + 1;
}
#endif
/** /**
* show_mem - give short summary of memory stats * show_mem - give short summary of memory stats
* *
@ -547,8 +609,10 @@ void show_mem(void)
struct page *page; struct page *page;
if (pfn_valid(pgdat->node_start_pfn + i)) if (pfn_valid(pgdat->node_start_pfn + i))
page = pfn_to_page(pgdat->node_start_pfn + i); page = pfn_to_page(pgdat->node_start_pfn + i);
else else {
i = find_next_valid_pfn_for_pgdat(pgdat, i) - 1;
continue; continue;
}
if (PageReserved(page)) if (PageReserved(page))
reserved++; reserved++;
else if (PageSwapCache(page)) else if (PageSwapCache(page))

View File

@ -60,6 +60,9 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
struct siginfo si; struct siginfo si;
unsigned long mask; 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.. * If we're in an interrupt or have no user context, we must not take the fault..
*/ */

View File

@ -1831,7 +1831,7 @@ xpc_initiate_allocate(partid_t partid, int ch_number, u32 flags, void **payload)
{ {
struct xpc_partition *part = &xpc_partitions[partid]; struct xpc_partition *part = &xpc_partitions[partid];
enum xpc_retval ret = xpcUnknownReason; enum xpc_retval ret = xpcUnknownReason;
struct xpc_msg *msg; struct xpc_msg *msg = NULL;
DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS);

View File

@ -285,6 +285,11 @@ config NUMA
depends on SMP && BROKEN depends on SMP && BROKEN
default n default n
config NODES_SHIFT
int
default "1"
depends on NEED_MULTIPLE_NODES
# turning this on wastes a bunch of space. # turning this on wastes a bunch of space.
# Summit needs it only when NUMA is on # Summit needs it only when NUMA is on
config BOOT_IOREMAP config BOOT_IOREMAP

View File

@ -20,7 +20,7 @@
* Stack layout in 'ret_from_system_call': * Stack layout in 'ret_from_system_call':
* ptrace needs to have all regs on the stack. * ptrace needs to have all regs on the stack.
* if the order here is changed, it needs to be * if the order here is changed, it needs to be
* updated in fork.c:copy_process, signal.c:do_signal, * updated in fork.c:copy_thread, signal.c:do_signal,
* ptrace.c and ptrace.h * ptrace.c and ptrace.h
* *
* M32Rx/M32R2 M32R * M32Rx/M32R2 M32R
@ -41,18 +41,17 @@
* @(0x38,sp) - syscall_nr ditto * @(0x38,sp) - syscall_nr ditto
* @(0x3c,sp) - acc0h @(0x3c,sp) - acch * @(0x3c,sp) - acc0h @(0x3c,sp) - acch
* @(0x40,sp) - acc0l @(0x40,sp) - accl * @(0x40,sp) - acc0l @(0x40,sp) - accl
* @(0x44,sp) - acc1h @(0x44,sp) - psw * @(0x44,sp) - acc1h @(0x44,sp) - dummy_acc1h
* @(0x48,sp) - acc1l @(0x48,sp) - bpc * @(0x48,sp) - acc1l @(0x48,sp) - dummy_acc1l
* @(0x4c,sp) - psw @(0x4c,sp) - bbpsw * @(0x4c,sp) - psw ditto
* @(0x50,sp) - bpc @(0x50,sp) - bbpc * @(0x50,sp) - bpc ditto
* @(0x54,sp) - bbpsw @(0x54,sp) - spu (cr3) * @(0x54,sp) - bbpsw ditto
* @(0x58,sp) - bbpc @(0x58,sp) - fp (r13) * @(0x58,sp) - bbpc ditto
* @(0x5c,sp) - spu (cr3) @(0x5c,sp) - lr (r14) * @(0x5c,sp) - spu (cr3) ditto
* @(0x60,sp) - fp (r13) @(0x60,sp) - spi (cr12) * @(0x60,sp) - fp (r13) ditto
* @(0x64,sp) - lr (r14) @(0x64,sp) - orig_r0 * @(0x64,sp) - lr (r14) ditto
* @(0x68,sp) - spi (cr2) * @(0x68,sp) - spi (cr2) ditto
* @(0x6c,sp) - orig_r0 * @(0x6c,sp) - orig_r0 ditto
*
*/ */
#include <linux/config.h> #include <linux/config.h>
@ -102,6 +101,12 @@
#define ACC0L(reg) @(0x40,reg) #define ACC0L(reg) @(0x40,reg)
#define ACC1H(reg) @(0x44,reg) #define ACC1H(reg) @(0x44,reg)
#define ACC1L(reg) @(0x48,reg) #define ACC1L(reg) @(0x48,reg)
#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
#define ACCH(reg) @(0x3C,reg)
#define ACCL(reg) @(0x40,reg)
#else
#error unknown isa configuration
#endif
#define PSW(reg) @(0x4C,reg) #define PSW(reg) @(0x4C,reg)
#define BPC(reg) @(0x50,reg) #define BPC(reg) @(0x50,reg)
#define BBPSW(reg) @(0x54,reg) #define BBPSW(reg) @(0x54,reg)
@ -111,21 +116,6 @@
#define LR(reg) @(0x64,reg) #define LR(reg) @(0x64,reg)
#define SP(reg) @(0x68,reg) #define SP(reg) @(0x68,reg)
#define ORIG_R0(reg) @(0x6C,reg) #define ORIG_R0(reg) @(0x6C,reg)
#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
#define ACCH(reg) @(0x3C,reg)
#define ACCL(reg) @(0x40,reg)
#define PSW(reg) @(0x44,reg)
#define BPC(reg) @(0x48,reg)
#define BBPSW(reg) @(0x4C,reg)
#define BBPC(reg) @(0x50,reg)
#define SPU(reg) @(0x54,reg)
#define FP(reg) @(0x58,reg) /* FP = R13 */
#define LR(reg) @(0x5C,reg)
#define SP(reg) @(0x60,reg)
#define ORIG_R0(reg) @(0x64,reg)
#else
#error unknown isa configuration
#endif
CF_MASK = 0x00000001 CF_MASK = 0x00000001
TF_MASK = 0x00000100 TF_MASK = 0x00000100
@ -142,7 +132,7 @@ VM_MASK = 0x00020000
#endif #endif
ENTRY(ret_from_fork) ENTRY(ret_from_fork)
ld r0, @sp+ pop r0
bl schedule_tail bl schedule_tail
GET_THREAD_INFO(r8) GET_THREAD_INFO(r8)
bra syscall_exit bra syscall_exit
@ -231,7 +221,7 @@ restore_all:
RESTORE_ALL RESTORE_ALL
# perform work that needs to be done immediately before resumption # perform work that needs to be done immediately before resumption
# r9 : frags # r9 : flags
ALIGN ALIGN
work_pending: work_pending:
and3 r4, r9, #_TIF_NEED_RESCHED and3 r4, r9, #_TIF_NEED_RESCHED
@ -320,7 +310,7 @@ ENTRY(ei_handler)
; GET_ICU_STATUS; ; GET_ICU_STATUS;
seth r0, #shigh(M32R_ICU_ISTS_ADDR) seth r0, #shigh(M32R_ICU_ISTS_ADDR)
ld r0, @(low(M32R_ICU_ISTS_ADDR),r0) ld r0, @(low(M32R_ICU_ISTS_ADDR),r0)
st r0, @-sp push r0
#if defined(CONFIG_SMP) #if defined(CONFIG_SMP)
/* /*
* If IRQ == 0 --> Nothing to do, Not write IMASK * If IRQ == 0 --> Nothing to do, Not write IMASK
@ -557,7 +547,7 @@ check_end:
#endif /* CONFIG_PLAT_M32104UT */ #endif /* CONFIG_PLAT_M32104UT */
bl do_IRQ bl do_IRQ
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
ld r14, @sp+ pop r14
seth r0, #shigh(M32R_ICU_IMASK_ADDR) seth r0, #shigh(M32R_ICU_IMASK_ADDR)
st r14, @(low(M32R_ICU_IMASK_ADDR),r0) st r14, @(low(M32R_ICU_IMASK_ADDR),r0)
#else #else
@ -1015,4 +1005,3 @@ ENTRY(sys_call_table)
.long sys_waitid .long sys_waitid
syscall_table_size=(.-sys_call_table) syscall_table_size=(.-sys_call_table)

View File

@ -23,9 +23,6 @@ EXPORT_SYMBOL(boot_cpu_data);
EXPORT_SYMBOL(dump_fpu); EXPORT_SYMBOL(dump_fpu);
EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(__ioremap);
EXPORT_SYMBOL(iounmap); EXPORT_SYMBOL(iounmap);
EXPORT_SYMBOL(enable_irq);
EXPORT_SYMBOL(disable_irq);
EXPORT_SYMBOL(disable_irq_nosync);
EXPORT_SYMBOL(kernel_thread); EXPORT_SYMBOL(kernel_thread);
EXPORT_SYMBOL(__down); EXPORT_SYMBOL(__down);
EXPORT_SYMBOL(__down_interruptible); EXPORT_SYMBOL(__down_interruptible);
@ -38,13 +35,6 @@ EXPORT_SYMBOL(__udelay);
EXPORT_SYMBOL(__delay); EXPORT_SYMBOL(__delay);
EXPORT_SYMBOL(__const_udelay); 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(__strncpy_from_user); EXPORT_SYMBOL(__strncpy_from_user);
EXPORT_SYMBOL(clear_user); EXPORT_SYMBOL(clear_user);
@ -59,11 +49,8 @@ extern void *dcache_dummy;
EXPORT_SYMBOL(dcache_dummy); EXPORT_SYMBOL(dcache_dummy);
#endif #endif
EXPORT_SYMBOL(cpu_data); EXPORT_SYMBOL(cpu_data);
EXPORT_SYMBOL(cpu_online_map);
EXPORT_SYMBOL(cpu_callout_map);
/* Global SMP stuff */ /* Global SMP stuff */
EXPORT_SYMBOL(synchronize_irq);
EXPORT_SYMBOL(smp_call_function); EXPORT_SYMBOL(smp_call_function);
/* TLB flushing */ /* TLB flushing */
@ -83,27 +70,11 @@ EXPORT_SYMBOL(__lshrdi3);
EXPORT_SYMBOL(__muldi3); EXPORT_SYMBOL(__muldi3);
/* memory and string operations */ /* memory and string operations */
EXPORT_SYMBOL(memchr);
EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memcpy);
/* EXPORT_SYMBOL(memcpy_fromio); // not implement yet */
/* EXPORT_SYMBOL(memcpy_toio); // not implement yet */
EXPORT_SYMBOL(memset); 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(copy_page);
EXPORT_SYMBOL(clear_page); EXPORT_SYMBOL(clear_page);
EXPORT_SYMBOL(strcat);
EXPORT_SYMBOL(strchr);
EXPORT_SYMBOL(strcmp);
EXPORT_SYMBOL(strcpy);
EXPORT_SYMBOL(strlen); EXPORT_SYMBOL(strlen);
EXPORT_SYMBOL(strncat);
EXPORT_SYMBOL(strncmp);
EXPORT_SYMBOL(strnlen);
EXPORT_SYMBOL(strncpy);
EXPORT_SYMBOL(_inb); EXPORT_SYMBOL(_inb);
EXPORT_SYMBOL(_inw); EXPORT_SYMBOL(_inw);

View File

@ -116,6 +116,10 @@ void cpu_idle (void)
void machine_restart(char *__unused) void machine_restart(char *__unused)
{ {
#if defined(CONFIG_PLAT_MAPPI3)
outw(1, (unsigned long)PLD_REBOOT);
#endif
printk("Please push reset button!\n"); printk("Please push reset button!\n");
while (1) while (1)
cpu_relax(); cpu_relax();

View File

@ -9,6 +9,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/sched.h> #include <linux/sched.h>
@ -219,8 +220,6 @@ static unsigned long __init setup_memory(void)
extern unsigned long setup_memory(void); extern unsigned long setup_memory(void);
#endif /* CONFIG_DISCONTIGMEM */ #endif /* CONFIG_DISCONTIGMEM */
#define M32R_PCC_PCATCR 0x00ef7014 /* will move to m32r.h */
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
{ {
ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
@ -269,15 +268,14 @@ void __init setup_arch(char **cmdline_p)
paging_init(); paging_init();
} }
static struct cpu cpu[NR_CPUS]; static struct cpu cpu_devices[NR_CPUS];
static int __init topology_init(void) static int __init topology_init(void)
{ {
int cpu_id; int i;
for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++) for_each_present_cpu(i)
if (cpu_possible(cpu_id)) register_cpu(&cpu_devices[i], i, NULL);
register_cpu(&cpu[cpu_id], cpu_id, NULL);
return 0; return 0;
} }

View File

@ -118,6 +118,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
COPY(acch); COPY(acch);
COPY(accl); COPY(accl);
COPY(dummy_acc1h);
COPY(dummy_acc1l);
#else #else
#error unknown isa configuration #error unknown isa configuration
#endif #endif
@ -203,6 +205,8 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
COPY(acch); COPY(acch);
COPY(accl); COPY(accl);
COPY(dummy_acc1h);
COPY(dummy_acc1l);
#else #else
#error unknown isa configuration #error unknown isa configuration
#endif #endif

Some files were not shown because too many files have changed in this diff Show More